@ex-grid/sheet-engine 0.0.0-stage → 0.2.0-beta.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +26 -2
- package/dist/index.d.ts +3250 -0
- package/dist/index.js +17776 -0
- package/dist/index.js.map +7 -0
- package/package.json +23 -4
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/dotnet.ts", "../src/format-error.ts", "../src/cell-address.ts", "../src/cell-format.ts", "../src/cell-range.ts", "../src/must.ts", "../src/culture.ts", "../src/date-serial.ts", "../src/number-text.ts", "../src/formulas/rounding.ts", "../src/number-format.ts", "../src/cell-format-change.ts", "../src/formulas/reference.ts", "../src/formulas/nodes.ts", "../src/value.ts", "../src/formulas/value-array.ts", "../src/formulas/operand.ts", "../src/formulas/function-definition.ts", "../src/constant-parser.ts", "../src/formulas/wide.ts", "../src/formulas/correctly-rounded.ts", "../src/formulas/big-real.ts", "../src/formulas/portable-math.ts", "../src/formulas/arithmetic.ts", "../src/formulas/excel-function-names.ts", "../src/formulas/text-order.ts", "../src/formulas/evaluator.ts", "../src/formulas/functions/shared.ts", "../src/formulas/functions/arrays.ts", "../src/formulas/functions/core.ts", "../src/formulas/functions/criteria.ts", "../src/formulas/functions/dates.ts", "../src/formulas/enclosure.ts", "../src/formulas/exact-payment.ts", "../src/formulas/functions/financial.ts", "../src/formulas/functions/logic.ts", "../src/formula-syntax-error.ts", "../src/formulas/lexer.ts", "../src/formulas/portable-regex.ts", "../src/formulas/functions/lookup.ts", "../src/formulas/draws.ts", "../src/formulas/functions/math.ts", "../src/formulas/functions/subtotal.ts", "../src/formulas/functions/text.ts", "../src/formulas/functions/trigonometry.ts", "../src/formulas/function-library.ts", "../src/declared-function.ts", "../src/formulas/formula-text.ts", "../src/formulas/parser.ts", "../src/formulas/reference-shift.ts", "../src/formulas/unbound-name-walk.ts", "../src/entry.ts", "../src/json-element.ts", "../src/entry-text.ts", "../src/formula-entry.ts", "../src/formulas/known-shape.ts", "../src/formulas/structural-edit.ts", "../src/sheet-cell.ts", "../src/sheet-change.ts", "../src/sheet-document-parts.ts", "../src/sheet.ts", "../src/sheet-document.ts", "../src/workbook-document.ts", "../src/document-changes.ts", "../src/sheet-size.ts", "../src/sheet-edit.ts", "../src/sheet-wire.ts", "../src/workbook.ts"],
|
|
4
|
+
"sourcesContent": ["// What the C# engine reads from .NET, spelt as .NET spells it, so that the TypeScript engine answers as\n// the C# one does (ADR-0370, section 2): .NET's classes of characters, its case-insensitive ordinal\n// comparison, its rounding of a midpoint to even, and its number formats \"R\", \"E\" and \"G\". JavaScript's\n// own (`/\\s/`, `toUpperCase`, `Math.round`, `toString`) differ from each in places a test rarely reaches,\n// which is where an engine is quietly wrong.\n\n/** Whether the UTF-16 code unit is an ASCII digit, `0` to `9` (`char.IsAsciiDigit`). */\nexport function isAsciiDigit(c: number): boolean {\n return c >= 0x30 && c <= 0x39;\n}\n\n/** Whether the code unit is an ASCII letter (`char.IsAsciiLetter`). */\nexport function isAsciiLetter(c: number): boolean {\n return (c >= 0x41 && c <= 0x5a) || (c >= 0x61 && c <= 0x7a);\n}\n\n/** Whether the code unit is an ASCII letter or digit (`char.IsAsciiLetterOrDigit`). */\nexport function isAsciiLetterOrDigit(c: number): boolean {\n return isAsciiLetter(c) || isAsciiDigit(c);\n}\n\n/** Whether the code unit is ASCII (`char.IsAscii`). */\nexport function isAscii(c: number): boolean {\n return c <= 0x7f;\n}\n\n/**\n * `char.IsWhiteSpace`: the C0 controls U+0009 to U+000D, U+0085, and the Unicode separators (Zs, Zl, Zp).\n * Not JavaScript's `\\s`, which takes U+FEFF and leaves out U+0085.\n */\nexport function isWhiteSpace(c: number): boolean {\n if (c === 0x20 || (c >= 0x09 && c <= 0x0d) || c === 0x85 || c === 0xa0) return true;\n if (c < 0x1680) return false;\n return c === 0x1680 || (c >= 0x2000 && c <= 0x200a) || c === 0x2028 || c === 0x2029 || c === 0x202f || c === 0x205f\n || c === 0x3000;\n}\n\nconst letter = /^\\p{L}$/u;\nconst decimalDigit = /^\\p{Nd}$/u;\n\n/** `char.IsLetter`: a code unit of the categories Lu, Ll, Lt, Lm or Lo. A surrogate is never one, as in .NET. */\nexport function isLetter(c: number): boolean {\n if (c < 0x80) return isAsciiLetter(c);\n return letter.test(String.fromCharCode(c));\n}\n\n/** `char.IsDigit`: a code unit of the category Nd, any script's decimal digit. */\nexport function isDigit(c: number): boolean {\n if (c < 0x80) return isAsciiDigit(c);\n return decimalDigit.test(String.fromCharCode(c));\n}\n\n/** `string.Trim()`: the string without the white space (`isWhiteSpace`) at either end. */\nexport function trimWhiteSpace(text: string): string {\n let start = 0;\n let end = text.length;\n while (start < end && isWhiteSpace(text.charCodeAt(start))) start++;\n while (end > start && isWhiteSpace(text.charCodeAt(end - 1))) end--;\n return text.slice(start, end);\n}\n\n/** `string.Trim(char)`: the string without the given character at either end. */\nexport function trimChar(text: string, c: string): string {\n let start = 0;\n let end = text.length;\n while (start < end && text[start] === c) start++;\n while (end > start && text[end - 1] === c) end--;\n return text.slice(start, end);\n}\n\n/** `string.TrimEnd(char)`. */\nexport function trimEndChar(text: string, c: string): string {\n let end = text.length;\n while (end > 0 && text[end - 1] === c) end--;\n return text.slice(0, end);\n}\n\n/**\n * The invariant upper case of one code unit, by its simple mapping: a letter whose upper case is more than\n * one character (`\u00DF`, `\u0149`) stays as it is, as `char.ToUpperInvariant` leaves it.\n */\nexport function upperInvariant(c: number): number {\n if (c < 0x80) return c >= 0x61 && c <= 0x7a ? c - 0x20 : c;\n const upper = String.fromCharCode(c).toUpperCase();\n return upper.length === 1 ? upper.charCodeAt(0) : c;\n}\n\n/** The invariant lower case of one code unit, by its simple mapping (`char.ToLowerInvariant`). */\nexport function lowerInvariant(c: number): number {\n if (c < 0x80) return c >= 0x41 && c <= 0x5a ? c + 0x20 : c;\n const lower = String.fromCharCode(c).toLowerCase();\n return lower.length === 1 ? lower.charCodeAt(0) : c;\n}\n\n/** `string.ToUpperInvariant()`: each code unit by its simple mapping, so the length never changes. */\nexport function toUpperInvariant(text: string): string {\n let result = '';\n for (let i = 0; i < text.length; i++) result += String.fromCharCode(upperInvariant(text.charCodeAt(i)));\n return result;\n}\n\n/** `string.ToLowerInvariant()`: each code unit by its simple mapping. */\nexport function toLowerInvariant(text: string): string {\n let result = '';\n for (let i = 0; i < text.length; i++) result += String.fromCharCode(lowerInvariant(text.charCodeAt(i)));\n return result;\n}\n\n/** `StringComparison.OrdinalIgnoreCase` equality: code unit by code unit, each upper-cased by its simple mapping. */\nexport function equalsIgnoreCase(a: string, b: string): boolean {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n const x = a.charCodeAt(i);\n const y = b.charCodeAt(i);\n if (x !== y && upperInvariant(x) !== upperInvariant(y)) return false;\n }\n return true;\n}\n\n/** `StringComparison.OrdinalIgnoreCase` order: negative, 0 or positive, as `string.Compare` answers. */\nexport function compareIgnoreCase(a: string, b: string): number {\n const length = Math.min(a.length, b.length);\n for (let i = 0; i < length; i++) {\n const x = upperInvariant(a.charCodeAt(i));\n const y = upperInvariant(b.charCodeAt(i));\n if (x !== y) return x - y;\n }\n return a.length - b.length;\n}\n\n/** `string.CompareOrdinal`: code unit by code unit. */\nexport function compareOrdinal(a: string, b: string): number {\n const length = Math.min(a.length, b.length);\n for (let i = 0; i < length; i++) {\n const x = a.charCodeAt(i);\n const y = b.charCodeAt(i);\n if (x !== y) return x - y;\n }\n return a.length - b.length;\n}\n\n/** Whether `text` holds `part` at `at`, compared ordinally: `string.CompareOrdinal(text, at, part, 0, part.length) == 0`. */\nexport function startsWithAt(text: string, at: number, part: string): boolean {\n return text.startsWith(part, at);\n}\n\n/** Whether `text` holds `part` at `at`, compared ignoring case as `OrdinalIgnoreCase` compares. */\nexport function startsWithAtIgnoreCase(text: string, at: number, part: string): boolean {\n if (at + part.length > text.length) return false;\n return equalsIgnoreCase(text.slice(at, at + part.length), part);\n}\n\n/** A key that compares as `StringComparer.OrdinalIgnoreCase` does: the text upper-cased by simple mapping. */\nexport function ignoreCaseKey(text: string): string {\n return toUpperInvariant(text);\n}\n\n// ---- Numbers ---------------------------------------------------------------------------------------------\n\n/** `Math.Round(double)`: to the nearest whole number, a midpoint to the even one. */\nexport function roundHalfToEven(x: number): number {\n if (!Number.isFinite(x)) return x;\n const floor = Math.floor(x);\n const difference = x - floor;\n const rounded = difference < 0.5 ? floor : difference > 0.5 ? floor + 1 : floor % 2 === 0 ? floor : floor + 1;\n return rounded === 0 && x < 0 ? -0 : rounded;\n}\n\n/** `Math.Round(x, MidpointRounding.AwayFromZero)`. */\nexport function roundHalfAwayFromZero(x: number): number {\n if (!Number.isFinite(x)) return x;\n const magnitude = Math.floor(Math.abs(x) + 0.5);\n // Math.floor(|x| + 0.5) rounds |x| = 0.49999999999999994 up; the sum is inexact there.\n const corrected = magnitude - Math.abs(x) > 0.5 ? magnitude - 1 : magnitude;\n return x < 0 ? -corrected : corrected;\n}\n\nconst scratch = new DataView(new ArrayBuffer(8));\n\n/** The IEEE bits of a double, as `BitConverter.DoubleToInt64Bits`. */\nexport function doubleBits(x: number): bigint {\n scratch.setFloat64(0, x);\n return scratch.getBigInt64(0);\n}\n\n/** The double of IEEE bits, as `BitConverter.Int64BitsToDouble`. */\nexport function bitsDouble(bits: bigint): number {\n scratch.setBigInt64(0, BigInt.asIntN(64, bits));\n return scratch.getFloat64(0);\n}\n\n/** `Math.BitIncrement`: the next double up. */\nexport function bitIncrement(x: number): number {\n if (Number.isNaN(x) || x === Infinity) return x;\n if (x === 0) return Number.MIN_VALUE;\n const bits = doubleBits(x);\n return bitsDouble(x > 0 ? bits + 1n : bits - 1n);\n}\n\n/** `Math.BitDecrement`: the next double down. */\nexport function bitDecrement(x: number): number {\n if (Number.isNaN(x) || x === -Infinity) return x;\n if (x === 0) return -Number.MIN_VALUE;\n const bits = doubleBits(x);\n return bitsDouble(x > 0 ? bits - 1n : bits + 1n);\n}\n\n/** Whether a double's lowest significand bit is 0 (`(DoubleToInt64Bits(x) & 1) == 0`). */\nexport function lowestBitClear(x: number): boolean {\n return (doubleBits(x) & 1n) === 0n;\n}\n\n/**\n * `Math.ScaleB`: `x` \u00D7 2^`n`, rounded once, as musl's `scalbn` computes it, stepping so that a subnormal\n * result is not rounded twice.\n */\nexport function scaleB(x: number, n: number): number {\n let y = x;\n let e = n;\n if (e > 1023) {\n y *= 2 ** 1023;\n e -= 1023;\n if (e > 1023) {\n y *= 2 ** 1023;\n e -= 1023;\n if (e > 1023) e = 1023;\n }\n } else if (e < -1022) {\n // 2^-1022 * 2^53: the steps stay normal, so only the last multiplication rounds.\n y *= 2 ** -1022 * 2 ** 53;\n e += 1022 - 53;\n if (e < -1022) {\n y *= 2 ** -1022 * 2 ** 53;\n e += 1022 - 53;\n if (e < -1022) e = -1022;\n }\n }\n return y * 2 ** e;\n}\n\n/**\n * The exact error of the product `a` \u00D7 `b` rounded to a double: `Math.FusedMultiplyAdd(a, b, -(a * b))`,\n * the one use the C# engine makes of a fused multiply-add. Dekker's product, exact where neither factor\n * nor the product overflows and the error does not underflow, which holds for every argument the engine\n * passes.\n */\nexport function productError(a: number, b: number): number {\n const p = a * b;\n const [aHigh, aLow] = split(a);\n const [bHigh, bLow] = split(b);\n return ((aHigh * bHigh - p) + aHigh * bLow + aLow * bHigh) + aLow * bLow;\n}\n\nconst splitter = 134217729; // 2^27 + 1\n\nfunction split(a: number): [number, number] {\n const c = splitter * a;\n const high = c - (c - a);\n return [high, a - high];\n}\n\n/** `Math.FusedMultiplyAdd(a, b, c)` where `c` is `-(a * b)`'s negation of the rounded product: see `productError`. */\nexport function fusedProductError(a: number, b: number, minusProduct: number): number {\n if (minusProduct !== -(a * b)) throw new Error('Internal: a fused multiply-add is only ever the error of a product.');\n return productError(a, b);\n}\n\n// ---- Formatting ------------------------------------------------------------------------------------------\n\n/**\n * The significant digits and decimal exponent of a finite, non-zero double rounded to `digits` digits, as ADR-0047\n * reads a number: the exact value, a midpoint away from zero. (.NET's own formats round an exact midpoint to even;\n * the C# engine reads its fifteen digits through `Arithmetic.AtFifteenDigits`, which rounds it away from zero.)\n */\nfunction significant(x: number, digits: number): { digits: string; exponent: number } {\n const spelled = Math.abs(x).toExponential(digits - 1);\n const e = spelled.indexOf('e');\n return { digits: spelled.slice(0, e).replace('.', ''), exponent: Number(spelled.slice(e + 1)) };\n}\n\n/** The shortest digits that read back as the double, and its decimal exponent. */\nfunction shortest(x: number): { digits: string; exponent: number } {\n const spelled = Math.abs(x).toExponential();\n const e = spelled.indexOf('e');\n return { digits: spelled.slice(0, e).replace('.', ''), exponent: Number(spelled.slice(e + 1)) };\n}\n\n/** An exponent as .NET writes it: `E`, its sign always, and at least `minimum` digits. */\nfunction exponentText(exponent: number, minimum: number): string {\n return `E${exponent < 0 ? '-' : '+'}${String(Math.abs(exponent)).padStart(minimum, '0')}`;\n}\n\n/**\n * `x.ToString(\"E\" + digits, InvariantCulture)`: one digit, the point, `digits` more, and an exponent of at\n * least three digits, as `1.23450000000000E+003`.\n */\nexport function formatExponential(x: number, digits: number): string {\n if (!Number.isFinite(x)) throw new RangeError(`${String(x)} has no exponential form.`);\n const sign = x < 0 || Object.is(x, -0) ? '-' : '';\n if (x === 0) return `${sign}0${digits > 0 ? `.${'0'.repeat(digits)}` : ''}E+000`;\n const { digits: d, exponent } = significant(x, digits + 1);\n return `${sign}${d.charAt(0)}${digits > 0 ? `.${d.slice(1)}` : ''}${exponentText(exponent, 3)}`;\n}\n\n/** .NET's general form of a number's digits: plain where the exponent is \u22124 to `precision` \u2212 1, scientific otherwise, trailing zeros dropped. */\nfunction general(negative: boolean, digits: string, exponent: number, precision: number, decimalSeparator: string, negativeSign: string): string {\n const trimmed = digits.replace(/0+$/, '');\n const kept = trimmed === '' ? '0' : trimmed;\n const sign = negative ? negativeSign : '';\n if (exponent >= precision || exponent < -4) {\n const mantissa = kept.length > 1 ? `${kept.charAt(0)}${decimalSeparator}${kept.slice(1)}` : kept;\n return `${sign}${mantissa}${exponentText(exponent, 2)}`;\n }\n if (exponent < 0) return `${sign}0${decimalSeparator}${'0'.repeat(-exponent - 1)}${kept}`;\n if (kept.length <= exponent + 1) return `${sign}${kept}${'0'.repeat(exponent + 1 - kept.length)}`;\n return `${sign}${kept.slice(0, exponent + 1)}${decimalSeparator}${kept.slice(exponent + 1)}`;\n}\n\n/** `x.ToString(\"R\", InvariantCulture)`: the shortest text that reads back as the double, `1E+15`, `0.0001`, `1E-05`. */\nexport function formatRoundTrip(x: number): string {\n if (Number.isNaN(x)) return 'NaN';\n if (x === Infinity) return 'Infinity';\n if (x === -Infinity) return '-Infinity';\n if (x === 0) return Object.is(x, -0) ? '-0' : '0';\n const { digits, exponent } = shortest(x);\n return general(x < 0, digits, exponent, 15, '.', '-');\n}\n\n/** `x.ToString(\"G\" + precision, culture)` for a finite double, under the separator and sign given. */\nexport function formatGeneral(x: number, precision: number, decimalSeparator = '.', negativeSign = '-'): string {\n if (!Number.isFinite(x)) throw new RangeError(`${String(x)} has no general form here.`);\n if (x === 0) return Object.is(x, -0) ? `${negativeSign}0` : '0';\n const { digits, exponent } = significant(x, precision);\n return general(x < 0, digits, exponent, precision, decimalSeparator, negativeSign);\n}\n\n/** `n.ToString(\"X\" + width)`: upper-case hexadecimal, padded with zeros to `width`. */\nexport function hex(n: number, width: number): string {\n return n.toString(16).toUpperCase().padStart(width, '0');\n}\n\n/** `n.ToString(\"0\" \u00D7 width)`: a whole number padded with zeros to `width`. */\nexport function padded(n: number, width: number): string {\n const sign = n < 0 ? '-' : '';\n return sign + String(Math.abs(n)).padStart(width, '0');\n}\n\n/**\n * `double.Parse(text, NumberStyles.Float, InvariantCulture)` for the texts the engine writes itself: an\n * optional sign, digits with an optional point, an optional exponent. Rounded correctly, as .NET Core\n * rounds it. Anything else throws, as a text the engine wrote that does not read back is a defect.\n */\nexport function parseInvariantDouble(text: string): number {\n const value = tryParseInvariantDouble(text);\n if (value === undefined) throw new Error(`Internal: '${text}' does not read as a number.`);\n return value;\n}\n\nconst floatPattern = /^[\\t-\\r ]*[+-]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][+-]?\\d+)?[\\t-\\r ]*$/;\n\n/**\n * `double.TryParse(text, NumberStyles.Float, InvariantCulture, \u2026)`: white space at either end, a sign, digits\n * with a point, an exponent; `undefined` where it does not read. .NET reads a value past a double's range as\n * an infinity, as `Number` does.\n */\nexport function tryParseInvariantDouble(text: string): number | undefined {\n if (floatPattern.test(text)) return Number(text.trim());\n // .NET also reads the invariant culture's symbols, in any case: Infinity, -Infinity and NaN.\n const symbol = /^[\\t-\\r ]*([+-]?)(infinity|nan)[\\t-\\r ]*$/i.exec(text);\n if (symbol === null) return undefined;\n if (symbol[2]?.toLowerCase() === 'nan') return Number.NaN;\n return symbol[1] === '-' ? -Infinity : Infinity;\n}\n", "/**\n * A text the engine reads that is not in the form it reads: a cell address, a cell range or a number format\n * code. It is a `TypeError`, so code that catches one still catches it.\n */\nexport class FormatError extends TypeError {\n /** Refuses a text, saying why in `message`. */\n constructor(message: string) {\n super(message);\n this.name = 'FormatError';\n }\n}\n", "import { isAsciiDigit, isAsciiLetter, upperInvariant } from './dotnet';\nimport { FormatError } from './format-error';\n\n/** Excel's extent: how many rows a Sheet has, 1,048,576. */\nexport const rowCount = 1_048_576;\n\n/** Excel's extent: how many columns a Sheet has, 16,384 (`A` to `XFD`). */\nexport const columnCount = 16_384;\n\n/**\n * Where a cell is on a Sheet: a zero-based row and column inside Excel's extent. Written in A1 form (`A1` is\n * row 0, column 0; `XFD1048576` is the last cell). An address is where a cell is; a Reference is how a\n * Formula names it (CONTEXT.md).\n */\nexport class CellAddress {\n readonly #row: number;\n readonly #column: number;\n\n /** An address; one outside the Sheet's extent is refused with a `RangeError`, never clamped. */\n constructor(row: number, column: number) {\n if (!Number.isInteger(row) || row < 0 || row >= rowCount) throw new RangeError(`A row is 0 to ${rowCount - 1}; ${row} is not.`);\n if (!Number.isInteger(column) || column < 0 || column >= columnCount) throw new RangeError(`A column is 0 to ${columnCount - 1}; ${column} is not.`);\n this.#row = row;\n this.#column = column;\n }\n\n /** The zero-based row, 0 to 1,048,575. */\n get row(): number {\n return this.#row;\n }\n\n /** The zero-based column, 0 to 16,383. */\n get column(): number {\n return this.#column;\n }\n\n /** A number that names the address alone, row-major: two addresses are equal exactly where their keys are. */\n get key(): number {\n return this.#row * columnCount + this.#column;\n }\n\n /** The address a key names. */\n static fromKey(key: number): CellAddress {\n return new CellAddress(Math.floor(key / columnCount), key % columnCount);\n }\n\n /** Whether the two name the same cell. */\n equals(other: CellAddress): boolean {\n return this.#row === other.#row && this.#column === other.#column;\n }\n\n /** Row-major order: by row, then by column. */\n compareTo(other: CellAddress): number {\n return this.#row !== other.#row ? this.#row - other.#row : this.#column - other.#column;\n }\n\n /** Parses an address in A1 form, such as `B7` or `xfd1048576`; anything else is refused with a `FormatError`. */\n static parse(text: string): CellAddress {\n const address = CellAddress.tryParse(text);\n if (address === undefined) throw new FormatError(`'${text}' is not a cell address from A1 to XFD1048576.`);\n return address;\n }\n\n /**\n * Parses an address in A1 form, or `undefined`. Letters may be in either case; `$` markers are not part\n * of an address (they belong to a Reference) and are refused here.\n */\n static tryParse(text: string): CellAddress | undefined {\n if (text.length === 0) return undefined;\n let i = 0;\n let column = 0;\n while (i < text.length && isAsciiLetter(text.charCodeAt(i))) {\n if (i === 3) return undefined;\n column = column * 26 + (upperInvariant(text.charCodeAt(i)) - 0x41 + 1);\n i++;\n }\n if (i === 0 || i === text.length) return undefined;\n if (text[i] === '0') return undefined;\n let row = 0;\n for (; i < text.length; i++) {\n if (!isAsciiDigit(text.charCodeAt(i)) || row > rowCount) return undefined;\n row = row * 10 + (text.charCodeAt(i) - 0x30);\n }\n if (column > columnCount || row > rowCount) return undefined;\n return new CellAddress(row - 1, column - 1);\n }\n\n /** The column's letters: 0 is `A`, 25 is `Z`, 26 is `AA`, 16,383 is `XFD`. */\n static columnName(column: number): string {\n if (!Number.isInteger(column) || column < 0 || column >= columnCount) throw new RangeError(`A column is 0 to ${columnCount - 1}; ${column} is not.`);\n let name = '';\n let n = column + 1;\n while (n > 0) {\n n--;\n name = String.fromCharCode(0x41 + (n % 26)) + name;\n n = Math.floor(n / 26);\n }\n return name;\n }\n\n /** Parses column letters (`A` to `XFD`, either case) to a zero-based column, or `undefined`. */\n static tryParseColumn(letters: string): number | undefined {\n if (letters.length === 0 || letters.length > 3) return undefined;\n let n = 0;\n for (let i = 0; i < letters.length; i++) {\n const c = letters.charCodeAt(i);\n if (!isAsciiLetter(c)) return undefined;\n n = n * 26 + (upperInvariant(c) - 0x41 + 1);\n }\n if (n > columnCount) return undefined;\n return n - 1;\n }\n\n /** The address in A1 form, such as `C12`. */\n toString(): string {\n return CellAddress.columnName(this.#column) + String(this.#row + 1);\n }\n}\n", "// A cell's Cell Format and the parts it is made of (C#'s CellColour.cs, CellFormat.cs, CellBorders.cs and\n// CellDisplay.cs; CONTEXT.md; ADR-0047, ADR-0071). Each part is an immutable value with `equals`, and a `key` where\n// a Map or a Set must tell two equal parts apart from two different ones.\nimport { hex } from './dotnet';\nimport type { NumberFormat, NumberFormatColour } from './number-format';\n\n/**\n * A colour a Cell Format records (ADR-0071): `automatic`, or an RGB value. A colour picked from the theme part of a\n * palette is recorded as its RGB value. Automatic is not a recorded colour: a Font's Automatic is the Ink.\n */\nexport class CellColour {\n // -1 is Automatic, so 0x000000 stays black.\n readonly #value: number;\n\n private constructor(value: number) {\n this.#value = value;\n }\n\n /** Automatic: no colour recorded, so what is painted is decided where it is painted. */\n static readonly automatic = new CellColour(-1);\n\n /** An RGB colour, as `0xRRGGBB`. Throws a RangeError for a value outside `0x000000` to `0xFFFFFF`. */\n static fromRgb(rgb: number): CellColour {\n if (!Number.isInteger(rgb) || rgb < 0 || rgb > 0xFFFFFF) throw new RangeError(`An RGB colour is 0x000000 to 0xFFFFFF, not ${String(rgb)}.`);\n return new CellColour(rgb);\n }\n\n /** An RGB colour, from its red, green and blue, each 0 to 255. */\n static fromParts(red: number, green: number, blue: number): CellColour {\n for (const part of [red, green, blue])\n if (!Number.isInteger(part) || part < 0 || part > 255) throw new RangeError(`A colour's part is 0 to 255, not ${String(part)}.`);\n return new CellColour((red << 16) | (green << 8) | blue);\n }\n\n /** A colour written `#RRGGBB`, in either case, or `undefined` for any other text. @internal */\n static fromHex(text: string | undefined): CellColour | undefined {\n if (text === undefined || !/^#[0-9A-Fa-f]{6}$/u.test(text)) return undefined;\n return CellColour.fromRgb(Number.parseInt(text.slice(1), 16));\n }\n\n /** Whether the colour is Automatic. */\n get isAutomatic(): boolean {\n return this.#value < 0;\n }\n\n /** The RGB value, as `0xRRGGBB`. Throws for Automatic, which records no RGB value. */\n get rgb(): number {\n if (this.isAutomatic) throw new Error('An Automatic colour records no RGB value.');\n return this.#value;\n }\n\n /** A value equal ones share, to key a map by. @internal */\n get key(): number {\n return this.#value;\n }\n\n /** Whether `other` is the same colour. */\n equals(other: CellColour): boolean {\n return this.#value === other.#value;\n }\n\n /** `Automatic`, or the RGB value as `#RRGGBB`. */\n toString(): string {\n return this.isAutomatic ? 'Automatic' : `#${hex(this.#value, 6)}`;\n }\n}\n\n/** A cell's horizontal alignment, settable per cell as in Excel (ADR-0046). `general` is Excel's default: numbers to the right, text to the left, booleans and Error Values centred. */\nexport type HorizontalAlignment = 'general' | 'left' | 'center' | 'right';\n\n/**\n * A cell's Font (CONTEXT.md; ADR-0071): the colour and emphasis of its text. Not its size or typeface: every row\n * has one height, and one digit width decides what fits.\n */\nexport class CellFont {\n /** The text's colour; Automatic is the Ink. */\n readonly colour: CellColour;\n /** Bold. */\n readonly bold: boolean;\n /** Italic. */\n readonly italic: boolean;\n /** A single underline. */\n readonly underline: boolean;\n /** Strikethrough. */\n readonly strikethrough: boolean;\n\n constructor(parts: { colour?: CellColour; bold?: boolean; italic?: boolean; underline?: boolean; strikethrough?: boolean } = {}) {\n this.colour = parts.colour ?? CellColour.automatic;\n this.bold = parts.bold === true;\n this.italic = parts.italic === true;\n this.underline = parts.underline === true;\n this.strikethrough = parts.strikethrough === true;\n }\n\n /** What a cell's text shows where no level records a Font: Automatic, with no emphasis. */\n static readonly default = new CellFont();\n\n /** This Font with the parts given replaced. */\n with(parts: { colour?: CellColour; bold?: boolean; italic?: boolean; underline?: boolean; strikethrough?: boolean }): CellFont {\n return new CellFont({\n colour: parts.colour ?? this.colour,\n bold: parts.bold ?? this.bold,\n italic: parts.italic ?? this.italic,\n underline: parts.underline ?? this.underline,\n strikethrough: parts.strikethrough ?? this.strikethrough,\n });\n }\n\n /** A value equal ones share, to key a map by. @internal */\n get key(): string {\n return `${String(this.colour.key)}${this.bold ? 'b' : ''}${this.italic ? 'i' : ''}${this.underline ? 'u' : ''}${this.strikethrough ? 's' : ''}`;\n }\n\n /** Whether `other` is the same Font. */\n equals(other: CellFont): boolean {\n return this.colour.equals(other.colour) && this.bold === other.bold && this.italic === other.italic\n && this.underline === other.underline && this.strikethrough === other.strikethrough;\n }\n}\n\n/**\n * A cell's Fill (CONTEXT.md; ADR-0071): the one solid colour behind its text, or `none`, where the Paper shows. No\n * patterns and no gradients.\n */\nexport class CellFill {\n /** The Fill's colour, always an RGB value; `undefined` for `none`. */\n readonly colour: CellColour | undefined;\n\n private constructor(colour: CellColour | undefined) {\n this.colour = colour;\n }\n\n /** No Fill: the Paper shows. Recorded on a cell, it hides a Fill its row or column records. */\n static readonly none = new CellFill(undefined);\n\n /**\n * A solid Fill in `colour`. Throws for Automatic: Excel's Fill offers No Color and colours, never Automatic, so\n * there is nothing an Automatic Fill would mean.\n */\n static solid(colour: CellColour): CellFill {\n if (colour.isAutomatic) throw new RangeError(\"A Fill's colour is an RGB value, not Automatic.\");\n return new CellFill(colour);\n }\n\n /** Whether this is `none`. */\n get isNone(): boolean {\n return this.colour === undefined;\n }\n\n /** A value equal ones share, to key a map by. @internal */\n get key(): number {\n return this.colour === undefined ? -2 : this.colour.key;\n }\n\n /** Whether `other` is the same Fill. */\n equals(other: CellFill): boolean {\n return this.key === other.key;\n }\n}\n\n/** Excel's thirteen line styles for a Border (ADR-0071), and `none`. No diagonals. */\nexport type BorderLineStyle = 'none' | 'hair' | 'thin' | 'medium' | 'thick' | 'double' | 'dotted' | 'dashed' | 'dashDot' | 'dashDotDot'\n | 'mediumDashed' | 'mediumDashDot' | 'mediumDashDotDot' | 'slantedDashDot';\n\n/** The line styles in C#'s enum order, which Sheet Documents and keys rely on. @internal */\nexport const borderLineStyles: readonly BorderLineStyle[] = ['none', 'hair', 'thin', 'medium', 'thick', 'double', 'dotted', 'dashed', 'dashDot',\n 'dashDotDot', 'mediumDashed', 'mediumDashDot', 'mediumDashDotDot', 'slantedDashDot'];\n\n/** A Border (CONTEXT.md; ADR-0071): the line on one side of a cell, in one of Excel's thirteen line styles and a colour, or `none`. */\nexport class BorderLine {\n /** The line style; `none` for no line. */\n readonly style: BorderLineStyle;\n /** The line's colour; Automatic for no line. */\n readonly colour: CellColour;\n\n /** A line in `style` and `colour`. `none` is no line, and has no colour. Throws a RangeError for a style that is not one. */\n constructor(style: BorderLineStyle, colour: CellColour = CellColour.automatic) {\n if (!borderLineStyles.includes(style)) throw new RangeError(`Not a line style: ${style}.`);\n this.style = style;\n this.colour = style === 'none' ? CellColour.automatic : colour;\n }\n\n /** No line. */\n static readonly none = new BorderLine('none');\n\n /** Whether this is no line. */\n get isNone(): boolean {\n return this.style === 'none';\n }\n\n /** A value equal ones share, to key a map by. @internal */\n get key(): string {\n return `${this.style}:${String(this.colour.key)}`;\n }\n\n /** Whether `other` is the same line. */\n equals(other: BorderLine): boolean {\n return this.style === other.style && this.colour.equals(other.colour);\n }\n}\n\n/**\n * A cell's Borders (ADR-0071): the line on each of its four sides. Each cell records its own four sides, as Excel's\n * files do, and the edge two cells share shows one line from either side: the upper cell's, or the left cell's for\n * a vertical edge, where both record one, and otherwise whichever does (the twelfth Windows run). A border command\n * records the edge on the cells it sets and clears the neighbour's record of it, so the later setting wins from\n * either side (the eleventh run, case 7).\n */\nexport class CellBorders {\n /** The line on the cell's top side. */\n readonly top: BorderLine;\n /** The line on the cell's bottom side. */\n readonly bottom: BorderLine;\n /** The line on the cell's left side. */\n readonly left: BorderLine;\n /** The line on the cell's right side. */\n readonly right: BorderLine;\n\n constructor(sides: { top?: BorderLine; bottom?: BorderLine; left?: BorderLine; right?: BorderLine } = {}) {\n this.top = sides.top ?? BorderLine.none;\n this.bottom = sides.bottom ?? BorderLine.none;\n this.left = sides.left ?? BorderLine.none;\n this.right = sides.right ?? BorderLine.none;\n }\n\n /** No line on any side. */\n static readonly none = new CellBorders();\n\n /** These Borders with the sides given replaced. */\n with(sides: { top?: BorderLine; bottom?: BorderLine; left?: BorderLine; right?: BorderLine }): CellBorders {\n return new CellBorders({\n top: sides.top ?? this.top,\n bottom: sides.bottom ?? this.bottom,\n left: sides.left ?? this.left,\n right: sides.right ?? this.right,\n });\n }\n\n /** A value equal ones share, to key a map by. @internal */\n get key(): string {\n return `${this.top.key}|${this.bottom.key}|${this.left.key}|${this.right.key}`;\n }\n\n /** Whether `other` is the same Borders. */\n equals(other: CellBorders): boolean {\n return this.top.equals(other.top) && this.bottom.equals(other.bottom) && this.left.equals(other.left) && this.right.equals(other.right);\n }\n}\n\n/**\n * The lines drawn along a range's four outer edges, each line once per edge (`Sheet.getEdgeLines`): what Format\n * Cells shows on a range's outline (ADR-0071; the fourteenth Windows run, case 13). Each list holds distinct lines,\n * in the order met.\n */\nexport interface RangeEdgeLines {\n /** The lines along the range's top edge. */\n readonly top: readonly BorderLine[];\n /** The lines along the range's bottom edge. */\n readonly bottom: readonly BorderLine[];\n /** The lines along the range's left edge. */\n readonly left: readonly BorderLine[];\n /** The lines along the range's right edge. */\n readonly right: readonly BorderLine[];\n}\n\n/**\n * A cell's Cell Format as it shows (CONTEXT.md; ADR-0047, ADR-0071): each part from the level that records it, cell\n * over row over column, and the part's default where no level does.\n */\nexport class CellFormat {\n /** The Number Format. */\n readonly numberFormat: NumberFormat;\n /** The horizontal alignment. */\n readonly alignment: HorizontalAlignment;\n /** The Font. */\n readonly font: CellFont;\n /** The Fill. */\n readonly fill: CellFill;\n /** The Borders. */\n readonly borders: CellBorders;\n\n constructor(\n numberFormat: NumberFormat,\n alignment: HorizontalAlignment,\n font: CellFont,\n fill: CellFill,\n borders: CellBorders,\n ) {\n this.numberFormat = numberFormat;\n this.alignment = alignment;\n this.font = font;\n this.fill = fill;\n this.borders = borders;\n }\n\n /** A value equal ones share, to key a map by. @internal */\n get key(): string {\n return `${this.numberFormat.code}\\u0000${this.alignment}\\u0000${this.font.key}\\u0000${String(this.fill.key)}\\u0000${this.borders.key}`;\n }\n\n /** Whether `other` is the same Cell Format. */\n equals(other: CellFormat): boolean {\n return this.numberFormat.equals(other.numberFormat) && this.alignment === other.alignment && this.font.equals(other.font)\n && this.fill.equals(other.fill) && this.borders.equals(other.borders);\n }\n}\n\n/**\n * What a cell shows: its Value formatted by the cell's number format under the Sheet's culture, and where it sits.\n * Whether it fits its column is the grid's to decide (ADR-0016): a number that does not fit becomes `####`, never a\n * shorter number.\n */\nexport interface CellDisplay {\n /** The formatted text; empty for a blank cell, and empty when `cannotShow` is set. */\n readonly text: string;\n /** The alignment resolved from the cell's setting: never `general`. */\n readonly alignment: Exclude<HorizontalAlignment, 'general'>;\n /** Whether the Value is a number (a date included). A number too wide for its column is shown as `####`; text is not (ADR-0016). */\n readonly isNumber: boolean;\n /**\n * The number cannot be shown in its format at any width \u2014 a negative date, or a date after 31 December 9999 \u2014\n * or, from `Sheet.getDisplay` with a width, not in the width asked, and the cell shows `####`, as Excel's does.\n */\n readonly cannotShow: boolean;\n /**\n * The colour the Number Format names for the section that showed the Value, kept where the number cannot be\n * shown; `undefined` where that section names none, or where no section showed it (ADR-0071, SH-40). It takes\n * precedence over the cell's Font colour, as Excel's does.\n */\n readonly colour: NumberFormatColour | undefined;\n}\n", "import { CellAddress, columnCount, rowCount } from './cell-address';\nimport { isAsciiDigit } from './dotnet';\nimport { FormatError } from './format-error';\n\n/**\n * A rectangle of cells on a Sheet, inclusive at both corners, held from its top-left corner (`first`) to its\n * bottom-right one (`last`) whichever corners it was made from. Written `A1` for one cell and `A1:B2`\n * otherwise.\n */\nexport class CellRange {\n readonly #first: CellAddress;\n readonly #last: CellAddress;\n\n /** The rectangle spanned by two corners, in either order; one corner alone is that one cell. */\n constructor(corner1: CellAddress, corner2: CellAddress = corner1) {\n this.#first = new CellAddress(Math.min(corner1.row, corner2.row), Math.min(corner1.column, corner2.column));\n this.#last = new CellAddress(Math.max(corner1.row, corner2.row), Math.max(corner1.column, corner2.column));\n }\n\n /** The top-left cell. */\n get first(): CellAddress {\n return this.#first;\n }\n\n /** The bottom-right cell. */\n get last(): CellAddress {\n return this.#last;\n }\n\n /** How many rows it spans. */\n get rowCount(): number {\n return this.#last.row - this.#first.row + 1;\n }\n\n /** How many columns it spans. */\n get columnCount(): number {\n return this.#last.column - this.#first.column + 1;\n }\n\n /** How many cells it holds. */\n get cellCount(): number {\n return this.rowCount * this.columnCount;\n }\n\n /** Whether `address` lies inside it. */\n contains(address: CellAddress): boolean {\n return address.row >= this.#first.row && address.row <= this.#last.row\n && address.column >= this.#first.column && address.column <= this.#last.column;\n }\n\n /** Whether it spans every row: whole columns, such as `B:D` (ADR-0047). */\n get isWholeColumns(): boolean {\n return this.#first.row === 0 && this.#last.row === rowCount - 1;\n }\n\n /** Whether it spans every column: whole rows, such as `2:4` (ADR-0047). */\n get isWholeRows(): boolean {\n return this.#first.column === 0 && this.#last.column === columnCount - 1;\n }\n\n /** Whether the two are the same rectangle. */\n equals(other: CellRange): boolean {\n return this.#first.equals(other.#first) && this.#last.equals(other.#last);\n }\n\n /** Whole columns `first` to `last` (0 is `A`), as `A:A` names one. */\n static wholeColumns(first: number, last: number): CellRange {\n return new CellRange(new CellAddress(0, first), new CellAddress(rowCount - 1, last));\n }\n\n /** Whole rows `first` to `last` (0 is row `1`), as `1:1` names one. */\n static wholeRows(first: number, last: number): CellRange {\n return new CellRange(new CellAddress(first, 0), new CellAddress(last, columnCount - 1));\n }\n\n /** Its cells in row-major order. */\n *cells(): IterableIterator<CellAddress> {\n for (let row = this.#first.row; row <= this.#last.row; row++) {\n for (let column = this.#first.column; column <= this.#last.column; column++) yield new CellAddress(row, column);\n }\n }\n\n /** Parses `B7`, `B7:C9` (corners in either order, letters in either case), whole columns `B:D` or whole rows `2:4`; no `$`. Anything else is a `FormatError`. */\n static parse(text: string): CellRange {\n const range = CellRange.tryParse(text);\n if (range === undefined) throw new FormatError(`'${text}' is not a cell range such as A1 or A1:B2.`);\n return range;\n }\n\n /** Parses as `parse` does, or `undefined`. */\n static tryParse(text: string): CellRange | undefined {\n const colon = text.indexOf(':');\n if (colon < 0) {\n const single = CellAddress.tryParse(text);\n return single === undefined ? undefined : new CellRange(single);\n }\n const left = text.slice(0, colon);\n const right = text.slice(colon + 1);\n const c1 = CellAddress.tryParseColumn(left);\n const c2 = CellAddress.tryParseColumn(right);\n if (c1 !== undefined && c2 !== undefined) return CellRange.wholeColumns(Math.min(c1, c2), Math.max(c1, c2));\n const r1 = parseRow(left);\n const r2 = parseRow(right);\n if (r1 !== undefined && r2 !== undefined) return CellRange.wholeRows(Math.min(r1, r2), Math.max(r1, r2));\n const a = CellAddress.tryParse(left);\n const b = CellAddress.tryParse(right);\n if (a === undefined || b === undefined) return undefined;\n return new CellRange(a, b);\n }\n\n /** `A1` for one cell, `A1:B2` otherwise. */\n toString(): string {\n return this.#first.equals(this.#last) ? this.#first.toString() : `${this.#first.toString()}:${this.#last.toString()}`;\n }\n}\n\nfunction parseRow(text: string): number | undefined {\n if (text.length === 0 || text.length > 7 || text[0] === '0') return undefined;\n for (let i = 0; i < text.length; i++) {\n if (!isAsciiDigit(text.charCodeAt(i))) return undefined;\n }\n const n = Number(text);\n if (n > rowCount) return undefined;\n return n - 1;\n}\n", "// What the package knows is there, as core/src/must.ts says it for the Script Core: a miss is a defect in\n// the package, said by throwing where a `!` would read on with `undefined` (CONVENTIONS.md, \"No quiet\n// fallback\"). The packages share no code, so each carries its own.\n\n/** The element at `index`, which the caller knows is there. A miss throws: it is a defect, never an answer. */\nexport function elementAt<T extends object | string | number | boolean | bigint | null>(list: ArrayLike<T>, index: number): T {\n const value = list[index];\n if (value === undefined) {\n throw new Error(`Internal: index ${index} is outside a list of ${list.length}.`);\n }\n return value;\n}\n\n/** The value, which the caller knows is there. `undefined` throws, naming what was missing. */\nexport function defined<T>(value: T | undefined, what: string): T {\n if (value === undefined) {\n throw new Error(`Internal: ${what} is missing.`);\n }\n return value;\n}\n\n/** The smallest 64-bit integer, as C#'s long holds it. */\nexport const int64Min = -(1n << 63n);\n\n/** The largest 64-bit integer, as C#'s long holds it. */\nexport const int64Max = (1n << 63n) - 1n;\n\n/** The end of a switch that has taken every member of a union; a value from outside it throws here. */\nexport function unreachable(value: never): never {\n throw new Error(`Internal: ${String(value)} is not a value this switch takes.`);\n}\n", "// The culture a Sheet reads and writes text in: what the C# engine reads from a CultureInfo, as a table\n// (ADR-0370, section 10). TypeScript has no current culture, so a Sheet is told its locale and never reads\n// the browser's on its own. The values are .NET's as it reads them from ICU, so the two engines answer\n// alike; where Excel's text differs from them, the engine corrects it where it is read (ADR-0071), as the\n// C# engine does.\n\nimport { elementAt } from './must';\n\n/** The parts of a culture the engine reads: `CultureInfo`'s number and date formats, for one locale. */\nexport interface CultureData {\n /** The locale's BCP 47 tag, as `CultureInfo.Name`; empty for the invariant culture. */\n readonly name: string;\n /** `TwoLetterISOLanguageName`: `en`, `de`, `ja`; `iv` for the invariant culture. */\n readonly twoLetterLanguage: string;\n readonly numberDecimalSeparator: string;\n readonly numberGroupSeparator: string;\n /** `NumberFormatInfo.NumberGroupSizes`: the digits in each group, the units' group first. */\n readonly numberGroupSizes: readonly number[];\n readonly negativeSign: string;\n readonly currencySymbol: string;\n /** `NumberFormatInfo.CurrencyPositivePattern`: 0 is `$n`, 1 `n$`, 2 `$ n`, 3 `n $`. */\n readonly currencyPositivePattern: number;\n /** `NumberFormatInfo.CurrencyNegativePattern`, 0 to 16. */\n readonly currencyNegativePattern: number;\n readonly currencyDecimalDigits: number;\n readonly shortDatePattern: string;\n readonly longTimePattern: string;\n readonly shortTimePattern: string;\n readonly dateSeparator: string;\n /** The twelve months' names, January first. */\n readonly monthNames: readonly string[];\n readonly abbreviatedMonthNames: readonly string[];\n /** The seven days' names, Sunday first. */\n readonly dayNames: readonly string[];\n readonly abbreviatedDayNames: readonly string[];\n}\n\nconst englishMonths = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];\nconst englishDays = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\nconst englishShortDays = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\nconst japaneseMonths = ['1\u6708', '2\u6708', '3\u6708', '4\u6708', '5\u6708', '6\u6708', '7\u6708', '8\u6708', '9\u6708', '10\u6708', '11\u6708', '12\u6708'];\n\n/** .NET 10's CultureInfo on ICU for each locale the engine is held to (`tests/cases/`), read on 2026-10-25. */\nconst known: readonly CultureData[] = [\n {\n name: '', twoLetterLanguage: 'iv',\n numberDecimalSeparator: '.', numberGroupSeparator: ',', numberGroupSizes: [3], negativeSign: '-',\n currencySymbol: '\u00A4', currencyPositivePattern: 0, currencyNegativePattern: 0, currencyDecimalDigits: 2,\n shortDatePattern: 'MM/dd/yyyy', longTimePattern: 'HH:mm:ss', shortTimePattern: 'HH:mm', dateSeparator: '/',\n monthNames: englishMonths,\n abbreviatedMonthNames: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n dayNames: englishDays, abbreviatedDayNames: englishShortDays,\n },\n {\n name: 'en-US', twoLetterLanguage: 'en',\n numberDecimalSeparator: '.', numberGroupSeparator: ',', numberGroupSizes: [3], negativeSign: '-',\n currencySymbol: '$', currencyPositivePattern: 0, currencyNegativePattern: 1, currencyDecimalDigits: 2,\n shortDatePattern: 'M/d/yyyy', longTimePattern: 'h:mm:ss\u202Ftt', shortTimePattern: 'h:mm\u202Ftt', dateSeparator: '/',\n monthNames: englishMonths,\n abbreviatedMonthNames: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n dayNames: englishDays, abbreviatedDayNames: englishShortDays,\n },\n {\n name: 'en-GB', twoLetterLanguage: 'en',\n numberDecimalSeparator: '.', numberGroupSeparator: ',', numberGroupSizes: [3], negativeSign: '-',\n currencySymbol: '\u00A3', currencyPositivePattern: 0, currencyNegativePattern: 1, currencyDecimalDigits: 2,\n shortDatePattern: 'dd/MM/yyyy', longTimePattern: 'HH:mm:ss', shortTimePattern: 'HH:mm', dateSeparator: '/',\n monthNames: englishMonths,\n abbreviatedMonthNames: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sept', 'Oct', 'Nov', 'Dec'],\n dayNames: englishDays, abbreviatedDayNames: englishShortDays,\n },\n {\n name: 'de-DE', twoLetterLanguage: 'de',\n numberDecimalSeparator: ',', numberGroupSeparator: '.', numberGroupSizes: [3], negativeSign: '-',\n currencySymbol: '\u20AC', currencyPositivePattern: 3, currencyNegativePattern: 8, currencyDecimalDigits: 2,\n shortDatePattern: 'dd.MM.yyyy', longTimePattern: 'HH:mm:ss', shortTimePattern: 'HH:mm', dateSeparator: '.',\n monthNames: ['Januar', 'Februar', 'M\u00E4rz', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember'],\n abbreviatedMonthNames: ['Jan', 'Feb', 'M\u00E4r', 'Apr', 'Mai', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dez'],\n dayNames: ['Sonntag', 'Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag'],\n abbreviatedDayNames: ['So', 'Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa'],\n },\n {\n name: 'ja-JP', twoLetterLanguage: 'ja',\n numberDecimalSeparator: '.', numberGroupSeparator: ',', numberGroupSizes: [3], negativeSign: '-',\n currencySymbol: '\uFFE5', currencyPositivePattern: 0, currencyNegativePattern: 1, currencyDecimalDigits: 0,\n shortDatePattern: 'yyyy/MM/dd', longTimePattern: 'H:mm:ss', shortTimePattern: 'H:mm', dateSeparator: '/',\n monthNames: japaneseMonths, abbreviatedMonthNames: japaneseMonths,\n dayNames: ['\u65E5\u66DC\u65E5', '\u6708\u66DC\u65E5', '\u706B\u66DC\u65E5', '\u6C34\u66DC\u65E5', '\u6728\u66DC\u65E5', '\u91D1\u66DC\u65E5', '\u571F\u66DC\u65E5'],\n abbreviatedDayNames: ['\u65E5', '\u6708', '\u706B', '\u6C34', '\u6728', '\u91D1', '\u571F'],\n },\n {\n name: 'fr-FR', twoLetterLanguage: 'fr',\n numberDecimalSeparator: ',', numberGroupSeparator: '\u202F', numberGroupSizes: [3], negativeSign: '-',\n currencySymbol: '\u20AC', currencyPositivePattern: 3, currencyNegativePattern: 8, currencyDecimalDigits: 2,\n shortDatePattern: 'dd/MM/yyyy', longTimePattern: 'HH:mm:ss', shortTimePattern: 'HH:mm', dateSeparator: '/',\n monthNames: ['janvier', 'f\u00E9vrier', 'mars', 'avril', 'mai', 'juin', 'juillet', 'ao\u00FBt', 'septembre', 'octobre', 'novembre', 'd\u00E9cembre'],\n abbreviatedMonthNames: ['janv.', 'f\u00E9vr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'ao\u00FBt', 'sept.', 'oct.', 'nov.', 'd\u00E9c.'],\n dayNames: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],\n abbreviatedDayNames: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],\n },\n];\n\n/**\n * A Sheet's culture, read from its locale: a BCP 47 tag, or `\"invariant\"` for .NET's invariant culture\n * (ADR-0370, section 10). Only the locales whose data the engine is held to are known; any other is\n * refused by name, never read as some other culture's.\n */\nexport class Culture {\n readonly #data: CultureData;\n\n private constructor(data: CultureData) {\n this.#data = data;\n }\n\n /** The invariant culture, which reads as .NET's `InvariantCulture` does. */\n static readonly invariant: Culture = new Culture(elementAt(known, 0));\n\n static readonly #byName = new Map<string, Culture>(known.map(data => [data.name.toLowerCase(), data.name === '' ? Culture.invariant : new Culture(data)]));\n\n /**\n * The culture of a locale: `\"invariant\"`, or one of `en-US`, `en-GB`, `de-DE`, `ja-JP` and `fr-FR`, in\n * any case. Another tag is refused with a `RangeError`: the engine holds no data for it that it has\n * checked against .NET's.\n */\n static of(locale: string): Culture {\n if (locale === 'invariant') return Culture.invariant;\n if (locale === '') throw new RangeError('The invariant culture is named \"invariant\", never an empty tag (ADR-0370, section 10).');\n const culture = Culture.#byName.get(locale.toLowerCase());\n if (culture === undefined) {\n throw new RangeError(`The locale '${locale}' is not one the engine holds data for: en-US, en-GB, de-DE, ja-JP, fr-FR and \"invariant\".`);\n }\n return culture;\n }\n\n /** `CultureInfo.Name`: the BCP 47 tag; empty for the invariant culture, as .NET writes it in a Sheet Document. */\n get name(): string {\n return this.#data.name;\n }\n\n /** The locale the culture was asked for by, `\"invariant\"` for the invariant culture. */\n get locale(): string {\n return this.#data.name === '' ? 'invariant' : this.#data.name;\n }\n\n /** The culture's data: its separators, names and patterns, as .NET's culture records them. @internal */\n get data(): CultureData {\n return this.#data;\n }\n}\n\n/** The order of year, month and day in the culture's short date pattern: `mdy`, `dmy` or `ymd` (`ConstantParser.DayOrder`). */\nexport function dayOrder(culture: Culture): 'mdy' | 'dmy' | 'ymd' {\n let order = '';\n for (const c of culture.data.shortDatePattern) {\n const part = c === 'y' ? 'y' : c === 'M' ? 'm' : c === 'd' ? 'd' : '';\n if (part !== '' && !order.includes(part)) order += part;\n }\n return order === 'dmy' || order === 'ymd' ? order : 'mdy';\n}\n\n/** The culture's short date pattern as an Excel format code: `M/d/yyyy` becomes `m/d/yyyy` (`ConstantParser.DateCode`). */\nexport function dateCode(culture: Culture): string {\n const pattern = culture.data.shortDatePattern;\n let code = '';\n for (let i = 0; i < pattern.length; i++) {\n const c = pattern.charAt(i);\n switch (c) {\n case 'y':\n case 'd':\n code += c;\n break;\n case 'M':\n code += 'm';\n break;\n case '/':\n code += literal(culture.data.dateSeparator);\n break;\n case \"'\": {\n let close = pattern.indexOf(\"'\", i + 1);\n if (close < 0) close = pattern.length;\n code += literal(pattern.slice(i + 1, close));\n i = close;\n break;\n }\n default:\n code += literal(c);\n break;\n }\n }\n return code;\n}\n\n/** Punctuation stands as itself in a format code; anything a code could misread is quoted. */\nfunction literal(text: string): string {\n let code = '';\n for (const c of text) {\n if (/^[A-Za-z0-9\";@*_[#?%,]$/.test(c)) {\n code += c === '\"' ? '\\\\\"' : `\"${c}\"`;\n } else {\n code += c;\n }\n }\n return code;\n}\n", "// Excel's 1900 date system (ADR-0047): serial 1 is 1 January 1900, and serial 60 is 29 February 1900, a day\n// that never existed. Excel keeps it for compatibility with Lotus 1-2-3; matching Excel's serials is the\n// promise, and every serial from 1 March 1900 onward disagrees with Excel if that day is left out. Serial 0\n// is written as 0 January 1900, as Excel writes it.\n\n/** The last day Excel shows: 31 December 9999. */\nexport const maximumSerial = 2_958_465;\n\n/** Days from 0001-01-01 to the date, in the proleptic Gregorian calendar, as `DateOnly.DayNumber` counts them. */\nexport function dayNumber(year: number, month: number, day: number): number {\n const y = month <= 2 ? year - 1 : year;\n const era = Math.floor(y / 400);\n const yearOfEra = y - era * 400;\n const dayOfYear = Math.floor((153 * (month + (month > 2 ? -3 : 9)) + 2) / 5) + day - 1;\n const dayOfEra = yearOfEra * 365 + Math.floor(yearOfEra / 4) - Math.floor(yearOfEra / 100) + dayOfYear;\n // Days from 0000-03-01, less those to 0001-01-01.\n return era * 146097 + dayOfEra - 306;\n}\n\n/** The date of a day number (`DateOnly.FromDayNumber`). */\nexport function fromDayNumber(number: number): { year: number; month: number; day: number } {\n const z = number + 306;\n const era = Math.floor(z / 146097);\n const dayOfEra = z - era * 146097;\n const yearOfEra = Math.floor((dayOfEra - Math.floor(dayOfEra / 1460) + Math.floor(dayOfEra / 36524) - Math.floor(dayOfEra / 146096)) / 365);\n const dayOfYear = dayOfEra - (365 * yearOfEra + Math.floor(yearOfEra / 4) - Math.floor(yearOfEra / 100));\n const mp = Math.floor((5 * dayOfYear + 2) / 153);\n const day = dayOfYear - Math.floor((153 * mp + 2) / 5) + 1;\n const month = mp < 10 ? mp + 3 : mp - 9;\n return { year: yearOfEra + era * 400 + (month <= 2 ? 1 : 0), month, day };\n}\n\n/** Whether a year of the Gregorian calendar is a leap year. */\nexport function isLeapYear(year: number): boolean {\n return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;\n}\n\n/** How many days a month of a year has (`DateTime.DaysInMonth`). */\nexport function daysInMonth(year: number, month: number): number {\n if (month === 2) return isLeapYear(year) ? 29 : 28;\n return month === 4 || month === 6 || month === 9 || month === 11 ? 30 : 31;\n}\n\nconst base = dayNumber(1899, 12, 31);\n\n/** The serial of a calendar day, or `undefined` outside 1900-01-01 \u2026 9999-12-31. 1900-02-29 is 60. */\nexport function serialFromDate(year: number, month: number, day: number): number | undefined {\n if (year === 1900 && month === 2 && day === 29) return 60;\n if (year < 1900 || year > 9999 || month < 1 || month > 12 || day < 1 || day > daysInMonth(year, month)) return undefined;\n const serial = dayNumber(year, month, day) - base;\n return serial >= 60 ? serial + 1 : serial;\n}\n\n/** The calendar day of a whole serial, 0 to `maximumSerial`. */\nexport function dateFromSerial(serial: number): { year: number; month: number; day: number } {\n if (serial === 0) return { year: 1900, month: 1, day: 0 };\n if (serial === 60) return { year: 1900, month: 2, day: 29 };\n return fromDayNumber(base + (serial > 60 ? serial - 1 : serial));\n}\n\n/** The weekday Excel gives a serial, 0 for Sunday: Excel counts 1 January 1900 as a Sunday. */\nexport function serialDayOfWeek(serial: number): number {\n return (serial + 6) % 7;\n}\n", "// Numbers written as text, as Excel writes them.\nimport type { Culture } from './culture';\nimport { formatExponential, formatGeneral, parseInvariantDouble } from './dotnet';\n\n/**\n * The most characters General shows, whatever the width, not counting a minus sign: a wide column shows\n * `=1/3` as `0.333333333` and `123456789012` as `1.23457E+11` (GW-004, GW-009, GW-010; ADR-0120).\n */\nexport const generalLimit = 11;\n\n/** The most characters, not counting a minus sign, that a number written into text takes in full (`written`). */\nexport const writtenLongest = 20;\n\n/** The most characters a number constant in a Formula takes in full (`written`). */\nexport const formulaConstantLongest = 21;\n\n/** A number's fifteen significant digits and the power of ten of the first: `x.ToString(\"E14\")` read apart. */\nexport function fifteenDigits(magnitude: number): { digits: string; exponent: number } {\n const e14 = formatExponential(magnitude, 14);\n return { digits: e14.charAt(0) + e14.slice(2, 16), exponent: Number(e14.slice(17)) };\n}\n\n/**\n * Excel's General form in full: at most 15 significant digits (ADR-0047), the culture's decimal separator,\n * and scientific notation for very large and very small magnitudes (`number.ToString(\"G15\", culture)`).\n */\nexport function generalText(number: number, culture: Culture): string {\n return formatGeneral(number, 15, culture.data.numberDecimalSeparator, culture.data.negativeSign);\n}\n\n/**\n * A number as Excel writes it into text \u2014 `=A1&\"\"`, and the Cell Editor's text of a typed number: at most\n * 15 significant digits (ADR-0047) and the culture's decimal separator, written out in full where that\n * takes at most `longest` characters (a minus sign not counted), and in General's scientific spelling\n * (`1E+20`, `1.23456789012345E-05`) where it would take more (ADR-0047, second run).\n */\nexport function writtenText(number: number, culture: Culture, longest = writtenLongest): string {\n if (number === 0) return '0';\n const { digits: all, exponent } = fifteenDigits(Math.abs(number));\n const digits = all.replace(/0+$/, '');\n const fullLength = exponent < 0\n ? 2 + (-exponent - 1) + digits.length\n : Math.max(digits.length, exponent + 1) + (digits.length > exponent + 1 ? 1 : 0);\n if (fullLength > longest) return generalText(number, culture);\n const separator = culture.data.numberDecimalSeparator;\n const sign = number < 0 ? '-' : '';\n if (exponent < 0) return `${sign}0${separator}${'0'.repeat(-exponent - 1)}${digits}`;\n if (digits.length <= exponent + 1) return `${sign}${digits}${'0'.repeat(exponent + 1 - digits.length)}`;\n return `${sign}${digits.slice(0, exponent + 1)}${separator}${digits.slice(exponent + 1)}`;\n}\n\n/**\n * Excel's General form fitted to a column `characters` wide, each character charged one digit width\n * (ADR-0047): decimals are rounded to what fits, and the form is scientific where the integer part does\n * not fit, where it has twelve or more digits, or where the scientific form that fits is closer to the\n * number than the decimal form that fits. A negative number rounded to a bare 0 keeps its minus sign, and a\n * column with no room for the sign shows `####` (GW-026, GW-027). `undefined` when neither form fits.\n */\nexport function generalFitted(number: number, characters: number, culture: Culture): string | undefined {\n return generalForm(number, characters, culture.data.numberDecimalSeparator)?.text;\n}\n\n/** Whether General, fitted to `characters`, writes the number in scientific notation; `undefined` when it cannot be shown at that width. */\nexport function isGeneralScientific(number: number, characters: number): boolean | undefined {\n return generalForm(number, characters, '.')?.scientific;\n}\n\nfunction generalForm(number: number, characters: number, separator: string): { text: string; scientific: boolean } | undefined {\n const minus = number < 0;\n const limit = Math.min(characters - (minus ? 1 : 0), generalLimit);\n if (limit < 1) return undefined;\n if (number === 0) return { text: '0', scientific: false };\n\n // Fifteen significant digits (ADR-0047), rounded again from there.\n const magnitude = Math.abs(number);\n const { digits, exponent } = fifteenDigits(magnitude);\n const fixedForm = decimalForm(digits, exponent, limit);\n const scientificForm = scientific(digits, exponent, limit);\n\n let chosen: string;\n let isScientific: boolean;\n if (fixedForm !== undefined && (scientificForm === undefined || error(fixedForm, magnitude) <= error(scientificForm, magnitude))) {\n chosen = fixedForm;\n isScientific = false;\n } else if (scientificForm !== undefined) {\n chosen = scientificForm;\n isScientific = true;\n } else {\n return undefined;\n }\n if (separator !== '.') chosen = chosen.replaceAll('.', separator);\n return { text: (minus ? '-' : '') + chosen, scientific: isScientific };\n}\n\nfunction error(invariant: string, magnitude: number): number {\n return Math.abs(parseInvariantDouble(invariant) - magnitude);\n}\n\n/** The decimal form, invariant, in at most `limit` characters. */\nfunction decimalForm(digits: string, exponent: number, limit: number): string | undefined {\n const integerDigits = exponent >= 0 ? exponent + 1 : 1;\n if (integerDigits > limit) return undefined;\n const fraction = Math.max(0, limit - integerDigits - 1);\n const { digits: rounded, at } = round(digits, exponent, exponent + 1 + fraction);\n if (rounded.length === 0) return '0';\n\n // rounded holds the significant digits, the first at 10^at.\n const digitAt = (power: number): string => {\n const i = at - power;\n return i >= 0 && i < rounded.length ? rounded.charAt(i) : '0';\n };\n\n let text = at < 0 ? '0' : '';\n for (let p = at; p >= 0; p--) text += digitAt(p);\n let fractionText = '';\n for (let p = -1; p >= -fraction; p--) fractionText += digitAt(p);\n const trimmed = fractionText.replace(/0+$/, '');\n if (trimmed.length > 0) text += `.${trimmed}`;\n return text.length <= limit ? text : undefined;\n}\n\n/** The scientific form, invariant, in at most `limit` characters. */\nfunction scientific(digits: string, exponent: number, limit: number): string | undefined {\n for (let mantissaFraction = Math.max(0, limit - 6); mantissaFraction >= 0; mantissaFraction--) {\n const { digits: rounded, at } = round(digits, exponent, 1 + mantissaFraction);\n const mantissa = rounded.replace(/0+$/, '');\n let text = mantissa.charAt(0);\n if (mantissa.length > 1) text += `.${mantissa.slice(1)}`;\n const power = Math.abs(at);\n text += (at < 0 ? 'E-' : 'E+') + String(power).padStart(power >= 100 ? 3 : 2, '0');\n if (text.length <= limit) return text;\n }\n return undefined;\n}\n\n/**\n * `digits` (the first at 10^`exponent`) rounded half away from zero to `keep` significant digits: the digits\n * kept, and the power of ten of the first. Empty when the number rounds to zero.\n */\nexport function roundDigits(digits: string, exponent: number, keep: number): { digits: string; at: number } {\n return round(digits, exponent, keep);\n}\n\nfunction round(digits: string, exponent: number, keep: number): { digits: string; at: number } {\n if (keep >= digits.length) return { digits, at: exponent };\n if (keep < 0) return { digits: '', at: exponent };\n if (keep === 0) return digits.charAt(0) >= '5' ? { digits: '1', at: exponent + 1 } : { digits: '', at: exponent };\n let kept = digits.slice(0, keep);\n if (digits.charAt(keep) >= '5') {\n let i = keep - 1;\n while (i >= 0 && kept.charAt(i) === '9') i--;\n if (i < 0) return { digits: `1${'0'.repeat(keep)}`, at: exponent + 1 };\n kept = kept.slice(0, i) + String.fromCharCode(kept.charCodeAt(i) + 1) + '0'.repeat(keep - 1 - i);\n }\n return { digits: kept, at: exponent };\n}\n", "// Excel's ROUND, ROUNDUP and ROUNDDOWN, and the rounding the number formats share with them.\nimport { fifteenDigits } from '../number-text';\n\n/** How ROUND, ROUNDUP and ROUNDDOWN treat the digits they drop. */\nexport type Rounding = 'halfAwayFromZero' | 'awayFromZero' | 'towardZero';\n\n/** Excel's ROUND: half away from zero (`roundAt`). */\nexport function roundHalfAwayFromZeroAt(number: number, digits: number): number {\n return roundAt(number, digits, 'halfAwayFromZero');\n}\n\n/**\n * Excel's ROUND, ROUNDUP and ROUNDDOWN, applied to the number as Excel holds it to 15 significant digits \u2014\n * so 2.675, which is 2.67499999999999982236431605997495353221893310546875 as a double, rounds to 2.68 as its\n * decimal spelling says, and 0.1+0.2 rounds up to 0.3 at one digit, not 0.4. `digits` is already a whole\n * number.\n */\nexport function roundAt(number: number, digits: number, rounding: Rounding): number {\n if (number === 0) return 0;\n const { digits: mantissa, exponent } = fifteenDigits(Math.abs(number));\n // How many of the 15 digits sit at or above the 10^-digits place.\n const kept = exponent + 1 + digits;\n if (kept >= 15) return number;\n if (kept < 0) {\n // Every digit is dropped: a number below half the place is 0, and away from zero it is the place itself.\n if (rounding !== 'awayFromZero') return 0;\n const place = powerOfTen(-digits);\n return number < 0 ? -place : place;\n }\n const retained = mantissa.slice(0, kept);\n let roundUp: boolean;\n switch (rounding) {\n case 'halfAwayFromZero': roundUp = mantissa.charAt(kept) >= '5'; break;\n case 'awayFromZero': roundUp = /[1-9]/.test(mantissa.slice(kept)); break;\n case 'towardZero': roundUp = false; break;\n default: return unreachableRounding(rounding);\n }\n // An integer of at most 16 digits, exact in a BigInt as it is in C#'s decimal.\n const magnitude = (kept === 0 ? 0n : BigInt(retained)) + (roundUp ? 1n : 0n);\n if (magnitude === 0n) return 0;\n // Placed back at 10^(exponent + 1 - kept), and read as .NET reads its spelling: correctly rounded.\n const result = Number(`${magnitude.toString()}E${String(exponent + 1 - kept)}`);\n return number < 0 ? -result : result;\n}\n\n/**\n * `Math.Pow(10, n)` for a whole `n`, correctly rounded, as .NET's `Math.Pow` gives it on every platform the\n * engine is held to: the double nearest 10^n, read from its spelling.\n */\nexport function powerOfTen(n: number): number {\n if (!Number.isInteger(n)) throw new Error(`Internal: 10^${String(n)} is asked for a whole power only.`);\n // Past the doubles' range, as Math.Pow overflows to infinity and underflows to zero; String(n) would be spelt with an exponent.\n if (n > 400) return Infinity;\n if (n < -400) return 0;\n return Number(`1e${String(n)}`);\n}\n\nfunction unreachableRounding(rounding: never): never {\n throw new Error(`Internal: ${String(rounding)} is no Rounding.`);\n}\n", "import { dateCode, type Culture } from './culture';\nimport { dateFromSerial, maximumSerial, serialDayOfWeek } from './date-serial';\nimport { equalsIgnoreCase, formatExponential, isAsciiLetter, lowerInvariant, startsWithAtIgnoreCase } from './dotnet';\nimport { powerOfTen, roundHalfAwayFromZeroAt } from './formulas/rounding';\nimport { elementAt } from './must';\nimport { generalFitted, generalText } from './number-text';\nimport type { Value } from './value';\nimport { FormatError } from './format-error';\n\n/**\n * A colour a Number Format names at the start of a section \u2014 `[Red]` and the seven others, in any case\n * (ADR-0047). The text of a Value that section shows is painted in it, over the cell's Font colour (ADR-0071).\n * A numbered colour (`[Color10]`) is not one of these: it is refused, as Excel refused it.\n */\nexport type NumberFormatColour = 'black' | 'blue' | 'cyan' | 'green' | 'magenta' | 'red' | 'white' | 'yellow';\n\nconst colours: readonly NumberFormatColour[] = ['black', 'blue', 'cyan', 'green', 'magenta', 'red', 'white', 'yellow'];\n\n/** The RGB Excel paints a Number Format's colour in, as `0xRRGGBB`: Excel's legacy palette (ADR-0071). */\nexport function numberFormatColourRgb(colour: NumberFormatColour): number {\n switch (colour) {\n case 'black': return 0x000000;\n case 'blue': return 0x0000ff;\n case 'cyan': return 0x00ffff;\n case 'green': return 0x00ff00;\n case 'magenta': return 0xff00ff;\n case 'red': return 0xff0000;\n case 'white': return 0xffffff;\n case 'yellow': return 0xffff00;\n default: throw new RangeError(`A Number Format names one of eight colours, not ${String(colour)}.`);\n }\n}\n\n/** The colour `name` names, in any case, or `undefined` when it names none of the eight. */\nfunction namedColour(name: string): NumberFormatColour | undefined {\n return colours.find(colour => equalsIgnoreCase(colour, name));\n}\n\n/** A format code read, or why it could not be. */\nexport type NumberFormatReading =\n | { readonly format: NumberFormat; readonly reason?: undefined }\n | { readonly format?: undefined; readonly reason: string };\n\n/** A Value as a format shows it: the text, whether it cannot be shown (`####`), and the section's colour. */\nexport interface FormattedValue {\n readonly text: string;\n readonly cannotShow: boolean;\n readonly colour: NumberFormatColour | undefined;\n}\n\ntype SectionKind = 'number' | 'date' | 'text' | 'literal';\n\ntype PartKind = 'literal' | 'digit' | 'decimalPoint' | 'comma' | 'percent' | 'exponent' | 'dateCode' | 'amPm' | 'textValue';\n\ninterface Part {\n readonly kind: PartKind;\n readonly text: string;\n readonly code: string;\n readonly count: number;\n}\n\nfunction part(kind: PartKind, text: string, code = '', count = 0): Part {\n return { kind, text, code, count };\n}\n\n/** What `Section.parse` and `classify` give: the section, or why the code cannot be read. */\ntype SectionReading = { readonly section: Section; readonly reason?: undefined } | { readonly section?: undefined; readonly reason: string };\n\n/** The digits of a number section: how many placeholders each part has, and what its commas mean. */\ninterface NumberShape {\n scale: number;\n thousands: boolean;\n integerPlaceholders: number;\n fractionPlaceholders: number;\n exponentPlaceholders: number;\n percent: number;\n}\n\nclass Section {\n readonly #parts: readonly Part[];\n readonly kind: SectionKind;\n readonly percent: number;\n readonly colour: NumberFormatColour | undefined;\n readonly #scale: number;\n readonly #thousands: boolean;\n readonly #integerPlaceholders: number;\n readonly #fractionPlaceholders: number;\n readonly #exponentPlaceholders: number;\n readonly #twelveHour: boolean;\n\n constructor(parts: readonly Part[], kind: SectionKind, shape: NumberShape, twelveHour: boolean, colour: NumberFormatColour | undefined) {\n this.#parts = parts;\n this.kind = kind;\n this.percent = shape.percent;\n this.colour = colour;\n this.#scale = shape.scale;\n this.#thousands = shape.thousands;\n this.#integerPlaceholders = shape.integerPlaceholders;\n this.#fractionPlaceholders = shape.fractionPlaceholders;\n this.#exponentPlaceholders = shape.exponentPlaceholders;\n this.#twelveHour = twelveHour;\n }\n\n /** Whether a date section shows a time of day. */\n get hasTime(): boolean {\n return this.#parts.some(p => p.kind === 'amPm' || (p.kind === 'dateCode' && (p.code === 'h' || p.code === 's')));\n }\n\n static parse(text: string): SectionReading {\n const parts: Part[] = [];\n let colour: NumberFormatColour | undefined;\n for (let i = 0; i < text.length; i++) {\n const c = text.charAt(i);\n switch (c) {\n case '\"': {\n const close = closing(text, '\"', i + 1);\n parts.push(part('literal', text.slice(i + 1, close)));\n i = close;\n continue;\n }\n case '\\\\':\n if (i + 1 >= text.length) return { reason: '\\\\ escapes nothing.' };\n parts.push(part('literal', text.charAt(i + 1)));\n i++;\n continue;\n case '_':\n // Excel pads by the width of the next character; a space stands in for it.\n if (i + 1 >= text.length) return { reason: '_ pads by nothing.' };\n parts.push(part('literal', ' '));\n i++;\n continue;\n case '*':\n return { reason: '* repeats a character to fill the column, which depends on its width.' };\n case '[': {\n const bracketEnd = text.indexOf(']', i + 1);\n if (bracketEnd > i && startsWithAtIgnoreCase(text.slice(i + 1, bracketEnd), 0, 'Color')) {\n return { reason: 'a numbered colour ([Color n]) is refused, as Excel refuses it; name one of the eight colours instead.' };\n }\n const named = bracketEnd > i ? namedColour(text.slice(i + 1, bracketEnd)) : undefined;\n if (named !== undefined) {\n // The section's colour (ADR-0071). Excel reads one at the start of a section; anywhere else it is refused.\n if (parts.length > 0 || colour !== undefined) return { reason: 'a colour is read only once, at the start of its section.' };\n colour = named;\n i = bracketEnd;\n continue;\n }\n return { reason: 'conditions, locales and elapsed time in brackets are not supported.' };\n }\n case '@':\n parts.push(part('textValue', '@'));\n continue;\n case '0':\n case '#':\n case '?':\n parts.push(part('digit', c, c));\n continue;\n case '.':\n parts.push(part('decimalPoint', '.'));\n continue;\n case ',':\n parts.push(part('comma', ','));\n continue;\n case '%':\n parts.push(part('percent', '%'));\n continue;\n default:\n break;\n }\n\n if ((c === 'E' || c === 'e') && i + 1 < text.length && (text.charAt(i + 1) === '+' || text.charAt(i + 1) === '-')) {\n parts.push(part('exponent', text.slice(i, i + 2), text.charAt(i + 1)));\n i++;\n continue;\n }\n if (startsWithAtIgnoreCase(text, i, 'AM/PM')) {\n parts.push(part('amPm', text.slice(i, i + 5)));\n i += 4;\n continue;\n }\n if (startsWithAtIgnoreCase(text, i, 'A/P')) {\n parts.push(part('amPm', text.slice(i, i + 3)));\n i += 2;\n continue;\n }\n const lower = String.fromCharCode(lowerInvariant(text.charCodeAt(i)));\n if (lower === 'y' || lower === 'm' || lower === 'd' || lower === 'h' || lower === 's') {\n let run = 1;\n while (i + run < text.length && String.fromCharCode(lowerInvariant(text.charCodeAt(i + run))) === lower) run++;\n parts.push(part('dateCode', text.slice(i, i + run), lower, run));\n i += run - 1;\n continue;\n }\n if (isAsciiLetter(text.charCodeAt(i))) return { reason: `'${c}' is not a format code; quote text that should show as it is.` };\n parts.push(part('literal', c));\n }\n return classify(parts, colour);\n }\n\n formatText(text: string): string {\n let output = '';\n for (const p of this.#parts) output += p.kind === 'textValue' ? text : p.text;\n return output;\n }\n\n formatNumber(magnitude: number, minus: boolean, culture: Culture): { text: string; cannotShow: boolean } {\n switch (this.kind) {\n case 'date': return this.#formatDate(magnitude, minus, culture);\n case 'literal': return { text: (minus ? '-' : '') + this.#parts.map(p => p.text).join(''), cannotShow: false };\n case 'number':\n case 'text': {\n const digits = this.#formatDigits(magnitude, minus, culture);\n return digits === undefined ? { text: '', cannotShow: true } : { text: digits, cannotShow: false };\n }\n default: return unreachableSection(this.kind);\n }\n }\n\n /**\n * The number in this section's digits, or `undefined` where its percent signs scale it past the largest double,\n * which no digits can show: the cell cannot show it and TEXT is `#VALUE!`, as for a date out of range.\n */\n #formatDigits(magnitude: number, minusGiven: boolean, culture: Culture): string | undefined {\n let minus = minusGiven;\n // One power for both, so percent signs and thousands commas that cancel never overflow or underflow on the way.\n const shift = 2 * this.percent - 3 * this.#scale;\n const value = shift >= 0 ? magnitude * powerOfTen(shift) : magnitude / powerOfTen(-shift);\n if (!Number.isFinite(value)) return undefined;\n let integerDigits: string;\n let fractionDigits: string;\n let exponent = 0;\n if (this.#exponentPlaceholders > 0) {\n ({ integer: integerDigits, fraction: fractionDigits, exponent } = scientificDigits(value, this.#fractionPlaceholders));\n } else {\n const rounded = roundHalfAwayFromZeroAt(value, this.#fractionPlaceholders);\n ({ integer: integerDigits, fraction: fractionDigits } = digitsOf(rounded, this.#fractionPlaceholders));\n // A negative number that rounds to zero shows no minus sign: -0.001 in 0.00 is 0.00, as Excel was observed to show it (FMT-063).\n if (rounded === 0) minus = false;\n }\n\n const data = culture.data;\n let output = minus ? '-' : '';\n\n // The integer placeholders take the digits right-aligned; extra digits go with the first.\n const integerParts: Part[] = [];\n for (const p of this.#parts) {\n if (p.kind === 'decimalPoint' || p.kind === 'exponent') break;\n if (p.kind === 'digit') integerParts.push(p);\n }\n const integerOutput: string[] = Array.from({ length: this.#integerPlaceholders }, () => '');\n let digitIndex = integerDigits.length;\n for (let k = integerParts.length - 1; k >= 0; k--) {\n digitIndex--;\n let rendered: string;\n if (digitIndex >= 0) {\n rendered = k === 0 ? integerDigits.slice(0, digitIndex + 1) : integerDigits.charAt(digitIndex);\n } else {\n const code = elementAt(integerParts, k).code;\n rendered = code === '0' ? '0' : code === '?' ? ' ' : '';\n }\n integerOutput[k] = rendered;\n }\n if (this.#thousands) {\n const joined = group(integerOutput.join(''), data.numberGroupSeparator, data.numberGroupSizes);\n for (let k = 0; k < integerOutput.length; k++) integerOutput[k] = k === 0 ? joined : '';\n }\n\n // The fraction placeholders take the digits left-aligned; trailing zeros under # vanish, under ? become spaces.\n const fractionParts: Part[] = [];\n let afterPoint = false;\n for (const p of this.#parts) {\n if (p.kind === 'exponent') break;\n if (p.kind === 'decimalPoint') afterPoint = true;\n else if (afterPoint && p.kind === 'digit') fractionParts.push(p);\n }\n const fractionOutput: string[] = Array.from({ length: this.#fractionPlaceholders }, () => '');\n let significant = true;\n for (let k = fractionParts.length - 1; k >= 0; k--) {\n const digit = fractionDigits.charAt(k);\n const code = elementAt(fractionParts, k).code;\n if (significant && digit === '0' && code !== '0') {\n fractionOutput[k] = code === '?' ? ' ' : '';\n continue;\n }\n significant = false;\n fractionOutput[k] = digit;\n }\n\n let integerAt = 0;\n let fractionAt = 0;\n let exponentAt = 0;\n const exponentDigits = String(Math.abs(exponent)).padStart(this.#exponentPlaceholders, '0');\n let inExponent = false;\n afterPoint = false;\n for (const p of this.#parts) {\n switch (p.kind) {\n case 'digit':\n if (inExponent) {\n // All exponent digits come out at the first exponent placeholder.\n if (exponentAt++ === 0) output += exponentDigits;\n } else if (afterPoint) {\n output += elementAt(fractionOutput, fractionAt++);\n } else {\n output += elementAt(integerOutput, integerAt++);\n }\n break;\n case 'decimalPoint':\n afterPoint = true;\n output += data.numberDecimalSeparator;\n break;\n case 'exponent':\n inExponent = true;\n output += p.text.charAt(0);\n if (exponent < 0) output += '-';\n else if (p.code === '+') output += '+';\n break;\n case 'literal':\n case 'comma':\n case 'percent':\n case 'dateCode':\n case 'amPm':\n case 'textValue':\n output += p.text;\n break;\n default:\n return unreachablePart(p.kind);\n }\n }\n return output;\n }\n\n #formatDate(magnitude: number, minus: boolean, culture: Culture): { text: string; cannotShow: boolean } {\n if (minus || magnitude >= maximumSerial + 1) return { text: '', cannotShow: true };\n // To the second: a time is shown rounded to the nearest second.\n const totalSeconds = roundHalfAwayFromZero(magnitude * 86_400);\n const serial = Math.trunc(totalSeconds / 86_400);\n if (serial > maximumSerial) return { text: '', cannotShow: true };\n const secondOfDay = totalSeconds % 86_400;\n const { year, month, day } = dateFromSerial(serial);\n const hour = Math.trunc(secondOfDay / 3600);\n const minute = Math.trunc(secondOfDay / 60) % 60;\n const second = secondOfDay % 60;\n const names = culture.data;\n\n let output = '';\n for (let i = 0; i < this.#parts.length; i++) {\n const p = elementAt(this.#parts, i);\n switch (p.kind) {\n case 'dateCode':\n switch (p.code) {\n case 'y':\n output += p.count <= 2 ? two(year % 100) : String(year).padStart(4, '0');\n break;\n case 'm':\n if (this.#isMinute(i)) {\n output += p.count === 1 ? String(minute) : two(minute);\n } else if (p.count === 1) {\n output += String(month);\n } else if (p.count === 2) {\n output += two(month);\n } else if (p.count === 3) {\n output += elementAt(abbreviatedMonthNamesOf(culture), month - 1);\n } else if (p.count === 4) {\n output += elementAt(names.monthNames, month - 1);\n } else {\n output += elementAt(names.monthNames, month - 1).charAt(0);\n }\n break;\n case 'd':\n if (p.count === 1) output += String(day);\n else if (p.count === 2) output += two(day);\n else if (p.count === 3) output += elementAt(names.abbreviatedDayNames, serialDayOfWeek(serial));\n else output += elementAt(names.dayNames, serialDayOfWeek(serial));\n break;\n case 'h': {\n const shown = this.#twelveHour ? (hour % 12 === 0 ? 12 : hour % 12) : hour;\n output += p.count === 1 ? String(shown) : two(shown);\n break;\n }\n default:\n output += p.count === 1 ? String(second) : two(second);\n break;\n }\n break;\n case 'amPm': {\n const afternoon = hour >= 12;\n output += p.text.length === 5\n ? (afternoon ? p.text.slice(3, 5) : p.text.slice(0, 2))\n : (afternoon ? p.text.slice(2, 3) : p.text.slice(0, 1));\n break;\n }\n case 'literal':\n case 'digit':\n case 'decimalPoint':\n case 'comma':\n case 'percent':\n case 'exponent':\n case 'textValue':\n output += p.text;\n break;\n default:\n return unreachablePart(p.kind);\n }\n }\n return { text: output, cannotShow: false };\n }\n\n /** An `m` is minutes right after an hour code or right before a seconds code, as in Excel. */\n #isMinute(index: number): boolean {\n for (let i = index - 1; i >= 0; i--) {\n const p = elementAt(this.#parts, i);\n if (p.kind !== 'dateCode') continue;\n if (p.code === 'h') return true;\n break;\n }\n for (let i = index + 1; i < this.#parts.length; i++) {\n const p = elementAt(this.#parts, i);\n if (p.kind !== 'dateCode') continue;\n return p.code === 's';\n }\n return false;\n }\n}\n\nfunction noShape(percent = 0): NumberShape {\n return { scale: 0, thousands: false, integerPlaceholders: 0, fractionPlaceholders: 0, exponentPlaceholders: 0, percent };\n}\n\nfunction classify(parts: readonly Part[], colour: NumberFormatColour | undefined): SectionReading {\n const hasDate = parts.some(p => p.kind === 'dateCode' || p.kind === 'amPm');\n const hasDigits = parts.some(p => p.kind === 'digit');\n const hasText = parts.some(p => p.kind === 'textValue');\n if (hasText && (hasDate || hasDigits)) return { reason: '@ cannot share a section with number or date codes.' };\n if (hasText) return { section: new Section(literalise(parts, ['comma', 'decimalPoint', 'percent']), 'text', noShape(), false, colour) };\n\n if (hasDate) {\n if (hasDigits || parts.some(p => p.kind === 'exponent' || p.kind === 'percent')) {\n return { reason: 'fractional seconds and numbers inside a date or time format are not supported.' };\n }\n return { section: new Section(literalise(parts, ['comma', 'decimalPoint']), 'date', noShape(), parts.some(p => p.kind === 'amPm'), colour) };\n }\n\n if (!hasDigits) {\n return {\n section: new Section(literalise(parts, ['comma', 'decimalPoint']), 'literal', noShape(parts.filter(p => p.kind === 'percent').length), false, colour),\n };\n }\n\n // A number section: decide what each comma and point means.\n const result: Part[] = [];\n const shape = noShape();\n let seenPoint = false;\n let seenExponent = false;\n const lastDigit = parts.findLastIndex(p => p.kind === 'digit');\n for (let i = 0; i < parts.length; i++) {\n const p = elementAt(parts, i);\n switch (p.kind) {\n case 'digit':\n if (seenExponent) shape.exponentPlaceholders++;\n else if (seenPoint) shape.fractionPlaceholders++;\n else shape.integerPlaceholders++;\n result.push(p);\n break;\n case 'decimalPoint':\n if (seenPoint || seenExponent) return { reason: 'a number format has one decimal point.' };\n seenPoint = true;\n result.push(p);\n break;\n case 'comma': {\n const previous = i > 0 ? elementAt(parts, i - 1).kind : undefined;\n const before = previous === 'digit' || previous === 'comma';\n let digitAfterInInteger = false;\n for (let j = i + 1; j < parts.length; j++) {\n const later = elementAt(parts, j).kind;\n if (later === 'decimalPoint' || later === 'exponent') break;\n if (later === 'digit') digitAfterInInteger = true;\n }\n if (!seenPoint && !seenExponent && before && digitAfterInInteger) {\n shape.thousands = true;\n } else if (!seenExponent && before && !digitAfterInInteger && (!seenPoint || i > lastDigit)) {\n shape.scale++;\n } else {\n result.push(part('literal', ','));\n }\n break;\n }\n case 'percent':\n shape.percent++;\n result.push(p);\n break;\n case 'exponent':\n if (seenExponent || shape.integerPlaceholders !== 1) {\n return { reason: 'scientific notation is supported with one integer placeholder, as in 0.00E+00.' };\n }\n seenExponent = true;\n result.push(p);\n break;\n case 'literal':\n if (p.text === '/' && parts.slice(i + 1).some(later => later.kind === 'digit')) return { reason: 'fractions are not supported.' };\n result.push(p);\n break;\n case 'dateCode':\n case 'amPm':\n case 'textValue':\n result.push(p);\n break;\n default:\n return unreachablePart(p.kind);\n }\n }\n if (seenExponent && shape.exponentPlaceholders === 0) return { reason: 'the exponent needs a digit placeholder.' };\n return { section: new Section(result, 'number', shape, false, colour) };\n}\n\nfunction literalise(parts: readonly Part[], kinds: readonly PartKind[]): Part[] {\n return parts.map(p => (kinds.includes(p.kind) ? part('literal', p.text) : p));\n}\n\nfunction group(integer: string, separator: string, sizes: readonly number[]): string {\n const digits = integer.replace(/^ +/, '');\n const padding = integer.slice(0, integer.length - digits.length);\n if (digits.length === 0) return integer;\n const groups: string[] = [];\n let end = digits.length;\n let sizeIndex = 0;\n while (end > 0) {\n const size = sizes.length === 0 ? 3 : elementAt(sizes, Math.min(sizeIndex, sizes.length - 1));\n if (size <= 0) {\n groups.push(digits.slice(0, end));\n break;\n }\n const start = Math.max(0, end - size);\n groups.push(digits.slice(start, end));\n end = start;\n sizeIndex++;\n }\n return padding + groups.toReversed().join(separator);\n}\n\n/** The integer and fraction digits of a value already rounded, from its 15 significant digits; zero's integer part is empty. */\nfunction digitsOf(value: number, fractionDigits: number): { integer: string; fraction: string } {\n if (value === 0) return { integer: '', fraction: '0'.repeat(fractionDigits) };\n const spelled = formatExponential(value, 14);\n const mantissa = spelled.charAt(0) + spelled.slice(2, 16);\n const exponent = Number(spelled.slice(17));\n let integer: string;\n let fraction: string;\n if (exponent >= 0) {\n integer = exponent + 1 >= 15 ? mantissa + '0'.repeat(exponent + 1 - 15) : mantissa.slice(0, exponent + 1);\n fraction = exponent + 1 >= 15 ? '' : mantissa.slice(exponent + 1);\n } else {\n integer = '';\n fraction = '0'.repeat(-exponent - 1) + mantissa;\n }\n fraction = fraction.length >= fractionDigits ? fraction.slice(0, fractionDigits) : fraction.padEnd(fractionDigits, '0');\n return { integer, fraction };\n}\n\n/** One integer digit, the fraction digits rounded half away from zero, and the exponent. */\nfunction scientificDigits(value: number, fractionDigits: number): { integer: string; fraction: string; exponent: number } {\n if (value === 0) return { integer: '0', fraction: '0'.repeat(fractionDigits), exponent: 0 };\n const spelled = formatExponential(value, 14);\n const mantissa = spelled.charAt(0) + spelled.slice(2, 16);\n let exponent = Number(spelled.slice(17));\n const keep = Math.min(1 + fractionDigits, 15);\n let digits = mantissa.slice(0, keep).split('');\n if (keep < 15 && mantissa.charAt(keep) >= '5') {\n let i = keep - 1;\n while (i >= 0) {\n if (digits[i] === '9') {\n digits[i] = '0';\n i--;\n continue;\n }\n digits[i] = String(Number(elementAt(digits, i)) + 1);\n break;\n }\n if (i < 0) {\n digits = ['1', ...digits.slice(0, -1)];\n exponent++;\n }\n }\n const all = digits.join('').padEnd(1 + fractionDigits, '0');\n return { integer: all.slice(0, 1), fraction: all.slice(1), exponent };\n}\n\n/** `Math.Round(x, MidpointRounding.AwayFromZero)` as .NET computes it: `Truncate(x + CopySign(BitDecrement(0.5), x))`. */\nfunction roundHalfAwayFromZero(x: number): number {\n return Math.trunc(x + (x < 0 ? -0.49999999999999994 : 0.49999999999999994));\n}\n\nfunction two(n: number): string {\n return String(n).padStart(2, '0');\n}\n\nfunction closing(text: string, quote: string, from: number): number {\n const close = text.indexOf(quote, from);\n if (close < 0) throw new Error('Internal: the sections were split with every quotation closed.');\n return close;\n}\n\nfunction unreachableSection(kind: never): never {\n throw new Error(`Internal: ${String(kind)} is no kind of section.`);\n}\n\nfunction unreachablePart(kind: never): never {\n throw new Error(`Internal: ${String(kind)} is no kind of part.`);\n}\n\n/**\n * The abbreviated month names Excel shows under a culture, which `mmm` shows: the culture's own, with the two\n * differences found between the ICU data .NET reads and Windows' regional settings, which Excel reads.\n * ICU abbreviates September `Sept` under en-GB, where Windows writes `Sep`; and it abbreviates a Japanese\n * month as its full name, `1\u6708`, where Windows writes the month's number alone (ADR-0071).\n */\nexport function abbreviatedMonthNamesOf(culture: Culture): readonly string[] {\n const japanese = culture.data.twoLetterLanguage === 'ja';\n return culture.data.abbreviatedMonthNames.map((name, i) => {\n const number = String(i + 1);\n if (name === 'Sept') return 'Sep';\n if (japanese && name === `${number}\u6708`) return number;\n return name;\n });\n}\n\n/**\n * The currency symbol Excel shows under a culture: the culture's own, with Windows' ja-JP yen sign U+00A5\n * where ICU on Linux gives the full-width U+FFE5 (ADR-0071).\n */\nexport function currencySymbolOf(culture: Culture): string {\n return culture.data.currencySymbol.replaceAll('\uFFE5', '\u00A5');\n}\n\n/**\n * The built-in currency format as Excel spells it under a culture, built from the culture's currency symbol\n * and where it puts the symbol and the sign, as Windows' regional settings give Excel the same three.\n */\nfunction localCurrencyCode(culture: Culture, decimals: boolean): string {\n const data = culture.data;\n const currencySymbol = currencySymbolOf(culture);\n const symbol = /^\\p{Sc}*$/u.test(currencySymbol) && !/[\\uD800-\\uDFFF]/.test(currencySymbol)\n ? currencySymbol\n : `\"${currencySymbol.replaceAll('\"', '')}\"`;\n const n = decimals ? '#,##0.00' : '#,##0';\n // Windows' regional default for en-US writes a negative amount in parentheses, and Excel follows it;\n // .NET's ICU data writes it with a minus. Elsewhere .NET's data is read, and it agreed with Excel.\n const negativePattern = data.name === 'en-US' ? 0 : data.currencyNegativePattern;\n const negatives: Readonly<Record<number, string>> = {\n 0: `(${symbol}${n})`, 2: `${symbol}-${n}`, 3: `${symbol}${n}-`, 4: `(${n}${symbol})`, 5: `-${n}${symbol}`,\n 6: `${n}-${symbol}`, 7: `${n}${symbol}-`, 8: `-${n} ${symbol}`, 9: `-${symbol} ${n}`, 10: `${n} ${symbol}-`,\n 11: `${symbol} ${n}-`, 12: `${symbol} -${n}`, 13: `${n}- ${symbol}`, 14: `(${symbol} ${n})`, 15: `(${n} ${symbol})`,\n 16: `${symbol}- ${n}`,\n };\n const negative = negatives[negativePattern] ?? `-${symbol}${n}`;\n const positive = data.currencyPositivePattern === 0 ? `${symbol}${n}`\n : data.currencyPositivePattern === 1 ? `${n}${symbol}`\n : data.currencyPositivePattern === 2 ? `${symbol} ${n}`\n : `${n} ${symbol}`;\n return `${negative.endsWith(')') ? `${positive}_)` : positive};[Red]${negative}`;\n}\n\nconst shortDateCode = 'm/d/yyyy';\nconst shortDateTimeCode = 'm/d/yyyy h:mm';\n/** Excel's built-in day and month name (`d-mmm`, format 16), which a date typed without its year records. */\nconst dayMonthCode = 'd-mmm';\n/** Excel's built-in date with the month's name (`d-mmm-yy`, format 15). */\nconst dayMonthYearCode = 'd-mmm-yy';\n/** Excel's built-in hour and minute (`h:mm`, format 20). */\nconst hourMinuteCode = 'h:mm';\nconst currencyCode = '$#,##0.00_);[Red]($#,##0.00)';\nconst wholeCurrencyCode = '$#,##0_);[Red]($#,##0)';\n\n/**\n * An Excel number format code, such as `#,##0.00`, `0%` or `yyyy-mm-dd` (ADR-0046). The code is written in\n * Excel's stored, invariant form \u2014 `,` groups thousands and `.` marks decimals \u2014 and shown with the Sheet's\n * culture's separators and month and day names. A code outside the subset the engine shows as Excel does \u2014\n * conditions, locales and elapsed time in brackets, fractions, fractional seconds, `*` fill, era codes,\n * unquoted letters, a numbered colour \u2014 is refused rather than shown some other way.\n */\nexport class NumberFormat {\n readonly #code: string;\n readonly #sections: readonly Section[];\n\n private constructor(code: string, sections: readonly Section[]) {\n this.#code = code;\n this.#sections = sections;\n }\n\n /** Excel's `General`: at most 15 significant digits, the culture's decimal separator. */\n static readonly general: NumberFormat = new NumberFormat('General', []);\n\n /** The code as given, such as `#,##0.00`. */\n get code(): string {\n return this.#code;\n }\n\n /** Whether this is `General`. */\n get isGeneral(): boolean {\n return this.#sections.length === 0;\n }\n\n /** Whether a number shows as a date or time: its first section holds date or time codes. */\n get isDate(): boolean {\n return this.#sections.length > 0 && elementAt(this.#sections, 0).kind === 'date';\n }\n\n /** Whether a number shows as a date with no time of day. @internal */\n get isDateOnly(): boolean {\n return this.isDate && !elementAt(this.#sections, 0).hasTime;\n }\n\n /** Whether a number shows as a percentage: its first section holds `%`. */\n get isPercent(): boolean {\n return this.#sections.length > 0 && elementAt(this.#sections, 0).percent > 0;\n }\n\n /** Reads a format code; one outside the subset is refused with a `FormatError` that says why. */\n static parse(code: string): NumberFormat {\n const reading = NumberFormat.tryParse(code);\n if (reading.format === undefined) throw new FormatError(`The number format '${code}' is not supported: ${reading.reason}`);\n return reading.format;\n }\n\n /** Reads a format code, saying why when it cannot. */\n static tryParse(given: string): NumberFormatReading {\n if (equalsIgnoreCase(given, 'General')) return { format: NumberFormat.general };\n const code = upperCaseAmPm(given);\n const parts = splitSections(code);\n if (typeof parts === 'string') return { reason: parts };\n if (parts.length > 4) return { reason: 'a format has at most four sections.' };\n const sections: Section[] = [];\n for (let i = 0; i < parts.length; i++) {\n const reading = Section.parse(elementAt(parts, i));\n if (reading.section === undefined) return { reason: reading.reason };\n const section = reading.section;\n if (section.kind === 'text' && i < parts.length - 1) return { reason: '@ belongs in the last section.' };\n if (i === 3 && section.kind !== 'text' && section.kind !== 'literal') return { reason: 'the fourth section is for text.' };\n sections.push(section);\n }\n return { format: new NumberFormat(code, sections) };\n }\n\n /** Whether a number shows in Excel's General form: the format is General, or holds only a text section. @internal */\n get showsNumbersAsGeneral(): boolean {\n return this.#numberSections === 0;\n }\n\n /** How many sections show numbers: a text section that ends a format of fewer than four shows none. */\n get #numberSections(): number {\n const count = this.#sections.length;\n return count > 0 && count < 4 && elementAt(this.#sections, count - 1).kind === 'text' ? count - 1 : count;\n }\n\n /** The section that shows text: the fourth, or a text section that ends a shorter format. */\n get #textSection(): Section | undefined {\n const count = this.#sections.length;\n if (count === 4) return elementAt(this.#sections, 3);\n if (count > 0 && elementAt(this.#sections, count - 1).kind === 'text') return elementAt(this.#sections, count - 1);\n return undefined;\n }\n\n /**\n * A Value as this format shows it in a column `characters` wide, each character charged one digit width\n * (ADR-0047): a number in General is fitted to the width as Excel's General fits it, and any other number\n * whose text is longer than the width cannot be shown (`####`, ADR-0016). Text, booleans and Error Values\n * are never fitted. @internal\n */\n formatIn(value: Value, culture: Culture, characters: number): FormattedValue {\n if (value.kind !== 'number') return this.format(value, culture);\n if (this.showsNumbersAsGeneral) {\n const fitted = generalFitted(value.number, characters, culture);\n return fitted === undefined ? { text: '', cannotShow: true, colour: undefined } : { text: fitted, cannotShow: false, colour: undefined };\n }\n const shown = this.format(value, culture);\n return shown.cannotShow || shown.text.length > characters ? { text: '', cannotShow: true, colour: shown.colour } : shown;\n }\n\n /**\n * A Value as this format shows it under a culture, and the colour of the section that showed it\n * (ADR-0071), `undefined` where it names none or no section showed the Value. @internal\n */\n format(value: Value, culture: Culture): FormattedValue {\n if (value.kind === 'number') {\n const local = this.#localIn(culture);\n if (local !== undefined) return local.format(value, culture);\n }\n switch (value.kind) {\n case 'boolean':\n case 'error':\n return { text: value.toString(), cannotShow: false, colour: undefined };\n case 'text': {\n const textSection = this.#textSection;\n return textSection === undefined\n ? { text: value.text, cannotShow: false, colour: undefined }\n : { text: textSection.formatText(value.text), cannotShow: false, colour: textSection.colour };\n }\n case 'number':\n break;\n default:\n throw new Error(`Internal: ${String(value.kind)} is no kind of Value.`);\n }\n\n const number = value.number;\n if (this.showsNumbersAsGeneral) return { text: generalText(number, culture), cannotShow: false, colour: undefined };\n let chosen: Section;\n let automaticMinus = false;\n if (number < 0 && this.#numberSections >= 2) {\n chosen = elementAt(this.#sections, 1);\n } else if (number === 0 && this.#numberSections >= 3) {\n chosen = elementAt(this.#sections, 2);\n } else {\n chosen = elementAt(this.#sections, 0);\n automaticMinus = number < 0;\n }\n const { text, cannotShow } = chosen.formatNumber(Math.abs(number), automaticMinus, culture);\n return { text, cannotShow, colour: chosen.colour };\n }\n\n /** Two formats are equal when their codes are (ordinal). */\n equals(other: NumberFormat): boolean {\n return this.#code === other.#code;\n }\n\n /** The code. */\n toString(): string {\n return this.#code;\n }\n\n /**\n * Excel's built-in short date, `m/d/yyyy` in the invariant codes: what a typed date records under every\n * culture. It shows a date in the Sheet culture's own short-date pattern, as Excel's built-in format 14\n * shows in the system's pattern. @internal\n */\n static readonly shortDate: NumberFormat = NumberFormat.parse(shortDateCode);\n\n /** Excel's built-in short date with a time (`m/d/yyyy h:mm`, format 22). @internal */\n static readonly shortDateTime: NumberFormat = NumberFormat.parse(shortDateTimeCode);\n\n static readonly #germanDayMonth = NumberFormat.parse('dd. mmm');\n static readonly #twoDigitDayMonth = NumberFormat.parse('dd-mmm');\n static readonly #currency = NumberFormat.parse(currencyCode);\n static readonly #wholeCurrency = NumberFormat.parse(wholeCurrencyCode);\n static readonly #shortDates = new Map<string, NumberFormat>();\n static readonly #datesAndTimes = new Map<string, NumberFormat>();\n static readonly #currencies = new Map<string, NumberFormat>();\n\n /**\n * The built-ins shown in the Sheet culture's own form: the short date and the short date with a time (14\n * and 22), the day and month (16), the day, month and year (15), the hour and minute (20), and the\n * currency (6 and 8).\n */\n static readonly #localisedBuiltIns: readonly NumberFormat[] = [\n NumberFormat.shortDate, NumberFormat.shortDateTime, NumberFormat.parse(dayMonthCode), NumberFormat.parse(dayMonthYearCode),\n NumberFormat.parse(hourMinuteCode), NumberFormat.#currency, NumberFormat.#wholeCurrency,\n ];\n\n /**\n * Excel's built-in currency format under a culture: what Ctrl+Shift+$ records (ADR-0071). It is format 8,\n * `$#,##0.00_);[Red]($#,##0.00)`, or format 6, `$#,##0_);[Red]($#,##0)`, where the culture's currency has\n * no decimals; recorded in those codes, it shows in the culture's own currency.\n */\n static builtInCurrency(culture: Culture): NumberFormat {\n return culture.data.currencyDecimalDigits === 0 ? NumberFormat.#wholeCurrency : NumberFormat.#currency;\n }\n\n /** The built-in `d-mmm` in the culture's own form (ADR-0047, third run), or `undefined`. */\n #dayMonthIn(culture: Culture): NumberFormat | undefined {\n if (!equalsIgnoreCase(this.#code, dayMonthCode)) return undefined;\n if (culture.data.name === 'de-DE') return NumberFormat.#germanDayMonth;\n return culture.data.shortDatePattern.includes('dd') ? NumberFormat.#twoDigitDayMonth : undefined;\n }\n\n /** The pattern the built-in short date (and short date with time, and `d-mmm`) shows in under the culture, or `undefined`. */\n #shortDateIn(culture: Culture): NumberFormat | undefined {\n const dayMonth = this.#dayMonthIn(culture);\n if (dayMonth !== undefined) return dayMonth;\n const time = equalsIgnoreCase(this.#code, shortDateTimeCode);\n if (!time && !equalsIgnoreCase(this.#code, shortDateCode)) return undefined;\n const key = `${culture.data.name}|${String(time)}`;\n let local = NumberFormat.#shortDates.get(key);\n if (local === undefined) {\n const code = dateCode(culture) + (time ? ' h:mm' : '');\n const parsed = code === this.#code ? undefined : NumberFormat.tryParse(code).format;\n local = parsed === undefined ? this : parsed;\n NumberFormat.#shortDates.set(key, local);\n }\n return local === this || local.#code === this.#code ? undefined : local;\n }\n\n /** The built-ins 15 and 20 in the culture's own form, as the twelfth Windows run read them (ADR-0071, case 19), or `undefined`. */\n #dateOrTimeIn(culture: Culture): NumberFormat | undefined {\n let code: string;\n if (equalsIgnoreCase(this.#code, dayMonthYearCode)) {\n code = `${culture.data.shortDatePattern.includes('dd') ? 'dd' : 'd'}-mmm-yy`;\n } else if (equalsIgnoreCase(this.#code, hourMinuteCode)) {\n const time = culture.data.shortTimePattern;\n code = time.includes('HH') || time.includes('hh') ? 'hh:mm' : hourMinuteCode;\n } else {\n return undefined;\n }\n if (code === this.#code) return undefined;\n const key = `${culture.data.name}|${code}`;\n let local = NumberFormat.#datesAndTimes.get(key);\n if (local === undefined) {\n local = NumberFormat.parse(code);\n NumberFormat.#datesAndTimes.set(key, local);\n }\n return local;\n }\n\n /** The built-in currency format in the culture's own form, or `undefined` (en-US). */\n #currencyIn(culture: Culture): NumberFormat | undefined {\n const decimals = equalsIgnoreCase(this.#code, currencyCode);\n if (!decimals && !equalsIgnoreCase(this.#code, wholeCurrencyCode)) return undefined;\n const key = `${culture.data.name}|${String(decimals)}`;\n let local = NumberFormat.#currencies.get(key);\n if (local === undefined) {\n const code = localCurrencyCode(culture, decimals);\n const parsed = code === this.#code ? undefined : NumberFormat.tryParse(code).format;\n local = parsed === undefined ? this : parsed;\n NumberFormat.#currencies.set(key, local);\n }\n return local === this || local.#code === this.#code ? undefined : local;\n }\n\n #localIn(culture: Culture): NumberFormat | undefined {\n return this.#shortDateIn(culture) ?? this.#dateOrTimeIn(culture) ?? this.#currencyIn(culture);\n }\n\n /**\n * The code as Format Cells' Custom box spells it under a culture, as Excel's local code does (ADR-0071).\n * A built-in shown in the culture's own form is spelled in that form; a code of its own that spells such\n * a built-in's code is spelled as it was typed, and any other code as it is.\n */\n localCode(culture: Culture): string {\n const local = this.#localIn(culture);\n if (local !== undefined) return local.#code;\n const spelled = builtInSpelled(this.#code, NumberFormat.#localisedBuiltIns);\n return spelled === undefined ? this.#code : spelled;\n }\n\n /**\n * Reads a code typed into Format Cells' Custom box under a culture (ADR-0071). A code is a built-in only\n * when it spells that built-in's code under the culture (`localCode`), in any case; a code of its own that\n * spells a built-in's invariant code is recorded with its separators escaped, `d\\-mmm\\-yy`.\n */\n static tryParseLocal(code: string, culture: Culture): NumberFormatReading {\n const reading = NumberFormat.tryParse(code);\n if (reading.format === undefined) return reading;\n const format = reading.format;\n for (const builtIn of NumberFormat.#localisedBuiltIns) {\n if (equalsIgnoreCase(format.#code, builtIn.localCode(culture))) return { format: builtIn };\n }\n // The engine would show it as the built-in it spells, in the culture's own form.\n if (format.#localIn(culture) !== undefined) return { format: NumberFormat.parse(ownSpelling(format.#code)) };\n return { format };\n }\n\n /**\n * This format as a Sheet Document opened under a culture holds it (ADR-0071, ticket 103): a code of its\n * own that spells a localised built-in's code as the culture spells that built-in is the built-in. @internal\n */\n openedIn(culture: Culture): NumberFormat {\n const unescaped = builtInSpelled(this.#code, NumberFormat.#localisedBuiltIns);\n if (unescaped === undefined) return this;\n const read = NumberFormat.tryParseLocal(unescaped, culture).format;\n return read !== undefined && NumberFormat.#localisedBuiltIns.some(builtIn => builtIn.equals(read)) ? read : this;\n }\n\n /**\n * Reads a code a file stores as a format of its own, as `TEXT` reads a code (ADR-0120, ADR-0330): the\n * invariant spelling, as written. A code that spells a built-in shown in the culture's own form is a code\n * of its own, recorded with its separators escaped.\n */\n static tryParseAsWritten(code: string): NumberFormatReading {\n const reading = NumberFormat.tryParse(code);\n if (reading.format === undefined) return reading;\n const written = reading.format.#code;\n if (NumberFormat.#localisedBuiltIns.some(builtIn => equalsIgnoreCase(builtIn.#code, written))) {\n return { format: NumberFormat.parse(ownSpelling(written)) };\n }\n return reading;\n }\n}\n\n/** A built-in's invariant code as a code of its own: each separator escaped, so that it shows as it is spelled and is no built-in's. */\nfunction ownSpelling(builtIn: string): string {\n let spelled = '';\n for (const c of builtIn) {\n if (c === '-' || c === '/' || c === ':' || c === '$') spelled += '\\\\';\n spelled += c;\n }\n return spelled;\n}\n\n/** The built-in's code a code of its own spells (`ownSpelling`), or `undefined` when it is not one. */\nfunction builtInSpelled(code: string, builtIns: readonly NumberFormat[]): string | undefined {\n if (!code.includes('\\\\')) return undefined;\n const unescaped = code.replaceAll('\\\\', '');\n return ownSpelling(unescaped) === code && builtIns.some(builtIn => equalsIgnoreCase(builtIn.code, unescaped)) ? unescaped : undefined;\n}\n\n/**\n * `AM/PM` written in any case is `AM/PM`: Excel rewrites `h:mm am/pm` to `h:mm AM/PM` and shows `6:00 PM`\n * (FMT-065). Quoted and escaped text is left alone.\n */\nfunction upperCaseAmPm(code: string): string {\n let rewritten = code;\n for (let i = 0; i < code.length; i++) {\n switch (code.charAt(i)) {\n case '\"': {\n const close = code.indexOf('\"', i + 1);\n if (close < 0) return rewritten;\n i = close;\n continue;\n }\n case '[': {\n const end = code.indexOf(']', i + 1);\n if (end < 0) return rewritten;\n i = end;\n continue;\n }\n case '\\\\':\n case '_':\n case '*':\n i++;\n continue;\n default:\n break;\n }\n if (!startsWithAtIgnoreCase(code, i, 'AM/PM')) continue;\n if (code.slice(i, i + 5) !== 'AM/PM') rewritten = `${rewritten.slice(0, i)}AM/PM${rewritten.slice(i + 5)}`;\n i += 4;\n }\n return rewritten;\n}\n\n/** The code's sections, split at each `;` outside quotes, brackets and escapes; or why it cannot be split. */\nfunction splitSections(code: string): string[] | string {\n const parts: string[] = [];\n let start = 0;\n for (let i = 0; i < code.length; i++) {\n switch (code.charAt(i)) {\n case '\"': {\n const close = code.indexOf('\"', i + 1);\n if (close < 0) return 'a quotation is not closed.';\n i = close;\n break;\n }\n case '[': {\n const end = code.indexOf(']', i + 1);\n if (end < 0) return 'a bracket is not closed.';\n i = end;\n break;\n }\n case '\\\\':\n case '_':\n case '*':\n i++;\n break;\n case ';':\n parts.push(code.slice(start, i));\n start = i + 1;\n break;\n default:\n break;\n }\n }\n parts.push(code.slice(start));\n return parts;\n}\n", "// What a formatting command sets, and what a row, a column or a cell records of a Cell Format (C#'s\n// CellFormatChange.cs, the AxisFormat of Sheet.CellFormat.cs and the CellState of Sheet.State.cs; ADR-0047,\n// ADR-0071).\nimport { CellAddress, columnCount, rowCount } from './cell-address';\nimport { BorderLine, CellBorders, CellFill, CellFont, CellFormat, type CellColour, type HorizontalAlignment } from './cell-format';\nimport { CellRange } from './cell-range';\nimport type { Entry } from './entry';\nimport { NumberFormat } from './number-format';\nimport type { Value } from './value';\n\n/** What a cell shows where no level records anything: General, General alignment, the default Font, no Fill and no Borders. */\nexport const defaultCellFormat = new CellFormat(NumberFormat.general, 'general', CellFont.default, CellFill.none, CellBorders.none);\n\n/** A part of a Cell Format: what `own` compares. */\ntype Part = NumberFormat | CellFont | CellFill | CellBorders | BorderLine;\n\n/** Whether two parts, recorded or not, are the same. @internal */\nexport function samePart<T extends Part | HorizontalAlignment>(a: T | undefined, b: T | undefined): boolean {\n if (a === undefined || b === undefined) return a === b;\n if (typeof a === 'string' || typeof b === 'string') return a === b;\n return a.equals(b as never); // oxlint-disable-line typescript/no-unsafe-type-assertion -- both are the same kind of part, which T says\n}\n\n/** `value`, or `undefined` where it equals what shows under it anyway. @internal */\nexport function own<T extends Part | HorizontalAlignment>(value: T, under: T): T | undefined {\n return samePart(value, under) ? undefined : value;\n}\n\n/** The parts of a Cell Format recorded on a whole row or a whole column: `undefined` where that level records nothing. @internal */\nexport class AxisFormat {\n readonly numberFormat: NumberFormat | undefined;\n\n readonly alignment: HorizontalAlignment | undefined;\n\n readonly font: CellFont | undefined;\n\n readonly fill: CellFill | undefined;\n\n readonly borders: CellBorders | undefined;\n\n constructor(\n numberFormat: NumberFormat | undefined,\n alignment: HorizontalAlignment | undefined,\n font: CellFont | undefined,\n fill: CellFill | undefined,\n borders: CellBorders | undefined,\n ) {\n this.numberFormat = numberFormat;\n this.alignment = alignment;\n this.font = font;\n this.fill = fill;\n this.borders = borders;\n }\n\n /** The level that records nothing. */\n static readonly empty = new AxisFormat(undefined, undefined, undefined, undefined, undefined);\n\n get isEmpty(): boolean {\n return this.numberFormat === undefined && this.alignment === undefined && this.font === undefined && this.fill === undefined && this.borders === undefined;\n }\n\n /** What the level shows over `under`: each part it records, else `under`'s. */\n over(under: CellFormat): CellFormat {\n return new CellFormat(this.numberFormat ?? under.numberFormat, this.alignment ?? under.alignment, this.font ?? under.font,\n this.fill ?? under.fill, this.borders ?? under.borders);\n }\n\n /** The level with each part `change` sets taken from `next`, and recorded as nothing where it equals what shows under the level anyway. */\n with(change: CellFormatChange, next: CellFormat, under: CellFormat): AxisFormat {\n return new AxisFormat(\n change.numberFormat === undefined ? this.numberFormat : own(next.numberFormat, under.numberFormat),\n change.alignment === undefined ? this.alignment : own(next.alignment, under.alignment),\n change.setsFont ? own(next.font, under.font) : this.font,\n change.fill === undefined ? this.fill : own(next.fill, under.fill),\n change.setsBorders ? own(next.borders, under.borders) : this.borders);\n }\n\n /** This level with the parts given replaced; a part given as `undefined` records nothing. */\n replacing(parts: { numberFormat?: NumberFormat | undefined; alignment?: HorizontalAlignment | undefined; fill?: CellFill | undefined; borders?: CellBorders | undefined }): AxisFormat {\n return new AxisFormat(\n 'numberFormat' in parts ? parts.numberFormat : this.numberFormat,\n 'alignment' in parts ? parts.alignment : this.alignment,\n this.font,\n 'fill' in parts ? parts.fill : this.fill,\n 'borders' in parts ? parts.borders : this.borders);\n }\n\n /** A key two equal levels share and two different ones do not. */\n get key(): string {\n return `${this.numberFormat === undefined ? '-' : `n${this.numberFormat.code}`}\\u0000${this.alignment ?? '-'}\\u0000${this.font?.key ?? '-'}\\u0000${this.fill === undefined ? '-' : String(this.fill.key)}\\u0000${this.borders?.key ?? '-'}`; // oxlint-disable-line ex-grid/no-stand-in-default -- '-' writes a part not recorded in the key\n }\n\n equals(other: AxisFormat): boolean {\n return samePart(this.numberFormat, other.numberFormat) && this.alignment === other.alignment && samePart(this.font, other.font)\n && samePart(this.fill, other.fill) && samePart(this.borders, other.borders);\n }\n}\n\n/** The parts a Cell Format change may set. */\nexport interface CellFormatChangeParts {\n /** The Number Format to set; `NumberFormat.general` sets General. */\n readonly numberFormat?: NumberFormat | undefined;\n /** The horizontal alignment to set; `general` sets General. */\n readonly alignment?: HorizontalAlignment | undefined;\n /** The Font colour to set; Automatic sets the Ink. */\n readonly fontColour?: CellColour | undefined;\n/** Bold set on, or off. */\n readonly bold?: boolean | undefined;\n/** Italic set on, or off. */\n readonly italic?: boolean | undefined;\n /** A single underline set on, or off. */\n readonly underline?: boolean | undefined;\n/** Strikethrough set on, or off. */\n readonly strikethrough?: boolean | undefined;\n /** The Fill to set; `CellFill.none` takes it away. */\n readonly fill?: CellFill | undefined;\n /** The Borders to set, relative to each range the change is set on. */\n readonly borders?: BorderChange | undefined;\n}\n\n/**\n * What a formatting command sets on the Cell Format of ranges (ADR-0071): every part that is given, each Font\n * emphasis on its own, and every other part left as each cell has it. Its `borders` are relative to each range it\n * is set on, so several ranges each get their own outline, as in Excel.\n */\nexport class CellFormatChange implements CellFormatChangeParts {\n/** {@inheritDoc CellFormatChangeParts.numberFormat} */\n readonly numberFormat: NumberFormat | undefined;\n/** {@inheritDoc CellFormatChangeParts.alignment} */\n readonly alignment: HorizontalAlignment | undefined;\n/** {@inheritDoc CellFormatChangeParts.fontColour} */\n readonly fontColour: CellColour | undefined;\n/** {@inheritDoc CellFormatChangeParts.bold} */\n readonly bold: boolean | undefined;\n/** {@inheritDoc CellFormatChangeParts.italic} */\n readonly italic: boolean | undefined;\n/** {@inheritDoc CellFormatChangeParts.underline} */\n readonly underline: boolean | undefined;\n/** {@inheritDoc CellFormatChangeParts.strikethrough} */\n readonly strikethrough: boolean | undefined;\n/** {@inheritDoc CellFormatChangeParts.fill} */\n readonly fill: CellFill | undefined;\n/** {@inheritDoc CellFormatChangeParts.borders} */\n readonly borders: BorderChange | undefined;\n\n constructor(parts: CellFormatChangeParts) {\n this.numberFormat = parts.numberFormat;\n this.alignment = parts.alignment;\n this.fontColour = parts.fontColour;\n this.bold = parts.bold;\n this.italic = parts.italic;\n this.underline = parts.underline;\n this.strikethrough = parts.strikethrough;\n this.fill = parts.fill;\n this.borders = parts.borders;\n }\n\n /** This change with its Borders replaced. @internal */\n withBorders(borders: BorderChange): CellFormatChange {\n return new CellFormatChange({ ...this.#parts(), borders });\n }\n\n #parts(): CellFormatChangeParts {\n return {\n numberFormat: this.numberFormat, alignment: this.alignment, fontColour: this.fontColour, bold: this.bold, italic: this.italic,\n underline: this.underline, strikethrough: this.strikethrough, fill: this.fill, borders: this.borders,\n };\n }\n\n /** Whether the change sets no part at all. */\n get isEmpty(): boolean {\n return this.numberFormat === undefined && this.alignment === undefined && !this.setsFont && this.fill === undefined && !this.setsBorders;\n }\n\n /** Whether the change sets any part of the Font. @internal */\n get setsFont(): boolean {\n return this.fontColour !== undefined || this.bold !== undefined || this.italic !== undefined || this.underline !== undefined || this.strikethrough !== undefined;\n }\n\n /** Whether the change sets any side. @internal */\n get setsBorders(): boolean {\n return this.borders !== undefined && !this.borders.isEmpty;\n }\n\n /** Whether the change sets a part that `level` records. @internal */\n touches(level: AxisFormat): boolean {\n return (this.numberFormat !== undefined && level.numberFormat !== undefined)\n || (this.alignment !== undefined && level.alignment !== undefined)\n || (this.setsFont && level.font !== undefined)\n || (this.fill !== undefined && level.fill !== undefined)\n || (this.setsBorders && level.borders !== undefined);\n }\n\n /** What a cell that showed `shown` shows once the change is set on it, at `place` in its range. @internal */\n applyTo(shown: CellFormat, place: PlaceInRange): CellFormat {\n return new CellFormat(\n this.numberFormat ?? shown.numberFormat,\n this.alignment ?? shown.alignment,\n this.applyToFont(shown.font),\n this.fill ?? shown.fill,\n this.borders === undefined ? shown.borders : this.borders.applyTo(shown.borders, place));\n }\n\n /** `font` with the emphases and the colour the change sets. @internal */\n applyToFont(font: CellFont): CellFont {\n return new CellFont({\n colour: this.fontColour ?? font.colour,\n bold: this.bold ?? font.bold,\n italic: this.italic ?? font.italic,\n underline: this.underline ?? font.underline,\n strikethrough: this.strikethrough ?? font.strikethrough,\n });\n }\n}\n\n/** The edges a Border change may set. */\nexport interface BorderChangeParts {\n /** The range's top edge: the top side of its first row's cells. The cells above them lose their record of it. */\n readonly top?: BorderLine | undefined;\n /** The range's bottom edge: the bottom side of its last row's cells. The cells below them lose their record of it. */\n readonly bottom?: BorderLine | undefined;\n /** The range's left edge: the left side of its first column's cells. The cells to their left lose their record of it. */\n readonly left?: BorderLine | undefined;\n /** The range's right edge: the right side of its last column's cells. The cells to their right lose their record of it. */\n readonly right?: BorderLine | undefined;\n /** Every edge between two of the range's rows: the bottom side of the upper cell and the top side of the lower. */\n readonly insideHorizontal?: BorderLine | undefined;\n /** Every edge between two of the range's columns: the right side of the left cell and the left side of the right. */\n readonly insideVertical?: BorderLine | undefined;\n}\n\n/**\n * The Borders a change sets, relative to each range it is set on (ADR-0071), as Excel's Format Cells sets them:\n * each edge given is set \u2014 to a line, or to `BorderLine.none` to take the line away \u2014 and every other edge is left\n * as each cell has it. `outline`, `inside` and `none` are Excel's presets. As Excel keeps the line between two\n * cells (the twelfth Windows run): an outer edge is recorded on the range's own cells, and the cells beside it lose\n * their record of the same edge.\n */\nexport class BorderChange implements BorderChangeParts {\n/** {@inheritDoc BorderChangeParts.top} */\n readonly top: BorderLine | undefined;\n/** {@inheritDoc BorderChangeParts.bottom} */\n readonly bottom: BorderLine | undefined;\n/** {@inheritDoc BorderChangeParts.left} */\n readonly left: BorderLine | undefined;\n/** {@inheritDoc BorderChangeParts.right} */\n readonly right: BorderLine | undefined;\n/** {@inheritDoc BorderChangeParts.insideHorizontal} */\n readonly insideHorizontal: BorderLine | undefined;\n/** {@inheritDoc BorderChangeParts.insideVertical} */\n readonly insideVertical: BorderLine | undefined;\n\n constructor(parts: BorderChangeParts) {\n this.top = parts.top;\n this.bottom = parts.bottom;\n this.left = parts.left;\n this.right = parts.right;\n this.insideHorizontal = parts.insideHorizontal;\n this.insideVertical = parts.insideVertical;\n }\n\n /** Excel's Outline: `line` on the range's four outer edges. */\n static outline(line: BorderLine): BorderChange {\n return new BorderChange({ top: line, bottom: line, left: line, right: line });\n }\n\n /** Excel's Inside: `line` on every edge inside the range. */\n static inside(line: BorderLine): BorderChange {\n return new BorderChange({ insideHorizontal: line, insideVertical: line });\n }\n\n /** Excel's None: every edge of the range, outer and inner, without a line. */\n static readonly none = new BorderChange({\n top: BorderLine.none, bottom: BorderLine.none, left: BorderLine.none, right: BorderLine.none,\n insideHorizontal: BorderLine.none, insideVertical: BorderLine.none,\n });\n\n /** Whether the change sets no edge. @internal */\n get isEmpty(): boolean {\n return this.top === undefined && this.bottom === undefined && this.left === undefined && this.right === undefined\n && this.insideHorizontal === undefined && this.insideVertical === undefined;\n }\n\n /** The four sides a cell at `place` in its range shows once the change is set, from `borders`. @internal */\n applyTo(borders: CellBorders, place: PlaceInRange): CellBorders {\n return new CellBorders({\n top: (place.firstRow ? this.top : this.insideHorizontal) ?? borders.top,\n bottom: (place.lastRow ? this.bottom : this.insideHorizontal) ?? borders.bottom,\n left: (place.firstColumn ? this.left : this.insideVertical) ?? borders.left,\n right: (place.lastColumn ? this.right : this.insideVertical) ?? borders.right,\n });\n }\n\n /**\n * The change as it is set on `range`. Over whole rows short of the whole Sheet, the left of column A is the\n * range's left edge, and where the change sets no left edge of its own it takes the inside vertical line (the\n * fourteenth Windows run, case 14). Over any other range the change is as it is. @internal\n */\n on(range: CellRange): BorderChange {\n return this.left === undefined && this.insideVertical !== undefined && range.isWholeRows && !range.isWholeColumns\n ? new BorderChange({ ...this.#parts(), left: this.insideVertical })\n : this;\n }\n\n #parts(): BorderChangeParts {\n return { top: this.top, bottom: this.bottom, left: this.left, right: this.right, insideHorizontal: this.insideHorizontal, insideVertical: this.insideVertical };\n }\n\n /**\n * The cells beside `range` across each outer edge the change sets, with the change that clears their record of\n * it (the twelfth Windows run). An edge on the Sheet's outer edge has none. @internal\n */\n *beside(range: CellRange): Generator<{ range: CellRange; borders: BorderChange }> {\n const { first, last } = range;\n if (this.top !== undefined && first.row > 0) {\n yield { range: new CellRange(new CellAddress(first.row - 1, first.column), new CellAddress(first.row - 1, last.column)), borders: new BorderChange({ bottom: BorderLine.none }) };\n }\n if (this.bottom !== undefined && last.row < rowCount - 1) {\n yield { range: new CellRange(new CellAddress(last.row + 1, first.column), new CellAddress(last.row + 1, last.column)), borders: new BorderChange({ top: BorderLine.none }) };\n }\n if (this.left !== undefined && first.column > 0) {\n yield { range: new CellRange(new CellAddress(first.row, first.column - 1), new CellAddress(last.row, first.column - 1)), borders: new BorderChange({ right: BorderLine.none }) };\n }\n if (this.right !== undefined && last.column < columnCount - 1) {\n yield { range: new CellRange(new CellAddress(first.row, last.column + 1), new CellAddress(last.row, last.column + 1)), borders: new BorderChange({ left: BorderLine.none }) };\n }\n }\n}\n\n/** Where a cell lies in a range a change is set on: which of the range's outer edges its sides are. @internal */\nexport class PlaceInRange {\n readonly firstRow: boolean;\n\n readonly lastRow: boolean;\n\n readonly firstColumn: boolean;\n\n readonly lastColumn: boolean;\n\n constructor(firstRow: boolean, lastRow: boolean, firstColumn: boolean, lastColumn: boolean) {\n this.firstRow = firstRow;\n this.lastRow = lastRow;\n this.firstColumn = firstColumn;\n this.lastColumn = lastColumn;\n }\n\n /** A cell set on its own: all four sides are outer edges. */\n static readonly alone = new PlaceInRange(true, true, true, true);\n\n /** A cell none of whose sides is an outer edge. */\n static readonly inside = new PlaceInRange(false, false, false, false);\n\n /**\n * Where `at` lies in `range`, as Excel places an outline: whole columns have no top or bottom edge, whole rows\n * no right edge, and the whole Sheet no outer edge (the eleventh and twelfth Windows runs).\n */\n static of(range: CellRange, at: CellAddress): PlaceInRange {\n const columns = range.isWholeColumns;\n const rows = range.isWholeRows;\n return new PlaceInRange(\n !columns && at.row === range.first.row,\n !columns && at.row === range.last.row,\n !(columns && rows) && at.column === range.first.column,\n !rows && at.column === range.last.column);\n }\n}\n\n/**\n * What one cell holds and shows, compared before and after an operation. The parts of its Cell Format are the\n * cell's own; `undefined` takes the row's or the column's (ADR-0047, ADR-0071). @internal\n */\nexport class CellState {\n readonly entry: Entry | undefined;\n\n readonly value: Value | undefined;\n\n readonly numberFormat: NumberFormat | undefined;\n\n readonly alignment: HorizontalAlignment | undefined;\n\n readonly font: CellFont | undefined;\n\n readonly fill: CellFill | undefined;\n\n readonly borders: CellBorders | undefined;\n\n constructor(\n entry: Entry | undefined,\n value: Value | undefined,\n numberFormat: NumberFormat | undefined,\n alignment: HorizontalAlignment | undefined,\n font: CellFont | undefined,\n fill: CellFill | undefined,\n borders: CellBorders | undefined,\n ) {\n this.entry = entry;\n this.value = value;\n this.numberFormat = numberFormat;\n this.alignment = alignment;\n this.font = font;\n this.fill = fill;\n this.borders = borders;\n }\n\n static readonly blank = new CellState(undefined, undefined, undefined, undefined, undefined, undefined, undefined);\n\n /** The same cell as recorded: Entry and Cell Format, the Value left out. */\n get recorded(): CellState {\n return this.value === undefined ? this : new CellState(this.entry, undefined, this.numberFormat, this.alignment, this.font, this.fill, this.borders);\n }\n\n /** This state with its Entry replaced. */\n withEntry(entry: Entry | undefined): CellState {\n return new CellState(entry, this.value, this.numberFormat, this.alignment, this.font, this.fill, this.borders);\n }\n\n /** This state with its Cell Format replaced, part by part. */\n withFormat(format: { numberFormat: NumberFormat | undefined; alignment: HorizontalAlignment | undefined; font: CellFont | undefined; fill: CellFill | undefined; borders: CellBorders | undefined }): CellState {\n return new CellState(this.entry, this.value, format.numberFormat, format.alignment, format.font, format.fill, format.borders);\n }\n\n sameRecord(other: CellState): boolean {\n return sameEntry(this.entry, other.entry) && this.sameFormat(other);\n }\n\n /** Whether the two record the same Cell Format of their own. */\n sameFormat(other: { numberFormat: NumberFormat | undefined; alignment: HorizontalAlignment | undefined; font: CellFont | undefined; fill: CellFill | undefined; borders: CellBorders | undefined }): boolean {\n return samePart(this.numberFormat, other.numberFormat) && this.alignment === other.alignment && samePart(this.font, other.font)\n && samePart(this.fill, other.fill) && samePart(this.borders, other.borders);\n }\n\n /** The Cell Format the state shows, where it records nothing of a part, the part's default. */\n get cellFormat(): CellFormat {\n return new CellFormat(\n this.numberFormat ?? NumberFormat.general,\n this.alignment ?? 'general', // oxlint-disable-line ex-grid/no-stand-in-default -- a part recorded nowhere shows its default\n this.font ?? CellFont.default,\n this.fill ?? CellFill.none,\n this.borders ?? CellBorders.none);\n }\n}\n\nfunction sameEntry(a: Entry | undefined, b: Entry | undefined): boolean {\n if (a === undefined || b === undefined) return a === b;\n return a.equals(b);\n}\n", "import { CellAddress, columnCount, rowCount } from '../cell-address';\nimport { equalsIgnoreCase, isAsciiDigit, isAsciiLetter, isAsciiLetterOrDigit } from '../dotnet';\n\n/** What a Reference names: one cell, a rectangle, whole columns or whole rows. */\nexport type ReferenceShape = 'cell' | 'area' | 'columns' | 'rows';\n\n/** An inclusive rectangle of cells, zero-based. */\nexport class Area {\n readonly row1: number;\n readonly column1: number;\n readonly row2: number;\n readonly column2: number;\n\n constructor(row1: number, column1: number, row2: number, column2: number) {\n this.row1 = row1;\n this.column1 = column1;\n this.row2 = row2;\n this.column2 = column2;\n }\n\n get isSingleCell(): boolean {\n return this.row1 === this.row2 && this.column1 === this.column2;\n }\n\n get cellCount(): number {\n return (this.row2 - this.row1 + 1) * (this.column2 - this.column1 + 1);\n }\n\n get rows(): number {\n return this.row2 - this.row1 + 1;\n }\n\n get columns(): number {\n return this.column2 - this.column1 + 1;\n }\n\n contains(address: CellAddress): boolean {\n return address.row >= this.row1 && address.row <= this.row2 && address.column >= this.column1 && address.column <= this.column2;\n }\n\n equals(other: Area): boolean {\n return this.row1 === other.row1 && this.column1 === other.column1 && this.row2 === other.row2 && this.column2 === other.column2;\n }\n}\n\n/** The parts of a Reference, for making one with some of them changed (a C# record's `with`). */\nexport interface ReferenceParts {\n readonly sheetName: string | undefined;\n readonly shape: ReferenceShape;\n readonly row1: number;\n readonly column1: number;\n readonly row2: number;\n readonly column2: number;\n readonly row1Absolute: boolean;\n readonly column1Absolute: boolean;\n readonly row2Absolute: boolean;\n readonly column2Absolute: boolean;\n /** `A1#`: the Spill Range of the Formula in this one cell (ADR-0125). */\n readonly spilled: boolean;\n /** For a 3D Reference (`Sheet1:Sheet3!B2`, ADR-0331 \u00A77): the name of the Sheet that ends the span, as written. */\n readonly lastSheetName: string | undefined;\n}\n\n/**\n * A Reference as a Formula records it. The target positions are held absolutely, with a flag per axis saying\n * whether the text wrote `$`; a relative Reference shifts when its Formula is copied (ADR-0048), and every form\n * survives a structural edit by rewriting the positions. The Sheet qualifier is recorded as written.\n */\nexport class Reference implements ReferenceParts {\n readonly sheetName: string | undefined;\n readonly shape: ReferenceShape;\n readonly row1: number;\n readonly column1: number;\n readonly row2: number;\n readonly column2: number;\n readonly row1Absolute: boolean;\n readonly column1Absolute: boolean;\n readonly row2Absolute: boolean;\n readonly column2Absolute: boolean;\n readonly spilled: boolean;\n readonly lastSheetName: string | undefined;\n\n constructor(parts: ReferenceParts) {\n this.sheetName = parts.sheetName;\n this.shape = parts.shape;\n this.row1 = parts.row1;\n this.column1 = parts.column1;\n this.row2 = parts.row2;\n this.column2 = parts.column2;\n this.row1Absolute = parts.row1Absolute;\n this.column1Absolute = parts.column1Absolute;\n this.row2Absolute = parts.row2Absolute;\n this.column2Absolute = parts.column2Absolute;\n this.spilled = parts.spilled;\n this.lastSheetName = parts.lastSheetName;\n }\n\n /** One cell's Reference. */\n static cell(sheet: string | undefined, atRow: number, atColumn: number, rowAbsolute: boolean, columnAbsolute: boolean): Reference {\n return new Reference({\n sheetName: sheet, shape: 'cell', row1: atRow, column1: atColumn, row2: atRow, column2: atColumn,\n row1Absolute: rowAbsolute, column1Absolute: columnAbsolute, row2Absolute: rowAbsolute, column2Absolute: columnAbsolute,\n spilled: false, lastSheetName: undefined,\n });\n }\n\n /** This Reference with some of its parts changed. */\n with(changes: Partial<ReferenceParts>): Reference {\n return new Reference({ ...this.#parts(), ...changes });\n }\n\n #parts(): ReferenceParts {\n return {\n sheetName: this.sheetName, shape: this.shape, row1: this.row1, column1: this.column1, row2: this.row2, column2: this.column2,\n row1Absolute: this.row1Absolute, column1Absolute: this.column1Absolute, row2Absolute: this.row2Absolute, column2Absolute: this.column2Absolute,\n spilled: this.spilled, lastSheetName: this.lastSheetName,\n };\n }\n\n /** A C# record's equality: every part the same. */\n equals(other: Reference): boolean {\n return this.sheetName === other.sheetName && this.shape === other.shape && this.row1 === other.row1 && this.column1 === other.column1\n && this.row2 === other.row2 && this.column2 === other.column2 && this.row1Absolute === other.row1Absolute\n && this.column1Absolute === other.column1Absolute && this.row2Absolute === other.row2Absolute\n && this.column2Absolute === other.column2Absolute && this.spilled === other.spilled && this.lastSheetName === other.lastSheetName;\n }\n\n /** Whether this is a 3D Reference, reading one range on every Sheet of a span (ADR-0331 \u00A77). */\n get isThreeD(): boolean {\n return this.lastSheetName !== undefined;\n }\n\n /** The rectangle the Reference covers. */\n get area(): Area {\n switch (this.shape) {\n case 'columns': return new Area(0, this.column1, rowCount - 1, this.column2);\n case 'rows': return new Area(this.row1, 0, this.row2, columnCount - 1);\n case 'cell':\n case 'area':\n return new Area(this.row1, this.column1, this.row2, this.column2);\n default: return unreachableShape(this.shape);\n }\n }\n\n /**\n * A Reference to a rectangle, in the shape Excel writes it: one spanning every column is whole rows\n * (`A1:XFD3` is `1:3`, `A:XFD` is `$1:$1048576`), one spanning every row is whole columns (`A1:A1048576`\n * is `A:A`), and any other is an area. The axis a whole form drops is held absolute, as Excel holds it.\n */\n static rectangle(sheet: string | undefined, row1: number, column1: number, row2: number, column2: number,\n row1Absolute: boolean, column1Absolute: boolean, row2Absolute: boolean, column2Absolute: boolean): Reference {\n if (column1 === 0 && column2 === columnCount - 1) {\n return new Reference({\n sheetName: sheet, shape: 'rows', row1, column1: 0, row2, column2, row1Absolute, column1Absolute: true, row2Absolute,\n column2Absolute: true, spilled: false, lastSheetName: undefined,\n });\n }\n if (row1 === 0 && row2 === rowCount - 1) {\n return new Reference({\n sheetName: sheet, shape: 'columns', row1: 0, column1, row2, column2, row1Absolute: true, column1Absolute, row2Absolute: true,\n column2Absolute, spilled: false, lastSheetName: undefined,\n });\n }\n return new Reference({\n sheetName: sheet, shape: 'area', row1, column1, row2, column2, row1Absolute, column1Absolute, row2Absolute, column2Absolute,\n spilled: false, lastSheetName: undefined,\n });\n }\n\n /** The Reference as Excel writes it: a rectangle in the shape `rectangle` gives it. */\n write(): string {\n if (this.shape !== 'cell') {\n const shaped = Reference.rectangle(this.sheetName, this.row1, this.column1, this.row2, this.column2, this.row1Absolute,\n this.column1Absolute, this.row2Absolute, this.column2Absolute).with({ lastSheetName: this.lastSheetName });\n if (shaped.shape !== this.shape) return shaped.write();\n }\n let text = '';\n if (this.lastSheetName !== undefined) {\n if (this.sheetName === undefined) throw new Error('Internal: a 3D Reference names the Sheet that starts its span.');\n text += `${quoteSheetSpan(this.sheetName, this.lastSheetName)}!`;\n } else if (this.sheetName !== undefined) {\n text += `${quoteSheetName(this.sheetName)}!`;\n }\n switch (this.shape) {\n case 'cell':\n text += column(this.column1, this.column1Absolute) + row(this.row1, this.row1Absolute);\n if (this.spilled) text += '#';\n break;\n case 'area':\n text += `${column(this.column1, this.column1Absolute)}${row(this.row1, this.row1Absolute)}:${column(this.column2, this.column2Absolute)}${row(this.row2, this.row2Absolute)}`;\n break;\n case 'columns':\n text += `${column(this.column1, this.column1Absolute)}:${column(this.column2, this.column2Absolute)}`;\n break;\n case 'rows':\n text += `${row(this.row1, this.row1Absolute)}:${row(this.row2, this.row2Absolute)}`;\n break;\n default:\n return unreachableShape(this.shape);\n }\n return text;\n }\n}\n\nfunction column(index: number, absolute: boolean): string {\n return (absolute ? '$' : '') + CellAddress.columnName(index);\n}\n\nfunction row(index: number, absolute: boolean): string {\n return (absolute ? '$' : '') + String(index + 1);\n}\n\nfunction unreachableShape(shape: never): never {\n throw new Error(`Internal: ${String(shape)} is no shape of Reference.`);\n}\n\n/**\n * A 3D Reference's span, `Sheet1:Sheet3`: bare when both names are written bare, and otherwise quoted whole,\n * `'Q1 Sales:Sheet3'`, as Excel writes one, doubling any `'`.\n */\nexport function quoteSheetSpan(first: string, last: string): string {\n const bare = quoteSheetName(first) === first && quoteSheetName(last) === last;\n const span = `${first}:${last}`;\n return bare ? span : `'${span.replaceAll(\"'\", \"''\")}'`;\n}\n\n/** A Sheet name is written bare when it is a plain identifier, and quoted otherwise, doubling any `'`. */\nexport function quoteSheetName(name: string): string {\n let bare = name.length > 0 && (isAsciiLetter(name.charCodeAt(0)) || name[0] === '_');\n for (let i = 0; i < name.length; i++) {\n const c = name.charCodeAt(i);\n if (!(isAsciiLetterOrDigit(c) || c === 0x5f || c === 0x2e)) bare = false;\n }\n // A bare name that reads as a cell address (A1!B2), an R1C1 address or a boolean would be misread.\n if (bare && (CellAddress.tryParse(name) !== undefined || rowColumn(name) || equalsIgnoreCase(name, 'TRUE') || equalsIgnoreCase(name, 'FALSE'))) {\n bare = false;\n }\n return bare ? name : `'${name.replaceAll(\"'\", \"''\")}'`;\n}\n\n/** R, C, R1, C1, R1C1, RC, ...: R1C1 notation. */\nfunction rowColumn(name: string): boolean {\n let i = 0;\n if (i < name.length && (name[i] === 'R' || name[i] === 'r')) {\n i++;\n while (i < name.length && isAsciiDigit(name.charCodeAt(i))) i++;\n }\n if (i < name.length && (name[i] === 'C' || name[i] === 'c')) {\n i++;\n while (i < name.length && isAsciiDigit(name.charCodeAt(i))) i++;\n }\n return i > 0 && i === name.length;\n}\n", "// The nodes of a parsed Formula. Its text is the Formula's, kept by the Entry (ADR-0047).\nimport { columnCount, rowCount } from '../cell-address';\nimport type { ErrorValue } from '../value';\nimport type { FunctionDefinition } from './function-definition';\nimport { Reference } from './reference';\n\n/** A node of a parsed Formula. */\nexport type Node =\n | NumberNode | TextNode | BooleanNode | ErrorNode | MissingNode | ReferenceNode | StructuredReferenceNode | NameNode\n | LetNode | IntersectionNode | FunctionNode | ParenthesesNode | UnaryNode | PercentNode | BinaryNode;\n\n/** What every node can say of itself, statically. */\nabstract class NodeBase {\n /** Every Reference this node reads, statically: the dependency graph's edges. */\n *references(): Generator<Reference> {\n // A leaf reads no Reference.\n }\n\n /** Every structured reference this node reads, statically: a Linked Table's readers (ADR-0049). */\n *structuredReferences(): Generator<StructuredReferenceNode> {\n // A leaf reads no Linked Table.\n }\n\n /** Every function call this node makes, statically, its arguments' calls included: `TODAY`'s readers (ADR-0121). */\n *calls(): Generator<FunctionNode> {\n // A leaf makes no call.\n }\n\n /**\n * How deep a walk of this node goes, counted in nodes, where a walk that reads an operator's chain loops\n * along it rather than descending: a leaf is 1, a node one more than its deepest child, except a\n * `BinaryNode`'s left operand, which stands at the operator's own depth; and a name a `LET` binds one more\n * than its value. The parser refuses a Formula deeper than its `mostNesting`.\n */\n get depth(): number {\n return 1;\n }\n}\n\nexport class NumberNode extends NodeBase {\n readonly kind = 'number';\n readonly number: number;\n\n constructor(number: number) {\n super();\n this.number = number;\n }\n}\n\nexport class TextNode extends NodeBase {\n readonly kind = 'text';\n readonly text: string;\n\n constructor(text: string) {\n super();\n this.text = text;\n }\n}\n\nexport class BooleanNode extends NodeBase {\n readonly kind = 'boolean';\n readonly value: boolean;\n\n constructor(value: boolean) {\n super();\n this.value = value;\n }\n}\n\nexport class ErrorNode extends NodeBase {\n readonly kind = 'error';\n readonly error: ErrorValue;\n\n constructor(error: ErrorValue) {\n super();\n this.error = error;\n }\n}\n\n/** An argument left empty, as in `IF(A1,,1)`. */\nexport class MissingNode extends NodeBase {\n readonly kind = 'missing';\n\n static readonly instance = new MissingNode();\n\n private constructor() {\n super();\n }\n\n /**\n * Whether an argument is left empty: written empty, or a `LET` name bound to a value left empty, as in\n * `LET(x,,IF(A1,x,1))`. Such a name reads as the empty argument it is bound to would read in its place\n * (ADR-0181; LET-107, run 17).\n */\n static isEmpty(argument: Node): boolean {\n if (argument.kind === 'missing') return true;\n if (argument.kind === 'name' && argument.binding !== undefined) return MissingNode.isEmpty(argument.binding.value);\n return false;\n }\n}\n\nexport class ReferenceNode extends NodeBase {\n readonly kind = 'reference';\n readonly reference: Reference;\n\n constructor(reference: Reference) {\n super();\n this.reference = reference;\n }\n\n override *references(): Generator<Reference> {\n yield this.reference;\n }\n}\n\n/** A structured reference into a Linked Table, `Table[Column]` (ADR-0049). */\nexport class StructuredReferenceNode extends NodeBase {\n readonly kind = 'structuredReference';\n readonly table: string;\n readonly column: string;\n\n constructor(table: string, column: string) {\n super();\n this.table = table;\n this.column = column;\n }\n\n override *structuredReferences(): Generator<StructuredReferenceNode> {\n yield this;\n }\n}\n\n/** One name a `LET` binds, and the value it is bound to (ADR-0181). */\nexport class LetBinding {\n /** The name as typed; names compare without regard to case. */\n readonly name: string;\n /** The value's syntax, computed when the name is first read, and at most once (ADR-0181); set by the parser once read. */\n value: Node = MissingNode.instance;\n\n constructor(name: string) {\n this.name = name;\n }\n}\n\n/**\n * A name that is not a function call, a Reference or a boolean. ExSheet defines no names of its own, so it is\n * `#NAME?` \u2014 unless a `LET` around it binds it (ADR-0181).\n */\nexport class NameNode extends NodeBase {\n readonly kind = 'name';\n readonly name: string;\n /** Where the name stands in the Formula's text. */\n readonly position: number;\n /** The `LET` binding the name reads, as the text's scopes resolve it; `undefined` for none (`#NAME?`). */\n readonly binding: LetBinding | undefined;\n readonly #depth: number;\n\n constructor(name: string, position: number, binding: LetBinding | undefined) {\n super();\n this.name = name;\n this.position = position;\n this.binding = binding;\n // Reading a bound name computes its value there, so it is one deeper than the value.\n this.#depth = binding === undefined ? 1 : binding.value.depth + 1;\n }\n\n override get depth(): number {\n return this.#depth;\n }\n}\n\n/**\n * `LET(name1, value1, \u2026, calculation)` (ADR-0181): names bound inside one Formula, each seen by the values\n * after it and by the calculation. Its References, Linked Tables and calls are every one its text names, the\n * bindings' whether they are read or not.\n */\nexport class LetNode extends NodeBase {\n readonly kind = 'let';\n readonly bindings: readonly LetBinding[];\n readonly calculation: Node;\n readonly #depth: number;\n\n constructor(bindings: readonly LetBinding[], calculation: Node) {\n super();\n this.bindings = bindings;\n this.calculation = calculation;\n this.#depth = Math.max(Math.max(0, ...bindings.map(b => b.value.depth)), calculation.depth) + 1;\n }\n\n get #parts(): Node[] {\n return [...this.bindings.map(b => b.value), this.calculation];\n }\n\n override *references(): Generator<Reference> {\n for (const p of this.#parts) yield* p.references();\n }\n\n override *structuredReferences(): Generator<StructuredReferenceNode> {\n for (const p of this.#parts) yield* p.structuredReferences();\n }\n\n override *calls(): Generator<FunctionNode> {\n for (const p of this.#parts) yield* p.calls();\n }\n\n override get depth(): number {\n return this.#depth;\n }\n}\n\n/**\n * The intersection of two operands written with whitespace between them, one of them a name (`item one`):\n * ExSheet defines no names, so it is `#NAME?` (ADR-0047). The parser refuses an intersection of two References.\n */\nexport class IntersectionNode extends NodeBase {\n readonly kind = 'intersection';\n readonly left: Node;\n readonly right: Node;\n readonly #depth: number;\n\n constructor(left: Node, right: Node) {\n super();\n this.left = left;\n this.right = right;\n this.#depth = Math.max(left.depth, right.depth) + 1;\n }\n\n override *references(): Generator<Reference> {\n yield* this.left.references();\n yield* this.right.references();\n }\n\n override *calls(): Generator<FunctionNode> {\n yield* this.left.calls();\n yield* this.right.calls();\n }\n\n override get depth(): number {\n return this.#depth;\n }\n}\n\nexport class FunctionNode extends NodeBase {\n readonly kind = 'function';\n /** The name: upper case for a declared function, as typed otherwise. */\n readonly name: string;\n readonly arguments: readonly Node[];\n /** The declared function, or `undefined` for a name outside the set (`#NAME?`). */\n readonly function: FunctionDefinition | undefined;\n /**\n * For `RAND` and `RANDBETWEEN`: which of the Formula's draws this call is, counted in the Formula's text\n * from 0 (ADR-0180). Two calls are two draws; one call read twice, as a `LET` binding is, is one.\n */\n readonly place: number;\n readonly #depth: number;\n\n constructor(name: string, args: readonly Node[], definition: FunctionDefinition | undefined, place = 0) {\n super();\n this.name = name;\n this.arguments = args;\n this.function = definition;\n this.place = place;\n this.#depth = Math.max(0, ...args.map(a => a.depth)) + 1;\n }\n\n override *references(): Generator<Reference> {\n for (const a of this.arguments) yield* a.references();\n yield* criteriaResultReferences(this);\n }\n\n override *structuredReferences(): Generator<StructuredReferenceNode> {\n for (const a of this.arguments) yield* a.structuredReferences();\n }\n\n override *calls(): Generator<FunctionNode> {\n yield this;\n for (const a of this.arguments) yield* a.calls();\n }\n\n override get depth(): number {\n return this.#depth;\n }\n}\n\nexport class ParenthesesNode extends NodeBase {\n readonly kind = 'parentheses';\n readonly inner: Node;\n readonly #depth: number;\n\n constructor(inner: Node) {\n super();\n this.inner = inner;\n this.#depth = inner.depth + 1;\n }\n\n override *references(): Generator<Reference> {\n yield* this.inner.references();\n }\n\n override *structuredReferences(): Generator<StructuredReferenceNode> {\n yield* this.inner.structuredReferences();\n }\n\n override *calls(): Generator<FunctionNode> {\n yield* this.inner.calls();\n }\n\n override get depth(): number {\n return this.#depth;\n }\n}\n\nexport class UnaryNode extends NodeBase {\n readonly kind = 'unary';\n readonly operator: '+' | '-';\n readonly operand: Node;\n readonly #depth: number;\n\n constructor(operator: '+' | '-', operand: Node) {\n super();\n this.operator = operator;\n this.operand = operand;\n this.#depth = operand.depth + 1;\n }\n\n override *references(): Generator<Reference> {\n yield* this.operand.references();\n }\n\n override *structuredReferences(): Generator<StructuredReferenceNode> {\n yield* this.operand.structuredReferences();\n }\n\n override *calls(): Generator<FunctionNode> {\n yield* this.operand.calls();\n }\n\n override get depth(): number {\n return this.#depth;\n }\n}\n\nexport class PercentNode extends NodeBase {\n readonly kind = 'percent';\n readonly operand: Node;\n readonly #depth: number;\n\n constructor(operand: Node) {\n super();\n this.operand = operand;\n this.#depth = operand.depth + 1;\n }\n\n override *references(): Generator<Reference> {\n yield* this.operand.references();\n }\n\n override *structuredReferences(): Generator<StructuredReferenceNode> {\n yield* this.operand.structuredReferences();\n }\n\n override *calls(): Generator<FunctionNode> {\n yield* this.operand.calls();\n }\n\n override get depth(): number {\n return this.#depth;\n }\n}\n\n/**\n * A binary operator. Excel's operators associate to the left, so `=1+1+\u2026+1` is a chain of these down their\n * left operands, as long as the Formula: a walk over one loops along that chain (`spine`, `operands`) and\n * descends only into the right operands, so a chain of thousands of operators never deepens the stack.\n */\nexport class BinaryNode extends NodeBase {\n readonly kind = 'binary';\n readonly operator: string;\n readonly left: Node;\n readonly right: Node;\n readonly #depth: number;\n\n constructor(operator: string, left: Node, right: Node) {\n super();\n this.operator = operator;\n this.left = left;\n this.right = right;\n // The left operand stands at this operator's depth: a walk loops along it.\n this.#depth = Math.max(left.depth, right.depth + 1);\n }\n\n override get depth(): number {\n return this.#depth;\n }\n\n override *references(): Generator<Reference> {\n for (const o of this.operands()) yield* o.references();\n }\n\n override *structuredReferences(): Generator<StructuredReferenceNode> {\n for (const o of this.operands()) yield* o.structuredReferences();\n }\n\n override *calls(): Generator<FunctionNode> {\n for (const o of this.operands()) yield* o.calls();\n }\n\n /**\n * This operator and those down its left operands, innermost (the first applied) first: the chain `1+2-3`\n * is the `+`, then the `-`. The innermost's left operand is `leftmost`.\n */\n get spine(): BinaryNode[] {\n const spine: BinaryNode[] = [this];\n for (let node = this.left; node.kind === 'binary'; node = node.left) spine.push(node);\n return spine.toReversed();\n }\n\n /** The first operand of the chain: the left operand of its innermost operator, which is no operator. */\n get leftmost(): Node {\n let node = this.left;\n while (node.kind === 'binary') node = node.left;\n return node;\n }\n\n /** The chain's operands in the text's order: `leftmost`, then each operator's right operand. */\n *operands(): Generator<Node> {\n const spine = this.spine;\n yield this.leftmost;\n for (const binary of spine) yield binary.right;\n }\n}\n\n/**\n * The Reference `SUMIF` and `AVERAGEIF` read beyond their written result range: the range the size of the\n * criteria range from the result range's top-left cell, as Excel reads it, so the dependency graph follows it.\n */\nfunction* criteriaResultReferences(call: FunctionNode): Generator<Reference> {\n if (call.function === undefined || (call.name !== 'SUMIF' && call.name !== 'AVERAGEIF') || call.arguments.length !== 3) return;\n const criteria = literalReference(call.arguments[0]);\n const result = literalReference(call.arguments[2]);\n if (criteria === undefined || criteria.spilled || result === undefined || result.spilled) return;\n const a = criteria.area;\n const b = result.area;\n if (b.row1 + a.rows > rowCount || b.column1 + a.columns > columnCount) return;\n yield Reference.rectangle(result.sheetName, b.row1, b.column1, b.row1 + a.rows - 1, b.column1 + a.columns - 1, true, true, true, true)\n .with({ lastSheetName: result.lastSheetName });\n}\n\n/** The Reference a node writes literally, through parentheses; `undefined` for any other node. */\nexport function literalReference(node: Node | undefined): Reference | undefined {\n if (node === undefined) return undefined;\n if (node.kind === 'reference') return node.reference;\n if (node.kind === 'parentheses') return literalReference(node.inner);\n return undefined;\n}\n", "import { equalsIgnoreCase, formatRoundTrip } from './dotnet';\n\n/**\n * An Error Value, written as a cell shows it: Excel's set, `#GETTING_DATA` with the stricter meaning\n * ADR-0049 gives it, and `#CIRC!`, the one Error Value ExSheet adds (ADR-0047). Error Values are data; they\n * propagate through every Formula that uses them.\n */\nexport type ErrorValue =\n | '#NULL!' | '#DIV/0!' | '#VALUE!' | '#REF!' | '#NAME?' | '#NUM!' | '#N/A' | '#GETTING_DATA' | '#CIRC!'\n | '#SPILL!' | '#CALC!' | '#FIELD!' | '#BLOCKED!' | '#CONNECT!' | '#UNKNOWN!';\n\n/** Every Error Value, in the C# enum's order, which the lexer reads Excel's first seven in. */\nexport const errorValues: readonly ErrorValue[] = [\n '#NULL!', '#DIV/0!', '#VALUE!', '#REF!', '#NAME?', '#NUM!', '#N/A', '#GETTING_DATA', '#CIRC!',\n '#SPILL!', '#CALC!', '#FIELD!', '#BLOCKED!', '#CONNECT!', '#UNKNOWN!',\n];\n\n/**\n * Reads the text of one of Excel's Error Values, in either case, as Excel reads one typed with real keys:\n * `#spill!` is `#SPILL!`. `#GETTING_DATA` and `#CIRC!` are not read: they describe the state of a\n * computation, and a user cannot type one in (ADR-0047, ADR-0049). `#BUSY!` is not one: Excel keeps it as text.\n */\nexport function parseTypedError(text: string): ErrorValue | undefined {\n return readable(text, true);\n}\n\n/** Reads the text of an Error Value a cell can hold exactly as Excel writes it in a file, case and all. */\nexport function parseWrittenError(text: string): ErrorValue | undefined {\n return readable(text, false);\n}\n\nfunction readable(text: string, ignoreCase: boolean): ErrorValue | undefined {\n for (const error of errorValues) {\n if (error === '#GETTING_DATA' || error === '#CIRC!') continue;\n if (ignoreCase ? equalsIgnoreCase(error, text) : error === text) return error;\n }\n return undefined;\n}\n\n/** The four kinds of Value, as in Excel (ADR-0047). A blank cell is not a fifth kind: it has no Value. */\nexport type ValueKind = 'number' | 'text' | 'boolean' | 'error';\n\n/**\n * What a cell evaluates to: a number, text, a boolean or an Error Value (CONTEXT.md). A constant Entry is\n * its own Value; a Formula's Value is its result. Values are never recorded in a Sheet Document (ADR-0048).\n * A blank is no Value: where one may stand, the engine says `undefined`.\n */\nexport class Value {\n readonly #kind: ValueKind;\n readonly #number: number;\n readonly #text: string | undefined;\n readonly #error: ErrorValue | undefined;\n readonly #refused: boolean;\n\n private constructor(kind: ValueKind, number: number, text: string | undefined, error: ErrorValue | undefined, refused: boolean) {\n this.#kind = kind;\n this.#number = number;\n this.#text = text;\n this.#error = error;\n this.#refused = refused;\n }\n\n /** A number. NaN and the infinities are not numbers a cell can hold; Excel's answer to them is `#NUM!`. */\n static fromNumber(number: number): Value {\n if (!Number.isFinite(number)) throw new RangeError(`A Value is a finite number; Excel's answer to ${String(number)} is #NUM!.`);\n return new Value('number', number === 0 ? 0 : number, undefined, undefined, false);\n }\n\n /** Text, possibly empty. */\n static fromText(text: string): Value {\n return new Value('text', 0, text, undefined, false);\n }\n\n /** `TRUE` or `FALSE`. */\n static fromBoolean(value: boolean): Value {\n return value ? Value.#true : Value.#false;\n }\n\n /** An Error Value. */\n static fromError(error: ErrorValue): Value {\n return Value.#errors.get(error) ?? new Value('error', 0, undefined, error, false);\n }\n\n static readonly #true = new Value('boolean', 1, undefined, undefined, false);\n static readonly #false = new Value('boolean', 0, undefined, undefined, false);\n static readonly #errors = new Map<ErrorValue, Value>(errorValues.map(e => [e, new Value('error', 0, undefined, e, false)]));\n\n /**\n * A refusal (ADR-0047; 2026-10-12, decided with the user: a refusal is never caught, anywhere): the Error\n * Value `#VALUE!` where ExSheet cannot answer as Excel. It is `#VALUE!` to everything outside the engine,\n * and the engine carries it as `#CIRC!` is carried. Internal to the engine.\n */\n static readonly refusal: Value = new Value('error', 0, undefined, '#VALUE!', true);\n\n /** A refusal shown as `#NAME?`: a call of a function Excel has and ExSheet does not declare, or a declared Linked Table's bare name. Internal. */\n static readonly refusedName: Value = new Value('error', 0, undefined, '#NAME?', true);\n\n /** Which of the four kinds this Value is. */\n get kind(): ValueKind {\n return this.#kind;\n }\n\n /**\n * Whether this Error Value is a Refused Formula's: `#VALUE!`, or `#NAME?` for a function Excel has and\n * ExSheet does not declare, which no Formula can catch, in its own cell or in any cell that reads it\n * (ADR-0047). It is equal to the Error Value it shows.\n */\n get isRefused(): boolean {\n return this.#refused;\n }\n\n /** Whether this Value is an Error Value. */\n get isError(): boolean {\n return this.#kind === 'error';\n }\n\n /** The number; throws unless the kind is `number`. */\n get number(): number {\n if (this.#kind !== 'number') throw this.#wrong('number');\n return this.#number;\n }\n\n /** The text; throws unless the kind is `text`. */\n get text(): string {\n if (this.#text === undefined) throw this.#wrong('text');\n return this.#text;\n }\n\n /** The boolean; throws unless the kind is `boolean`. */\n get boolean(): boolean {\n if (this.#kind !== 'boolean') throw this.#wrong('boolean');\n return this.#number !== 0;\n }\n\n /** The Error Value; throws unless the kind is `error`. */\n get error(): ErrorValue {\n if (this.#error === undefined) throw this.#wrong('error');\n return this.#error;\n }\n\n #wrong(asked: ValueKind): Error {\n return new Error(`This Value is ${this.#kind}, not ${asked}.`);\n }\n\n /**\n * Exact equality: the same kind and the same number, text (ordinal, case-sensitive), boolean or Error\n * Value. This is \"did the Value change\", not Excel's `=`, which ignores case. A refusal equals the Error\n * Value it shows.\n */\n equals(other: Value): boolean {\n return this.#kind === other.#kind && this.#number === other.#number && this.#text === other.#text && this.#error === other.#error;\n }\n\n /**\n * Whether a cell's Value did not change: equal and both refused or neither, or both absent. A `#VALUE!`\n * that turns from Excel's own into a refusal changes what every Formula reading the cell answers.\n */\n static unchanged(before: Value | undefined, after: Value | undefined): boolean {\n if (before === undefined || after === undefined) return before === after;\n return before.equals(after) && before.#refused === after.#refused;\n }\n\n /** Whether two Values that may be blank are equal: both blank, or equal (`Nullable.Equals`). */\n static same(a: Value | undefined, b: Value | undefined): boolean {\n if (a === undefined || b === undefined) return a === b;\n return a.equals(b);\n }\n\n /** A diagnostic form, culture-invariant: a number round-trips, text is as held. What a cell shows is the Sheet's display, not this. */\n toString(): string {\n switch (this.#kind) {\n case 'number': return formatRoundTrip(this.#number);\n case 'text': return this.text;\n case 'boolean': return this.#number !== 0 ? 'TRUE' : 'FALSE';\n case 'error': return this.error;\n default: return unreachableKind(this.#kind);\n }\n }\n}\n\nfunction unreachableKind(kind: never): never {\n throw new Error(`Internal: ${String(kind)} is no kind of Value.`);\n}\n", "import { Value } from '../value';\n\n/**\n * A rectangle of Values a Formula computes (ADR-0125): an operator applied to a range, a function built for\n * arrays, or a range read whole. Row by row; a blank is `undefined`.\n */\nexport class ValueArray {\n /**\n * The most Values one array holds: 2^24, sixteen whole columns. A larger array is not computed, as Excel\n * runs out of resources before it (ADR-0125: a cap belongs on what cannot be executed); whatever would\n * build one is `#NUM!`.\n */\n static readonly mostCells = 2 ** 24;\n\n readonly rows: number;\n readonly columns: number;\n readonly #values: (Value | undefined)[];\n\n constructor(rows: number, columns: number) {\n if (rows < 1 || columns < 1) throw new RangeError('An array has at least one row and one column.');\n if (rows * columns > ValueArray.mostCells) throw new RangeError('The array is larger than one array holds.');\n this.rows = rows;\n this.columns = columns;\n this.#values = Array.from<Value | undefined>({ length: rows * columns });\n }\n\n /** Whether the array is one Value, which is no array at all to whoever reads it. */\n get isSingle(): boolean {\n return this.rows === 1 && this.columns === 1;\n }\n\n at(row: number, column: number): Value | undefined {\n return this.#values[row * this.columns + column];\n }\n\n set(row: number, column: number, value: Value | undefined): void {\n this.#values[row * this.columns + column] = value;\n }\n\n /** Every Value row by row, blanks included as `undefined`. */\n all(): readonly (Value | undefined)[] {\n return this.#values;\n }\n\n /** The Values row by row, blanks left out, as a range's are read. */\n *nonBlank(): Generator<Value> {\n for (const v of this.#values) {\n if (v !== undefined) yield v;\n }\n }\n\n /**\n * The element at `row`, `column` as Excel's broadcasting reads it: a single row or column is repeated along\n * the other array, and past its size an array of more than one row or column is `#N/A`.\n */\n broadcast(row: number, column: number): Value | undefined {\n const r = this.rows === 1 ? 0 : row;\n const c = this.columns === 1 ? 0 : column;\n return r < this.rows && c < this.columns ? this.at(r, c) : Value.fromError('#N/A');\n }\n\n static single(value: Value | undefined): ValueArray {\n const array = new ValueArray(1, 1);\n array.set(0, 0, value);\n return array;\n }\n}\n", "import { Value, type ErrorValue } from '../value';\nimport type { CellReader } from './cell-reader';\nimport { Area } from './reference';\nimport { ValueArray } from './value-array';\n\n/**\n * What an operand is: a Value (or a blank read from one cell); a rectangle of cells not yet read; an argument\n * left empty; a Linked Table's column (ADR-0049); an array a Formula computed (ADR-0125); or a 3D Reference,\n * one rectangle on each Sheet of a span (ADR-0331 \u00A77).\n */\nexport type OperandKind = 'scalar' | 'area' | 'missing' | 'column' | 'array' | 'threeD';\n\ninterface OperandParts {\n readonly kind: OperandKind;\n readonly scalar?: Value | undefined;\n readonly area?: Area;\n readonly column?: readonly (Value | undefined)[] | undefined;\n readonly array?: ValueArray | undefined;\n readonly isSpillRange?: boolean;\n readonly keptBlank?: boolean;\n readonly cells?: CellReader | undefined;\n readonly sheets?: readonly CellReader[] | undefined;\n readonly handedOn?: boolean;\n}\n\nconst noArea = new Area(0, 0, 0, 0);\n\n/**\n * What a node evaluates to before it is used: a Value (or blank), or a rectangle of cells that a function reads\n * as a range. Excel's functions tell the two apart \u2014 `SUM` ignores text in a range but not text typed as an\n * argument.\n */\nexport class Operand {\n readonly kind: OperandKind;\n /** For `scalar`: the Value, or `undefined` for a blank. */\n readonly scalar: Value | undefined;\n readonly area: Area;\n /** For `area`: the Sheet its cells are on, as the recalculation reads it (ADR-0331). */\n readonly cells: CellReader | undefined;\n /** For `threeD`: the Sheets of the span, in tab order (ADR-0331 \u00A77). */\n readonly sheets: readonly CellReader[] | undefined;\n /**\n * For `threeD`: whether a function handed it on (`IF`, `CHOOSE`, a `LET` name), rather than its Reference\n * standing where it is read. Read as one Value, one written there is `#REF!` and one handed on `#VALUE!`.\n */\n readonly handedOn: boolean;\n /** For `column`: the column's Values top to bottom, blank as `undefined`. */\n readonly column: readonly (Value | undefined)[] | undefined;\n /** For `array`: the computed Values. */\n readonly array: ValueArray | undefined;\n /** For `array`: whether the Values are a Spill Range's, read through `A1#` (ADR-0125): a Reference to cells in Excel. */\n readonly isSpillRange: boolean;\n /**\n * Whether this holds a kept blank: a blank that `UNIQUE`, `SORT`, `SORTBY`, `FILTER` or `TRANSPOSE` kept\n * from its array (ADR-0125), as one of its Values or as the one Value `INDEX` picked from it. A function\n * reads such an operand only through `FunctionCall.keepingBlanks` or `FunctionCall.oneValue`; anywhere else\n * the Formula is refused.\n */\n readonly keptBlank: boolean;\n\n private constructor(parts: OperandParts) {\n this.kind = parts.kind;\n this.scalar = parts.scalar;\n this.area = parts.area ?? noArea;\n this.cells = parts.cells;\n this.sheets = parts.sheets;\n this.handedOn = parts.handedOn === true;\n this.column = parts.column;\n this.array = parts.array;\n this.isSpillRange = parts.isSpillRange === true;\n this.keptBlank = parts.keptBlank === true;\n }\n\n /** Whether this is a Reference of cells: a rectangle, or a Spill Range read through `A1#`. */\n get isReference(): boolean {\n return this.kind === 'area' || this.isSpillRange;\n }\n\n /** Whether this is a range a function reads cell by cell: a rectangle of cells, a Linked Table's column, an array or a 3D Reference. */\n get isRange(): boolean {\n return this.kind === 'area' || this.kind === 'column' || this.kind === 'array' || this.kind === 'threeD';\n }\n\n static readonly missing = new Operand({ kind: 'missing' });\n\n static readonly blank = new Operand({ kind: 'scalar' });\n\n /** One Value. */\n static of(value: Value): Operand {\n return new Operand({ kind: 'scalar', scalar: value });\n }\n\n /** One Error Value. */\n static ofError(error: ErrorValue): Operand {\n return new Operand({ kind: 'scalar', scalar: Value.fromError(error) });\n }\n\n /** One Value, or a blank. */\n static ofScalar(value: Value | undefined): Operand {\n return value === undefined ? Operand.blank : Operand.of(value);\n }\n\n /** A rectangle of the Sheet `cells` reads (ADR-0331). */\n static ofArea(area: Area, cells: CellReader): Operand {\n return new Operand({ kind: 'area', area, cells });\n }\n\n /** A 3D Reference's rectangle on each Sheet of its span, `sheets` in tab order (ADR-0331 \u00A77). */\n static ofThreeD(area: Area, sheets: readonly CellReader[]): Operand {\n return new Operand({ kind: 'threeD', area, sheets });\n }\n\n /** This operand as a function hands it on (`handedOn`): a 3D Reference marked so, anything else as it is. */\n handOn(): Operand {\n return this.kind === 'threeD' ? new Operand({ kind: 'threeD', area: this.area, sheets: this.sheets, handedOn: true }) : this;\n }\n\n /** Another rectangle of the same Sheet as this one, which must be a rectangle. */\n sameSheet(area: Area): Operand {\n if (this.kind !== 'area' || this.cells === undefined) throw new Error('Not a rectangle of cells.');\n return Operand.ofArea(area, this.cells);\n }\n\n /** A Linked Table's column (ADR-0049). */\n static ofColumn(column: readonly (Value | undefined)[]): Operand {\n return new Operand({ kind: 'column', column });\n }\n\n /** A computed array; one of a single Value is that Value. */\n static ofArray(array: ValueArray): Operand {\n return array.isSingle ? new Operand({ kind: 'scalar', scalar: array.at(0, 0) }) : new Operand({ kind: 'array', array });\n }\n\n /** A Spill Range's Values, read through `A1#`: an array that is a Reference (`isSpillRange`). */\n static ofSpillRange(array: ValueArray): Operand {\n return new Operand({ kind: 'array', array, isSpillRange: true });\n }\n\n /** One Value as an array of one, for a function that takes an array and is given what a computation reduced to one Value (ADR-0125). */\n static asArray(value: Value | undefined): Operand {\n return new Operand({ kind: 'array', array: ValueArray.single(value) });\n }\n\n get isError(): boolean {\n return this.kind === 'scalar' && this.scalar !== undefined && this.scalar.isError;\n }\n\n /** Whether this is a blank, or an array that holds one. */\n get holdsBlank(): boolean {\n switch (this.kind) {\n case 'scalar': return this.scalar === undefined;\n case 'array': return this.arrayOf().all().includes(undefined);\n case 'area':\n case 'missing':\n case 'column':\n case 'threeD':\n return false;\n default: throw new Error(`Internal: ${String(this.kind)} is no kind of operand.`);\n }\n }\n\n /** This operand marked as holding a kept blank (`keptBlank`), when it holds a blank at all; as it is otherwise. */\n withKeptBlank(): Operand {\n return this.holdsBlank\n ? new Operand({\n kind: this.kind, scalar: this.scalar, area: this.area, column: this.column, array: this.array, isSpillRange: this.isSpillRange,\n keptBlank: true, cells: this.cells,\n })\n : this;\n }\n\n /** The array of an `array` operand. */\n arrayOf(): ValueArray {\n if (this.array === undefined) throw new Error(`Internal: a ${this.kind} operand holds no array.`);\n return this.array;\n }\n\n /** The column of a `column` operand. */\n columnOf(): readonly (Value | undefined)[] {\n if (this.column === undefined) throw new Error(`Internal: a ${this.kind} operand holds no column.`);\n return this.column;\n }\n\n /** The Sheet of an `area` operand. */\n cellsOf(): CellReader {\n if (this.cells === undefined) throw new Error(`Internal: a ${this.kind} operand is on no Sheet.`);\n return this.cells;\n }\n\n /** The Sheets of a `threeD` operand. */\n sheetsOf(): readonly CellReader[] {\n if (this.sheets === undefined) throw new Error(`Internal: a ${this.kind} operand spans no Sheets.`);\n return this.sheets;\n }\n}\n", "import type { Evaluator } from './evaluator';\nimport { MissingNode, type Node } from './nodes';\nimport { Operand } from './operand';\n\n/**\n * What a function makes of a 3D Reference given as one of its arguments (ADR-0331 \u00A77), as Excel answered for\n * each function ExSheet declares: read as one Value (`#REF!`, or `#VALUE!` handed on); read as one range across\n * its span, Sheet by Sheet in tab order (`SUM` and its kin); handed on as it is (`IF`'s and `CHOOSE`'s values);\n * `#VALUE!` where the function reads it (`IFS`'s and `SWITCH`'s values); or `#VALUE!` before anything of the\n * call is read, where the function asks for a range of one Sheet.\n */\nexport type ThreeDArgument = 'value' | 'range' | 'handOn' | 'valueError' | 'oneSheet';\n\n/** One of a fixed list of values an argument takes, as completion lists it (ADR-0058): the value, and Excel's text for it. */\nexport interface ArgumentValue {\n /** What choosing it writes into the Formula: `-1`. */\n readonly value: string;\n /** The text the list shows, Excel's: `-1 - Exact match or next smaller item`. */\n readonly text: string;\n}\n\n/** What a function's declaration says beyond its name, arguments and evaluation. */\nexport interface FunctionTraits {\n /** The arguments that take one of a fixed list of values, by index, each list in Excel's order with Excel's texts (ADR-0058). */\n readonly values?: Readonly<Record<number, readonly ArgumentValue[]>>;\n /** Whether arguments after `pairOffset` come in pairs: an incomplete pair is refused on entry. */\n readonly inPairs?: boolean;\n /** Arguments before the repeating pairs: one for the result range of SUMIFS and its partners. */\n readonly pairOffset?: number;\n /** The arguments, by index from `first` to `last`, that Excel takes only as a Reference (ADR-0047). */\n readonly referenceOnly?: { readonly first: number; readonly last: number };\n /** Whether a call of it can give a Reference (`INDIRECT`, `OFFSET`, `INDEX`, `CHOOSE`, `IF` and their kin). */\n readonly returnsReference?: boolean;\n /** What a 3D Reference given as each argument is to it, by the argument's index and the count of arguments (ADR-0331 \u00A77). */\n readonly threeD?: (index: number, count: number) => ThreeDArgument;\n}\n\n/** A function of the declared set (ADR-0047): its name, how many arguments it takes, and how it evaluates. */\nexport class FunctionDefinition {\n readonly name: string;\n readonly minimumArguments: number;\n /** The most arguments it takes; Excel's limit of 255 for the open-ended ones. */\n readonly maximumArguments: number;\n /** The argument list as a hint shows it, such as `number1, [number2], ...`. */\n readonly arguments: string;\n readonly description: string;\n readonly values: Readonly<Record<number, readonly ArgumentValue[]>>;\n readonly inPairs: boolean;\n readonly pairOffset: number;\n readonly referenceOnly: { readonly first: number; readonly last: number } | undefined;\n readonly returnsReference: boolean;\n readonly threeD: ((index: number, count: number) => ThreeDArgument) | undefined;\n readonly #invoke: (call: FunctionCall) => Operand;\n\n constructor(name: string, minimum: number, maximum: number, args: string, description: string, invoke: (call: FunctionCall) => Operand,\n traits: FunctionTraits = {}) {\n this.name = name;\n this.minimumArguments = minimum;\n this.maximumArguments = maximum;\n this.arguments = args;\n this.description = description;\n this.#invoke = invoke;\n this.values = traits.values ?? {}; // oxlint-disable-line ex-grid/no-stand-in-default -- a function with no fixed lists of values\n this.inPairs = traits.inPairs === true;\n this.pairOffset = traits.pairOffset ?? 0; // oxlint-disable-line ex-grid/no-stand-in-default -- C#'s init default: no arguments before the pairs\n this.referenceOnly = traits.referenceOnly;\n this.returnsReference = traits.returnsReference === true;\n this.threeD = traits.threeD;\n }\n\n invoke(call: FunctionCall): Operand {\n return this.#invoke(call);\n }\n}\n\n/** One call of a function: its argument nodes, evaluated only when the function asks (so `IF` is lazy, as in Excel). */\nexport class FunctionCall {\n readonly evaluator: Evaluator;\n readonly #arguments: readonly Node[];\n /** For `RAND` and `RANDBETWEEN`: which of the Formula's draws this call is, counted in its text (ADR-0180). */\n readonly place: number;\n /** What a 3D Reference is to the function called, by argument. */\n readonly threeD: ((index: number, count: number) => ThreeDArgument) | undefined;\n\n constructor(evaluator: Evaluator, args: readonly Node[], place = 0, threeD?: (index: number, count: number) => ThreeDArgument) {\n this.evaluator = evaluator;\n this.#arguments = args;\n this.place = place;\n this.threeD = threeD;\n }\n\n get count(): number {\n return this.#arguments.length;\n }\n\n /**\n * Argument `index`, evaluated. One that holds a kept blank refuses the Formula (`Evaluator.refuse`): what\n * this function reads it as is a reading no run has settled (ADR-0125).\n */\n operand(index: number): Operand {\n const operand = this.#admitted(index, this.evaluator.operand(this.argument(index)));\n return operand.keptBlank ? this.evaluator.refuse() : operand;\n }\n\n /** Argument `index`, evaluated, a kept blank included (ADR-0125), for the functions that read it the one way. */\n keepingBlanks(index: number): Operand {\n return this.#admitted(index, this.evaluator.operand(this.argument(index)));\n }\n\n /**\n * What a 3D Reference given as argument `index` is to the function called, as Excel answered (ADR-0331 \u00A77);\n * any other operand as it is. Every door an argument comes in by passes through here.\n */\n #admitted(index: number, operand: Operand): Operand {\n if (operand.kind !== 'threeD') return operand;\n const policy = this.threeD === undefined ? 'value' : this.threeD(index, this.#arguments.length);\n switch (policy) {\n case 'range': return operand;\n case 'handOn': return operand.handOn();\n case 'valueError':\n case 'oneSheet':\n return Operand.ofError('#VALUE!');\n case 'value': {\n const value = this.evaluator.scalarOf(operand);\n if (value === undefined) throw new Error('Internal: a 3D Reference read as one Value is an Error Value.');\n return Operand.of(value);\n }\n default: throw new Error(`Internal: ${String(policy)} is no ThreeDArgument.`);\n }\n }\n\n /**\n * Argument `index`, evaluated, for a function that reads one Value of it. A kept blank given as that one\n * Value is read as a blank cell's (ADR-0125). An array that holds one refuses the Formula.\n */\n oneValue(index: number): Operand {\n const operand = this.#admitted(index, this.evaluator.operand(this.argument(index)));\n return operand.keptBlank && operand.kind === 'array' ? this.evaluator.refuse() : operand;\n }\n\n /** The argument's syntax, when a function must distinguish a literal Reference from a computed one. */\n argument(index: number): Node {\n const node = this.#arguments[index];\n if (node === undefined) throw new Error(`Internal: argument ${String(index)} of ${String(this.#arguments.length)} is read.`);\n return node;\n }\n\n /**\n * The argument evaluated for its extent alone, as `ROWS` and `COLUMNS` read it: no Value of it is read, so a\n * kept blank is counted in the extent, never refused.\n */\n measured(index: number): Operand {\n return this.#admitted(index, this.evaluator.operand(this.argument(index)));\n }\n\n /** Whether argument `index` was given and not left empty (`MissingNode.isEmpty`). */\n has(index: number): boolean {\n const node = this.#arguments[index];\n return node !== undefined && !MissingNode.isEmpty(node);\n }\n}\n", "// Reads a typed constant under a Sheet's culture, so that it can be recorded parsed (ADR-0048): a number with\n// the culture's separators, a percentage, a date in the culture's day order, a time, a boolean, one of Excel's\n// Error Values, or else text.\nimport { dayOrder, type Culture } from './culture';\nimport { serialFromDate } from './date-serial';\nimport { equalsIgnoreCase, isAsciiDigit, isWhiteSpace, trimEndChar, upperInvariant } from './dotnet';\nimport { abbreviatedMonthNamesOf, NumberFormat } from './number-format';\nimport { elementAt } from './must';\nimport { parseTypedError, Value } from './value';\n\n/** A typed constant, and the number format Excel applies to a General cell when it is typed (a date's, a percentage's). */\nexport interface ParsedConstant {\n readonly value: Value;\n readonly implied: NumberFormat | undefined;\n}\n\n/** How a typed number was written, which decides the format Excel gives a General cell for it. */\ninterface NumberShape {\n percent: boolean;\n decimals: boolean;\n grouped: boolean;\n exponent: boolean;\n}\n\n/** A number read, and how it was written. */\ninterface ReadNumber {\n readonly number: number;\n readonly shape: NumberShape;\n}\n\n/**\n * The year a typed date takes when it is written without one: the current year, as Excel takes it. The C#\n * engine reads `DateTime.Today`; here it is the local calendar's year, read when a constant is parsed.\n */\nexport function currentYear(): number {\n return new Date().getFullYear();\n}\n\n/** A typed constant, read as Excel reads it under the culture. */\nexport function parseConstant(typed: string, culture: Culture): Value {\n return parseConstantWithFormat(typed, culture).value;\n}\n\n/** A typed constant, and the number format Excel applies to a General cell when it is typed. */\nexport function parseConstantWithFormat(typed: string, culture: Culture): ParsedConstant {\n // A leading apostrophe makes the rest text, whatever it looks like, as in Excel.\n if (typed.length > 0 && typed.charAt(0) === \"'\") return { value: Value.fromText(typed.slice(1)), implied: undefined };\n if (equalsIgnoreCase(typed, 'TRUE')) return { value: Value.fromBoolean(true), implied: undefined };\n if (equalsIgnoreCase(typed, 'FALSE')) return { value: Value.fromBoolean(false), implied: undefined };\n const error = parseTypedError(typed);\n if (error !== undefined) return { value: Value.fromError(error), implied: undefined };\n const trimmed = trimSpaces(typed);\n const number = readNumber(trimmed, culture);\n if (number !== undefined) return { value: Value.fromNumber(number.number), implied: implied(number.shape) };\n const dollars = readDollars(trimmed, culture);\n if (dollars !== undefined) {\n return {\n value: Value.fromNumber(dollars.number),\n implied: NumberFormat.parse(dollars.shape.decimals ? '$#,##0.00_);[Red]($#,##0.00)' : '$#,##0_);[Red]($#,##0)'),\n };\n }\n const dateTime = parseDateTime(trimmed, culture, currentYear());\n if (dateTime !== undefined) return { value: Value.fromNumber(dateTime.serial), implied: dateTime.format };\n return { value: Value.fromText(typed), implied: undefined };\n}\n\n/**\n * The format a typed number gives a General cell, as Excel was observed to give it: a percentage `0%` or\n * `0.00%`; an exponent `0.00E+00`; thousands separators `#,##0`, or `#,##0.00` with decimals. Otherwise none.\n */\nfunction implied(shape: NumberShape): NumberFormat | undefined {\n if (shape.percent) return NumberFormat.parse(shape.decimals ? '0.00%' : '0%');\n if (shape.exponent) return NumberFormat.parse('0.00E+00');\n if (shape.grouped) return NumberFormat.parse(shape.decimals ? '#,##0.00' : '#,##0');\n return undefined;\n}\n\n/** `string.Trim(' ')`: spaces alone, at both ends. */\nfunction trimSpaces(text: string): string {\n return text.replace(/^ +| +$/g, '');\n}\n\n/**\n * A dollar amount under a culture whose currency is written `$5` (en-US): `$` with an optional `-` before or\n * after it, then an unsigned number with no percentage or exponent (TYPED-021, TYPED-047, TYPED-052). Any\n * other currency, or another sign around the symbol, stays text until Excel's reading of it is observed.\n */\nfunction readDollars(text: string, culture: Culture): ReadNumber | undefined {\n if (culture.data.currencySymbol !== '$' || culture.data.currencyPositivePattern !== 0) return undefined;\n const negative = text.startsWith('-$') || text.startsWith('$-');\n const amount = negative ? text.slice(2) : text.startsWith('$') ? text.slice(1) : undefined;\n if (amount === undefined || amount.length === 0 || !isAsciiDigit(amount.charCodeAt(0))) return undefined;\n const read = readNumber(amount, culture);\n if (read === undefined || read.shape.percent || read.shape.exponent) return undefined;\n return negative ? { number: -read.number, shape: read.shape } : read;\n}\n\n/** Whether the typed text is a number written without `%`, a currency symbol or a date's shape: what Excel's automatic percent entry divides by 100. */\nexport function isPlainNumber(typed: string, culture: Culture): boolean {\n const read = readNumber(trimSpaces(typed), culture);\n return read !== undefined && !read.shape.percent;\n}\n\n/** Text read as a number the way a typed number is: what Excel's arithmetic does with numeric text; `undefined` where it is none. */\nexport function parseNumber(text: string, culture: Culture): number | undefined {\n const trimmed = trimSpaces(text);\n const number = readNumber(trimmed, culture);\n if (number !== undefined) return number.number;\n // A dollar amount reads as it does typed (TYPED-021): \"$1,000\" is 1000 to VALUE and to the operators.\n const dollars = readDollars(trimmed, culture);\n if (dollars !== undefined) return dollars.number;\n return parseDateTime(trimmed, culture, currentYear())?.serial;\n}\n\n/**\n * A number under the culture: an optional sign or parentheses for a negative, digits with the culture's group\n * separator in groups of three, the culture's decimal separator, an optional exponent, an optional trailing\n * `%`. Digits past the fifteenth significant one become zeros, as Excel keeps fifteen.\n */\nfunction readNumber(text: string, culture: Culture): ReadNumber | undefined {\n if (text.length === 0) return undefined;\n const shape: NumberShape = { percent: false, decimals: false, grouped: false, exponent: false };\n const decimalSeparator = culture.data.numberDecimalSeparator;\n const groupSeparator = culture.data.numberGroupSeparator;\n let i = 0;\n let negative = false;\n let parenthesised = false;\n if (text.charAt(i) === '+' || text.charAt(i) === '-') {\n negative = text.charAt(i) === '-';\n i++;\n } else if (text.charAt(i) === '(') {\n parenthesised = true;\n negative = true;\n i++;\n }\n\n let integer = '';\n let groupRun = -1; // digits since the last group separator; -1 before any separator\n while (i < text.length) {\n if (isAsciiDigit(text.charCodeAt(i))) {\n integer += text.charAt(i);\n if (groupRun >= 0) groupRun++;\n i++;\n continue;\n }\n const separatorLength = groupSeparatorAt(text, i, groupSeparator);\n if (separatorLength > 0 && integer.length > 0 && (groupRun === -1 ? integer.length <= 3 : groupRun === 3)) {\n groupRun = 0;\n i += separatorLength;\n continue;\n }\n break;\n }\n if (groupRun >= 0 && groupRun !== 3) return undefined;\n if (groupRun >= 0) shape.grouped = true;\n\n let fraction = '';\n if (text.startsWith(decimalSeparator, i)) {\n i += decimalSeparator.length;\n shape.decimals = true;\n while (i < text.length && isAsciiDigit(text.charCodeAt(i))) fraction += text.charAt(i++);\n }\n if (integer.length === 0 && fraction.length === 0) return undefined;\n\n let exponent = 0;\n if (i < text.length && (text.charAt(i) === 'E' || text.charAt(i) === 'e')) {\n let j = i + 1;\n let exponentNegative = false;\n if (j < text.length && (text.charAt(j) === '+' || text.charAt(j) === '-')) {\n exponentNegative = text.charAt(j) === '-';\n j++;\n }\n const start = j;\n while (j < text.length && isAsciiDigit(text.charCodeAt(j))) j++;\n if (j === start || j - start > 4) return undefined;\n exponent = Number(text.slice(start, j));\n if (exponentNegative) exponent = -exponent;\n shape.exponent = true;\n i = j;\n }\n if (i < text.length && text.charAt(i) === '%') {\n shape.percent = true;\n i++;\n }\n if (parenthesised) {\n if (i >= text.length || text.charAt(i) !== ')') return undefined;\n i++;\n }\n if (i !== text.length) return undefined;\n\n // Excel keeps fifteen significant digits of what is typed; the rest become zeros.\n const kept = fifteenSignificant(integer + fraction);\n const spelled = `${kept.slice(0, integer.length)}${fraction.length > 0 ? `.${kept.slice(integer.length)}` : ''}E${String(exponent)}`;\n let number = Number(spelled);\n if (!Number.isFinite(number)) return undefined;\n if (shape.percent) number /= 100;\n if (negative) number = -number;\n return Number.isFinite(number) ? { number, shape } : undefined;\n}\n\n/** The digits with every one past the fifteenth significant one made a zero. */\nfunction fifteenSignificant(digits: string): string {\n let significant = 0;\n let kept = '';\n for (const digit of digits) {\n if (significant === 0 && digit === '0') {\n kept += digit;\n continue;\n }\n kept += ++significant > 15 ? '0' : digit;\n }\n return kept;\n}\n\n/**\n * A number written in a Formula (invariant digits, an optional point and exponent), read as Excel reads it:\n * digits past the fifteenth significant one become zeros, so `=123456789012345678` holds 123456789012345000,\n * as Excel was observed to.\n */\nexport function parseFormulaNumber(invariant: string): number {\n let significant = 0;\n let kept = '';\n let k = 0;\n for (; k < invariant.length; k++) {\n const c = invariant.charAt(k);\n if (c === 'e' || c === 'E') break;\n if (!isAsciiDigit(invariant.charCodeAt(k)) || (significant === 0 && c === '0')) {\n kept += c;\n continue;\n }\n kept += ++significant > 15 ? '0' : c;\n }\n const number = Number(kept + invariant.slice(k));\n if (Number.isNaN(number)) throw new Error(`Internal: '${invariant}' was matched as a number.`);\n return number;\n}\n\n/** The culture's group separator at `at`; a space-like separator also accepts a plain space. */\nfunction groupSeparatorAt(text: string, at: number, separator: string): number {\n if (text.startsWith(separator, at)) return separator.length;\n const spaceLike = separator.length === 1 && isWhiteSpace(separator.charCodeAt(0));\n const c = text.charAt(at);\n return spaceLike && (c === ' ' || c === '\u00A0' || c === '\u202F') ? 1 : 0;\n}\n\n/**\n * The first two-digit year read as 19xx: 49 is 2049 and 50 is 1950, as Windows' default reads a typed date and\n * Excel was observed to take one typed with real keys (ADR-0047, second run).\n */\nconst firstTwentiethCenturyYear = 50;\n\n// \\d is [0-9] here, where .NET's reads any decimal digit and then refuses to parse one outside ASCII.\nconst datePattern = /^(?<a>[0-9]{1,4})(?<s1>[/\\-.])(?<b>[0-9]{1,2})(?:\\k<s1>(?<c>[0-9]{1,4}))?$/;\n// .NET's \\s: its white space, which JavaScript's \\s does not match exactly.\nconst timePattern = /^(?<h>[0-9]{1,2}):(?<m>[0-9]{1,2})(?::(?<s>[0-9]{1,2}))?(?:[\\f\\n\\r\\t\\v\\x85\\p{Z}]*(?<ampm>[AaPp][Mm]?))?$/u;\nconst monthNamePattern = /^(?:(?<d1>[0-9]{1,2})[-/ ](?<m1>\\p{L}+\\.?)(?:[-/ ](?<y1>[0-9]{2}|[0-9]{4}))?|(?<m2>\\p{L}+\\.?)[-/ ](?<n2>[0-9]{1,2}|[0-9]{4}))$/u;\n\n/** A date or time read: its serial, and the format Excel gives a General cell for it. */\nexport interface ParsedDateTime {\n readonly serial: number;\n readonly format: NumberFormat;\n}\n\n/**\n * A date in the culture's day order (month-day-year under `en-US`, year-month-day under `ja-JP`,\n * day-month-year under `de-DE`) with `/`, `-` or the culture's own separator; a four-digit year written first\n * is always year-month-day. Without a year, the date is in `year`, as Excel takes it. A two-digit year is\n * 2000\u20132049 for 00\u201349 and 1950\u20131999 for 50\u201399. A time `h:mm[:ss] [AM|PM]`, alone or after the date.\n */\nexport function parseDateTime(text: string, culture: Culture, year: number): ParsedDateTime | undefined {\n let datePart = text;\n let timePart: string | undefined;\n const space = text.indexOf(' ');\n if (space > 0 && timePattern.test(trimSpaces(text.slice(space + 1)))) {\n datePart = text.slice(0, space);\n timePart = trimSpaces(text.slice(space + 1));\n }\n\n if (timePart === undefined) {\n const timeOnly = parseTime(text);\n if (timeOnly !== undefined) return { serial: timeOnly.fraction, format: NumberFormat.parse(timeOnly.format) };\n const named = parseMonthName(datePart, culture, year);\n if (named !== undefined) return named;\n }\n\n const match = datePattern.exec(datePart);\n if (match === null) return undefined;\n const groups = defined(match.groups);\n const separator = group(groups, 's1');\n if (separator === '.' && culture.data.dateSeparator !== '.') return undefined;\n\n const a = group(groups, 'a');\n const b = group(groups, 'b');\n const c = groups['c'];\n let y: number;\n let month: number;\n let day: number;\n const order = dayOrder(culture);\n if (a.length >= 3 || order === 'ymd') {\n if (c === undefined) return undefined;\n y = yearOf(a);\n month = Number(b);\n day = Number(c);\n } else if (order === 'dmy') {\n day = Number(a);\n month = Number(b);\n y = c === undefined ? year : yearOf(c);\n } else {\n month = Number(a);\n day = Number(b);\n y = c === undefined ? year : yearOf(c);\n }\n const whole = serialFromDate(y, month, day);\n if (whole === undefined) return undefined;\n\n let fraction = 0;\n if (timePart !== undefined) {\n const time = parseTime(timePart);\n if (time === undefined) return undefined;\n fraction = time.fraction;\n }\n // A date with its year records Excel's built-in short date, whatever the culture, as Excel was observed\n // to; one typed without a year shows as day and month name.\n const format = timePart !== undefined ? NumberFormat.shortDateTime : c === undefined ? NumberFormat.parse('d-mmm') : NumberFormat.shortDate;\n return { serial: whole + fraction, format };\n}\n\nfunction yearOf(digits: string): number {\n const value = Number(digits);\n if (digits.length > 2) return value;\n return value < firstTwentiethCenturyYear ? 2000 + value : 1900 + value;\n}\n\n/**\n * A date written with the culture's name of a month, as Excel reads it: `26-Sep` or `Sep 26` is that day in\n * `year`, shown `d-mmm` (TYPED-022); `26-Sep-2026` is shown `d-mmm-yy`, and `Sep 2026` is the first of the\n * month, shown `mmm-yy`.\n */\nfunction parseMonthName(text: string, culture: Culture, currentYearGiven: number): ParsedDateTime | undefined {\n const match = monthNamePattern.exec(text);\n if (match === null) return undefined;\n const groups = defined(match.groups);\n let day: number;\n let year: number;\n let month: number | undefined;\n let code: string;\n const d1 = groups['d1'];\n if (d1 !== undefined) {\n month = monthNamed(group(groups, 'm1'), culture);\n day = Number(d1);\n const y = groups['y1'];\n year = y !== undefined ? yearOf(y) : currentYearGiven;\n code = y !== undefined ? 'd-mmm-yy' : 'd-mmm';\n } else {\n month = monthNamed(group(groups, 'm2'), culture);\n const number = group(groups, 'n2');\n const value = Number(number);\n if (number.length <= 2 && value >= 1 && value <= 31) {\n day = value;\n year = currentYearGiven;\n code = 'd-mmm';\n } else {\n day = 1;\n year = yearOf(number);\n code = 'mmm-yy';\n }\n }\n if (month === undefined) return undefined;\n const whole = serialFromDate(year, month, day);\n if (whole === undefined) return undefined;\n return { serial: whole, format: NumberFormat.parse(code) };\n}\n\n/** The month (1\u201312) the culture names with `name`, abbreviated or in full, in any case, a trailing full stop ignored. */\nfunction monthNamed(name: string, culture: Culture): number | undefined {\n const wanted = trimEndChar(name, '.');\n const abbreviated = abbreviatedMonthNamesOf(culture);\n for (let m = 0; m < 12; m++) {\n if (equalsIgnoreCase(wanted, trimEndChar(elementAt(abbreviated, m), '.')) || equalsIgnoreCase(wanted, elementAt(culture.data.monthNames, m))) {\n return m + 1;\n }\n }\n return undefined;\n}\n\nfunction parseTime(text: string): { fraction: number; format: string } | undefined {\n const match = timePattern.exec(text);\n if (match === null) return undefined;\n const groups = defined(match.groups);\n let hour = Number(group(groups, 'h'));\n const minute = Number(group(groups, 'm'));\n const s = groups['s'];\n const second = s === undefined ? 0 : Number(s);\n if (minute > 59 || second > 59) return undefined;\n const ampmText = groups['ampm'];\n const ampm = ampmText === undefined ? '' : String.fromCharCode(upperInvariant(ampmText.charCodeAt(0)));\n if (ampm !== '') {\n if (hour < 1 || hour > 12) return undefined;\n hour %= 12;\n if (ampm === 'P') hour += 12;\n } else if (hour > 23) {\n return undefined;\n }\n return {\n fraction: (hour * 3600 + minute * 60 + second) / 86_400,\n format: (s !== undefined ? 'h:mm:ss' : 'h:mm') + (ampm !== '' ? ' AM/PM' : ''),\n };\n}\n\nfunction defined(groups: Record<string, string | undefined> | undefined): Record<string, string | undefined> {\n if (groups === undefined) throw new Error('Internal: a pattern with named groups matched without them.');\n return groups;\n}\n\nfunction group(groups: Record<string, string | undefined>, name: string): string {\n const value = groups[name];\n if (value === undefined) throw new Error(`Internal: the group '${name}' matched without a value.`);\n return value;\n}\n", "import { productError } from '../dotnet';\n\n/**\n * A number carried as the unevaluated sum of two doubles, about 106 bits, normalised so that `high` is the\n * double nearest the sum. Every operation is the standard error-free one (Dekker, Knuth; the QD library's\n * accurate forms), so the result is the same on every platform. `CorrectlyRounded` computes its exponential and\n * logarithm in it before it rounds them.\n */\nexport class Wide {\n readonly high: number;\n readonly low: number;\n\n constructor(high: number, low = 0) {\n this.high = high;\n this.low = low;\n }\n\n /** a + b exactly (Knuth's two-sum). */\n static sum(a: number, b: number): Wide {\n const sum = a + b;\n const b2 = sum - a;\n return new Wide(sum, (a - (sum - b2)) + (b - b2));\n }\n\n /** a + b exactly, where |a| is at least |b| or a is 0. */\n static quickSum(a: number, b: number): Wide {\n const sum = a + b;\n return new Wide(sum, b - (sum - a));\n }\n\n /** a * b exactly, the rounding error recovered as a fused multiply-add recovers it. */\n static product(a: number, b: number): Wide {\n return new Wide(a * b, productError(a, b));\n }\n\n negate(): Wide {\n return new Wide(-this.high, -this.low);\n }\n\n plus(other: Wide | number): Wide {\n const b = typeof other === 'number' ? new Wide(other) : other;\n const high = Wide.sum(this.high, b.high);\n const low = Wide.sum(this.low, b.low);\n const sum = Wide.quickSum(high.high, high.low + low.high);\n return Wide.quickSum(sum.high, sum.low + low.low);\n }\n\n minus(other: Wide | number): Wide {\n const b = typeof other === 'number' ? new Wide(other) : other;\n return this.plus(b.negate());\n }\n\n times(other: Wide | number): Wide {\n const b = typeof other === 'number' ? new Wide(other) : other;\n const product = Wide.product(this.high, b.high);\n return Wide.quickSum(product.high, product.low + ((this.high * b.low) + (this.low * b.high)));\n }\n\n dividedBy(other: Wide | number): Wide {\n const b = typeof other === 'number' ? new Wide(other) : other;\n const first = this.high / b.high;\n let rest = this.minus(b.times(first));\n const second = rest.high / b.high;\n rest = rest.minus(b.times(second));\n const third = rest.high / b.high;\n return Wide.quickSum(first, second).plus(third);\n }\n}\n", "// e^x and ln x, each the exact value rounded once to the nearest double, ties to even: the same double on every\n// platform (C#'s CorrectlyRounded.cs). PV, FV and XNPV raise 1+rate to a number that is not whole by these.\n// Each is computed in double-double arithmetic (`Wide`), and rounded when no rounding boundary lies within its\n// error bound (2^-90); otherwise it is computed again in 256-bit fixed point.\nimport { bitDecrement, bitIncrement, bitsDouble, doubleBits, roundHalfToEven, scaleB } from '../dotnet';\nimport { Wide } from './wide';\n\n/** The bits of a whole number above 0 (`BigInteger.GetBitLength`); 0 for 0. */\nexport function bitLength(value: bigint): number {\n if (value < 0n) throw new Error('Internal: the bit length of a negative number is asked.');\n if (value === 0n) return 0;\n const hex = value.toString(16);\n return (hex.length - 1) * 4 + Number.parseInt(hex.charAt(0), 16).toString(2).length;\n}\n\n/** The relative error the double-double path is trusted to. */\nconst bound = 2 ** -90;\nconst inverseLn2 = Math.LOG2E;\nconst minNormal = 2.2250738585072014E-308;\nconst sqrt2 = Math.sqrt(2);\n\n// 256-bit fixed point: a BigInt n stands for n * 2^-256.\nconst scale = 256;\nconst fixedOne = 1n << BigInt(scale);\n\ninterface Constants {\n readonly fixedLn2: bigint;\n /** ln 2 as three doubles: the first 42 bits, so that a whole number below 2^11 times it is exact, then the next 53, then the next. */\n readonly ln2High: number;\n readonly ln2Low: number;\n readonly ln2Lowest: number;\n /** 1/ln 10 as a double-double. */\n readonly inverseLn10: Wide;\n /** 2/(2j+1), j = 0 to 24. */\n readonly atanhCoefficients: readonly Wide[];\n}\n\nlet constants: Constants | undefined;\n\n/** The constants, computed when first asked for, as C#'s static constructor computes them. */\nfunction constantsOf(): Constants {\n if (constants !== undefined) return constants;\n const fixedLn2 = atanh2(1n, 3n);\n const high = fixedLn2 >> BigInt(scale - 42);\n const ln2High = scaleB(Number(high), -42);\n let rest = fixedLn2 - (high << BigInt(scale - 42));\n const ln2Low = roundToDouble(rest, -scale);\n rest -= exactly(ln2Low, scale);\n const ln2Lowest = roundToDouble(rest, -scale);\n // ln 10 = 3 ln 2 + ln(5/4), and ln(5/4) = 2 atanh(1/9).\n const fixedInverseLn10 = (fixedOne << BigInt(scale)) / (3n * fixedLn2 + atanh2(1n, 9n));\n const inverseHigh = roundToDouble(fixedInverseLn10, -scale);\n const inverseLn10 = new Wide(inverseHigh, roundToDouble(fixedInverseLn10 - exactly(inverseHigh, scale), -scale));\n const atanhCoefficients: Wide[] = [];\n for (let j = 0; j < 25; j++) atanhCoefficients.push(new Wide(2).dividedBy(2 * j + 1));\n constants = { fixedLn2, ln2High, ln2Low, ln2Lowest, inverseLn10, atanhCoefficients };\n return constants;\n}\n\n/** e^`x`, correctly rounded. */\nexport function exp(x: number): number {\n if (Number.isNaN(x)) return x;\n if (x === 0) return 1;\n if (Math.abs(x) > 708) return expExact(x); // overflow, and results near or below the smallest normal double\n const { ln2High, ln2Low, ln2Lowest } = constantsOf();\n const k = roundHalfToEven(x * inverseLn2);\n // x - k*ln2 as a double-double: k*ln2High is exact, and so is the subtraction.\n const reduced = new Wide(x - k * ln2High).minus(Wide.product(k, ln2Low)).minus(new Wide(k * ln2Lowest));\n // e^r = (e^(r/16))^16, e^(r/16) by its Taylor series to 2^-113.\n const s = reduced.times(1 / 16);\n let power = new Wide(1);\n for (let j = 14; j >= 1; j--) power = new Wide(1).plus(s.times(power).dividedBy(j));\n for (let i = 0; i < 4; i++) power = power.times(power);\n const rounded = roundedOf(power);\n return rounded === undefined ? expExact(x) : scaleB(rounded, k);\n}\n\n/** ln `x`, correctly rounded. */\nexport function log(x: number): number {\n if (Number.isNaN(x) || x < 0) return NaN;\n if (x === 0) return -Infinity;\n if (x === Infinity) return x;\n if (x === 1) return 0;\n if (x < minNormal) return logExact(x);\n const rounded = roundedOf(wideLog(x));\n return rounded === undefined ? logExact(x) : rounded;\n}\n\n/**\n * log10 `x`, correctly rounded, where the double-double path rounds it surely; `undefined` for a subnormal x and the\n * rare argument near a rounding boundary, which portable-math.ts's `log10` computes again.\n */\nexport function tryLog10(x: number): number | undefined {\n if (x === 1) return 0;\n if (!(x >= minNormal) || !Number.isFinite(x)) return undefined;\n return roundedOf(wideLog(x).times(constantsOf().inverseLn10));\n}\n\n/** ln `x` in double-double, for a normal, finite x above 0. */\nfunction wideLog(x: number): Wide {\n const { ln2High, ln2Low, ln2Lowest, atanhCoefficients } = constantsOf();\n // x = m * 2^e with m in [sqrt(1/2), sqrt(2)]; ln m = 2 atanh(s), s = (m-1)/(m+1), |s| < 0.172.\n const bits = doubleBits(x);\n let e = Number((bits >> 52n) & 0x7FFn) - 1023;\n let m = bitsDouble((bits & 0xFFFFFFFFFFFFFn) | 0x3FF0000000000000n);\n if (m > sqrt2) {\n m /= 2;\n e++;\n }\n const s = new Wide(m - 1).dividedBy(Wide.sum(m, 1)); // m - 1 is exact (Sterbenz)\n const t = s.times(s);\n let series = atanhCoefficients[atanhCoefficients.length - 1] as Wide; // oxlint-disable-line typescript/no-unsafe-type-assertion -- 25 coefficients\n for (let j = atanhCoefficients.length - 2; j >= 0; j--) series = (atanhCoefficients[j] as Wide).plus(t.times(series)); // oxlint-disable-line typescript/no-unsafe-type-assertion -- j is within them\n return s.times(series).plus(new Wide(e * ln2High)).plus(Wide.product(e, ln2Low)).plus(new Wide(e * ln2Lowest));\n}\n\n/** The double nearest `value`, when every number within `bound` of it rounds to that same double; `undefined` where a boundary lies so close that the error could cross it. */\nfunction roundedOf(value: Wide): number | undefined {\n const neighbour = value.low >= 0 ? bitIncrement(value.high) : bitDecrement(value.high);\n const halfGap = Math.abs(neighbour - value.high) / 2;\n const error = bound * Math.abs(value.high);\n return Math.abs(value.low) + error < halfGap && error < halfGap / 2 ? value.high : undefined;\n}\n\n/** e^`x` computed in 256-bit fixed point and rounded once. */\nexport function expExact(x: number): number {\n if (Number.isNaN(x)) return x;\n if (x === Infinity || x > 710) return Infinity;\n if (x === -Infinity || x < -746) return 0;\n if (Math.abs(x) < 2 ** -60) return 1; // e^x lies within 2^-60 of 1, which is the nearest double\n const { fixedLn2 } = constantsOf();\n const f = exactly(x, scale);\n const k = roundHalfToEven(x / Math.LN2);\n const r = f - BigInt(k) * fixedLn2;\n let sum = 0n;\n let term = fixedOne;\n for (let j = 1n; term !== 0n; j++) {\n sum += term;\n term = (term * r) / (fixedOne * j);\n }\n return roundToDouble(sum, k - scale);\n}\n\n/** ln `x` computed in 256-bit fixed point and rounded once. */\nexport function logExact(x: number): number {\n if (Number.isNaN(x) || x < 0) return NaN;\n if (x === 0) return -Infinity;\n if (x === Infinity) return x;\n const { fixedLn2 } = constantsOf();\n const { significand, exponent } = decompose(x);\n const length = bitLength(significand);\n const k = exponent + length - 1; // x = y * 2^k, y in [1, 2)\n const top = 1n << BigInt(length - 1);\n return roundToDouble(BigInt(k) * fixedLn2 + atanh2(significand - top, significand + top), -scale);\n}\n\n/** 2 atanh(n/d) = ln((d+n)/(d-n)) in fixed point, for 0 <= n/d <= 1/3. */\nfunction atanh2(n: bigint, d: bigint): bigint {\n const z = (n << BigInt(scale)) / d;\n const z2 = (z * z) / fixedOne;\n let term = z;\n let sum = 0n;\n for (let k = 1n; term !== 0n; k += 2n) {\n sum += term / k;\n term = (term * z2) / fixedOne;\n }\n return 2n * sum;\n}\n\n/** A finite double as significand * 2^exponent, the significand a whole number. */\nexport function decompose(x: number): { significand: bigint; exponent: number } {\n const bits = doubleBits(Math.abs(x));\n const biased = Number((bits >> 52n) & 0x7FFn);\n const fraction = bits & 0xFFFFFFFFFFFFFn;\n return biased === 0 ? { significand: fraction, exponent: -1074 } : { significand: fraction | (1n << 52n), exponent: biased - 1075 };\n}\n\n/** `x` times 2^`shift`, truncated toward zero to a whole number. */\nfunction exactly(x: number, shift: number): bigint {\n const { significand, exponent } = decompose(x);\n const scaled = exponent + shift >= 0 ? significand << BigInt(exponent + shift) : significand >> BigInt(-(exponent + shift));\n return x < 0 ? -scaled : scaled;\n}\n\n/** The double nearest `m` * 2^`e`, ties to even, subnormal and infinite results included. */\nexport function roundToDouble(m: bigint, e: number): number {\n if (m === 0n) return 0;\n const negative = m < 0n;\n const a = negative ? -m : m;\n const length = bitLength(a);\n const top = e + length - 1; // a * 2^e lies in [2^top, 2^(top+1))\n if (top > 1023) return negative ? -Infinity : Infinity;\n const precision = top >= -1022 ? 53 : 53 - (-1022 - top);\n const shift = length - precision;\n let kept: bigint;\n if (shift <= 0) kept = a;\n else {\n kept = a >> BigInt(shift);\n const rest = a - (kept << BigInt(shift));\n const half = 1n << BigInt(shift - 1);\n if (rest > half || (rest === half && (kept & 1n) === 1n)) kept += 1n;\n }\n const result = scaleB(Number(kept), e + Math.max(shift, 0));\n return negative ? -result : result;\n}\n", "// A binary number of any size, m \u00D7 2^e with a BigInt m, carried to a chosen precision, and the elementary\n// functions on it (C#'s BigReal.cs). `CorrectlyRounded` computes the functions the platform's math library would\n// otherwise answer \u2014 each library its own last bit \u2014 in it, and rounds the result once.\nimport { bitLength, decompose, roundToDouble } from './correctly-rounded';\n\n/** m \u00D7 2^e. Addition and subtraction are exact; every other operation keeps `precision` bits, truncated toward zero. */\nexport class BigReal {\n readonly m: bigint;\n readonly e: number;\n\n constructor(m: bigint, e: number) {\n this.m = m;\n this.e = e;\n }\n\n static readonly zero = new BigReal(0n, 0);\n static readonly one = new BigReal(1n, 0);\n\n /** A finite double, exactly. */\n static of(x: number): BigReal {\n if (!Number.isFinite(x)) throw new RangeError(`${String(x)} is no finite number.`);\n if (x === 0) return BigReal.zero;\n const { significand, exponent } = decompose(x);\n return new BigReal(x < 0 ? -significand : significand, exponent);\n }\n\n /** A whole number, exactly. */\n static whole(n: number | bigint): BigReal {\n return new BigReal(BigInt(n), 0);\n }\n\n get sign(): number {\n return this.m > 0n ? 1 : this.m < 0n ? -1 : 0;\n }\n\n /** The power of two of the leading bit: the number lies in [2^top, 2^(top+1)) in magnitude. */\n get top(): number {\n return this.m === 0n ? -Infinity : this.e + bitLength(this.m < 0n ? -this.m : this.m) - 1;\n }\n\n /** The double nearest, ties to even. */\n toDouble(): number {\n return roundToDouble(this.m, this.e);\n }\n\n negated(): BigReal {\n return new BigReal(-this.m, this.e);\n }\n\n abs(): BigReal {\n return this.m < 0n ? this.negated() : this;\n }\n\n /** This times 2^`n`, exactly. */\n scaled(n: number): BigReal {\n return new BigReal(this.m, this.e + n);\n }\n\n plus(other: BigReal): BigReal {\n if (this.m === 0n) return other;\n if (other.m === 0n) return this;\n const e = Math.min(this.e, other.e);\n return new BigReal((this.m << BigInt(this.e - e)) + (other.m << BigInt(other.e - e)), e);\n }\n\n minus(other: BigReal): BigReal {\n return this.plus(other.negated());\n }\n\n /** Kept to `precision` bits, truncated toward zero. */\n kept(precision: number): BigReal {\n const magnitude = this.m < 0n ? -this.m : this.m;\n const excess = bitLength(magnitude) - precision;\n if (excess <= 0) return this;\n const shifted = magnitude >> BigInt(excess);\n return new BigReal(this.m < 0n ? -shifted : shifted, this.e + excess);\n }\n\n times(other: BigReal, precision: number): BigReal {\n return new BigReal(this.m * other.m, this.e + other.e).kept(precision);\n }\n\n dividedBy(other: BigReal, precision: number): BigReal {\n if (other.m === 0n) throw new RangeError('Internal: a BigReal is divided by 0.');\n if (this.m === 0n) return BigReal.zero;\n const n = this.m < 0n ? -this.m : this.m;\n const d = other.m < 0n ? -other.m : other.m;\n const shift = Math.max(0, precision + bitLength(d) - bitLength(n) + 1);\n const q = (n << BigInt(shift)) / d;\n const negative = (this.m < 0n) !== (other.m < 0n);\n return new BigReal(negative ? -q : q, this.e - other.e - shift).kept(precision);\n }\n\n /** The square root of a number not below 0. */\n sqrt(precision: number): BigReal {\n if (this.m < 0n) throw new RangeError('Internal: the square root of a negative BigReal is asked.');\n if (this.m === 0n) return BigReal.zero;\n let shift = Math.max(0, 2 * precision + 2 - bitLength(this.m));\n if ((this.e - shift) % 2 !== 0) shift++;\n return new BigReal(isqrt(this.m << BigInt(shift)), (this.e - shift) / 2).kept(precision);\n }\n\n compare(other: BigReal): number {\n const difference = this.minus(other);\n return difference.sign;\n }\n}\n\n/** The whole square root, rounded down, of a whole number above 0 (Newton's method from above). */\nfunction isqrt(n: bigint): bigint {\n let x = 1n << BigInt(Math.ceil(bitLength(n) / 2));\n for (;;) {\n const y = (x + n / x) >> 1n;\n if (y >= x) return x;\n x = y;\n }\n}\n\n// ---- The functions, each to `p` bits with an error of a few of its last bits ----------------------------------\n\nconst ln2Cache = new Map<number, BigReal>();\nconst piCache = new Map<number, BigReal>();\nconst ln10Cache = new Map<number, BigReal>();\n\n/** s + s^3/3 + s^5/5 + \u2026, atanh s, for |s| at most 1/3. */\nfunction atanhSeries(s: BigReal, p: number): BigReal {\n const s2 = s.times(s, p);\n let term = s;\n let sum = BigReal.zero;\n for (let k = 1n; term.m !== 0n && term.top > s.top - p - 4; k += 2n) {\n sum = sum.plus(term.dividedBy(BigReal.whole(k), p)).kept(p + 8);\n term = term.times(s2, p);\n }\n return sum;\n}\n\n/** s - s^3/3 + s^5/5 - \u2026, atan s, for |s| at most 1/8. */\nfunction atanSeries(s: BigReal, p: number): BigReal {\n const s2 = s.times(s, p).negated();\n let term = s;\n let sum = BigReal.zero;\n for (let k = 1n; term.m !== 0n && term.top > s.top - p - 4; k += 2n) {\n sum = sum.plus(term.dividedBy(BigReal.whole(k), p)).kept(p + 8);\n term = term.times(s2, p);\n }\n return sum;\n}\n\n/** ln 2 to `p` bits: 2 atanh(1/3). */\nexport function ln2(p: number): BigReal {\n const known = ln2Cache.get(p);\n if (known !== undefined) return known;\n const value = atanhSeries(BigReal.one.dividedBy(BigReal.whole(3), p + 8), p + 8).scaled(1).kept(p);\n ln2Cache.set(p, value);\n return value;\n}\n\n/** pi to `p` bits: Machin's 16 atan(1/5) - 4 atan(1/239). */\nexport function pi(p: number): BigReal {\n const known = piCache.get(p);\n if (known !== undefined) return known;\n const q = p + 8;\n const fifth = atanAnySmall(BigReal.one.dividedBy(BigReal.whole(5), q), q);\n const rest = atanSeries(BigReal.one.dividedBy(BigReal.whole(239), q), q);\n const value = fifth.scaled(4).minus(rest.scaled(2)).kept(p);\n piCache.set(p, value);\n return value;\n}\n\n/** atan s for |s| at most 1/4, by one halving and the series. */\nfunction atanAnySmall(s: BigReal, p: number): BigReal {\n return atanSeries(halved(s, p), p).scaled(1);\n}\n\n/** tan(a/2) from tan a = s: s / (1 + sqrt(1 + s^2)). */\nfunction halved(s: BigReal, p: number): BigReal {\n return s.dividedBy(BigReal.one.plus(BigReal.one.plus(s.times(s, p)).sqrt(p)), p);\n}\n\n/** ln x for x above 0. */\nexport function ln(x: BigReal, p: number): BigReal {\n if (x.m <= 0n) throw new RangeError('Internal: the logarithm of a BigReal not above 0 is asked.');\n // x = y * 2^k with y in [1/sqrt 2, sqrt 2): the top 54 bits tell which side of sqrt 2 y lies on well enough.\n let k = x.top;\n let y = x.scaled(-k);\n if (y.kept(54).toDouble() > Math.SQRT2) {\n k++;\n y = y.scaled(-1);\n }\n const s = y.minus(BigReal.one).dividedBy(y.plus(BigReal.one), p + 4);\n const logarithm = atanhSeries(s, p + 4).scaled(1);\n return k === 0 ? logarithm.kept(p) : logarithm.plus(ln2(p + 16).times(BigReal.whole(k), p + 16)).kept(p);\n}\n\n/** ln(1 + u) for u above -1, as exact relative to u as to 1. */\nexport function ln1p(u: BigReal, p: number): BigReal {\n if (u.m === 0n) return BigReal.zero;\n if (u.top < -1) return atanhSeries(u.dividedBy(u.plus(BigReal.whole(2)), p + 4), p + 4).scaled(1).kept(p);\n return ln(BigReal.one.plus(u), p);\n}\n\n/** ln 10 to `p` bits. */\nfunction ln10(p: number): BigReal {\n const known = ln10Cache.get(p);\n if (known !== undefined) return known;\n const value = ln(BigReal.whole(10), p);\n ln10Cache.set(p, value);\n return value;\n}\n\n/** log10 x for x above 0. */\nexport function log10(x: BigReal, p: number): BigReal {\n return ln(x, p + 4).dividedBy(ln10(p + 4), p);\n}\n\n/** e^x for |x| below 2^20. */\nexport function exp(x: BigReal, p: number): BigReal {\n if (x.m === 0n) return BigReal.one;\n if (x.top > 20) throw new RangeError('Internal: e^x is asked of a BigReal too large.');\n const q = p + 32;\n const k = Math.round(x.kept(54).toDouble() / Math.LN2);\n const r = k === 0 ? x : x.minus(ln2(q + 24).times(BigReal.whole(k), q + 24)).kept(q);\n // e^r = (e^(r/256))^256, e^(r/256) by its Taylor series.\n const s = r.scaled(-8);\n let term = BigReal.one;\n let sum = BigReal.zero;\n for (let j = 1n; term.m !== 0n && term.top > -q - 4; j++) {\n sum = sum.plus(term).kept(q + 8);\n term = term.times(s, q).dividedBy(BigReal.whole(j), q);\n }\n let power = sum;\n for (let i = 0; i < 8; i++) power = power.times(power, q);\n return power.scaled(k).kept(p);\n}\n\n/** e^x - 1 for |x| below 1, as exact relative to the result as e^x is. */\nexport function expm1(x: BigReal, p: number): BigReal {\n if (x.m === 0n) return BigReal.zero;\n if (x.top >= 0) return exp(x, p + 4).minus(BigReal.one).kept(p);\n let term = x;\n let sum = BigReal.zero;\n for (let j = 2n; term.m !== 0n && term.top > x.top - p - 6; j++) {\n sum = sum.plus(term).kept(p + 8);\n term = term.times(x, p + 4).dividedBy(BigReal.whole(j), p + 4);\n }\n return sum.kept(p);\n}\n\n/** atan x. */\nexport function atan(x: BigReal, p: number): BigReal {\n if (x.m === 0n) return BigReal.zero;\n const q = p + 12;\n const a = x.abs();\n let result: BigReal;\n if (a.compare(BigReal.one) > 0) {\n // pi/2 - atan(1/a), at least pi/4.\n result = pi(q).scaled(-1).minus(atanReduced(BigReal.one.dividedBy(a, q), q));\n } else {\n result = atanReduced(a, q);\n }\n return (x.m < 0n ? result.negated() : result).kept(p);\n}\n\n/** atan a for 0 <= a <= 1: three halvings bring it below tan(pi/32), where the series converges fast. */\nfunction atanReduced(a: BigReal, q: number): BigReal {\n let s = a;\n for (let i = 0; i < 3; i++) s = halved(s, q);\n return atanSeries(s, q).scaled(3);\n}\n\n/** sinh x for |x| below 2^20. */\nexport function sinh(x: BigReal, p: number): BigReal {\n if (x.top < 0) {\n // x + x^3/3! + x^5/5! + \u2026, with no cancellation.\n const x2 = x.times(x, p + 4);\n let term = x;\n let sum = BigReal.zero;\n for (let j = 2n; term.m !== 0n && term.top > x.top - p - 6; j += 2n) {\n sum = sum.plus(term).kept(p + 8);\n term = term.times(x2, p + 4).dividedBy(BigReal.whole(j * (j + 1n)), p + 4);\n }\n return sum.kept(p);\n }\n const ex = exp(x, p + 4);\n return ex.minus(BigReal.one.dividedBy(ex, p + 4)).scaled(-1).kept(p);\n}\n\n/** cosh x for |x| below 2^20. */\nexport function cosh(x: BigReal, p: number): BigReal {\n const ex = exp(x, p + 4);\n return ex.plus(BigReal.one.dividedBy(ex, p + 4)).scaled(-1).kept(p);\n}\n\n/** tanh x for |x| below 2^20. */\nexport function tanh(x: BigReal, p: number): BigReal {\n const a = x.abs();\n // (e^2a - 1) / (e^2a + 1), its numerator from e^2a - 1 as exact relative to itself as e^2a.\n const m1 = a.top < -1 ? expm1(a.scaled(1), p + 4) : exp(a.scaled(1), p + 8).minus(BigReal.one);\n const result = m1.dividedBy(m1.plus(BigReal.whole(2)), p);\n return x.m < 0n ? result.negated() : result;\n}\n\n/** asinh x. */\nexport function asinh(x: BigReal, p: number): BigReal {\n const a = x.abs();\n const q = p + 8;\n const a2 = a.times(a, q);\n const root = BigReal.one.plus(a2).sqrt(q);\n const result = a.top < 0\n ? ln1p(a.plus(a2.dividedBy(BigReal.one.plus(root), q)), p)\n : ln(a.plus(root), p);\n return x.m < 0n ? result.negated() : result;\n}\n\n/** acosh x for x at least 1. */\nexport function acosh(x: BigReal, p: number): BigReal {\n const t = x.minus(BigReal.one);\n if (t.m < 0n) throw new RangeError('Internal: acosh is asked of a BigReal below 1.');\n const q = p + 8;\n if (t.top < 0) return ln1p(t.plus(t.times(t.plus(BigReal.whole(2)), q).sqrt(q)), p);\n return ln(x.plus(x.times(x, 2 * q).minus(BigReal.one).sqrt(q)), p);\n}\n\n/** atanh x for |x| below 1: half ln(1 + 2|x|/(1 - |x|)). */\nexport function atanh(x: BigReal, p: number): BigReal {\n const a = x.abs();\n const result = ln1p(a.scaled(1).dividedBy(BigReal.one.minus(a), p + 8), p + 4).scaled(-1).kept(p);\n return x.m < 0n ? result.negated() : result;\n}\n\n/** asin x for |x| below 1: atan(x / sqrt((1 - x)(1 + x))). */\nexport function asin(x: BigReal, p: number): BigReal {\n const q = p + 8;\n const cosine = BigReal.one.minus(x).times(BigReal.one.plus(x), q).sqrt(q);\n return atan(x.dividedBy(cosine, q), p);\n}\n\n/** acos x for |x| below 1: 2 atan(sqrt((1 - x)/(1 + x))). */\nexport function acos(x: BigReal, p: number): BigReal {\n const q = p + 8;\n return atan(BigReal.one.minus(x).dividedBy(BigReal.one.plus(x), q).sqrt(q), q).scaled(1).kept(p);\n}\n\n/** The angle of (x, y), neither 0: atan(|y|/|x|), from pi when x is negative, with y's sign. */\nexport function atan2(y: BigReal, x: BigReal, p: number): BigReal {\n const q = p + 8;\n const angle = atan(y.abs().dividedBy(x.abs(), q), q);\n const result = x.m < 0n ? pi(q).minus(angle) : angle;\n return (y.m < 0n ? result.negated() : result).kept(p);\n}\n", "// The functions a platform's math library answers, each its own last bit \u2014 V8's, glibc's and Apple's differ \u2014\n// answered here as the exact value rounded once to the nearest double, ties to even, so that every browser and\n// the server give one double (C#'s PortableMath.cs). Each is computed in `BigReal` to 128 bits and rounded when\n// every number within its error rounds alike; otherwise to twice the bits, and so on (Ziv's strategy). e^x and\n// ln x, which are asked far more often, keep `CorrectlyRounded`'s double-double path.\nimport * as big from './big-real';\nimport { BigReal } from './big-real';\nimport { bitLength, decompose, exp as correctlyRoundedExp, log as correctlyRoundedLog, roundToDouble, tryLog10 } from './correctly-rounded';\n\n/** The bits at the end of a result its computation may have got wrong: far more than any function here loses. */\nconst slackBits = 24;\n\n/** The double nearest the value `compute` approximates to the bits it is asked for. */\nfunction rounded(compute: (precision: number) => BigReal): number {\n for (let precision = 128; precision <= 4096; precision *= 2) {\n const value = compute(precision);\n if (value.m === 0n) return 0;\n const slack = ((value.m < 0n ? -value.m : value.m) >> BigInt(precision - slackBits)) + 1n;\n const low = roundToDouble(value.m - slack, value.e);\n const high = roundToDouble(value.m + slack, value.e);\n if (low === high) return low;\n }\n throw new Error('Internal: a function lies too close to a rounding boundary to round at 4096 bits.');\n}\n\nexport const exp = correctlyRoundedExp;\nexport const log = correctlyRoundedLog;\n\n/** log10 x for x above 0; 10^k is k exactly. */\nexport function log10(x: number): number {\n if (!(x > 0) || !Number.isFinite(x)) throw new RangeError(`Internal: log10 is asked of ${String(x)}.`);\n const fast = tryLog10(x);\n return fast === undefined ? rounded(p => big.log10(BigReal.of(x), p)) : fast;\n}\n\nexport function atan(x: number): number {\n return x === 0 ? x : rounded(p => big.atan(BigReal.of(x), p));\n}\n\n/** atan2(y, x) as `Math.atan2` answers it at a 0: (0, x > 0) is 0, (0, x < 0) is pi, (y, 0) is pi/2 with y's sign. */\nexport function atan2(y: number, x: number): number {\n if (y === 0) return x >= 0 && !Object.is(x, -0) ? y : Object.is(y, -0) ? -rounded(p => big.pi(p)) : rounded(p => big.pi(p));\n if (x === 0) return rounded(p => big.pi(p).scaled(-1)) * Math.sign(y);\n return rounded(p => big.atan2(BigReal.of(y), BigReal.of(x), p));\n}\n\n/** asin x for |x| at most 1. */\nexport function asin(x: number): number {\n if (Math.abs(x) === 1) return rounded(p => big.pi(p).scaled(-1)) * x;\n return x === 0 ? x : rounded(p => big.asin(BigReal.of(x), p));\n}\n\n/** acos x for |x| at most 1. */\nexport function acos(x: number): number {\n if (x === 1) return 0;\n if (x === -1) return rounded(p => big.pi(p));\n return rounded(p => big.acos(BigReal.of(x), p));\n}\n\n/** The magnitude past which sinh and cosh overflow every double. */\nconst hyperbolicOverflow = 711;\n\nexport function sinh(x: number): number {\n if (x === 0) return x;\n if (Math.abs(x) > hyperbolicOverflow) return x > 0 ? Infinity : -Infinity;\n return rounded(p => big.sinh(BigReal.of(x), p));\n}\n\nexport function cosh(x: number): number {\n if (Math.abs(x) > hyperbolicOverflow) return Infinity;\n return rounded(p => big.cosh(BigReal.of(x), p));\n}\n\n/** tanh x; past 22 in magnitude it lies within 2^-63 of 1 and rounds to it. */\nexport function tanh(x: number): number {\n if (x === 0) return x;\n if (Math.abs(x) >= 22) return Math.sign(x);\n return rounded(p => big.tanh(BigReal.of(x), p));\n}\n\nexport function asinh(x: number): number {\n return x === 0 ? x : rounded(p => big.asinh(BigReal.of(x), p));\n}\n\n/** acosh x for x at least 1. */\nexport function acosh(x: number): number {\n return rounded(p => big.acosh(BigReal.of(x), p));\n}\n\n/** atanh x for |x| below 1. */\nexport function atanh(x: number): number {\n return x === 0 ? x : rounded(p => big.atanh(BigReal.of(x), p));\n}\n\n/**\n * `a`^`b` for a whole number `b`, as `Math.pow` answers it at 0, 1 and past the doubles' range, and otherwise\n * the exact power rounded once: counted exactly where |b| is at most 64, and as e^(b ln |a|) beyond.\n */\nexport function powWhole(a: number, b: number): number {\n if (!Number.isInteger(b)) throw new RangeError(`Internal: ${String(b)} is no whole power.`);\n if (b === 0) return 1;\n // One operation each, which IEEE arithmetic rounds correctly: a square, a reciprocal, and a power of ten whose 10^|b| is exact.\n if (b === 1) return a;\n if (b === 2) return a * a;\n if (b === -1) return 1 / a;\n if (Math.abs(a) === 10 && Math.abs(b) <= 22) {\n const exact = Number(`1e${String(Math.abs(b))}`);\n const tenth = b > 0 ? exact : 1 / exact;\n return a < 0 && Math.abs(b % 2) === 1 ? -tenth : tenth;\n }\n const odd = Math.abs(b % 2) === 1;\n const negative = a < 0 && odd;\n if (a === 0) return b > 0 ? (Object.is(a, -0) && odd ? -0 : 0) : (Object.is(a, -0) && odd ? -Infinity : Infinity);\n const magnitude = Math.abs(a);\n if (magnitude === 1) return negative ? -1 : 1;\n // Past the doubles' range at once: 2^1100 overflows and 2^-1180 underflows every double. The platform's log2 only\n // places the number on one side of a line far from the range's ends, which its last bit cannot move.\n const log2 = Math.log2(magnitude) * b;\n if (log2 > 1100) return negative ? -Infinity : Infinity;\n if (log2 < -1180) return negative ? -0 : 0;\n const { significand, exponent } = decompose(magnitude);\n const twos = trailingZeros(significand);\n const oddPart = significand >> BigInt(twos);\n const power = exponent + twos;\n let result: number;\n if (oddPart === 1n) {\n result = roundToDouble(1n, power * b);\n } else if (Math.abs(b) <= 64) {\n const n = oddPart ** BigInt(Math.abs(b));\n if (b > 0) {\n result = roundToDouble(n, power * b);\n } else {\n // 2^(power b) / n with 64 bits more than a double holds, and a sticky bit for any remainder.\n const shift = bitLength(n) + 64;\n const numerator = 1n << BigInt(shift);\n const quotient = numerator / n;\n const sticky = numerator % n === 0n ? 0n : 1n;\n result = roundToDouble((quotient << 1n) | sticky, power * b - shift - 1);\n }\n } else {\n result = rounded(p => big.exp(big.ln(BigReal.of(magnitude), p + 16).times(BigReal.whole(b), p + 16), p));\n }\n return negative ? -result : result;\n}\n\nfunction trailingZeros(n: bigint): number {\n let count = 0;\n let rest = n;\n while ((rest & 1n) === 0n) {\n rest >>= 1n;\n count++;\n }\n return count;\n}\n", "// The places where Excel's arithmetic is not plain IEEE arithmetic, as it was observed (ADR-0047, \"Observed in\n// Excel\" and its second and third runs). Excel computes in doubles, and then adjusts: a final addition or\n// subtraction that nearly cancels is 0, and so is SUM's last addition; a comparison of two numbers is made at\n// Excel's precision; and a power whose exponent is not whole is e^(b ln a), not the correctly rounded power,\n// except a square root. A whole power is the exact power rounded once, which is the engine's choice: no whole\n// power Excel was asked tells it from another. No power calls the platform's math library (ADR-0047, \"The\n// platform's math library is not used\").\nimport { formatExponential } from '../dotnet';\nimport { exp, log, powWhole } from './portable-math';\n\n/** 2^-49: a final addition whose operands are closer than this, relative to each, is 0. */\nexport const cancelTolerance = 1 / 562949953421312;\n\n/**\n * Whether two numbers are equal at Excel's precision: identical, or the same when each is rounded to 15\n * significant digits. `=0.1+0.2=0.3` and `=1+4.8E-15=1` are TRUE in Excel; `=1+5E-15=1` and `=9+3E-14=9` are FALSE.\n */\nexport function approximatelyEqual(a: number, b: number): boolean {\n return a === b || atFifteenDigits(a) === atFifteenDigits(b);\n}\n\n/** A number rounded to 15 significant digits: .NET formats the exact decimal value of the double and rounds a midpoint away from zero. */\nexport function atFifteenDigits(x: number): number {\n return Number.isFinite(x) ? Number(formatExponential(x, 14)) : x;\n}\n\nfunction near(a: number, b: number, tolerance: number): boolean {\n if (a === b) return true;\n if (a === 0 || b === 0) return false;\n const difference = Math.abs(a - b);\n return difference < Math.abs(a) * tolerance && difference < Math.abs(b) * tolerance;\n}\n\n/**\n * A Formula's last operation, when it is an addition (a subtraction is the addition of the negated operand),\n * and SUM's last addition: 0 when the operands have opposite signs and are closer than 2^-49 of each, the\n * plain sum otherwise. Excel does this to the last operation only.\n */\nexport function finalAdd(a: number, b: number): number {\n const opposite = (a > 0 && b < 0) || (a < 0 && b > 0);\n return opposite && near(a, -b, cancelTolerance) ? 0 : a + b;\n}\n\n/**\n * `a^b`, or `undefined` where it has no real answer (`#NUM!`). An integer exponent is the exact power rounded\n * once, and an exponent of 0.5 is the square root, correctly rounded (ARITH-133). Any other exponent of a positive\n * base is e^(b ln a), as Excel's is, e^x and ln x each correctly rounded: `=8^(1/3)` is 1.9999999999999998. A negative base with an exponent that is the\n * reciprocal of an odd integer has a real answer, \u2212e^(ln(\u2212a) b); other fractional exponents of a negative base\n * are `#NUM!`.\n */\nexport function power(a: number, b: number): number | undefined {\n if (b === Math.floor(b)) return powWhole(a, b);\n if (a === 0) return b > 0 ? 0 : Infinity;\n if (a > 0) return b === 0.5 ? Math.sqrt(a) : exp(log(a) * b);\n const root = 1 / b;\n if (Number.isFinite(root) && root === Math.floor(root) && Math.abs(root % 2) === 1) return -exp(log(-a) * b);\n return undefined;\n}\n", "import { ignoreCaseKey } from '../dotnet';\n\n/**\n * The names of Excel's worksheet functions that ExSheet does not declare (`docs/specs/exsheet-functions/spec.md`).\n * A call of one of them is refused, its Formula a Refused Formula, which no Formula catches (2026-10-13, decided\n * with the user): Excel answers it, and an ordinary `#NAME?` that `IFERROR` caught would answer otherwise. A name\n * Excel does not have, a typo, stays an ordinary `#NAME?`.\n */\nexport const excelFunctionNames: readonly string[] = [\n 'ACCRINT', 'ACCRINTM', 'ADDRESS', 'AMORDEGRC', 'AMORLINC', 'ARABIC', 'AREAS', 'ARRAYTOTEXT', 'ASC', 'AVEDEV',\n 'AVERAGEA', 'BAHTTEXT', 'BASE', 'BESSELI', 'BESSELJ', 'BESSELK', 'BESSELY', 'BETA.DIST', 'BETA.INV', 'BETADIST',\n 'BETAINV', 'BIN2DEC', 'BIN2HEX', 'BIN2OCT', 'BINOM.DIST', 'BINOM.DIST.RANGE', 'BINOM.INV', 'BINOMDIST', 'BITAND',\n 'BITLSHIFT', 'BITOR', 'BITRSHIFT', 'BITXOR', 'BYCOL', 'BYROW', 'CALL', 'CEILING', 'CEILING.PRECISE', 'CELL',\n 'CHAR', 'CHIDIST', 'CHIINV', 'CHISQ.DIST', 'CHISQ.DIST.RT', 'CHISQ.INV', 'CHISQ.INV.RT', 'CHISQ.TEST', 'CHITEST',\n 'CHOOSECOLS', 'CHOOSEROWS', 'CLEAN', 'CODE', 'COMBIN', 'COMBINA', 'COMPLEX', 'CONFIDENCE', 'CONFIDENCE.NORM',\n 'CONFIDENCE.T', 'CONVERT', 'COPILOT', 'CORREL', 'COUPDAYBS', 'COUPDAYS', 'COUPDAYSNC', 'COUPNCD', 'COUPNUM',\n 'COUPPCD', 'COVAR', 'COVARIANCE.P', 'COVARIANCE.S', 'CRITBINOM', 'CUBEKPIMEMBER', 'CUBEMEMBER',\n 'CUBEMEMBERPROPERTY', 'CUBERANKEDMEMBER', 'CUBESET', 'CUBESETCOUNT', 'CUBEVALUE', 'CUMIPMT', 'CUMPRINC',\n 'DATEVALUE', 'DAVERAGE', 'DAYS360', 'DB', 'DBCS', 'DCOUNT', 'DCOUNTA', 'DDB', 'DEC2BIN', 'DEC2HEX', 'DEC2OCT',\n 'DECIMAL', 'DELTA', 'DETECTLANGUAGE', 'DEVSQ', 'DGET', 'DISC', 'DMAX', 'DMIN', 'DOLLAR', 'DOLLARDE', 'DOLLARFR',\n 'DPRODUCT', 'DROP', 'DSTDEV', 'DSTDEVP', 'DSUM', 'DURATION', 'DVAR', 'DVARP', 'ECMA.CEILING', 'EFFECT',\n 'ENCODEURL', 'ERF', 'ERF.PRECISE', 'ERFC', 'ERFC.PRECISE', 'EUROCONVERT', 'EVEN', 'EXPAND', 'EXPON.DIST',\n 'EXPONDIST', 'F.DIST', 'F.DIST.RT', 'F.INV', 'F.INV.RT', 'F.TEST', 'FACT', 'FACTDOUBLE', 'FALSE', 'FDIST',\n 'FIELDVALUE', 'FILTERXML', 'FINDB', 'FINV', 'FISHER', 'FISHERINV', 'FIXED', 'FLOOR', 'FLOOR.PRECISE', 'FORECAST',\n 'FORECAST.ETS', 'FORECAST.ETS.CONFINT', 'FORECAST.ETS.SEASONALITY', 'FORECAST.ETS.STAT', 'FORECAST.LINEAR',\n 'FORMULATEXT', 'FREQUENCY', 'FTEST', 'FVSCHEDULE', 'GAMMA', 'GAMMA.DIST', 'GAMMA.INV', 'GAMMADIST', 'GAMMAINV',\n 'GAMMALN', 'GAMMALN.PRECISE', 'GAUSS', 'GCD', 'GEOMEAN', 'GESTEP', 'GETPIVOTDATA', 'GROUPBY', 'GROWTH', 'HARMEAN',\n 'HEX2BIN', 'HEX2DEC', 'HEX2OCT', 'HSTACK', 'HYPERLINK', 'HYPGEOM.DIST', 'HYPGEOMDIST', 'IMABS', 'IMAGE',\n 'IMAGINARY', 'IMARGUMENT', 'IMCONJUGATE', 'IMCOS', 'IMCOSH', 'IMCOT', 'IMCSC', 'IMCSCH', 'IMDIV', 'IMEXP', 'IMLN',\n 'IMLOG10', 'IMLOG2', 'IMPOWER', 'IMPRODUCT', 'IMREAL', 'IMSEC', 'IMSECH', 'IMSIN', 'IMSINH', 'IMSQRT', 'IMSUB',\n 'IMSUM', 'IMTAN', 'INFO', 'INTERCEPT', 'INTRATE', 'IPMT', 'IRR', 'ISERR', 'ISEVEN', 'ISFORMULA', 'ISLOGICAL',\n 'ISNONTEXT', 'ISO.CEILING', 'ISODD', 'ISOMITTED', 'ISOWEEKNUM', 'ISPMT', 'ISREF', 'JIS', 'KURT', 'LAMBDA', 'LCM',\n 'LEFTB', 'LENB', 'LINEST', 'LOGEST', 'LOGINV', 'LOGNORM.DIST', 'LOGNORM.INV', 'LOGNORMDIST', 'LOOKUP',\n 'MAKEARRAY', 'MAP', 'MAXA', 'MDETERM', 'MDURATION', 'MIDB', 'MINA', 'MINVERSE', 'MIRR', 'MMULT', 'MODE',\n 'MODE.MULT', 'MODE.SNGL', 'MULTINOMIAL', 'MUNIT', 'N', 'NEGBINOM.DIST', 'NEGBINOMDIST', 'NETWORKDAYS.INTL',\n 'NOMINAL', 'NORM.DIST', 'NORM.INV', 'NORM.S.DIST', 'NORM.S.INV', 'NORMDIST', 'NORMINV', 'NORMSDIST', 'NORMSINV',\n 'NPER', 'NPV', 'OCT2BIN', 'OCT2DEC', 'OCT2HEX', 'ODD', 'ODDFPRICE', 'ODDFYIELD', 'ODDLPRICE', 'ODDLYIELD',\n 'PDURATION', 'PEARSON', 'PERCENTILE', 'PERCENTILE.EXC', 'PERCENTILE.INC', 'PERCENTOF', 'PERCENTRANK',\n 'PERCENTRANK.EXC', 'PERCENTRANK.INC', 'PERMUT', 'PERMUTATIONA', 'PHI', 'PHONETIC', 'PIVOTBY', 'POISSON',\n 'POISSON.DIST', 'PPMT', 'PRICE', 'PRICEDISC', 'PRICEMAT', 'PROB', 'PY', 'QUARTILE', 'QUARTILE.EXC',\n 'QUARTILE.INC', 'QUOTIENT', 'RANDARRAY', 'RANK', 'RANK.AVG', 'RATE', 'RECEIVED', 'REDUCE', 'REGEXEXTRACT',\n 'REGEXREPLACE', 'REGEXTEST', 'REGISTER.ID', 'REPLACEB', 'RIGHTB', 'ROMAN', 'RRI', 'RSQ', 'RTD', 'SCAN', 'SEARCHB',\n 'SERIESSUM', 'SHEET', 'SHEETS', 'SKEW', 'SKEW.P', 'SLN', 'SLOPE', 'SQRTPI', 'STANDARDIZE', 'STDEV', 'STDEVA',\n 'STDEVP', 'STDEVPA', 'STEYX', 'STOCKHISTORY', 'SUMSQ', 'SUMX2MY2', 'SUMX2PY2', 'SUMXMY2', 'SYD', 'T', 'T.DIST',\n 'T.DIST.2T', 'T.DIST.RT', 'T.INV', 'T.INV.2T', 'T.TEST', 'TAKE', 'TBILLEQ', 'TBILLPRICE', 'TBILLYIELD', 'TDIST',\n 'TEXTAFTER', 'TEXTBEFORE', 'TEXTSPLIT', 'TIMEVALUE', 'TINV', 'TOCOL', 'TOROW', 'TRANSLATE', 'TREND', 'TRIMMEAN',\n 'TRIMRANGE', 'TRUE', 'TTEST', 'TYPE', 'UNICHAR', 'UNICODE', 'VALUETOTEXT', 'VAR', 'VARA', 'VARP', 'VARPA', 'VDB',\n 'VSTACK', 'WEBSERVICE', 'WEEKNUM', 'WEIBULL', 'WEIBULL.DIST', 'WORKDAY.INTL', 'WRAPCOLS', 'WRAPROWS', 'XIRR',\n 'YIELD', 'YIELDDISC', 'YIELDMAT', 'Z.TEST', 'ZTEST',\n];\n\nlet undeclared: ReadonlySet<string> | undefined;\n\n/** Whether Excel has a worksheet function of this name that ExSheet does not declare, the name read without regard to case. */\nexport function isUndeclaredExcelFunction(name: string): boolean {\n undeclared ??= new Set(excelFunctionNames.map(ignoreCaseKey));\n return undeclared.has(ignoreCaseKey(name));\n}\n", "// The order in which Excel's comparison operators, and XLOOKUP's approximate matches, put text (ADR-0047). It\n// is a collation, not code points: Excel puts `\u00E9` beside `e`, so `=\"\u00E9\">\"z\"` is FALSE, and case is ignored, so\n// `=\"a\"=\"A\"` is TRUE. The engine's own, so that it gives the same answer on every platform and in the browser.\n//\n// Text is compared first on each character's primary weight \u2014 punctuation, symbols and spaces before digits,\n// digits before letters, and a letter by its base letter, its accents removed and its case ignored \u2014 with a\n// hyphen and an apostrophe passed over and `\u00DF` read as `ss`; where every primary weight is equal, on the\n// accents (an unaccented letter before an accented one); and where those are equal too, on the hyphens and\n// apostrophes passed over (the text with fewer first).\nimport { compareOrdinal, upperInvariant } from '../dotnet';\nimport { elementAt } from '../must';\n\ninterface Weight {\n readonly weightClass: number;\n readonly base: number;\n readonly accents: string;\n}\n\n/** Excel's order of two texts: negative, 0 or positive. */\nexport function compareText(left: string, right: string): number {\n const a = weigh(left);\n const b = weigh(right);\n const length = Math.min(a.weights.length, b.weights.length);\n for (let i = 0; i < length; i++) {\n const x = elementAt(a.weights, i);\n const y = elementAt(b.weights, i);\n const primary = x.weightClass !== y.weightClass ? Math.sign(x.weightClass - y.weightClass) : Math.sign(x.base - y.base);\n if (primary !== 0) return primary;\n }\n if (a.weights.length !== b.weights.length) return Math.sign(a.weights.length - b.weights.length);\n for (let i = 0; i < length; i++) {\n const accents = compareOrdinal(elementAt(a.weights, i).accents, elementAt(b.weights, i).accents);\n if (accents !== 0) return Math.sign(accents);\n }\n return Math.sign(a.hyphens - b.hyphens);\n}\n\n/**\n * A text two texts share exactly when `compareText` gives 0 for them: their primary weights, their accents,\n * and how many hyphens and apostrophes were passed over (ADR-0049, 2026-09-30).\n */\nexport function textEqualityKey(text: string): string {\n const { weights, hyphens } = weigh(text);\n let key = '';\n // Each weight is its class, its base character and its accents behind their length, so no two lists of\n // weights are written alike.\n for (const w of weights) {\n key += String.fromCharCode(0x30 + w.weightClass) + String.fromCharCode(w.base) + String.fromCharCode(w.accents.length) + w.accents;\n }\n return `${key}|${String(hyphens)}`;\n}\n\nconst sharpS: Weight = { weightClass: 2, base: 0x53, accents: '' };\n\n/** The primary weights and accents of the text's characters, a hyphen or an apostrophe passed over and counted, `\u00DF` as `ss`. */\nfunction weigh(text: string): { weights: Weight[]; hyphens: number } {\n let hyphens = 0;\n const weights: Weight[] = [];\n for (let i = 0; i < text.length; i++) {\n const c = text.charCodeAt(i);\n const pair = text.codePointAt(i);\n if (pair !== undefined && pair > 0xffff) {\n // A character outside the Basic Multilingual Plane is two halves with no decomposition: each is\n // weighed as itself, in the class of the whole character (an emoji among the symbols, \uD842\uDFB7 among the\n // letters), as a character inside the plane with no accents is.\n const weightClass = classOfCharacter(String.fromCodePoint(pair));\n weights.push({ weightClass, base: c, accents: '' }, { weightClass, base: text.charCodeAt(i + 1), accents: '' });\n i++;\n continue;\n }\n if (c === 0x2d || c === 0x27) {\n hyphens++;\n continue;\n }\n if (c === 0xdf || c === 0x1e9e) {\n weights.push(sharpS, sharpS);\n continue;\n }\n weights.push(weighCharacter(c));\n }\n return { weights, hyphens };\n}\n\n/** A character's primary weight \u2014 its class and its base character \u2014 and its accents. */\nfunction weighCharacter(c: number): Weight {\n if (c < 128) return { weightClass: classOf(c), base: upperInvariant(c), accents: '' };\n // A half with no other half is no character: it is weighed as itself, among the symbols.\n if (c >= 0xd800 && c <= 0xdfff) return { weightClass: 0, base: c, accents: '' };\n const decomposed = String.fromCharCode(c).normalize('NFD');\n const base = decomposed.charCodeAt(0);\n return { weightClass: classOf(base), base: upperInvariant(base), accents: decomposed.slice(1) };\n}\n\nconst decimalDigit = /^\\p{Nd}$/u;\nconst letter = /^\\p{L}$/u;\n\nfunction classOf(c: number): number {\n return classOfCharacter(String.fromCharCode(c));\n}\n\nfunction classOfCharacter(character: string): number {\n if (decimalDigit.test(character)) return 1;\n if (letter.test(character)) return 2;\n return 0;\n}\n", "import { CellAddress } from '../cell-address';\nimport { parseNumber } from '../constant-parser';\nimport type { Culture } from '../culture';\nimport { writtenText } from '../number-text';\nimport { Value, type ErrorValue } from '../value';\nimport { approximatelyEqual, finalAdd, power } from './arithmetic';\nimport type { CellReader } from './cell-reader';\nimport { isUndeclaredExcelFunction } from './excel-function-names';\nimport { FunctionCall } from './function-definition';\nimport type { FunctionNode, LetBinding, LetNode, Node } from './nodes';\nimport { Operand } from './operand';\nimport { compareText } from './text-order';\nimport { ValueArray } from './value-array';\n\n/** A number, or the Error Value met where one was wanted (C#'s `out ErrorValue? error`). */\nexport type NumberOrError = number | ErrorValue;\n\n/** A binding's one Value, once it has been read. */\ninterface BindingSlot {\n value: Operand | undefined;\n}\n\n/** A node to compute, or (`operands`) one whose operands are computed and stand on the stack of results. */\ninterface Step {\n readonly node: Node;\n readonly operands: boolean;\n}\n\n/**\n * Evaluates a parsed Formula to a Value, as Excel does: IEEE doubles, a blank read as 0, Error Values carried\n * through, left to right (ADR-0047).\n */\nexport class Evaluator {\n readonly culture: Culture;\n readonly cells: CellReader;\n /** The cell whose Formula is being evaluated, which `ROW()` and `COLUMN()` read; `undefined` for a Formula evaluated in no cell. */\n self: CellAddress | undefined;\n\n /**\n * The refusal of the Formula being evaluated, or `undefined`: `Value.refusal` once a function or an operator\n * has refused it, else `Value.refusedName` once it has called a function Excel has and ExSheet does not\n * declare, or named a Linked Table bare.\n */\n #refusal: Value | undefined;\n\n /** The `LET` bindings in scope while their `LET` is evaluated, each computed when first read (ADR-0181). */\n readonly #bindings = new Map<LetBinding, BindingSlot>();\n\n /** The slots of the bindings `#operator` has taken out of scope while their value is computed. */\n readonly #bindingsOutOfScope = new Map<LetBinding, BindingSlot>();\n\n constructor(cells: CellReader, culture: Culture) {\n this.cells = cells;\n this.culture = culture;\n }\n\n /**\n * A Formula's result. It is never blank: a Formula that reads an empty cell shows 0. When the Formula's last\n * operation is an addition or a subtraction whose result nearly cancels, the result is 0, as Excel's is.\n */\n evaluate(node: Node): Value {\n const value = this.scalarOf(this.evaluateResult(node));\n return value === undefined ? Value.fromNumber(0) : value;\n }\n\n /**\n * A Formula's result as it spills (ADR-0125): a range or an array of more than one Value is returned as it\n * is, for the Sheet to spill; anything else is one Value, never blank. A Formula a call or an operator\n * refused is the refusal, `#VALUE!`, whatever the rest of it made of it.\n */\n evaluateResult(node: Node): Operand {\n // A Formula computed on demand while another is evaluated has its own refusal; the outer Formula's is put back after it.\n const outerRefusal = this.#refusal;\n this.#refusal = undefined;\n try {\n const result = this.#result(node);\n const refusal = this.#refusalSoFar();\n return refusal === undefined ? result : Operand.of(refusal);\n } finally {\n this.#refusal = outerRefusal;\n }\n }\n\n /**\n * Refuses the Formula being evaluated: its result is the refusal, `#VALUE!` (`Value.refusal`), whatever the\n * functions and operators around it make of the Error Value returned here, so `IFERROR` cannot catch it\n * (ADR-0047; 2026-10-12, decided with the user: a refusal is never caught, anywhere).\n */\n refuse(): Operand {\n this.#refusal = Value.refusal;\n return Operand.of(Value.refusal);\n }\n\n /**\n * Refuses the Formula being evaluated with `#NAME?` (`Value.refusedName`): a call of a function Excel has and\n * ExSheet does not declare, or a declared Linked Table's bare name (2026-10-13, decided with the user). A\n * refusal by `refuse` in the same Formula comes before it.\n */\n refuseName(): Operand {\n this.#refusal ??= Value.refusedName;\n return Operand.of(Value.refusedName);\n }\n\n /** `refuse`, for a function that answers with a Value: the Formula is refused, and the refusal is returned to stand where the Value would. */\n refused(): Value {\n this.#refusal = Value.refusal;\n return Value.refusal;\n }\n\n /** The refusal of the Formula being evaluated, read after a computation that may have set it. */\n #refusalSoFar(): Value | undefined {\n return this.#refusal;\n }\n\n #result(node: Node): Operand {\n if (node.kind === 'binary' && (node.operator === '+' || node.operator === '-')) {\n const left = this.operand(node.left);\n const right = this.operand(node.right);\n if (isMulti(left) || isMulti(right)) return this.#elementwise(node.operator, left, right);\n return Operand.of(this.#binaryValues(node.operator, this.scalarOf(left), this.scalarOf(right), true));\n }\n const result = this.operand(node);\n if (isMulti(result)) return result;\n const value = this.scalarOf(result);\n return Operand.of(value === undefined ? Value.fromNumber(0) : value);\n }\n\n /** An operand read whole, as an array: a range's cells, a Linked Table's column, or one Value. */\n toArray(operand: Operand): ValueArray {\n switch (operand.kind) {\n case 'array':\n return operand.arrayOf();\n case 'area': {\n const area = operand.area;\n if (area.rows * area.columns > ValueArray.mostCells) return ValueArray.single(Value.fromError('#NUM!'));\n const array = new ValueArray(area.rows, area.columns);\n const cells = operand.cellsOf();\n for (const address of cells.nonBlankIn(area)) array.set(address.row - area.row1, address.column - area.column1, cells.read(address));\n return array;\n }\n case 'column': {\n const column = operand.columnOf();\n if (column.length === 0) return ValueArray.single(Value.fromError('#VALUE!'));\n const values = new ValueArray(column.length, 1);\n for (let i = 0; i < column.length; i++) values.set(i, 0, column[i]);\n return values;\n }\n case 'scalar':\n case 'missing':\n case 'threeD':\n return ValueArray.single(this.scalarOf(operand));\n default:\n throw new Error(`Internal: ${String(operand.kind)} is no kind of operand.`);\n }\n }\n\n /** An operator applied element by element, the two arrays broadcast as Excel broadcasts them (ADR-0125). */\n #elementwise(op: string, leftOperand: Operand, rightOperand: Operand): Operand {\n const left = this.toArray(leftOperand);\n const right = this.toArray(rightOperand);\n const rows = left.rows === 1 ? right.rows : right.rows === 1 ? left.rows : Math.max(left.rows, right.rows);\n const columns = left.columns === 1 ? right.columns : right.columns === 1 ? left.columns : Math.max(left.columns, right.columns);\n if (rows * columns > ValueArray.mostCells) return Operand.ofError('#NUM!');\n const result = new ValueArray(rows, columns);\n for (let r = 0; r < rows; r++) {\n for (let c = 0; c < columns; c++) result.set(r, c, this.#binaryValues(op, left.broadcast(r, c), right.broadcast(r, c), false));\n }\n return Operand.ofArray(result);\n }\n\n /** A function of one Value applied to each Value of an operand that holds several. */\n #map(operand: Operand, each: (value: Value | undefined) => Value): Operand {\n if (!isMulti(operand)) return Operand.of(each(this.scalarOf(operand)));\n const source = this.toArray(operand);\n const result = new ValueArray(source.rows, source.columns);\n for (let r = 0; r < source.rows; r++) {\n for (let c = 0; c < source.columns; c++) result.set(r, c, each(source.at(r, c)));\n }\n return Operand.ofArray(result);\n }\n\n /**\n * What a node evaluates to. Operators, parentheses and the `LET` names read are computed in a loop with a\n * stack of their own (`#operator`), so the evaluator's recursion goes only through calls and `LET`s, which\n * the parser bounds.\n */\n operand(node: Node): Operand {\n switch (node.kind) {\n case 'binary':\n case 'parentheses':\n case 'unary':\n case 'percent':\n return this.#operator(node);\n case 'name':\n return node.binding === undefined ? this.#leaf(node) : this.#operator(node);\n case 'let':\n return this.#let(node);\n case 'function':\n return this.#call(node);\n case 'number':\n case 'text':\n case 'boolean':\n case 'error':\n case 'missing':\n case 'reference':\n case 'structuredReference':\n case 'intersection':\n return this.#leaf(node);\n default:\n return unreachableNode(node);\n }\n }\n\n /** A call: `#NAME?` for a name outside the declared set, refused where Excel has the function and ExSheet does not. */\n #call(f: FunctionNode): Operand {\n const definition = f.function;\n if (definition === undefined) return isUndeclaredExcelFunction(f.name) ? this.refuseName() : Operand.ofError('#NAME?');\n if (spanWhereOneSheetIsAsked(f)) return Operand.ofError('#VALUE!');\n return definition.invoke(new FunctionCall(this, f.arguments, f.place, definition.threeD));\n }\n\n /** A node that holds no other to compute: a constant, a Reference, a Linked Table's column, or a name nothing binds. */\n #leaf(node: Node): Operand {\n switch (node.kind) {\n case 'number': return Operand.of(Value.fromNumber(node.number));\n case 'text': return Operand.of(Value.fromText(node.text));\n case 'boolean': return Operand.of(Value.fromBoolean(node.value));\n case 'error': return Operand.ofError(node.error);\n case 'missing': return Operand.missing;\n case 'reference': {\n const reference = node.reference;\n if (reference.lastSheetName !== undefined) {\n // A 3D Reference is its rectangle on every Sheet of its span; one that names a Sheet the\n // Workbook lacks is #NAME?, and its spill #REF!, as Excel answered (ADR-0331 \u00A77, ticket 12).\n if (reference.spilled) return Operand.ofError('#REF!');\n if (reference.sheetName === undefined) throw new Error('Internal: a 3D Reference names the Sheet that starts its span.');\n const sheets = this.cells.resolveSpan(reference.sheetName, reference.lastSheetName);\n return sheets === undefined ? Operand.ofError('#NAME?') : Operand.ofThreeD(reference.area, sheets);\n }\n // A Reference reads the Sheet its qualifier names; a name no Sheet of the Workbook has names nothing (ADR-0046, ADR-0331).\n const sheet = this.cells.resolve(reference.sheetName);\n if (sheet === undefined) return Operand.ofError('#REF!');\n if (reference.spilled) return sheet.spill(new CellAddress(reference.row1, reference.column1));\n return Operand.ofArea(reference.area, sheet);\n }\n case 'structuredReference': return this.cells.tableColumn(node.table, node.column);\n case 'name':\n case 'intersection':\n return this.#namesLinkedTable(node) ? this.refuseName() : Operand.ofError('#NAME?');\n case 'let':\n case 'function':\n case 'parentheses':\n case 'unary':\n case 'percent':\n case 'binary':\n throw new Error(`Internal: no evaluation for ${node.kind} as a leaf.`);\n default:\n return unreachableNode(node);\n }\n }\n\n /** Whether an unbound name, or a side of an intersection, is a declared Linked Table's bare name (ADR-0049). */\n #namesLinkedTable(node: Node): boolean {\n if (node.kind === 'name') return node.binding === undefined && this.cells.isLinkedTable(node.name);\n if (node.kind === 'intersection') return this.#namesLinkedTable(node.left) || this.#namesLinkedTable(node.right);\n if (node.kind === 'parentheses') return this.#namesLinkedTable(node.inner);\n return false;\n }\n\n /**\n * An operand used as one Value: a single cell is read; a rectangle of more than one cell refuses the Formula\n * (`refused`), because Excel 365 applies what wants one Value to each Value of it, which ExSheet does not yet\n * (ADR-0125). An empty argument is blank. A 3D Reference is `#REF!` where it is written, and `#VALUE!` where a\n * function handed it on, as Excel answered (ADR-0331 \u00A77).\n */\n scalarOf(operand: Operand): Value | undefined {\n switch (operand.kind) {\n case 'scalar':\n return operand.scalar;\n case 'area':\n return operand.area.isSingleCell ? operand.cellsOf().read(new CellAddress(operand.area.row1, operand.area.column1)) : this.refused();\n case 'column': {\n const column = operand.columnOf();\n return column.length === 1 ? column[0] : this.refused();\n }\n case 'array': {\n const array = operand.arrayOf();\n return array.isSingle ? array.at(0, 0) : this.refused();\n }\n case 'threeD':\n return Value.fromError(operand.handedOn ? '#VALUE!' : '#REF!');\n case 'missing':\n return undefined;\n default:\n throw new Error(`Internal: ${String(operand.kind)} is no kind of operand.`);\n }\n }\n\n /** The Values of a range that are not blank, in order: row-major for cells, top to bottom for a Linked Table's column. */\n *rangeValues(range: Operand): Generator<Value> {\n switch (range.kind) {\n case 'area': {\n const cells = range.cellsOf();\n for (const address of cells.nonBlankIn(range.area)) yield readNonBlank(cells, address);\n return;\n }\n case 'column':\n for (const value of range.columnOf()) {\n if (value !== undefined) yield value;\n }\n return;\n case 'array':\n yield* range.arrayOf().nonBlank();\n return;\n case 'threeD':\n // Sheet by Sheet in tab order, each row-major (ADR-0331 \u00A77).\n for (const sheet of range.sheetsOf()) {\n for (const address of sheet.nonBlankIn(range.area)) yield readNonBlank(sheet, address);\n }\n return;\n case 'scalar':\n case 'missing':\n throw new RangeError('Not a range.');\n default:\n throw new Error(`Internal: ${String(range.kind)} is no kind of operand.`);\n }\n }\n\n scalar(node: Node): Value | undefined {\n return this.scalarOf(this.operand(node));\n }\n\n /**\n * `LET` (ADR-0181): its calculation, with its names in scope. A binding is computed when its name is first\n * read and at most once, every read giving that one Value; one never read is never computed.\n */\n #let(let_: LetNode): Operand {\n const outer = let_.bindings.map(binding => {\n const slot = this.#bindings.get(binding);\n this.#bindings.set(binding, { value: undefined });\n return slot;\n });\n try {\n return this.operand(let_.calculation);\n } finally {\n outer.forEach((slot, i) => {\n const binding = let_.bindings[i];\n if (binding === undefined) throw new Error('Internal: a LET lost a binding.');\n if (slot === undefined) this.#bindings.delete(binding);\n else this.#bindings.set(binding, slot);\n });\n }\n }\n\n #negate(op: '+' | '-', value: Value | undefined): Value {\n const operand = this.toNumber(value);\n if (typeof operand !== 'number') return Value.fromError(operand);\n return Value.fromNumber(op === '-' ? -operand : operand);\n }\n\n #percent(value: Value | undefined): Value {\n const operand = this.toNumber(value);\n return typeof operand !== 'number' ? Value.fromError(operand) : numberValue(operand / 100);\n }\n\n /**\n * Operators, parentheses and the `LET` names read, computed with a stack of their own rather than by\n * recursion, so that a chain as long as Excel accepts, parentheses and signs as deep as the parser reads,\n * or a chain of names each bound to the one before, never deepen the call stack. A name's binding is\n * computed where it is first read and at most once; it is out of scope while its value is computed.\n */\n #operator(top: Node): Operand {\n const work: Step[] = [{ node: top, operands: false }];\n const done: Operand[] = [];\n // The bindings taken out of scope while their value is computed: put back if anything throws.\n const computing: LetBinding[] = [];\n try {\n for (let step = work.pop(); step !== undefined; step = work.pop()) {\n if (step.operands) this.#combine(step.node, done, computing);\n else this.#expand(step.node, work, done, computing);\n }\n } finally {\n this.#putBack(computing);\n }\n return pop(done);\n }\n\n /** Puts the bindings taken out of scope while their value was computed back in scope. */\n #putBack(computing: readonly LetBinding[]): void {\n for (const binding of computing) {\n const slot = this.#bindingsOutOfScope.get(binding);\n if (slot === undefined) throw new Error('Internal: a binding out of scope lost its slot.');\n this.#bindings.set(binding, slot);\n this.#bindingsOutOfScope.delete(binding);\n }\n }\n\n /** Puts a node's operands on the work stack, after itself, or computes a node that holds none of those. */\n #expand(node: Node, work: Step[], done: Operand[], computing: LetBinding[]): void {\n switch (node.kind) {\n case 'parentheses':\n // A 3D Reference in parentheses is #NAME?, as Excel answered =(Sheet1:Sheet3!B2) (ADR-0331 \u00A77).\n if (node.inner.kind === 'reference' && node.inner.reference.isThreeD) {\n done.push(Operand.ofError('#NAME?'));\n return;\n }\n work.push({ node: node.inner, operands: false });\n return;\n case 'unary':\n case 'percent':\n work.push({ node, operands: true }, { node: node.operand, operands: false });\n return;\n case 'binary':\n work.push({ node, operands: true }, { node: node.right, operands: false }, { node: node.left, operands: false });\n return;\n case 'name': {\n const binding = node.binding;\n if (binding === undefined) {\n done.push(this.operand(node));\n return;\n }\n // Read: the Value once computed; else computed now, out of scope while it is.\n const slot = this.#bindings.get(binding);\n if (slot === undefined) {\n done.push(Operand.ofError('#NAME?'));\n return;\n }\n if (slot.value !== undefined) {\n done.push(slot.value);\n return;\n }\n this.#bindings.delete(binding);\n this.#bindingsOutOfScope.set(binding, slot);\n computing.push(binding);\n work.push({ node, operands: true }, { node: binding.value, operands: false });\n return;\n }\n case 'number':\n case 'text':\n case 'boolean':\n case 'error':\n case 'missing':\n case 'reference':\n case 'structuredReference':\n case 'let':\n case 'intersection':\n case 'function':\n done.push(this.operand(node));\n return;\n default:\n return unreachableNode(node);\n }\n }\n\n /** Computes a node from its operands' results, on top of the stack of results. */\n #combine(node: Node, done: Operand[], computing: LetBinding[]): void {\n switch (node.kind) {\n case 'unary': {\n const operator = node.operator;\n done.push(this.#map(pop(done), value => this.#negate(operator, value)));\n return;\n }\n case 'percent':\n done.push(this.#map(pop(done), value => this.#percent(value)));\n return;\n case 'binary': {\n const right = pop(done);\n const left = pop(done);\n done.push(isMulti(left) || isMulti(right)\n ? this.#elementwise(node.operator, left, right)\n : Operand.of(this.#binaryValues(node.operator, this.scalarOf(left), this.scalarOf(right), false)));\n return;\n }\n case 'name': {\n const binding = node.binding;\n if (binding === undefined) throw new Error('Internal: an unbound name has no operands to combine.');\n const slot = this.#bindingsOutOfScope.get(binding);\n if (slot === undefined) throw new Error('Internal: a binding computed lost its slot.');\n this.#bindingsOutOfScope.delete(binding);\n computing.splice(computing.indexOf(binding), 1);\n this.#bindings.set(binding, slot);\n // A name bound to a 3D Reference hands it on, as LET's did in Excel (ADR-0331 \u00A77).\n const value = pop(done).handOn();\n slot.value = value;\n done.push(value);\n return;\n }\n case 'boolean':\n case 'error':\n case 'function':\n case 'intersection':\n case 'let':\n case 'missing':\n case 'number':\n case 'parentheses':\n case 'reference':\n case 'structuredReference':\n case 'text':\n throw new Error(`Internal: ${node.kind} has no operands to combine.`);\n default:\n throw new Error(`Internal: ${String(node)} is no kind of node.`);\n }\n }\n\n #binaryValues(op: string, left: Value | undefined, right: Value | undefined, finalOperation: boolean): Value {\n switch (op) {\n case '&':\n if (left?.isError === true) return left;\n if (right?.isError === true) return right;\n return Value.fromText(this.toText(left) + this.toText(right));\n case '=':\n case '<>':\n case '<':\n case '>':\n case '<=':\n case '>=': {\n if (left?.isError === true) return left;\n if (right?.isError === true) return right;\n const order = compareValues(left, right, approximatelyEqual);\n switch (op) {\n case '=': return Value.fromBoolean(order === 0);\n case '<>': return Value.fromBoolean(order !== 0);\n case '<': return Value.fromBoolean(order < 0);\n case '>': return Value.fromBoolean(order > 0);\n case '<=': return Value.fromBoolean(order <= 0);\n case '>=': return Value.fromBoolean(order >= 0);\n }\n }\n default:\n break;\n }\n\n const a = this.toNumber(left);\n if (typeof a !== 'number') return Value.fromError(a);\n const b = this.toNumber(right);\n if (typeof b !== 'number') return Value.fromError(b);\n switch (op) {\n case '+': return numberValue(finalOperation ? finalAdd(a, b) : a + b);\n case '-': return numberValue(finalOperation ? finalAdd(a, -b) : a - b);\n case '*': return numberValue(a * b);\n case '/': return b === 0 ? Value.fromError('#DIV/0!') : numberValue(a / b);\n case '^': {\n if (a === 0 && b === 0) return Value.fromError('#NUM!');\n if (a === 0 && b < 0) return Value.fromError('#DIV/0!');\n const raised = power(a, b);\n return raised === undefined ? Value.fromError('#NUM!') : numberValue(raised);\n }\n default: throw new Error(`Internal: no operator ${op}.`);\n }\n }\n\n /**\n * Excel's coercion of an operand to a number: a blank is 0, a boolean 1 or 0, text that reads as a typed\n * number would under the Sheet's culture is that number, other text is `#VALUE!`.\n */\n toNumber(value: Value | undefined): NumberOrError {\n if (value === undefined) return 0;\n switch (value.kind) {\n case 'number': return value.number;\n case 'boolean': return value.boolean ? 1 : 0;\n case 'error': return value.error;\n case 'text': {\n const parsed = parseNumber(value.text, this.culture);\n return parsed === undefined ? '#VALUE!' : parsed;\n }\n default: throw new Error(`Internal: ${String(value.kind)} is no kind of Value.`);\n }\n }\n\n /** Excel's coercion to text: a blank is empty, a number is written as Excel writes one into text under the Sheet's culture. */\n toText(value: Value | undefined): string {\n if (value === undefined) return '';\n switch (value.kind) {\n case 'text': return value.text;\n case 'number': return writtenText(value.number, this.culture);\n case 'boolean': return value.boolean ? 'TRUE' : 'FALSE';\n case 'error': return value.error;\n default: throw new Error(`Internal: ${String(value.kind)} is no kind of Value.`);\n }\n }\n}\n\n/** Whether an operand holds more than one Value: a range of several cells, a Linked Table's column of several, or an array. */\nexport function isMulti(operand: Operand): boolean {\n switch (operand.kind) {\n case 'area': return !operand.area.isSingleCell;\n case 'column': return operand.columnOf().length !== 1;\n case 'array': return true;\n case 'scalar':\n case 'missing':\n case 'threeD':\n return false;\n default: throw new Error(`Internal: ${String(operand.kind)} is no kind of operand.`);\n }\n}\n\n/** A result that is not a finite double is `#NUM!`, as in Excel. */\nexport function numberValue(result: number): Value {\n return Number.isFinite(result) ? Value.fromNumber(result) : Value.fromError('#NUM!');\n}\n\n/**\n * Excel's comparison: a blank is the empty value of the other side's kind (0, \"\" or FALSE); numbers sort before\n * text, and text before booleans; numbers compare exactly, unless `equalNumbers` says two are equal (the\n * comparison operators compare at Excel's precision); text compares as Excel collates it (`compareText`).\n */\nexport function compareValues(left: Value | undefined, right: Value | undefined, equalNumbers?: (a: number, b: number) => boolean): number {\n if (left === undefined && right === undefined) return 0;\n const a = left ?? emptyOf(defined(right).kind);\n const b = right ?? emptyOf(a.kind);\n if (a.kind !== b.kind) return Math.sign(rank(a) - rank(b));\n switch (a.kind) {\n case 'number':\n if (equalNumbers?.(a.number, b.number) === true) return 0;\n return a.number < b.number ? -1 : a.number > b.number ? 1 : 0;\n case 'text': return compareText(a.text, b.text);\n case 'boolean':\n case 'error':\n return Math.sign(Number(a.boolean) - Number(b.boolean));\n default: throw new Error(`Internal: ${String(a.kind)} is no kind of Value.`);\n }\n}\n\nfunction rank(value: Value): number {\n return value.kind === 'number' ? 0 : value.kind === 'text' ? 1 : 2;\n}\n\nfunction emptyOf(kind: Value['kind']): Value {\n return kind === 'text' ? Value.fromText('') : kind === 'boolean' ? Value.fromBoolean(false) : Value.fromNumber(0);\n}\n\nfunction defined(value: Value | undefined): Value {\n if (value === undefined) throw new Error('Internal: one side of a comparison is a Value.');\n return value;\n}\n\nfunction readNonBlank(cells: CellReader, address: CellAddress): Value {\n const value = cells.read(address);\n if (value === undefined) throw new Error(`Internal: ${address.toString()} was listed as not blank.`);\n return value;\n}\n\nfunction pop<T>(stack: T[]): T {\n const top = stack.pop();\n if (top === undefined) throw new Error('Internal: the evaluator popped an empty stack.');\n return top;\n}\n\n/**\n * Whether a 3D Reference is written as an argument where the function asks for a range of one Sheet: the call\n * is `#VALUE!` before anything of it is read, as Excel's `SUMIF(Sheet1:Sheet3!B2,\">0\")` is (ADR-0331 \u00A77).\n */\nfunction spanWhereOneSheetIsAsked(f: FunctionNode): boolean {\n const policy = f.function?.threeD;\n if (policy === undefined) return false;\n return f.arguments.some((argument, i) => argument.kind === 'reference' && argument.reference.isThreeD && policy(i, f.arguments.length) === 'oneSheet');\n}\n\nfunction unreachableNode(node: never): never {\n throw new Error(`Internal: no evaluation for ${String(node)}.`);\n}\n", "// What the functions of the declared set share (C#'s FunctionLibrary partials Functions.cs and\n// Functions.Arguments.cs): how an argument that takes one Value is read, how the aggregates take their\n// numbers, and the refusal of an array where one Value is wanted.\nimport { parseNumber } from '../../constant-parser';\nimport { equalsIgnoreCase } from '../../dotnet';\nimport { Value, type ErrorValue } from '../../value';\nimport type { Evaluator } from '../evaluator';\nimport type { FunctionCall } from '../function-definition';\nimport { Operand } from '../operand';\n\n/** A function of the declared set, as a declaration names it. */\nexport type FunctionBody = (call: FunctionCall) => Operand;\n\n/**\n * Whether an argument where one Value is wanted holds several: a range of several cells, a Linked Table's\n * column of several, an array, or a 3D Reference that reached a function reading it across its span\n * (`TEXTJOIN`'s delimiter, which Excel cycles through, as through a range's). Excel 365 applies the function\n * to each Value and spills the results; the engine does not yet (ADR-0125, \"Not yet: functions lifted over\n * arrays\"), so the function refuses the Formula (`unlifted`).\n */\nexport function isArray(operand: Operand): boolean {\n return (operand.kind === 'area' && !operand.area.isSingleCell)\n || (operand.kind === 'column' && operand.columnOf().length !== 1)\n || operand.kind === 'array' || operand.kind === 'threeD';\n}\n\n/**\n * The refusal of an array where a function wants one Value (`isArray`): `#VALUE!`, and the Formula's\n * (`Evaluator.refuse`), as a Formula that meets `#CIRC!` is `#CIRC!` (ADR-0047). ADR-0125 keeps it \"an Error\n * Value, never another answer\", and IFERROR-009 records that `IFERROR` does not turn it into a fallback.\n */\nexport function unlifted(call: FunctionCall): Operand {\n return call.evaluator.refuse();\n}\n\n/**\n * Argument `index` as one Value, blank as `undefined`; an `Operand` (the failure) when it is an Error Value, or\n * the Formula's refusal when it is a range of several cells or an array (`unlifted`). A kept blank given as one\n * Value is read as a blank cell's (`FunctionCall.oneValue`; ADR-0125).\n */\nexport function scalarArgument(call: FunctionCall, index: number): Value | undefined | Operand {\n const operand = call.oneValue(index);\n if (isArray(operand)) return unlifted(call);\n const value = call.evaluator.scalarOf(operand);\n if (value?.isError === true) return Operand.of(value);\n return value;\n}\n\n/** Argument `index` coerced to a number as the operators coerce it: a blank is 0, a boolean 1 or 0, text that reads as a number is that number; or the failure. */\nexport function numberArgument(call: FunctionCall, index: number): number | Operand {\n const value = scalarArgument(call, index);\n if (value instanceof Operand) return value;\n return numberOrFailure(call.evaluator.toNumber(value));\n}\n\n/** Argument `index` coerced to text as `&` coerces it; or the failure. */\nexport function textArgument(call: FunctionCall, index: number): string | Operand {\n const value = scalarArgument(call, index);\n if (value instanceof Operand) return value;\n return call.evaluator.toText(value);\n}\n\n/** Argument `index` when it is given (`FunctionCall.has`), as a number; `fallback` when it is left out. */\nexport function optionalNumber(call: FunctionCall, index: number, fallback: number): number | Operand {\n return call.has(index) ? numberArgument(call, index) : fallback;\n}\n\n/** A coercion's number, or its Error Value as the failure. */\nexport function numberOrFailure(number: number | ErrorValue): number | Operand {\n return typeof number === 'number' ? number : Operand.ofError(number);\n}\n\n/** One number as a Value; past what a double holds, `#NUM!` (C#'s `Operand.Of(Evaluator.Number(x))`). */\nexport function numberResult(number: number): Operand {\n return Operand.of(Number.isFinite(number) ? Value.fromNumber(number) : Value.fromError('#NUM!'));\n}\n\n/** A boolean as a Value. */\nexport function booleanResult(value: boolean): Operand {\n return Operand.of(Value.fromBoolean(value));\n}\n\n/**\n * A Value read as a logical one, as `IF`'s test and `NOT` read it: a number is TRUE unless it is 0, and text is\n * TRUE or FALSE only when it spells one, without regard to case. `undefined` for any other text and for an\n * Error Value.\n */\nexport function truthOf(value: Value): boolean | undefined {\n switch (value.kind) {\n case 'number': return value.number !== 0;\n case 'boolean': return value.boolean;\n case 'text':\n if (equalsIgnoreCase(value.text, 'TRUE')) return true;\n if (equalsIgnoreCase(value.text, 'FALSE')) return false;\n return undefined;\n case 'error': return undefined;\n default: throw new Error(`Internal: ${String(value.kind)} is no kind of Value.`);\n }\n}\n\n/**\n * The numbers the aggregates take, per Microsoft's documentation: inside a range or Reference only numbers\n * count, and blanks, text and booleans are ignored; typed directly as arguments, booleans and text that reads\n * as a number count too, and other text is `#VALUE!`. An Error Value anywhere is the result, the first one\n * found left to right. A kept blank (`Operand.keptBlank`) is passed over as a blank cell is: Excel's `AVERAGE`\n * and `MIN` passed over the one `FILTER`, `TRANSPOSE` and `UNIQUE` kept (FILTER-014, TRANSPOSE-007,\n * UNIQUE-021, 022, run 18a), and `MAX`, `PRODUCT`, `MEDIAN` and the spreads that take their numbers here pass\n * over it too, by generalisation.\n */\nexport function collectNumbers(call: FunctionCall, numbers: number[], from = 0): ErrorValue | undefined {\n for (let i = from; i < call.count; i++) {\n const error = addNumbers(call.evaluator, call.keepingBlanks(i), numbers, false);\n if (error !== undefined) return error;\n }\n return undefined;\n}\n\n/**\n * The numbers one argument gives (`collectNumbers`), or its first Error Value. A kept blank\n * (`Operand.keptBlank`) is passed over as a blank cell is, or, with `keptBlankAsZero`, read as 0 where it\n * stands (ADR-0125).\n */\nexport function addNumbers(evaluator: Evaluator, operand: Operand, numbers: number[], keptBlankAsZero: boolean): ErrorValue | undefined {\n switch (operand.kind) {\n case 'array':\n if (operand.keptBlank && keptBlankAsZero) {\n for (const item of operand.arrayOf().all()) {\n if (item === undefined) numbers.push(0);\n else if (item.kind === 'number') numbers.push(item.number);\n else if (item.isError) return item.error;\n }\n return undefined;\n }\n return addRange(evaluator, operand, numbers);\n case 'area':\n case 'column':\n case 'threeD':\n return addRange(evaluator, operand, numbers);\n case 'missing':\n numbers.push(0);\n return undefined;\n case 'scalar': {\n const scalar = operand.scalar;\n if (scalar === undefined) {\n if (!operand.keptBlank || keptBlankAsZero) numbers.push(0);\n return undefined;\n }\n const number = evaluator.toNumber(scalar);\n if (typeof number !== 'number') return number;\n numbers.push(number);\n return undefined;\n }\n default: throw new Error(`Internal: ${String(operand.kind)} is no kind of operand.`);\n }\n}\n\nfunction addRange(evaluator: Evaluator, operand: Operand, numbers: number[]): ErrorValue | undefined {\n for (const value of evaluator.rangeValues(operand)) {\n if (value.kind === 'number') numbers.push(value.number);\n else if (value.isError) return value.error;\n }\n return undefined;\n}\n\n/** Whether text reads as a number under the culture, as `COUNT` counts typed text. */\nexport function readsAsNumber(text: string, evaluator: Evaluator): boolean {\n return parseNumber(text, evaluator.culture) !== undefined;\n}\n\n/**\n * An argument that takes an array, where a computation gave one Value that is not an Error Value: that Value as\n * an array of one, as Excel's array of one row. A blank argument, a Reference or a column stays as it is.\n */\nexport function arrayOrValue(operand: Operand): Operand {\n return operand.kind === 'scalar' && operand.scalar !== undefined && !operand.scalar.isError ? Operand.asArray(operand.scalar) : operand;\n}\n\n/** The numbers sorted ascending, as C#'s `List<double>.Sort` sorts finite doubles. */\nexport function sortNumbers(numbers: number[]): void {\n numbers.sort((a, b) => a - b);\n}\n\n/** The Value of an Error Value. */\nexport function errorResult(error: ErrorValue): Operand {\n return Operand.ofError(error);\n}\n", "// The functions built for arrays (ADR-0125; C#'s Functions.Arrays.cs): FILTER, UNIQUE, SORT, SORTBY, SEQUENCE,\n// TRANSPOSE, which spill, and SUMPRODUCT, which reduces its arrays to one Value.\nimport { compareIgnoreCase } from '../../dotnet';\nimport { elementAt } from '../../must';\nimport { errorValues, Value, type ErrorValue } from '../../value';\nimport { compareValues } from '../evaluator';\nimport type { FunctionCall } from '../function-definition';\nimport { Operand } from '../operand';\nimport { ValueArray } from '../value-array';\nimport { numberArgument, numberResult, scalarArgument } from './shared';\n\n/**\n * An argument read whole as an array, or its Error Value as the failure. A kept blank refuses the Formula\n * (`FunctionCall.operand`), unless `keepingBlanks` says this function gives the same answer for every reading of\n * it.\n */\nfunction arrayArgument(call: FunctionCall, index: number, keepingBlanks = false): ValueArray | Operand {\n const operand = keepingBlanks ? call.keepingBlanks(index) : call.operand(index);\n if (operand.isError) return operand;\n const array = call.evaluator.toArray(operand);\n const single = array.isSingle ? array.at(0, 0) : undefined;\n if (single?.isError === true && !operand.isRange) return Operand.of(single);\n return array;\n}\n\n/**\n * The array `UNIQUE`, `SORT`, `SORTBY`, `FILTER` or `TRANSPOSE` made (ADR-0125), a blank it kept from its array\n * marked as a kept blank (`Operand.keptBlank`): it spills as 0 (SORT-012, UNIQUE-010, TRANSPOSE-004), `COUNTA`\n * counts it in the array (SORT-021, UNIQUE-017), and taken out by `INDEX` it is blank to `ISBLANK` (SORT-022).\n */\nfunction made(result: ValueArray): Operand {\n return Operand.ofArray(result).withKeptBlank();\n}\n\n/**\n * FILTER: the rows (or columns) of `array` whose `include` is TRUE. `include` is one column as tall as the\n * array, or one row as wide; any other shape is `#VALUE!`. A number counts as TRUE when it is not 0, a blank as\n * FALSE, text is `#VALUE!`, and an Error Value is the result. Nothing included is `if_empty`, or `#CALC!`.\n */\nexport function filter(call: FunctionCall): Operand {\n const array = arrayArgument(call, 0);\n if (array instanceof Operand) return array;\n const include = arrayArgument(call, 1);\n if (include instanceof Operand) return include;\n let byRows: boolean;\n if (include.columns === 1 && include.rows === array.rows) byRows = true;\n else if (include.rows === 1 && include.columns === array.columns) byRows = false;\n else return Operand.ofError('#VALUE!');\n\n const count = byRows ? array.rows : array.columns;\n const kept: number[] = [];\n for (let i = 0; i < count; i++) {\n const flag = byRows ? include.at(i, 0) : include.at(0, i);\n if (flag === undefined) continue;\n if (flag.isError) return Operand.of(flag);\n if (flag.kind === 'boolean') {\n if (flag.boolean) kept.push(i);\n } else if (flag.kind === 'number') {\n if (flag.number !== 0) kept.push(i);\n } else return Operand.ofError('#VALUE!');\n }\n if (kept.length === 0) return call.has(2) ? call.operand(2) : Operand.ofError('#CALC!');\n\n const result = byRows ? new ValueArray(kept.length, array.columns) : new ValueArray(array.rows, kept.length);\n kept.forEach((line, k) => {\n if (byRows) {\n for (let c = 0; c < array.columns; c++) result.set(k, c, array.at(line, c));\n } else {\n for (let r = 0; r < array.rows; r++) result.set(r, k, array.at(r, line));\n }\n });\n return made(result);\n}\n\n/**\n * UNIQUE: the distinct rows of `array` (its columns when `by_col` is TRUE), in the order they first appear; with\n * `exactly_once` TRUE, only those that appear once. Text is compared without regard to case; a number and text\n * that reads as one are different. A blank is one of a kind only with another blank (UNIQUE-010 to 015). Nothing\n * left is `#CALC!`.\n */\nexport function unique(call: FunctionCall): Operand {\n const array = arrayArgument(call, 0);\n if (array instanceof Operand) return array;\n const byColumn = flagArgument(call, 1);\n if (byColumn instanceof Operand) return byColumn;\n const exactlyOnce = flagArgument(call, 2);\n if (exactlyOnce instanceof Operand) return exactlyOnce;\n\n const count = byColumn ? array.columns : array.rows;\n const width = byColumn ? array.rows : array.columns;\n const item = (line: number, at: number): Value | undefined => byColumn ? array.at(at, line) : array.at(line, at);\n const same = (a: number, b: number): boolean => {\n for (let k = 0; k < width; k++) {\n if (!sameItem(item(a, k), item(b, k))) return false;\n }\n return true;\n };\n\n // Each line's first equal, then how many there are of it.\n const first: number[] = [];\n const occurrences = new Map<number, number>();\n for (let i = 0; i < count; i++) {\n first.push(i);\n for (let j = 0; j < i; j++) {\n if (first[j] === j && same(i, j)) {\n first[i] = j;\n break;\n }\n }\n const head = elementAt(first, i);\n occurrences.set(head, (occurrences.get(head) ?? 0) + 1); // oxlint-disable-line ex-grid/no-stand-in-default -- a line not yet counted has been seen 0 times\n }\n const kept: number[] = [];\n for (let i = 0; i < count; i++) {\n if (first[i] === i && (!exactlyOnce || occurrences.get(i) === 1)) kept.push(i);\n }\n if (kept.length === 0) return Operand.ofError('#CALC!');\n\n const result = byColumn ? new ValueArray(width, kept.length) : new ValueArray(kept.length, width);\n kept.forEach((line, k) => {\n for (let at = 0; at < width; at++) {\n if (byColumn) result.set(at, k, item(line, at));\n else result.set(k, at, item(line, at));\n }\n });\n return made(result);\n}\n\nfunction sameItem(x: Value | undefined, y: Value | undefined): boolean {\n if (x === undefined || y === undefined) return x === y;\n return x.kind === y.kind && (x.isError ? x.error === y.error : compareValues(x, y) === 0);\n}\n\n/**\n * SORT: `array`'s rows ordered by the column `sort_index` (from 1, the first when left out), ascending for\n * `sort_order` 1 and descending for \u22121; its columns, by a row, when `by_col` is TRUE. Equal keys keep their\n * order. Keys order as `orderLines` says, a blank last. An index outside the array, or an order other than 1 and\n * \u22121, is `#VALUE!` (SORT-007, 008). An index that is not a whole number is truncated (SORT-042).\n */\nexport function sort(call: FunctionCall): Operand {\n // A kept blank in the array is a blank key, sorted last as a blank cell's (SORT-038).\n const array = arrayArgument(call, 0, true);\n if (array instanceof Operand) return array;\n let index = 1;\n if (call.has(1)) {\n const given = numberArgument(call, 1);\n if (given instanceof Operand) return given;\n index = given;\n }\n const descending = orderArgument(call, 2);\n if (descending instanceof Operand) return descending;\n const byColumn = flagArgument(call, 3);\n if (byColumn instanceof Operand) return byColumn;\n index = Math.trunc(index);\n const lines = byColumn ? array.columns : array.rows;\n const across = byColumn ? array.rows : array.columns;\n if (index < 1 || index > across) return Operand.ofError('#VALUE!');\n const at = index - 1;\n const keys: (Value | undefined)[] = [];\n for (let i = 0; i < lines; i++) keys.push(byColumn ? array.at(at, i) : array.at(i, at));\n const order = orderLines([{ keys, descending }], lines);\n if (order === undefined) return call.evaluator.refuse();\n return made(reorder(array, order, byColumn));\n}\n\n/**\n * SORTBY: `array` ordered by one or more `by_array`s, each with its `sort_order` (1 when left out), the first\n * deciding first. Each `by_array` is one column as tall as the array, or one row as wide, and all of them run the\n * same way; any other shape is `#VALUE!`. Keys order as in `sort` (SORTBY-007 to 010).\n */\nexport function sortBy(call: FunctionCall): Operand {\n const array = arrayArgument(call, 0);\n if (array instanceof Operand) return array;\n let byColumn: boolean | undefined;\n const keys: SortKey[] = [];\n for (let i = 1; i < call.count; i += 2) {\n const by = arrayArgument(call, i);\n if (by instanceof Operand) return by;\n let columns: boolean;\n if (by.columns === 1 && by.rows === array.rows && (by.rows > 1 || array.columns === 1)) columns = false;\n else if (by.rows === 1 && by.columns === array.columns && by.columns > 1) columns = true;\n else return Operand.ofError('#VALUE!');\n if (byColumn !== undefined && byColumn !== columns) return Operand.ofError('#VALUE!');\n byColumn = columns;\n const descending = orderArgument(call, i + 1);\n if (descending instanceof Operand) return descending;\n const length = columns ? by.columns : by.rows;\n const values: (Value | undefined)[] = [];\n for (let k = 0; k < length; k++) values.push(columns ? by.at(0, k) : by.at(k, 0));\n keys.push({ keys: values, descending });\n }\n const lines = byColumn === true ? array.columns : array.rows;\n const order = orderLines(keys, lines);\n if (order === undefined) return call.evaluator.refuse();\n return made(reorder(array, order, byColumn === true));\n}\n\ninterface SortKey {\n readonly keys: readonly (Value | undefined)[];\n readonly descending: boolean;\n}\n\n/**\n * The order of `lines` lines by their keys, stable. A blank key comes after numbers, text, booleans and Error\n * Values whichever the order (SORT-011 to 014, 016 to 019, 024, 025, 031). An Error Value key sorts after every\n * other kind but the blank ascending, and before them descending (SORT-026, 028 to 030; SORTBY-010). Two\n * different Error Values are ordered where the readings their one observation leaves agree (`errorKeysSettled`);\n * `undefined` where they part.\n */\nfunction orderLines(keys: readonly SortKey[], lines: number): number[] | undefined {\n for (const { keys: values, descending } of keys) {\n if (!errorKeysSettled(values, descending)) return undefined;\n }\n const order: number[] = [];\n for (let i = 0; i < lines; i++) order.push(i);\n return order.toSorted((a, b) => {\n for (const { keys: values, descending } of keys) {\n const x = values[a];\n const y = values[b];\n let compared: number;\n if (x === undefined && y === undefined) compared = 0;\n else if (x === undefined) compared = 1;\n else if (y === undefined) compared = -1;\n else compared = descending ? -compareKeys(x, y) : compareKeys(x, y);\n if (compared !== 0) return compared;\n }\n return a - b;\n });\n}\n\nfunction errorOrdinal(error: ErrorValue): number {\n return errorValues.indexOf(error);\n}\n\n/** Two keys that are not blank, ascending: numbers, then text, then booleans, and then Error Values, two Error Values in `ERROR.TYPE`'s order. */\nfunction compareKeys(x: Value, y: Value): number {\n if (x.isError && y.isError) return Math.sign(errorOrdinal(x.error) - errorOrdinal(y.error));\n if (x.isError) return 1;\n if (y.isError) return -1;\n return compareValues(x, y);\n}\n\n/**\n * Whether a key's Error Values are ordered as every reading run 18a left orders them (SORT-032): different Error\n * Values are ordered ascending where `ERROR.TYPE`'s numbers and their texts give the one order, each of them one\n * of the seven `ERROR.TYPE` numbers; anything else, or two in a descending sort, refuses.\n */\nfunction errorKeysSettled(values: readonly (Value | undefined)[], descending: boolean): boolean {\n const errors: ErrorValue[] = [];\n for (const value of values) {\n if (value?.isError === true && !errors.includes(value.error)) errors.push(value.error);\n }\n if (errors.length < 2) return true;\n if (descending || errors.some(e => errorOrdinal(e) > errorOrdinal('#N/A'))) return false;\n const byNumber = errors.toSorted((a, b) => errorOrdinal(a) - errorOrdinal(b));\n const byText = errors.toSorted(compareIgnoreCase);\n return byNumber.every((e, i) => e === byText[i]);\n}\n\nfunction reorder(array: ValueArray, order: readonly number[], byColumn: boolean): ValueArray {\n const result = new ValueArray(array.rows, array.columns);\n order.forEach((line, k) => {\n if (byColumn) {\n for (let r = 0; r < array.rows; r++) result.set(r, k, array.at(r, line));\n } else {\n for (let c = 0; c < array.columns; c++) result.set(k, c, array.at(line, c));\n }\n });\n return result;\n}\n\n/** A sort order argument: 1 or left out is ascending (`false`), \u22121 descending, anything else `#VALUE!`. */\nfunction orderArgument(call: FunctionCall, index: number): boolean | Operand {\n if (!call.has(index)) return false;\n const order = numberArgument(call, index);\n if (order instanceof Operand) return order;\n if (order !== 1 && order !== -1) return Operand.ofError('#VALUE!');\n return order === -1;\n}\n\n/** A TRUE or FALSE argument, FALSE when left out; a number is TRUE when it is not 0, other text `#VALUE!`. */\nfunction flagArgument(call: FunctionCall, index: number): boolean | Operand {\n if (!call.has(index)) return false;\n const value = scalarArgument(call, index);\n if (value instanceof Operand) return value;\n if (value === undefined) return false;\n if (value.kind === 'boolean') return value.boolean;\n if (value.kind === 'number') return value.number !== 0;\n return Operand.ofError('#VALUE!');\n}\n\n/**\n * SEQUENCE: `rows` by `columns` numbers, row by row, from `start` by `step`, each 1 when left out and the sizes\n * truncated. A size of 0 is `#CALC!`, below 0 `#VALUE!`; an array larger than the engine can hold is `#NUM!`.\n */\nexport function sequence(call: FunctionCall): Operand {\n const rowsGiven = numberArgument(call, 0);\n if (rowsGiven instanceof Operand) return rowsGiven;\n let columns = 1;\n if (call.has(1)) {\n const given = numberArgument(call, 1);\n if (given instanceof Operand) return given;\n columns = given;\n }\n let start = 1;\n if (call.has(2)) {\n const given = numberArgument(call, 2);\n if (given instanceof Operand) return given;\n start = given;\n }\n let step = 1;\n if (call.has(3)) {\n const given = numberArgument(call, 3);\n if (given instanceof Operand) return given;\n step = given;\n }\n const rows = Math.trunc(rowsGiven);\n columns = Math.trunc(columns);\n if (rows < 0 || columns < 0) return Operand.ofError('#VALUE!');\n if (rows === 0 || columns === 0) return Operand.ofError('#CALC!');\n if (rows * columns > ValueArray.mostCells) return Operand.ofError('#NUM!');\n const result = new ValueArray(rows, columns);\n let k = 0;\n for (let r = 0; r < result.rows; r++) {\n for (let c = 0; c < result.columns; c++) result.set(r, c, Value.fromNumber(start + step * k++));\n }\n return Operand.ofArray(result);\n}\n\n/** TRANSPOSE: the array's rows as columns, a blank kept as `SORT`'s is (TRANSPOSE-004 to 006). */\nexport function transpose(call: FunctionCall): Operand {\n const array = arrayArgument(call, 0);\n if (array instanceof Operand) return array;\n const result = new ValueArray(array.columns, array.rows);\n for (let r = 0; r < array.rows; r++) {\n for (let c = 0; c < array.columns; c++) result.set(c, r, array.at(r, c));\n }\n return made(result);\n}\n\n/**\n * SUMPRODUCT: the sum of the products of its arrays' corresponding Values, the arrays all of one size, or\n * `#VALUE!`. Inside an array anything but a number counts as 0, as Microsoft documents, so a kept blank is 0\n * whichever way it is read; an Error Value is the result, and a sum past the largest double is `#NUM!`.\n */\nexport function sumProduct(call: FunctionCall): Operand {\n const arrays: ValueArray[] = [];\n for (let i = 0; i < call.count; i++) {\n if (!call.has(i)) return Operand.ofError('#VALUE!');\n const array = arrayArgument(call, i, true);\n if (array instanceof Operand) return array;\n const head = arrays[0];\n if (head !== undefined && (array.rows !== head.rows || array.columns !== head.columns)) return Operand.ofError('#VALUE!');\n arrays.push(array);\n }\n const head = elementAt(arrays, 0);\n let sum = 0;\n for (let r = 0; r < head.rows; r++) {\n for (let c = 0; c < head.columns; c++) {\n let product = 1;\n for (const array of arrays) {\n const value = array.at(r, c);\n if (value?.isError === true) return Operand.of(value);\n product *= value?.kind === 'number' ? value.number : 0;\n }\n sum += product;\n }\n }\n return numberResult(sum);\n}\n", "// SUM, AVERAGE, MIN, MAX, COUNT, COUNTA, IF, IFERROR, ISERROR and ROUND (C#'s Functions.cs).\nimport { Value } from '../../value';\nimport { finalAdd } from '../arithmetic';\nimport type { FunctionCall } from '../function-definition';\nimport { Operand } from '../operand';\nimport { roundAt } from '../rounding';\nimport { booleanResult, collectNumbers, isArray, numberArgument, numberResult, readsAsNumber, truthOf, unlifted } from './shared';\n\n/**\n * SUM of the numbers taken (`collectNumbers`). A kept blank (`Operand.keptBlank`) is passed over, as over a\n * blank cell: where it would be the last number, reading it as 0 would make another last addition, and Excel's\n * `=SUM(SORT(A1:A4))` over 0.1, 0.2, -0.3 and a blank is 0, the last addition of 0.2 cancelling, not 2.78E-17\n * (SORT-037, run 18a).\n */\nexport function sum(call: FunctionCall): Operand {\n const numbers: number[] = [];\n const error = collectNumbers(call, numbers);\n return error !== undefined ? Operand.ofError(error) : sumOf(numbers);\n}\n\n/**\n * SUM of the numbers taken. Its last addition cancels as a Formula's final addition does (ADR-0047, second run:\n * `=SUM(0.1,0.2,-0.3)` is 0), wherever SUM stands in the Formula.\n */\nexport function sumOf(numbers: readonly number[]): Operand {\n let total = 0;\n for (let i = 0; i < numbers.length; i++) {\n const n = numbers[i] as number; // oxlint-disable-line typescript/no-unsafe-type-assertion -- i is within the list\n total = i === numbers.length - 1 ? finalAdd(total, n) : total + n;\n }\n return numberResult(total);\n}\n\nexport function average(call: FunctionCall): Operand {\n const numbers: number[] = [];\n const error = collectNumbers(call, numbers);\n return error !== undefined ? Operand.ofError(error) : averageOf(numbers);\n}\n\n/** AVERAGE of the numbers taken; with none, `#DIV/0!`. */\nexport function averageOf(numbers: readonly number[]): Operand {\n if (numbers.length === 0) return Operand.ofError('#DIV/0!');\n let total = 0;\n for (const n of numbers) total += n;\n return numberResult(total / numbers.length);\n}\n\nexport function min(call: FunctionCall): Operand {\n const numbers: number[] = [];\n const error = collectNumbers(call, numbers);\n return error !== undefined ? Operand.ofError(error) : minOf(numbers);\n}\n\n/** MIN of the numbers taken; with none, 0. */\nexport function minOf(numbers: readonly number[]): Operand {\n let least = numbers.length === 0 ? 0 : Infinity;\n for (const n of numbers) least = Math.min(least, n);\n return Operand.of(Value.fromNumber(least));\n}\n\nexport function max(call: FunctionCall): Operand {\n const numbers: number[] = [];\n const error = collectNumbers(call, numbers);\n return error !== undefined ? Operand.ofError(error) : maxOf(numbers);\n}\n\n/** MAX of the numbers taken; with none, 0. */\nexport function maxOf(numbers: readonly number[]): Operand {\n let greatest = numbers.length === 0 ? 0 : -Infinity;\n for (const n of numbers) greatest = Math.max(greatest, n);\n return Operand.of(Value.fromNumber(greatest));\n}\n\n/**\n * Inside a range, only numbers are counted. Typed directly, numbers, booleans and text that reads as a number\n * are counted; Error Values and other text are not, and are not errors. A kept blank (`Operand.keptBlank`) is\n * no number, and is not counted, as Excel's `COUNT` did not count `SORT`'s (SORT-034, run 18a).\n */\nexport function count(call: FunctionCall): Operand {\n const evaluator = call.evaluator;\n let counted = 0;\n for (let i = 0; i < call.count; i++) {\n const operand = call.keepingBlanks(i);\n switch (operand.kind) {\n case 'area':\n case 'column':\n case 'array':\n case 'threeD':\n for (const value of evaluator.rangeValues(operand)) {\n if (value.kind === 'number') counted++;\n }\n break;\n case 'missing':\n counted++;\n break;\n case 'scalar': {\n const scalar = operand.scalar;\n if (scalar === undefined) break;\n if (scalar.kind === 'number' || scalar.kind === 'boolean') counted++;\n else if (scalar.kind === 'text' && readsAsNumber(scalar.text, evaluator)) counted++;\n break;\n }\n default: throw new Error(`Internal: ${String(operand.kind)} is no kind of operand.`);\n }\n }\n return Operand.of(Value.fromNumber(counted));\n}\n\n/**\n * Counts every value that is not blank: Error Values and empty text included. A kept blank in its array\n * (`Operand.keptBlank`) is counted, as Excel counted `SORT`'s and `UNIQUE`'s (SORT-021, UNIQUE-017; ADR-0125),\n * and `SORTBY`'s, `FILTER`'s and `TRANSPOSE`'s are counted as those are; and given as one Value it is counted\n * too, as Excel counted the one `INDEX` took out of `SORT`'s array and `UNIQUE`'s of one blank cell (SORT-035,\n * UNIQUE-023, run 18a).\n */\nexport function countA(call: FunctionCall): Operand {\n const evaluator = call.evaluator;\n let counted = 0;\n for (let i = 0; i < call.count; i++) {\n const operand = call.keepingBlanks(i);\n if (operand.keptBlank && operand.kind !== 'array') {\n counted++;\n continue;\n }\n switch (operand.kind) {\n case 'array':\n if (operand.keptBlank) {\n const array = operand.arrayOf();\n counted += array.rows * array.columns;\n break;\n }\n for (const _ of evaluator.rangeValues(operand)) counted++;\n break;\n case 'area':\n case 'column':\n case 'threeD':\n for (const _ of evaluator.rangeValues(operand)) counted++;\n break;\n case 'missing':\n counted++;\n break;\n case 'scalar':\n if (operand.scalar !== undefined) counted++;\n break;\n default: throw new Error(`Internal: ${String(operand.kind)} is no kind of operand.`);\n }\n }\n return Operand.of(Value.fromNumber(counted));\n}\n\nexport function ifFunction(call: FunctionCall): Operand {\n const test = call.operand(0);\n if (isArray(test)) return unlifted(call);\n const condition = call.evaluator.scalarOf(test);\n let truth = false;\n if (condition !== undefined) {\n const read = truthOf(condition);\n if (read === undefined) return Operand.ofError(condition.isError ? condition.error : '#VALUE!');\n truth = read;\n }\n // The branch taken is handed on as it is, a kept blank still marked: Excel's ISBLANK read SORT's kept blank\n // through IF as blank (SORT-039, run 18a).\n if (truth) return call.has(1) ? call.keepingBlanks(1) : Operand.of(Value.fromNumber(0));\n if (call.count < 3) return booleanResult(false);\n return call.has(2) ? call.keepingBlanks(2) : Operand.of(Value.fromNumber(0));\n}\n\n/**\n * An empty cell as either argument gives an empty value: a Formula whose result it is shows 0, as Excel was\n * observed to show, and joined to text it is \"\" (IFERROR-013). A value_if_error left out is empty too, not 0\n * (IFERROR-016). An Error Value is caught \u2014 but not `#GETTING_DATA`, which waits (ADR-0049), nor `#CIRC!`,\n * which a Formula reading a cycle shows whatever it computes (ADR-0047).\n */\nexport function ifError(call: FunctionCall): Operand {\n const operand = call.operand(0);\n if (isArray(operand)) return unlifted(call);\n const value = call.evaluator.scalarOf(operand);\n if (value?.isError === true && value.error !== '#GETTING_DATA' && value.error !== '#CIRC!') return fallbackOf(call);\n return Operand.ofScalar(value);\n}\n\n/** IFERROR's and IFNA's fallback: blank when left out, a 3D Reference handed on, as Excel's fallback was (ADR-0331 \u00A77). */\nexport function fallbackOf(call: FunctionCall): Operand {\n if (!call.has(1)) return Operand.blank;\n const fallback = call.operand(1);\n if (fallback.kind === 'threeD') return fallback;\n if (isArray(fallback)) return unlifted(call);\n return Operand.ofScalar(call.evaluator.scalarOf(fallback));\n}\n\nexport function isError(call: FunctionCall): Operand {\n const operand = call.oneValue(0);\n if (isArray(operand)) return unlifted(call);\n const value = call.evaluator.scalarOf(operand);\n if (value?.isError === true && (value.error === '#GETTING_DATA' || value.error === '#CIRC!')) return Operand.of(value);\n return booleanResult(value?.isError === true);\n}\n\nexport function round(call: FunctionCall): Operand {\n const evaluator = call.evaluator;\n const first = call.operand(0);\n const second = call.operand(1);\n if (isArray(first) || isArray(second)) return unlifted(call);\n const number = evaluator.toNumber(evaluator.scalarOf(first));\n if (typeof number !== 'number') return Operand.ofError(number);\n const digits = evaluator.toNumber(evaluator.scalarOf(second));\n if (typeof digits !== 'number') return Operand.ofError(digits);\n return numberResult(roundAt(number, Math.trunc(digits), 'halfAwayFromZero'));\n}\n\n/** ROUNDUP and ROUNDDOWN. */\nexport function roundBy(call: FunctionCall, rounding: 'awayFromZero' | 'towardZero'): Operand {\n const number = numberArgument(call, 0);\n if (number instanceof Operand) return number;\n const digits = numberArgument(call, 1);\n if (digits instanceof Operand) return digits;\n return numberResult(roundAt(number, Math.trunc(digits), rounding));\n}\n", "// SUMIF, SUMIFS, COUNTIF, COUNTIFS, AVERAGEIF, AVERAGEIFS, MAXIFS, MINIFS and COUNTBLANK (C#'s\n// Functions.Criteria.cs): a criterion read from text, matched against each cell of a range.\nimport { CellAddress, columnCount, rowCount } from '../../cell-address';\nimport { equalsIgnoreCase, tryParseInvariantDouble } from '../../dotnet';\nimport { errorValues, Value } from '../../value';\nimport type { Culture } from '../../culture';\nimport { compareValues, isMulti } from '../evaluator';\nimport type { FunctionCall } from '../function-definition';\nimport { literalReference } from '../nodes';\nimport { Operand } from '../operand';\nimport { Area } from '../reference';\nimport { numberResult, unlifted } from './shared';\n\nexport function sumIf(call: FunctionCall): Operand { return conditionalAggregate(call, 'sum', true); }\nexport function sumIfs(call: FunctionCall): Operand { return conditionalAggregate(call, 'sum', false); }\nexport function countIf(call: FunctionCall): Operand { return conditionalAggregate(call, 'count', true); }\nexport function countIfs(call: FunctionCall): Operand { return conditionalAggregate(call, 'count', false); }\nexport function averageIf(call: FunctionCall): Operand { return conditionalAggregate(call, 'average', true); }\nexport function averageIfs(call: FunctionCall): Operand { return conditionalAggregate(call, 'average', false); }\nexport function maxIfs(call: FunctionCall): Operand { return conditionalAggregate(call, 'maximum', false); }\nexport function minIfs(call: FunctionCall): Operand { return conditionalAggregate(call, 'minimum', false); }\n\n/** COUNTBLANK: the cells of a range that are blank or hold empty text. */\nexport function countBlank(call: FunctionCall): Operand {\n const operand = call.operand(0);\n if (operand.isError) return operand;\n const range = CriteriaRange.from(operand);\n if (range === undefined) return Operand.ofError('#VALUE!');\n let count = range.count;\n for (const position of range.occupied()) {\n const value = range.read(position);\n if (value !== undefined && !(value.kind === 'text' && value.text.length === 0)) count--;\n }\n return Operand.of(Value.fromNumber(count));\n}\n\ntype CriteriaAggregate = 'sum' | 'count' | 'average' | 'maximum' | 'minimum';\n\ninterface Condition {\n readonly range: CriteriaRange;\n readonly test: Criterion;\n}\n\nfunction conditionalAggregate(call: FunctionCall, aggregate: CriteriaAggregate, single: boolean): Operand {\n const counting = aggregate === 'count';\n const from = single || counting ? 0 : 1;\n const conditions: Condition[] = [];\n for (let i = from; i < (single ? 2 : call.count); i += 2) {\n const operand = call.operand(i);\n if (operand.isError) return operand;\n const range = CriteriaRange.from(operand);\n if (range === undefined) return Operand.ofError('#VALUE!');\n const criterionOperand = call.operand(i + 1);\n if (isMulti(criterionOperand)) return unlifted(call);\n const criterion = Criterion.parse(call.evaluator.scalarOf(criterionOperand), call.evaluator.culture);\n // A criterion outside the domain the runs settled is refused (ADR-0047): the Formula's.\n if (criterion === undefined) return call.evaluator.refuse();\n const firstCondition = conditions[0];\n if (firstCondition !== undefined && !range.sameShape(firstCondition.range)) return Operand.ofError('#VALUE!');\n conditions.push({ range, test: criterion });\n }\n const leading = conditions[0];\n if (leading === undefined) throw new Error('Internal: a conditional aggregate is called with a condition.');\n const first = leading.range;\n let results: CriteriaRange | undefined;\n if (!counting) {\n const operand = single && call.count > 2 ? call.operand(2) : call.operand(0);\n if (operand.isError) return operand;\n results = CriteriaRange.from(operand);\n if (results === undefined) return Operand.ofError('#VALUE!');\n if (!results.sameShape(first)) {\n // The ranges of SUMIFS and its partners differ in shape: #VALUE!, as Excel's (SUMIFS-035).\n if (!single) return Operand.ofError('#VALUE!');\n // SUMIF/AVERAGEIF read a footprint starting at the result's top-left cell.\n // A computed Reference that escapes its named dependencies stays refused: the Formula's.\n const criteriaReference = literalReference(call.argument(0));\n const resultReference = call.count > 2 ? literalReference(call.argument(2)) : undefined;\n if (operand.kind !== 'area' || call.count <= 2\n || criteriaReference === undefined || criteriaReference.spilled\n || resultReference === undefined || resultReference.spilled) return call.evaluator.refuse();\n const a = operand.area;\n if (a.row1 + first.rows > rowCount || a.column1 + first.columns > columnCount) return Operand.ofError('#REF!');\n results = new CriteriaRange(operand.sameSheet(new Area(a.row1, a.column1, a.row1 + first.rows - 1, a.column1 + first.columns - 1)),\n first.rows, first.columns);\n }\n }\n\n // A range's absent cells matter to conditions. Count them without materialising an\n // entire column, then visit the union of occupied positions to correct that count.\n const occupied = new Set<number>();\n if (results === undefined) {\n for (const condition of conditions) for (const position of condition.range.occupied()) occupied.add(position);\n } else {\n for (const position of results.occupied()) occupied.add(position);\n }\n const positions = [...occupied].toSorted((a, b) => a - b);\n const emptyMatches = counting && conditions.every(c => c.test.matches(undefined) === true);\n let count = emptyMatches ? first.count - positions.length : 0;\n let total = 0;\n let extreme = 0;\n for (const position of positions) {\n let matches = true;\n for (const condition of conditions) {\n const match = condition.test.matches(condition.range.read(position));\n // A candidate outside the domain the runs settled refuses the Formula (ADR-0047).\n if (match === undefined) return call.evaluator.refuse();\n if (!match) matches = false;\n }\n if (!matches) continue;\n if (results === undefined) {\n count++;\n continue;\n }\n const value = results.read(position);\n if (value?.isError === true) return Operand.of(value);\n if (value?.kind !== 'number') continue;\n const number = value.number;\n if (count === 0) extreme = number;\n else extreme = aggregate === 'maximum' ? Math.max(extreme, number) : Math.min(extreme, number);\n total += number;\n count++;\n }\n switch (aggregate) {\n case 'count': return Operand.of(Value.fromNumber(count));\n case 'average': return count === 0 ? Operand.ofError('#DIV/0!') : numberResult(total / count);\n case 'maximum':\n case 'minimum':\n return Operand.of(Value.fromNumber(extreme));\n case 'sum': return numberResult(total);\n default: throw new Error(`Internal: ${String(aggregate)} is no conditional aggregate.`);\n }\n}\n\n/** A range a criterion is matched against, or whose numbers are aggregated: a rectangle of cells or a Linked Table's column. */\nclass CriteriaRange {\n readonly #operand: Operand;\n readonly rows: number;\n readonly columns: number;\n\n constructor(operand: Operand, rows: number, columns: number) {\n this.#operand = operand;\n this.rows = rows;\n this.columns = columns;\n }\n\n get count(): number {\n return this.rows * this.columns;\n }\n\n sameShape(other: CriteriaRange): boolean {\n return this.rows === other.rows && this.columns === other.columns;\n }\n\n static from(operand: Operand): CriteriaRange | undefined {\n switch (operand.kind) {\n case 'area': return new CriteriaRange(operand, operand.area.rows, operand.area.columns);\n case 'column': return new CriteriaRange(operand, operand.columnOf().length, 1);\n case 'scalar':\n case 'missing':\n case 'array':\n case 'threeD':\n return undefined;\n default: throw new Error(`Internal: ${String(operand.kind)} is no kind of operand.`);\n }\n }\n\n /** The Value at a position counted row by row from the top-left cell, blank as `undefined`. */\n read(position: number): Value | undefined {\n const operand = this.#operand;\n if (operand.kind === 'area') {\n return operand.cellsOf().read(new CellAddress(operand.area.row1 + Math.floor(position / this.columns), operand.area.column1 + position % this.columns));\n }\n return operand.columnOf()[position];\n }\n\n /** The positions that are not blank. */\n *occupied(): Generator<number> {\n const operand = this.#operand;\n if (operand.kind === 'area') {\n for (const address of operand.cellsOf().nonBlankIn(operand.area)) {\n yield (address.row - operand.area.row1) * this.columns + address.column - operand.area.column1;\n }\n } else {\n const column = operand.columnOf();\n for (let i = 0; i < this.rows; i++) if (column[i] !== undefined) yield i;\n }\n }\n}\n\ntype CriterionOperator = '=' | '<>' | '<' | '>' | '<=' | '>=';\n\n/** Whether text holds a character outside what the runs settled for criteria: beyond ASCII, or a separator a culture reads its own way. */\nfunction unsettledCharacter(text: string): boolean {\n for (let i = 0; i < text.length; i++) {\n const c = text.charAt(i);\n if (text.charCodeAt(i) > 127 || c === ',' || c === '/' || c === ':' || c === '%' || c === '$') return true;\n }\n return false;\n}\n\n/** Whether text holds a character beyond ASCII. */\nfunction beyondAscii(text: string): boolean {\n for (let i = 0; i < text.length; i++) if (text.charCodeAt(i) > 127) return true;\n return false;\n}\n\n/** .NET's `bool.TryParse`: `True` or `False` in any case, white space and NUL trimmed from either end. */\nfunction tryParseBoolean(text: string): boolean | undefined {\n let start = 0;\n let end = text.length;\n while (start < end && trimmable(text.charCodeAt(start))) start++;\n while (end > start && trimmable(text.charCodeAt(end - 1))) end--;\n const word = text.slice(start, end).toLowerCase();\n return word === 'true' ? true : word === 'false' ? false : undefined;\n}\n\n/** White space or NUL, as .NET's `bool.TryParse` trims them, for the ASCII the criteria admit. */\nfunction trimmable(c: number): boolean {\n return c === 0 || c === 0x20 || (c >= 0x09 && c <= 0x0d) || c === 0x85 || c === 0xa0;\n}\n\n/** Whether a numeric text holds at most fifteen digits before its exponent, the digits a double holds without doubt. */\nfunction shortNumericText(text: string): boolean {\n let digits = 0;\n for (let i = 0; i < text.length; i++) {\n const c = text.charAt(i);\n if (c === 'e' || c === 'E') break;\n if (c >= '0' && c <= '9') digits++;\n }\n return digits <= 15;\n}\n\n/** A criterion as `COUNTIF` and its kin read one: an operator and the Value it compares with, or a test for absent cells alone. */\nclass Criterion {\n readonly operator: CriterionOperator;\n readonly wanted: Value | undefined;\n readonly onlyAbsent: boolean;\n readonly dotDecimal: boolean;\n\n private constructor(operator: CriterionOperator, wanted: Value | undefined, onlyAbsent: boolean, dotDecimal: boolean) {\n this.operator = operator;\n this.wanted = wanted;\n this.onlyAbsent = onlyAbsent;\n this.dotDecimal = dotDecimal;\n }\n\n /** The criterion a Value states, or `undefined` where its reading is one the runs have not settled (a refusal). */\n static parse(value: Value | undefined, culture: Culture): Criterion | undefined {\n const dotDecimal = culture.data.numberDecimalSeparator === '.';\n if (!dotDecimal && value?.kind === 'text' && value.text.includes('.')) return undefined;\n return Criterion.#parseValue(value, dotDecimal);\n }\n\n static #parseValue(value: Value | undefined, dotDecimal: boolean): Criterion | undefined {\n const make = (operator: CriterionOperator, wanted: Value | undefined, onlyAbsent = false): Criterion =>\n new Criterion(operator, wanted, onlyAbsent, dotDecimal);\n if (value === undefined) return make('=', Value.fromNumber(0));\n if (value.kind !== 'text') return make('=', value);\n const written = value.text;\n let s = written;\n if (s.length > 255) return undefined;\n let op: CriterionOperator = '=';\n if (s.startsWith('<>') || s.startsWith('<=') || s.startsWith('>=')) {\n op = s.slice(0, 2) as CriterionOperator; // oxlint-disable-line typescript/no-unsafe-type-assertion -- one of the three just tested\n s = s.slice(2);\n } else if (s.startsWith('=') || s.startsWith('<') || s.startsWith('>')) {\n op = s.slice(0, 1) as CriterionOperator; // oxlint-disable-line typescript/no-unsafe-type-assertion -- one of the three just tested\n s = s.slice(1);\n }\n const equality = op === '=' || op === '<>';\n if (s.length === 0 && written.length > 0) return equality ? make(op, undefined, true) : undefined;\n for (const error of errorValues) {\n if (equalsIgnoreCase(s, error)) return equality ? make(op, Value.fromError(error)) : undefined;\n }\n // Criteria numbers are culture-sensitive; only the invariant numeric spelling is\n // admitted until the other cultures have been observed. Unicode text is likewise\n // refused instead of delegating its matching to a platform-dependent collation.\n if (unsettledCharacter(s)) return undefined;\n const number = tryParseInvariantDouble(s);\n if (number !== undefined) return Number.isFinite(number) && shortNumericText(s) ? make(op, Value.fromNumber(number)) : undefined;\n const boolean = tryParseBoolean(s);\n if (boolean !== undefined) return equality ? make(op, Value.fromBoolean(boolean)) : undefined;\n return equality ? make(op, Value.fromText(s)) : undefined;\n }\n\n /** Whether a cell's Value meets the criterion; `undefined` where the answer is one the runs have not settled (a refusal). */\n matches(candidate: Value | undefined): boolean | undefined {\n if (this.onlyAbsent) {\n switch (this.operator) {\n case '=': return candidate === undefined;\n case '<>': return candidate !== undefined;\n case '<':\n case '>':\n case '<=':\n case '>=':\n return false;\n default: throw new Error(`Internal: ${String(this.operator)} is no criterion operator.`);\n }\n }\n const wanted = this.wanted;\n if (wanted === undefined) throw new Error('Internal: a criterion that is not for absent cells wants a Value.');\n if (wanted.kind === 'number') {\n if (candidate?.kind === 'number') return this.#compare(compareValues(candidate, wanted));\n if (this.operator === '=' && candidate?.kind === 'text') {\n const text = candidate.text;\n if (unsettledCharacter(text) || (!this.dotDecimal && text.includes('.'))) return undefined;\n const number = tryParseInvariantDouble(text);\n if (number !== undefined) {\n return Number.isFinite(number) && shortNumericText(text) ? compareValues(Value.fromNumber(number), wanted) === 0 : undefined;\n }\n }\n return this.operator === '<>';\n }\n if (wanted.kind === 'boolean' || wanted.kind === 'error') {\n const same = candidate !== undefined && candidate.kind === wanted.kind && candidate.equals(wanted);\n return this.operator === '=' ? same : this.operator === '<>' && !same;\n }\n if (candidate === undefined) return (wanted.text.length === 0 && this.operator === '=') || (wanted.text.length > 0 && this.operator === '<>');\n if (candidate.kind !== 'text') return this.operator === '<>';\n if (beyondAscii(candidate.text)) return undefined;\n const sameText = matchesCriteriaText(wanted.text, candidate.text);\n return this.operator === '=' ? sameText : !sameText;\n }\n\n #compare(comparison: number): boolean {\n switch (this.operator) {\n case '=': return comparison === 0;\n case '<>': return comparison !== 0;\n case '<': return comparison < 0;\n case '>': return comparison > 0;\n case '<=': return comparison <= 0;\n case '>=': return comparison >= 0;\n default: throw new Error(`Internal: ${String(this.operator)} is no criterion operator.`);\n }\n }\n}\n\n/** Upper case as `char.ToUpperInvariant` makes it, for the ASCII a criterion's text is held to. */\nfunction upperAscii(c: number): number {\n return c >= 0x61 && c <= 0x7a ? c - 0x20 : c;\n}\n\n/** Whether text matches a criterion's pattern, without regard to case: `*` any run, `?` any one character, `~` before either a literal. */\nfunction matchesCriteriaText(pattern: string, text: string): boolean {\n // Criteria escape '*' and '?' with '~'; an ordinary or repeated tilde stays literal.\n // Keep a last-star position for backtracking without recursion or a regex engine.\n let p = 0;\n let t = 0;\n let star = -1;\n let retry = 0;\n while (t < text.length) {\n if (p < pattern.length && pattern.charAt(p) === '*') {\n star = ++p;\n retry = t;\n continue;\n }\n if (p < pattern.length) {\n let c = pattern.charAt(p);\n let size = 1;\n const any = c === '?';\n const next = pattern.charAt(p + 1);\n if (c === '~' && p + 1 < pattern.length && (next === '*' || next === '?')) {\n c = next;\n size = 2;\n }\n if (any || upperAscii(c.charCodeAt(0)) === upperAscii(text.charCodeAt(t))) {\n p += size;\n t++;\n continue;\n }\n }\n if (star < 0) return false;\n p = star;\n t = ++retry;\n }\n while (p < pattern.length && pattern.charAt(p) === '*') p++;\n return p === pattern.length;\n}\n", "// DATE, TODAY, YEAR, MONTH, DAY, EOMONTH, EDATE, WEEKDAY, DAYS, NETWORKDAYS, WORKDAY, TIME, HOUR, MINUTE,\n// SECOND and NOW over Excel's 1900 serials (C#'s Functions.Dates.cs); DATEDIF and YEARFRAC\n// (Functions.DateDifferences.cs).\nimport { dateFromSerial, dayNumber, daysInMonth, isLeapYear, maximumSerial, serialDayOfWeek, serialFromDate } from '../../date-serial';\nimport { roundHalfAwayFromZero, toUpperInvariant } from '../../dotnet';\nimport { defined } from '../../must';\nimport { Value } from '../../value';\nimport type { FunctionCall } from '../function-definition';\nimport { Operand } from '../operand';\nimport { numberArgument, scalarArgument, textArgument } from './shared';\n\ninterface CalendarDay {\n readonly year: number;\n readonly month: number;\n readonly day: number;\n}\n\nfunction serialResult(serial: number): Operand {\n return Operand.of(Value.fromNumber(serial));\n}\n\n/**\n * DATE: each argument truncated to a whole number. A year from 0 to 1899 has 1900 added, and a year below 0 or\n * from 10000 is `#NUM!`. Months and days outside their ranges roll over into the years and months beside them;\n * the days run on Excel's calendar, so DATE(1900,2,29) is serial 60 and DATE(1900,2,30) is 1 March. A result\n * outside serials 0 to 31 December 9999 is `#NUM!`.\n */\nexport function dateFunction(call: FunctionCall): Operand {\n const yearGiven = numberArgument(call, 0);\n if (yearGiven instanceof Operand) return yearGiven;\n const monthGiven = numberArgument(call, 1);\n if (monthGiven instanceof Operand) return monthGiven;\n const dayGiven = numberArgument(call, 2);\n if (dayGiven instanceof Operand) return dayGiven;\n let year = Math.trunc(yearGiven);\n const month = Math.trunc(monthGiven);\n const day = Math.trunc(dayGiven);\n if (year < 0 || year >= 10000) return Operand.ofError('#NUM!');\n if (year < 1900) year += 1900;\n\n // The first of the month the year and month name, with the months rolled over.\n const months = year * 12 + (month - 1);\n const firstYear = Math.floor(months / 12);\n if (firstYear < 1 || firstYear > 9999) return Operand.ofError('#NUM!');\n const firstMonth = Math.trunc(months - firstYear * 12) + 1;\n const first = serialOfFirst(firstYear, firstMonth);\n\n const serial = first + (day - 1);\n if (serial < 0 || serial > maximumSerial) return Operand.ofError('#NUM!');\n return serialResult(serial);\n}\n\n/** The serial of the first of a month, counted on Excel's calendar from any year from 1: before 1900 it is negative, and from March 1900 it counts the day that never existed. */\nfunction serialOfFirst(year: number, month: number): number {\n const days = dayNumber(year, month, 1) - dayNumber(1899, 12, 31);\n return days >= 60 ? days + 1 : days;\n}\n\n/** TODAY: the Sheet Day's serial (ADR-0121); `#GETTING_DATA` while the day is not known. */\nexport function today(call: FunctionCall): Operand {\n const day = call.evaluator.cells.today;\n const serial = day === undefined ? undefined : serialFromDate(day.year, day.month, day.day);\n return serial === undefined ? Operand.ofError('#GETTING_DATA') : serialResult(serial);\n}\n\nexport function yearFunction(call: FunctionCall): Operand {\n return datePart(call, date => date.year);\n}\n\nexport function monthFunction(call: FunctionCall): Operand {\n return datePart(call, date => date.month);\n}\n\nexport function dayFunction(call: FunctionCall): Operand {\n return datePart(call, date => date.day);\n}\n\n/**\n * YEAR, MONTH and DAY: the serial cut down to its day; serial 0 is 0 January 1900, and serial 60 is 29 February\n * 1900. A serial below 0 or after 31 December 9999 is `#NUM!`, -0.5 included (YEAR-008, MONTH-005, DAY-005).\n */\nfunction datePart(call: FunctionCall, part: (date: CalendarDay) => number): Operand {\n const given = numberArgument(call, 0);\n if (given instanceof Operand) return given;\n const serial = Math.floor(given);\n if (serial < 0 || serial > maximumSerial) return Operand.ofError('#NUM!');\n return Operand.of(Value.fromNumber(part(dateFromSerial(serial))));\n}\n\nexport function eoMonth(call: FunctionCall): Operand {\n return monthsAway(call, true);\n}\n\nexport function eDate(call: FunctionCall): Operand {\n return monthsAway(call, false);\n}\n\n/**\n * EOMONTH and EDATE: the start date is cut down to its day, and the months are truncated to a whole number.\n * EDATE keeps the start's day, or the month's last day where the month is shorter; EOMONTH gives the month's\n * last day. The months are counted on the real calendar, and a day before 1 March 1900 is its own serial\n * (EOMONTH-008, EDATE-008, EOMONTH-010, EDATE-010). EDATE from serial 0 keeps its day 0, the day before the 1st\n * of the month it reaches (EDATE-016, 018 to 020). A start below 0, or a result before 1900 or after 9999, is\n * `#NUM!`; a boolean typed into either argument is `#VALUE!` (EOMONTH-009, EDATE-009, EOMONTH-018, EDATE-023).\n */\nfunction monthsAway(call: FunctionCall, endOfMonth: boolean): Operand {\n for (let i = 0; i < 2; i++) {\n const value = scalarArgument(call, i);\n if (value instanceof Operand) return value;\n if (value?.kind === 'boolean') return Operand.ofError('#VALUE!');\n }\n const startGiven = numberArgument(call, 0);\n if (startGiven instanceof Operand) return startGiven;\n const monthsGiven = numberArgument(call, 1);\n if (monthsGiven instanceof Operand) return monthsGiven;\n const start = Math.floor(startGiven);\n const months = Math.trunc(monthsGiven);\n if (start < 0 || start > maximumSerial) return Operand.ofError('#NUM!');\n\n const from = dateFromSerial(start);\n const total = from.year * 12 + (from.month - 1) + months;\n const toYear = Math.floor(total / 12);\n if (toYear < 1900 || toYear > 9999) return Operand.ofError('#NUM!');\n const toMonth = Math.trunc(total - toYear * 12) + 1;\n if (!endOfMonth && from.day === 0) return serialResult(defined(serialFromDate(toYear, toMonth, 1), 'the first of a month from 1900 to 9999') - 1);\n const length = daysInMonth(toYear, toMonth);\n return serialResult(defined(serialFromDate(toYear, toMonth, endOfMonth ? length : Math.min(from.day, length)), 'a day from 1900 to 9999'));\n}\n\n/**\n * WEEKDAY: the day of the week of the serial, on Excel's calendar (serial 1 is a Sunday), as `return_type`\n * numbers it \u2014 1 or 17 from Sunday, 2 or 11 from Monday, 3 from Monday at 0, and 12 to 16 from Tuesday to\n * Saturday. The serial is cut down to its day. Another type, or a serial outside 0 to 31 December 9999, is\n * `#NUM!`, -0.5 included (WEEKDAY-008).\n */\nexport function weekday(call: FunctionCall): Operand {\n const given = numberArgument(call, 0);\n if (given instanceof Operand) return given;\n const serial = Math.floor(given);\n if (serial < 0 || serial > maximumSerial) return Operand.ofError('#NUM!');\n let type = 1;\n if (call.has(1)) {\n const typeGiven = numberArgument(call, 1);\n if (typeGiven instanceof Operand) return typeGiven;\n type = typeGiven;\n }\n const d = serialDayOfWeek(serial);\n let number: number;\n switch (Math.trunc(type)) {\n case 1:\n case 17:\n number = d + 1;\n break;\n case 2:\n case 11:\n number = ((d + 6) % 7) + 1;\n break;\n case 3: number = (d + 6) % 7; break;\n case 12: number = ((d + 5) % 7) + 1; break;\n case 13: number = ((d + 4) % 7) + 1; break;\n case 14: number = ((d + 3) % 7) + 1; break;\n case 15: number = ((d + 2) % 7) + 1; break;\n case 16: number = ((d + 1) % 7) + 1; break;\n default: return Operand.ofError('#NUM!');\n }\n return Operand.of(Value.fromNumber(number));\n}\n\n/** DAYS: `end_date - start_date`, each cut down to its day; a serial outside 0 to 31 December 9999 is `#NUM!`, -0.5 included (DAYS-005). */\nexport function daysFunction(call: FunctionCall): Operand {\n const endGiven = numberArgument(call, 0);\n if (endGiven instanceof Operand) return endGiven;\n const startGiven = numberArgument(call, 1);\n if (startGiven instanceof Operand) return startGiven;\n const end = Math.floor(endGiven);\n const start = Math.floor(startGiven);\n if (end < 0 || start < 0 || end > maximumSerial || start > maximumSerial) return Operand.ofError('#NUM!');\n return Operand.of(Value.fromNumber(end - start));\n}\n\n/**\n * A date argument of NETWORKDAYS and WORKDAY, cut down to its day: a boolean typed is `#VALUE!` (NETWORKDAYS-010,\n * WORKDAY-011); below 0 or past 31 December 9999 is `#NUM!`, -0.5 included (NETWORKDAYS-009, WORKDAY-010).\n * Every serial from 0 is a day and takes the day of the week WEEKDAY gives it (NETWORKDAYS-005).\n */\nfunction workdayDate(call: FunctionCall, index: number): number | Operand {\n const value = scalarArgument(call, index);\n if (value instanceof Operand) return value;\n if (value?.kind === 'boolean') return Operand.ofError('#VALUE!');\n const given = numberArgument(call, index);\n if (given instanceof Operand) return given;\n const number = Math.floor(given);\n if (number < 0 || number > maximumSerial) return Operand.ofError('#NUM!');\n return number;\n}\n\n/**\n * The holidays argument: a range's numbers and a typed number, each truncated to its day. Text among them is\n * `#VALUE!`, as Excel's is (WORKDAY-005); a boolean among them is refused until Excel is asked; an Error Value is\n * the result.\n */\nfunction holidaysOf(call: FunctionCall, index: number): Set<number> | Operand {\n const holidays = new Set<number>();\n if (!call.has(index)) return holidays;\n const operand = call.operand(index);\n let values: Iterable<Value>;\n if (operand.isRange) values = call.evaluator.rangeValues(operand);\n else if (operand.scalar !== undefined) values = [operand.scalar];\n else return holidays;\n for (const value of values) {\n if (value.isError) return Operand.of(value);\n if (value.kind !== 'number') return value.kind === 'boolean' ? call.evaluator.refuse() : Operand.ofError('#VALUE!');\n holidays.add(Math.floor(value.number));\n }\n return holidays;\n}\n\nfunction isWeekday(serial: number): boolean {\n const d = serialDayOfWeek(serial);\n return d !== 0 && d !== 6;\n}\n\n/** NETWORKDAYS: the days from `start_date` to `end_date`, both counted, that fall from Monday to Friday and are not holidays; negative when the start is after the end. */\nexport function networkDays(call: FunctionCall): Operand {\n const start = workdayDate(call, 0);\n if (start instanceof Operand) return start;\n const end = workdayDate(call, 1);\n if (end instanceof Operand) return end;\n const holidays = holidaysOf(call, 2);\n if (holidays instanceof Operand) return holidays;\n const [from, to, sign] = start <= end ? [start, end, 1] : [end, start, -1];\n const span = to - from + 1;\n const weeks = Math.trunc(span / 7);\n let counted = weeks * 5;\n for (let serial = from + weeks * 7; serial <= to; serial++) {\n if (isWeekday(serial)) counted++;\n }\n for (const h of holidays) {\n if (h >= from && h <= to && isWeekday(h)) counted--;\n }\n return Operand.of(Value.fromNumber(sign * counted));\n}\n\n/**\n * WORKDAY: the day `days` working days after `start_date` (before it when negative), passing over weekends and\n * holidays; `days` truncated, and 0 gives the start itself. A result before serial 0 or past 31 December 9999 is\n * `#NUM!`.\n */\nexport function workday(call: FunctionCall): Operand {\n const start = workdayDate(call, 0);\n if (start instanceof Operand) return start;\n const daysGiven = numberArgument(call, 1);\n if (daysGiven instanceof Operand) return daysGiven;\n const holidays = holidaysOf(call, 2);\n if (holidays instanceof Operand) return holidays;\n const count = Math.trunc(daysGiven);\n const step = count < 0 ? -1 : 1;\n let remaining = Math.abs(count);\n let serial = start;\n while (remaining > 0) {\n serial += step;\n if (serial < 0 || serial > maximumSerial) return Operand.ofError('#NUM!');\n if (isWeekday(serial) && !holidays.has(serial)) remaining--;\n }\n return serialResult(serial);\n}\n\nconst secondsPerDay = 86_400;\n\n/** TIME: the fraction of a day the hour, minute and second make, each truncated; past 24 hours it wraps. An argument above 32767, or a time before midnight, is `#NUM!`. */\nexport function time(call: FunctionCall): Operand {\n const hourGiven = numberArgument(call, 0);\n if (hourGiven instanceof Operand) return hourGiven;\n const minuteGiven = numberArgument(call, 1);\n if (minuteGiven instanceof Operand) return minuteGiven;\n const secondGiven = numberArgument(call, 2);\n if (secondGiven instanceof Operand) return secondGiven;\n const hour = Math.trunc(hourGiven);\n const minute = Math.trunc(minuteGiven);\n const second = Math.trunc(secondGiven);\n if (hour > 32767 || minute > 32767 || second > 32767) return Operand.ofError('#NUM!');\n const total = hour * 3600 + minute * 60 + second;\n if (total < 0) return Operand.ofError('#NUM!');\n return Operand.of(Value.fromNumber(total % secondsPerDay / secondsPerDay));\n}\n\nexport function hourFunction(call: FunctionCall): Operand {\n return timePart(call, seconds => Math.trunc(seconds / 3600));\n}\n\nexport function minuteFunction(call: FunctionCall): Operand {\n return timePart(call, seconds => Math.trunc(seconds / 60) % 60);\n}\n\nexport function secondFunction(call: FunctionCall): Operand {\n return timePart(call, seconds => seconds % 60);\n}\n\n/**\n * HOUR, MINUTE and SECOND: the serial's time of day, rounded to the nearest second, as Excel shows a time; a\n * serial below 0 or past 31 December 9999 is `#NUM!` (HOUR-005, MINUTE-002, MINUTE-003, SECOND-003).\n */\nfunction timePart(call: FunctionCall, part: (seconds: number) => number): Operand {\n const serial = numberArgument(call, 0);\n if (serial instanceof Operand) return serial;\n if (serial < 0 || serial >= maximumSerial + 1) return Operand.ofError('#NUM!');\n const seconds = roundHalfAwayFromZero((serial - Math.floor(serial)) * secondsPerDay) % secondsPerDay;\n return Operand.of(Value.fromNumber(part(seconds)));\n}\n\n/** NOW (ADR-0124): the moment the Sheet was given for this recalculation, as a serial with the time of day; `#GETTING_DATA` while it is not known. */\nexport function now(call: FunctionCall): Operand {\n const moment = call.evaluator.cells.now;\n if (moment === undefined) return Operand.ofError('#GETTING_DATA');\n const serial = serialFromDate(moment.year, moment.month, moment.day);\n if (serial === undefined) return Operand.ofError('#NUM!');\n const milliseconds = ((moment.hour * 60 + moment.minute) * 60 + moment.second) * 1000 + moment.millisecond;\n return Operand.of(Value.fromNumber(serial + milliseconds / 1000 / secondsPerDay));\n}\n\n// ---- DATEDIF and YEARFRAC, pinned by the 2026-10-03 Windows observations (ADR-0047) ------------------------\n\nexport function dateDif(call: FunctionCall): Operand {\n const start = differenceDate(call, 0, true);\n if (start instanceof Operand) return start;\n const end = differenceDate(call, 1, true);\n if (end instanceof Operand) return end;\n const unit = textArgument(call, 2);\n if (unit instanceof Operand) return unit;\n if (start > end) return Operand.ofError('#NUM!');\n const first = dateFromSerial(start);\n const last = dateFromSerial(end);\n const beforeAnniversary = last.month < first.month || (last.month === first.month && last.day < first.day);\n const years = last.year - first.year - (beforeAnniversary ? 1 : 0);\n const months = (last.year - first.year) * 12 + last.month - first.month - (last.day < first.day ? 1 : 0);\n switch (toUpperInvariant(unit)) {\n case 'Y': return Operand.of(Value.fromNumber(years));\n case 'M': return Operand.of(Value.fromNumber(months));\n case 'D': return Operand.of(Value.fromNumber(end - start));\n case 'YM': return Operand.of(Value.fromNumber(months % 12));\n // Every observed YD interval precedes its first completed anniversary. Which year's leap day survives\n // removing one or more years is not observed, so those intervals are refused.\n case 'YD': return years === 0 ? Operand.of(Value.fromNumber(end - start)) : call.evaluator.refuse();\n case 'MD': return call.evaluator.refuse();\n default: return Operand.ofError('#NUM!');\n }\n}\n\nexport function yearFrac(call: FunctionCall): Operand {\n const startGiven = differenceDate(call, 0, false);\n if (startGiven instanceof Operand) return startGiven;\n const endGiven = differenceDate(call, 1, false);\n if (endGiven instanceof Operand) return endGiven;\n let basis = 0;\n if (call.has(2)) {\n const given = numberArgument(call, 2);\n if (given instanceof Operand) return given;\n basis = given;\n }\n basis = Math.trunc(basis);\n if (basis < 0 || basis > 4) return Operand.ofError('#NUM!');\n const [start, end] = startGiven > endGiven ? [endGiven, startGiven] : [startGiven, endGiven];\n const first = dateFromSerial(start);\n const last = dateFromSerial(end);\n let result: number;\n switch (basis) {\n case 0: result = thirtyDayCount(first, last, false) / 360; break;\n case 1: result = (end - start) / actualYearLength(first, last); break;\n case 2: result = (end - start) / 360; break;\n case 3: result = (end - start) / 365; break;\n default: result = thirtyDayCount(first, last, true) / 360; break;\n }\n return Operand.of(Value.fromNumber(result));\n}\n\n/**\n * Basis 0's order matters: adjust the 31st before February ends. In the observed February-end to March-31\n * interval, the end stays 31, then the start becomes 30. Basis 4 only clamps the 31st. Both retain January 0\n * and Excel's fictitious February 29.\n */\nfunction thirtyDayCount(first: CalendarDay, last: CalendarDay, european: boolean): number {\n let firstDay = Math.min(first.day, 30);\n let lastDay = last.day;\n if (european || firstDay >= 30) lastDay = Math.min(lastDay, 30);\n if (!european && februaryEnd(first)) {\n firstDay = 30;\n if (februaryEnd(last)) lastDay = 30;\n }\n return (last.year - first.year) * 360 + (last.month - first.month) * 30 + lastDay - firstDay;\n}\n\nfunction februaryEnd(date: CalendarDay): boolean {\n return date.month === 2 && date.day >= daysInMonth(date.year, 2);\n}\n\n/**\n * Actual/actual: at most one anniversary uses the containing year's length or a leap day in the interval.\n * Longer intervals use the average Gregorian length of all years touched (MS-OI29500, 2.1.1072).\n */\nfunction actualYearLength(first: CalendarDay, last: CalendarDay): number {\n if (first.year === last.year) return isLeapYear(first.year) ? 366 : 365;\n const withinAnniversary = last.year === first.year + 1\n && (last.month < first.month || (last.month === first.month && last.day <= first.day));\n if (withinAnniversary) {\n const startsBeforeLeapDay = isLeapYear(first.year) && (first.month < 2 || (first.month === 2 && first.day <= 29));\n const endsAfterLeapDay = isLeapYear(last.year) && (last.month > 2 || (last.month === 2 && last.day >= 29));\n return startsBeforeLeapDay || endsAfterLeapDay ? 366 : 365;\n }\n let total = 0;\n for (let y = first.year; y <= last.year; y++) total += isLeapYear(y) ? 366 : 365;\n return total / (last.year - first.year + 1);\n}\n\n/**\n * Dates accept numeric text and date text under the Sheet's culture, and discard the time. A serial below 0 is\n * `#NUM!` (DATEDIF-045, YEARFRAC-056, DATEDIF-048, YEARFRAC-058).\n */\nfunction differenceDate(call: FunctionCall, index: number, allowBoolean: boolean): number | Operand {\n const value = scalarArgument(call, index);\n if (value instanceof Operand) return value;\n if (!allowBoolean && value?.kind === 'boolean') return Operand.ofError('#VALUE!');\n const number = numberArgument(call, index);\n if (number instanceof Operand) return number;\n if (number < 0 || Math.trunc(number) > maximumSerial) return Operand.ofError('#NUM!');\n return Math.trunc(number);\n}\n", "// Exact dyadic numbers and interval arithmetic over them (C#'s Enclosure.cs), in which PMT computes its exact\n// payment and refuses where the enclosure does not decide the double nearest it (`exact-payment.ts`).\nimport { doubleBits, roundHalfToEven } from '../dotnet';\nimport { bitLength, roundToDouble } from './correctly-rounded';\n\nfunction abs(value: bigint): bigint {\n return value < 0n ? -value : value;\n}\n\nfunction signOf(value: bigint): number {\n return value < 0n ? -1 : value > 0n ? 1 : 0;\n}\n\n/**\n * A dyadic number, `mantissa` times 2^`exponent`, held exactly: an end of an `Enclosure`. Its sums and products\n * are exact, its exponent has no double's limits, and `down` and `up` round it to a number of bits toward -\u221E and\n * +\u221E.\n */\nexport class Dyadic {\n readonly mantissa: bigint;\n readonly exponent: number;\n\n constructor(mantissa: bigint, exponent: number) {\n this.mantissa = mantissa;\n this.exponent = exponent;\n }\n\n static readonly zero = new Dyadic(0n, 0);\n static readonly one = new Dyadic(1n, 0);\n\n /** A finite double, exactly. */\n static of(value: number): Dyadic {\n if (!Number.isFinite(value)) throw new RangeError(`Only a finite double has a dyadic value, not ${String(value)}.`);\n if (value === 0) return Dyadic.zero;\n const bits = doubleBits(value);\n const biased = Number((bits >> 52n) & 0x7FFn);\n const fraction = bits & 0xFFFFFFFFFFFFFn;\n const mantissa = biased === 0 ? fraction : fraction | (1n << 52n);\n return new Dyadic(value < 0 ? -mantissa : mantissa, biased === 0 ? -1074 : biased - 1075);\n }\n\n /** A whole number, exactly. */\n static whole(value: number): Dyadic {\n return new Dyadic(BigInt(value), 0);\n }\n\n get sign(): number {\n return signOf(this.mantissa);\n }\n\n get isZero(): boolean {\n return this.mantissa === 0n;\n }\n\n /** The exponent of the leading bit: a number other than 0 lies in [2^top, 2^(top+1)) in magnitude. */\n get top(): number {\n return this.exponent + bitLength(abs(this.mantissa)) - 1;\n }\n\n negate(): Dyadic {\n return new Dyadic(-this.mantissa, this.exponent);\n }\n\n abs(): Dyadic {\n return new Dyadic(abs(this.mantissa), this.exponent);\n }\n\n /** This number times 2^`power`, exactly. */\n scale(power: number): Dyadic {\n return new Dyadic(this.mantissa, this.exponent + power);\n }\n\n plus(b: Dyadic): Dyadic {\n if (this.isZero) return b;\n if (b.isZero) return this;\n const exponent = Math.min(this.exponent, b.exponent);\n return new Dyadic((this.mantissa << BigInt(this.exponent - exponent)) + (b.mantissa << BigInt(b.exponent - exponent)), exponent);\n }\n\n minus(b: Dyadic): Dyadic {\n return this.plus(b.negate());\n }\n\n times(b: Dyadic): Dyadic {\n return new Dyadic(this.mantissa * b.mantissa, this.exponent + b.exponent);\n }\n\n static compare(a: Dyadic, b: Dyadic): number {\n return a.minus(b).sign;\n }\n\n /** The largest number of `bits` significant bits not above this one. */\n down(bits: number): Dyadic {\n if (this.isZero) return this;\n const shift = bitLength(abs(this.mantissa)) - bits;\n // BigInt's right shift is arithmetic: it rounds a negative mantissa toward -\u221E as well.\n return shift <= 0 ? this : new Dyadic(this.mantissa >> BigInt(shift), this.exponent + shift);\n }\n\n /** The smallest number of `bits` significant bits not below this one. */\n up(bits: number): Dyadic {\n return this.negate().down(bits).negate();\n }\n\n /** `a` / `b` rounded to `bits` bits, up (toward +\u221E) or down. */\n static quotient(a: Dyadic, b: Dyadic, bits: number, up: boolean): Dyadic {\n if (b.isZero) throw new RangeError('Division by zero.');\n if (a.isZero) return Dyadic.zero;\n const { quotient, inexact, exponent } = divide(a, b, bits + 2);\n const positive = a.sign === b.sign;\n // The magnitude is quotient plus a fraction below 1: away from 0 is up for a positive quotient and down for a negative one.\n const magnitude = inexact && positive === up ? quotient + 1n : quotient;\n const result = new Dyadic(positive ? magnitude : -magnitude, exponent);\n return up ? result.up(bits) : result.down(bits);\n }\n\n /** The double nearest this number, ties to even, subnormal and infinite results included. */\n toDouble(): number {\n return roundToDouble(this.mantissa, this.exponent);\n }\n}\n\n/** |a/b| truncated to a whole number of at least `bits` bits, whether a remainder was dropped, and its exponent. */\nfunction divide(a: Dyadic, b: Dyadic, bits: number): { quotient: bigint; inexact: boolean; exponent: number } {\n const numerator = abs(a.mantissa);\n const denominator = abs(b.mantissa);\n const shift = Math.max(0, bits + bitLength(denominator) - bitLength(numerator));\n const shifted = numerator << BigInt(shift);\n const quotient = shifted / denominator;\n return { quotient, inexact: shifted - quotient * denominator !== 0n, exponent: a.exponent - b.exponent - shift };\n}\n\nconst two = new Dyadic(2n, 0);\n\n/**\n * A real number known to lie between two dyadic numbers, `low` and `high`: interval arithmetic, each operation\n * rounding the low end of its result down and the high end up. The functions, `log1p`, `expm1` and `exp`, are\n * series whose truncation is bounded and added to the enclosure.\n */\nexport class Enclosure {\n readonly low: Dyadic;\n readonly high: Dyadic;\n\n constructor(low: Dyadic, high: Dyadic) {\n this.low = low;\n this.high = high;\n }\n\n static exactly(value: Dyadic | number): Enclosure {\n const dyadic = typeof value === 'number' ? Dyadic.of(value) : value;\n return new Enclosure(dyadic, dyadic);\n }\n\n get containsZero(): boolean {\n return this.low.sign <= 0 && this.high.sign >= 0;\n }\n\n negate(): Enclosure {\n return new Enclosure(this.high.negate(), this.low.negate());\n }\n\n /** This enclosure times 2^`power`, exactly. */\n scale(power: number): Enclosure {\n return new Enclosure(this.low.scale(power), this.high.scale(power));\n }\n\n /** The least and the greatest magnitude within it; not for an enclosure of 0. */\n magnitudes(): { least: Dyadic; most: Dyadic } {\n if (this.containsZero) throw new Error('Internal: an enclosure of 0 has no least magnitude.');\n return this.low.sign > 0 ? { least: this.low, most: this.high } : { least: this.high.abs(), most: this.low.abs() };\n }\n\n /** The narrower enclosure both say: each encloses the same number. */\n static both(a: Enclosure, b: Enclosure): Enclosure {\n return new Enclosure(Dyadic.compare(a.low, b.low) >= 0 ? a.low : b.low, Dyadic.compare(a.high, b.high) <= 0 ? a.high : b.high);\n }\n\n static add(a: Enclosure, b: Enclosure, bits: number): Enclosure {\n return new Enclosure(a.low.plus(b.low).down(bits), a.high.plus(b.high).up(bits));\n }\n\n static subtract(a: Enclosure, b: Enclosure, bits: number): Enclosure {\n return Enclosure.add(a, b.negate(), bits);\n }\n\n static multiply(a: Enclosure, b: Enclosure, bits: number): Enclosure {\n if (b.high.sign <= 0 && b.low.sign < 0) return Enclosure.multiply(a, b.negate(), bits).negate();\n if (b.low.sign < 0) {\n // b holds 0 inside it: take the one that does not, if either does not.\n if (a.low.sign >= 0 || a.high.sign <= 0) return Enclosure.multiply(b, a, bits);\n const low = least(a.low.times(b.high), a.high.times(b.low));\n const high = greatest(a.low.times(b.low), a.high.times(b.high));\n return new Enclosure(low.down(bits), high.up(bits));\n }\n // b is 0 or above.\n const lowest = a.low.sign >= 0 ? a.low.times(b.low) : a.low.times(b.high);\n const most = a.high.sign >= 0 ? a.high.times(b.high) : a.high.times(b.low);\n return new Enclosure(lowest.down(bits), most.up(bits));\n }\n\n /** `a` / `b`, where `b` does not hold 0. */\n static divide(a: Enclosure, b: Enclosure, bits: number): Enclosure {\n if (b.containsZero) throw new RangeError('Division by an enclosure of 0.');\n if (b.high.sign < 0) return Enclosure.divide(a, b.negate(), bits).negate();\n // b is above 0: a / b grows with a, and falls with b where a is above 0 and rises where it is below.\n const low = Dyadic.quotient(a.low, a.low.sign >= 0 ? b.high : b.low, bits, false);\n const high = Dyadic.quotient(a.high, a.high.sign >= 0 ? b.low : b.high, bits, true);\n return new Enclosure(low, high);\n }\n\n static readonly #ln2s = new Map<number, Enclosure>();\n\n /**\n * ln 2 to `bits` bits: 2 atanh(1/3), the sum of 2 / ((2j+1) 3^(2j+1)), in fixed point with every term\n * truncated, so that the truncations and the terms left out bound it from above.\n */\n static ln2(bits: number): Enclosure {\n const known = Enclosure.#ln2s.get(bits);\n if (known !== undefined) return known;\n const scale = bits + 8;\n const twoScaled = 1n << BigInt(scale + 1);\n let sum = 0n;\n let terms = 0n;\n let power = 3n;\n for (let j = 0n; ; j++) {\n const term = twoScaled / ((2n * j + 1n) * power);\n if (term === 0n) break; // this term and the rest, each a ninth of the one before, sum to below 2 units\n sum += term;\n terms++;\n power *= 9n;\n }\n const ln2 = new Enclosure(new Dyadic(sum, -scale).down(bits), new Dyadic(sum + terms + 2n, -scale).up(bits));\n Enclosure.#ln2s.set(bits, ln2);\n return ln2;\n }\n\n /**\n * ln(1 + `d`) for an exact `d` above -1: 2 atanh(d / (2 + d)) where |d| is below 1/2, which keeps the\n * logarithm's relative precision however small d is; otherwise k ln 2 plus that of the rest, 1 + d being\n * m 2^k with m within a factor of \u221A2 of 1.\n */\n static log1p(d: Dyadic, bits: number): Enclosure {\n if (d.isZero) return Enclosure.exactly(Dyadic.zero);\n if (Dyadic.compare(d, Dyadic.one.negate()) <= 0) throw new RangeError('ln(1+d) needs d above -1.');\n const working = bits + 16;\n if (d.top < -1) {\n const z = Enclosure.divide(Enclosure.exactly(d), Enclosure.exactly(d.plus(two)), working);\n return Enclosure.multiply(z, atanhSeries(z, working), working).scale(1);\n }\n const onePlus = Dyadic.one.plus(d);\n let k = onePlus.top;\n const leading = onePlus.scale(-k); // in [1, 2)\n if (Dyadic.compare(leading.times(leading), two) >= 0) k++;\n const rest = onePlus.scale(-k).minus(Dyadic.one); // in [1/\u221A2 - 1, \u221A2 - 1)\n return Enclosure.add(\n Enclosure.multiply(Enclosure.exactly(Dyadic.whole(k)), Enclosure.ln2(working + 16), working),\n Enclosure.log1p(rest, working),\n working);\n }\n\n /** e^y - 1 over an enclosure: it rises with y, so it lies between its values at the two ends. */\n static expm1(y: Enclosure, bits: number): Enclosure {\n const low = expm1At(y.low, bits);\n return Dyadic.compare(y.low, y.high) === 0 ? low : new Enclosure(low.low, expm1At(y.high, bits).high);\n }\n\n /** e^y over an enclosure, as `expm1`. */\n static exp(y: Enclosure, bits: number): Enclosure {\n const low = expAt(y.low, bits);\n return Dyadic.compare(y.low, y.high) === 0 ? low : new Enclosure(low.low, expAt(y.high, bits).high);\n }\n}\n\n/** The sum of z^(2j) / (2j+1) for |z| at most 1/3, so that 2z times it is 2 atanh z = ln((1+z)/(1-z)). */\nfunction atanhSeries(z: Enclosure, bits: number): Enclosure {\n const square = Enclosure.multiply(z, z, bits);\n const top = square.high.top + 1; // square < 2^top, top at most -3\n const count = Math.max(0, Math.ceil((bits + 2) / -top) - 1); // square^(count+1) < 2^-(bits+2)\n let sum = reciprocal(2 * count + 1, bits);\n for (let j = count - 1; j >= 0; j--) sum = Enclosure.add(reciprocal(2 * j + 1, bits), Enclosure.multiply(square, sum, bits), bits);\n // The terms left out sum to below square^(count+1) / (1 - square) < 2^(top (count+1) + 1).\n return Enclosure.add(sum, new Enclosure(Dyadic.zero, Dyadic.one.scale(top * (count + 1) + 1)), bits);\n}\n\nfunction reciprocal(k: number, bits: number): Enclosure {\n const whole = Dyadic.whole(k);\n return new Enclosure(Dyadic.quotient(Dyadic.one, whole, bits, false), Dyadic.quotient(Dyadic.one, whole, bits, true));\n}\n\n/**\n * e^y - 1 for an exact y. Below 1/2 in magnitude, its Taylor series at y / 2^s, s halvings bringing it below\n * 2^-8, keeps its relative precision however small y is, and each halving is undone by\n * e^(2u) - 1 = (e^u - 1)(e^u - 1 + 2); otherwise e^y less 1.\n */\nfunction expm1At(y: Dyadic, bits: number): Enclosure {\n if (y.isZero) return Enclosure.exactly(Dyadic.zero);\n const working = bits + 24;\n if (y.top >= -1) return Enclosure.subtract(expAt(y, bits), Enclosure.exactly(Dyadic.one), working);\n const halvings = Math.max(0, y.top + 9);\n const u = y.scale(-halvings);\n const top = u.top + 1; // |u| < 2^top, top at most -8\n const degree = Math.max(1, Math.ceil((working + 3) / -top)); // |u|^degree < 2^-(working+3)\n const exactlyU = Enclosure.exactly(u);\n const one = Enclosure.exactly(Dyadic.one);\n let inner = one;\n for (let k = degree; k >= 2; k--) {\n inner = Enclosure.add(one, Enclosure.divide(Enclosure.multiply(exactlyU, inner, working), Enclosure.exactly(Dyadic.whole(k)), working), working);\n }\n const rest = u.abs().scale(-(working + 2));\n let result = Enclosure.add(Enclosure.multiply(exactlyU, inner, working), new Enclosure(rest.negate(), rest), working);\n for (let i = 0; i < halvings; i++) result = Enclosure.multiply(result, Enclosure.add(result, Enclosure.exactly(two), working), working);\n return result;\n}\n\n/** e^y for an exact y: 2^k (1 + (e^t - 1)), t = y - k ln 2 below 1/2 in magnitude. */\nfunction expAt(y: Dyadic, bits: number): Enclosure {\n const working = bits + 24;\n if (y.top < -1) return Enclosure.add(Enclosure.exactly(Dyadic.one), expm1At(y, bits), working);\n // Any whole k leaves |t| below 1/2 here; toDouble and the division are IEEE's, so k is the same on every platform.\n const k = roundHalfToEven(y.toDouble() / Math.LN2);\n const t = Enclosure.subtract(\n Enclosure.exactly(y),\n Enclosure.multiply(Enclosure.exactly(Dyadic.whole(k)), Enclosure.ln2(working + 16), working + 16),\n working + 16);\n const fraction = new Enclosure(expm1At(t.low, working).low, expm1At(t.high, working).high);\n return Enclosure.add(Enclosure.exactly(Dyadic.one), fraction, working).scale(k);\n}\n\nfunction least(a: Dyadic, b: Dyadic): Dyadic {\n return Dyadic.compare(a, b) <= 0 ? a : b;\n}\n\nfunction greatest(a: Dyadic, b: Dyadic): Dyadic {\n return Dyadic.compare(a, b) >= 0 ? a : b;\n}\n", "// PMT's payment at a rate above -1 other than 0, or `undefined` where PMT refuses it (C#'s ExactPayment.cs,\n// ADR-0047's exception for PMT). The payment is the exact payment over its arguments' doubles,\n// -rate (pv g + fv) / (g - 1), g = (1+rate)^nper (over (1+rate) more at the start), rounded once: computed in\n// `Enclosure`s, and given only where both bounds round to the same double, the enclosures computed again with\n// twice the bits while they do not decide it. The refusals are the financial area's rules (2026-10-12), as the\n// C# remarks set them out.\nimport { log } from './portable-math';\nimport { Dyadic, Enclosure } from './enclosure';\n\nconst firstBits = 96;\nconst mostBits = 1536;\nconst leastFit = Dyadic.one.scale(-1021);\nconst mostFit = Dyadic.one.scale(1022);\nconst half = Dyadic.one.scale(-1);\n\n/** The bound of `conditioned`, as a power of 2. */\nconst mostMagnification = 6;\n\n/**\n * The exact payment at the end, or at the start, rounded once, or `undefined` where PMT refuses. The caller has\n * answered or refused a rate of 0, a rate of -1 or below, an `periods` of 0 and one past 2^53.\n */\nexport function exactPayment(rate: number, periods: number, present: number, future: number, atStart: boolean): number | undefined {\n const r = Dyadic.of(rate);\n const onePlusRate = Dyadic.one.plus(r);\n const pv = Dyadic.of(present);\n const fv = Dyadic.of(future);\n const sum = pv.plus(fv);\n if (!fits(r) || !fits(pv) || !fits(fv) || !fits(sum)) return undefined;\n // The growth's logarithm, estimated in doubles: past 2^1100 either way the enclosures would be vast. ln is the\n // correctly rounded one, not the platform's, so a growth near the line is refused alike everywhere (ADR-0047).\n if (!(Math.abs(periods * log(1 + rate)) <= 1100 * Math.LN2)) return undefined;\n for (let bits = firstBits; bits <= mostBits; bits *= 2) {\n const { growth, lessOne } = growthOf(r, onePlusRate, periods, bits);\n if (bits === firstBits && !quantitiesFit(r, pv, fv, sum, growth, lessOne, onePlusRate, atStart)) return undefined;\n // pv g + fv, and pv (g-1) + (pv+fv), which is narrower where g is near 1: each holds it.\n const owed = Enclosure.both(\n Enclosure.add(Enclosure.multiply(Enclosure.exactly(pv), growth, bits), Enclosure.exactly(fv), bits),\n Enclosure.add(Enclosure.multiply(Enclosure.exactly(pv), lessOne, bits), Enclosure.exactly(sum), bits));\n if (bits === firstBits && !conditioned(r, onePlusRate, periods, pv, fv, sum, growth, lessOne, owed, atStart, bits)) return undefined;\n const atEnd = Enclosure.divide(Enclosure.multiply(Enclosure.exactly(r.negate()), owed, bits), lessOne, bits);\n const payment = atStart ? Enclosure.divide(atEnd, Enclosure.exactly(onePlusRate), bits) : atEnd;\n const low = payment.low.toDouble();\n if (low !== payment.high.toDouble()) continue;\n return low === 0 ? 0 : low;\n }\n return undefined;\n}\n\n/**\n * g = (1+rate)^periods and g - 1. A whole number of periods raises g - 1 from the rate by\n * (1+a)(1+b) - 1 = a + b + ab and (1+a)^2 - 1 = a (a + 2), and g by squaring 1+rate where g is below 1/2; a\n * negative one is 1 over the power to its absolute value. Any other is e^(periods ln(1+rate)), and g - 1 e^x - 1\n * by its own series.\n */\nfunction growthOf(rate: Dyadic, onePlusRate: Dyadic, periods: number, bits: number): { growth: Enclosure; lessOne: Enclosure } {\n const one = Enclosure.exactly(Dyadic.one);\n const magnitude = Math.abs(periods);\n if (magnitude !== Math.floor(magnitude)) {\n const exponent = Enclosure.multiply(Enclosure.log1p(rate, bits), Enclosure.exactly(periods), bits);\n const lessOne = Enclosure.expm1(exponent, bits);\n return { growth: Dyadic.compare(lessOne.low, half.negate()) >= 0 ? Enclosure.add(one, lessOne, bits) : Enclosure.exp(exponent, bits), lessOne };\n }\n let raised: Enclosure | undefined;\n let square = Enclosure.exactly(rate);\n const two = Enclosure.exactly(Dyadic.whole(2));\n for (let k = magnitude; ;) {\n if (k % 2 === 1) raised = raised === undefined ? square : Enclosure.add(Enclosure.add(raised, square, bits), Enclosure.multiply(raised, square, bits), bits);\n k = Math.floor(k / 2);\n if (k === 0) break;\n square = Enclosure.multiply(square, Enclosure.add(square, two, bits), bits);\n }\n if (raised === undefined) throw new Error('Internal: PMT raises to a whole number of periods other than 0.');\n const less = raised;\n const power = Dyadic.compare(less.low, half.negate()) >= 0 ? Enclosure.add(one, less, bits) : raise(onePlusRate, magnitude, bits);\n if (periods > 0) return { growth: power, lessOne: less };\n // (1+rate)^-n = 1 / (1+rate)^n, and less 1, -((1+rate)^n - 1) / (1+rate)^n.\n return { growth: Enclosure.divide(one, power, bits), lessOne: Enclosure.divide(less.negate(), power, bits) };\n}\n\nfunction raise(value: Dyadic, exponent: number, bits: number): Enclosure {\n let result = Enclosure.exactly(Dyadic.one);\n let square = Enclosure.exactly(value);\n let k = exponent;\n for (;;) {\n if (k % 2 === 1) result = Enclosure.multiply(result, square, bits);\n k = Math.floor(k / 2);\n if (k === 0) return result;\n square = Enclosure.multiply(square, square, bits);\n }\n}\n\n/**\n * The quantities the readings of PMT compute in doubles, each a product of powers of r (the rate), pv, fv, s\n * (pv+fv), g, e (g-1), b (1+rate) and c (1+rate*type: 1, or b at the start), numerator before the slash.\n */\nconst quantities = [\n 'r', 'pv', 'fv', 's', 'g', '/ g', 'e', 'b', '/ b', 'c', '/ c',\n 'e / r', 'r / e', 'e / g', 'e / g r', 'c e', 'c e / r', 'c e / g', 'c e / g r', 'c / r', 'r / c',\n 'b g', 'b e', 'r g',\n 'pv g', 'fv / g', 'pv r', 'fv r', 'pv r g', 'fv r / g',\n 'pv g / e', 'fv / e', 'r g / e', 'pv r g / e', 'fv r / e',\n 's r', 's / e', 's r / e',\n 'pv r g / c e', 'fv r / c e',\n];\n\n/** At the start, also the ways from the payment at the end to it: the payment at the end times the rate, and over 1+rate. */\nconst atStartQuantities = ['pv r r g / e', 'fv r r / e', 'pv r r g / b e', 'fv r r / b e'];\n\n/** The quantities Excel was seen to carry above a double's range while it gave the exact payment rounded once (PMT-038 to PMT-041). */\nconst mayPassAbove = new Set(['g', 'e', 'e / r', 'c e', 'c e / r', 'b g', 'b e', 'r g', 'pv g', 'pv r g']);\n\n/** The quantities Excel was seen to carry below a double's normal numbers while it gave the exact payment rounded once (PMT-038, PMT-044). */\nconst mayFallBelow = new Set(['/ g', 'r / e', 's / e', 's r / e', 'pv r', 'pv r g', 's r']);\n\nconst factors = ['r', 'pv', 'fv', 's', 'g', 'e', 'b', 'c'];\n\n/** A quantity as the power of each factor, and which sides of the range it must lie within. */\ninterface Bound {\n readonly powers: readonly number[];\n readonly above: boolean;\n readonly below: boolean;\n}\n\nfunction boundOf(quantity: string): Bound {\n return { powers: powersOf(quantity), above: !mayPassAbove.has(quantity), below: !mayFallBelow.has(quantity) };\n}\n\n/** A quantity as the power of each factor, in the order of `factors`. */\nfunction powersOf(quantity: string): number[] {\n const powers = factors.map(() => 0);\n let sign = 1;\n for (const name of quantity.split(' ').filter(part => part.length > 0)) {\n if (name === '/') sign = -1;\n else {\n const at = factors.indexOf(name);\n if (at < 0) throw new Error(`Internal: ${name} is no factor of a PMT quantity.`);\n powers[at] = (powers[at] as number) + sign; // oxlint-disable-line typescript/no-unsafe-type-assertion -- at is a factor's index\n }\n }\n return powers;\n}\n\nlet bounds: { readonly atEnd: readonly Bound[]; readonly atStart: readonly Bound[] } | undefined;\n\nfunction boundsOf(atStart: boolean): readonly Bound[] {\n bounds ??= { atEnd: quantities.map(boundOf), atStart: [...quantities, ...atStartQuantities].map(boundOf) };\n return atStart ? bounds.atStart : bounds.atEnd;\n}\n\nfunction fits(value: Dyadic): boolean {\n return value.isZero || (Dyadic.compare(value.abs(), leastFit) >= 0 && Dyadic.compare(value.abs(), mostFit) <= 0);\n}\n\n/**\n * Whether no reading of PMT magnifies its own roundings more than 2^6 times (the financial area's bound,\n * 2026-10-12): the sum pv g + fv and its kin, the exponent's rounding, and at the start the payment at the end\n * less its rate's share and LibreOffice's divisor, as the C# remarks list them.\n */\nfunction conditioned(r: Dyadic, onePlusRate: Dyadic, periods: number, pv: Dyadic, fv: Dyadic, sum: Dyadic, growth: Enclosure, lessOne: Enclosure,\n owed: Enclosure, atStart: boolean, bits: number): boolean {\n if (lessOne.containsZero || growth.containsZero) return false;\n // With no pv and no fv every reading adds only zeros, and its payment is 0; but LibreOffice's divisor at the\n // start, which can come out as 0 and give 0/0.\n const owesNothing = pv.isZero && fv.isZero;\n if (!owesNothing && owed.containsZero) return false;\n const most = growth.magnitudes().most;\n const lessOneLeast = lessOne.magnitudes().least;\n const logarithm = Enclosure.log1p(r, bits);\n const logMost = Dyadic.compare(logarithm.high.abs(), logarithm.low.abs()) >= 0 ? logarithm.high.abs() : logarithm.low.abs();\n const exponentMost = Dyadic.of(Math.abs(periods)).times(logMost);\n const limit = Dyadic.one.scale(mostMagnification);\n const within = (terms: Dyadic, result: Dyadic): boolean => Dyadic.compare(terms, limit.times(result)) <= 0;\n if (!owesNothing) {\n const owedLeast = owed.magnitudes().least;\n if (!within(pv.abs().times(Dyadic.one.plus(most)).plus(fv.abs()), owedLeast)) return false;\n if (!within(exponentMost.times(sum.abs()).times(most), lessOneLeast.times(owedLeast))) return false;\n if (atStart && !within(onePlusRate.abs().plus(r.abs()), Dyadic.one)) return false;\n if (atStart && !within(exponentMost.times(pv.abs()).times(most), owedLeast)) return false;\n }\n const periodsPlusOne = Dyadic.of(periods).plus(Dyadic.one).abs();\n return !atStart || within(periodsPlusOne.times(logMost).times(onePlusRate).times(most).plus(r.abs()), onePlusRate.times(lessOneLeast));\n}\n\ninterface Magnitudes {\n readonly least: Dyadic;\n readonly most: Dyadic;\n}\n\n/** The magnitudes of a number known exactly; `undefined` for 0, which has none. */\nfunction exact(value: Dyadic): Magnitudes | undefined {\n return value.isZero ? undefined : { least: value.abs(), most: value.abs() };\n}\n\nfunction quantitiesFit(r: Dyadic, pv: Dyadic, fv: Dyadic, sum: Dyadic, growth: Enclosure, lessOne: Enclosure, onePlusRate: Dyadic, atStart: boolean): boolean {\n if (growth.containsZero || lessOne.containsZero) return false;\n const one: Magnitudes = { least: Dyadic.one, most: Dyadic.one };\n const magnitudes: readonly (Magnitudes | undefined)[] = [\n exact(r), exact(pv), exact(fv), exact(sum), growth.magnitudes(), lessOne.magnitudes(), exact(onePlusRate),\n atStart ? exact(onePlusRate) : one,\n ];\n for (const { powers, above, below } of boundsOf(atStart)) {\n let numeratorLeast = Dyadic.one;\n let numeratorMost = Dyadic.one;\n let denominatorLeast = Dyadic.one;\n let denominatorMost = Dyadic.one;\n let zero = false;\n for (let f = 0; f < factors.length && !zero; f++) {\n const power = powers[f] as number; // oxlint-disable-line typescript/no-unsafe-type-assertion -- a power for each factor\n if (power === 0) continue;\n const m = magnitudes[f];\n if (m === undefined) {\n zero = true; // exactly 0 in every reading\n continue;\n }\n for (let i = 0; i < Math.abs(power); i++) {\n if (power > 0) {\n numeratorLeast = numeratorLeast.times(m.least);\n numeratorMost = numeratorMost.times(m.most);\n } else {\n denominatorLeast = denominatorLeast.times(m.least);\n denominatorMost = denominatorMost.times(m.most);\n }\n }\n }\n if (zero) continue;\n // The quantity lies within [numeratorLeast / denominatorMost, numeratorMost / denominatorLeast].\n if (below && Dyadic.compare(numeratorLeast, leastFit.times(denominatorMost)) < 0) return false;\n if (above && Dyadic.compare(numeratorMost, mostFit.times(denominatorLeast)) > 0) return false;\n }\n return true;\n}\n", "// PMT, PV, FV and XNPV (C#'s Functions.Financial.cs): the annuity identity\n// pv*(1+rate)^nper + pmt*(1+rate*type)*((1+rate)^nper-1)/rate + fv = 0, and its form at a rate of 0, each\n// evaluated as the C# engine's documentation records the evaluation Excel's observed doubles leave.\nimport { CellAddress } from '../../cell-address';\nimport type { ErrorValue, Value } from '../../value';\nimport type { CellReader } from '../cell-reader';\nimport { exp as correctlyRoundedExp, log as correctlyRoundedLog } from '../correctly-rounded';\nimport { exactPayment } from '../exact-payment';\nimport type { FunctionCall } from '../function-definition';\nimport { Operand } from '../operand';\nimport type { Area } from '../reference';\nimport { numberArgument, numberResult } from './shared';\n\n/** The largest `nper` raised by squaring: 2^53, past which a double holds no odd whole number. */\nconst wholePeriods = 9007199254740992;\n\ninterface Annuity {\n readonly rate: number;\n readonly periods: number;\n readonly third: number;\n readonly fourth: number;\n readonly atStart: boolean;\n}\n\n/**\n * The annuity's arguments: `rate`, `nper`, the third, and the optional fourth (0 when left out) and `type`.\n * `type` is read as a truth value, as Excel reads it: 0 is payment at the end of each period, and any other\n * number at the start (PMT-008 to PMT-010). At a rate other than 0, an `nper` whose absolute value is past 2^53\n * is refused: how Excel raises 1+rate to one has not been observed.\n */\nfunction annuityOf(call: FunctionCall): Annuity | Operand {\n const rate = numberArgument(call, 0);\n if (rate instanceof Operand) return rate;\n const periods = numberArgument(call, 1);\n if (periods instanceof Operand) return periods;\n const third = numberArgument(call, 2);\n if (third instanceof Operand) return third;\n let fourth = 0;\n if (call.has(3)) {\n const given = numberArgument(call, 3);\n if (given instanceof Operand) return given;\n fourth = given;\n }\n let type = 0;\n if (call.has(4)) {\n const given = numberArgument(call, 4);\n if (given instanceof Operand) return given;\n type = given;\n }\n if (rate !== 0 && Math.abs(periods) > wholePeriods) return call.evaluator.refuse();\n return { rate, periods, third, fourth, atStart: type !== 0 };\n}\n\n/**\n * `onePlusRate` raised to `periods` in PV, FV and XNPV, or the Error Value instead: a whole number by squaring\n * (`raise`), a negative number as 1 over the power to its absolute value, 0.5 by the square root, any other\n * number as e^(n ln b) with the exponential and the logarithm each correctly rounded, a negative 1+rate to a\n * fraction whose reciprocal is an odd whole number as its odd root, and 1+rate of 0 as the `^` operator takes\n * it (FV-001 to FV-023, PV-001 to PV-016, XNPV-005, 006, 013).\n */\nfunction raiseOrError(onePlusRate: number, periods: number): number | ErrorValue {\n const refused = powerError(onePlusRate, periods);\n if (refused !== undefined) return refused;\n const magnitude = Math.abs(periods);\n let power: number;\n if (magnitude === Math.floor(magnitude)) power = raise(onePlusRate, magnitude);\n else if (onePlusRate === 0) power = 0;\n else if (onePlusRate > 0) power = magnitude === 0.5 ? Math.sqrt(onePlusRate) : correctlyRoundedExp(magnitude * correctlyRoundedLog(onePlusRate));\n else power = -correctlyRoundedExp(correctlyRoundedLog(-onePlusRate) * magnitude);\n return periods < 0 ? 1 / power : power;\n}\n\n/** The Error Value the financial power gives instead of raising (FV-017, FV-018, FV-020, FV-021, PV-011, PV-012), or `undefined`. */\nfunction powerError(onePlusRate: number, periods: number): ErrorValue | undefined {\n if (onePlusRate === 0 && periods === 0) return '#NUM!';\n if (onePlusRate === 0 && periods < 0) return '#DIV/0!';\n if (onePlusRate >= 0 || periods === Math.floor(periods)) return undefined;\n const root = 1 / Math.abs(periods);\n return Number.isFinite(root) && root === Math.floor(root) && Math.abs(root % 2) === 1 ? undefined : '#NUM!';\n}\n\n/**\n * `value` to the power `exponent` as PV, FV and XNPV raise 1+rate to a whole number: by squaring, from the\n * exponent's lowest bit, each product rounded to a double (FV-001, FV-003, PV-001, PV-003, XNPV-006).\n */\nfunction raise(value: number, exponent: number): number {\n let result = 1;\n let square = value;\n let k = exponent;\n while (k > 0) {\n if (k % 2 === 1) result *= square;\n k = Math.floor(k / 2);\n if (k > 0) square *= square;\n }\n return result;\n}\n\n/**\n * PMT: the payment that pays `pv` down to `fv` over `nper` periods; `nper` of 0 is `#NUM!` (PMT-005, PMT-046),\n * and a rate of -1 or below is `#NUM!` (PMT-034 to PMT-037). At a rate above -1 other than 0, the exact payment\n * rounded once, or a refusal (`exactPayment`): ADR-0047's exception for PMT alone (decided with the user,\n * 2026-10-12), Excel's double differing from the engine's by 1 to 11 units in the last place where it differs.\n */\nexport function pmt(call: FunctionCall): Operand {\n const annuity = annuityOf(call);\n if (annuity instanceof Operand) return annuity;\n const { rate, periods, third: present, fourth: future, atStart } = annuity;\n if (periods === 0 || rate <= -1) return Operand.ofError('#NUM!');\n if (rate === 0) return numberResult(-(present + future) / periods);\n const payment = exactPayment(rate, periods, present, future, atStart);\n return payment === undefined ? call.evaluator.refuse() : numberResult(payment);\n}\n\n/**\n * PV: what a series of payments and a future value are worth now. The payment multiplies the product of\n * 1+rate*type and ((1+rate)^nper-1)/rate, the grouping that gives Excel's doubles; 1+rate is raised as FV raises\n * it. At a rate of -1 with an `nper` above 0 the growth is 0, and PV is `#DIV/0!` (PV-013).\n */\nexport function pv(call: FunctionCall): Operand {\n const annuity = annuityOf(call);\n if (annuity instanceof Operand) return annuity;\n const { rate, periods, third: payment, fourth: future, atStart } = annuity;\n if (rate === 0) return numberResult(-(future + payment * periods));\n const growth = raiseOrError(1 + rate, periods);\n if (typeof growth !== 'number') return Operand.ofError(growth);\n if (1 + rate === 0) return Operand.ofError('#DIV/0!');\n const due = 1 + rate * (atStart ? 1 : 0);\n return numberResult(-(future + payment * (due * ((growth - 1) / rate))) / growth);\n}\n\n/**\n * FV: what a present value and a series of payments are worth after `nper` periods,\n * `-(pv*g + pmt*((1+rate*type)*((g-1)/rate)))` in doubles, g raised by `raiseOrError` (FV-009, FV-014, FV-015,\n * FV-019).\n */\nexport function fv(call: FunctionCall): Operand {\n const annuity = annuityOf(call);\n if (annuity instanceof Operand) return annuity;\n const { rate, periods, third: payment, fourth: present, atStart } = annuity;\n if (rate === 0) return numberResult(-(present + payment * periods));\n const growth = raiseOrError(1 + rate, periods);\n if (typeof growth !== 'number') return Operand.ofError(growth);\n const due = 1 + rate * (atStart ? 1 : 0);\n return numberResult(-(present * growth + payment * (due * ((growth - 1) / rate))));\n}\n\n/** One check of XNPV's, or a reading of its ranges (`xnpvOrders`). */\ntype XnpvStep = 'rate' | 'counts' | 'dates' | 'values' | 'order' | 'pairs' | 'pairsOrderAfterDate' | 'pairsOrderAfterValue';\n\n/** The orders of XNPV's checks that run 18a's answers leave (XNPV-021 to XNPV-030); XNPV answers only where they all agree. */\nconst xnpvOrders: readonly (readonly XnpvStep[])[] = [\n ['rate', 'counts', 'dates', 'values', 'order'],\n ['rate', 'dates', 'counts', 'values', 'order'],\n ['dates', 'rate', 'counts', 'values', 'order'],\n ['rate', 'counts', 'pairs', 'order'],\n ['rate', 'counts', 'pairsOrderAfterDate'],\n ['rate', 'counts', 'pairsOrderAfterValue'],\n];\n\n/** What one order of XNPV's checks answers: an Error Value, a refusal, or neither, the sum. */\ninterface XnpvOutcome {\n readonly error: ErrorValue | undefined;\n readonly refused: boolean;\n}\n\nconst sumOutcome: XnpvOutcome = { error: undefined, refused: false };\nconst numOutcome: XnpvOutcome = { error: '#NUM!', refused: false };\n\nfunction sameOutcome(a: XnpvOutcome, b: XnpvOutcome): boolean {\n return a.error === b.error && a.refused === b.refused;\n}\n\n/**\n * XNPV: each value discounted by the years from the first date, the days divided by 365, and the discounted\n * values summed from the first, the plain sum (XNPV-018). The values and the dates are ranges of the same count,\n * numbers only. A rate of 0 or below is `#NUM!`, checked before XNPV evaluates (XNPV-007 to 012, 017, 019, 020).\n * The order of the checks is as run 18a read it; where the orders it leaves part, XNPV refuses.\n */\nexport function xNpv(call: FunctionCall): Operand {\n const rateRead = numberArgument(call, 0);\n let rate = 0;\n let rateError: ErrorValue | undefined;\n if (rateRead instanceof Operand) {\n const scalar = rateRead.scalar;\n if (scalar === undefined || !scalar.isError || scalar.isRefused) return rateRead;\n rateError = scalar.error;\n } else rate = rateRead;\n const values = cellsOf(call, 1);\n const dates = cellsOf(call, 2);\n const countsDiffer = cellCount(call.operand(1)) !== cellCount(call.operand(2));\n const outcome = checked(xnpvOrders[0] as readonly XnpvStep[], rateError, rate, countsDiffer, values, dates); // oxlint-disable-line typescript/no-unsafe-type-assertion -- six orders\n for (const order of xnpvOrders.slice(1)) {\n if (!sameOutcome(checked(order, rateError, rate, countsDiffer, values, dates), outcome)) return call.evaluator.refuse();\n }\n if (outcome.refused) return call.evaluator.refuse();\n if (outcome.error !== undefined) return Operand.ofError(outcome.error);\n const onePlusRate = 1 + rate;\n const origin = Math.floor(numberAt(dates, 0));\n let total = 0;\n for (let i = 0; i < values.length; i++) {\n const discount = raiseOrError(onePlusRate, (Math.floor(numberAt(dates, i)) - origin) / 365);\n if (typeof discount !== 'number') return Operand.ofError(discount);\n total += numberAt(values, i) / discount;\n }\n return numberResult(total);\n}\n\nfunction numberAt(cells: readonly (Value | undefined)[], index: number): number {\n const cell = cells[index];\n if (cell === undefined) throw new Error('Internal: XNPV reads a cell its checks found blank.');\n return cell.number;\n}\n\n/** The answer of XNPV's checks made in `order`: the first that fails, or the sum. */\nfunction checked(order: readonly XnpvStep[], rateError: ErrorValue | undefined, rate: number, countsDiffer: boolean,\n values: readonly (Value | undefined)[], dates: readonly (Value | undefined)[]): XnpvOutcome {\n for (const step of order) {\n let outcome: XnpvOutcome | undefined;\n switch (step) {\n case 'rate':\n outcome = rateError !== undefined ? { error: rateError, refused: false } : rate <= 0 ? numOutcome : undefined;\n break;\n case 'counts':\n outcome = countsDiffer ? numOutcome : undefined;\n break;\n case 'dates':\n outcome = firstFailure(dates);\n break;\n case 'values':\n outcome = firstFailure(values);\n break;\n case 'order':\n for (let i = 1; i < dates.length && outcome === undefined; i++) {\n if (beforeFirst(dates, i)) outcome = numOutcome;\n }\n break;\n case 'pairs':\n case 'pairsOrderAfterDate':\n case 'pairsOrderAfterValue':\n outcome = paired(step, values, dates);\n break;\n default: throw new Error(`Internal: ${String(step)} is no step of XNPV's.`);\n }\n if (outcome !== undefined) return outcome;\n }\n return sumOutcome;\n}\n\nfunction firstFailure(cells: readonly (Value | undefined)[]): XnpvOutcome | undefined {\n for (const cell of cells) {\n const outcome = failureOf(cell);\n if (outcome !== undefined) return outcome;\n }\n return undefined;\n}\n\n/** The dates and the values read pair by pair, a date before its value, in one of the pair orders. */\nfunction paired(step: XnpvStep, values: readonly (Value | undefined)[], dates: readonly (Value | undefined)[]): XnpvOutcome | undefined {\n for (let i = 0; i < Math.min(values.length, dates.length); i++) {\n const date = failureOf(dates[i]);\n if (date !== undefined) return date;\n if (step === 'pairsOrderAfterDate' && beforeFirst(dates, i)) return numOutcome;\n const value = failureOf(values[i]);\n if (value !== undefined) return value;\n if (step === 'pairsOrderAfterValue' && beforeFirst(dates, i)) return numOutcome;\n }\n return undefined;\n}\n\n/** A cell's failure: its Error Value, a refusal where it is not a number, or `undefined` for a number. */\nfunction failureOf(cell: Value | undefined): XnpvOutcome | undefined {\n if (cell?.isError === true) return { error: cell.error, refused: false };\n if (cell?.kind === 'number') return undefined;\n return { error: undefined, refused: true };\n}\n\n/** Whether date `index`, read and a number, as the first is, lies before the first's day. */\nfunction beforeFirst(dates: readonly (Value | undefined)[], index: number): boolean {\n return Math.floor(numberAt(dates, index)) < Math.floor(numberAt(dates, 0));\n}\n\n/** How many cells a range argument holds, whatever they hold. */\nfunction cellCount(operand: Operand): number {\n switch (operand.kind) {\n case 'column': return operand.columnOf().length;\n case 'array': {\n const array = operand.arrayOf();\n return array.rows * array.columns;\n }\n case 'area': return operand.area.rows * operand.area.columns;\n case 'scalar':\n case 'missing':\n case 'threeD':\n return 1;\n default: throw new Error(`Internal: ${String(operand.kind)} is no kind of operand.`);\n }\n}\n\n/** Every cell of a range, blank as `undefined`, read in order. A range of more than 1,000,000 cells is one blank, which XNPV refuses. */\nfunction cellsOf(call: FunctionCall, index: number): (Value | undefined)[] {\n const operand = call.operand(index);\n switch (operand.kind) {\n case 'scalar': return [operand.scalar];\n case 'column': return [...operand.columnOf()];\n case 'array': return [...operand.arrayOf().all()];\n case 'area': return areaCells(operand.area, operand.cellsOf());\n case 'missing':\n case 'threeD':\n return [undefined];\n default: throw new Error(`Internal: ${String(operand.kind)} is no kind of operand.`);\n }\n}\n\nfunction areaCells(area: Area, reader: CellReader): (Value | undefined)[] {\n if (area.rows * area.columns > 1_000_000) return [undefined];\n const cells: (Value | undefined)[] = [];\n for (let row = area.row1; row <= area.row2; row++) {\n for (let column = area.column1; column <= area.column2; column++) cells.push(reader.read(new CellAddress(row, column)));\n }\n return cells;\n}\n", "// AND, OR, NOT, IFNA, ISBLANK, ISNUMBER, ISTEXT, ISNA, NA, ERROR.TYPE, IFS, SWITCH and XOR, each to Microsoft's\n// documentation of it (C#'s Functions.Logic.cs).\nimport { Value } from '../../value';\nimport { approximatelyEqual } from '../arithmetic';\nimport { compareValues } from '../evaluator';\nimport type { FunctionCall } from '../function-definition';\nimport { Operand } from '../operand';\nimport { fallbackOf } from './core';\nimport { booleanResult, isArray, scalarArgument, truthOf, unlifted } from './shared';\n\nexport function and(call: FunctionCall): Operand {\n return logical(call, true);\n}\n\nexport function or(call: FunctionCall): Operand {\n return logical(call, false);\n}\n\n/** AND and OR, over the logical values `readLogicals` reads. With nothing that counts, the result is `#VALUE!`. */\nfunction logical(call: FunctionCall, all: boolean): Operand {\n let result: boolean | undefined;\n const failure = readLogicals(call, truth => {\n result = all ? (result === undefined || result) && truth : (result !== undefined && result) || truth;\n });\n if (failure !== undefined) return failure;\n return result === undefined ? Operand.ofError('#VALUE!') : booleanResult(result);\n}\n\n/**\n * The logical values AND, OR and XOR take, left to right, each handed to `take`. Inside a range or a Reference,\n * numbers and booleans count, a number being TRUE unless it is 0, and text and blanks are passed over. Typed as\n * an argument, a number or a boolean counts, and so does text that spells TRUE or FALSE; other text is passed\n * over, as text inside a range is (AND-011: Excel's `AND(\"abc\",TRUE)` is TRUE). An argument left empty is\n * FALSE. An Error Value anywhere is the failure, the first one found left to right; no value decides the result\n * early, so an error after a FALSE is still the result.\n */\nfunction readLogicals(call: FunctionCall, take: (truth: boolean) => void): Operand | undefined {\n const evaluator = call.evaluator;\n for (let i = 0; i < call.count; i++) {\n const operand = call.operand(i);\n switch (operand.kind) {\n case 'area':\n case 'column':\n case 'array':\n case 'threeD':\n for (const value of evaluator.rangeValues(operand)) {\n if (value.isError) return Operand.of(value);\n if (value.kind === 'number') take(value.number !== 0);\n else if (value.kind === 'boolean') take(value.boolean);\n }\n break;\n case 'missing':\n take(false);\n break;\n case 'scalar': {\n const scalar = operand.scalar;\n if (scalar === undefined) break;\n if (scalar.isError) return Operand.of(scalar);\n const truth = truthOf(scalar);\n if (truth !== undefined) take(truth);\n break;\n }\n default: throw new Error(`Internal: ${String(operand.kind)} is no kind of operand.`);\n }\n }\n return undefined;\n}\n\n/** NOT: a blank is FALSE, so its NOT is TRUE; otherwise the test `IF` applies. */\nexport function not(call: FunctionCall): Operand {\n const value = scalarArgument(call, 0);\n if (value instanceof Operand) return value;\n if (value === undefined) return booleanResult(true);\n const truth = truthOf(value);\n return truth === undefined ? Operand.ofError('#VALUE!') : booleanResult(!truth);\n}\n\n/** IFNA: as `IFERROR`, for `#N/A` alone. So it catches neither `#GETTING_DATA` (ADR-0049) nor `#CIRC!` (ADR-0047). */\nexport function ifNa(call: FunctionCall): Operand {\n const operand = call.operand(0);\n if (isArray(operand)) return unlifted(call);\n const value = call.evaluator.scalarOf(operand);\n if (value?.isError === true && value.error === '#N/A') return fallbackOf(call);\n return Operand.ofScalar(value);\n}\n\n/** ISBLANK: TRUE for an empty cell only; a Formula that returns `\"\"` is not blank. */\nexport function isBlank(call: FunctionCall): Operand {\n return inspect(call, value => value === undefined);\n}\n\n/** ISNUMBER: TRUE for a number only; text that reads as one is not a number. */\nexport function isNumber(call: FunctionCall): Operand {\n return inspect(call, value => value?.kind === 'number');\n}\n\n/**\n * An IS function: it answers TRUE or FALSE for any one Value, an Error Value included, and a kept blank as a\n * blank cell's, as Excel's `ISBLANK` read `SORT`'s (SORT-022) \u2014 but `#GETTING_DATA` and `#CIRC!` are its result,\n * as `ISERROR`'s (ADR-0047, ADR-0049): FALSE would be an answer about data that has not arrived, or about a\n * cycle.\n */\nfunction inspect(call: FunctionCall, test: (value: Value | undefined) => boolean): Operand {\n const operand = call.oneValue(0);\n if (isArray(operand)) return unlifted(call);\n const value = call.evaluator.scalarOf(operand);\n if (value?.isError === true && (value.error === '#GETTING_DATA' || value.error === '#CIRC!')) return Operand.of(value);\n return booleanResult(test(value));\n}\n\n/** ISTEXT: TRUE for text only, empty text included; a number is not text. */\nexport function isText(call: FunctionCall): Operand {\n return inspect(call, value => value?.kind === 'text');\n}\n\n/** ISNA: TRUE for `#N/A` only. */\nexport function isNa(call: FunctionCall): Operand {\n return inspect(call, value => value?.isError === true && value.error === '#N/A');\n}\n\n/**\n * LET is read into a `LetNode` of its own, with its names in scope (ADR-0181), and never called as a function:\n * declared so that completion, the argument hint and the catalogue know it.\n */\nexport function letFunction(): Operand {\n throw new Error('Internal: LET is evaluated as a LetNode, never as a call.');\n}\n\n/** NA: the Error Value `#N/A`. */\nexport function na(): Operand {\n return Operand.ofError('#N/A');\n}\n\n/**\n * ERROR.TYPE (ADR-0047's note of 2026-10-10): Microsoft's number for an Error Value \u2014 `#NULL!` 1, `#DIV/0!` 2,\n * `#VALUE!` 3, `#REF!` 4, `#NAME?` 5, `#NUM!` 6, `#N/A` 7 \u2014 and `#N/A` for a Value that is no error. Excel's\n * newer Error Values take the numbers Excel gave them (ERRORTYPE-013 to 019): `#SPILL!` 9, `#CONNECT!` 10,\n * `#BLOCKED!` 11, `#UNKNOWN!` 12, `#FIELD!` 13, `#CALC!` 14. `#GETTING_DATA` and `#CIRC!` are given back, never\n * numbered (ADR-0049).\n */\nexport function errorType(call: FunctionCall): Operand {\n const operand = call.operand(0);\n if (isArray(operand)) return unlifted(call);\n const value = call.evaluator.scalarOf(operand);\n if (value?.isError !== true) return Operand.ofError('#N/A');\n switch (value.error) {\n case '#NULL!': return Operand.of(Value.fromNumber(1));\n case '#DIV/0!': return Operand.of(Value.fromNumber(2));\n case '#VALUE!': return Operand.of(Value.fromNumber(3));\n case '#REF!': return Operand.of(Value.fromNumber(4));\n case '#NAME?': return Operand.of(Value.fromNumber(5));\n case '#NUM!': return Operand.of(Value.fromNumber(6));\n case '#N/A': return Operand.of(Value.fromNumber(7));\n case '#SPILL!': return Operand.of(Value.fromNumber(9));\n case '#CONNECT!': return Operand.of(Value.fromNumber(10));\n case '#BLOCKED!': return Operand.of(Value.fromNumber(11));\n case '#UNKNOWN!': return Operand.of(Value.fromNumber(12));\n case '#FIELD!': return Operand.of(Value.fromNumber(13));\n case '#CALC!': return Operand.of(Value.fromNumber(14));\n case '#GETTING_DATA':\n case '#CIRC!':\n return Operand.of(value);\n default: return Operand.ofError('#VALUE!');\n }\n}\n\n/**\n * IFS: the value beside the first test that is TRUE, each test read as `IF` reads its own; a test's Error Value\n * is the result; with none TRUE, `#N/A`. Only the tests up to the first TRUE, and its value, are evaluated.\n */\nexport function ifs(call: FunctionCall): Operand {\n for (let i = 0; i + 1 < call.count; i += 2) {\n const test = call.operand(i);\n if (isArray(test)) return unlifted(call);\n const value = call.evaluator.scalarOf(test);\n let truth = false;\n if (value !== undefined) {\n const read = truthOf(value);\n if (read === undefined) return Operand.ofError(value.isError ? value.error : '#VALUE!');\n truth = read;\n }\n if (truth) return call.has(i + 1) ? call.operand(i + 1) : Operand.of(Value.fromNumber(0));\n }\n return Operand.ofError('#N/A');\n}\n\n/**\n * SWITCH: the result beside the first value equal to the expression, compared as `=` compares; with none, the\n * default when one is given, else `#N/A`. An Error Value in the expression, or in a value reached before a\n * match, is the result.\n */\nexport function switchFunction(call: FunctionCall): Operand {\n const expression = scalarArgument(call, 0);\n if (expression instanceof Operand) return expression;\n const pairs = Math.trunc((call.count - 1) / 2);\n for (let p = 0; p < pairs; p++) {\n const at = 1 + 2 * p;\n const candidate = scalarArgument(call, at);\n if (candidate instanceof Operand) return candidate;\n if (compareValues(expression, candidate, approximatelyEqual) === 0) {\n return call.has(at + 1) ? call.operand(at + 1) : Operand.of(Value.fromNumber(0));\n }\n }\n const hasDefault = (call.count - 1) % 2 === 1;\n return hasDefault ? call.operand(call.count - 1) : Operand.ofError('#N/A');\n}\n\n/** XOR: TRUE when an odd number of the logical values AND and OR take are TRUE; with none, `#VALUE!`. */\nexport function xor(call: FunctionCall): Operand {\n const read = { any: false, odd: false };\n const failure = readLogicals(call, truth => {\n read.any = true;\n if (truth) read.odd = !read.odd;\n });\n if (failure !== undefined) return failure;\n return read.any ? booleanResult(read.odd) : Operand.ofError('#VALUE!');\n}\n", "/**\n * A Formula that cannot be read. Excel refuses to accept such a Formula into a cell, and so does a Sheet:\n * nothing is recorded and no Value changes.\n */\nexport class FormulaSyntaxError extends SyntaxError {\n /** The Formula text as given. */\n readonly formula: string;\n /** The zero-based position in `formula` where reading stopped. */\n readonly position: number;\n /** Why, in words. */\n readonly reason: string;\n /**\n * Whether the Formula is one Excel reads, using syntax the engine does not implement (the intersection of\n * two References): typed without `=`, such text is refused by name rather than kept as text, since Excel\n * makes it a Formula (ADR-0047, third run). @internal\n */\n readonly isUnimplemented: boolean;\n /**\n * Whether the Formula is refused for its size alone: functions nested past Excel's 64 levels, or a\n * Formula nested past the engine's 256 levels (ADR-0047). Such text is still a Formula. @internal\n */\n readonly isBeyondLimit: boolean;\n\n /** The refusal of `formula` at `position`, for `reason`. */\n constructor(formula: string, position: number, reason: string, flags: { readonly isUnimplemented?: boolean; readonly isBeyondLimit?: boolean } = {}) {\n super(`The Formula '${formula}' cannot be read at position ${String(position)}: ${reason}`);\n this.name = 'FormulaSyntaxError';\n this.formula = formula;\n this.position = position;\n this.reason = reason;\n this.isUnimplemented = flags.isUnimplemented === true;\n this.isBeyondLimit = flags.isBeyondLimit === true;\n }\n}\n", "// Splits a Formula's invariant text into tokens: Excel's spelling, with `,` between arguments and `.` as the\n// decimal separator in every culture (ADR-0047).\nimport { columnCount, rowCount, CellAddress } from '../cell-address';\nimport { parseFormulaNumber } from '../constant-parser';\nimport { isAscii, isAsciiDigit, isLetter, isWhiteSpace, startsWithAtIgnoreCase, equalsIgnoreCase } from '../dotnet';\nimport { FormulaSyntaxError } from '../formula-syntax-error';\nimport { errorValues, type ErrorValue } from '../value';\nimport { Reference } from './reference';\n\n/** What a token is. */\nexport type TokenKind =\n | 'number' | 'text' | 'error' | 'reference' | 'name' | 'structuredReference' | 'operator'\n | 'leftParenthesis' | 'rightParenthesis' | 'comma' | 'end';\n\n/** One token of a Formula. */\nexport interface Token {\n readonly kind: TokenKind;\n readonly position: number;\n readonly text: string;\n readonly afterSpace: boolean;\n /** How many characters of the Formula the token spans, from `position`. */\n readonly length: number;\n readonly number: number;\n readonly reference: Reference | undefined;\n readonly error: ErrorValue | undefined;\n /** For a structured reference: the table's name; `text` is the column's. */\n readonly tableName: string | undefined;\n /** For `#REF!` written after a Sheet qualifier (`Sheet1!#REF!`): the Sheet's name, unquoted. */\n readonly sheetName: string | undefined;\n}\n\nfunction token(kind: TokenKind, position: number, text: string, afterSpace: boolean, parts: Partial<Token> = {}): Token {\n return {\n kind, position, text, afterSpace, length: 0, number: 0, reference: undefined, error: undefined, tableName: undefined, sheetName: undefined,\n ...parts,\n };\n}\n\nconst sheetPart = String.raw`'(?:[^']|'')+'|[A-Za-z_][A-Za-z0-9_.]*`;\nconst placePart = String.raw`(?:(?<c1>\\$?[A-Za-z]{1,3})(?<r1>\\$?[0-9]{1,7})(?::(?<c2>\\$?[A-Za-z]{1,3})(?<r2>\\$?[0-9]{1,7}))?`\n + String.raw`|(?<cc1>\\$?[A-Za-z]{1,3}):(?<cc2>\\$?[A-Za-z]{1,3})|(?<rr1>\\$?[0-9]{1,7}):(?<rr2>\\$?[0-9]{1,7}))(?![A-Za-z0-9_.(\\[!:$])`;\n\n/** A Reference: an optional Sheet qualifier, then a cell, a rectangle, whole columns or whole rows. */\nconst referencePattern = new RegExp(`(?:(?<sheet>${sheetPart})!)?${placePart}`, 'yd');\n\n/**\n * A 3D Reference's span before its `!` (ADR-0331 \u00A77): `Sheet1:Sheet3!`, or quoted whole, `'Q1 Sales:Sheet3'!`,\n * as Excel writes one. A Sheet's name holds no `:`, so the one inside the quotes is the span's.\n */\nconst sheetSpanPattern = /(?:'(?<quotedFirst>(?:[^':]|'')+):(?<quotedLast>(?:[^':]|'')+)'|(?<first>[A-Za-z_][A-Za-z0-9_.]*):(?<last>[A-Za-z_][A-Za-z0-9_.]*))!/y;\n\n/** `Sheet1!#REF!`: a qualified Reference whose cells were deleted, as Excel writes it. */\nconst qualifiedRefErrorPattern = new RegExp(`(?<sheet>${sheetPart})!#REF!`, 'iy');\n\nconst numberPattern = /(?:[0-9]+(?:\\.[0-9]*)?|\\.[0-9]+)(?:[eE][+-]?[0-9]+)?/y;\n\nconst namePattern = /[A-Za-z_\\\\][A-Za-z0-9_.]*/y;\n\nconst operators = ['<>', '<=', '>=', '=', '<', '>', '+', '-', '*', '/', '^', '&', '%'];\n\n/** The largest number constant a Formula may hold: 9.99999999999999E+307, as Microsoft documents Excel's. */\nconst largestConstant = 9.99999999999999e307;\n\nfunction stickyMatch(pattern: RegExp, text: string, at: number): RegExpExecArray | null {\n pattern.lastIndex = at;\n return pattern.exec(text);\n}\n\nfunction groupsOf(match: RegExpExecArray): Record<string, string | undefined> {\n if (match.groups === undefined) throw new Error('Internal: a pattern with named groups matched without them.');\n return match.groups;\n}\n\n/**\n * A name that may hold a letter of any script, as a `LET` name may (`\u540D\u524D`, `\u00E9`; ADR-0181), read as .NET's\n * `[\\p{L}_\\\\][\\p{L}0-9_.]*` reads it: a letter judged per UTF-16 unit. Its length, or 0 where none starts.\n */\nfunction wideNameLength(formula: string, at: number): number {\n const first = formula.charCodeAt(at);\n if (!(isLetter(first) || first === 0x5f || first === 0x5c)) return 0;\n let i = at + 1;\n while (i < formula.length) {\n const c = formula.charCodeAt(i);\n if (!(isLetter(c) || isAsciiDigit(c) || c === 0x5f || c === 0x2e)) break;\n i++;\n }\n return i - at;\n}\n\n/** Where the first character outside ASCII stands in `text`, or \u22121. */\nexport function firstWide(text: string): number {\n for (let i = 0; i < text.length; i++) {\n if (!isAscii(text.charCodeAt(i))) return i;\n }\n return -1;\n}\n\n/**\n * The whitespace a Formula may hold between its tokens: a space and a line break. Excel refuses a tab; a\n * carriage return is taken with its line feed; the other space characters are refused.\n */\nexport function isFormulaWhitespace(c: string): boolean {\n return c === ' ' || c === '\\n' || c === '\\r';\n}\n\n/** The Formula's tokens from `start`, ending with an `end` token; a Formula that cannot be read is a `FormulaSyntaxError`. */\nexport function tokenize(formula: string, start: number): Token[] {\n const tokens: Token[] = [];\n try {\n read(formula, start, tokens);\n return tokens;\n } catch (error) {\n const wide = wideNameOutsideLet(tokens);\n if (!(error instanceof FormulaSyntaxError) || wide === undefined) throw error;\n // Before LET was admitted (ADR-0181) the lexer refused a name of another script where it stood, before\n // anything after it; outside a LET it still does.\n const at = wide.position + firstWide(wide.text);\n throw new FormulaSyntaxError(formula, at, `'${formula.charAt(at)}' is not part of the formula syntax ExSheet reads.`);\n }\n}\n\n/**\n * The first name of another script than ASCII among `tokens`, when none of them is `LET`: such a name is a\n * `LET` name or nothing (ADR-0181). `undefined` otherwise.\n */\nexport function wideNameOutsideLet(tokens: readonly Token[]): Token | undefined {\n let wide: Token | undefined;\n for (const t of tokens) {\n if (t.kind !== 'name') continue;\n if (equalsIgnoreCase(t.text, 'LET')) return undefined;\n if (wide === undefined && firstWide(t.text) >= 0) wide = t;\n }\n return wide;\n}\n\nfunction read(formula: string, start: number, tokens: Token[]): void {\n let i = start;\n for (;;) {\n let afterSpace = false;\n while (i < formula.length && isWhiteSpace(formula.charCodeAt(i))) {\n if (!isFormulaWhitespace(formula.charAt(i))) {\n throw new FormulaSyntaxError(formula, i, \"a Formula's whitespace is spaces and line breaks; Excel refuses a tab or any other space character.\");\n }\n i++;\n afterSpace = true;\n }\n if (i >= formula.length) {\n tokens.push(token('end', i, '', afterSpace));\n return;\n }\n\n const c = formula.charAt(i);\n if (c === '\"') {\n let text = '';\n let j = i + 1;\n for (;;) {\n if (j >= formula.length) throw new FormulaSyntaxError(formula, i, 'the text has no closing quotation mark.');\n if (formula.charAt(j) === '\"') {\n if (j + 1 < formula.length && formula.charAt(j + 1) === '\"') {\n text += '\"';\n j += 2;\n continue;\n }\n break;\n }\n text += formula.charAt(j);\n j++;\n }\n tokens.push(token('text', i, text, afterSpace, { length: j + 1 - i }));\n i = j + 1;\n continue;\n }\n\n if (c === '#') {\n // Excel's own seven, #NULL! to #N/A, in the order the C# enum holds them.\n const spelled = errorValues.slice(0, 7).find(e => startsWithAtIgnoreCase(formula, i, e));\n if (spelled === undefined) throw new FormulaSyntaxError(formula, i, \"this is not one of Excel's Error Values.\");\n tokens.push(token('error', i, spelled, afterSpace, { error: spelled, length: spelled.length }));\n i += spelled.length;\n continue;\n }\n\n if (c === '(' || c === ')' || c === ',') {\n tokens.push(token(c === '(' ? 'leftParenthesis' : c === ')' ? 'rightParenthesis' : 'comma', i, c, afterSpace, { length: 1 }));\n i++;\n continue;\n }\n\n const qualifiedError = stickyMatch(qualifiedRefErrorPattern, formula, i);\n if (qualifiedError !== null) {\n const raw = groupText(groupsOf(qualifiedError), 'sheet');\n tokens.push(token('error', i, qualifiedError[0], afterSpace, {\n error: '#REF!', sheetName: unquoteSheet(raw), length: qualifiedError[0].length,\n }));\n i += qualifiedError[0].length;\n continue;\n }\n\n const threeD = readThreeD(formula, i);\n if (threeD !== undefined) {\n // Sheet1:Sheet3!B2# is read as A1# is, and is #REF!, as Excel's (ADR-0331 \u00A77).\n let { reference: spanned, length: spanLength } = threeD;\n if (spanned.shape === 'cell' && i + spanLength < formula.length && formula.charAt(i + spanLength) === '#') {\n spanned = spanned.with({ spilled: true });\n spanLength++;\n }\n tokens.push(token('reference', i, formula.slice(i, i + spanLength), afterSpace, { reference: spanned, length: spanLength }));\n i += spanLength;\n continue;\n }\n\n const referenceMatch = stickyMatch(referencePattern, formula, i);\n const parsed = referenceMatch === null ? undefined : referenceOf(referenceMatch);\n if (referenceMatch !== null && parsed !== undefined) {\n // A1#: the Spill Range of the Formula in A1, written after one cell only (ADR-0125).\n let length = referenceMatch[0].length;\n let reference = parsed;\n if (reference.shape === 'cell' && i + length < formula.length && formula.charAt(i + length) === '#') {\n reference = reference.with({ spilled: true });\n length++;\n }\n tokens.push(token('reference', i, formula.slice(i, i + length), afterSpace, { reference, length }));\n i += length;\n continue;\n }\n\n if (isAsciiDigit(formula.charCodeAt(i)) || c === '.') {\n const number = stickyMatch(numberPattern, formula, i);\n if (number === null) throw new FormulaSyntaxError(formula, i, 'this is not a number.');\n const value = parseFormulaNumber(number[0]);\n // Excel takes no number constant above 9.99999999999999E+307, its documented largest (ADR-0047, second run).\n if (!Number.isFinite(value) || value > largestConstant) throw new FormulaSyntaxError(formula, i, 'the number is too large.');\n tokens.push(token('number', i, number[0], afterSpace, { number: value, length: number[0].length }));\n i += number[0].length;\n continue;\n }\n\n const nameLength = wideNameLength(formula, i);\n if (nameLength > 0) {\n const name = formula.slice(i, i + nameLength);\n const end = i + nameLength;\n if (end < formula.length && formula.charAt(end) === '[') {\n // A Linked Table's name is ASCII (ADR-0049): a wider one is no structured reference.\n const wide = firstWide(name);\n if (wide >= 0) throw new FormulaSyntaxError(formula, i + wide, `'${formula.charAt(i + wide)}' is not part of the formula syntax ExSheet reads.`);\n const column = structuredColumn(formula, end);\n if (column.refusal !== undefined) throw new FormulaSyntaxError(formula, column.refusal.position, column.refusal.reason);\n tokens.push(token('structuredReference', i, column.column, afterSpace, { tableName: name, length: column.after - i }));\n i = column.after;\n continue;\n }\n tokens.push(token('name', i, name, afterSpace, { length: nameLength }));\n i = end;\n continue;\n }\n\n const op = operators.find(o => formula.startsWith(o, i));\n if (op !== undefined) {\n tokens.push(token('operator', i, op, afterSpace, { length: op.length }));\n i += op.length;\n continue;\n }\n\n throw new FormulaSyntaxError(formula, i, `'${c}' is not part of the formula syntax ExSheet reads.`);\n }\n}\n\n/** A structured reference's column read, or where and why it cannot be. */\ntype StructuredColumn =\n | { readonly column: string; readonly after: number; readonly refusal?: undefined }\n | { readonly column?: undefined; readonly after?: undefined; readonly refusal: { readonly position: number; readonly reason: string } };\n\n/**\n * Reads `[Column]` or `[[Column]]`, with `'` escaping the next character, as Excel's structured references do.\n * Other structured forms (`#All`, `@`, column ranges) are not read.\n */\nfunction structuredColumn(formula: string, open: number): StructuredColumn {\n const doubled = open + 1 < formula.length && formula.charAt(open + 1) === '[';\n let i = open + (doubled ? 2 : 1);\n let column = '';\n for (;;) {\n if (i >= formula.length) return { refusal: { position: open, reason: 'the structured reference has no closing bracket.' } };\n const c = formula.charAt(i);\n if (c === \"'\" && i + 1 < formula.length) {\n column += formula.charAt(i + 1);\n i += 2;\n continue;\n }\n if (c === '[' || c === '#' || c === '@') return { refusal: { position: i, reason: 'only a Table[Column] structured reference is read.' } };\n if (c === ']') break;\n column += c;\n i++;\n }\n if (doubled) {\n if (i + 1 >= formula.length || formula.charAt(i + 1) !== ']') return { refusal: { position: i, reason: 'only a Table[Column] structured reference is read.' } };\n i++;\n }\n if (column.length === 0) return { refusal: { position: open, reason: 'the structured reference names no column.' } };\n return { column, after: i + 1 };\n}\n\n/** One part of a matched Reference: its text, and where it stands in the text it was found in. */\nexport interface ReferenceMatchPart {\n readonly value: string;\n readonly index: number;\n}\n\n/** A Reference's text read apart: where its Sheet qualifier and each column and row part stand, `$` included. */\nexport interface ReferenceMatch {\n /** Where the match starts in the text it was found in. */\n readonly index: number;\n /** How many characters it spans. */\n readonly length: number;\n /** The parts that matched, by group: `sheet`, `c1`, `r1`, `c2`, `r2`, `cc1`, `cc2`, `rr1`, `rr2`. */\n readonly groups: Readonly<Record<string, ReferenceMatchPart | undefined>>;\n}\n\n/**\n * The Reference written at `at`, as this grammar reads one there, or `undefined`: the match's groups say where\n * its Sheet qualifier and each column and row part stand \u2014 `c1`, `r1`, `c2`, `r2` for a cell or an area, `cc1`,\n * `cc2` for whole columns and `rr1`, `rr2` for whole rows. Nothing that `tokenize` would not read as a Reference.\n */\nexport function matchReference(formula: string, at: number): ReferenceMatch | undefined {\n const match = stickyMatch(referencePattern, formula, at);\n if (match === null || referenceOf(match) === undefined) return undefined;\n const indices = match.indices?.groups;\n if (indices === undefined) throw new Error('Internal: the Reference pattern is matched with its indices.');\n const groups: Record<string, ReferenceMatchPart | undefined> = {};\n for (const [name, value] of Object.entries(groupsOf(match))) {\n const span = indices[name];\n groups[name] = value === undefined || span === undefined ? undefined : { value, index: span[0] };\n }\n return { index: match.index, length: match[0].length, groups };\n}\n\n/** The Reference `matchReference` finds at `at`, read, and how many characters it spans; `undefined` where it finds none. */\nexport function readReference(formula: string, at: number): { reference: Reference; length: number } | undefined {\n const match = stickyMatch(referencePattern, formula, at);\n const reference = match === null ? undefined : referenceOf(match);\n return match === null || reference === undefined ? undefined : { reference, length: match[0].length };\n}\n\n/**\n * The structured reference written at `at` \u2014 `Table[Column]` or `Table[[Column]]` \u2014 as `tokenize` reads one\n * there: the table's name as written, the column's with its `'` escapes read, and how many characters it\n * spans. `undefined` where it reads none, or reads a form it refuses (`#All`, `@`).\n */\nexport function readStructuredReference(formula: string, at: number): { table: string; column: string; length: number } | undefined {\n const name = stickyMatch(namePattern, formula, at);\n if (name === null) return undefined;\n const open = at + name[0].length;\n if (open >= formula.length || formula.charAt(open) !== '[') return undefined;\n const column = structuredColumn(formula, open);\n return column.refusal === undefined ? { table: name[0], column: column.column, length: column.after - at } : undefined;\n}\n\n/**\n * The 3D Reference written at `at` (ADR-0331 \u00A77) \u2014 a span of Sheets, then a cell, a rectangle, whole columns or\n * whole rows, as after one Sheet's name \u2014 and how many characters it spans; `undefined` where none is.\n */\nfunction readThreeD(formula: string, at: number): { reference: Reference; length: number } | undefined {\n const span = stickyMatch(sheetSpanPattern, formula, at);\n if (span === null) return undefined;\n const place = stickyMatch(referencePattern, formula, at + span[0].length);\n if (place === null || groupsOf(place)['sheet'] !== undefined) return undefined;\n const reference = referenceOf(place);\n if (reference === undefined) return undefined;\n const groups = groupsOf(span);\n const first = groups['quotedFirst'] ?? groupText(groups, 'first');\n const last = groups['quotedLast'] ?? groupText(groups, 'last');\n return {\n reference: reference.with({ sheetName: first.replaceAll(\"''\", \"'\"), lastSheetName: last.replaceAll(\"''\", \"'\") }),\n length: span[0].length + place[0].length,\n };\n}\n\nfunction groupText(groups: Record<string, string | undefined>, name: string): string {\n const value = groups[name];\n if (value === undefined) throw new Error(`Internal: the group '${name}' matched without a value.`);\n return value;\n}\n\nfunction unquoteSheet(raw: string): string {\n return raw.charAt(0) === \"'\" ? raw.slice(1, -1).replaceAll(\"''\", \"'\") : raw;\n}\n\nfunction referenceOf(match: RegExpExecArray): Reference | undefined {\n const groups = groupsOf(match);\n const rawSheet = groups['sheet'];\n const sheet = rawSheet === undefined ? undefined : unquoteSheet(rawSheet);\n\n const c1Text = groups['c1'];\n if (c1Text !== undefined) {\n const c1 = columnOf(c1Text);\n const r1 = rowOf(groupText(groups, 'r1'));\n if (c1 === undefined || r1 === undefined) return undefined;\n const c2Text = groups['c2'];\n if (c2Text === undefined) return Reference.cell(sheet, r1.index, c1.index, r1.absolute, c1.absolute);\n const c2 = columnOf(c2Text);\n const r2 = rowOf(groupText(groups, 'r2'));\n if (c2 === undefined || r2 === undefined) return undefined;\n // Excel writes a rectangle from its top-left corner, whichever corner was typed first.\n const [left, right] = c2.index < c1.index ? [c2, c1] : [c1, c2];\n const [top, bottom] = r2.index < r1.index ? [r2, r1] : [r1, r2];\n return Reference.rectangle(sheet, top.index, left.index, bottom.index, right.index, top.absolute, left.absolute, bottom.absolute, right.absolute);\n }\n const cc1Text = groups['cc1'];\n if (cc1Text !== undefined) {\n const c1 = columnOf(cc1Text);\n const c2 = columnOf(groupText(groups, 'cc2'));\n if (c1 === undefined || c2 === undefined) return undefined;\n const [left, right] = c2.index < c1.index ? [c2, c1] : [c1, c2];\n // Excel holds a whole column's rows as absolute: A:XFD is written $1:$1048576.\n return Reference.rectangle(sheet, 0, left.index, rowCount - 1, right.index, true, left.absolute, true, right.absolute);\n }\n const r1 = rowOf(groupText(groups, 'rr1'));\n const r2 = rowOf(groupText(groups, 'rr2'));\n if (r1 === undefined || r2 === undefined) return undefined;\n const [top, bottom] = r2.index < r1.index ? [r2, r1] : [r1, r2];\n return Reference.rectangle(sheet, top.index, 0, bottom.index, columnCount - 1, top.absolute, true, bottom.absolute, true);\n}\n\nfunction columnOf(text: string): { index: number; absolute: boolean } | undefined {\n const absolute = text.charAt(0) === '$';\n const index = CellAddress.tryParseColumn(absolute ? text.slice(1) : text);\n return index === undefined ? undefined : { index, absolute };\n}\n\nfunction rowOf(text: string): { index: number; absolute: boolean } | undefined {\n const absolute = text.charAt(0) === '$';\n const digits = absolute ? text.slice(1) : text;\n if (digits.charAt(0) === '0') return undefined;\n const n = Number(digits);\n if (n > rowCount) return undefined;\n return { index: n - 1, absolute };\n}\n", "// XLOOKUP's match_mode 3, regular expressions (C#'s PortableRegex.cs; ADR-0047, \"What the observation settled\"\n// and \"What the second observation settled\"). Excel's expressions are PCRE2's; a pattern is accepted only when\n// every construct in it means the same in PCRE2 and in the engine, and is translated so that the engine's\n// regular expressions give PCRE2's answer. Any other pattern is refused.\n//\n// The C# engine translates into .NET's syntax; this one into ECMAScript's, compiled with the `u` flag (which\n// `\\p{\u2026}` needs). The accepted set and the refusals are the C# engine's, and each translation reads as the\n// .NET one does over the text it is let read: `.` and a negated class match a character outside the Basic\n// Multilingual Plane as one, as the .NET translation's surrogate pair does; a pattern using a Unicode class is\n// refused against a text holding a surrogate, where .NET (one UTF-16 unit at a time) and ECMAScript's `u` mode\n// (one code point) would read it differently; and `$` is PCRE2's and .NET's, at the end or before a final\n// newline. .NET stops a match after a second; ECMAScript cannot, so a pathological pattern runs.\nimport { isAsciiDigit } from '../dotnet';\n\nconst word = '\\\\p{L}\\\\p{N}\\\\p{Mn}\\\\p{Pc}';\nconst digit = '\\\\p{Nd}';\nconst space = '\\\\t\\\\n\\\\v\\\\f\\\\r\\\\u0085\\\\u180E\\\\p{Z}';\nconst metacharacters = '.\\\\*+?()[]{}|^$/-';\n\n/** The Unicode general categories both engines name alike. */\nconst categories = new Set([\n 'L', 'Lu', 'Ll', 'Lt', 'Lm', 'Lo', 'M', 'Mn', 'Mc', 'Me', 'N', 'Nd', 'Nl', 'No',\n 'P', 'Pc', 'Pd', 'Ps', 'Pe', 'Pi', 'Pf', 'Po', 'S', 'Sm', 'Sc', 'Sk', 'So',\n 'Z', 'Zs', 'Zl', 'Zp', 'C', 'Cc', 'Cf', 'Co', 'Cn',\n]);\n\ninterface Compiled {\n readonly regex: RegExp;\n readonly unicode: boolean;\n}\n\nconst cache = new Map<string, Compiled | undefined>();\n\n/** A text to search, at its position along the lookup array. */\nexport interface IndexedText {\n readonly index: number;\n readonly text: string;\n}\n\n/**\n * The position of the first text, in the order given, that `pattern` matches: `{ found }`, `found` undefined\n * for none; `undefined` when the pattern is refused, or when a text it has to read would be read differently.\n */\nexport function firstMatch(pattern: string, texts: Iterable<IndexedText>): { found: number | undefined } | undefined {\n const compiled = compile(pattern);\n if (compiled === undefined) return undefined;\n for (const { index, text } of texts) {\n if (compiled.unicode && /[\\uD800-\\uDFFF]/.test(text)) return undefined;\n if (compiled.regex.test(text)) return { found: index };\n }\n return { found: undefined };\n}\n\nfunction compile(pattern: string): Compiled | undefined {\n if (cache.has(pattern)) return cache.get(pattern);\n if (cache.size >= 256) cache.clear();\n const translation = translate(pattern);\n const compiled = translation === undefined ? undefined : construct(translation);\n cache.set(pattern, compiled);\n return compiled;\n}\n\nfunction construct(translation: { text: string; unicode: boolean }): Compiled | undefined {\n // A translation the engine does not take is refused, as .NET's ArgumentException is.\n if (!compilesAsRegex(translation.text)) return undefined;\n return { regex: new RegExp(translation.text, 'u'), unicode: translation.unicode };\n}\n\nfunction compilesAsRegex(text: string): boolean {\n try {\n void new RegExp(text, 'u');\n return true;\n } catch (error) { // oxlint-disable-line ex-grid/no-catch -- a pattern the engine does not take is refused, as .NET's ArgumentException is\n if (error instanceof SyntaxError) return false;\n throw error;\n }\n}\n\n/** The pattern in ECMAScript's syntax, meaning what it means to PCRE2; `undefined` when it uses a construct outside the accepted set. */\nexport function translate(pattern: string): { text: string; unicode: boolean } | undefined {\n let unicode = false;\n let output = '';\n const groups: Group[] = [];\n let captures = 0;\n let quantifiable = false;\n for (let i = 0; i < pattern.length; i++) {\n const c = pattern.charAt(i);\n switch (c) {\n case '\\\\': {\n if (++i >= pattern.length) return undefined;\n const escaped = pattern.charAt(i);\n if (escaped === 'd') {\n output += `[${digit}]`;\n unicode = true;\n quantifiable = true;\n } else if (escaped === 'w') {\n output += `[${word}]`;\n unicode = true;\n quantifiable = true;\n } else if (escaped === 's') {\n output += `[${space}]`;\n unicode = true;\n quantifiable = true;\n } else if (escaped === 'b') {\n output += `(?:(?<=[${word}])(?![${word}])|(?<![${word}])(?=[${word}]))`;\n unicode = true;\n quantifiable = false;\n } else if (escaped === 'p') {\n const close = pattern.charAt(i + 1) === '{' ? pattern.indexOf('}', i + 2) : -1;\n if (close < 0 || !categories.has(pattern.slice(i + 2, close))) return undefined;\n output += `\\\\p{${pattern.slice(i + 2, close)}}`;\n i = close;\n unicode = true;\n quantifiable = true;\n } else if (escaped >= '1' && escaped <= '9') {\n if (groups.includes('lookbehind')) return undefined;\n // A backreference to a group already opened; \\10 and up, and a digit after, read differently.\n if (escaped.charCodeAt(0) - 48 > captures || (i + 1 < pattern.length && isAsciiDigit(pattern.charCodeAt(i + 1)))) return undefined;\n output += `\\\\${escaped}`;\n quantifiable = true;\n } else {\n if (!metacharacters.includes(escaped)) return undefined;\n // ECMAScript's `u` mode takes no `\\-` outside a class: the hyphen there is itself.\n output += escaped === '-' ? '-' : `\\\\${escaped}`;\n quantifiable = true;\n }\n break;\n }\n case '.':\n output += '[^\\\\n]';\n quantifiable = true;\n break;\n case '[': {\n const read = characterClass(pattern, i);\n if (read === undefined) return undefined;\n output += read.text;\n unicode ||= read.unicode;\n i = read.end;\n quantifiable = true;\n break;\n }\n case '(':\n // Inside a lookbehind nothing opens: PCRE2 wants each of its branches a fixed length.\n if (groups.includes('lookbehind')) return undefined;\n if (pattern.charAt(i + 1) === '?') {\n const third = pattern.charAt(i + 2);\n if (third === '=' || third === '!') {\n output += `(?${third}`;\n i += 2;\n groups.push('lookahead');\n } else if (third === '<' && (pattern.charAt(i + 3) === '=' || pattern.charAt(i + 3) === '!')) {\n output += `(?<${pattern.charAt(i + 3)}`;\n i += 3;\n groups.push('lookbehind');\n } else return undefined;\n } else {\n output += '(';\n captures++;\n groups.push('capture');\n }\n quantifiable = false;\n break;\n case ')': {\n const closed = groups.pop();\n if (closed === undefined) return undefined;\n output += ')';\n // A quantified lookaround is read differently by the two engines' versions: refused.\n quantifiable = closed === 'capture';\n break;\n }\n case '|':\n case '^':\n output += c;\n quantifiable = false;\n break;\n case '$':\n // PCRE2's and .NET's $: at the end, or before a newline that ends the text.\n output += '(?=\\\\n?$)';\n quantifiable = false;\n break;\n case '*':\n case '+':\n case '?': {\n if (!quantifiable || groups.includes('lookbehind')) return undefined;\n output += c;\n const lazy = lazyAfter(pattern, i);\n if (lazy === undefined) return undefined;\n output += lazy.text;\n i = lazy.at;\n quantifiable = false;\n break;\n }\n case '{': {\n if (!quantifiable || groups.includes('lookbehind')) return undefined;\n const closeBrace = pattern.indexOf('}', i);\n if (closeBrace < 0 || !bounds(pattern.slice(i + 1, closeBrace))) return undefined;\n output += pattern.slice(i, closeBrace + 1);\n const lazy = lazyAfter(pattern, closeBrace);\n if (lazy === undefined) return undefined;\n output += lazy.text;\n i = lazy.at;\n quantifiable = false;\n break;\n }\n case ']':\n case '}':\n return undefined;\n default:\n if (isSurrogate(c)) return undefined;\n output += literal(c);\n quantifiable = true;\n break;\n }\n }\n return groups.length === 0 ? { text: output, unicode } : undefined;\n}\n\n/** What an open group is: one that captures, or a lookaround. */\ntype Group = 'capture' | 'lookahead' | 'lookbehind';\n\nfunction isSurrogate(c: string): boolean {\n const code = c.charCodeAt(0);\n return code >= 0xD800 && code <= 0xDFFF;\n}\n\n/** A character outside a class as ECMAScript's `u` mode takes it literally. */\nfunction literal(c: string): string {\n return '^$\\\\.*+?()[]{}|/'.includes(c) ? `\\\\${c}` : c;\n}\n\n/** A lazy `?` after a quantifier is copied; a possessive `+` is refused. */\nfunction lazyAfter(pattern: string, at: number): { text: string; at: number } | undefined {\n const next = pattern.charAt(at + 1);\n if (next === '+') return undefined;\n if (next === '?') return { text: '?', at: at + 1 };\n return { text: '', at };\n}\n\n/** `n`, `n,` or `n,m` with n \u2264 m: the inside of a quantifier both engines read alike. */\nfunction bounds(inside: string): boolean {\n const parts = inside.split(',');\n const low = count(parts[0] as string); // oxlint-disable-line typescript/no-unsafe-type-assertion -- split gives at least one part\n if (parts.length > 2 || low === undefined) return false;\n if (parts.length === 1 || (parts[1] as string).length === 0) return true; // oxlint-disable-line typescript/no-unsafe-type-assertion -- two parts\n const high = count(parts[1] as string); // oxlint-disable-line typescript/no-unsafe-type-assertion -- two parts\n return high !== undefined && low <= high;\n}\n\nfunction count(digits: string): number | undefined {\n return digits.length > 0 && digits.length <= 5 && /^[0-9]+$/.test(digits) ? Number(digits) : undefined;\n}\n\n/** A character class from `open`, translated: its text, whether it uses a Unicode class, and the index of its closing `]`; `undefined` when it is refused. */\nfunction characterClass(pattern: string, open: number): { text: string; unicode: boolean; end: number } | undefined {\n let i = open + 1;\n const negated = pattern.charAt(i) === '^';\n if (negated) i++;\n let items = '';\n let itemCount = 0;\n let unicode = false;\n let previous: string | undefined; // the last single literal character, which may start a range\n for (;;) {\n if (i >= pattern.length) return undefined;\n const c = pattern.charAt(i);\n if (c === ']') {\n if (itemCount === 0) return undefined;\n break;\n }\n if (c === '[' || isSurrogate(c)) return undefined;\n if (c === '\\\\') {\n if (i + 1 >= pattern.length) return undefined;\n const escaped = pattern.charAt(i + 1);\n i += 2;\n if (escaped === 'd') {\n items += digit;\n unicode = true;\n previous = undefined;\n } else if (escaped === 'w') {\n items += word;\n unicode = true;\n previous = undefined;\n } else if (escaped === 's') {\n items += space;\n unicode = true;\n previous = undefined;\n } else {\n if (!metacharacters.includes(escaped)) return undefined;\n items += `\\\\${escaped}`;\n previous = escaped;\n }\n itemCount++;\n continue;\n }\n if (c === '-') {\n const last = pattern.charAt(i + 1) === ']';\n if (itemCount === 0 || last) {\n items += '\\\\-';\n previous = '-';\n itemCount++;\n i++;\n continue;\n }\n // A range: a single literal character on each side, in order.\n if (previous === undefined || i + 1 >= pattern.length) return undefined;\n const high = pattern.charAt(i + 1);\n if (high === '\\\\' || high === '[' || high === ']' || high === '-' || isSurrogate(high) || high < previous) return undefined;\n items += `-${classLiteral(high)}`;\n previous = undefined;\n i += 2;\n itemCount++;\n continue;\n }\n items += classLiteral(c);\n previous = c;\n itemCount++;\n i++;\n }\n return { text: `[${negated ? '^' : ''}${items}]`, unicode, end: i };\n}\n\nfunction classLiteral(c: string): string {\n return c === '^' || c === '\\\\' || c === ']' || c === '[' || c === '-' ? `\\\\${c}` : c;\n}\n", "// XLOOKUP and XMATCH and their search (C#'s Functions.cs); INDEX, CHOOSE, ROW, COLUMN, ROWS, COLUMNS, OFFSET and\n// INDIRECT (Functions.Lookup.cs); VLOOKUP, HLOOKUP and MATCH (Functions.LegacyLookup.cs); Excel's wildcards.\nimport { CellAddress, columnCount, rowCount } from '../../cell-address';\nimport { isAscii, isAsciiLetterOrDigit, upperInvariant } from '../../dotnet';\nimport { elementAt } from '../../must';\nimport { Value } from '../../value';\nimport { compareValues, type Evaluator } from '../evaluator';\nimport type { FunctionCall } from '../function-definition';\nimport { matchReference, readReference, readStructuredReference } from '../lexer';\nimport { Operand } from '../operand';\nimport { firstMatch } from '../portable-regex';\nimport { Area, Reference } from '../reference';\nimport { ValueArray } from '../value-array';\nimport { arrayOrValue, isArray, numberArgument, scalarArgument, truthOf, unlifted } from './shared';\n\n/** What a search answered: the position found, or none; or the Operand an argument failed as. */\ninterface SearchOutcome {\n readonly found?: number | undefined;\n readonly failure?: Operand | undefined;\n}\n\n/** A Value not blank, with its position along a vector. */\ninterface Candidate {\n readonly index: number;\n readonly value: Value;\n}\n\n/** A range of one row or one column, as XLOOKUP reads it: a rectangle of cells, an array or a Linked Table's column. */\nexport class Vector {\n readonly source: Operand;\n readonly vertical: boolean;\n readonly length: number;\n\n constructor(source: Operand, vertical: boolean, length: number) {\n this.source = source;\n this.vertical = vertical;\n this.length = length;\n }\n\n static of(range: Operand): Vector | undefined {\n if (range.kind === 'column') return new Vector(range, true, range.columnOf().length);\n if (range.kind === 'array') {\n const array = range.arrayOf();\n if (array.columns === 1) return new Vector(range, true, array.rows);\n if (array.rows === 1) return new Vector(range, false, array.columns);\n return undefined;\n }\n const area = range.area;\n if (area.columns === 1) return new Vector(range, true, area.rows);\n if (area.rows === 1) return new Vector(range, false, area.columns);\n return undefined;\n }\n\n /** The Values that are not blank, with their positions along the vector, in order. */\n candidates(): Candidate[] {\n const found: Candidate[] = [];\n if (this.source.kind === 'column') {\n const column = this.source.columnOf();\n column.forEach((value, index) => {\n if (value !== undefined) found.push({ index, value });\n });\n return found;\n }\n if (this.source.kind === 'array') {\n const array = this.source.arrayOf();\n for (let i = 0; i < this.length; i++) {\n const value = this.vertical ? array.at(i, 0) : array.at(0, i);\n if (value !== undefined) found.push({ index: i, value });\n }\n return found;\n }\n const area = this.source.area;\n const cells = this.source.cellsOf();\n for (const address of cells.nonBlankIn(area)) {\n const value = cells.read(address);\n if (value === undefined) throw new Error(`Internal: ${address.toString()} was listed as not blank.`);\n found.push({ index: this.vertical ? address.row - area.row1 : address.column - area.column1, value });\n }\n return found;\n }\n\n /** The first blank position in search order, from the end when `fromEnd`; `undefined` when none is blank. */\n firstBlank(fromEnd: boolean): number | undefined {\n const filled = new Set(this.candidates().map(c => c.index));\n if (filled.size === this.length) return undefined;\n for (let k = 0; k < this.length; k++) {\n const index = fromEnd ? this.length - 1 - k : k;\n if (!filled.has(index)) return index;\n }\n return undefined;\n }\n\n /** The item at a position: a cell, read as a Reference, or a Linked Table's or an array's Value. */\n itemAt(index: number): Operand {\n if (this.source.kind === 'column') return Operand.ofScalar(this.source.columnOf()[index]);\n if (this.source.kind === 'array') {\n const array = this.source.arrayOf();\n return Operand.ofScalar(this.vertical ? array.at(index, 0) : array.at(0, index));\n }\n const area = this.source.area;\n const row = this.vertical ? area.row1 + index : area.row1;\n const column = this.vertical ? area.column1 : area.column1 + index;\n return this.source.sameSheet(new Area(row, column, row, column));\n }\n}\n\n/** Rows `r1`..`r2` and columns `c1`..`c2` of an array, from 0. */\nexport function slice(array: ValueArray, r1: number, r2: number, c1: number, c2: number): ValueArray {\n const result = new ValueArray(r2 - r1 + 1, c2 - c1 + 1);\n for (let r = r1; r <= r2; r++) {\n for (let c = c1; c <= c2; c++) result.set(r - r1, c - c1, array.at(r, c));\n }\n return result;\n}\n\nexport function xLookup(call: FunctionCall): Operand {\n // The lookup value's own refusal and Error Value come first, before the arrays are looked at.\n const lookupOperand = call.operand(0);\n if (isArray(lookupOperand)) return unlifted(call);\n const lookup = call.evaluator.scalarOf(lookupOperand);\n if (lookup?.isError === true) return Operand.of(lookup);\n\n const lookupArray = arrayOrValue(call.operand(1));\n // A return array that holds a kept blank (ADR-0125) is answered where the blank is not what is returned.\n const returnArray = arrayOrValue(call.keepingBlanks(2));\n if (returnArray.keptBlank && returnArray.kind !== 'array') return call.evaluator.refuse();\n if (!lookupArray.isRange) return lookupArray.isError ? lookupArray : Operand.ofError('#VALUE!');\n if (!returnArray.isRange) return returnArray.isError ? returnArray : Operand.ofError('#VALUE!');\n // A range of one row or one column; a Linked Table's column runs down.\n const vector = Vector.of(lookupArray);\n if (vector === undefined) return Operand.ofError('#VALUE!');\n // The return array lies along the lookup array. Several cells across it return the whole row (or column) found, which spills (ADR-0125).\n let along: number;\n let across: number;\n if (returnArray.kind === 'area') [along, across] = vector.vertical ? [returnArray.area.rows, returnArray.area.columns] : [returnArray.area.columns, returnArray.area.rows];\n else if (returnArray.kind === 'array') {\n const array = returnArray.arrayOf();\n [along, across] = vector.vertical ? [array.rows, array.columns] : [array.columns, array.rows];\n } else {\n const length = returnArray.columnOf().length;\n [along, across] = vector.vertical ? [length, 1] : [1, length];\n }\n if (along !== vector.length) return Operand.ofError('#VALUE!');\n const outcome = search(call, vector, 4);\n if (outcome.failure !== undefined) return outcome.failure;\n const index = outcome.found;\n if (index === undefined) return call.has(3) ? call.operand(3) : Operand.ofError('#N/A');\n if (across === 1) {\n const returnVector = Vector.of(returnArray);\n if (returnVector === undefined) throw new Error('Internal: a return array one across is a vector.');\n const item = returnVector.itemAt(index);\n return returnArray.keptBlank && item.kind === 'scalar' && item.scalar === undefined ? call.evaluator.refuse() : item;\n }\n if (returnArray.kind === 'area') {\n const area = returnArray.area;\n return returnArray.sameSheet(vector.vertical\n ? new Area(area.row1 + index, area.column1, area.row1 + index, area.column2)\n : new Area(area.row1, area.column1 + index, area.row2, area.column1 + index));\n }\n const array = returnArray.arrayOf();\n const sliced = vector.vertical ? slice(array, index, index, 0, array.columns - 1) : slice(array, 0, array.rows - 1, index, index);\n return returnArray.keptBlank && sliced.all().includes(undefined) ? call.evaluator.refuse() : Operand.ofArray(sliced);\n}\n\n/**\n * XLOOKUP's and XMATCH's search of `vector` for argument 0, with `match_mode` and `search_mode` at `modesAt` and\n * the one after. A mode outside Excel's list is Excel's own `#VALUE!` (XLOOKUP-058). So is the regular\n * expression mode under a binary search (XLOOKUP-104). Refused: a binary search over data that is not sorted as\n * the mode says (`binarySearch`), and a regular expression `portable-regex` does not take, or a text it would\n * read otherwise than PCRE2.\n */\nfunction search(call: FunctionCall, vector: Vector, modesAt: number): SearchOutcome {\n const evaluator = call.evaluator;\n const lookupOperand = call.operand(0);\n if (isArray(lookupOperand)) return { failure: unlifted(call) };\n const lookup = evaluator.scalarOf(lookupOperand);\n if (lookup?.isError === true) return { failure: Operand.of(lookup) };\n\n let matchMode = 0;\n if (call.has(modesAt)) {\n const mode = numberArgument(call, modesAt);\n if (mode instanceof Operand) return { failure: mode };\n matchMode = Math.trunc(mode);\n if (matchMode !== 0 && matchMode !== -1 && matchMode !== 1 && matchMode !== 2 && matchMode !== 3) return { failure: Operand.ofError('#VALUE!') };\n }\n let searchMode = 1;\n if (call.has(modesAt + 1)) {\n const mode = numberArgument(call, modesAt + 1);\n if (mode instanceof Operand) return { failure: mode };\n searchMode = Math.trunc(mode);\n if (searchMode !== 1 && searchMode !== -1 && searchMode !== 2 && searchMode !== -2) return { failure: Operand.ofError('#VALUE!') };\n }\n\n if (searchMode === 2 || searchMode === -2) {\n if (matchMode === 3) return { failure: Operand.ofError('#VALUE!') };\n const binary = binarySearch(vector, lookup, matchMode, searchMode === 2);\n return binary === undefined ? { failure: evaluator.refuse() } : { found: binary.found };\n }\n if (lookup !== undefined) {\n let candidates = vector.candidates();\n if (searchMode === -1) candidates = candidates.toReversed();\n if (matchMode === 3) {\n // Numbers and booleans are matched by their text; Error Values match nothing.\n const texts = candidates.filter(c => !c.value.isError).map(c => ({ index: c.index, text: evaluator.toText(c.value) }));\n const matched = firstMatch(evaluator.toText(lookup), texts);\n return matched === undefined ? { failure: evaluator.refuse() } : { found: matched.found };\n }\n switch (matchMode) {\n case 0: return { found: firstExact(candidates, lookup) };\n case 2: return { found: firstWildcard(candidates, lookup) };\n default: return { found: nearest(candidates, lookup, matchMode) };\n }\n }\n // A blank lookup value matches a blank cell, as Excel was observed to (XLOOKUP-067).\n if (matchMode === 0) return { found: vector.firstBlank(searchMode === -1) };\n return {};\n}\n\n/**\n * XLOOKUP's binary search (`search_mode` 2 and \u22122), admitted only over a lookup array that is sorted as the mode\n * says (ADR-0047). `undefined` is a refusal: the array is not sorted as the mode says; it holds blanks, Error\n * Values, or values of more than one kind; the lookup value is blank or of another kind; text holds anything but\n * ASCII letters, digits and spaces; or the match mode is the wildcard one. Of a run of equal keys, the one Excel\n * was observed to return (Part A item 9): an equal key is the first ascending and the last descending; a nearest\n * one is the end of its run nearer the lookup value.\n */\nfunction binarySearch(vector: Vector, lookup: Value | undefined, matchMode: number, ascending: boolean): { found: number | undefined } | undefined {\n if (matchMode === 2 || matchMode === 3 || lookup === undefined || lookup.isError || !orderable(lookup)) return undefined;\n const candidates = vector.candidates();\n if (candidates.length !== vector.length) return undefined;\n for (const { value } of candidates) {\n if (value.kind !== lookup.kind || !orderable(value)) return undefined;\n }\n for (let i = 1; i < candidates.length; i++) {\n const order = compareValues(elementAt(candidates, i - 1).value, elementAt(candidates, i).value);\n if (ascending ? order > 0 : order < 0) return undefined;\n }\n\n // The value that matches: the wanted one, or failing that the nearest smaller (\u22121) or larger (1).\n let match: Value | undefined;\n for (const { value } of candidates) {\n const order = compareValues(value, lookup);\n if (order === 0) {\n match = value;\n break;\n }\n if (matchMode === -1 && order < 0 && (match === undefined || compareValues(value, match) > 0)) match = value;\n if (matchMode === 1 && order > 0 && (match === undefined || compareValues(value, match) < 0)) match = value;\n }\n if (match === undefined || (matchMode === 0 && compareValues(match, lookup) !== 0)) return { found: undefined };\n const first = compareValues(match, lookup) === 0 ? ascending : matchMode === 1 ? ascending : !ascending;\n let found: number | undefined;\n for (const { index, value } of candidates) {\n if (compareValues(value, match) !== 0) continue;\n found = index;\n if (first) break;\n }\n return { found };\n}\n\nfunction orderable(value: Value): boolean {\n if (value.kind === 'number' || value.kind === 'boolean') return true;\n return value.kind === 'text' && onlyAsciiLettersDigitsSpaces(value.text);\n}\n\nfunction onlyAsciiLettersDigitsSpaces(text: string): boolean {\n for (let i = 0; i < text.length; i++) {\n const c = text.charCodeAt(i);\n if (!isAsciiLetterOrDigit(c) && c !== 0x20) return false;\n }\n return true;\n}\n\nfunction sameKindEqual(candidate: Value, wanted: Value): boolean {\n return candidate.kind === wanted.kind && candidate.kind !== 'error' && compareValues(candidate, wanted) === 0;\n}\n\nfunction firstExact(candidates: readonly Candidate[], wanted: Value): number | undefined {\n for (const { index, value } of candidates) {\n if (sameKindEqual(value, wanted)) return index;\n }\n return undefined;\n}\n\nfunction firstWildcard(candidates: readonly Candidate[], wanted: Value): number | undefined {\n if (wanted.kind !== 'text') return firstExact(candidates, wanted);\n for (const { index, value } of candidates) {\n if (value.kind === 'text' && wildcardMatches(wanted.text, value.text)) return index;\n }\n return undefined;\n}\n\n/**\n * An exact match first; otherwise the nearest smaller (mode \u22121) or larger (mode 1) value, the first such in\n * search order. Values of another kind take part in Excel's order across kinds \u2014 numbers before text, text\n * before booleans (XLOOKUP-071). Error Values take no part.\n */\nfunction nearest(candidates: readonly Candidate[], wanted: Value, mode: number): number | undefined {\n let best: number | undefined;\n let bestValue: Value | undefined;\n for (const { index, value } of candidates) {\n if (value.kind === 'error') continue;\n const order = compareValues(value, wanted);\n if (order === 0) return index;\n if (mode === -1 ? order > 0 : order < 0) continue;\n if (bestValue === undefined || (mode === -1 ? compareValues(value, bestValue) > 0 : compareValues(value, bestValue) < 0)) {\n best = index;\n bestValue = value;\n }\n }\n return best;\n}\n\n/** Excel's wildcards: `*` any run, `?` one character, `~` escapes the next; without regard to case. */\nexport function wildcardMatches(pattern: string, text: string): boolean {\n return wildcardAt(pattern, 0, text, 0);\n}\n\nfunction wildcardAt(pattern: string, from: number, text: string, at: number): boolean {\n let p = from;\n let t = at;\n while (p < pattern.length) {\n let c = pattern.charCodeAt(p);\n if (c === 0x2A) { // *\n while (p < pattern.length && pattern.charCodeAt(p) === 0x2A) p++;\n if (p === pattern.length) return true;\n for (let start = t; start <= text.length; start++) {\n if (wildcardAt(pattern, p, text, start)) return true;\n }\n return false;\n }\n if (t >= text.length) return false;\n if (c === 0x3F) { // ?\n p++;\n t++;\n continue;\n }\n const next = pattern.charCodeAt(p + 1);\n if (c === 0x7E && p + 1 < pattern.length && (next === 0x2A || next === 0x3F || next === 0x7E)) {\n c = next;\n p++;\n }\n if (upperInvariant(c) !== upperInvariant(text.charCodeAt(t))) return false;\n p++;\n t++;\n }\n return t === text.length;\n}\n\n// ---- INDEX, XMATCH, CHOOSE, ROW, COLUMN, ROWS, COLUMNS, OFFSET, INDIRECT -----------------------------------\n\n/**\n * INDEX: the cell at `row_num` and `column_num` of the range, both counted from 1 and truncated. Over a range of\n * one row given `row_num` alone, that number runs along the row. Below 0 is `#VALUE!`, and past the range's edge\n * is `#REF!`. A row or a column of 0 names the whole column or row, which spills (ADR-0125). Over a Reference of\n * several rows and several columns, `column_num` cannot be left out (INDEX-012). A kept blank stays marked in\n * what `INDEX` picks of it (SORT-022, UNIQUE-018).\n */\nexport function indexFunction(call: FunctionCall): Operand {\n const source = call.keepingBlanks(0);\n const picked = pick(call, source);\n return source.keptBlank ? picked.withKeptBlank() : picked;\n}\n\nfunction pick(call: FunctionCall, source: Operand): Operand {\n if (source.isError) return source;\n let rows = 1;\n let columns = 1;\n if (source.kind === 'area') [rows, columns] = [source.area.rows, source.area.columns];\n else if (source.kind === 'column') rows = source.columnOf().length;\n else if (source.kind === 'array') [rows, columns] = [source.arrayOf().rows, source.arrayOf().columns];\n\n let row = 0;\n if (call.has(1)) {\n const given = numberArgument(call, 1);\n if (given instanceof Operand) return given;\n row = given;\n }\n let column = 0;\n if (call.count < 3) {\n if (rows === 1 && columns > 1) [row, column] = [1, row];\n } else if (call.has(2)) {\n const given = numberArgument(call, 2);\n if (given instanceof Operand) return given;\n column = given;\n }\n row = Math.trunc(row);\n column = Math.trunc(column);\n if (row < 0 || column < 0) return Operand.ofError('#VALUE!');\n if (call.count < 3 && source.isReference && rows > 1 && columns > 1) return Operand.ofError('#REF!');\n if (row > rows || column > columns) return Operand.ofError('#REF!');\n if ((row === 0 && rows > 1) || (column === 0 && columns > 1)) {\n // The whole row, column or range: rows r1..r2 and columns c1..c2, from 0.\n const [r1, r2] = row === 0 ? [0, rows - 1] : [row - 1, row - 1];\n const [c1, c2] = column === 0 ? [0, columns - 1] : [column - 1, column - 1];\n switch (source.kind) {\n case 'area': {\n const area = source.area;\n return source.sameSheet(new Area(area.row1 + r1, area.column1 + c1, area.row1 + r2, area.column1 + c2));\n }\n case 'column': return Operand.ofArray(slice(call.evaluator.toArray(source), r1, r2, c1, c2));\n case 'array': return Operand.ofArray(slice(source.arrayOf(), r1, r2, c1, c2));\n case 'scalar':\n case 'missing':\n case 'threeD':\n break;\n default: throw new Error(`Internal: ${String(source.kind)} is no kind of operand.`);\n }\n }\n const r = Math.max(row, 1) - 1;\n const c = Math.max(column, 1) - 1;\n switch (source.kind) {\n case 'area': return source.sameSheet(new Area(source.area.row1 + r, source.area.column1 + c, source.area.row1 + r, source.area.column1 + c));\n case 'column': return Operand.ofScalar(source.columnOf()[r]);\n case 'array': return Operand.ofScalar(source.arrayOf().at(r, c));\n case 'scalar':\n case 'missing':\n case 'threeD':\n return source;\n default: throw new Error(`Internal: ${String(source.kind)} is no kind of operand.`);\n }\n}\n\n/** XMATCH: the position, from 1, at which XLOOKUP's search finds the lookup value; `#N/A` when nothing matches. */\nexport function xMatch(call: FunctionCall): Operand {\n const lookupOperand = call.operand(0);\n if (isArray(lookupOperand)) return unlifted(call);\n const lookup = call.evaluator.scalarOf(lookupOperand);\n if (lookup?.isError === true) return Operand.of(lookup);\n const lookupArray = arrayOrValue(call.operand(1));\n if (!lookupArray.isRange) return lookupArray.isError ? lookupArray : Operand.ofError('#VALUE!');\n const vector = Vector.of(lookupArray);\n if (vector === undefined) return Operand.ofError('#VALUE!');\n const outcome = search(call, vector, 2);\n if (outcome.failure !== undefined) return outcome.failure;\n return outcome.found === undefined ? Operand.ofError('#N/A') : Operand.of(Value.fromNumber(outcome.found + 1));\n}\n\n/** CHOOSE: the value at `index_num`, from 1, truncated; below 1 or past the values, `#VALUE!`. Only the chosen value is evaluated, and a Reference stays a Reference. */\nexport function choose(call: FunctionCall): Operand {\n const given = numberArgument(call, 0);\n if (given instanceof Operand) return given;\n const at = Math.trunc(given);\n if (at < 1 || at > call.count - 1) return Operand.ofError('#VALUE!');\n return call.has(at) ? call.operand(at) : Operand.blank;\n}\n\nexport function rowFunction(call: FunctionCall): Operand {\n return place(call, true);\n}\n\nexport function columnFunction(call: FunctionCall): Operand {\n return place(call, false);\n}\n\n/**\n * ROW and COLUMN: the number, from 1, of the Reference's row or column, or of the Formula's own cell when it is\n * left out. A Reference of several rows to ROW gives each row's number, down a column, and of several columns to\n * COLUMN each column's, along a row; it spills (ADR-0125). A Linked Table's column has no place: `#VALUE!`.\n */\nfunction place(call: FunctionCall, ofRow: boolean): Operand {\n if (!call.has(0)) {\n const self = call.evaluator.self;\n if (self === undefined) return Operand.ofError('#VALUE!');\n return Operand.of(Value.fromNumber((ofRow ? self.row : self.column) + 1));\n }\n const reference = call.operand(0);\n if (reference.kind !== 'area') return reference.isError ? reference : Operand.ofError('#VALUE!');\n const area = reference.area;\n const count = ofRow ? area.rows : area.columns;\n const places = ofRow ? new ValueArray(count, 1) : new ValueArray(1, count);\n for (let k = 0; k < count; k++) {\n const number = Value.fromNumber((ofRow ? area.row1 : area.column1) + k + 1);\n if (ofRow) places.set(k, 0, number);\n else places.set(0, k, number);\n }\n return Operand.ofArray(places);\n}\n\nexport function rowsFunction(call: FunctionCall): Operand {\n return extent(call, true);\n}\n\nexport function columnsFunction(call: FunctionCall): Operand {\n return extent(call, false);\n}\n\n/** ROWS and COLUMNS: how many rows or columns the range spans, read for its extent alone (UNIQUE-011). */\nfunction extent(call: FunctionCall, ofRows: boolean): Operand {\n const operand = call.measured(0);\n if (operand.isError) return operand;\n let count = 1;\n if (operand.kind === 'area') count = ofRows ? operand.area.rows : operand.area.columns;\n else if (operand.kind === 'column') count = ofRows ? operand.columnOf().length : 1;\n else if (operand.kind === 'array') count = ofRows ? operand.arrayOf().rows : operand.arrayOf().columns;\n return Operand.of(Value.fromNumber(count));\n}\n\n/**\n * OFFSET (ADR-0124, a volatile function): the Reference `rows` below and `cols` right of `reference`, `height`\n * rows by `width` columns, each truncated and the size the reference's own when left out. A size below 1, or a\n * Reference past the Sheet's edge, is `#REF!`; a Linked Table's column has no place to move from: `#VALUE!`.\n */\nexport function offset(call: FunctionCall): Operand {\n const reference = call.operand(0);\n if (reference.kind !== 'area') return reference.isError ? reference : Operand.ofError('#VALUE!');\n const area = reference.area;\n const rowsGiven = numberArgument(call, 1);\n if (rowsGiven instanceof Operand) return rowsGiven;\n const columnsGiven = numberArgument(call, 2);\n if (columnsGiven instanceof Operand) return columnsGiven;\n let height = area.rows;\n let width = area.columns;\n if (call.has(3)) {\n const given = numberArgument(call, 3);\n if (given instanceof Operand) return given;\n height = given;\n }\n if (call.has(4)) {\n const given = numberArgument(call, 4);\n if (given instanceof Operand) return given;\n width = given;\n }\n height = Math.trunc(height);\n width = Math.trunc(width);\n if (height < 1 || width < 1) return Operand.ofError('#REF!');\n const top = area.row1 + Math.trunc(rowsGiven);\n const left = area.column1 + Math.trunc(columnsGiven);\n const bottom = top + height - 1;\n const right = left + width - 1;\n if (top < 0 || left < 0 || bottom >= rowCount || right >= columnCount) return Operand.ofError('#REF!');\n return reference.sameSheet(new Area(top, left, bottom, right));\n}\n\n/**\n * INDIRECT (ADR-0124's note of 2026-10-10, a volatile function): the Reference its text names, in A1 style or\n * R1C1 style (`a1` FALSE, 0, a blank or left empty), with a Linked Table's text and a Spill Range's read as the\n * typed ones are. Text that names no place is `#REF!`; the structured forms a Formula does not take and a\n * declared Linked Table's bare name are refused (INDIRECT-003 to INDIRECT-105, as the C# engine's remarks list\n * them).\n */\nexport function indirect(call: FunctionCall): Operand {\n const value = scalarArgument(call, 0);\n if (value instanceof Operand) return value;\n // a1: TRUE, or left out, is A1 style; FALSE, 0, a blank or an empty argument is R1C1's.\n let isA1 = true;\n if (call.count > 1) {\n if (!call.has(1)) isA1 = false;\n else {\n const style = scalarArgument(call, 1);\n if (style instanceof Operand) return style;\n if (style === undefined) isA1 = false;\n else {\n const truth = truthOf(style);\n if (truth === undefined) return Operand.ofError('#VALUE!');\n isA1 = truth;\n }\n }\n }\n const text = call.evaluator.toText(value);\n return isA1 ? indirectA1(call, text) : indirectRowColumn(call, text);\n}\n\n/** INDIRECT's A1-style text: a Reference as a Formula writes one, `A1#`, or a Linked Table's text; a `#` after a range, a row or a column, or inside a join, `#REF!`. */\nfunction indirectA1(call: FunctionCall, text: string): Operand {\n const cells = call.evaluator.cells;\n const table = indirectTableText(call, text);\n if (table !== undefined) return table;\n // A # inside a join, after its first part (A1#:A2, A1#:A2#, 1#:2), names no place (INDIRECT-098).\n if (hashInsideJoin(text) !== undefined) return Operand.ofError('#REF!');\n // A column past XFD, or a row past 1048576, names no place (INDIRECT-017).\n const read = readReference(text, 0);\n if (read === undefined) return Operand.ofError('#REF!');\n const { reference, length } = read;\n // A Sheet's name the Workbook does not have names no place (INDIRECT-008); a name it has reads that Sheet (ADR-0331).\n const target = cells.resolve(reference.sheetName);\n if (target === undefined) return Operand.ofError('#REF!');\n if (length === text.length - 1 && text.charAt(length) === '#') {\n // A1#: the Spill Range of the Formula in A1, read as the typed one is (INDIRECT-026, 042; ADR-0125).\n if (reference.shape === 'cell') return target.spill(new CellAddress(reference.row1, reference.column1));\n // A # after a range, a whole row or a whole column names no place (INDIRECT-092, 096).\n return Operand.ofError('#REF!');\n }\n // Text that goes on past the Reference is no Reference (INDIRECT-021, generalised).\n if (length !== text.length) return Operand.ofError('#REF!');\n return Operand.ofArea(reference.area, target);\n}\n\n/**\n * The join A1 text with a `#` inside it would be with that `#` taken out \u2014 a range, whole rows or whole columns,\n * followed by nothing or by one more `#` \u2014 where the `#` stands right after the join's first part; otherwise\n * `undefined`.\n */\nfunction hashInsideJoin(text: string): Reference | undefined {\n for (let hash = text.indexOf('#:'); hash >= 0; hash = text.indexOf('#:', hash + 1)) {\n const join = text.slice(0, hash) + text.slice(hash + 1);\n const match = matchReference(join, 0);\n if (match === undefined) continue;\n // The : the # stood before is the join's, not one inside a quoted Sheet name.\n const qualifier = match.groups['sheet'];\n if (qualifier !== undefined && hash < qualifier.index + qualifier.value.length) continue;\n if (match.length !== join.length && (match.length !== join.length - 1 || join.charAt(join.length - 1) !== '#')) continue;\n const read = readReference(join, 0);\n if (read !== undefined && read.reference.shape !== 'cell') return read.reference;\n }\n return undefined;\n}\n\nconst structuredText = /^[A-Za-z_\\\\][A-Za-z0-9_.]*\\[/;\n\n/**\n * A Linked Table's text, read alike whatever `a1` says (INDIRECT-025, INDIRECT-061), or `undefined` for text that\n * is none: `Table[Column]` read as the typed one is (ADR-0049); any other text a structured reference begins as,\n * refused; and a declared table's bare name, refused by decision (ADR-0049's rule 2; 2026-10-12).\n */\nfunction indirectTableText(call: FunctionCall, text: string): Operand | undefined {\n const cells = call.evaluator.cells;\n const structured = readStructuredReference(text, 0);\n if (structured !== undefined && structured.length === text.length) {\n const tableColumn = cells.tableColumn(structured.table, structured.column);\n return tableColumn.isError && tableColumn.scalar?.error === '#NAME?' ? Operand.ofError('#REF!') : tableColumn;\n }\n if (structuredText.test(text)) return call.evaluator.refuse();\n if (cells.isLinkedTable(text)) return call.evaluator.refuse();\n return undefined;\n}\n\nconst axis = String.raw`(?:[0-9]+|\\[[+-]?[0-9]+\\])`;\nconst partPattern = String.raw`[Rr]${axis}?(?:[Cc]${axis}?)?|[Cc]${axis}?`;\n\n/**\n * R1C1 notation, one part, two or three separated by `:`, after an optional Sheet qualifier. A `#` before the\n * first `:` is matched, as `inside`, so that it can be refused.\n */\nconst rowColumnText = new RegExp(\n String.raw`^(?:(?<sheet>'(?:[^']|'')+'|[A-Za-z_][A-Za-z0-9_.]*)!)?(?<first>${partPattern})(?:(?<inside>#)?:(?<second>${partPattern})(?::(?<third>${partPattern}))?)?$`);\n\n/** One R1C1 part: an R with a row or none, a C with a column or none, or both. */\nconst rowColumnPartText = new RegExp(String.raw`^(?:(?<r>[Rr])(?<row>${axis})?)?(?:(?<c>[Cc])(?<column>${axis})?)?$`);\n\n/**\n * INDIRECT's R1C1-style text (ADR-0124's notes of 2026-10-12, 2026-10-14 and 2026-10-18): R and C each with a\n * number counted from 1, an offset in brackets from the Formula's own cell, which wraps round past the Sheet's\n * edge, or no number; parts joined by `:` left to right (`RowColumnSpan.join`); one cell followed by `#`, its\n * Spill Range; anything else that is not R1C1 notation `#REF!`.\n */\nfunction indirectRowColumn(call: FunctionCall, text: string): Operand {\n const spilled = text.endsWith('#');\n const match = rowColumnText.exec(spilled ? text.slice(0, -1) : text);\n if (match === null) return indirectTableText(call, text) ?? Operand.ofError('#REF!');\n const groups = match.groups;\n if (groups === undefined) throw new Error('Internal: a pattern with named groups matched without them.');\n const raw = groups['sheet'];\n const sheet = raw === undefined ? undefined : raw.startsWith(\"'\") ? raw.slice(1, -1).replaceAll(\"''\", \"'\") : raw;\n // A Sheet's name the Workbook does not have names no place (INDIRECT-093; ADR-0331).\n const target = call.evaluator.cells.resolve(sheet);\n if (target === undefined) return Operand.ofError('#REF!');\n const inside = groups['inside'] !== undefined;\n const parts = [readPart(defined(groups['first']))];\n if (groups['second'] !== undefined) parts.push(readPart(groups['second']));\n if (groups['third'] !== undefined) parts.push(readPart(groups['third']));\n // A # after one cell is its Spill Range (INDIRECT-060); after a range, a row or a column, or inside a join, #REF!.\n if (inside || (spilled && (parts.length > 1 || !isCell(elementAt(parts, 0))))) return Operand.ofError('#REF!');\n // An offset counts from the Formula's own cell; a Formula evaluated in no cell has none, as ROW() has none.\n let own = new CellAddress(0, 0);\n if (parts.some(isRelative)) {\n const self = call.evaluator.self;\n if (self === undefined) return Operand.ofError('#VALUE!');\n own = self;\n }\n const spans: RowColumnSpan[] = [];\n for (const each of parts) {\n const span = placeSpan(each, own);\n if (span === undefined) return Operand.ofError('#REF!');\n spans.push(span);\n }\n let joined = elementAt(spans, 0);\n for (let i = 1; i < spans.length; i++) {\n const next = joinSpans(joined, elementAt(spans, i));\n if (next === undefined) return Operand.ofError('#REF!');\n joined = next;\n }\n if (spilled) return target.spill(new CellAddress(joined.rows?.low ?? 0, joined.columns?.low ?? 0)); // oxlint-disable-line ex-grid/no-stand-in-default -- a whole row or column starts at 0\n const [row1, row2] = joined.rows === undefined ? [0, rowCount - 1] : [joined.rows.low, joined.rows.high];\n const [column1, column2] = joined.columns === undefined ? [0, columnCount - 1] : [joined.columns.low, joined.columns.high];\n const reference = Reference.rectangle(sheet, row1, column1, row2, column2, true, true, true, true);\n return Operand.ofArea(reference.area, target);\n}\n\nfunction defined(text: string | undefined): string {\n if (text === undefined) throw new Error('Internal: a group the pattern requires did not match.');\n return text;\n}\n\ninterface Span {\n readonly low: number;\n readonly high: number;\n}\n\n/** A part of R1C1 text placed on the Sheet, or several joined: the rows and the columns it spans, each `undefined` where it spans the whole Sheet. */\ninterface RowColumnSpan {\n readonly rows: Span | undefined;\n readonly columns: Span | undefined;\n}\n\n/** One axis of an R1C1 part: a row or a column counted from 1, or an offset from the Formula's own. */\ninterface RowColumnAxis {\n readonly relative: boolean;\n readonly number: number;\n}\n\n/** One part of R1C1 text: its row and its column, each `undefined` where the part has no R or no C. */\ninterface RowColumnPart {\n readonly row: RowColumnAxis | undefined;\n readonly column: RowColumnAxis | undefined;\n}\n\nfunction isRelative(part: RowColumnPart): boolean {\n return part.row?.relative === true || part.column?.relative === true;\n}\n\nfunction isCell(part: RowColumnPart): boolean {\n return part.row !== undefined && part.column !== undefined;\n}\n\nfunction readPart(text: string): RowColumnPart {\n const match = rowColumnPartText.exec(text);\n const groups = match?.groups;\n if (groups === undefined) throw new Error('Internal: an R1C1 part the notation matched does not read.');\n return {\n row: groups['r'] === undefined ? undefined : readAxis(groups['row'] ?? ''), // oxlint-disable-line ex-grid/no-stand-in-default -- an R with nothing after it is the own row\n column: groups['c'] === undefined ? undefined : readAxis(groups['column'] ?? ''), // oxlint-disable-line ex-grid/no-stand-in-default -- a C with nothing after it is the own column\n };\n}\n\n/**\n * `3` and `03` are absolute (INDIRECT-059); `[-1]`, `[+1]`, `[0]` and `[-0]` are offsets (INDIRECT-063 to 065);\n * nothing written is an offset of 0 (INDIRECT-044, 066). A number too long for any Sheet is past its edge.\n */\nfunction readAxis(written: string): RowColumnAxis {\n if (written.length === 0) return { relative: true, number: 0 };\n const relative = written.startsWith('[');\n let digits = relative ? written.slice(1, -1) : written;\n const negative = digits.startsWith('-');\n if (negative || digits.startsWith('+')) digits = digits.slice(1);\n digits = digits.replace(/^0+/, '');\n const number = digits.length === 0 ? 0 : digits.length > 9 ? 1_000_000_000 : Number(digits);\n return { relative, number: negative ? -number : number };\n}\n\n/** The row or column from 0, or `undefined` where a number names no place; an offset past the edge wraps round (INDIRECT-052, 082 to 084). */\nfunction placeAxis(axisRead: RowColumnAxis, own: number, count: number): number | undefined {\n if (axisRead.relative) return Math.abs(axisRead.number) < count ? (own + axisRead.number + count) % count : undefined;\n return axisRead.number >= 1 && axisRead.number <= count ? axisRead.number - 1 : undefined;\n}\n\nfunction placeSpan(part: RowColumnPart, own: CellAddress): RowColumnSpan | undefined {\n let rowsSpan: Span | undefined;\n let columnsSpan: Span | undefined;\n if (part.row !== undefined) {\n const r = placeAxis(part.row, own.row, rowCount);\n if (r === undefined) return undefined;\n rowsSpan = { low: r, high: r };\n }\n if (part.column !== undefined) {\n const c = placeAxis(part.column, own.column, columnCount);\n if (c === undefined) return undefined;\n columnsSpan = { low: c, high: c };\n }\n return { rows: rowsSpan, columns: columnsSpan };\n}\n\n/**\n * Two spans joined by `:`: two of the same kind, the rectangle they span; cells then a whole column, the cells'\n * rows across the columns they span (INDIRECT-075, 101, 103); a whole row then cells, the rows they span down\n * the cells' columns (INDIRECT-076, 102). Any other two name no place (INDIRECT-058, 062, 077, 104).\n */\nfunction joinSpans(firstGiven: RowColumnSpan, secondGiven: RowColumnSpan): RowColumnSpan | undefined {\n let first = firstGiven;\n let second = secondGiven;\n const firstCells = first.rows !== undefined && first.columns !== undefined;\n const secondCells = second.rows !== undefined && second.columns !== undefined;\n if (firstCells && second.rows === undefined && second.columns !== undefined) second = { rows: first.rows, columns: second.columns };\n else if (secondCells && first.rows !== undefined && first.columns === undefined) first = { rows: first.rows, columns: second.columns };\n if ((first.rows === undefined) !== (second.rows === undefined) || (first.columns === undefined) !== (second.columns === undefined)) return undefined;\n return { rows: hull(first.rows, second.rows), columns: hull(first.columns, second.columns) };\n}\n\nfunction hull(a: Span | undefined, b: Span | undefined): Span | undefined {\n return a !== undefined && b !== undefined ? { low: Math.min(a.low, b.low), high: Math.max(a.high, b.high) } : undefined;\n}\n\n// ---- VLOOKUP, HLOOKUP, MATCH ---------------------------------------------------------------------------------\n\nexport function vLookup(call: FunctionCall): Operand {\n return legacyLookup(call, true);\n}\n\nexport function hLookup(call: FunctionCall): Operand {\n return legacyLookup(call, false);\n}\n\n/**\n * VLOOKUP and HLOOKUP: first exact match, or the last smaller/equal key in an ascending table. Unlike INDEX, their\n * result is a Value, and a blank target becomes numeric zero. A table that holds a kept blank (ADR-0125) is\n * answered where the blank is never read.\n */\nfunction legacyLookup(call: FunctionCall, vertical: boolean): Operand {\n const lookup = scalarArgument(call, 0);\n if (lookup instanceof Operand) return lookup;\n const table = arrayOrValue(call.keepingBlanks(1));\n if (table.keptBlank && table.kind !== 'array') return call.evaluator.refuse();\n if (!table.isRange) return table.isError ? table : Operand.ofError('#VALUE!');\n const given = numberArgument(call, 2);\n if (given instanceof Operand) return given;\n const at = Math.trunc(given);\n if (at < 1) return Operand.ofError('#VALUE!');\n let rowsOf: number;\n let columnsOf: number;\n if (table.kind === 'area') [rowsOf, columnsOf] = [table.area.rows, table.area.columns];\n else if (table.kind === 'array') [rowsOf, columnsOf] = [table.arrayOf().rows, table.arrayOf().columns];\n else [rowsOf, columnsOf] = [table.columnOf().length, 1];\n if (at > (vertical ? columnsOf : rowsOf)) return Operand.ofError('#REF!');\n let mode = 1;\n if (call.count > 3) {\n const modeGiven = numberArgument(call, 3);\n if (modeGiven instanceof Operand) return modeGiven;\n mode = modeGiven;\n }\n const keys = legacyTableLine(table, vertical, 0);\n if (table.keptBlank && keys.firstBlank(false) !== undefined) return call.evaluator.refuse();\n const outcome = legacySearch(call.evaluator, keys, lookup, mode === 0 ? 0 : 1);\n if (outcome.failure !== undefined) return outcome.failure;\n if (outcome.found === undefined) return Operand.ofError('#N/A');\n const result = legacyTableLine(table, vertical, at - 1).itemAt(outcome.found);\n if (table.keptBlank && result.kind === 'scalar' && result.scalar === undefined) return call.evaluator.refuse();\n return Operand.of(call.evaluator.scalarOf(result) ?? Value.fromNumber(0));\n}\n\n/** The indicated column or row of a table, retaining References and sparse ranges. */\nfunction legacyTableLine(table: Operand, vertical: boolean, at: number): Vector {\n if (table.kind === 'area') {\n const area = table.area;\n const line = vertical\n ? new Area(area.row1, area.column1 + at, area.row2, area.column1 + at)\n : new Area(area.row1 + at, area.column1, area.row1 + at, area.column2);\n return new Vector(table.sameSheet(line), vertical, vertical ? area.rows : area.columns);\n }\n if (table.kind === 'column') {\n return vertical ? new Vector(table, true, table.columnOf().length) : new Vector(Operand.asArray(table.columnOf()[at]), false, 1);\n }\n const array = table.arrayOf();\n const sliced = vertical ? slice(array, 0, array.rows - 1, at, at) : slice(array, at, at, 0, array.columns - 1);\n return new Vector(sliced.isSingle ? Operand.asArray(sliced.at(0, 0)) : Operand.ofArray(sliced), vertical, vertical ? array.rows : array.columns);\n}\n\n/** MATCH's position, from 1; descending approximate matches take the first equal key. */\nexport function matchFunction(call: FunctionCall): Operand {\n const lookup = scalarArgument(call, 0);\n if (lookup instanceof Operand) return lookup;\n const array = arrayOrValue(call.operand(1));\n if (!array.isRange) return array.isError ? array : Operand.ofError('#VALUE!');\n const vector = Vector.of(array);\n if (vector === undefined) return Operand.ofError('#VALUE!');\n let mode = 1;\n if (call.count > 2) {\n const given = numberArgument(call, 2);\n if (given instanceof Operand) return given;\n mode = given;\n }\n const outcome = legacySearch(call.evaluator, vector, lookup, Math.sign(mode));\n if (outcome.failure !== undefined) return outcome.failure;\n return outcome.found === undefined ? Operand.ofError('#N/A') : Operand.of(Value.fromNumber(outcome.found + 1));\n}\n\n/**\n * The searches shared by VLOOKUP, HLOOKUP and MATCH. Approximate searches retain ADR-0047's refusal of data that\n * cannot be established as sorted. They never use XLOOKUP's duplicate-key rules.\n */\nfunction legacySearch(evaluator: Evaluator, vector: Vector, lookup: Value | undefined, mode: number): SearchOutcome {\n const wanted = lookup ?? Value.fromNumber(0);\n if (wanted.kind === 'text' && wanted.text.length > 255) return { failure: evaluator.refuse() };\n const candidates = vector.candidates();\n if (mode === 0) return legacyExact(evaluator, candidates, wanted);\n if (candidates.length !== vector.length || candidates.some(c => c.value.isError)) return { failure: evaluator.refuse() };\n const kind = candidates.length === 0 ? wanted.kind : elementAt(candidates, 0).value.kind;\n if (candidates.some(c => c.value.kind !== kind || !orderable(c.value))) return { failure: evaluator.refuse() };\n for (let i = 1; i < candidates.length; i++) {\n const order = compareValues(elementAt(candidates, i - 1).value, elementAt(candidates, i).value);\n if (mode > 0 ? order > 0 : order < 0) return { failure: evaluator.refuse() };\n }\n if (wanted.kind !== kind) return {};\n if (!orderable(wanted)) return { failure: evaluator.refuse() };\n let found: number | undefined;\n for (const { index: at, value } of candidates) {\n const order = compareValues(value, wanted);\n if (mode > 0 ? order > 0 : order < 0) break;\n found = at;\n if (mode < 0 && order === 0) break;\n }\n // MATCH-018 pins the first equal key descending. No observation yet pins which duplicate wins when a\n // descending search finds the next larger key instead.\n if (mode < 0 && found !== undefined && found > 0\n && compareValues(elementAt(candidates, found).value, wanted) !== 0\n && compareValues(elementAt(candidates, found - 1).value, elementAt(candidates, found).value) === 0) {\n return { failure: evaluator.refuse() };\n }\n return { found };\n}\n\nfunction allAscii(text: string): boolean {\n for (let i = 0; i < text.length; i++) {\n if (!isAscii(text.charCodeAt(i))) return false;\n }\n return true;\n}\n\n/**\n * Exact legacy matching, including wildcards, is observed for ASCII text only. An absent key with #N/A in the\n * vector is #N/A; whether a later matching key wins over an earlier Error Value is not pinned, and is refused.\n */\nfunction legacyExact(evaluator: Evaluator, candidates: readonly Candidate[], wanted: Value): SearchOutcome {\n if (wanted.kind === 'text' && !allAscii(wanted.text)) return { failure: evaluator.refuse() };\n let errorSeen = false;\n let unobservedError = false;\n for (const { index: at, value } of candidates) {\n if (value.isError) {\n errorSeen = true;\n unobservedError ||= value.error !== '#N/A';\n continue;\n }\n if (value.kind !== wanted.kind) continue;\n if (value.kind === 'text' && !allAscii(value.text)) return { failure: evaluator.refuse() };\n const matches = wanted.kind === 'text' ? wildcardMatches(wanted.text, value.text) : sameKindEqual(value, wanted);\n if (matches) return errorSeen ? { failure: evaluator.refuse() } : { found: at };\n }\n return unobservedError ? { failure: evaluator.refuse() } : {};\n}\n", "// A draw of RAND or RANDBETWEEN (ADR-0180), in 64-bit unsigned arithmetic held in BigInts.\nimport { toUpperInvariant } from '../dotnet';\nimport type { CellAddress } from '../cell-address';\n\nconst mask = (1n << 64n) - 1n;\n\n/** SplitMix64's increment, the golden ratio's fractional part in 64 bits. */\nconst golden = 0x9E3779B97F4A7C15n;\n\n/**\n * The draw's 64 bits: a function of the Workbook's seed, the name of the Sheet and the cell whose Formula calls\n * the function, which call in that Formula it is, and the count of changes since the Workbook was opened \u2014 and\n * of nothing else. The inputs are mixed by SplitMix64's finaliser, one after another; the name is read as Excel\n * compares Sheet names, ignoring case.\n */\nexport function drawOf(seed: bigint, sheet: string, cell: CellAddress, place: number, changes: bigint): bigint {\n let h = mix(seed);\n const upper = toUpperInvariant(sheet);\n for (let i = 0; i < upper.length; i++) h = mix(h ^ BigInt(upper.charCodeAt(i)));\n h = mix(h ^ BigInt(sheet.length));\n h = mix(h ^ BigInt.asUintN(32, BigInt(cell.row)));\n h = mix(h ^ BigInt.asUintN(32, BigInt(cell.column)));\n h = mix(h ^ BigInt.asUintN(32, BigInt(place)));\n return mix(h ^ BigInt.asUintN(64, changes));\n}\n\n/** A number in [0,1), evenly spread: the draw's top 53 bits, every double of that spacing equally likely. */\nexport function unitOf(draw: bigint): number {\n return Number(draw >> 11n) * (1 / 2 ** 53);\n}\n\n/**\n * A whole number from `bottom` to `top`, both included, every one equally likely: the draw scaled to the count\n * of them, a draw that would favour some numbers over others mixed again until one does not (Lemire's method,\n * with the rejection made a function of the draw). Both bounds are at most 2^53 in magnitude.\n */\nexport function between(draw: bigint, bottom: number, top: number): number {\n const count = BigInt.asUintN(64, BigInt(top) - BigInt(bottom)) + 1n;\n let current = draw;\n let scaled = current * count;\n if ((scaled & mask) < count) {\n const threshold = ((-count) & mask) % count;\n while ((scaled & mask) < threshold) {\n current = mix(current);\n scaled = current * count;\n }\n }\n return Number(BigInt(bottom) + (scaled >> 64n));\n}\n\n/** SplitMix64: the increment, then its finaliser. */\nfunction mix(value: bigint): bigint {\n let z = (value + golden) & mask;\n z = ((z ^ (z >> 30n)) * 0xBF58476D1CE4E5B9n) & mask;\n z = ((z ^ (z >> 27n)) * 0x94D049BB133111EBn) & mask;\n return z ^ (z >> 31n);\n}\n", "// ROUNDUP, ROUNDDOWN, ABS, INT, MOD, PRODUCT, MEDIAN, LARGE, SMALL, TRUNC, POWER, SQRT, RANK.EQ, the spreads,\n// SIGN, EXP, LN, LOG10, PI (C#'s Functions.Math.cs); MROUND, CEILING.MATH and FLOOR.MATH\n// (Functions.ObservedRounding.cs); RAND and RANDBETWEEN (Functions.Random.cs).\nimport { bitDecrement, bitIncrement, lowestBitClear, roundHalfAwayFromZero, roundHalfToEven } from '../../dotnet';\nimport { Value } from '../../value';\nimport { approximatelyEqual, atFifteenDigits, power as powerOf } from '../arithmetic';\nimport { between, unitOf } from '../draws';\nimport type { FunctionCall } from '../function-definition';\nimport { Operand } from '../operand';\nimport * as portable from '../portable-math';\nimport { roundAt } from '../rounding';\nimport { collectNumbers, numberArgument, numberOrFailure, numberResult, scalarArgument, sortNumbers } from './shared';\n\n/**\n * The quotient at and above which MOD is `#NUM!`. Excel 365 answers `MOD(2^27,1)` (MOD-008); a Microsoft 365\n * user reported that `MOD(1125899999999,1)` is 0 and `MOD(1125900000000,1)` is `#NUM!`, and the area pass of\n * 2026-10-12 read Excel on both sides of it (MOD-010 to MOD-016).\n */\nconst modQuotientLimit = 1_125_900_000_000;\n\n/** ABS. */\nexport function abs(call: FunctionCall): Operand {\n const number = numberArgument(call, 0);\n return number instanceof Operand ? number : Operand.of(Value.fromNumber(Math.abs(number)));\n}\n\n/** INT rounds down, toward negative infinity: INT(-8.9) is -9. */\nexport function int(call: FunctionCall): Operand {\n const number = numberArgument(call, 0);\n return number instanceof Operand ? number : Operand.of(Value.fromNumber(Math.floor(number)));\n}\n\n/**\n * MOD: `number - divisor*INT(number/divisor)`, as Microsoft defines it, so the result takes the divisor's sign,\n * computed as the one evaluation at the hardware's widths (a double's 53 bits, an x87 register's 64) that gives\n * every answer Excel was seen to give (ADR-0047, ADR-0202). The remainder is exact; where it has the number's\n * sign, the divisor is added as `turnedRemainder` says. A divisor of 0 is `#DIV/0!`, and a quotient of\n * `modQuotientLimit` or more `#NUM!`.\n */\nexport function mod(call: FunctionCall): Operand {\n const number = numberArgument(call, 0);\n if (number instanceof Operand) return number;\n const divisor = numberArgument(call, 1);\n if (divisor instanceof Operand) return divisor;\n if (divisor === 0) return Operand.ofError('#DIV/0!');\n if (Math.abs(number / divisor) >= modQuotientLimit) return Operand.ofError('#NUM!');\n // % on doubles is exact, and carries the number's sign.\n const remainder = number % divisor;\n if (remainder === 0 || (remainder < 0) === (divisor < 0)) return numberResult(remainder);\n return numberResult(turnedRemainder(remainder, divisor));\n}\n\n/**\n * `remainder` + `divisor`, where the remainder, exact, has the sign opposite the divisor's, as Excel adds it:\n * held at 64 bits, rounded to nearest as an x87 register adds, then stored as a double, rounded to nearest; and\n * 0 where the double stored is the divisor itself. The exact sum is the sum rounded once and its error\n * (Fast2Sum); the register's last place is 2^-11 of the double's between the sum and its neighbour on the\n * error's side, so the 64-bit sum is the sum plus a whole number of those steps, and a sum 1024 steps away is a\n * tie, which the double stored breaks to the even neighbour.\n */\nfunction turnedRemainder(remainder: number, divisor: number): number {\n // MOD(-n,-d) is -MOD(n,d): work with a positive divisor.\n const sign = divisor < 0 ? -1 : 1;\n const d = sign * divisor;\n const r = sign * remainder;\n const sum = r + d;\n const error = r - (sum - d);\n const gap = error < 0 ? sum - bitDecrement(sum) : bitIncrement(sum) - sum;\n const steps = roundHalfToEven(error / gap * 2048);\n const stored = Math.abs(steps) < 1024 || lowestBitClear(sum) ? sum\n : steps > 0 ? bitIncrement(sum) : bitDecrement(sum);\n return sign * (stored === d ? 0 : stored);\n}\n\n/** PRODUCT: the numbers SUM takes, multiplied; with none, 0, as Excel's is. */\nexport function product(call: FunctionCall): Operand {\n const numbers: number[] = [];\n const error = collectNumbers(call, numbers);\n return error !== undefined ? Operand.ofError(error) : productOf(numbers);\n}\n\n/** PRODUCT of the numbers taken; with none, 0. */\nexport function productOf(numbers: readonly number[]): Operand {\n if (numbers.length === 0) return Operand.of(Value.fromNumber(0));\n let result = 1;\n for (const n of numbers) result *= n;\n return numberResult(result);\n}\n\n/** MEDIAN: the middle of the numbers SUM takes, or the mean of the middle two; with none, `#NUM!`. */\nexport function median(call: FunctionCall): Operand {\n const numbers: number[] = [];\n const error = collectNumbers(call, numbers);\n return error !== undefined ? Operand.ofError(error) : medianOf(numbers);\n}\n\n/** MEDIAN of the numbers taken, which it sorts; with none, `#NUM!`. */\nexport function medianOf(numbers: number[]): Operand {\n if (numbers.length === 0) return Operand.ofError('#NUM!');\n sortNumbers(numbers);\n const middle = Math.trunc(numbers.length / 2);\n const upper = numbers[middle] as number; // oxlint-disable-line typescript/no-unsafe-type-assertion -- the middle of a list of one or more\n return numberResult(numbers.length % 2 === 1 ? upper : ((numbers[middle - 1] as number) + upper) / 2); // oxlint-disable-line typescript/no-unsafe-type-assertion -- an even count has two middles\n}\n\nexport function large(call: FunctionCall): Operand {\n return ranked(call, true);\n}\n\nexport function small(call: FunctionCall): Operand {\n return ranked(call, false);\n}\n\n/**\n * LARGE and SMALL: the numbers of the array (a range's numbers only; a typed value coerced), and the k-th of\n * them (`kthOf`). A k below 1, or above their count, is `#NUM!`.\n */\nfunction ranked(call: FunctionCall, largest: boolean): Operand {\n const numbers: number[] = [];\n const array = call.operand(0);\n if (array.isRange) {\n for (const value of call.evaluator.rangeValues(array)) {\n if (value.isError) return Operand.of(value);\n if (value.kind === 'number') numbers.push(value.number);\n }\n } else {\n const single = numberArgument(call, 0);\n if (single instanceof Operand) return single;\n numbers.push(single);\n }\n const k = numberArgument(call, 1);\n if (k instanceof Operand) return k;\n return kthOf(numbers, k, largest);\n}\n\n/**\n * The k-th largest or smallest of the numbers taken, which it sorts, as Excel reads k. k is read at Excel's 15\n * significant digits. A k outside 1 to the count of the numbers is `#NUM!`, whole or not, before it is rounded\n * (LARGE-011, LARGE-013, SMALL-007, SMALL-008). A k within it that is not whole is rounded up for the k-th\n * largest (LARGE-007 to 009) and truncated for the k-th smallest (SMALL-004, 005, 009).\n */\nexport function kthOf(numbers: number[], kAsGiven: number, largest: boolean): Operand {\n let k = atFifteenDigits(kAsGiven);\n if (k < 1 || k > numbers.length) return Operand.ofError('#NUM!');\n k = largest ? Math.ceil(k) : Math.floor(k);\n sortNumbers(numbers);\n const at = k - 1;\n const picked = numbers[largest ? numbers.length - 1 - at : at] as number; // oxlint-disable-line typescript/no-unsafe-type-assertion -- k is within 1 to the count\n return Operand.of(Value.fromNumber(picked));\n}\n\n/** TRUNC: toward zero at `num_digits`, 0 when left out \u2014 ROUNDDOWN with an optional second argument. */\nexport function trunc(call: FunctionCall): Operand {\n const number = numberArgument(call, 0);\n if (number instanceof Operand) return number;\n let digits = 0;\n if (call.has(1)) {\n const given = numberArgument(call, 1);\n if (given instanceof Operand) return given;\n digits = given;\n }\n return numberResult(roundAt(number, Math.trunc(digits), 'towardZero'));\n}\n\n/** POWER: the `^` operator's answer, its Error Values included (0^0 is `#NUM!`, 0 to a negative power `#DIV/0!`). */\nexport function power(call: FunctionCall): Operand {\n const number = numberArgument(call, 0);\n if (number instanceof Operand) return number;\n const exponent = numberArgument(call, 1);\n if (exponent instanceof Operand) return exponent;\n if (number === 0 && exponent === 0) return Operand.ofError('#NUM!');\n if (number === 0 && exponent < 0) return Operand.ofError('#DIV/0!');\n const result = powerOf(number, exponent);\n return result === undefined ? Operand.ofError('#NUM!') : numberResult(result);\n}\n\n/** SQRT: a negative number is `#NUM!`. */\nexport function sqrt(call: FunctionCall): Operand {\n const number = numberArgument(call, 0);\n if (number instanceof Operand) return number;\n return number < 0 ? Operand.ofError('#NUM!') : Operand.of(Value.fromNumber(Math.sqrt(number)));\n}\n\n/**\n * RANK.EQ: the number's rank among the numbers of `ref`, from the largest when `order` is 0 or left out and from\n * the smallest otherwise; equal numbers share the top rank. A number not among them is `#N/A`, and a `ref` that\n * is no range is `#VALUE!`.\n */\nexport function rankEq(call: FunctionCall): Operand {\n const number = numberArgument(call, 0);\n if (number instanceof Operand) return number;\n const reference = call.operand(1);\n if (!reference.isRange) return reference.isError ? reference : Operand.ofError('#VALUE!');\n let order = 0;\n if (call.has(2)) {\n const given = numberArgument(call, 2);\n if (given instanceof Operand) return given;\n order = given;\n }\n let found = false;\n let ahead = 0;\n for (const value of call.evaluator.rangeValues(reference)) {\n if (value.isError) return Operand.of(value);\n if (value.kind !== 'number') continue;\n if (value.number === number) found = true;\n else if (order === 0 ? value.number > number : value.number < number) ahead++;\n }\n return found ? Operand.of(Value.fromNumber(ahead + 1)) : Operand.ofError('#N/A');\n}\n\nexport function stdevS(call: FunctionCall): Operand {\n return spread(call, true, true);\n}\n\nexport function stdevP(call: FunctionCall): Operand {\n return spread(call, false, true);\n}\n\nexport function varS(call: FunctionCall): Operand {\n return spread(call, true, false);\n}\n\nexport function varP(call: FunctionCall): Operand {\n return spread(call, false, false);\n}\n\n/**\n * VAR.S, VAR.P and their square roots STDEV.S and STDEV.P, over the numbers SUM takes, the squared deviations\n * taken from their mean. Fewer than two numbers for a sample, or none for a population, is `#DIV/0!`.\n */\nfunction spread(call: FunctionCall, sample: boolean, root: boolean): Operand {\n const numbers: number[] = [];\n const error = collectNumbers(call, numbers);\n return error !== undefined ? Operand.ofError(error) : spreadOf(numbers, sample, root);\n}\n\n/** VAR.S, VAR.P, STDEV.S or STDEV.P of the numbers taken (`spread`). */\nexport function spreadOf(numbers: readonly number[], sample: boolean, root: boolean): Operand {\n const divisor = sample ? numbers.length - 1 : numbers.length;\n if (divisor < 1) return Operand.ofError('#DIV/0!');\n let total = 0;\n for (const n of numbers) total += n;\n const mean = total / numbers.length;\n let squares = 0;\n for (const n of numbers) squares += (n - mean) * (n - mean);\n const variance = squares / divisor;\n return numberResult(root ? Math.sqrt(variance) : variance);\n}\n\nexport function signFunction(call: FunctionCall): Operand {\n const number = numberArgument(call, 0);\n return number instanceof Operand ? number : Operand.of(Value.fromNumber(Math.sign(number)));\n}\n\n/** EXP: e to the number; past what a double holds, `#NUM!`. */\nexport function exp(call: FunctionCall): Operand {\n const number = numberArgument(call, 0);\n return number instanceof Operand ? number : numberResult(portable.exp(number));\n}\n\n/** LN: a number not above 0 is `#NUM!`. */\nexport function ln(call: FunctionCall): Operand {\n const number = numberArgument(call, 0);\n if (number instanceof Operand) return number;\n return number <= 0 ? Operand.ofError('#NUM!') : Operand.of(Value.fromNumber(portable.log(number)));\n}\n\n/** LOG10: a number not above 0 is `#NUM!`. */\nexport function log10(call: FunctionCall): Operand {\n const number = numberArgument(call, 0);\n if (number instanceof Operand) return number;\n return number <= 0 ? Operand.ofError('#NUM!') : Operand.of(Value.fromNumber(portable.log10(number)));\n}\n\nexport function pi(): Operand {\n return Operand.of(Value.fromNumber(Math.PI));\n}\n\n/**\n * MROUND for whole-number multiples. Decimal multiples are refused: the Windows run's 6.05, 7.05, 0.15 and 0.35\n * midpoints cannot all be reproduced by one ordinary binary rounding operation, and Microsoft's MROUND\n * documentation leaves their direction undefined. ADR-0047 permits this refusal, never an invented epsilon.\n */\nexport function mRound(call: FunctionCall): Operand {\n const number = mroundNumber(call, 0);\n if (number instanceof Operand) return number;\n const multiple = mroundNumber(call, 1);\n if (multiple instanceof Operand) return multiple;\n if (number === 0 || multiple === 0) return Operand.of(Value.fromNumber(0));\n if (Math.sign(number) !== Math.sign(multiple)) return Operand.ofError('#NUM!');\n if (multiple !== Math.trunc(multiple)) return call.evaluator.refuse();\n return numberResult(roundHalfAwayFromZero(number / multiple) * multiple);\n}\n\nfunction mroundNumber(call: FunctionCall, index: number): number | Operand {\n const value = scalarArgument(call, index);\n if (value instanceof Operand) return value;\n if (value?.kind === 'boolean') return Operand.ofError('#VALUE!');\n return numberArgument(call, index);\n}\n\nexport function ceilingMath(call: FunctionCall): Operand {\n return directionalMultiple(call, true);\n}\n\nexport function floorMath(call: FunctionCall): Operand {\n return directionalMultiple(call, false);\n}\n\nfunction directionalMultiple(call: FunctionCall, ceilingAsked: boolean): Operand {\n const number = numberArgument(call, 0);\n if (number instanceof Operand) return number;\n let significance = 1;\n if (call.has(1)) {\n const given = numberArgument(call, 1);\n if (given instanceof Operand) return given;\n significance = given;\n }\n let mode = 0;\n if (call.has(2)) {\n const given = numberArgument(call, 2);\n if (given instanceof Operand) return given;\n mode = given;\n }\n if (significance === 0 || number === 0) return Operand.of(Value.fromNumber(0));\n significance = Math.abs(significance);\n const quotient = number / significance;\n if (quotient === 0) return Operand.ofError('#NUM!');\n // The run pins half-multiples, not which side Excel takes when division is almost integral. Refuse that\n // boundary at the existing 15-digit precision; never use that precision as an epsilon to choose an answer.\n const nearest = roundHalfToEven(quotient);\n if (quotient !== nearest && approximatelyEqual(quotient, nearest)) return call.evaluator.refuse();\n const ceiling = number < 0 && mode !== 0 ? !ceilingAsked : ceilingAsked;\n return numberResult((ceiling ? Math.ceil(quotient) : Math.floor(quotient)) * significance);\n}\n\n/** The largest bound RANDBETWEEN takes: 2^53, past which a double no longer holds every whole number (ADR-0180). */\nconst largestBound = 9_007_199_254_740_992;\n\n/** RAND: a number from 0 up to 1, evenly spread; `#GETTING_DATA` while the Sheet has no seed. */\nexport function rand(call: FunctionCall): Operand {\n const draw = drawFor(call);\n return draw === undefined ? Operand.ofError('#GETTING_DATA') : Operand.of(Value.fromNumber(unitOf(draw)));\n}\n\n/**\n * RANDBETWEEN: a whole number from `bottom` to `top`, both included, every one equally likely. As Excel was\n * observed to answer: a bottom above the top is `#NUM!`, a boolean and text that is not a number are `#VALUE!`,\n * a numeric string is read as its number, a blank Reference is 0, and an Error Value passes through\n * (RANDBETWEEN-007 to 014). Refused by decision: a fractional bound (RANDBETWEEN-004 to 006), and a bound above\n * 2^53 in magnitude.\n */\nexport function randBetween(call: FunctionCall): Operand {\n const bottom = boundOf(call, 0);\n if (bottom instanceof Operand) return bottom;\n const top = boundOf(call, 1);\n if (top instanceof Operand) return top;\n if (!isWhole(bottom) || !isWhole(top)) return call.evaluator.refuse();\n if (bottom > top) return Operand.ofError('#NUM!');\n const draw = drawFor(call);\n if (draw === undefined) return Operand.ofError('#GETTING_DATA');\n return Operand.of(Value.fromNumber(between(draw, bottom, top)));\n}\n\nfunction isWhole(bound: number): boolean {\n return bound === Math.floor(bound) && Math.abs(bound) <= largestBound;\n}\n\n/** A bound of RANDBETWEEN: one Value, coerced as a number except that a boolean is `#VALUE!`, as Excel answered `RANDBETWEEN(TRUE,3)`. */\nfunction boundOf(call: FunctionCall, index: number): number | Operand {\n const value = scalarArgument(call, index);\n if (value instanceof Operand) return value;\n if (value?.kind === 'boolean') return Operand.ofError('#VALUE!');\n return numberOrFailure(call.evaluator.toNumber(value));\n}\n\n/** This call's draw, from the cell it is computed in; `undefined` while the Sheet has no seed. */\nfunction drawFor(call: FunctionCall): bigint | undefined {\n const self = call.evaluator.self;\n return self === undefined ? undefined : call.evaluator.cells.draw(self, call.place);\n}\n", "// SUBTOTAL and AGGREGATE (C#'s Functions.Subtotal.cs; ADR-0047's note of 2026-10-10), admitted while a Sheet\n// cannot hide a row (ADR-0046): the function numbers and options that pass over hidden rows give what the\n// others give, as they do in Excel over such a sheet. A cell is nested when its Formula, or for a cell of a\n// Spill Range its Anchor's, calls SUBTOTAL or AGGREGATE anywhere in its text, as the seventeenth Windows run\n// read Excel's answers (SH-68): SUBTOTAL and AGGREGATE's options 0 to 3 pass over it, and AGGREGATE's options\n// 4 to 7 count its Value.\nimport { Value } from '../../value';\nimport type { FunctionCall } from '../function-definition';\nimport type { Node } from '../nodes';\nimport { Operand } from '../operand';\nimport { averageOf, maxOf, minOf, sumOf } from './core';\nimport { kthOf, medianOf, productOf, spreadOf } from './math';\nimport { numberArgument } from './shared';\n\n/**\n * Whether a cell holding `formula` is a nested SUBTOTAL or AGGREGATE: its Formula calls either anywhere in its\n * text \u2014 the whole Formula, inside a larger expression, in parentheses, under `IF` \u2014 as Excel counts one\n * (SUBTOTAL-020, 021, 035 to 038, AGGREGATE-026, 052 to 054). `false` for a constant or a blank.\n */\nfunction isNested(formula: Node | undefined): boolean {\n if (formula === undefined) return false;\n for (const call of formula.calls()) {\n if (call.function !== undefined && (call.name === 'SUBTOTAL' || call.name === 'AGGREGATE')) return true;\n }\n return false;\n}\n\n/**\n * SUBTOTAL: function numbers 1 to 11 \u2014 AVERAGE, COUNT, COUNTA, MAX, MIN, PRODUCT, STDEV.S, STDEV.P, SUM, VAR.S,\n * VAR.P \u2014 over its references, each function as it reads a range; 101 to 111 give the same while no row can be\n * hidden. A function number that is not whole is truncated toward zero, as Excel's is (SUBTOTAL-027: 9.5 is 9).\n * A nested cell (`isNested`) is passed over. `#VALUE!`, as Excel's was for 12 and 0 (SUBTOTAL-025, 026):\n * another function number; and an argument that is no reference when it is computed.\n */\nexport function subtotal(call: FunctionCall): Operand {\n const number = truncatedArgument(call, 0);\n if (number instanceof Operand) return number;\n // No row can be hidden yet (ADR-0046), so 101 to 111 skip nothing 1 to 11 do not.\n const fn = number >= 101 && number <= 111 ? number - 100 : number;\n if (fn < 1 || fn > 11) return Operand.ofError('#VALUE!');\n const values: Value[] = [];\n for (let i = 1; i < call.count; i++) {\n const failure = collect(call.operand(i), false, true, false, values);\n if (failure !== undefined) return failure;\n }\n return reduce(fn, values, undefined);\n}\n\n/**\n * AGGREGATE: function numbers 1 to 12 over references (the reference form) and 14 and 15 \u2014 LARGE and SMALL \u2014\n * over an array and its k (the array form), with options 0 to 7. Options 0 to 3 pass over a nested cell\n * (`isNested`), and options 4 to 7 count its Value, as Excel does (AGGREGATE-025, 042 to 051); options 2, 3, 6\n * and 7 pass over Error Values; options 1, 3, 5 and 7, which pass over hidden rows, give what 0, 2, 4 and 6\n * give, since no row can be hidden. A function number or option that is not whole is truncated toward zero, as\n * SUBTOTAL's is. The array form takes a Value given directly as an array of that one Value: a number is its one\n * number (AGGREGATE-039), and text or a boolean leaves no number, so `#NUM!` (AGGREGATE-061). Its k is read as\n * LARGE's and SMALL's (`kthOf`). Refused (`Evaluator.refuse`): the function numbers of functions the engine does\n * not support (13, MODE.SNGL; 16 to 19, PERCENTILE and QUARTILE), where Excel answers (AGGREGATE-027 to 031).\n * `#VALUE!`, as Excel's: a number or option outside Excel's, LARGE or SMALL without its k or with an argument\n * after it, and an argument of the reference form that is no reference when it is computed.\n */\nexport function aggregate(call: FunctionCall): Operand {\n const fn = truncatedArgument(call, 0);\n if (fn instanceof Operand) return fn;\n let option = 0;\n if (call.has(1)) {\n const given = truncatedArgument(call, 1);\n if (given instanceof Operand) return given;\n option = given;\n }\n if (fn < 1 || fn > 19 || option < 0 || option > 7) return Operand.ofError('#VALUE!');\n // MODE.SNGL, PERCENTILE.INC, QUARTILE.INC, PERCENTILE.EXC and QUARTILE.EXC are not declared: refused.\n if (fn === 13 || fn > 15) return call.evaluator.refuse();\n const skipNested = option <= 3;\n const passOverErrors = option === 2 || option === 3 || option === 6 || option === 7;\n const values: Value[] = [];\n if (fn <= 12) {\n for (let i = 2; i < call.count; i++) {\n const failure = collect(call.operand(i), false, skipNested, passOverErrors, values);\n if (failure !== undefined) return failure;\n }\n return reduce(fn, values, undefined);\n }\n\n // The array form: the array, and k.\n if (call.count !== 4) return Operand.ofError('#VALUE!');\n const failure = collect(call.operand(2), true, skipNested, passOverErrors, values);\n if (failure !== undefined) return failure;\n const error = values.find(v => v.isError);\n if (error !== undefined) return Operand.of(error);\n const k = numberArgument(call, 3);\n if (k instanceof Operand) return k;\n return reduce(fn, values, k);\n}\n\n/**\n * Argument `index` truncated toward zero to a whole number, as Excel reads SUBTOTAL's function number\n * (SUBTOTAL-027) and, by the same rule, AGGREGATE's function number and option; one past what a 32-bit integer\n * holds is refused with `#VALUE!`, outside every range either takes.\n */\nfunction truncatedArgument(call: FunctionCall, index: number): number | Operand {\n const number = numberArgument(call, index);\n if (number instanceof Operand) return number;\n const truncated = Math.trunc(number);\n if (truncated < -2147483648 || truncated > 2147483647) return Operand.ofError('#VALUE!');\n return truncated === 0 ? 0 : truncated;\n}\n\n/**\n * The Values of one argument that SUBTOTAL or AGGREGATE reduces, added in order to `values`: a reference's cells\n * that are not blank, a Linked Table's column, or, where `arrays` allows it, a computed array or a number, text\n * or boolean given directly, which is an array of that one Value (`reduce` counts only its numbers). A nested\n * cell (`isNested`) is passed over when `skipNested`, and its Value counted otherwise; an Error Value is passed\n * over when `passOverErrors`. The failure when the argument is refused, or is an Error Value itself.\n */\nfunction collect(operand: Operand, arrays: boolean, skipNested: boolean, passOverErrors: boolean, values: Value[]): Operand | undefined {\n const add = (value: Value): void => {\n if (!(value.isError && passOverErrors)) values.push(value);\n };\n switch (operand.kind) {\n case 'area': {\n const cells = operand.cellsOf();\n for (const address of cells.nonBlankIn(operand.area)) {\n if (skipNested && isNested(cells.formulaAt(address))) continue;\n const value = cells.read(address);\n if (value === undefined) throw new Error(`Internal: ${address.toString()} was listed as not blank.`);\n add(value);\n }\n return undefined;\n }\n case 'column':\n for (const value of operand.columnOf()) if (value !== undefined) add(value);\n return undefined;\n case 'array':\n if (!arrays) break;\n for (const value of operand.arrayOf().nonBlank()) add(value);\n return undefined;\n case 'scalar': {\n // A Value given directly is an array of that one Value: a number is taken (AGGREGATE-039), and\n // text or a boolean is no number, not coerced, so LARGE and SMALL pass over it (AGGREGATE-061:\n // AGGREGATE(14,6,\"5\",1) is #NUM!, not 5 and not #VALUE!).\n const given = operand.scalar;\n if (arrays && given !== undefined && !given.isError) {\n add(given);\n return undefined;\n }\n break;\n }\n case 'missing':\n case 'threeD':\n break;\n default: throw new Error(`Internal: ${String(operand.kind)} is no kind of operand.`);\n }\n return operand.isError ? operand : Operand.ofError('#VALUE!');\n}\n\n/**\n * The function a SUBTOTAL or AGGREGATE number names, over `values`, each as it reads a range: only numbers\n * count, COUNT passes over an Error Value and COUNTA counts it, and for the others the first Error Value is the\n * result.\n */\nfunction reduce(fn: number, values: readonly Value[], k: number | undefined): Operand {\n if (fn === 2) return Operand.of(Value.fromNumber(values.filter(v => v.kind === 'number').length));\n if (fn === 3) return Operand.of(Value.fromNumber(values.length));\n const numbers: number[] = [];\n for (const value of values) {\n if (value.isError) return Operand.of(value);\n if (value.kind === 'number') numbers.push(value.number);\n }\n switch (fn) {\n case 1: return averageOf(numbers);\n case 4: return maxOf(numbers);\n case 5: return minOf(numbers);\n case 6: return productOf(numbers);\n case 7: return spreadOf(numbers, true, true);\n case 8: return spreadOf(numbers, false, true);\n case 9: return sumOf(numbers);\n case 10: return spreadOf(numbers, true, false);\n case 11: return spreadOf(numbers, false, false);\n case 12: return medianOf(numbers);\n case 14: return kthOf(numbers, kOf(k), true);\n case 15: return kthOf(numbers, kOf(k), false);\n default: throw new Error(`Internal: ${String(fn)} is no function number.`);\n }\n}\n\nfunction kOf(k: number | undefined): number {\n if (k === undefined) throw new Error('Internal: LARGE and SMALL are reduced with their k.');\n return k;\n}\n", "// LEFT, RIGHT, MID, LEN, TRIM, CONCAT, TEXT, TEXTJOIN, CONCATENATE, SUBSTITUTE, REPLACE, FIND, REPT, EXACT,\n// NUMBERVALUE and VALUE (C#'s Functions.Text.cs); UPPER, LOWER, PROPER and SEARCH as the Windows runs observed\n// them (Functions.ObservedText.cs). Characters are counted as Excel counts them, in UTF-16 code units.\nimport { CellAddress } from '../../cell-address';\nimport { parseNumber } from '../../constant-parser';\nimport { isAscii, isAsciiDigit, isAsciiLetter, isWhiteSpace } from '../../dotnet';\nimport { NumberFormat } from '../../number-format';\nimport { generalFitted, generalLimit } from '../../number-text';\nimport { Value } from '../../value';\nimport type { FunctionCall } from '../function-definition';\nimport { Operand } from '../operand';\nimport { powerOfTen } from '../rounding';\nimport { isArray, numberArgument, numberResult, scalarArgument, textArgument, truthOf, unlifted } from './shared';\n\n/** The most characters a cell holds; CONCAT is `#VALUE!` past it. */\nexport const textLimit = 32_767;\n\nfunction textResult(text: string): Operand {\n return Operand.of(Value.fromText(text));\n}\n\nexport function left(call: FunctionCall): Operand {\n return edge(call, true);\n}\n\nexport function right(call: FunctionCall): Operand {\n return edge(call, false);\n}\n\n/** LEFT and RIGHT: `num_chars` is 1 when left out, 0 when given empty, truncated to a whole number, and `#VALUE!` below 0. */\nfunction edge(call: FunctionCall, fromStart: boolean): Operand {\n const text = textArgument(call, 0);\n if (text instanceof Operand) return text;\n let count = 1;\n if (call.count > 1) {\n count = 0;\n if (call.has(1)) {\n const given = numberArgument(call, 1);\n if (given instanceof Operand) return given;\n count = given;\n }\n }\n count = Math.trunc(count);\n if (count < 0) return Operand.ofError('#VALUE!');\n const length = Math.min(count, text.length);\n return textResult(fromStart ? text.slice(0, length) : text.slice(text.length - length));\n}\n\n/** MID: `start_num` below 1 or `num_chars` below 0 is `#VALUE!`; a start past the end gives empty text. */\nexport function mid(call: FunctionCall): Operand {\n const text = textArgument(call, 0);\n if (text instanceof Operand) return text;\n const startGiven = numberArgument(call, 1);\n if (startGiven instanceof Operand) return startGiven;\n const countGiven = numberArgument(call, 2);\n if (countGiven instanceof Operand) return countGiven;\n const start = Math.trunc(startGiven);\n const count = Math.trunc(countGiven);\n if (start < 1 || count < 0) return Operand.ofError('#VALUE!');\n if (start > text.length) return textResult('');\n const from = start - 1;\n const length = Math.min(count, text.length - from);\n return textResult(text.slice(from, from + length));\n}\n\nexport function len(call: FunctionCall): Operand {\n const text = textArgument(call, 0);\n return text instanceof Operand ? text : Operand.of(Value.fromNumber(text.length));\n}\n\n/** TRIM removes U+0020 from both ends and leaves one between words; other white space, the non-breaking space among it, is kept. */\nexport function trim(call: FunctionCall): Operand {\n const text = textArgument(call, 0);\n return text instanceof Operand ? text : textResult(text.split(' ').filter(word => word.length > 0).join(' '));\n}\n\n/**\n * CONCAT joins its arguments in order, and a range's cells row by row; blanks add nothing, a kept blank among\n * them (ADR-0125). An Error Value anywhere is the result, the first one found. A result longer than a cell holds\n * is `#VALUE!`.\n */\nexport function concat(call: FunctionCall): Operand {\n const evaluator = call.evaluator;\n let joined = '';\n for (let i = 0; i < call.count; i++) {\n const operand = call.keepingBlanks(i);\n switch (operand.kind) {\n case 'area':\n case 'column':\n case 'array':\n case 'threeD':\n for (const value of evaluator.rangeValues(operand)) {\n if (value.isError) return Operand.of(value);\n joined += evaluator.toText(value);\n }\n break;\n case 'missing':\n break;\n case 'scalar':\n if (operand.scalar?.isError === true) return operand;\n joined += evaluator.toText(operand.scalar);\n break;\n default: throw new Error(`Internal: ${String(operand.kind)} is no kind of operand.`);\n }\n if (joined.length > textLimit) return Operand.ofError('#VALUE!');\n }\n return textResult(joined);\n}\n\n/**\n * TEXT (ADR-0120): the Value as a cell in the format shows it under the Sheet's culture, the code read in the\n * invariant spelling and as written. A blank is 0, and text that reads as a number is that number. A number in\n * General, or under a code of a text section alone such as `@`, is General at its own limit, 11 characters\n * beside the minus sign (`textGeneral`). An empty code shows a number as empty text (TEXTFN-018). A number the\n * format cannot show is `#VALUE!` (TEXTFN-015). A code the cell formats refuse is refused. The code's colour is\n * dropped.\n */\nexport function formatAsText(call: FunctionCall): Operand {\n const value = scalarArgument(call, 0);\n if (value instanceof Operand) return value;\n const code = textArgument(call, 1);\n if (code instanceof Operand) return code;\n let format = NumberFormat.general;\n if (code.length > 0) {\n const read = NumberFormat.tryParseAsWritten(code).format;\n if (read === undefined) return call.evaluator.refuse();\n format = read;\n }\n const culture = call.evaluator.culture;\n let shown: Value;\n if (value === undefined) shown = Value.fromNumber(0);\n else if (value.kind === 'text') {\n const number = parseNumber(value.text, culture);\n shown = number === undefined ? value : Value.fromNumber(number);\n } else shown = value;\n if (shown.kind === 'number' && code.length === 0) return textResult('');\n if (shown.kind === 'number' && format.showsNumbersAsGeneral) {\n const general = generalFitted(shown.number, generalLimit + (shown.number < 0 ? 1 : 0), culture);\n return general === undefined ? Operand.ofError('#VALUE!') : textResult(general);\n }\n const formatted = format.format(shown, culture);\n return formatted.cannotShow ? Operand.ofError('#VALUE!') : textResult(formatted.text);\n}\n\n/**\n * TEXTJOIN: the texts in order, a range's cells row by row, with the delimiter between them; with\n * `ignore_empty` TRUE, blanks and empty text are left out, and otherwise each is an empty item. A delimiter of\n * more than one cell is refused; a 3D Reference's cells are delimiters taken in turn, Sheet by Sheet (ADR-0331\n * \u00A77). An Error Value is the result, and a result longer than a cell holds is `#VALUE!`.\n */\nexport function textJoin(call: FunctionCall): Operand {\n const evaluator = call.evaluator;\n const delimiters: string[] = [];\n const given = call.oneValue(0);\n if (given.kind === 'threeD') {\n for (const item of itemsOf(given)) {\n if (item?.isError === true) return Operand.of(item);\n delimiters.push(evaluator.toText(item));\n }\n } else {\n if (isArray(given)) return unlifted(call);\n const value = evaluator.scalarOf(given);\n if (value?.isError === true) return Operand.of(value);\n delimiters.push(evaluator.toText(value));\n }\n const ignoreValue = scalarArgument(call, 1);\n if (ignoreValue instanceof Operand) return ignoreValue;\n let ignoreEmpty = false;\n if (ignoreValue !== undefined) {\n const truth = truthOf(ignoreValue);\n if (truth === undefined) return Operand.ofError('#VALUE!');\n ignoreEmpty = truth;\n }\n let joined = '';\n let joins = 0;\n for (let i = 2; i < call.count; i++) {\n for (const item of itemsOf(call.operand(i))) {\n if (item?.isError === true) return Operand.of(item);\n const text = evaluator.toText(item);\n if (ignoreEmpty && text.length === 0) continue;\n if (joins > 0) joined += delimiters[(joins - 1) % delimiters.length] as string; // oxlint-disable-line typescript/no-unsafe-type-assertion -- an index modulo the count\n joined += text;\n joins++;\n if (joined.length > textLimit) return Operand.ofError('#VALUE!');\n }\n }\n return textResult(joined);\n}\n\n/** Every cell of a range, blanks included as `undefined`, row by row; a scalar as itself. */\nfunction* itemsOf(operand: Operand): Generator<Value | undefined> {\n switch (operand.kind) {\n case 'area': {\n const area = operand.area;\n const cells = operand.cellsOf();\n for (let row = area.row1; row <= area.row2; row++) {\n for (let column = area.column1; column <= area.column2; column++) yield cells.read(new CellAddress(row, column));\n }\n return;\n }\n case 'column':\n yield* operand.columnOf();\n return;\n case 'threeD': {\n // Sheet by Sheet in tab order, each row by row (ADR-0331 \u00A77).\n const area = operand.area;\n for (const sheet of operand.sheetsOf()) {\n for (let row = area.row1; row <= area.row2; row++) {\n for (let column = area.column1; column <= area.column2; column++) yield sheet.read(new CellAddress(row, column));\n }\n }\n return;\n }\n case 'array':\n yield* operand.arrayOf().all();\n return;\n case 'missing':\n yield undefined;\n return;\n case 'scalar':\n yield operand.scalar;\n return;\n default: throw new Error(`Internal: ${String(operand.kind)} is no kind of operand.`);\n }\n}\n\n/** CONCATENATE: its arguments joined, each one Value. A range of more than one cell is refused; CONCAT is the one that takes ranges. */\nexport function concatenate(call: FunctionCall): Operand {\n let joined = '';\n for (let i = 0; i < call.count; i++) {\n if (!call.has(i)) continue;\n const text = textArgument(call, i);\n if (text instanceof Operand) return text;\n joined += text;\n if (joined.length > textLimit) return Operand.ofError('#VALUE!');\n }\n return textResult(joined);\n}\n\n/**\n * SUBSTITUTE: `new_text` for every `old_text`, case-sensitive and left to right without overlapping, or for the\n * `instance_num`-th alone, the occurrences then counted at every character, overlapping ones included\n * (SUBSTITUTE-005). An `instance_num` below 1 is `#VALUE!`, and an empty `old_text` changes nothing.\n */\nexport function substitute(call: FunctionCall): Operand {\n const text = textArgument(call, 0);\n if (text instanceof Operand) return text;\n const old = textArgument(call, 1);\n if (old instanceof Operand) return old;\n const replacement = textArgument(call, 2);\n if (replacement instanceof Operand) return replacement;\n if (call.has(3)) {\n const given = numberArgument(call, 3);\n if (given instanceof Operand) return given;\n const instance = Math.trunc(given);\n if (instance < 1) return Operand.ofError('#VALUE!');\n if (old.length === 0) return textResult(text);\n let at = -1;\n for (let n = 0; n < instance; n++) {\n at = text.indexOf(old, at + 1);\n if (at < 0) return textResult(text);\n }\n return textResult(text.slice(0, at) + replacement + text.slice(at + old.length));\n }\n return textResult(old.length === 0 ? text : text.split(old).join(replacement));\n}\n\n/** REPLACE: `num_chars` characters from `start_num` replaced by `new_text`; a start below 1 or a count below 0 is `#VALUE!`, and a start past the end appends. */\nexport function replace(call: FunctionCall): Operand {\n const text = textArgument(call, 0);\n if (text instanceof Operand) return text;\n const startGiven = numberArgument(call, 1);\n if (startGiven instanceof Operand) return startGiven;\n const countGiven = numberArgument(call, 2);\n if (countGiven instanceof Operand) return countGiven;\n const replacement = textArgument(call, 3);\n if (replacement instanceof Operand) return replacement;\n const start = Math.trunc(startGiven);\n const count = Math.trunc(countGiven);\n if (start < 1 || count < 0) return Operand.ofError('#VALUE!');\n const from = Math.min(start - 1, text.length);\n const length = Math.min(count, text.length - from);\n const result = text.slice(0, from) + replacement + text.slice(from + length);\n return result.length > textLimit ? Operand.ofError('#VALUE!') : textResult(result);\n}\n\n/**\n * FIND: the position, from 1, of `find_text` in `within_text` from `start_num`, case-sensitive and without\n * wildcards; not found is `#VALUE!`, and so is a start below 1 or past the text's length. An empty `find_text`\n * is found at the start.\n */\nexport function find(call: FunctionCall): Operand {\n const wanted = textArgument(call, 0);\n if (wanted instanceof Operand) return wanted;\n const within = textArgument(call, 1);\n if (within instanceof Operand) return within;\n let start = 1;\n if (call.has(2)) {\n const given = numberArgument(call, 2);\n if (given instanceof Operand) return given;\n start = given;\n }\n start = Math.trunc(start);\n if (start < 1 || start > within.length) return Operand.ofError('#VALUE!');\n if (wanted.length === 0) return Operand.of(Value.fromNumber(start));\n const at = within.indexOf(wanted, start - 1);\n return at < 0 ? Operand.ofError('#VALUE!') : Operand.of(Value.fromNumber(at + 1));\n}\n\n/** REPT: the text repeated, the count truncated; below 0, or a result longer than a cell holds, `#VALUE!`. */\nexport function rept(call: FunctionCall): Operand {\n const text = textArgument(call, 0);\n if (text instanceof Operand) return text;\n const given = numberArgument(call, 1);\n if (given instanceof Operand) return given;\n const times = Math.trunc(given);\n if (times < 0 || text.length * times > textLimit) return Operand.ofError('#VALUE!');\n return textResult(text.repeat(text.length === 0 ? 0 : times));\n}\n\n/** EXACT: whether the two texts are the same, case and all. */\nexport function exact(call: FunctionCall): Operand {\n const first = textArgument(call, 0);\n if (first instanceof Operand) return first;\n const second = textArgument(call, 1);\n if (second instanceof Operand) return second;\n return Operand.of(Value.fromBoolean(first === second));\n}\n\n/**\n * NUMBERVALUE: the text read as a number with the separators given, the first character of each; left out, the\n * Sheet's culture's. Spaces are ignored, and so are group separators before the decimal one; each `%` at the\n * end divides by 100; empty text is 0. A second decimal separator, a group separator after it, or anything else\n * that is no digit is `#VALUE!`.\n */\nexport function numberValue(call: FunctionCall): Operand {\n const text = textArgument(call, 0);\n if (text instanceof Operand) return text;\n const data = call.evaluator.culture.data;\n let decimalSeparator = data.numberDecimalSeparator.charAt(0);\n let groupSeparator = data.numberGroupSeparator.length > 0 ? data.numberGroupSeparator.charAt(0) : '\\0';\n if (call.has(1)) {\n const given = textArgument(call, 1);\n if (given instanceof Operand) return given;\n if (given.length === 0) return Operand.ofError('#VALUE!');\n decimalSeparator = given.charAt(0);\n }\n if (call.has(2)) {\n const given = textArgument(call, 2);\n if (given instanceof Operand) return given;\n if (given.length === 0) return Operand.ofError('#VALUE!');\n groupSeparator = given.charAt(0);\n }\n if (decimalSeparator === groupSeparator) return Operand.ofError('#VALUE!');\n\n let digits = '';\n let percents = 0;\n let seenDecimal = false;\n for (let i = 0; i < text.length; i++) {\n const c = text.charAt(i);\n const code = text.charCodeAt(i);\n if (isWhiteSpace(code)) continue;\n if (percents > 0 && c !== '%') return Operand.ofError('#VALUE!');\n if (c === '%') percents++;\n else if (c === decimalSeparator) {\n if (seenDecimal) return Operand.ofError('#VALUE!');\n seenDecimal = true;\n digits += '.';\n } else if (c === groupSeparator) {\n if (seenDecimal) return Operand.ofError('#VALUE!');\n } else if (isAsciiDigit(code) || ((c === '-' || c === '+') && digits.length === 0)) digits += c;\n else return Operand.ofError('#VALUE!');\n }\n if (digits.length === 0) return percents === 0 ? Operand.of(Value.fromNumber(0)) : Operand.ofError('#VALUE!');\n // What double.TryParse takes with a leading sign and a decimal point: at least one digit.\n if (!/[0-9]/.test(digits)) return Operand.ofError('#VALUE!');\n return numberResult(Number(digits) / powerOfTen(2 * percents));\n}\n\n/**\n * VALUE (ADR-0124): text read as a number under the Sheet's culture, as the arithmetic operators read text \u2014 a\n * date or a time typed as one is its serial. A number is itself, a blank 0; a boolean, and text that reads as no\n * number, are `#VALUE!`.\n */\nexport function valueOf(call: FunctionCall): Operand {\n const value = scalarArgument(call, 0);\n if (value instanceof Operand) return value;\n if (value === undefined) return Operand.of(Value.fromNumber(0));\n if (value.kind === 'number') return Operand.of(value);\n if (value.kind === 'text') {\n const parsed = parseNumber(value.text, call.evaluator.culture);\n if (parsed !== undefined) return Operand.of(Value.fromNumber(parsed));\n }\n return Operand.ofError('#VALUE!');\n}\n\n// ---- Observed case and search (2026-10-03 Windows observations, ADR-0047) ----------------------------------\n// A character outside the domains observed, and a sigma context not observed, refuse the Formula.\n\nexport function upper(call: FunctionCall): Operand {\n const text = textArgument(call, 0);\n if (text instanceof Operand) return text;\n let result = '';\n for (let i = 0; i < text.length; i++) {\n const c = text.charAt(i);\n if (!observedCaseCharacter(c)) return call.evaluator.refuse();\n result += observedUpper(c);\n }\n return textResult(result);\n}\n\nexport function lower(call: FunctionCall): Operand {\n const text = textArgument(call, 0);\n if (text instanceof Operand) return text;\n for (let i = 0; i < text.length; i++) {\n const c = text.charAt(i);\n if (!observedCaseCharacter(c) && c !== '\u0391' && c !== '\u039F') return call.evaluator.refuse();\n }\n if (!observedSigmaContexts(text)) return call.evaluator.refuse();\n let result = '';\n for (let i = 0; i < text.length; i++) {\n const c = text.charAt(i);\n if (c === '\u03A3') {\n const next = text.charAt(i + 1);\n result += next === '\u0391' || next === '\u039F' || next === '\u03A3' ? '\u03C3' : '\u03C2';\n } else result += observedLower(c);\n }\n return textResult(result);\n}\n\n/** LOWER's contextual sigma is observed only in uppercase Greek words separated by spaces. */\nfunction observedSigmaContexts(text: string): boolean {\n for (const word of text.split(' ')) {\n if (word.includes('\u03A3') && /[^\u0391\u039F\u03A3]/.test(word)) return false;\n }\n return true;\n}\n\nfunction observedLower(c: string): string {\n const code = c.charCodeAt(0);\n if (code >= 0x41 && code <= 0x5A) return String.fromCharCode(code + 32);\n switch (c) {\n case '\u00C9': return '\u00E9';\n case '\u0130': return 'i';\n case '\u01F1':\n case '\u01F2':\n return '\u01F3';\n case '\u0391': return '\u03B1';\n case '\u039F': return '\u03BF';\n default: return c;\n }\n}\n\nexport function proper(call: FunctionCall): Operand {\n const text = textArgument(call, 0);\n if (text instanceof Operand) return text;\n for (let i = 0; i < text.length; i++) {\n if (!observedCaseCharacter(text.charAt(i))) return call.evaluator.refuse();\n }\n // Only isolated sigma letters were observed for PROPER; its word context is separate from LOWER's.\n for (const word of text.split(' ')) {\n if (word.length > 1 && /[\u03C3\u03C2\u03A3]/.test(word)) return call.evaluator.refuse();\n }\n let result = '';\n let initial = true;\n for (let i = 0; i < text.length; i++) {\n const c = text.charAt(i);\n const lowered = observedLower(c);\n result += initial ? observedUpper(lowered) : lowered;\n initial = !observedCaseLetter(c);\n }\n return textResult(result);\n}\n\nfunction observedCaseLetter(c: string): boolean {\n return isAsciiLetter(c.charCodeAt(0)) || '\u00E9\u00C9\u00DF\u1E9E\u0131\u0130\u01F1\u01F2\u01F3\uFB03\u03C3\u03C2\u03A3'.includes(c);\n}\n\n/**\n * SEARCH has its own observed case folding: dotless i does not equal i, although UPPER maps both to I. Positions\n * and question marks are answered only for the admitted BMP text.\n */\nexport function searchText(call: FunctionCall): Operand {\n const wanted = textArgument(call, 0);\n if (wanted instanceof Operand) return wanted;\n const within = textArgument(call, 1);\n if (within instanceof Operand) return within;\n let start = 1;\n if (call.has(2)) {\n const given = numberArgument(call, 2);\n if (given instanceof Operand) return given;\n start = given;\n }\n start = Math.trunc(start);\n if (!allSearchCharacters(wanted) || !allSearchCharacters(within)) return call.evaluator.refuse();\n if (start < 1 || start > within.length) return Operand.ofError('#VALUE!');\n if (wanted.length === 0) return Operand.of(Value.fromNumber(start));\n\n const tokens: { character: string; wild: boolean }[] = [];\n for (let i = 0; i < wanted.length; i++) {\n const c = wanted.charAt(i);\n const next = wanted.charAt(i + 1);\n if (c === '~' && (next === '*' || next === '?' || next === '~')) {\n tokens.push({ character: next, wild: false });\n i++;\n } else tokens.push({ character: c, wild: c === '*' || c === '?' });\n }\n\n // A suffix of the pattern is matched at every text position. Once the pattern ends, remaining text is\n // allowed: SEARCH finds a substring, unlike a full-cell criterion.\n let next: boolean[] = Array.from({ length: within.length + 1 }, () => true);\n let current: boolean[] = Array.from({ length: within.length + 1 }, () => false);\n for (let p = tokens.length - 1; p >= 0; p--) {\n const { character, wild } = tokens[p] as { character: string; wild: boolean }; // oxlint-disable-line typescript/no-unsafe-type-assertion -- p is within the tokens\n const star = wild && character === '*';\n current[within.length] = star && next[within.length] === true;\n for (let t = within.length - 1; t >= start - 1; t--) {\n current[t] = star\n ? next[t] === true || current[t + 1] === true\n : next[t + 1] === true && (wild || observedSearchFold(character) === observedSearchFold(within.charAt(t)));\n }\n [current, next] = [next, current];\n }\n for (let i = start - 1; i < within.length; i++) {\n if (next[i] === true) return Operand.of(Value.fromNumber(i + 1));\n }\n return Operand.ofError('#VALUE!');\n}\n\nfunction allSearchCharacters(text: string): boolean {\n for (let i = 0; i < text.length; i++) {\n if (!isAscii(text.charCodeAt(i)) && !'\u00E9\u00C9\u00DF\u0131\u0130\u03C3\u03C2\u03A3'.includes(text.charAt(i))) return false;\n }\n return true;\n}\n\nfunction observedSearchFold(c: string): string {\n const code = c.charCodeAt(0);\n if (code >= 0x61 && code <= 0x7A) return String.fromCharCode(code - 32);\n switch (c) {\n case '\u00E9': return '\u00C9';\n case '\u03C3':\n case '\u03C2':\n return '\u03A3';\n default: return c;\n }\n}\n\n/** An explicit alphabet keeps the result independent of an operating system's Unicode tables. */\nfunction observedCaseCharacter(c: string): boolean {\n return isAscii(c.charCodeAt(0)) || '\u00E9\u00C9\u00DF\u1E9E\u0131\u0130\u01F1\u01F2\u01F3\uFB03\u00A0\u03C3\u03C2\u03A3'.includes(c);\n}\n\nfunction observedUpper(c: string): string {\n const code = c.charCodeAt(0);\n if (code >= 0x61 && code <= 0x7A) return String.fromCharCode(code - 32);\n switch (c) {\n case '\u00E9': return '\u00C9';\n case '\u0131': return 'I';\n case '\u01F2':\n case '\u01F3':\n return '\u01F1';\n case '\u03C3':\n case '\u03C2':\n return '\u03A3';\n default: return c;\n }\n}\n", "// LOG and the trigonometric and hyperbolic functions (C#'s Functions.Trigonometry.cs), each to Microsoft's\n// documentation of it (ticket 07) and to what the Windows runs observed of Excel. Angles are in radians.\nimport { fusedProductError, roundHalfToEven } from '../../dotnet';\nimport type { FunctionCall } from '../function-definition';\nimport { Operand } from '../operand';\nimport * as portable from '../portable-math';\nimport { numberArgument, numberResult } from './shared';\n\n/**\n * The size of argument, 2^27, at and above which SIN, COS, TAN, COT, CSC and SEC are `#NUM!`. Microsoft\n * documents it for COT, CSC and SEC; the seventeenth Windows run observed it for all six (SIN-005, COS-005,\n * TAN-005, COT-004, CSC-002, SEC-003). COTH, CSCH and SECH, for which Microsoft documents it too, answer past it\n * in Excel (COTH-002, CSCH-002, SECH-003), so they do here.\n */\nconst trigonometricLimit = 134_217_728;\n\n// ---- LOG ---------------------------------------------------------------------------------------------------\n\n/**\n * LOG: to `base`, 10 when left out. A number or base not above 0 is `#NUM!`; base 1, whose logarithm is 0, is\n * `#DIV/0!`. Base 10 goes through LOG10's own logarithm, so `LOG(1000)` is 3 as LOG10's is.\n */\nexport function log(call: FunctionCall): Operand {\n const number = numberArgument(call, 0);\n if (number instanceof Operand) return number;\n let base = 10;\n if (call.has(1)) {\n const given = numberArgument(call, 1);\n if (given instanceof Operand) return given;\n base = given;\n }\n if (number <= 0 || base <= 0) return Operand.ofError('#NUM!');\n if (base === 1) return Operand.ofError('#DIV/0!');\n return numberResult(base === 10 ? portable.log10(number) : portable.log(number) / portable.log(base));\n}\n\n// ---- SIN, COS, TAN, COT, CSC, SEC ----------------------------------------------------------------------------\n\n/** SIN: the sine of the angle reduced as Excel reduces it (`reduced`). */\nexport function sin(call: FunctionCall): Operand {\n return angle(call, n => reduced(n).sine.value, false);\n}\n\n/** COS: the cosine of the angle reduced as Excel reduces it (`reduced`). */\nexport function cos(call: FunctionCall): Operand {\n return angle(call, n => reduced(n).cosine.value, false);\n}\n\n/** TAN: the sine over the cosine of the reduced angle, rounded once (`reduced`). */\nexport function tan(call: FunctionCall): Operand {\n return angle(call, tangent, false);\n}\n\n/** COT: 1/TAN; `COT(0)` is `#DIV/0!`, as documented. */\nexport function cot(call: FunctionCall): Operand {\n return angle(call, n => 1 / tangent(n), true);\n}\n\n/** CSC: 1/SIN, divided as doubles (CSC-001); at 0, where SIN is 0, `#DIV/0!`. */\nexport function csc(call: FunctionCall): Operand {\n return angle(call, n => 1 / reduced(n).sine.value, true);\n}\n\n/** SEC: 1/COS, divided as doubles. */\nexport function sec(call: FunctionCall): Operand {\n return angle(call, n => 1 / reduced(n).cosine.value, false);\n}\n\n/** A function of an angle whose absolute value must be below 2^27 (`trigonometricLimit`); at or past it, `#NUM!`. Where the function has a pole at 0, 0 is `#DIV/0!`. */\nfunction angle(call: FunctionCall, fn: (n: number) => number, zeroIsDiv0: boolean): Operand {\n const number = numberArgument(call, 0);\n if (number instanceof Operand) return number;\n if (Math.abs(number) >= trigonometricLimit) return Operand.ofError('#NUM!');\n if (zeroIsDiv0 && number === 0) return Operand.ofError('#DIV/0!');\n return numberResult(fn(number));\n}\n\n/** TAN, and COT's divisor: the reduced sine over the reduced cosine, rounded once. */\nfunction tangent(angleGiven: number): number {\n const { sine, cosine } = reduced(angleGiven);\n return sine.dividedBy(cosine).value;\n}\n\n/**\n * The double nearest pi/2, the high part of the pi/2 Excel reduces an angle by: pi rounded to a 64-bit\n * significand, the x87's `FLDPI` (`0xC90FDAA22168C235` \u00D7 2^-62), halved, is this plus `halfPiLow` exactly.\n * `SIN(PI())` is the difference between that pi and the double `PI()` gives, 1.22514845490862E-16 (SIN-004),\n * where the true sine of that double is 1.2246467991473532E-16; the seventeenth Windows run observed it, with\n * `COS(PI()/2)` and `TAN(PI()/2)` (ADR-0047; `spikes/exsheet-trig-reduction/` holds the experiment).\n */\nconst halfPiHigh = Math.PI / 2;\n\n/** The low part of Excel's pi/2, 565 \u00D7 2^-63 (6.1257422745431E-17). */\nconst halfPiLow = 565 * 2 ** -63;\n\n/**\n * The sine and cosine of `angle` (below 2^27 in absolute value), as Excel answers them: the angle less the\n * nearest whole number `k` of Excel's pi/2 (`halfPiHigh` + `halfPiLow`), exactly, leaves `r` within about pi/4\n * of 0; the sine and cosine of `r`, to about 100 bits, give those of the angle by the quadrant `k` names. Each\n * is rounded to a double once, by `DoubleDouble.value`. Nothing here is the platform's `Math.sin`, so every\n * runtime gives the same doubles.\n */\nfunction reduced(angleGiven: number): { sine: DoubleDouble; cosine: DoubleDouble } {\n const k = roundHalfToEven(angleGiven / halfPiHigh);\n // k\u00B7halfPiHigh = p + pRest exactly. angle \u2212 p is exact (the two are within a factor of 2 of each\n // other whenever k is not 0), and so is its difference with pRest: both are multiples of 2^-53\n // and the result is below 1. k\u00B7halfPiLow is exact (k is below 2^27, 565 below 2^10), so r is\n // angle \u2212 k\u00B7(halfPiHigh + halfPiLow) to the last bit.\n const p = k * halfPiHigh;\n const pRest = fusedProductError(k, halfPiHigh, -p);\n const r = DoubleDouble.sum(angleGiven - p - pRest, -(k * halfPiLow));\n const r2 = r.times(r);\n const sine = r.times(series(r2, true));\n const cosine = series(r2, false);\n // k is below 2^26 in absolute value, so its low two bits, in two's complement, name the quadrant.\n switch (k & 3) {\n case 0: return { sine, cosine };\n case 1: return { sine: cosine, cosine: sine.negate() };\n case 2: return { sine: sine.negate(), cosine: cosine.negate() };\n default: return { sine: cosine.negate(), cosine: sine };\n }\n}\n\n/** The terms of the series `reduced` sums: enough for |r| up to pi/4, to 2^-110. */\nconst seriesTerms = 14;\n\n/**\n * sin(r)/r (`odd`) or cos(r) from r\u00B2, by Horner's rule: 1 \u2212 r\u00B2/(2\u00B73)\u00B7(1 \u2212 r\u00B2/(4\u00B75)\u00B7(\u2026)) or\n * 1 \u2212 r\u00B2/(1\u00B72)\u00B7(1 \u2212 r\u00B2/(3\u00B74)\u00B7(\u2026)).\n */\nfunction series(r2: DoubleDouble, odd: boolean): DoubleDouble {\n let inner = DoubleDouble.one;\n for (let n = seriesTerms; n >= 1; n--) {\n const denominator = odd ? (2 * n) * (2 * n + 1) : (2 * n - 1) * (2 * n);\n inner = DoubleDouble.one.minus(inner.times(r2).dividedByNumber(denominator));\n }\n return inner;\n}\n\n/**\n * A number held as the unevaluated sum of two doubles, `high` the double nearest it: about 106 bits, enough that\n * rounding it to a double gives the double nearest the true value. The operations are Hida, Li and Bailey's\n * (the QD library's \"accurate\" ones), on the exact error of a product (`fusedProductError`).\n */\nclass DoubleDouble {\n readonly high: number;\n readonly low: number;\n\n constructor(high: number, low: number) {\n this.high = high;\n this.low = low;\n }\n\n static readonly one = new DoubleDouble(1, 0);\n\n /** The double nearest the number. */\n get value(): number {\n return this.high + this.low;\n }\n\n /** a + b exactly (Knuth's TwoSum). */\n static sum(a: number, b: number): DoubleDouble {\n const s = a + b;\n const bb = s - a;\n return new DoubleDouble(s, (a - (s - bb)) + (b - bb));\n }\n\n /** a + b exactly, where |a| \u2265 |b| (Dekker's FastTwoSum). */\n static #quickSum(a: number, b: number): DoubleDouble {\n const s = a + b;\n return new DoubleDouble(s, b - (s - a));\n }\n\n negate(): DoubleDouble {\n return new DoubleDouble(-this.high, -this.low);\n }\n\n plus(b: DoubleDouble): DoubleDouble {\n const s = DoubleDouble.sum(this.high, b.high);\n const t = DoubleDouble.sum(this.low, b.low);\n const u = DoubleDouble.#quickSum(s.high, s.low + t.high);\n return DoubleDouble.#quickSum(u.high, u.low + t.low);\n }\n\n minus(b: DoubleDouble): DoubleDouble {\n return this.plus(b.negate());\n }\n\n times(b: DoubleDouble): DoubleDouble {\n const p1 = this.high * b.high;\n let p2 = fusedProductError(this.high, b.high, -p1);\n p2 += this.high * b.low + this.low * b.high;\n return DoubleDouble.#quickSum(p1, p2);\n }\n\n timesNumber(b: number): DoubleDouble {\n const p1 = this.high * b;\n let p2 = fusedProductError(this.high, b, -p1);\n p2 += this.low * b;\n return DoubleDouble.#quickSum(p1, p2);\n }\n\n dividedByNumber(b: number): DoubleDouble {\n const q1 = this.high / b;\n const p1 = q1 * b;\n const p2 = fusedProductError(q1, b, -p1);\n const se = DoubleDouble.sum(this.high, -p1);\n let e = se.low;\n e -= p2;\n e += this.low;\n const q2 = (se.high + e) / b;\n return DoubleDouble.#quickSum(q1, q2);\n }\n\n dividedBy(b: DoubleDouble): DoubleDouble {\n const q1 = this.high / b.high;\n let r = this.minus(b.timesNumber(q1));\n const q2 = r.high / b.high;\n r = r.minus(b.timesNumber(q2));\n const q3 = r.high / b.high;\n return DoubleDouble.#quickSum(q1, q2).plus(new DoubleDouble(q3, 0));\n }\n}\n\n// ---- COTH, CSCH, SECH ----------------------------------------------------------------------------------------\n\n/** COTH: the hyperbolic cotangent; at 0 `#DIV/0!`. Microsoft documents a limit of 2^27 on the argument, but Excel answers past it: `COTH(2^27)` is 1 (COTH-002). */\nexport function coth(call: FunctionCall): Operand {\n return hyperbolic(call, n => 1 / portable.tanh(n), true);\n}\n\n/** CSCH: 1/SINH; at 0 `#DIV/0!`; past what SINH holds, 0, as Excel's (CSCH-002, CSCH-004). */\nexport function csch(call: FunctionCall): Operand {\n return hyperbolic(call, n => 1 / portable.sinh(n), true);\n}\n\n/** SECH: 1/COSH; past what COSH holds, 0, as Excel's (SECH-003). */\nexport function sech(call: FunctionCall): Operand {\n return hyperbolic(call, n => 1 / portable.cosh(n), false);\n}\n\n/** A hyperbolic function of any number; where it has a pole at 0, 0 is `#DIV/0!`. */\nfunction hyperbolic(call: FunctionCall, fn: (n: number) => number, zeroIsDiv0: boolean): Operand {\n const number = numberArgument(call, 0);\n if (number instanceof Operand) return number;\n if (zeroIsDiv0 && number === 0) return Operand.ofError('#DIV/0!');\n return numberResult(fn(number));\n}\n\n// ---- ASIN, ACOS, ATAN, ATAN2, ACOT ---------------------------------------------------------------------------\n\nconst anyNumber = (): boolean => true;\n\n/** ASIN: a number outside -1 to 1 is `#NUM!`. */\nexport function asin(call: FunctionCall): Operand {\n return bounded(call, n => Math.abs(n) <= 1, portable.asin);\n}\n\n/** ACOS: a number outside -1 to 1 is `#NUM!`. */\nexport function acos(call: FunctionCall): Operand {\n return bounded(call, n => Math.abs(n) <= 1, portable.acos);\n}\n\n/** ATAN: the angle whose tangent is the number. */\nexport function atan(call: FunctionCall): Operand {\n return bounded(call, anyNumber, portable.atan);\n}\n\n/** ACOT: an angle from 0 to pi. */\nexport function acot(call: FunctionCall): Operand {\n return bounded(call, anyNumber, n => Math.PI / 2 - portable.atan(n));\n}\n\n/** ATAN2: the angle of the point (`x_num`, `y_num`), above -pi and up to pi. Excel takes x first, the reverse of `Math.atan2`. Both 0 is `#DIV/0!`, as documented. */\nexport function atan2(call: FunctionCall): Operand {\n const x = numberArgument(call, 0);\n if (x instanceof Operand) return x;\n const y = numberArgument(call, 1);\n if (y instanceof Operand) return y;\n if (x === 0 && y === 0) return Operand.ofError('#DIV/0!');\n return numberResult(portable.atan2(y, x));\n}\n\n// ---- SINH, COSH, TANH, ASINH, ACOSH, ATANH, ACOTH ------------------------------------------------------------\n\n/** SINH: past what a double holds, `#NUM!`. */\nexport function sinh(call: FunctionCall): Operand {\n return bounded(call, anyNumber, portable.sinh);\n}\n\n/** COSH: past what a double holds, `#NUM!`. */\nexport function cosh(call: FunctionCall): Operand {\n return bounded(call, anyNumber, portable.cosh);\n}\n\n/** TANH: the hyperbolic tangent. */\nexport function tanh(call: FunctionCall): Operand {\n return bounded(call, anyNumber, portable.tanh);\n}\n\n/** ASINH: the inverse hyperbolic sine. */\nexport function asinh(call: FunctionCall): Operand {\n return bounded(call, anyNumber, portable.asinh);\n}\n\n/** ACOSH: a number below 1 is `#NUM!`. */\nexport function acosh(call: FunctionCall): Operand {\n return bounded(call, n => n >= 1, portable.acosh);\n}\n\n/** ATANH: a number not strictly between -1 and 1 is `#NUM!`. */\nexport function atanh(call: FunctionCall): Operand {\n return bounded(call, n => Math.abs(n) < 1, portable.atanh);\n}\n\n/**\n * ACOTH: \u00BD\u00B7ln((x+1)/(x\u22121)), for an absolute value above 1. Microsoft's page names both `#NUM!` and `#VALUE!` for\n * a smaller one; Excel gives `#NUM!` (ACOTH-003, observed by the seventeenth Windows run).\n */\nexport function acoth(call: FunctionCall): Operand {\n return bounded(call, n => Math.abs(n) > 1, n => 0.5 * portable.log((n + 1) / (n - 1)));\n}\n\n// ---- DEGREES, RADIANS ----------------------------------------------------------------------------------------\n\n/** DEGREES: radians to degrees. */\nexport function degrees(call: FunctionCall): Operand {\n return bounded(call, anyNumber, n => n * 180 / Math.PI);\n}\n\n/** RADIANS: degrees to radians. */\nexport function radians(call: FunctionCall): Operand {\n return bounded(call, anyNumber, n => n * Math.PI / 180);\n}\n\n/** A function of one number, `#NUM!` where `inDomain` refuses it or the result is not finite. */\nfunction bounded(call: FunctionCall, inDomain: (n: number) => boolean, fn: (n: number) => number): Operand {\n const number = numberArgument(call, 0);\n if (number instanceof Operand) return number;\n return inDomain(number) ? numberResult(fn(number)) : Operand.ofError('#NUM!');\n}\n", "// The declared set of functions (ADR-0047; C#'s FunctionLibrary.cs and the declarations of Functions.cs): ADR-0047's\n// first list, and the functions admitted after it (docs/specs/exsheet-functions/spec.md). Each function is\n// written to Microsoft's documented behaviour for it: how it treats blanks, text, booleans and Error Values typed\n// as arguments and found inside ranges, and its rounding. Where ExSheet cannot give Excel's answer \u2014 a result\n// that would spill an array, XLOOKUP's binary search over data it cannot show to be sorted \u2014 it gives an Error\n// Value instead of another answer. A name outside the set is `#NAME?`.\nimport { compareOrdinal, ignoreCaseKey } from '../dotnet';\nimport { type FunctionCall, FunctionDefinition, type ThreeDArgument } from './function-definition';\nimport type { Operand } from './operand';\nimport * as arrays from './functions/arrays';\nimport * as core from './functions/core';\nimport * as criteria from './functions/criteria';\nimport * as dates from './functions/dates';\nimport * as financial from './functions/financial';\nimport * as logic from './functions/logic';\nimport * as lookup from './functions/lookup';\nimport * as math from './functions/math';\nimport * as subtotal from './functions/subtotal';\nimport * as text from './functions/text';\nimport * as trigonometry from './functions/trigonometry';\n\n/** The most arguments an open-ended function takes: Excel's limit. */\nconst open = 255;\n\n// threeD: what a 3D Reference given as each argument is to the function, as Excel answered for every\n// function ExSheet declares (ADR-0331 \u00A77; verification/2026-10-24-windows-workbook-12). One left out\n// reads it as one Value at every argument: #REF!.\nconst across = (): ThreeDArgument => 'range';\n\nconst acrossFirst = (index: number): ThreeDArgument => index === 0 ? 'range' : 'value';\n\nconst acrossSecond = (index: number): ThreeDArgument => index === 1 ? 'range' : 'value';\n\n// TEXTJOIN reads its delimiters across a span, and its texts; ignore_empty is one Value.\nconst acrossTexts = (index: number): ThreeDArgument => index === 1 ? 'value' : 'range';\n\n// IF's and CHOOSE's values, and IFERROR's and IFNA's fallback.\nconst handedOnAfterFirst = (index: number): ThreeDArgument => index === 0 ? 'value' : 'handOn';\n\nconst ifsValues = (index: number): ThreeDArgument => index % 2 === 1 ? 'valueError' : 'value';\n\n// SWITCH's results stand after each value, and its default last, after the expression and its pairs.\nconst switchResults = (index: number, count: number): ThreeDArgument =>\n (index >= 2 && index % 2 === 0) || (count % 2 === 0 && index === count - 1) ? 'valueError' : 'value';\n\nconst oneSheetFirst = (index: number): ThreeDArgument => index === 0 ? 'oneSheet' : 'value';\n\nconst oneSheetSecond = (index: number): ThreeDArgument => index === 1 ? 'oneSheet' : 'value';\n\nconst oneSheetFirstTwo = (index: number): ThreeDArgument => index <= 1 ? 'oneSheet' : 'value';\n\n// SUMIF's and AVERAGEIF's range and result range; their criterion is one Value.\nconst oneSheetCriteria = (index: number): ThreeDArgument => index !== 1 ? 'oneSheet' : 'value';\n\n// SUMIFS and its partners: the result range, then each criteria range before its criterion.\nconst oneSheetResultAndCriteria = (index: number): ThreeDArgument => index === 0 || index % 2 === 1 ? 'oneSheet' : 'value';\n\nconst oneSheetCountCriteria = (index: number): ThreeDArgument => index % 2 === 0 ? 'oneSheet' : 'value';\n\n// VLOOKUP's and HLOOKUP's table and the index after it.\nconst oneSheetTable = (index: number): ThreeDArgument => index === 1 || index === 2 ? 'oneSheet' : 'value';\n\n// MATCH's array, and its match_type, which is #VALUE! where XMATCH's modes are #REF!.\nconst matchArguments = (index: number): ThreeDArgument => index === 1 ? 'oneSheet' : index === 2 ? 'valueError' : 'value';\n\n// XLOOKUP's arrays, and its if_not_found, #VALUE! only where it is read.\nconst xLookupArguments = (index: number): ThreeDArgument => index === 1 || index === 2 ? 'oneSheet' : index === 3 ? 'valueError' : 'value';\n\nconst oneSheetAfterFirst = (index: number): ThreeDArgument => index >= 1 ? 'oneSheet' : 'value';\n\nconst oneSheetAfterSecond = (index: number): ThreeDArgument => index >= 2 ? 'oneSheet' : 'value';\n\nconst valueErrorEverywhere = (): ThreeDArgument => 'valueError';\n\n/** ROUNDUP: away from zero. */\nfunction roundUp(call: FunctionCall): Operand {\n return core.roundBy(call, 'awayFromZero');\n}\n\n/** ROUNDDOWN: toward zero. */\nfunction roundDown(call: FunctionCall): Operand {\n return core.roundBy(call, 'towardZero');\n}\n\n/**\n * The declarations, made when first asked for: the function modules import the evaluator, which imports the\n * parser, which reads this table, so building it as the module loads would read a module not yet evaluated.\n */\nfunction declare(): FunctionDefinition[] {\n return [\n new FunctionDefinition('SUM', 1, open, 'number1, [number2], ...', 'Adds its arguments.', core.sum, { threeD: across }),\n new FunctionDefinition('AVERAGE', 1, open, 'number1, [number2], ...', 'Returns the average (arithmetic mean) of its arguments.', core.average, { threeD: across }),\n new FunctionDefinition('MIN', 1, open, 'number1, [number2], ...', 'Returns the smallest number in a set of values.', core.min, { threeD: across }),\n new FunctionDefinition('MAX', 1, open, 'number1, [number2], ...', 'Returns the largest number in a set of values.', core.max, { threeD: across }),\n new FunctionDefinition('COUNT', 1, open, 'value1, [value2], ...', 'Counts how many numbers are in the list of arguments.', core.count, { threeD: across }),\n new FunctionDefinition('COUNTA', 1, open, 'value1, [value2], ...', 'Counts how many values are in the list of arguments.', core.countA, { threeD: across }),\n new FunctionDefinition('SUMIF', 2, 3, 'range, criteria, [sum_range]', 'Adds numbers whose corresponding cells meet a condition.', criteria.sumIf, { threeD: oneSheetCriteria }),\n new FunctionDefinition('SUMIFS', 3, open, 'sum_range, criteria_range1, criteria1, ...', 'Adds numbers whose corresponding cells meet every condition.', criteria.sumIfs, { threeD: oneSheetResultAndCriteria, inPairs: true, pairOffset: 1 }),\n new FunctionDefinition('COUNTIF', 2, 2, 'range, criteria', 'Counts cells that meet a condition.', criteria.countIf, { threeD: oneSheetFirst }),\n new FunctionDefinition('COUNTIFS', 2, 254, 'criteria_range1, criteria1, ...', 'Counts cells that meet every condition.', criteria.countIfs, { threeD: oneSheetCountCriteria, inPairs: true }),\n new FunctionDefinition('AVERAGEIF', 2, 3, 'range, criteria, [average_range]', 'Averages numbers whose corresponding cells meet a condition.', criteria.averageIf, { threeD: oneSheetCriteria }),\n new FunctionDefinition('AVERAGEIFS', 3, open, 'average_range, criteria_range1, criteria1, ...', 'Averages numbers whose corresponding cells meet every condition.', criteria.averageIfs, { threeD: oneSheetResultAndCriteria, inPairs: true, pairOffset: 1 }),\n new FunctionDefinition('MAXIFS', 3, open, 'max_range, criteria_range1, criteria1, ...', 'Returns the greatest number whose corresponding cells meet every condition.', criteria.maxIfs, { threeD: oneSheetResultAndCriteria, inPairs: true, pairOffset: 1 }),\n new FunctionDefinition('MINIFS', 3, open, 'min_range, criteria_range1, criteria1, ...', 'Returns the least number whose corresponding cells meet every condition.', criteria.minIfs, { threeD: oneSheetResultAndCriteria, inPairs: true, pairOffset: 1 }),\n new FunctionDefinition('COUNTBLANK', 1, 1, 'range', 'Counts blank cells and cells whose formulas return empty text.', criteria.countBlank, { threeD: oneSheetFirst }),\n new FunctionDefinition('IF', 2, 3, 'logical_test, value_if_true, [value_if_false]', 'Returns one value if a condition is TRUE and another if it is FALSE.', core.ifFunction, { threeD: handedOnAfterFirst, returnsReference: true }),\n new FunctionDefinition('ROUND', 2, 2, 'number, num_digits', 'Rounds a number to a specified number of digits, half away from zero.', core.round),\n new FunctionDefinition('IFERROR', 2, 2, 'value, value_if_error', 'Returns value_if_error if value is an Error Value, and value otherwise. #GETTING_DATA is not an error to it.', core.ifError, { threeD: handedOnAfterFirst }),\n new FunctionDefinition('ISERROR', 1, 1, 'value', 'Returns TRUE if value is an Error Value. #GETTING_DATA is not an error to it.', core.isError),\n new FunctionDefinition('AND', 1, open, 'logical1, [logical2], ...', 'Returns TRUE if all of its arguments are TRUE.', logic.and, { threeD: across }),\n new FunctionDefinition('OR', 1, open, 'logical1, [logical2], ...', 'Returns TRUE if any argument is TRUE.', logic.or, { threeD: across }),\n new FunctionDefinition('NOT', 1, 1, 'logical', 'Reverses the logic of its argument.', logic.not),\n new FunctionDefinition('IFNA', 2, 2, 'value, value_if_na', 'Returns value_if_na if value is #N/A, and value otherwise.', logic.ifNa, { threeD: handedOnAfterFirst }),\n new FunctionDefinition('ISBLANK', 1, 1, 'value', 'Returns TRUE if value refers to an empty cell.', logic.isBlank),\n new FunctionDefinition('ISNUMBER', 1, 1, 'value', 'Returns TRUE if value is a number.', logic.isNumber),\n new FunctionDefinition('ROUNDUP', 2, 2, 'number, num_digits', 'Rounds a number up, away from zero.', roundUp),\n new FunctionDefinition('ROUNDDOWN', 2, 2, 'number, num_digits', 'Rounds a number down, toward zero.', roundDown),\n new FunctionDefinition('ABS', 1, 1, 'number', 'Returns the absolute value of a number.', math.abs),\n new FunctionDefinition('INT', 1, 1, 'number', 'Rounds a number down to the nearest integer.', math.int),\n new FunctionDefinition('CEILING.MATH', 1, 3, 'number, [significance], [mode]', 'Rounds a number up to a multiple of significance.', math.ceilingMath),\n new FunctionDefinition('FLOOR.MATH', 1, 3, 'number, [significance], [mode]', 'Rounds a number down to a multiple of significance.', math.floorMath),\n new FunctionDefinition('MROUND', 2, 2, 'number, multiple', 'Rounds a number to a whole-number multiple; fractional multiples are refused.', math.mRound, { threeD: valueErrorEverywhere }),\n new FunctionDefinition('YEARFRAC', 2, 3, 'start_date, end_date, [basis]',\n 'Returns the year fraction represented by the whole days between two dates.',\n dates.yearFrac, {\n threeD: valueErrorEverywhere,\n values: {\n 2: [\n { value: '0', text: '0 - US (NASD) 30/360' },\n { value: '1', text: '1 - Actual/actual' },\n { value: '2', text: '2 - Actual/360' },\n { value: '3', text: '3 - Actual/365' },\n { value: '4', text: '4 - European 30/360' },\n ],\n },\n }),\n new FunctionDefinition('DATEDIF', 3, 3, 'start_date, end_date, unit', 'Returns the difference between two dates in whole years, months or days.', dates.dateDif),\n new FunctionDefinition('MOD', 2, 2, 'number, divisor', 'Returns the remainder from division, with the sign of the divisor.', math.mod),\n new FunctionDefinition('DATE', 3, 3, 'year, month, day', 'Returns the serial number of a particular date.', dates.dateFunction),\n new FunctionDefinition('TODAY', 0, 0, '', 'Returns the serial number of today\\'s date: the Sheet Day.', dates.today),\n new FunctionDefinition('YEAR', 1, 1, 'serial_number', 'Converts a serial number to a year.', dates.yearFunction),\n new FunctionDefinition('MONTH', 1, 1, 'serial_number', 'Converts a serial number to a month.', dates.monthFunction),\n new FunctionDefinition('DAY', 1, 1, 'serial_number', 'Converts a serial number to a day of the month.', dates.dayFunction),\n new FunctionDefinition('EOMONTH', 2, 2, 'start_date, months', 'Returns the serial number of the last day of the month before or after a specified number of months.', dates.eoMonth, { threeD: valueErrorEverywhere }),\n new FunctionDefinition('EDATE', 2, 2, 'start_date, months', 'Returns the serial number of the date that is the indicated number of months before or after the start date.', dates.eDate, { threeD: valueErrorEverywhere }),\n new FunctionDefinition('LEFT', 1, 2, 'text, [num_chars]', 'Returns the leftmost characters from a text value.', text.left),\n new FunctionDefinition('RIGHT', 1, 2, 'text, [num_chars]', 'Returns the rightmost characters from a text value.', text.right),\n new FunctionDefinition('MID', 3, 3, 'text, start_num, num_chars', 'Returns a specific number of characters from a text string, starting at the position you specify.', text.mid),\n new FunctionDefinition('LEN', 1, 1, 'text', 'Returns the number of characters in a text string.', text.len),\n new FunctionDefinition('TRIM', 1, 1, 'text', 'Removes spaces from text, leaving single spaces between words.', text.trim),\n new FunctionDefinition('TEXT', 2, 2, 'value, format_text', 'Formats a number and converts it to text.', text.formatAsText),\n new FunctionDefinition('CONCAT', 1, 253, 'text1, [text2], ...', 'Combines the text from multiple ranges and strings.', text.concat, { threeD: across }),\n new FunctionDefinition('VLOOKUP', 3, 4, 'lookup_value, table_array, col_index_num, [range_lookup]',\n 'Searches the first column of a table and returns the value in the specified column of the matching row.',\n lookup.vLookup, {\n threeD: oneSheetTable,\n values: {\n 3: [\n { value: 'TRUE', text: 'TRUE - Approximate match' },\n { value: 'FALSE', text: 'FALSE - Exact match' },\n ],\n },\n }),\n new FunctionDefinition('HLOOKUP', 3, 4, 'lookup_value, table_array, row_index_num, [range_lookup]',\n 'Searches the first row of a table and returns the value in the specified row of the matching column.',\n lookup.hLookup, {\n threeD: oneSheetTable,\n values: {\n 3: [\n { value: 'TRUE', text: 'TRUE - Approximate match' },\n { value: 'FALSE', text: 'FALSE - Exact match' },\n ],\n },\n }),\n new FunctionDefinition('MATCH', 2, 3, 'lookup_value, lookup_array, [match_type]',\n 'Returns the relative position of an item in an array or range of cells.',\n lookup.matchFunction, {\n threeD: matchArguments,\n values: {\n 2: [\n { value: '1', text: '1 - Less than' },\n { value: '0', text: '0 - Exact match' },\n { value: '-1', text: '-1 - Greater than' },\n ],\n },\n }),\n new FunctionDefinition('INDEX', 2, 3, 'array, row_num, [column_num]', 'Returns the value of the cell at the intersection of a row and a column of a range.', lookup.indexFunction, { threeD: oneSheetFirst, returnsReference: true }),\n new FunctionDefinition('PRODUCT', 1, open, 'number1, [number2], ...', 'Multiplies its arguments.', math.product, { threeD: across }),\n new FunctionDefinition('MEDIAN', 1, open, 'number1, [number2], ...', 'Returns the median of the given numbers.', math.median, { threeD: across }),\n new FunctionDefinition('LARGE', 2, 2, 'array, k', 'Returns the k-th largest value in a data set.', math.large, { threeD: acrossFirst }),\n new FunctionDefinition('SMALL', 2, 2, 'array, k', 'Returns the k-th smallest value in a data set.', math.small, { threeD: acrossFirst }),\n new FunctionDefinition('ISTEXT', 1, 1, 'value', 'Returns TRUE if value is text.', logic.isText),\n new FunctionDefinition('ISNA', 1, 1, 'value', 'Returns TRUE if value is the #N/A error value.', logic.isNa),\n new FunctionDefinition('IFS', 2, 254, 'logical_test1, value_if_true1, ...', 'Checks whether one or more conditions are met, and returns a value that corresponds to the first TRUE condition.', logic.ifs, { threeD: ifsValues, inPairs: true, returnsReference: true }),\n new FunctionDefinition('SWITCH', 3, 254, 'expression, value1, result1, [default_or_value2], [result2], ...', 'Evaluates an expression against a list of values, and returns the result corresponding to the first matching value.', logic.switchFunction, { threeD: switchResults, returnsReference: true }),\n new FunctionDefinition('NA', 0, 0, '', 'Returns the error value #N/A.', logic.na),\n new FunctionDefinition('ERROR.TYPE', 1, 1, 'error_val', 'Returns a number corresponding to an error type.', logic.errorType),\n new FunctionDefinition('XMATCH', 2, 4, 'lookup_value, lookup_array, [match_mode], [search_mode]', 'Returns the relative position of an item in an array or range of cells.', lookup.xMatch, { threeD: oneSheetSecond }),\n new FunctionDefinition('CHOOSE', 2, open, 'index_num, value1, [value2], ...', 'Chooses a value from a list of values.', lookup.choose, { threeD: handedOnAfterFirst, returnsReference: true }),\n new FunctionDefinition('ROW', 0, 1, '[reference]', 'Returns the row number of a reference.', lookup.rowFunction, { threeD: oneSheetFirst }),\n new FunctionDefinition('COLUMN', 0, 1, '[reference]', 'Returns the column number of a reference.', lookup.columnFunction, { threeD: oneSheetFirst }),\n new FunctionDefinition('TRUNC', 1, 2, 'number, [num_digits]', 'Truncates a number to an integer, or to num_digits.', math.trunc),\n new FunctionDefinition('POWER', 2, 2, 'number, power', 'Returns the result of a number raised to a power.', math.power),\n new FunctionDefinition('SQRT', 1, 1, 'number', 'Returns a positive square root.', math.sqrt),\n new FunctionDefinition('WEEKDAY', 1, 2, 'serial_number, [return_type]', 'Converts a serial number to a day of the week.', dates.weekday),\n new FunctionDefinition('DAYS', 2, 2, 'end_date, start_date', 'Returns the number of days between two dates.', dates.daysFunction),\n new FunctionDefinition('NETWORKDAYS', 2, 3, 'start_date, end_date, [holidays]', 'Returns the number of whole workdays between two dates.', dates.networkDays, { threeD: valueErrorEverywhere }),\n new FunctionDefinition('WORKDAY', 2, 3, 'start_date, days, [holidays]', 'Returns the serial number of the date before or after a specified number of workdays.', dates.workday, { threeD: valueErrorEverywhere }),\n new FunctionDefinition('TEXTJOIN', 3, 252, 'delimiter, ignore_empty, text1, [text2], ...', 'Combines the text from multiple ranges and strings, with a delimiter between each value.', text.textJoin, { threeD: acrossTexts }),\n new FunctionDefinition('CONCATENATE', 1, open, 'text1, [text2], ...', 'Joins several text items into one text item.', text.concatenate),\n new FunctionDefinition('SUBSTITUTE', 3, 4, 'text, old_text, new_text, [instance_num]', 'Substitutes new text for old text in a text string.', text.substitute),\n new FunctionDefinition('REPLACE', 4, 4, 'old_text, start_num, num_chars, new_text', 'Replaces characters within text.', text.replace),\n new FunctionDefinition('LOWER', 1, 1, 'text', 'Converts text to lowercase.', text.lower),\n new FunctionDefinition('PROPER', 1, 1, 'text', 'Capitalizes the first letter of each word.', text.proper),\n new FunctionDefinition('SEARCH', 2, 3, 'find_text, within_text, [start_num]', 'Finds one text value within another, ignoring case and accepting wildcards.', text.searchText),\n new FunctionDefinition('UPPER', 1, 1, 'text', 'Converts text to uppercase.', text.upper),\n new FunctionDefinition('FIND', 2, 3, 'find_text, within_text, [start_num]', 'Finds one text value within another, case-sensitive.', text.find),\n new FunctionDefinition('PMT', 3, 5, 'rate, nper, pv, [fv], [type]', 'Returns the periodic payment for an annuity.', financial.pmt),\n new FunctionDefinition('PV', 3, 5, 'rate, nper, pmt, [fv], [type]', 'Returns the present value of an investment.', financial.pv),\n new FunctionDefinition('FV', 3, 5, 'rate, nper, pmt, [pv], [type]', 'Returns the future value of an investment.', financial.fv),\n new FunctionDefinition('RANK.EQ', 2, 3, 'number, ref, [order]', 'Returns the rank of a number in a list of numbers.', math.rankEq, { threeD: acrossSecond, referenceOnly: { first: 1, last: 1 } }),\n new FunctionDefinition('STDEV.S', 1, open, 'number1, [number2], ...', 'Estimates standard deviation based on a sample.', math.stdevS, { threeD: across }),\n new FunctionDefinition('STDEV.P', 1, open, 'number1, [number2], ...', 'Calculates standard deviation based on the entire population.', math.stdevP, { threeD: across }),\n new FunctionDefinition('VAR.S', 1, open, 'number1, [number2], ...', 'Estimates variance based on a sample.', math.varS, { threeD: across }),\n new FunctionDefinition('VAR.P', 1, open, 'number1, [number2], ...', 'Calculates variance based on the entire population.', math.varP, { threeD: across }),\n new FunctionDefinition('XOR', 1, open, 'logical1, [logical2], ...', 'Returns TRUE if an odd number of its arguments are TRUE.', logic.xor, { threeD: across }),\n new FunctionDefinition('SUBTOTAL', 2, open, 'function_num, ref1, [ref2], ...',\n 'Returns a subtotal in a list or database.',\n subtotal.subtotal, {\n threeD: oneSheetAfterFirst,\n referenceOnly: { first: 1, last: open - 1 },\n values: {\n 0: [\n { value: '1', text: '1 - AVERAGE' },\n { value: '2', text: '2 - COUNT' },\n { value: '3', text: '3 - COUNTA' },\n { value: '4', text: '4 - MAX' },\n { value: '5', text: '5 - MIN' },\n { value: '6', text: '6 - PRODUCT' },\n { value: '7', text: '7 - STDEV.S' },\n { value: '8', text: '8 - STDEV.P' },\n { value: '9', text: '9 - SUM' },\n { value: '10', text: '10 - VAR.S' },\n { value: '11', text: '11 - VAR.P' },\n { value: '101', text: '101 - AVERAGE' },\n { value: '102', text: '102 - COUNT' },\n { value: '103', text: '103 - COUNTA' },\n { value: '104', text: '104 - MAX' },\n { value: '105', text: '105 - MIN' },\n { value: '106', text: '106 - PRODUCT' },\n { value: '107', text: '107 - STDEV.S' },\n { value: '108', text: '108 - STDEV.P' },\n { value: '109', text: '109 - SUM' },\n { value: '110', text: '110 - VAR.S' },\n { value: '111', text: '111 - VAR.P' },\n ],\n },\n }),\n new FunctionDefinition('AGGREGATE', 3, open, 'function_num, options, ref1, [ref2], ...',\n 'Returns an aggregate in a list or database.',\n subtotal.aggregate, {\n threeD: oneSheetAfterSecond,\n referenceOnly: { first: 4, last: open - 1 },\n values: {\n 0: [\n { value: '1', text: '1 - AVERAGE' },\n { value: '2', text: '2 - COUNT' },\n { value: '3', text: '3 - COUNTA' },\n { value: '4', text: '4 - MAX' },\n { value: '5', text: '5 - MIN' },\n { value: '6', text: '6 - PRODUCT' },\n { value: '7', text: '7 - STDEV.S' },\n { value: '8', text: '8 - STDEV.P' },\n { value: '9', text: '9 - SUM' },\n { value: '10', text: '10 - VAR.S' },\n { value: '11', text: '11 - VAR.P' },\n { value: '12', text: '12 - MEDIAN' },\n { value: '14', text: '14 - LARGE' },\n { value: '15', text: '15 - SMALL' },\n ],\n 1: [\n { value: '0', text: '0 - Ignore nested SUBTOTAL and AGGREGATE functions' },\n { value: '1', text: '1 - Ignore hidden rows, nested SUBTOTAL and AGGREGATE functions' },\n { value: '2', text: '2 - Ignore error values, nested SUBTOTAL and AGGREGATE functions' },\n { value: '3', text: '3 - Ignore hidden rows, error values, nested SUBTOTAL and AGGREGATE functions' },\n { value: '4', text: '4 - Ignore nothing' },\n { value: '5', text: '5 - Ignore hidden rows' },\n { value: '6', text: '6 - Ignore error values' },\n { value: '7', text: '7 - Ignore hidden rows and error values' },\n ],\n },\n }),\n new FunctionDefinition('ROWS', 1, 1, 'array', 'Returns the number of rows in a reference.', lookup.rowsFunction, { threeD: oneSheetFirst }),\n new FunctionDefinition('COLUMNS', 1, 1, 'array', 'Returns the number of columns in a reference.', lookup.columnsFunction, { threeD: oneSheetFirst }),\n new FunctionDefinition('SIGN', 1, 1, 'number', 'Returns the sign of a number: 1, 0 or -1.', math.signFunction),\n new FunctionDefinition('EXP', 1, 1, 'number', 'Returns e raised to the power of a given number.', math.exp),\n new FunctionDefinition('LN', 1, 1, 'number', 'Returns the natural logarithm of a number.', math.ln),\n new FunctionDefinition('LOG10', 1, 1, 'number', 'Returns the base-10 logarithm of a number.', math.log10),\n new FunctionDefinition('PI', 0, 0, '', 'Returns the value of pi.', math.pi),\n new FunctionDefinition('TIME', 3, 3, 'hour, minute, second', 'Returns the serial number of a particular time.', dates.time),\n new FunctionDefinition('HOUR', 1, 1, 'serial_number', 'Converts a serial number to an hour.', dates.hourFunction),\n new FunctionDefinition('MINUTE', 1, 1, 'serial_number', 'Converts a serial number to a minute.', dates.minuteFunction),\n new FunctionDefinition('SECOND', 1, 1, 'serial_number', 'Converts a serial number to a second.', dates.secondFunction),\n new FunctionDefinition('REPT', 2, 2, 'text, number_times', 'Repeats text a given number of times.', text.rept),\n new FunctionDefinition('EXACT', 2, 2, 'text1, text2', 'Checks to see if two text values are identical, case-sensitive.', text.exact),\n new FunctionDefinition('NUMBERVALUE', 1, 3, 'text, [decimal_separator], [group_separator]', 'Converts text to a number with the separators given.', text.numberValue),\n new FunctionDefinition('XNPV', 3, 3, 'rate, values, dates', 'Returns the net present value for a schedule of cash flows that is not necessarily periodic.', financial.xNpv, { threeD: valueErrorEverywhere }),\n new FunctionDefinition('VALUE', 1, 1, 'text', 'Converts a text argument to a number, read under the Sheet\\'s culture.', text.valueOf),\n new FunctionDefinition('NOW', 0, 0, '', 'Returns the serial number of the current date and time.', dates.now),\n new FunctionDefinition('RAND', 0, 0, '', 'Returns a random number from 0 up to 1, drawn from the Sheet Seed.', math.rand),\n new FunctionDefinition('RANDBETWEEN', 2, 2, 'bottom, top', 'Returns a random whole number between the numbers you specify, drawn from the Sheet Seed.', math.randBetween, { threeD: valueErrorEverywhere }),\n new FunctionDefinition('OFFSET', 3, 5, 'reference, rows, cols, [height], [width]', 'Returns a reference offset from a given reference.', lookup.offset, { threeD: oneSheetFirst, returnsReference: true }),\n new FunctionDefinition('INDIRECT', 1, 2, 'ref_text, [a1]', 'Returns a reference indicated by a text value.', lookup.indirect, { returnsReference: true }),\n new FunctionDefinition('FILTER', 2, 3, 'array, include, [if_empty]', 'Filters a range of data based on criteria you define.', arrays.filter, { threeD: oneSheetFirstTwo }),\n new FunctionDefinition('UNIQUE', 1, 3, 'array, [by_col], [exactly_once]', 'Returns a list of unique values in a list or range.', arrays.unique),\n new FunctionDefinition('SORT', 1, 4, 'array, [sort_index], [sort_order], [by_col]', 'Sorts the contents of a range or array.', arrays.sort),\n new FunctionDefinition('SORTBY', 2, open, 'array, by_array1, [sort_order1], ...', 'Sorts the contents of a range or array based on the values in a corresponding range or array.', arrays.sortBy),\n new FunctionDefinition('SEQUENCE', 1, 4, 'rows, [columns], [start], [step]', 'Generates a list of sequential numbers in an array.', arrays.sequence),\n new FunctionDefinition('TRANSPOSE', 1, 1, 'array', 'Returns the transpose of an array.', arrays.transpose),\n new FunctionDefinition('LET', 3, 253, 'name1, name_value1, calculation_or_name2, [name_value2, calculation_or_name3...]', 'Assigns names to calculation results, to be used inside the Formula.', logic.letFunction, { returnsReference: true }),\n new FunctionDefinition('SUMPRODUCT', 1, open, 'array1, [array2], ...', 'Returns the sum of the products of corresponding array components.', arrays.sumProduct),\n new FunctionDefinition('LOG', 1, 2, 'number, [base]', 'Returns the logarithm of a number to the base you specify.', trigonometry.log),\n new FunctionDefinition('SIN', 1, 1, 'number', 'Returns the sine of an angle.', trigonometry.sin),\n new FunctionDefinition('COS', 1, 1, 'number', 'Returns the cosine of an angle.', trigonometry.cos),\n new FunctionDefinition('TAN', 1, 1, 'number', 'Returns the tangent of an angle.', trigonometry.tan),\n new FunctionDefinition('COT', 1, 1, 'number', 'Returns the cotangent of an angle.', trigonometry.cot),\n new FunctionDefinition('CSC', 1, 1, 'number', 'Returns the cosecant of an angle.', trigonometry.csc),\n new FunctionDefinition('SEC', 1, 1, 'number', 'Returns the secant of an angle.', trigonometry.sec),\n new FunctionDefinition('ASIN', 1, 1, 'number', 'Returns the arcsine of a number.', trigonometry.asin),\n new FunctionDefinition('ACOS', 1, 1, 'number', 'Returns the arccosine of a number.', trigonometry.acos),\n new FunctionDefinition('ATAN', 1, 1, 'number', 'Returns the arctangent of a number.', trigonometry.atan),\n new FunctionDefinition('ATAN2', 2, 2, 'x_num, y_num', 'Returns the arctangent from x- and y-coordinates.', trigonometry.atan2),\n new FunctionDefinition('ACOT', 1, 1, 'number', 'Returns the arccotangent of a number.', trigonometry.acot),\n new FunctionDefinition('SINH', 1, 1, 'number', 'Returns the hyperbolic sine of a number.', trigonometry.sinh),\n new FunctionDefinition('COSH', 1, 1, 'number', 'Returns the hyperbolic cosine of a number.', trigonometry.cosh),\n new FunctionDefinition('TANH', 1, 1, 'number', 'Returns the hyperbolic tangent of a number.', trigonometry.tanh),\n new FunctionDefinition('COTH', 1, 1, 'number', 'Returns the hyperbolic cotangent of a number.', trigonometry.coth),\n new FunctionDefinition('CSCH', 1, 1, 'number', 'Returns the hyperbolic cosecant of an angle.', trigonometry.csch),\n new FunctionDefinition('SECH', 1, 1, 'number', 'Returns the hyperbolic secant of an angle.', trigonometry.sech),\n new FunctionDefinition('ASINH', 1, 1, 'number', 'Returns the inverse hyperbolic sine of a number.', trigonometry.asinh),\n new FunctionDefinition('ACOSH', 1, 1, 'number', 'Returns the inverse hyperbolic cosine of a number.', trigonometry.acosh),\n new FunctionDefinition('ATANH', 1, 1, 'number', 'Returns the inverse hyperbolic tangent of a number.', trigonometry.atanh),\n new FunctionDefinition('ACOTH', 1, 1, 'number', 'Returns the hyperbolic arccotangent of a number.', trigonometry.acoth),\n new FunctionDefinition('DEGREES', 1, 1, 'angle', 'Converts radians to degrees.', trigonometry.degrees),\n new FunctionDefinition('RADIANS', 1, 1, 'angle', 'Converts degrees to radians.', trigonometry.radians),\n new FunctionDefinition('XLOOKUP', 3, 6, 'lookup_value, lookup_array, return_array, [if_not_found], [match_mode], [search_mode]',\n 'Searches a range for a match and returns the corresponding item of a second range.',\n lookup.xLookup, {\n threeD: xLookupArguments,\n returnsReference: true,\n values: {\n 4: [\n { value: '0', text: '0 - Exact match' },\n { value: '-1', text: '-1 - Exact match or next smaller item' },\n { value: '1', text: '1 - Exact match or next larger item' },\n { value: '2', text: '2 - Wildcard character match' },\n { value: '3', text: '3 - Regex match' },\n ],\n 5: [\n { value: '1', text: '1 - Search first-to-last' },\n { value: '-1', text: '-1 - Search last-to-first' },\n { value: '2', text: '2 - Binary search (sorted ascending order)' },\n { value: '-2', text: '-2 - Binary search (sorted descending order)' },\n ],\n },\n }),\n ];\n}\n\nlet byName: ReadonlyMap<string, FunctionDefinition> | undefined;\n\nfunction table(): ReadonlyMap<string, FunctionDefinition> {\n byName ??= new Map(declare().map(f => [ignoreCaseKey(f.name), f]));\n return byName;\n}\n\n/** The declared function of a name, read without regard to case; `undefined` for a name outside the set. */\nexport function findFunction(name: string): FunctionDefinition | undefined {\n return table().get(ignoreCaseKey(name));\n}\n\n/** Every declared function, in the ordinal order of its name. */\nexport function allFunctions(): readonly FunctionDefinition[] {\n return [...table().values()].toSorted((a, b) => compareOrdinal(a.name, b.name));\n}\n", "// The declared set of functions as the typing aids see it (C#'s DeclaredFunction.cs; ADR-0047, ADR-0051, ADR-0058).\nimport type { ArgumentValue } from './formulas/function-definition';\nimport { allFunctions, findFunction } from './formulas/function-library';\n\n/**\n * A function of the declared set (ADR-0047): each gives Excel's result, and a name outside the set is `#NAME?`.\n * What completion offers and what the argument hint shows (ADR-0051).\n */\nexport class DeclaredFunction {\n /** The name in upper case, such as `SUM`. */\n readonly name: string;\n\n /** The argument list as Excel documents it, optional ones in brackets: `number1, [number2], ...`. */\n readonly arguments: string;\n\n /** One sentence saying what it returns. */\n readonly description: string;\n\n static #all: readonly DeclaredFunction[] | undefined;\n\n private constructor(name: string, args: string, description: string) {\n this.name = name;\n this.arguments = args;\n this.description = description;\n }\n\n /** Every function the engine declares, in alphabetical order. */\n static get all(): readonly DeclaredFunction[] {\n DeclaredFunction.#all ??= allFunctions().map(f => new DeclaredFunction(f.name, f.arguments, f.description));\n return DeclaredFunction.#all;\n }\n\n /** The signature a hint shows: `SUM(number1, [number2], ...)`. */\n get signature(): string {\n return `${this.name}(${this.arguments})`;\n }\n\n /** The declared function of that name, in any case, or `undefined` when the name is not declared. */\n static find(name: string): DeclaredFunction | undefined {\n const found = findFunction(name);\n return found === undefined ? undefined : DeclaredFunction.all.find(f => f.name === found.name);\n }\n\n /**\n * The values argument `index` (from 0) takes when it takes one of a fixed list, in Excel's order and with\n * Excel's texts, such as `XLOOKUP`'s `match_mode`: what completion lists there (ADR-0058). Empty for an\n * argument that takes any value.\n */\n valuesOf(index: number): readonly ArgumentValue[] {\n const values = findFunction(this.name)?.values[index];\n // oxlint-disable-next-line ex-grid/no-stand-in-default -- C#'s ValuesOf: an argument without a fixed list lists none\n return values ?? [];\n }\n}\n", "// A Formula's stored text (C#'s FormulaText.cs; ADR-0047). It keeps the whitespace it was typed with where Excel\n// keeps it, which is before a token: whitespace at the end of the Formula, and before a `,`, is dropped, as Excel\n// drops it on entry (observed, verification/2026-09-27-windows-excel). Each token is written in the engine's\n// invariant spelling \u2014 declared function names, References, booleans and Error Values in upper case, numbers as\n// Excel writes them (at most 15 significant digits, written out in full where Excel writes them so: `=1E15` is\n// stored as `=1000000000000000` and `=.5` as `=0.5`), a structured reference in single brackets, a Reference\n// spanning every row or every column in its whole-column or whole-row form. Rewriting References, on an\n// insertion, a deletion, a copy or a fill, replaces only the Reference tokens and leaves every other character\n// where it was \u2014 except that a Reference rewritten to `#REF!` takes the whitespace before it with it, as Excel's\n// does.\nimport { Culture } from '../culture';\nimport { equalsIgnoreCase } from '../dotnet';\nimport { formulaConstantLongest, writtenText } from '../number-text';\nimport { findFunction } from './function-library';\nimport { isFormulaWhitespace, tokenize, type Token } from './lexer';\nimport { quoteSheetName, type Reference } from './reference';\n\n/** The stored text of a Formula already read into `tokens`. */\nexport function normalizeFormula(formula: string, tokens: readonly Token[]): string {\n let text = '=';\n let at = 1;\n for (let i = 0; i < tokens.length; i++) {\n const token = tokens[i] as Token; // oxlint-disable-line typescript/no-unsafe-type-assertion -- i is within the tokens\n // Excel keeps whitespace only where a token follows it; the end is not one, nor a comma.\n // A carriage return with its line feed is kept as the line feed alone, as Excel keeps it.\n if (token.kind !== 'end' && token.kind !== 'comma') text += formula.slice(at, token.position).replaceAll('\\r\\n', '\\n');\n text += tokenText(formula, token, tokens[i + 1]);\n at = token.position + token.length;\n }\n return text;\n}\n\n/**\n * The stored text with every Reference passed through `map`: the new Reference, or `undefined` where the cells it\n * named no longer exist, written `#REF!` as Excel writes it, after the Reference's Sheet qualifier when it had\n * one (`Sheet1!#REF!`). `requalify`, when given, maps the qualifier of a `#REF!` already written so (a rename),\n * `undefined` for a Sheet that is gone. The same string when nothing changed.\n */\nexport function rewriteReferences(stored: string, map: (reference: Reference) => Reference | undefined,\n requalify?: (sheet: string) => string | undefined): string {\n const tokens = tokenize(stored, 1);\n let text = '';\n let changed = false;\n let at = 0;\n for (const token of tokens) {\n if (token.kind === 'error' && token.sheetName !== undefined && requalify !== undefined) {\n const qualifier = token.sheetName;\n const renamed = requalify(qualifier);\n if (renamed === qualifier) continue;\n changed = true;\n text += stored.slice(at, token.position);\n // A qualifier requalified to none names a Sheet that is gone: what is left is #REF! (ADR-0331).\n if (renamed !== undefined) text += `${quoteSheetName(renamed)}!`;\n text += '#REF!';\n at = token.position + token.length;\n continue;\n }\n if (token.kind !== 'reference' || token.reference === undefined) continue;\n const reference = token.reference;\n const mapped = map(reference);\n if (mapped?.equals(reference) === true) continue;\n changed = true;\n if (mapped === undefined) {\n // The whitespace before a Reference that becomes #REF! goes with it (observed:\n // \"= A5 * C1\" with row 5 deleted is \"=#REF! * C1\"); its qualifier stays\n // (observed: \"=Sheet1!A5*2\" is \"=Sheet1!#REF!*2\").\n let kept = token.position;\n while (kept > at && isFormulaWhitespace(stored.charAt(kept - 1))) kept--;\n text += stored.slice(at, kept);\n // A qualifier requalified to none names a Sheet that is gone, and goes with it (ADR-0331); a 3D\n // Reference's span goes whole, as Excel's #REF!B2 in a copy shows (ADR-0331 \u00A77).\n const sheet = reference.sheetName;\n if (sheet !== undefined && !reference.isThreeD && (requalify === undefined || requalify(sheet) !== undefined)) text += `${quoteSheetName(sheet)}!`;\n text += '#REF!';\n } else {\n text += stored.slice(at, token.position) + mapped.write();\n }\n at = token.position + token.length;\n }\n return changed ? text + stored.slice(at) : stored;\n}\n\n/**\n * The stored text with every structured reference written as `spell` spells its table and column \u2014 the Linked\n * Table's declared case (ADR-0047, ADR-0049) \u2014 or left as it is where it gives `undefined`. The same string when\n * nothing changed.\n */\nexport function rewriteStructuredReferences(stored: string,\n spell: (table: string, column: string) => { readonly table: string; readonly column: string } | undefined): string {\n const tokens = tokenize(stored, 1);\n let text = '';\n let changed = false;\n let at = 0;\n for (const token of tokens) {\n if (token.kind !== 'structuredReference' || token.tableName === undefined) continue;\n const spelled = spell(token.tableName, token.text);\n if (spelled === undefined) continue;\n if (spelled.table === token.tableName && spelled.column === token.text) continue;\n changed = true;\n text += stored.slice(at, token.position) + structuredReferenceText(spelled.table, spelled.column);\n at = token.position + token.length;\n }\n return changed ? text + stored.slice(at) : stored;\n}\n\nfunction tokenText(formula: string, token: Token, next: Token | undefined): string {\n switch (token.kind) {\n case 'number':\n // As Excel writes a number constant back (ADR-0047): the form it gives the same number\n // written into text, which the observed cases agree on (ARITH-073..075, TEXT-057/058).\n return writtenText(token.number, Culture.invariant, formulaConstantLongest);\n case 'text':\n return `\"${token.text.replaceAll('\"', '\"\"')}\"`;\n case 'error': {\n const error = token.error;\n if (error === undefined) throw new Error('Internal: an error token holds its Error Value.');\n return token.sheetName === undefined ? error : `${quoteSheetName(token.sheetName)}!${error}`;\n }\n case 'reference':\n if (token.reference === undefined) throw new Error('Internal: a reference token holds its Reference.');\n return token.reference.write();\n case 'structuredReference':\n if (token.tableName === undefined) throw new Error('Internal: a structured reference token holds its table.');\n return structuredReferenceText(token.tableName, token.text);\n case 'name': {\n const call = next !== undefined && next.kind === 'leftParenthesis' && !next.afterSpace;\n if (call) return findFunction(token.text)?.name ?? token.text;\n if (equalsIgnoreCase(token.text, 'TRUE')) return 'TRUE';\n if (equalsIgnoreCase(token.text, 'FALSE')) return 'FALSE';\n return token.text;\n }\n case 'end':\n return '';\n case 'operator':\n case 'leftParenthesis':\n case 'rightParenthesis':\n case 'comma':\n return formula.slice(token.position, token.position + token.length);\n default:\n throw new Error(`Internal: ${String(token.kind)} is no kind of token.`);\n }\n}\n\n/**\n * A structured reference into a Linked Table, `Table[Column]` (ADR-0049), in single brackets whatever the\n * column's name holds, with `'` before each of `[ ] # ' @`: Excel writes `Positions[[Market Value]]` back as\n * `Positions[Market Value]` and `Positions[[Rate'#]]` as `Positions[Rate'#]` (observed,\n * verification/2026-09-27-windows-excel). Double brackets are still read. An `@` is escaped too, as Excel's own\n * form escapes it: unescaped, the lexer refuses it, and Excel reads `[@Column]` as the row the Formula stands in.\n */\nexport function structuredReferenceText(table: string, column: string): string {\n let text = `${table}[`;\n for (let i = 0; i < column.length; i++) {\n const c = column.charAt(i);\n if (c === '[' || c === ']' || c === '#' || c === \"'\" || c === '@') text += \"'\";\n text += c;\n }\n return `${text}]`;\n}\n", "// Reads a Formula in Excel's invariant syntax (ADR-0047) into nodes, with Excel's operator precedence, from the\n// loosest binding: comparison (= <> < > <= >=), &, + -, * /, ^, %, then negation \u2014 so -2^2 is 4 and 2^3^2 is 64,\n// as in Excel. Anything it cannot read is refused with a FormulaSyntaxError, as Excel refuses such a Formula;\n// that includes the union (,) operator, array constants, a range operator between anything but two addresses,\n// and the intersection (space) operator between two References; and, as Excel refuses it, a call that gives an\n// argument Excel takes only as a Reference something that can never be one. An intersection with a name in it is\n// read (ADR-0047, second run): ExSheet defines no names, so it is #NAME? whatever the other side is.\n//\n// LET's names (ADR-0181), as Excel's keyboard accepts them: a name is seen by the values bound after it and by\n// its own LET's calculation, and an inner LET may bind it again; the parser resolves each name to its binding\n// where it stands, so a name read before its binding, or inside its own value, resolves to none and is #NAME?.\nimport { equalsIgnoreCase, ignoreCaseKey, isAsciiDigit, isLetter, toUpperInvariant } from '../dotnet';\nimport { FormulaSyntaxError } from '../formula-syntax-error';\nimport { elementAt } from '../must';\nimport type { FunctionDefinition } from './function-definition';\nimport { findFunction } from './function-library';\nimport { firstWide, tokenize, wideNameOutsideLet, type Token } from './lexer';\nimport {\n BinaryNode, BooleanNode, ErrorNode, FunctionNode, IntersectionNode, LetBinding, LetNode, MissingNode, NameNode, NumberNode,\n ParenthesesNode, PercentNode, ReferenceNode, StructuredReferenceNode, TextNode, UnaryNode, type Node,\n} from './nodes';\n\n/**\n * The most levels of nested functions a Formula holds, a `LET` counted as one: 64, Excel's own limit, past which\n * Excel refuses the Formula on entry.\n */\nexport const mostNestedFunctions = 64;\n\n/**\n * The deepest Formula the engine reads (`Node.depth`): parentheses, signs, `%`, functions, the right operands of\n * operators and the `LET` names read, each counted as a level, while a chain of operators down their left\n * operands is not. Deeper, a walk of the Formula could exhaust the stack, so the Formula is refused on entry.\n */\nexport const mostNesting = 256;\n\n/** The longest name Excel's keyboard took: 249 characters (LET-ADDITIONAL-002; 250 refused, LET-KEYS-013). */\nconst longestLetName = 249;\n\n/** The most names one `LET` binds: 126 (LET-029; a 127th is refused, LET-030). */\nconst mostLetNames = 126;\n\n/** One `LET` being read: the names bound so far, in scope, and every name it binds, later ones included. */\ninterface LetScope {\n readonly bound: LetBinding[];\n /** Every name it binds, as `ignoreCaseKey` keys them. */\n readonly names: Set<string>;\n}\n\n/** Parses a Formula; `formula` starts with `=`. */\nexport function parseFormula(formula: string): Node {\n return parseFormulaWithTokens(formula).node;\n}\n\n/** Parses a Formula, and gives the tokens it was read from. */\nexport function parseFormulaWithTokens(formula: string): { node: Node; tokens: readonly Token[] } {\n if (formula.length === 0 || formula.charAt(0) !== '=') throw new FormulaSyntaxError(formula, 0, \"a Formula begins with '='.\");\n const parser = new Parser(formula, tokenize(formula, 1));\n return { node: parser.parse(), tokens: parser.tokens };\n}\n\nclass Parser {\n readonly #formula: string;\n readonly tokens: readonly Token[];\n #at = 0;\n /** The `LET`s being read, the innermost last: the scopes a name is resolved in (ADR-0181). */\n readonly #lets: LetScope[] = [];\n /**\n * The names of another script than ASCII that no scope bound where they stand, with the `LET`s around them.\n * Each must be a name one of those `LET`s binds, later in its text, or the Formula is refused (ADR-0181).\n */\n #wideNames: { readonly name: NameNode; readonly around: readonly LetScope[] }[] = [];\n /** How many parentheses, signs and calls the parser is inside: its own recursion, kept within `mostNesting`. */\n #nesting = 0;\n /** How many calls the parser is inside, kept within `mostNestedFunctions`. */\n #functions = 0;\n\n constructor(formula: string, tokens: readonly Token[]) {\n this.#formula = formula;\n this.tokens = tokens;\n }\n\n parse(): Node {\n if (this.#peek().kind === 'end') throw new FormulaSyntaxError(this.#formula, 1, 'the Formula is empty.');\n // Outside a LET, a name of another script is refused where it stands, before anything after it (ADR-0181).\n const wide = wideNameOutsideLet(this.tokens);\n if (wide !== undefined) throw this.#notSyntax(wide.position + firstWide(wide.text));\n const node = this.#parseComparison();\n if (this.#peek().kind !== 'end') throw this.#unexpected();\n this.#bounded(node, this.#peek());\n this.#refuseUnboundWideNames();\n return node;\n }\n\n #peek(): Token {\n return elementAt(this.tokens, this.#at);\n }\n\n #next(): Token {\n return elementAt(this.tokens, this.#at++);\n }\n\n #peekOperator(...ops: string[]): boolean {\n return this.#peek().kind === 'operator' && ops.includes(this.#peek().text);\n }\n\n /**\n * For `RAND` and `RANDBETWEEN`: how many calls of either stand before this one in the Formula's text \u2014 its\n * place among the Formula's draws (ADR-0180). 0 for any other function.\n */\n #drawPlace(name: Token): number {\n if (!isDraw(name.text)) return 0;\n let place = 0;\n for (let i = 0; elementAt(this.tokens, i).position < name.position; i++) {\n const t = elementAt(this.tokens, i);\n const after = elementAt(this.tokens, i + 1);\n if (t.kind === 'name' && isDraw(t.text) && after.kind === 'leftParenthesis' && !after.afterSpace) place++;\n }\n return place;\n }\n\n #unexpected(): FormulaSyntaxError {\n const peek = this.#peek();\n if (peek.kind === 'end') return new FormulaSyntaxError(this.#formula, peek.position, 'the Formula ends too early.');\n // A name of another script that no LET around it binds is refused as the lexer refused one (ADR-0181).\n if (peek.kind === 'name') {\n const wide = firstWide(peek.text);\n if (wide >= 0 && this.#resolve(peek.text) === undefined) return this.#notSyntax(peek.position + wide);\n }\n return new FormulaSyntaxError(this.#formula, peek.position, `'${peek.text}' is not expected here.`);\n }\n\n /**\n * An expression: operands joined by binary operators, read with a stack of operators rather than a method for\n * each level of precedence. An operator applies every operator before it that binds at least as tightly,\n * which makes each associate to the left, as in Excel.\n */\n #parseComparison(): Node {\n const operands: Node[] = [this.#parseUnary()];\n const operators: Token[] = [];\n const apply = (): void => {\n const op = pop(operators);\n const right = pop(operands);\n const left = pop(operands);\n operands.push(this.#bounded(new BinaryNode(op.text, left, right), op));\n };\n for (;;) {\n if (this.#peek().kind !== 'operator') break;\n const level = precedence(this.#peek().text);\n if (level <= 0) break;\n while (operators.length > 0 && precedence(elementAt(operators, operators.length - 1).text) >= level) apply();\n operators.push(this.#next());\n operands.push(this.#parseUnary());\n }\n while (operators.length > 0) apply();\n return elementAt(operands, 0);\n }\n\n /**\n * An operand: signs, then an intersection or a primary, then any `%`. Negation binds tighter than `^` in\n * Excel, and `%` tighter than negation. A run of signs is read in a loop, not by recursion.\n */\n #parseUnary(): Node {\n const signs: Token[] = [];\n while (this.#peekOperator('-', '+')) {\n const sign = this.#next();\n signs.push(sign);\n this.#enter(sign);\n }\n let node = this.#parseIntersection();\n while (this.#peekOperator('%')) node = this.#bounded(new PercentNode(node), this.#next());\n for (let i = signs.length - 1; i >= 0; i--) {\n const sign = elementAt(signs, i);\n node = this.#bounded(new UnaryNode(sign.text === '-' ? '-' : '+', node), sign);\n this.#nesting--;\n }\n return node;\n }\n\n /**\n * The intersection operator, whitespace between two References or names, which binds tighter than `%` and\n * negation in Excel. It is read only when a name stands on one side of it; between two References it is\n * refused by name, as an operator the engine does not implement (ADR-0047, third run, TYPED-054).\n */\n #parseIntersection(): Node {\n let node = this.#parsePrimary();\n while ((node.kind === 'name' || node.kind === 'reference' || node.kind === 'intersection') && this.#peek().afterSpace\n && this.#isIntersectionOperand(this.#at)) {\n const at = this.#peek();\n const right = this.#parsePrimary();\n // A LET name stands for what it is bound to, which may be a range: Excel would intersect them (ADR-0181).\n if (rangeLike(node) && rangeLike(right)) {\n throw new FormulaSyntaxError(this.#formula, at.position, 'the intersection operator (a space between two References) is not implemented.',\n { isUnimplemented: true });\n }\n node = this.#bounded(new IntersectionNode(node, right), at);\n }\n return node;\n }\n\n /** Whether the token at `index` is a Reference or a name that is not a function call nor a boolean. */\n #isIntersectionOperand(index: number): boolean {\n const t = elementAt(this.tokens, index);\n if (t.kind === 'reference') return true;\n if (t.kind !== 'name') return false;\n const after = elementAt(this.tokens, index + 1);\n if (after.kind === 'leftParenthesis' && !after.afterSpace) return false;\n return !equalsIgnoreCase(t.text, 'TRUE') && !equalsIgnoreCase(t.text, 'FALSE');\n }\n\n #parsePrimary(): Node {\n const t = this.#peek();\n switch (t.kind) {\n case 'number':\n this.#next();\n return new NumberNode(t.number);\n case 'text':\n this.#next();\n return new TextNode(t.text);\n case 'error':\n this.#next();\n if (t.error === undefined) throw new Error('Internal: an error token holds its Error Value.');\n return new ErrorNode(t.error);\n case 'reference':\n this.#next();\n if (t.reference === undefined) throw new Error('Internal: a reference token holds its Reference.');\n return new ReferenceNode(t.reference);\n case 'structuredReference':\n this.#next();\n if (t.tableName === undefined) throw new Error('Internal: a structured reference token holds its table.');\n return new StructuredReferenceNode(t.tableName, t.text);\n case 'leftParenthesis': {\n this.#enter(this.#next());\n const inner = this.#parseComparison();\n if (this.#peek().kind !== 'rightParenthesis') throw this.#unexpected();\n this.#nesting--;\n return this.#bounded(new ParenthesesNode(inner), this.#next());\n }\n case 'name': {\n this.#next();\n if (this.#peek().kind === 'leftParenthesis' && !this.#peek().afterSpace) return this.#parseCall(t);\n if (equalsIgnoreCase(t.text, 'TRUE')) return new BooleanNode(true);\n if (equalsIgnoreCase(t.text, 'FALSE')) return new BooleanNode(false);\n const name = this.#bounded(new NameNode(t.text, t.position, this.#resolve(t.text)), t);\n if (name.binding === undefined && firstWide(t.text) >= 0) this.#wideNames.push({ name, around: this.#lets.toReversed() });\n return name;\n }\n case 'operator':\n case 'rightParenthesis':\n case 'comma':\n case 'end':\n throw this.#unexpected();\n default:\n throw new Error(`Internal: ${String(t.kind satisfies never)} is no kind of token.`);\n }\n }\n\n #parseCall(name: Token): Node {\n // A function's name is ASCII: one of another script is refused as it was before LET (ADR-0181).\n const wide = firstWide(name.text);\n if (wide >= 0) throw this.#notSyntax(name.position + wide);\n const definition = findFunction(name.text);\n this.#enterFunction(name);\n const call = definition?.name === 'LET' ? this.#parseLet(name) : this.#parseArguments(name, definition);\n this.#functions--;\n this.#nesting--;\n return this.#bounded(call, name);\n }\n\n /** Goes one level deeper into parentheses, a sign or a call, refusing the Formula once that is deeper than `mostNesting`. */\n #enter(at: Token): void {\n if (++this.#nesting > mostNesting) throw this.#tooDeep(at.position);\n }\n\n /** Goes into a call's arguments, refusing a 65th level of nested functions as Excel does (`mostNestedFunctions`). */\n #enterFunction(name: Token): void {\n if (this.#functions + 1 > mostNestedFunctions) {\n throw new FormulaSyntaxError(this.#formula, name.position,\n `functions are nested more than ${String(mostNestedFunctions)} levels deep; Excel refuses such a Formula too.`, { isBeyondLimit: true });\n }\n this.#functions++;\n this.#enter(name);\n }\n\n /** The node, or a refusal when it is deeper than `mostNesting` (`Node.depth`). */\n #bounded<T extends Node>(node: T, at: Token): T {\n if (node.depth > mostNesting) throw this.#tooDeep(at.position);\n return node;\n }\n\n #tooDeep(position: number): FormulaSyntaxError {\n return new FormulaSyntaxError(this.#formula, position,\n `the Formula is nested more than ${String(mostNesting)} levels deep (parentheses, signs, functions, and operators within operators); ExSheet cannot compute one so deep.`,\n { isBeyondLimit: true });\n }\n\n #parseArguments(name: Token, definition: FunctionDefinition | undefined): FunctionNode {\n this.#next(); // (\n const args: Node[] = [];\n if (this.#peek().kind === 'rightParenthesis') {\n this.#next();\n } else {\n for (;;) {\n args.push(this.#peek().kind === 'comma' || this.#peek().kind === 'rightParenthesis' ? MissingNode.instance : this.#parseComparison());\n if (this.#peek().kind === 'comma') {\n this.#next();\n continue;\n }\n if (this.#peek().kind === 'rightParenthesis') {\n this.#next();\n break;\n }\n throw this.#unexpected();\n }\n }\n\n if (definition === undefined) return new FunctionNode(name.text, args, undefined);\n // Excel refuses a call with too few or too many arguments when the Formula is entered.\n if (args.length < definition.minimumArguments) {\n throw new FormulaSyntaxError(this.#formula, name.position, `${definition.name} takes at least ${String(definition.minimumArguments)} argument(s).`);\n }\n if (args.length > definition.maximumArguments) {\n throw new FormulaSyntaxError(this.#formula, name.position, `${definition.name} takes at most ${String(definition.maximumArguments)} argument(s).`);\n }\n if (definition.inPairs && (args.length - definition.pairOffset) % 2 !== 0) {\n throw new FormulaSyntaxError(this.#formula, name.position, `${definition.name} takes its arguments in pairs.`);\n }\n const only = definition.referenceOnly;\n if (only !== undefined) {\n for (let i = only.first; i <= only.last && i < args.length; i++) {\n if (neverAReference(elementAt(args, i))) {\n throw new FormulaSyntaxError(this.#formula, name.position, `${definition.name} takes only a Reference as its argument ${String(i + 1)}.`);\n }\n }\n }\n return new FunctionNode(definition.name, args, definition, this.#drawPlace(name));\n }\n\n /** The binding a name reads where it stands: the innermost `LET` that has bound it so far; `undefined` for none. */\n #resolve(name: string): LetBinding | undefined {\n for (let s = this.#lets.length - 1; s >= 0; s--) {\n const binding = elementAt(this.#lets, s).bound.find(b => equalsIgnoreCase(b.name, name));\n if (binding !== undefined) return binding;\n }\n return undefined;\n }\n\n /**\n * `LET(name1, value1, \u2026, calculation)`: each value read with the names bound before it in scope, the\n * calculation with all of them. A value left empty is bound as the empty argument it is (LET-107, run 17).\n * Refused on entry, as Excel refuses each: too few arguments, an even number of them, a missing calculation,\n * a name bound twice, a 127th name, and a name `letNameRefusal` refuses.\n */\n #parseLet(let_: Token): LetNode {\n this.#next(); // (\n const scope: LetScope = { bound: [], names: new Set() };\n this.#lets.push(scope);\n const args: Node[] = [];\n let named: LetBinding | undefined;\n if (this.#peek().kind === 'rightParenthesis') throw new FormulaSyntaxError(this.#formula, let_.position, 'LET takes at least 3 argument(s).');\n for (;;) {\n const start = this.#peek();\n const argument = this.#peek().kind === 'comma' || this.#peek().kind === 'rightParenthesis' ? MissingNode.instance : this.#parseComparison();\n const index = args.length;\n args.push(argument);\n if (this.#peek().kind === 'rightParenthesis') {\n this.#next();\n break;\n }\n if (this.#peek().kind !== 'comma') throw this.#unexpected();\n this.#next();\n if (index % 2 === 0) {\n // A name, with its value to follow.\n if (scope.names.size === mostLetNames) {\n throw new FormulaSyntaxError(this.#formula, start.position, `a LET binds at most ${String(mostLetNames)} names.`);\n }\n const name = this.#letName(argument, start);\n const key = ignoreCaseKey(name);\n if (scope.names.has(key)) throw new FormulaSyntaxError(this.#formula, start.position, `'${name}' is bound twice in one LET.`);\n scope.names.add(key);\n named = new LetBinding(name);\n } else {\n if (named === undefined) throw new Error('Internal: a LET value follows its name.');\n named.value = argument;\n scope.bound.push(named);\n named = undefined;\n }\n }\n this.#lets.pop();\n if (args.length < 3) throw new FormulaSyntaxError(this.#formula, let_.position, 'LET takes at least 3 argument(s).');\n if (args.length % 2 === 0) throw new FormulaSyntaxError(this.#formula, let_.position, 'LET takes names and their values in pairs, then one calculation.');\n const calculation = elementAt(args, args.length - 1);\n if (calculation.kind === 'missing') throw new FormulaSyntaxError(this.#formula, let_.position, \"LET's calculation is missing.\");\n return new LetNode(scope.bound, calculation);\n }\n\n /** The argument as a `LET` name, or a refusal saying why it cannot be one. */\n #letName(argument: Node, start: Token): string {\n if (argument.kind !== 'name') {\n const refusal = argument.kind === 'reference' ? `'${start.text}' reads as a Reference, and cannot be a LET name.`\n : argument.kind === 'boolean' ? `${toUpperInvariant(start.text)} cannot be a LET name.`\n : 'a LET name is expected here.';\n throw new FormulaSyntaxError(this.#formula, start.position, refusal);\n }\n const refusal = letNameRefusal(argument.name);\n if (refusal !== undefined) throw new FormulaSyntaxError(this.#formula, start.position, refusal);\n // Its own name is no unbound use of one.\n this.#wideNames = this.#wideNames.filter(w => w.name !== argument);\n return argument.name;\n }\n\n /**\n * Refuses a name of another script than ASCII that no `LET` around it binds, at its first such character, as\n * the lexer refused one before `LET` was admitted. One that a `LET` around it binds later in its text is read\n * before its binding, and is `#NAME?`, as an ASCII one is (ADR-0181).\n */\n #refuseUnboundWideNames(): void {\n for (const { name, around } of this.#wideNames) {\n if (around.some(scope => scope.names.has(ignoreCaseKey(name.name)))) continue;\n throw this.#notSyntax(name.position + firstWide(name.name));\n }\n }\n\n #notSyntax(at: number): FormulaSyntaxError {\n return new FormulaSyntaxError(this.#formula, at, `'${this.#formula.charAt(at)}' is not part of the formula syntax ExSheet reads.`);\n }\n}\n\nfunction isDraw(text: string): boolean {\n return equalsIgnoreCase(text, 'RAND') || equalsIgnoreCase(text, 'RANDBETWEEN');\n}\n\n/** Whether a node stands for a range on one side of an intersection: a Reference, or a name a `LET` binds. */\nfunction rangeLike(node: Node): boolean {\n return node.kind === 'reference' || (node.kind === 'name' && node.binding !== undefined);\n}\n\n/**\n * How tightly a binary operator binds, from the loosest: comparison, `&`, `+ -`, `* /`, `^`; 0 for a token that\n * is no binary operator (`%`). Every one associates to the left, `^` too, as in Excel.\n */\nfunction precedence(op: string): number {\n switch (op) {\n case '=': case '<>': case '<': case '>': case '<=': case '>=': return 1;\n case '&': return 2;\n case '+': case '-': return 3;\n case '*': case '/': return 4;\n case '^': return 5;\n default: return 0;\n }\n}\n\n/**\n * Whether an argument can never be a Reference, as Excel tells one when a Formula is entered: a number, a text\n * or a boolean, an operator's result (but parentheses around a Reference), or a call of a declared function that\n * never gives one, such as `SEQUENCE`.\n */\nfunction neverAReference(argument: Node): boolean {\n switch (argument.kind) {\n case 'number':\n case 'text':\n case 'boolean':\n case 'binary':\n case 'unary':\n case 'percent':\n return true;\n case 'parentheses':\n return neverAReference(argument.inner);\n case 'function':\n return argument.function !== undefined && !argument.function.returnsReference;\n case 'error':\n case 'intersection':\n case 'let':\n case 'missing':\n case 'name':\n case 'reference':\n case 'structuredReference':\n return false;\n default:\n throw new Error(`Internal: ${String(argument)} is no kind of node.`);\n }\n}\n\n/**\n * Why a name cannot be a `LET` name, or `undefined` when it can (ADR-0181): it starts with a letter of any script\n * or `_`, goes on with letters, ASCII digits and `_`, and is at most 249 characters.\n */\nfunction letNameRefusal(name: string): string | undefined {\n if (name.length > longestLetName) return `a LET name is at most ${String(longestLetName)} characters.`;\n const first = name.charCodeAt(0);\n let valid = isLetter(first) || first === 0x5f;\n for (let i = 1; i < name.length && valid; i++) {\n const c = name.charCodeAt(i);\n valid = isLetter(c) || isAsciiDigit(c) || c === 0x5f;\n }\n return valid ? undefined : `'${name}' cannot be a LET name: a name begins with a letter or _, and holds only letters, digits and _.`;\n}\n\nfunction pop<T>(stack: T[]): T {\n const top = stack.pop();\n if (top === undefined) throw new Error('Internal: the parser popped an empty stack.');\n return top;\n}\n", "// What copying a Formula does to its References (C#'s ReferenceShift.cs; ADR-0048): each relative part moves by\n// the distance copied, each absolute part (`$`) stays. A Reference moved off the Sheet names no cells, and Excel\n// writes it `#REF!`.\nimport { columnCount, rowCount } from '../cell-address';\nimport type { Reference } from './reference';\n\n/** The Reference moved `rows` down and `columns` across; `undefined` where it is moved off the Sheet. */\nexport function shiftReference(reference: Reference, rows: number, columns: number): Reference | undefined {\n let r1 = reference.row1Absolute ? reference.row1 : reference.row1 + rows;\n let r2 = reference.row2Absolute ? reference.row2 : reference.row2 + rows;\n let c1 = reference.column1Absolute ? reference.column1 : reference.column1 + columns;\n let c2 = reference.column2Absolute ? reference.column2 : reference.column2 + columns;\n // A whole column spans every row whatever is copied, and a whole row every column.\n if (reference.shape === 'columns') [r1, r2] = [reference.row1, reference.row2];\n if (reference.shape === 'rows') [c1, c2] = [reference.column1, reference.column2];\n if (!inside(r1, rowCount) || !inside(r2, rowCount) || !inside(c1, columnCount) || !inside(c2, columnCount)) return undefined;\n\n let r1Absolute = reference.row1Absolute;\n let r2Absolute = reference.row2Absolute;\n let c1Absolute = reference.column1Absolute;\n let c2Absolute = reference.column2Absolute;\n // A$1:A3 copied down past row 1 is written from its top: A$1 stays first only while it is on top.\n if (r2 < r1) [r1, r1Absolute, r2, r2Absolute] = [r2, r2Absolute, r1, r1Absolute];\n if (c2 < c1) [c1, c1Absolute, c2, c2Absolute] = [c2, c2Absolute, c1, c1Absolute];\n return reference.with({\n row1: r1, row2: r2, column1: c1, column2: c2,\n row1Absolute: r1Absolute, row2Absolute: r2Absolute, column1Absolute: c1Absolute, column2Absolute: c2Absolute,\n });\n}\n\nfunction inside(position: number, size: number): boolean {\n return position >= 0 && position < size;\n}\n", "// The names a parsed Formula reads that nothing in it binds (C#'s UnboundNameWalk.cs; `Entry.unboundNames`):\n// every name node of the tree the parser has already built, less those a `LET` binds and those a `LAMBDA` takes as\n// parameters, whether or not the engine declares `LAMBDA`. Today it does not (a call is `#NAME?`), but Excel's\n// workbooks write it, and its parameters are no names a workbook defines (ADR-0330 \u00A74): `LAMBDA(x, y, x+y)` binds\n// `x` and `y` in its last argument, and its other arguments are the parameters themselves.\nimport { equalsIgnoreCase } from '../dotnet';\nimport { firstWide } from './lexer';\nimport type { Node } from './nodes';\n\n/** The unbound names of a Formula, in the text's order, each once without regard to case. */\nexport function unboundNames(formula: Node): readonly string[] {\n const found: string[] = [];\n walk(formula, [], found);\n return distinctIgnoringCase(found);\n}\n\n/** The texts, each once without regard to case, the first spelling kept, in their order. */\nexport function distinctIgnoringCase(texts: readonly string[]): string[] {\n const kept: string[] = [];\n for (const text of texts) if (!kept.some(k => equalsIgnoreCase(k, text))) kept.push(text);\n return kept;\n}\n\nfunction walk(node: Node, parameters: readonly string[], found: string[]): void {\n switch (node.kind) {\n case 'name':\n if (node.binding === undefined && firstWide(node.name) < 0 && !parameters.some(p => equalsIgnoreCase(p, node.name))) found.push(node.name);\n return;\n case 'let':\n for (const binding of node.bindings) walk(binding.value, parameters, found);\n walk(node.calculation, parameters, found);\n return;\n case 'function': {\n const args = node.arguments;\n const last = args.at(-1);\n if (equalsIgnoreCase(node.name, 'LAMBDA') && last !== undefined) {\n const inner = [...parameters];\n for (let i = 0; i < args.length - 1; i++) {\n const argument = args[i] as Node; // oxlint-disable-line typescript/no-unsafe-type-assertion -- i is within the arguments\n if (argument.kind === 'name') inner.push(argument.name);\n else walk(argument, parameters, found);\n }\n walk(last, inner, found);\n return;\n }\n for (const argument of args) walk(argument, parameters, found);\n return;\n }\n case 'intersection':\n walk(node.left, parameters, found);\n walk(node.right, parameters, found);\n return;\n case 'binary':\n // Along the chain of left operands in a loop: a chain of thousands of operators does not deepen the stack.\n for (const operand of node.operands()) walk(operand, parameters, found);\n return;\n case 'parentheses':\n walk(node.inner, parameters, found);\n return;\n case 'unary':\n case 'percent':\n walk(node.operand, parameters, found);\n return;\n case 'number':\n case 'text':\n case 'boolean':\n case 'error':\n case 'missing':\n case 'reference':\n case 'structuredReference':\n return;\n default:\n throw new Error(`Internal: ${String(node)} is no kind of node.`);\n }\n}\n", "import { parseConstant } from './constant-parser';\nimport type { Culture } from './culture';\nimport { formatRoundTrip } from './dotnet';\nimport { FormulaSyntaxError } from './formula-syntax-error';\nimport { normalizeFormula, rewriteReferences } from './formulas/formula-text';\nimport type { Node } from './formulas/nodes';\nimport { parseFormulaWithTokens } from './formulas/parser';\nimport type { Reference } from './formulas/reference';\nimport { shiftReference } from './formulas/reference-shift';\nimport { distinctIgnoringCase, unboundNames } from './formulas/unbound-name-walk';\nimport { parseWrittenError, Value } from './value';\n\n/**\n * What a user put into a cell: a constant or a Formula (CONTEXT.md). An Entry is what a Sheet Document records,\n * and what the user sees again when editing the cell. A constant is held already parsed, never as the text that\n * was typed (ADR-0048); a Formula is held in Excel's invariant syntax (ADR-0047). Immutable.\n */\nexport class Entry {\n /** The constant, or `undefined` when this Entry is a Formula. */\n readonly constant: Value | undefined;\n /**\n * The Formula in invariant syntax, beginning with `=`: the whitespace as it was typed where Excel keeps it\n * (not at the end, nor before a `,`), and each token as the engine writes it (function names and References\n * in upper case, `,` between arguments, `.` as the decimal separator) (ADR-0047); `undefined` when this Entry\n * is a constant.\n */\n readonly formula: string | undefined;\n /** The parsed Formula. @internal */\n readonly parsed: Node | undefined;\n\n private constructor(constant: Value | undefined, formula: string | undefined, parsed: Node | undefined) {\n this.constant = constant;\n this.formula = formula;\n this.parsed = parsed;\n }\n\n /** Whether this Entry is a Formula. */\n get isFormula(): boolean {\n return this.formula !== undefined;\n }\n\n /**\n * The functions the Formula calls that are outside ExSheet's declared set, in the text's order, each once\n * without regard to case: each gives `#NAME?` (ADR-0047). Empty for a constant, and for a Formula that calls\n * only declared functions. A reader of another program's workbook lists them before the user meets them\n * (ADR-0330 \u00A74).\n */\n get undeclaredFunctions(): readonly string[] {\n if (this.parsed === undefined) return [];\n return distinctIgnoringCase([...this.parsed.calls()].filter(c => c.function === undefined).map(c => c.name));\n }\n\n /**\n * The names the Formula reads that nothing in it binds \u2014 not a function's, not a `LET`'s, not a `LAMBDA`'s\n * parameter, not `TRUE` or `FALSE` \u2014 in the text's order, each once without regard to case. ExSheet defines\n * no names, so each gives `#NAME?`; in Excel each is a defined name, or an Excel Table's, where the workbook\n * has one (ADR-0047, ADR-0330 \u00A74). Empty for a constant.\n */\n get unboundNames(): readonly string[] {\n return this.parsed === undefined ? [] : unboundNames(this.parsed);\n }\n\n /**\n * The Entry as a copy writes it `rows` down and `columns` across from where it stands, as Excel writes a\n * copied Formula and a shared formula's cells (ADR-0048, ADR-0330 \u00A74): each relative part of a Reference\n * moves by that distance, each absolute part (`$`) stays, a whole column or row spans every row or column\n * still, and a Reference moved off the Sheet is written `#REF!`. A constant, or a move of nothing, is this\n * Entry. Negative distances move up and left.\n */\n movedBy(rows: number, columns: number): Entry {\n return rows === 0 && columns === 0 ? this : Entry.rewrite(this, r => shiftReference(r, rows, columns));\n }\n\n /**\n * The Entry with its References mapped (`rewriteReferences`); the same instance when nothing changed.\n * @internal\n */\n static rewrite(entry: Entry, map: (reference: Reference) => Reference | undefined, requalify?: (sheet: string) => string | undefined): Entry {\n const formula = entry.formula;\n if (formula === undefined) return entry;\n const rewritten = rewriteReferences(formula, map, requalify);\n return rewritten === formula ? entry : Entry.fromFormula(rewritten);\n }\n\n /**\n * The constant Entry of an Error Value written exactly as Excel writes one in a file, case and all (`#N/A`,\n * `#DIV/0!`, `#SPILL!`), or `undefined` when the text is no Error Value a cell can hold: `#GETTING_DATA` and\n * `#CIRC!` are not one, and nothing else is read as a Formula or a number. A reader of another program's\n * workbook takes an error cell through it (ADR-0330 \u00A74).\n */\n static fromErrorText(text: string): Entry | undefined {\n const error = parseWrittenError(text);\n return error === undefined ? undefined : new Entry(Value.fromError(error), undefined, undefined);\n }\n\n /**\n * A constant Entry. `#GETTING_DATA` and `#CIRC!` are states of a computation and cannot be one, and neither\n * can the `#VALUE!` of a cell whose Formula ExSheet refuses, read from it: held as a constant it would be an\n * Error Value a Formula can catch (ADR-0047; 2026-10-12, decided with the user: a refusal is never caught,\n * anywhere). Throws a `RangeError` for one of those.\n */\n static fromValue(constant: Value): Entry {\n if (constant.isRefused) {\n throw new RangeError(`This ${constant.error} is a Formula ExSheet refused, because it cannot answer it as Excel; held as a constant it would be an Error Value a Formula can catch.`);\n }\n if (constant.isError && (constant.error === '#GETTING_DATA' || constant.error === '#CIRC!')) {\n throw new RangeError(`${constant.error} is not a constant a cell can hold.`);\n }\n return new Entry(constant, undefined, undefined);\n }\n\n /**\n * A Formula Entry from its invariant text, which begins with `=`; `Entry.parse` reads the same text as the\n * same Formula. Throws a `FormulaSyntaxError` when the Formula cannot be read. @internal\n */\n static fromFormula(formula: string): Entry {\n const { node, tokens } = parseFormulaWithTokens(formula);\n return new Entry(undefined, normalizeFormula(formula, tokens), node);\n }\n\n /**\n * Reads text as a user typed it into a cell: text beginning with `=` is a Formula in invariant syntax;\n * anything else is a constant read under `culture` and recorded parsed (ADR-0048). Empty text is no Entry,\n * and gives `undefined`. Throws a `FormulaSyntaxError` when the text is a Formula that cannot be read, or\n * text with a leading `+` or `-` that Excel reads as a Formula using syntax the engine does not implement\n * (`-B2 C2`) or nested past the limits the engine reads.\n */\n static parse(typed: string, culture: Culture): Entry | undefined {\n if (typed.length === 0) return undefined;\n if (typed.startsWith('=')) return Entry.fromFormula(typed);\n const constant = parseConstant(typed, culture);\n if (constant.kind === 'text') {\n const formula = Entry.signedFormula(typed);\n if (formula !== undefined) return formula;\n }\n return new Entry(constant, undefined, undefined);\n }\n\n /**\n * Text typed with a leading `+` or `-` that is not a constant is the Formula it spells after an `=`, as\n * Excel's cell editor reads it: `+A1` is `=+A1` and `-A1` is `=-A1` (observed with real keys). Text that does\n * not read as a Formula that way stays text: `undefined`. Throws where Excel reads the text as a Formula whose\n * syntax the engine does not implement (`-B2 C2`, TYPED-054; ADR-0047, third run), or one refused for its\n * size alone: kept as text it would quietly be another Entry than the one typed. @internal\n */\n static signedFormula(typed: string): Entry | undefined {\n if (typed.length < 2 || (typed[0] !== '+' && typed[0] !== '-')) return undefined;\n try {\n return Entry.fromFormula(`=${typed}`);\n } catch (e) { // oxlint-disable-line ex-grid/no-catch -- text that is no Formula stays text, as Excel keeps it\n if (e instanceof FormulaSyntaxError && !e.isUnimplemented && !e.isBeyondLimit) return undefined;\n throw e;\n }\n }\n\n /** Whether typed text would not be kept as text because of its leading sign: `signedFormula` reads it as a Formula, or refuses it. @internal */\n static isSignedFormula(typed: string): boolean {\n try {\n return Entry.signedFormula(typed) !== undefined;\n } catch (e) { // oxlint-disable-line ex-grid/no-catch -- a refusal is an answer here: the text is a Formula\n if (e instanceof FormulaSyntaxError) return true;\n throw e;\n }\n }\n\n /** Two Entries are equal when they hold the same constant (exactly) or the same Formula text. */\n equals(other: Entry | undefined): boolean {\n return other !== undefined && Value.same(this.constant, other.constant) && this.formula === other.formula;\n }\n\n /** Whether two Entries that may be absent are equal: both absent, or equal. */\n static same(a: Entry | undefined, b: Entry | undefined): boolean {\n if (a === undefined || b === undefined) return a === b;\n return a.equals(b);\n }\n\n /** The Formula text, or the constant's invariant diagnostic form. */\n toString(): string {\n if (this.formula !== undefined) return this.formula;\n if (this.constant === undefined) throw new Error('Internal: an Entry is a constant or a Formula.');\n return this.constant.kind === 'number' ? formatRoundTrip(this.constant.number) : this.constant.toString();\n }\n}\n", "// The JSON a Sheet Document and a Workbook Document are written in (ADR-0048), read and written as C#'s\n// System.Text.Json does, so a document written by either engine reads back in the other unchanged. JSON.parse\n// will not do: it keeps the last of two properties of one name, where JsonDocument keeps both and the reader\n// refuses a cell holding two Entries, and it reads `9.0` as a version, which TryGetInt32 does not.\nimport { formatRoundTrip, hex } from './dotnet';\n\n/** A JSON value as JsonDocument holds it: an object's properties in order, two of one name both kept, and a number's text. @internal */\nexport type JsonElement =\n | { readonly kind: 'object'; readonly properties: readonly (readonly [string, JsonElement])[]; readonly raw: string }\n | { readonly kind: 'array'; readonly items: readonly JsonElement[]; readonly raw: string }\n | { readonly kind: 'string'; readonly value: string }\n | { readonly kind: 'number'; readonly raw: string }\n | { readonly kind: 'true' }\n | { readonly kind: 'false' }\n | { readonly kind: 'null' };\n\n/** JsonDocument's default deepest nesting. */\nconst maxDepth = 64;\n\n/** Text that is not JSON as JsonDocument reads it. @internal */\nexport class JsonSyntaxError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'JsonSyntaxError';\n }\n}\n\n/** Parses `text` as JsonDocument.Parse does with its default options: no comments, no trailing commas, at most 64 deep. @internal */\nexport function parseJson(text: string): JsonElement {\n let at = 0;\n const fail = (what: string): never => {\n throw new JsonSyntaxError(`${what} at position ${String(at)}.`);\n };\n const skip = (): void => {\n while (at < text.length) {\n const c = text.charCodeAt(at);\n if (c !== 0x20 && c !== 0x09 && c !== 0x0a && c !== 0x0d) return;\n at++;\n }\n };\n const literal = (word: string): void => {\n if (!text.startsWith(word, at)) fail('An unexpected character');\n at += word.length;\n };\n const string = (): string => {\n at++;\n let out = '';\n for (;;) {\n if (at >= text.length) fail('An unterminated string');\n const c = text.charCodeAt(at);\n if (c === 0x22) {\n at++;\n return out;\n }\n if (c < 0x20) fail('A control character in a string');\n if (c !== 0x5c) {\n out += text[at];\n at++;\n continue;\n }\n const e = text[at + 1];\n at += 2;\n switch (e) {\n case '\"': out += '\"'; break;\n case '\\\\': out += '\\\\'; break;\n case '/': out += '/'; break;\n case 'b': out += '\\b'; break;\n case 'f': out += '\\f'; break;\n case 'n': out += '\\n'; break;\n case 'r': out += '\\r'; break;\n case 't': out += '\\t'; break;\n case 'u': {\n const digits = text.slice(at, at + 4);\n if (!/^[0-9A-Fa-f]{4}$/u.test(digits)) fail('An invalid \\\\u escape');\n out += String.fromCharCode(parseInt(digits, 16));\n at += 4;\n break;\n }\n case undefined:\n default: fail('An invalid escape');\n }\n }\n };\n const value = (depth: number): JsonElement => {\n skip();\n const start = at;\n const c = text[at];\n switch (c) {\n case '{': {\n if (depth >= maxDepth) fail('Nesting deeper than 64');\n at++;\n const properties: (readonly [string, JsonElement])[] = [];\n skip();\n if (text[at] === '}') {\n at++;\n return { kind: 'object', properties, raw: text.slice(start, at) };\n }\n for (;;) {\n skip();\n if (text[at] !== '\"') fail('A property name expected');\n const name = string();\n skip();\n if (text[at] !== ':') fail('\\':\\' expected');\n at++;\n properties.push([name, value(depth + 1)]);\n skip();\n if (text[at] === ',') {\n at++;\n continue;\n }\n if (text[at] === '}') {\n at++;\n return { kind: 'object', properties, raw: text.slice(start, at) };\n }\n fail('\\',\\' or \\'}\\' expected');\n }\n }\n case '[': {\n if (depth >= maxDepth) fail('Nesting deeper than 64');\n at++;\n const items: JsonElement[] = [];\n skip();\n if (text[at] === ']') {\n at++;\n return { kind: 'array', items, raw: text.slice(start, at) };\n }\n for (;;) {\n items.push(value(depth + 1));\n skip();\n if (text[at] === ',') {\n at++;\n continue;\n }\n if (text[at] === ']') {\n at++;\n return { kind: 'array', items, raw: text.slice(start, at) };\n }\n fail('\\',\\' or \\']\\' expected');\n }\n }\n case '\"':\n return { kind: 'string', value: string() };\n case 't':\n literal('true');\n return { kind: 'true' };\n case 'f':\n literal('false');\n return { kind: 'false' };\n case 'n':\n literal('null');\n return { kind: 'null' };\n case undefined:\n return fail('An unexpected end');\n default: {\n const match = /^-?(?:0|[1-9][0-9]*)(?:\\.[0-9]+)?(?:[eE][+-]?[0-9]+)?/u.exec(text.slice(at));\n if (match === null) return fail('An unexpected character');\n at += match[0].length;\n return { kind: 'number', raw: match[0] };\n }\n }\n };\n const root = value(0);\n skip();\n if (at < text.length) fail('Text after the JSON value');\n return root;\n}\n\n/** `JsonElement.TryGetInt32`: a whole number written without a fraction or an exponent, inside Int32. @internal */\nexport function jsonInt32(element: JsonElement): number | undefined {\n if (element.kind !== 'number' || !/^-?[0-9]+$/u.test(element.raw)) return undefined;\n const n = Number(element.raw);\n return n >= -2147483648 && n <= 2147483647 ? n : undefined;\n}\n\n/** `JsonElement.TryGetDouble`: the number, or `undefined` beyond a double's range, which TryGetDouble refuses. @internal */\nexport function jsonDouble(element: JsonElement): number | undefined {\n if (element.kind !== 'number') return undefined;\n const n = Number(element.raw);\n return Number.isFinite(n) ? n : undefined;\n}\n\n/** `JsonElement.ToString()`, as a refusal's message quotes a value: a string's text, a number's or a container's JSON, `True` or `False`. @internal */\nexport function jsonText(element: JsonElement): string {\n switch (element.kind) {\n case 'object':\n case 'array':\n case 'number':\n return element.raw;\n case 'string':\n return element.value;\n case 'true':\n return 'True';\n case 'false':\n return 'False';\n case 'null':\n return '';\n default:\n throw new Error(`Internal: ${String(element satisfies never)} is not a JSON element.`);\n }\n}\n\n/** The characters Utf8JsonWriter's default encoder writes as they are: printable ASCII but for these. */\nconst escapedAscii = new Set(['\"', '&', '\\'', '+', '<', '>', '\\\\', '`']);\n\n/** A string as Utf8JsonWriter writes it with its default encoder: everything outside printable ASCII, and HTML's specials, escaped. */\nfunction writeString(text: string): string {\n let out = '\"';\n for (let i = 0; i < text.length; i++) {\n const ch = text.charAt(i);\n const c = text.charCodeAt(i);\n if (c >= 0x20 && c < 0x7f && !escapedAscii.has(ch)) {\n out += ch;\n continue;\n }\n switch (ch) {\n case '\\\\': out += '\\\\\\\\'; break;\n case '\\b': out += '\\\\b'; break;\n case '\\f': out += '\\\\f'; break;\n case '\\n': out += '\\\\n'; break;\n case '\\r': out += '\\\\r'; break;\n case '\\t': out += '\\\\t'; break;\n default: out += `\\\\u${hex(c, 4)}`;\n }\n }\n return `${out}\"`;\n}\n\n/** Writes JSON as Utf8JsonWriter does without indenting: properties in the order written, numbers as .NET writes a double. @internal */\nexport class JsonWriter {\n #out = '';\n /** Whether the container open now has had a value yet, one entry per open container. */\n readonly #started: boolean[] = [];\n\n #separate(): void {\n const last = this.#started.length - 1;\n if (last < 0) return;\n if (this.#started[last] === true) this.#out += ',';\n this.#started[last] = true;\n }\n\n #name(name: string | undefined): void {\n this.#separate();\n if (name !== undefined) this.#out += `${writeString(name)}:`;\n }\n\n startObject(name?: string): void {\n this.#name(name);\n this.#out += '{';\n this.#started.push(false);\n }\n\n endObject(): void {\n this.#started.pop();\n this.#out += '}';\n }\n\n startArray(name?: string): void {\n this.#name(name);\n this.#out += '[';\n this.#started.push(false);\n }\n\n endArray(): void {\n this.#started.pop();\n this.#out += ']';\n }\n\n string(name: string | undefined, value: string): void {\n this.#name(name);\n this.#out += writeString(value);\n }\n\n number(name: string | undefined, value: number): void {\n if (!Number.isFinite(value)) throw new RangeError(`${String(value)} cannot be written as JSON.`);\n this.#name(name);\n this.#out += formatRoundTrip(value);\n }\n\n boolean(name: string | undefined, value: boolean): void {\n this.#name(name);\n this.#out += value ? 'true' : 'false';\n }\n\n toString(): string {\n return this.#out;\n }\n}\n", "// Writes a constant back as the text a user would type for it under a culture (C#'s EntryText.cs), so that the\n// Cell Editor opens on something that, typed again, gives the same Entry: a date as the culture's short date, a\n// percentage with `%`, any other number in General form.\nimport { parseConstant } from './constant-parser';\nimport { dateCode, type Culture } from './culture';\nimport { maximumSerial } from './date-serial';\nimport { Entry } from './entry';\nimport { NumberFormat } from './number-format';\nimport { writtenText } from './number-text';\nimport { Value } from './value';\n\n/** The text that, typed under `culture`, enters `constant` again, shown in `format`. */\nexport function entryText(constant: Value, format: NumberFormat, culture: Culture): string {\n switch (constant.kind) {\n case 'number': {\n const number = constant.number;\n if (format.isDate && number >= 0 && number < maximumSerial + 1) return dateTimeText(number, culture);\n if (format.isPercent) return `${writtenText(number * 100, culture)}%`;\n return writtenText(number, culture);\n }\n case 'boolean':\n case 'error':\n return constant.toString();\n case 'text': {\n const text = constant.text;\n // Text that would be read back as something else keeps Excel's leading apostrophe.\n if (text.length === 0 || text.startsWith('=') || text.startsWith(\"'\") || parseConstant(text, culture).kind !== 'text' || Entry.isSignedFormula(text)) {\n return `'${text}`;\n }\n return text;\n }\n default:\n throw new Error(`Internal: ${String(constant.kind)} is no kind of Value.`);\n }\n}\n\nfunction dateTimeText(serial: number, culture: Culture): string {\n const whole = Math.floor(serial);\n const hasTime = serial !== whole;\n const twelveHour = culture.data.longTimePattern.includes('t');\n const time = NumberFormat.parse(twelveHour ? 'h:mm:ss AM/PM' : 'h:mm:ss');\n if (whole === 0 && hasTime) return time.format(Value.fromNumber(serial), culture).text;\n const date = NumberFormat.parse(dateCode(culture)).format(Value.fromNumber(whole), culture).text;\n return hasTime ? `${date} ${time.format(Value.fromNumber(serial), culture).text}` : date;\n}\n", "// The typing aids over the text of a Formula being typed (C#'s FormulaEntry.cs; ADR-0051, ADR-0057, ADR-0058).\nimport { CellAddress } from './cell-address';\nimport { CellRange } from './cell-range';\nimport { parseFormulaNumber } from './constant-parser';\nimport { Culture } from './culture';\nimport { DeclaredFunction } from './declared-function';\nimport { compareIgnoreCase, equalsIgnoreCase, ignoreCaseKey, isAsciiLetterOrDigit, isWhiteSpace, startsWithAt, startsWithAtIgnoreCase, toUpperInvariant } from './dotnet';\nimport { approximatelyEqual } from './formulas/arithmetic';\nimport { compareValues } from './formulas/evaluator';\nimport { structuredReferenceText as writeStructuredReference } from './formulas/formula-text';\nimport type { ArgumentValue } from './formulas/function-definition';\nimport { findFunction } from './formulas/function-library';\nimport { matchReference, readReference, readStructuredReference, type ReferenceMatch, type ReferenceMatchPart } from './formulas/lexer';\nimport { quoteSheetName } from './formulas/reference';\nimport { elementAt } from './must';\nimport { formulaConstantLongest, writtenText } from './number-text';\nimport type { Value } from './value';\n\n/**\n * What a completion candidate names: a function of the declared set (`DeclaredFunction`), a Linked Table\n * declared on the Workbook (ADR-0049), a column of the Linked Table named before `[` (ADR-0058), or one of the\n * values an argument takes from a fixed list (ADR-0058).\n */\nexport type CompletionKind = 'function' | 'linkedTable' | 'linkedTableColumn' | 'argumentValue';\n\n/** One candidate completion offers (ADR-0051, ADR-0058). */\nexport interface CompletionCandidate {\n /** What the list shows: the name as declared, or for an argument's value, Excel's text for it (`0 - Exact match`). */\n readonly name: string;\n /** What it names. */\n readonly kind: CompletionKind;\n /**\n * What accepting it writes in place of what was typed: a function's name and its `(`, a table's name, a\n * column's name with any character the grammar reads specially escaped by `'`, an argument's value (`0`).\n */\n readonly insertText: string;\n /** One sentence for a function; `undefined` for the others. */\n readonly description: string | undefined;\n}\n\n/**\n * The candidates for what is being typed at the caret (ADR-0051): accepting one replaces the `length` characters\n * from `start` with its `insertText`.\n */\nexport interface FormulaCompletion {\n /** Where what is being typed starts in the text: a name, a column after `[`, an argument's value. */\n readonly start: number;\n /** How long it is, including any part of it after the caret. */\n readonly length: number;\n /**\n * The candidates, in the order to list them; never empty. Names are in alphabetical order, a table's columns\n * in the table's order, and an argument's values in Excel's.\n */\n readonly candidates: readonly CompletionCandidate[];\n}\n\n/** The argument hint (ADR-0051): the function whose argument list holds the caret, and which argument it is in. */\nexport interface ArgumentHint {\n /** The declared function. */\n readonly function: DeclaredFunction;\n /** Which argument the caret is in, from 0. */\n readonly argumentIndex: number;\n /**\n * That argument's name as `DeclaredFunction.arguments` lists it \u2014 for an open-ended function past its named\n * arguments, the one that repeats \u2014 or `undefined` when the caret is past the last argument the function takes.\n */\n readonly currentArgument: string | undefined;\n}\n\n/** Where Point mode writes a Reference: the `length` characters from `start` are replaced (none, for an insertion at the caret). */\nexport interface PointSite {\n /** Where the Reference goes in the text. */\n readonly start: number;\n /** How many characters it replaces. */\n readonly length: number;\n}\n\n/**\n * What F4 makes of the text being edited (ADR-0051): the new text, and the span in it of what was rewritten,\n * which a grid selects or collapses to a caret at its end as the edit stands.\n */\nexport interface ReferenceCycle {\n /** The text with the Reference or References cycled. */\n readonly text: string;\n /** Where what was rewritten starts in `text`: at its first column or row part, after any Sheet qualifier before it. */\n readonly selectionStart: number;\n /** Where it ends. */\n readonly selectionEnd: number;\n}\n\n/**\n * A Linked Table's column, as a structured reference names it (`Positions[PV]`): the key a Reference Outline is\n * told by (ADR-0057). Two are equal when they name the same table and the same column without regard to case, as\n * the Sheet finds a table and its column (ADR-0049).\n */\nexport class LinkedTableColumn {\n /** The table's name, as written. */\n readonly table: string;\n\n /** The column's name, as written, with its `'` escapes read. */\n readonly column: string;\n\n /** The column of `table` named `column`. */\n constructor(table: string, column: string) {\n this.table = table;\n this.column = column;\n }\n\n /** Whether `other` names the same table and column, without regard to case. */\n equals(other: LinkedTableColumn): boolean {\n return equalsIgnoreCase(this.table, other.table) && equalsIgnoreCase(this.column, other.column);\n }\n\n /** A string two equal columns share, for keying a `Map` as `equals` compares. */\n get key(): string {\n return JSON.stringify([ignoreCaseKey(this.table), ignoreCaseKey(this.column)]);\n }\n}\n\n/**\n * A Reference in the text of a Formula being edited (ADR-0057): where it is written, and what it names \u2014 cells on\n * this Sheet, or a Linked Table's column. Exactly one of `cells` and `linkedColumn` is set.\n */\nexport interface FormulaReference {\n /** Where it starts in the text, whose `=` is at 0. */\n readonly start: number;\n /** How many characters it spans, its Sheet qualifier included. */\n readonly length: number;\n /**\n * The cells it names, held from their top-left corner however it was written (`B2:A1` names A1:B2), whole\n * columns for `A:A` and whole rows for `1:1`; `undefined` for a structured reference.\n */\n readonly cells: CellRange | undefined;\n /** The Linked Table column a structured reference reads; `undefined` for cells. */\n readonly linkedColumn: LinkedTableColumn | undefined;\n}\n\ntype TokenKind = 'operand' | 'text' | 'operator' | 'open' | 'close' | 'comma';\n\ninterface Token {\n readonly kind: TokenKind;\n readonly start: number;\n readonly end: number;\n readonly text: string;\n readonly unterminated: boolean;\n readonly hasBrackets: boolean;\n}\n\n/** A parenthesis open at the caret: the function it calls (`undefined` for a grouping one), how many of its commas stand before the caret, and where the argument the caret is in starts. */\ninterface Frame {\n readonly function: string | undefined;\n readonly commas: number;\n readonly argumentStart: number;\n}\n\n/**\n * What F4 cycles in a Reference the grammar matched: the span it stands over, and its column and row parts in the\n * order written, each with whether it is a column.\n */\ninterface CycleTarget {\n readonly start: number;\n readonly end: number;\n readonly whole: boolean;\n readonly parts: readonly { readonly part: ReferenceMatchPart; readonly column: boolean }[];\n}\n\nconst operators = ['<>', '<=', '>=', '=', '<', '>', '+', '-', '*', '/', '^', '&', '%'];\nconst columnSpecials = ['[', ']', '#', '@', \"'\"];\nconst namePattern = /^[A-Za-z_\\\\][A-Za-z0-9_.]*$/;\nconst pointedPattern = /^\\$?[A-Za-z]{1,3}\\$?[1-9][0-9]{0,6}(?::\\$?[A-Za-z]{1,3}\\$?[1-9][0-9]{0,6})?$/;\n/** What may follow the colon of a range still being typed: nothing yet, or the start of a cell's address (`B`, `$B$`, `B1`). */\nconst secondCornerBegun = /^\\$?[A-Za-z]{0,3}\\$?[0-9]{0,7}$/;\n/** A number constant with one sign before it; white space after it is read apart, as .NET's `\\s` reads it. */\nconst signedNumberPattern = /^(?<sign>[+-]?)(?<number>(?:[0-9]+(?:\\.[0-9]*)?|\\.[0-9]+)(?:[eE][+-]?[0-9]+)?)(?<rest>.*)$/s;\nconst errorKey = 'An Error Value is not a key a lookup finds (ADR-0058).';\n\n// Pure answers over the text of a Formula being typed and its caret, for the aids ADR-0051 asks of the Consumer:\n// completion candidates, the argument hint, whether a Reference can go at the caret (Point mode), the Reference\n// text for a pointed range, and what F4 makes of the Reference at the caret; and, for ADR-0057's Reference\n// Outlines, every Reference in the text. Each works on unfinished text: nothing here requires the Formula to\n// parse. Text not beginning with `=` is not a Formula, and gets no aid.\n\n/**\n * What completion offers at the caret, following Excel's triggers (ADR-0051, ADR-0058):\n *\n * - at the end of a name standing where an operand can start, the declared functions and `linkedTables`\n * beginning with it, without regard to case;\n *\n * - inside the brackets of `Table[`, the columns of that table beginning with the column typed so far, in the\n * table's order, and nothing else: not `@` or `#All`, which the grammar refuses (ADR-0047). The brackets are\n * a context of their own, so at an argument whose values are a fixed list they list the columns too;\n *\n * - at an argument that takes one of a fixed list of values (`DeclaredFunction.valuesOf`), those values, in\n * Excel's order, and nothing else. They are listed before anything is typed, and only while nothing of the\n * argument stands after the caret, white space included. A number lists the value it is alone (`0` lists\n * `0 - Exact match`) and nothing when it is no value (`4`); any other text lists every value.\n *\n * `undefined` anywhere else \u2014 after `=`, an operator, `(` or `,` at any other argument or inside a grouping\n * parenthesis, inside text in quotes, a Reference, a number \u2014 and when nothing matches.\n *\n * @param text - The text being edited.\n * @param caret - Where the caret stands in it. Throws a RangeError outside 0 to the text's length.\n * @param linkedTables - The Linked Tables' names.\n * @param columnsOf - The columns of the Linked Table a name names, found without regard to case, in the\n * table's order; `undefined` for a name no table has. Left out, no table's columns are known, and nothing is\n * listed after `Table[`.\n */\nexport function completeFormula(text: string, caret: number, linkedTables: Iterable<string>,\n columnsOf?: (name: string) => readonly string[] | undefined): FormulaCompletion | undefined {\n if (!isFormula(text, caret)) return undefined;\n const tokens = scan(text);\n const index = tokens.findIndex(t => t.start < caret && caret <= t.end);\n const at = index >= 0 ? elementAt(tokens, index) : undefined;\n const bracketed = at !== undefined && at.kind === 'operand' && at.hasBrackets ? at : undefined;\n // Inside Table['s brackets a structured reference is being typed, a context of its own as a grouping\n // parenthesis is: its columns are listed at any argument (decided with the user, 2026-10-01).\n if (bracketed !== undefined && insideBrackets(text, caret, bracketed)) {\n return operandMayStart(tokens, index) && columnsOf !== undefined ? completeColumn(text, caret, bracketed, columnsOf) : undefined;\n }\n // An argument whose values are a fixed list is completed with them alone: letters there list no function\n // and no table, as Excel's do not (ADR-0058, the thirteenth run, Q54).\n const argument = valueArgumentAt(text, tokens, caret);\n if (argument !== undefined) return completeValue(text, caret, tokens, argument.start, argument.values);\n // Before a structured reference's brackets or past them, no name is being typed.\n if (bracketed !== undefined) return undefined;\n return index >= 0 ? completeName(text, caret, tokens, index, linkedTables) : undefined;\n}\n\n/**\n * The hint for the innermost function call whose argument list holds the caret, counting arguments by the\n * commas at its own depth; grouping parentheses inside it belong to it, and text in quotes is one argument\n * whatever it holds. `undefined` outside any call, or when that function is not declared. Throws a RangeError\n * when the caret lies outside 0 to the text's length.\n */\nexport function formulaHintAt(text: string, caret: number): ArgumentHint | undefined {\n if (!isFormula(text, caret)) return undefined;\n for (const frame of framesAt(text, scan(text), caret).toReversed()) {\n if (frame.function === undefined) continue;\n const declared = DeclaredFunction.find(frame.function);\n if (declared === undefined) return undefined;\n return { function: declared, argumentIndex: frame.commas, currentArgument: argumentName(declared, frame.commas) };\n }\n return undefined;\n}\n\n/**\n * Whether a Reference can be written at the caret (ADR-0051's Point predicate): the Formula stands after its\n * `=`, an operator (not `%`), `(` or `,`, with nothing after the caret that the Reference would run into.\n * `undefined` when it cannot. Throws a RangeError when the caret lies outside 0 to the text's length.\n */\nexport function formulaPointAt(text: string, caret: number): PointSite | undefined {\n if (!isFormula(text, caret)) return undefined;\n const tokens = scan(text);\n if (tokens.some(t => t.start < caret && caret < t.end) || tokens.some(t => t.unterminated && t.start < caret)) return undefined;\n const before = tokens.findLastIndex(t => t.end <= caret);\n if (!operandMayStart(tokens, before + 1) || !mayFollowOperand(tokens, caret)) return undefined;\n return { start: caret, length: 0 };\n}\n\n/**\n * The Reference that ends at the caret and stands where Point mode could have written it \u2014 the one a further\n * arrow key replaces while the user is pointing (ADR-0051). `undefined` when no Reference ends at the caret\n * in such a place. Only the component knows whether it is pointing; typed by hand, the same text is not\n * pointed. Kept off the package's surface, as the C# engine keeps it internal, until ExSheet's component is ported.\n */\nexport function pointedReferenceAt(text: string, caret: number): PointSite | undefined {\n if (!isFormula(text, caret)) return undefined;\n const tokens = scan(text);\n const index = tokens.findIndex(t => t.end === caret);\n if (index < 0) return undefined;\n const token = elementAt(tokens, index);\n if (token.kind !== 'operand' || !pointedPattern.test(text.slice(token.start, token.end))) return undefined;\n if (!operandMayStart(tokens, index) || !mayFollowOperand(tokens, caret)) return undefined;\n return { start: token.start, length: token.end - token.start };\n}\n\n/**\n * The Reference Point mode writes for a pointed range: `B7` for one cell, `B7:C9` from its top-left\n * otherwise. With `sheet`, the name of the Sheet the range was pointed at when that is not the one the\n * Formula is typed on (ADR-0331 \u00A75), the range qualified with it, quoted where a Reference must quote it \u2014\n * `Sheet2!B7`, `'Q1 Sales'!B7:C9`. Throws a RangeError when `sheet` is empty.\n */\nexport function referenceText(range: CellRange, sheet?: string): string {\n if (sheet === undefined) return range.toString();\n if (sheet.length === 0) throw new RangeError('The Sheet name is empty.');\n return `${quoteSheetName(sheet)}!${range.toString()}`;\n}\n\n/**\n * What Point writes for a pressed column of a Linked Table, through a Pointing Scope (ADR-0058): Excel's\n * structured reference, `Positions[PV]`, written as the engine writes one back \u2014 single brackets, with `'`\n * before each of `[ ] # ' @` in the column's name. Throws a RangeError when either name is empty.\n */\nexport function structuredReferenceText(table: string, column: string): string {\n if (table.length === 0) throw new RangeError('The table name is empty.');\n if (column.length === 0) throw new RangeError('The column name is empty.');\n return writeStructuredReference(table, column);\n}\n\n/**\n * A Value written as a Formula writes a constant of its kind (ADR-0058): text in double quotes, with any `\"`\n * in it doubled (`\"R-4471\"`); a number in the invariant form the engine writes a number constant in (`1250`,\n * `-0.5`); a boolean as `TRUE` or `FALSE`. `undefined` for an Error Value: a lookup by one finds nothing, so\n * nothing is written for it.\n */\nexport function constantText(value: Value): string | undefined {\n switch (value.kind) {\n case 'text':\n return `\"${value.text.replaceAll('\"', '\"\"')}\"`;\n case 'number':\n return writtenText(value.number, Culture.invariant, formulaConstantLongest);\n case 'boolean':\n return value.boolean ? 'TRUE' : 'FALSE';\n case 'error':\n return undefined;\n default:\n return unreachableKind(value.kind);\n }\n}\n\n/**\n * What Point writes for a pressed cell of a Linked Table, through a Pointing Scope (ADR-0058): the lookup that\n * reads the cell by its row's key, `XLOOKUP(\"R-4471\", Positions[Id], Positions[PV])` \u2014 the key as a constant\n * of its kind (`constantText`), then the key column and the pressed column as structured references\n * (`structuredReferenceText`). It names no position, so the Formula reads the same row after the grid that\n * showed it is sorted (ADR-0049, rule 2).\n *\n * For a key of several columns (ADR-0058, amended 2026-10-03), `keyColumns` and `keys` are lists, one Value\n * per key column, and the lookup reads the cell by every part of its row's key:\n * `XLOOKUP(1, (Cds[Entity]=\"ACME\")*(Cds[Tenor]=\"5Y\"), Cds[Spread])`. Each part is compared as the `=`\n * operator compares, and the row whose parts all match is the one read.\n *\n * Throws a RangeError when a name is empty, the key has not one Value per key column, or a part of it is an\n * Error Value, which no lookup finds.\n */\nexport function lookupText(table: string, keyColumn: string, key: Value, column: string): string;\n/**\n * What Point writes for a pressed cell of a Linked Table, through a Pointing Scope (ADR-0058): the lookup that\n * reads the cell by its row's key, `XLOOKUP(\"R-4471\", Positions[Id], Positions[PV])` \u2014 the key as a constant\n * of its kind (`constantText`), then the key column and the pressed column as structured references\n * (`structuredReferenceText`). It names no position, so the Formula reads the same row after the grid that\n * showed it is sorted (ADR-0049, rule 2).\n *\n * For a key of several columns (ADR-0058, amended 2026-10-03), `keyColumns` and `keys` are lists, one Value\n * per key column, and the lookup reads the cell by every part of its row's key:\n * `XLOOKUP(1, (Cds[Entity]=\"ACME\")*(Cds[Tenor]=\"5Y\"), Cds[Spread])`. Each part is compared as the `=`\n * operator compares, and the row whose parts all match is the one read.\n *\n * Throws a RangeError when a name is empty, the key has not one Value per key column, or a part of it is an\n * Error Value, which no lookup finds.\n */\nexport function lookupText(table: string, keyColumns: readonly string[], keys: readonly Value[], column: string): string;\nexport function lookupText(table: string, keyColumns: string | readonly string[], keys: Value | readonly Value[], column: string): string {\n if (typeof keyColumns === 'string') {\n if (isList(keys)) throw new TypeError('One key column takes one Value.');\n const constant = constantText(keys);\n if (constant === undefined) throw new RangeError(errorKey);\n return `XLOOKUP(${constant}, ${structuredReferenceText(table, keyColumns)}, ${structuredReferenceText(table, column)})`;\n }\n if (!isList(keys)) throw new TypeError('Several key columns take one Value each.');\n if (keyColumns.length === 0 || keyColumns.length !== keys.length) throw new RangeError('The key has one Value per key column.');\n if (keyColumns.length === 1) return lookupText(table, elementAt(keyColumns, 0), elementAt(keys, 0), column);\n const parts = keyColumns.map((keyColumn, i) => {\n const constant = constantText(elementAt(keys, i));\n if (constant === undefined) throw new RangeError(errorKey);\n return `(${structuredReferenceText(table, keyColumn)}=${constant})`;\n });\n return `XLOOKUP(1, ${parts.join('*')}, ${structuredReferenceText(table, column)})`;\n}\n\n/**\n * Whether the lookup `lookupText` writes for `key` finds a row whose key is `candidate`: `XLOOKUP`'s exact\n * match, which tells a number from text and text apart without regard to case, and never matches a blank\n * (`undefined`) or an Error Value. A Pointing Scope finds the row a press was written for by it, wherever the\n * grid that shows the table has sorted that row to (ADR-0058, \"What is drawn\").\n *\n * For a key of several columns, `key` and `candidate` are lists, one Value per key column: every part equal as\n * the `=` operator finds it \u2014 of one kind, text without regard to case, numbers at Excel's fifteen digits \u2014\n * and none blank or an Error Value.\n */\nexport function lookupFinds(key: Value, candidate: Value | undefined): boolean;\n/**\n * Whether the lookup `lookupText` writes for `key` finds a row whose key is `candidate`: `XLOOKUP`'s exact\n * match, which tells a number from text and text apart without regard to case, and never matches a blank\n * (`undefined`) or an Error Value. A Pointing Scope finds the row a press was written for by it, wherever the\n * grid that shows the table has sorted that row to (ADR-0058, \"What is drawn\").\n *\n * For a key of several columns, `key` and `candidate` are lists, one Value per key column: every part equal as\n * the `=` operator finds it \u2014 of one kind, text without regard to case, numbers at Excel's fifteen digits \u2014\n * and none blank or an Error Value.\n */\nexport function lookupFinds(keys: readonly Value[], candidates: readonly (Value | undefined)[]): boolean;\nexport function lookupFinds(keys: Value | readonly Value[], candidates: Value | undefined | readonly (Value | undefined)[]): boolean {\n if (!isList(keys)) {\n if (isList(candidates)) throw new TypeError('One key is compared with one Value.');\n return candidates !== undefined && candidates.kind === keys.kind && !keys.isError && compareValues(candidates, keys) === 0;\n }\n if (!isList(candidates)) throw new TypeError('A key of several Values is compared with as many.');\n if (keys.length !== candidates.length) return false;\n if (keys.length === 1) return lookupFinds(elementAt(keys, 0), candidates[0]);\n for (let i = 0; i < keys.length; i++) {\n const value = candidates[i];\n const key = elementAt(keys, i);\n if (value === undefined || value.kind !== key.kind || key.isError) return false;\n if (compareValues(value, key, approximatelyEqual) !== 0) return false;\n }\n return true;\n}\n\n/**\n * F4 (ADR-0051, 2026-09-29; as Excel does it, the seventeenth Windows run): the Reference at the caret cycled\n * to its next form \u2014 `A1` \u2192 `$A$1` \u2192 `A$1` \u2192 `$A1` \u2192 `A1` \u2014 answered with the span of what was rewritten. The\n * Reference at the caret is the one the caret is inside or touching, on either side; the two ends of a cell\n * range are References of their own, so only the end at the caret cycles, from its own form. With a\n * selection, every end it covers, overlaps or touches cycles, each to the next form of the first one. Whole\n * columns and whole rows are one Reference of two forms (`A:A` \u2194 `$A:$A`); a Sheet qualifier is kept, before\n * the first end, and only the cell part cycles. The rewritten parts' column letters are written in upper\n * case; every other character stays as it was typed. The span answered runs from the first Reference\n * rewritten, after its Sheet qualifier, to the end of the last. `undefined` \u2014 nothing changes \u2014 for text that\n * is not a Formula, and where no Reference is at the caret or in the selection.\n *\n * @param text - The text being edited.\n * @param selectionStart - Where the selection starts, or the caret.\n * @param selectionEnd - Where the selection ends; `selectionStart` for a caret. Throws a RangeError when the\n * selection does not lie inside the text.\n */\nexport function cycleReference(text: string, selectionStart: number, selectionEnd: number): ReferenceCycle | undefined {\n if (!Number.isInteger(selectionStart) || selectionStart < 0 || selectionStart > text.length) {\n throw new RangeError(\"The selection starts 0 to the text's length.\");\n }\n if (!Number.isInteger(selectionEnd) || selectionEnd < selectionStart || selectionEnd > text.length) {\n throw new RangeError(\"The selection ends from its start to the text's length.\");\n }\n if (text.length === 0 || text.charAt(0) !== '=') return undefined;\n\n // Inside or touching, for a caret and a selection alike (observed in Excel: + selected in =A1+B1 gives\n // =$A$1+$B$1). A caret takes the first Reference it touches.\n const caret = selectionStart === selectionEnd;\n const targets: CycleTarget[] = [];\n for (const token of scan(text)) {\n const touched = token.start <= selectionEnd && selectionStart <= token.end;\n if (!touched || token.kind !== 'operand' || token.unterminated || token.hasBrackets) continue;\n // The operand is a Reference only where the grammar reads one over the whole of it.\n const reference = matchReference(text, token.start);\n if (reference === undefined || reference.index + reference.length !== token.end) continue;\n for (const target of targetsOf(reference)) {\n if (target.start > selectionEnd || selectionStart > target.end) continue;\n targets.push(target);\n if (caret) break;\n }\n if (caret && targets.length > 0) break;\n }\n const first = targets[0];\n if (first === undefined) return undefined;\n\n const form = nextForm(first);\n let rewritten = '';\n let at = 0;\n // The span starts at the first part rewritten: a Sheet qualifier before it is kept as it was typed, and\n // lies outside what F4 rewrote (observed, run 18a).\n const start = elementAt(first.parts, 0).part.index;\n for (const target of targets) {\n for (const { part, column } of target.parts) {\n rewritten += text.slice(at, part.index);\n if (column ? form.column : form.row) rewritten += '$';\n const written = part.value.replace(/^\\$+/, '');\n rewritten += column ? toUpperInvariant(written) : written;\n at = part.index + part.value.length;\n }\n }\n const end = rewritten.length;\n rewritten += text.slice(at);\n return { text: rewritten, selectionStart: start, selectionEnd: end };\n}\n\n/**\n * Every Reference in the text of a Formula being edited, in the order written (ADR-0057): its span, and the\n * cells it names or, for a structured reference, the Linked Table column it reads. A Reference is what the\n * formula grammar reads as one over the whole of an operand, as for F4. The text need not parse: an unfinished\n * Formula (`=SUM(A1,`) is answered as far as it goes, and an unclosed string, quoted Sheet name or bracket\n * hides only what follows it. Nothing inside a string is a Reference, nor is a function name (`LOG10(`), nor\n * one qualified with another Sheet's name, which names no cells. A range typed as far as its colon\n * (`=SUM(A1:`) answers its first corner, the colon left out. Text beginning with `+` or `-` is answered as a\n * Formula is, as Excel colours it and ExSheet enters it (`=+A1`); other text is answered with nothing (the\n * eighth Windows run, cases 24\u201326).\n *\n * @param text - The text being edited.\n * @param sheetName - This Sheet's name: a Reference qualified with it, without regard to case, names this Sheet's cells.\n */\nexport function formulaReferences(text: string, sheetName: string): readonly FormulaReference[] {\n const lead = text.charAt(0);\n if (lead !== '=' && lead !== '+' && lead !== '-') return [];\n\n const references: FormulaReference[] = [];\n for (const token of scan(text)) {\n if (token.kind !== 'operand' || token.unterminated) continue;\n const length = token.end - token.start;\n if (token.hasBrackets) {\n const structured = readStructuredReference(text, token.start);\n if (structured !== undefined && structured.length === length) {\n references.push({ start: token.start, length, cells: undefined, linkedColumn: new LinkedTableColumn(structured.table, structured.column) });\n }\n continue;\n }\n const read = readOperandReference(text, token.start, length);\n if (read === undefined) continue;\n const qualifier = read.reference.sheetName;\n if (qualifier !== undefined && !equalsIgnoreCase(qualifier, sheetName)) continue;\n const area = read.reference.area;\n const cells = new CellRange(new CellAddress(area.row1, area.column1), new CellAddress(area.row2, area.column2));\n references.push({ start: token.start, length: read.length, cells, linkedColumn: undefined });\n }\n return references;\n}\n\nfunction unreachableKind(kind: never): never {\n throw new Error(`Internal: ${String(kind)} is no kind of Value.`);\n}\n\nfunction isList<T>(value: T | readonly T[]): value is readonly T[] {\n return Array.isArray(value);\n}\n\nfunction isFormula(text: string, caret: number): boolean {\n if (!Number.isInteger(caret) || caret < 0 || caret > text.length) throw new RangeError(\"The caret is 0 to the text's length.\");\n return text.length > 0 && text.charAt(0) === '=' && caret >= 1;\n}\n\n/**\n * Whether the caret stands inside the brackets of a structured reference: after its first `[`, and not past the\n * `]` that closes it, `'` escapes read as the scan reads them.\n */\nfunction insideBrackets(text: string, caret: number, token: Token): boolean {\n const open = indexWithin(text, '[', token.start, token.end);\n if (open < 0 || caret <= open) return false;\n let depth = 0;\n for (let i = open; i < caret; i++) {\n const c = text.charAt(i);\n if (c === \"'\") {\n i++;\n continue;\n }\n if (c === '[') depth++;\n else if (c === ']' && --depth === 0) return false;\n }\n return true;\n}\n\n/** Where `c` first stands in `text` from `from` up to `end`, or -1. */\nfunction indexWithin(text: string, c: string, from: number, end: number): number {\n const index = text.indexOf(c, from);\n return index >= 0 && index < end ? index : -1;\n}\n\n/** The functions and tables beginning with the name that ends at the caret. */\nfunction completeName(text: string, caret: number, tokens: readonly Token[], index: number, linkedTables: Iterable<string>): FormulaCompletion | undefined {\n const token = elementAt(tokens, index);\n if (token.kind !== 'operand' || token.unterminated) return undefined;\n const prefix = text.slice(token.start, caret);\n if (!namePattern.test(prefix) || !operandMayStart(tokens, index)) return undefined;\n // Inside a Reference no name is being typed: =F|3 is the cell F3 with the caret in it. At its end the text\n // may still be a name's beginning (=LOG1 lists LOG10), as Excel's list shows.\n if (caret < token.end) {\n const reference = readReference(text, token.start);\n if (reference !== undefined && token.start + reference.length === token.end) return undefined;\n }\n\n const candidates: CompletionCandidate[] = [];\n for (const f of DeclaredFunction.all) {\n if (startsWithAtIgnoreCase(f.name, 0, prefix)) candidates.push({ name: f.name, kind: 'function', insertText: `${f.name}(`, description: f.description });\n }\n for (const t of linkedTables) {\n if (startsWithAtIgnoreCase(t, 0, prefix)) candidates.push({ name: t, kind: 'linkedTable', insertText: t, description: undefined });\n }\n return candidates.length === 0\n ? undefined\n : { start: token.start, length: token.end - token.start, candidates: candidates.toSorted((a, b) => compareIgnoreCase(a.name, b.name)) };\n}\n\n/**\n * The columns after `Table[` (ADR-0058): the caret stands inside the one pair of brackets the grammar reads, after\n * a declared table's name, and what is typed before it is the beginning of a column, `'` escapes read. Accepting a\n * column writes its name, escaped, over the column typed \u2014 up to the closing bracket when there is one \u2014 and\n * leaves the closing bracket to the user, as for a table's name.\n */\nfunction completeColumn(text: string, caret: number, token: Token, columnsOf: (name: string) => readonly string[] | undefined): FormulaCompletion | undefined {\n const open = indexWithin(text, '[', token.start, token.end);\n if (open < 0 || caret <= open) return undefined;\n const table = text.slice(token.start, open);\n if (!namePattern.test(table)) return undefined;\n const columns = columnsOf(table);\n if (columns === undefined || columns.length === 0) return undefined;\n\n let typed = '';\n let end = -1;\n for (let i = open + 1; i < token.end; i++) {\n const c = text.charAt(i);\n if (c === \"'\") {\n // An escape the caret splits leaves no column typed that can be read.\n if (i < caret && i + 1 >= caret) return undefined;\n if (i < caret) typed += text.charAt(i + 1);\n i++;\n continue;\n }\n if (c === ']') {\n end = i;\n break;\n }\n // A second bracket, #All and @ are forms the grammar refuses (ADR-0047). Past the caret, only a second\n // bracket matters: the first ] would not close this one.\n if (c === '[' || (i < caret && (c === '#' || c === '@'))) return undefined;\n if (i < caret) typed += c;\n }\n if (end >= 0 && end < caret) return undefined;\n const candidates = columns\n .filter(column => startsWithAtIgnoreCase(column, 0, typed))\n .map((column): CompletionCandidate => ({ name: column, kind: 'linkedTableColumn', insertText: escapeColumn(column), description: undefined }));\n const start = open + 1;\n return candidates.length === 0 ? undefined : { start, length: (end >= 0 ? end : caret) - start, candidates };\n}\n\n/** A column's name as a structured reference writes it: `'` before each character the grammar reads specially. */\nfunction escapeColumn(column: string): string {\n let escaped = '';\n for (const c of column) {\n if (columnSpecials.includes(c)) escaped += \"'\";\n escaped += c;\n }\n return escaped;\n}\n\n/**\n * Where the argument the caret stands at starts, and its values, when the innermost parenthesis open at the caret\n * is a declared function's and that argument takes one of a fixed list (ADR-0058); `undefined` anywhere else.\n * Inside a grouping parenthesis the caret stands in an expression of its own, as inside a call of its own\n * (decided with the user, 2026-10-01).\n */\nfunction valueArgumentAt(text: string, tokens: readonly Token[], caret: number): { start: number; values: readonly ArgumentValue[] } | undefined {\n const call = framesAt(text, tokens, caret).at(-1);\n if (call?.function === undefined) return undefined;\n const declared = DeclaredFunction.find(call.function);\n if (declared === undefined) return undefined;\n const values = declared.valuesOf(call.commas);\n return values.length === 0 ? undefined : { start: call.argumentStart, values };\n}\n\n/**\n * The values of an argument that takes one of a fixed list (ADR-0058), while nothing of it stands after the\n * caret: the caret is at the argument's end, before the `,` or `)` that ends it. Before a value, inside one or\n * before white space Excel lists nothing (Part B of the ninth Windows run, Q49; the thirteenth, Q55). A number or\n * boolean lists the value it is alone, a number no value takes lists nothing; any other text lists every value\n * (the tenth and thirteenth Windows runs, Q54). Accepting one writes it over everything typed in the argument.\n */\nfunction completeValue(text: string, caret: number, tokens: readonly Token[], argumentStart: number, values: readonly ArgumentValue[]): FormulaCompletion | undefined {\n if (tokens.some(t => t.start < caret && caret < t.end)) return undefined;\n if (caret < text.length && text.charAt(caret) !== ',' && text.charAt(caret) !== ')') return undefined;\n\n let start = argumentStart;\n while (start < caret && isWhiteSpace(text.charCodeAt(start))) start++;\n const typed = text.slice(start, caret);\n const number = numberOf(typed);\n let listed: readonly ArgumentValue[];\n if (number !== undefined) {\n listed = values.filter(v => numberOf(v.value) === number);\n } else {\n const literal = values.find(v => equalsIgnoreCase(v.value, trimWhiteSpaceBoth(typed)));\n listed = literal === undefined ? values : [literal];\n }\n if (listed.length === 0) return undefined;\n const candidates = listed.map((v): CompletionCandidate => ({ name: v.text, kind: 'argumentValue', insertText: v.value, description: undefined }));\n return { start, length: caret - start, candidates };\n}\n\n/** `string.Trim()`: white space as `char.IsWhiteSpace` reads it, off both ends. */\nfunction trimWhiteSpaceBoth(text: string): string {\n let start = 0;\n let end = text.length;\n while (start < end && isWhiteSpace(text.charCodeAt(start))) start++;\n while (end > start && isWhiteSpace(text.charCodeAt(end - 1))) end--;\n return text.slice(start, end);\n}\n\n/**\n * The number `typed` is, read as the grammar reads a number constant with one sign before it and white space\n * after it (`-1`, `+1`, `1.0`, `1 `), or `undefined` for text that is not a number (`-`, `1+`, `A1`; decided with\n * the user, 2026-10-01).\n */\nfunction numberOf(typed: string): number | undefined {\n const match = signedNumberPattern.exec(typed);\n const groups = match?.groups;\n if (groups === undefined) return undefined;\n const { sign, number, rest } = groups;\n if (sign === undefined || number === undefined || rest === undefined) throw new Error('Internal: the number pattern matched without its groups.');\n for (let i = 0; i < rest.length; i++) {\n if (!isWhiteSpace(rest.charCodeAt(i))) return undefined;\n }\n const value = parseFormulaNumber(number);\n return sign === '-' ? -value : value;\n}\n\n/** The parentheses open at the caret, the innermost last. */\nfunction framesAt(text: string, tokens: readonly Token[], caret: number): Frame[] {\n const frames: Frame[] = [];\n for (let i = 0; i < tokens.length; i++) {\n const token = elementAt(tokens, i);\n if (token.end > caret) break;\n switch (token.kind) {\n case 'open': {\n const previous = i > 0 ? elementAt(tokens, i - 1) : undefined;\n const name = previous === undefined ? '' : text.slice(previous.start, previous.end);\n const callee = previous !== undefined && previous.kind === 'operand' && previous.end === token.start && namePattern.test(name) ? name : undefined;\n frames.push({ function: callee, commas: 0, argumentStart: token.end });\n break;\n }\n case 'close':\n frames.pop();\n break;\n case 'comma': {\n const frame = frames.pop();\n if (frame !== undefined) frames.push({ function: frame.function, commas: frame.commas + 1, argumentStart: token.end });\n break;\n }\n case 'operand':\n case 'text':\n case 'operator':\n break;\n default:\n return unreachableToken(token.kind);\n }\n }\n return frames;\n}\n\nfunction unreachableToken(kind: never): never {\n throw new Error(`Internal: ${String(kind)} is no kind of token.`);\n}\n\nfunction argumentName(declared: DeclaredFunction, index: number): string | undefined {\n const names = declared.arguments.split(', ');\n const last = elementAt(names, names.length - 1);\n if (index < names.length && elementAt(names, index) !== '...') return elementAt(names, index);\n if (last === '...') {\n const definition = findFunction(declared.name);\n if (definition?.inPairs === true) return elementAt(names, definition.pairOffset + (index - definition.pairOffset) % 2);\n return elementAt(names, names.length - 2);\n }\n return undefined;\n}\n\n/** What F4 cycles in a Reference the grammar matched: a cell range's two ends are two, a whole column or row one. */\nfunction targetsOf(reference: ReferenceMatch): CycleTarget[] {\n const end = reference.index + reference.length;\n const group = (name: string): ReferenceMatchPart | undefined => reference.groups[name];\n const required = (name: string): ReferenceMatchPart => {\n const part = group(name);\n if (part === undefined) throw new Error(`Internal: the Reference matched without its ${name}.`);\n return part;\n };\n if (group('cc1') !== undefined) {\n return [{ start: reference.index, end, whole: true, parts: [{ part: required('cc1'), column: true }, { part: required('cc2'), column: true }] }];\n }\n if (group('rr1') !== undefined) {\n return [{ start: reference.index, end, whole: true, parts: [{ part: required('rr1'), column: false }, { part: required('rr2'), column: false }] }];\n }\n const c1 = required('c1');\n const r1 = required('r1');\n const targets: CycleTarget[] = [{ start: reference.index, end: r1.index + r1.value.length, whole: false, parts: [{ part: c1, column: true }, { part: r1, column: false }] }];\n const c2 = group('c2');\n if (c2 !== undefined) {\n const r2 = required('r2');\n targets.push({ start: c2.index, end: r2.index + r2.value.length, whole: false, parts: [{ part: c2, column: true }, { part: r2, column: false }] });\n }\n return targets;\n}\n\n/**\n * The form F4 gives next, from `target`'s own parts: whether columns and rows are written with `$`. A cell's four\n * forms run relative, both, the row alone, the column alone; whole columns and whole rows have two, relative and\n * absolute, taken from their first part, and give both axes the one they take.\n */\nfunction nextForm(target: CycleTarget): { column: boolean; row: boolean } {\n const firstAbsolute = elementAt(target.parts, 0).part.value.startsWith('$');\n if (target.whole) return firstAbsolute ? { column: false, row: false } : { column: true, row: true };\n const secondAbsolute = elementAt(target.parts, 1).part.value.startsWith('$');\n if (!firstAbsolute && !secondAbsolute) return { column: true, row: true };\n if (firstAbsolute && secondAbsolute) return { column: false, row: true };\n if (!firstAbsolute) return { column: true, row: false };\n return { column: false, row: false };\n}\n\n/**\n * The operand at `start` read as a Reference over the whole of it, as F4 reads one; or, while a range is typed as\n * far as its colon or into its second corner (`A1:`, `A1:B`), its first corner, which Excel colours (the eighth\n * Windows run, case 26). The colon looked for is the one after a Sheet qualifier's `!`, not one inside a quoted\n * Sheet name, and what follows it must be the start of a second corner and no more.\n */\nfunction readOperandReference(text: string, start: number, length: number): ReturnType<typeof readReference> {\n const whole = readReference(text, start);\n if (whole !== undefined && whole.length === length) return whole;\n const bang = text.lastIndexOf('!', start + length - 1);\n const from = bang >= start ? bang + 1 : start;\n const colon = indexWithin(text, ':', from, start + length);\n if (colon <= start || !secondCornerBegun.test(text.slice(colon + 1, start + length))) return undefined;\n const first = readReference(text.slice(0, colon), start);\n return first !== undefined && first.length === colon - start ? first : undefined;\n}\n\n/** Whether an operand can start at token `index`: right after the `=`, an operator that takes a right side, `(` or `,`. */\nfunction operandMayStart(tokens: readonly Token[], index: number): boolean {\n if (index === 0) return true;\n const previous = elementAt(tokens, index - 1);\n return previous.kind === 'open' || previous.kind === 'comma' || (previous.kind === 'operator' && previous.text !== '%');\n}\n\n/** Whether what follows the caret leaves room for an operand: the end, `)`, `,` or an operator. */\nfunction mayFollowOperand(tokens: readonly Token[], caret: number): boolean {\n const next = tokens.find(t => t.start >= caret);\n return next === undefined || next.kind === 'close' || next.kind === 'comma' || next.kind === 'operator';\n}\n\nfunction makeToken(kind: TokenKind, start: number, end: number, text: string, unterminated = false, hasBrackets = false): Token {\n return { kind, start, end, text, unterminated, hasBrackets };\n}\n\n/**\n * A tolerant scan of a Formula's text after its `=`: text in quotes, parentheses, commas, operators, and operands\n * \u2014 a run of name, number, Reference or Error Value characters, with a quoted Sheet name and a structured\n * reference's brackets inside it. It never fails: an unclosed quote or bracket runs to the end and is marked so.\n */\nfunction scan(text: string): Token[] {\n const tokens: Token[] = [];\n let i = 1;\n while (i < text.length) {\n const c = text.charAt(i);\n if (isWhiteSpace(text.charCodeAt(i))) {\n i++;\n continue;\n }\n const start = i;\n if (c === '\"') {\n i++;\n let closed = false;\n while (i < text.length) {\n if (text.charAt(i) === '\"') {\n if (i + 1 < text.length && text.charAt(i + 1) === '\"') {\n i += 2;\n continue;\n }\n i++;\n closed = true;\n break;\n }\n i++;\n }\n tokens.push(makeToken('text', start, i, text.slice(start, i), !closed));\n continue;\n }\n if (c === '(' || c === ')' || c === ',') {\n tokens.push(makeToken(c === '(' ? 'open' : c === ')' ? 'close' : 'comma', i, i + 1, c));\n i++;\n continue;\n }\n const op = operators.find(o => startsWithAt(text, i, o));\n if (op !== undefined) {\n tokens.push(makeToken('operator', i, i + op.length, op));\n i += op.length;\n continue;\n }\n\n // An Error Value, whose spelling holds characters that are operators elsewhere (#DIV/0!).\n if (c === '#') {\n i++;\n while (i < text.length && (isAsciiLetterOrDigit(text.charCodeAt(i)) || '/!?_'.includes(text.charAt(i)))) i++;\n tokens.push(makeToken('operand', start, i, text.slice(start, i)));\n continue;\n }\n\n // An operand: everything up to the next space, quote, parenthesis, comma or operator, with a quoted Sheet\n // name and bracketed columns read whole.\n let unterminated = false;\n let brackets = false;\n while (i < text.length && !unterminated) {\n const d = text.charAt(i);\n if (d === \"'\") {\n i++;\n unterminated = true;\n while (i < text.length) {\n if (text.charAt(i) === \"'\" && !(i + 1 < text.length && text.charAt(i + 1) === \"'\")) {\n i++;\n unterminated = false;\n break;\n }\n i += text.charAt(i) === \"'\" ? 2 : 1;\n }\n continue;\n }\n if (d === '[') {\n brackets = true;\n let depth = 0;\n unterminated = true;\n while (i < text.length) {\n if (text.charAt(i) === \"'\" && i + 1 < text.length) {\n i += 2;\n continue;\n }\n if (text.charAt(i) === '[') depth++;\n else if (text.charAt(i) === ']' && --depth === 0) {\n i++;\n unterminated = false;\n break;\n }\n i++;\n }\n continue;\n }\n if (isWhiteSpace(text.charCodeAt(i)) || d === '\"' || d === '(' || d === ')' || d === ',' || operators.some(o => o.charAt(0) === d)) break;\n i++;\n }\n if (i === start) i++;\n tokens.push(makeToken('operand', start, i, text.slice(start, i), unterminated, brackets));\n }\n return tokens;\n}\n", "// The shape of the array a refused Formula would spill, where its text alone settles it, whatever Values it reads\n// (C#'s KnownShape.cs; 2026-10-13, decided with the user: a refused Anchor whose array shape is known spills\n// refusals over that shape). Excel's array has that shape whatever the refused Values are, so each cell of it reads\n// as refused; where the shape could depend on a Value, nothing is known and nothing spills.\n//\n// Known: a constant (one Value); a Reference the text names to a rectangle of this Sheet, not a Spill Range (`A1#`)\n// and not one that names another Sheet or a Linked Table; an operator over those, which Excel applies to each Value\n// and pairs by the larger extent, as the evaluator does; `TRANSPOSE` of a known shape; and a call whose every\n// argument is one Value, of a function that cannot give a Reference or an array from one Value (not `SEQUENCE`, nor\n// `INDIRECT`, `OFFSET` and the others that can give a Reference). Not known, among the rest: `FILTER` and `UNIQUE`,\n// whose extent depends on the Values; `SORT` and `SORTBY`, which may answer one Error Value for an argument they\n// refuse; `LET`; and a function given an array where it wants one Value (ADR-0125).\nimport { equalsIgnoreCase } from '../dotnet';\nimport type { Node } from './nodes';\nimport type { Reference } from './reference';\nimport { ValueArray } from './value-array';\n\n/** An array's extent. */\nexport interface Shape {\n readonly rows: number;\n readonly columns: number;\n}\n\nconst one: Shape = { rows: 1, columns: 1 };\n\nconst pairedOperators = new Set(['+', '-', '*', '/', '^', '&', '=', '<>', '<', '>', '<=', '>=']);\n\n/** The shape, or `undefined` where the text does not settle it. */\nexport function knownShape(node: Node, isLocal: (reference: Reference) => boolean): Shape | undefined {\n switch (node.kind) {\n case 'number':\n case 'text':\n case 'boolean':\n case 'error':\n case 'missing':\n return one;\n case 'reference': {\n const reference = node.reference;\n if (reference.spilled || reference.isThreeD || !isLocal(reference)) return undefined;\n const area = reference.area;\n return area.rows * area.columns <= ValueArray.mostCells ? { rows: area.rows, columns: area.columns } : undefined;\n }\n case 'parentheses':\n return knownShape(node.inner, isLocal);\n case 'unary':\n case 'percent':\n return knownShape(node.operand, isLocal);\n case 'binary': {\n // Along the chain of left operands in a loop, left to right: a long chain does not deepen the stack.\n const spine = node.spine;\n let shape: Shape | undefined = knownShape(node.leftmost, isLocal);\n if (shape === undefined) return undefined;\n for (const binary of spine) {\n if (!pairedOperators.has(binary.operator)) return undefined;\n const right = knownShape(binary.right, isLocal);\n if (right === undefined) return undefined;\n const rows: number = shape.rows === 1 ? right.rows : right.rows === 1 ? shape.rows : Math.max(shape.rows, right.rows);\n const columns: number = shape.columns === 1 ? right.columns : right.columns === 1 ? shape.columns : Math.max(shape.columns, right.columns);\n if (rows * columns > ValueArray.mostCells) return undefined;\n shape = { rows, columns };\n }\n return shape;\n }\n case 'function': {\n const definition = node.function;\n if (definition === undefined) return one; // #NAME?, one Value\n const first = node.arguments[0];\n if (equalsIgnoreCase(node.name, 'TRANSPOSE') && node.arguments.length === 1 && first !== undefined) {\n const inner = knownShape(first, isLocal);\n return inner === undefined ? undefined : { rows: inner.columns, columns: inner.rows };\n }\n if (definition.returnsReference || equalsIgnoreCase(node.name, 'SEQUENCE')) return undefined;\n return node.arguments.every(a => isOne(knownShape(a, isLocal))) ? one : undefined;\n }\n case 'name':\n case 'let':\n case 'intersection':\n case 'structuredReference':\n return undefined;\n default:\n throw new Error(`Internal: ${String(node)} is no kind of node.`);\n }\n}\n\nfunction isOne(shape: Shape | undefined): boolean {\n return shape !== undefined && shape.rows === 1 && shape.columns === 1;\n}\n", "// One insertion or deletion of whole rows or columns (C#'s StructuralEdit in ReferenceRewriter.cs; ADR-0046):\n// rows and columns are places, so what lies beyond the edit moves, and every Reference is rewritten to keep\n// naming the same cells.\nimport { CellAddress, columnCount, rowCount } from '../cell-address';\nimport type { Reference } from './reference';\n\n/** Which of a Sheet's two axes an insertion or deletion runs along. */\nexport type SheetAxis = 'rows' | 'columns';\n\n/** What a structural edit asks of the Sheet it rewrites: whether a Reference names a cell of that Sheet. */\nexport interface LocalReferences {\n isLocal(reference: Reference): boolean;\n}\n\n/** One insertion or deletion of whole rows or columns. */\nexport class StructuralEdit {\n readonly axis: SheetAxis;\n readonly start: number;\n readonly count: number;\n readonly isInsert: boolean;\n\n constructor(axis: SheetAxis, start: number, count: number, isInsert: boolean) {\n this.axis = axis;\n this.start = start;\n this.count = count;\n this.isInsert = isInsert;\n }\n\n get size(): number {\n return this.axis === 'rows' ? rowCount : columnCount;\n }\n\n get #max(): number {\n return this.size - 1;\n }\n\n get #end(): number {\n return this.start + this.count - 1;\n }\n\n /** The edit that undoes this one. */\n get inverse(): StructuralEdit {\n return new StructuralEdit(this.axis, this.start, this.count, !this.isInsert);\n }\n\n equals(other: StructuralEdit): boolean {\n return this.axis === other.axis && this.start === other.start && this.count === other.count && this.isInsert === other.isInsert;\n }\n\n describe(): string {\n const noun = this.axis === 'rows' ? 'row' : 'column';\n const at = this.axis === 'rows' ? String(this.start + 1) : CellAddress.columnName(this.start);\n return `${this.isInsert ? 'inserting' : 'deleting'} ${String(this.count)} ${noun}${this.count === 1 ? '' : 's'} at ${at}`;\n }\n\n /** Throws a `RangeError` for a start or count outside the Sheet. */\n validate(): void {\n const noun = this.axis === 'rows' ? 'row' : 'column';\n if (!Number.isInteger(this.start) || this.start < 0 || this.start >= this.size) throw new RangeError(`A ${noun} is 0 to ${String(this.#max)}.`);\n if (!Number.isInteger(this.count) || this.count < 1 || this.count > this.size - this.start) {\n throw new RangeError(`The count is 1 to ${String(this.size - this.start)} here.`);\n }\n }\n\n /** Where a cell goes: its new address, or `undefined` when it is deleted or pushed off the edge. */\n move(address: CellAddress): CellAddress | undefined {\n const p = this.axis === 'rows' ? address.row : address.column;\n let moved: number;\n if (this.isInsert) {\n if (p < this.start) return address;\n moved = p + this.count;\n if (moved > this.#max) return undefined;\n } else {\n if (p < this.start) return address;\n if (p <= this.#end) return undefined;\n moved = p - this.count;\n }\n return this.axis === 'rows' ? new CellAddress(moved, address.column) : new CellAddress(address.row, moved);\n }\n\n /**\n * A Reference rewritten as Excel rewrites it: an insertion at or before a range's first cell moves it, one\n * inside it grows it; a deletion shrinks it, moves it, or \u2014 when it takes every cell it named \u2014 makes it\n * `#REF!` (`undefined`). A Reference that spans the whole axis (`A:A` for rows) is untouched, as is one\n * qualified with another Sheet's name (ADR-0046); one qualified with the Sheet's own name is rewritten like\n * any other. An insertion that pushes the cells a Reference names off the edge does not stop the insertion,\n * as it does not in Excel (observed, verification/2026-09-27-windows-excel): a range pushed partly off is cut\n * at the edge (`A2:A1048576`, a row inserted at 1, is `A3:A1048576`), and a Reference pushed wholly off is\n * `#REF!`.\n */\n map(reference: Reference, sheet: LocalReferences): Reference | undefined {\n if (!sheet.isLocal(reference)) return reference;\n const rows = this.axis === 'rows';\n if (rows && reference.shape === 'columns') return reference;\n if (!rows && reference.shape === 'rows') return reference;\n const p1 = rows ? reference.row1 : reference.column1;\n const p2 = rows ? reference.row2 : reference.column2;\n // A:A (A1:A1048576 is written so) spans the whole axis; an edit along it leaves it alone.\n if (reference.shape !== 'cell' && p1 === 0 && p2 === this.#max) return reference;\n\n let n1: number;\n let n2: number;\n if (this.isInsert) {\n if (p1 >= this.start) {\n n1 = p1 + this.count;\n n2 = p2 + this.count;\n } else if (p2 >= this.start) {\n n1 = p1;\n n2 = p2 + this.count;\n } else {\n return reference;\n }\n if (n1 > this.#max) return undefined;\n if (n2 > this.#max) n2 = this.#max;\n } else {\n if (p2 < this.start) return reference;\n if (p1 >= this.start && p2 <= this.#end) return undefined;\n n1 = p1 < this.start ? p1 : p1 > this.#end ? p1 - this.count : this.start;\n n2 = p2 > this.#end ? p2 - this.count : this.start - 1;\n }\n return rows ? reference.with({ row1: n1, row2: n2 }) : reference.with({ column1: n1, column2: n2 });\n }\n\n /** Whether a Reference covers any place at or beyond the edit along its axis. */\n reaches(reference: Reference, sheet: LocalReferences): boolean {\n return sheet.isLocal(reference) && (this.axis === 'rows' ? reference.area.row2 : reference.area.column2) >= this.start;\n }\n}\n", "// A cell of one Sheet of a Workbook (C#'s SheetCell in Workbook.cs; ADR-0331): what a recalculation across the\n// Workbook keys its work by. A C# record struct compares by value; here a set and a map key it by text.\nimport type { CellAddress } from './cell-address';\nimport type { Sheet } from './sheet';\n\n/** A cell of one Sheet of a Workbook. @internal */\nexport class SheetCell {\n readonly sheet: Sheet;\n\n readonly address: CellAddress;\n\n constructor(sheet: Sheet, address: CellAddress) {\n this.sheet = sheet;\n this.address = address;\n }\n\n /** A key two SheetCells naming the same cell share. */\n get key(): string {\n return `${String(this.sheet.id)}:${String(this.address.key)}`;\n }\n}\n\n/** A set of SheetCells, compared by the cell they name, in the order first added. @internal */\nexport class SheetCellSet implements Iterable<SheetCell> {\n readonly #items = new Map<string, SheetCell>();\n\n constructor(cells: Iterable<SheetCell> = []) {\n for (const cell of cells) this.add(cell);\n }\n\n /** Adds `cell`; whether it was not there yet. */\n add(cell: SheetCell): boolean {\n const key = cell.key;\n if (this.#items.has(key)) return false;\n this.#items.set(key, cell);\n return true;\n }\n\n addAll(cells: Iterable<SheetCell>): void {\n for (const cell of cells) this.add(cell);\n }\n\n has(cell: SheetCell): boolean {\n return this.#items.has(cell.key);\n }\n\n delete(cell: SheetCell): boolean {\n return this.#items.delete(cell.key);\n }\n\n get size(): number {\n return this.#items.size;\n }\n\n [Symbol.iterator](): Iterator<SheetCell> {\n return this.#items.values();\n }\n}\n\n/** A map keyed by SheetCells, compared by the cell they name, in the order first set. @internal */\nexport class SheetCellMap<V> implements Iterable<[SheetCell, V]> {\n readonly #items = new Map<string, [SheetCell, V]>();\n\n get(cell: SheetCell): V | undefined {\n return this.#items.get(cell.key)?.[1];\n }\n\n has(cell: SheetCell): boolean {\n return this.#items.has(cell.key);\n }\n\n set(cell: SheetCell, value: V): void {\n const key = cell.key;\n const held = this.#items.get(key);\n if (held === undefined) this.#items.set(key, [cell, value]);\n else held[1] = value;\n }\n\n delete(cell: SheetCell): boolean {\n return this.#items.delete(cell.key);\n }\n\n get size(): number {\n return this.#items.size;\n }\n\n [Symbol.iterator](): Iterator<[SheetCell, V]> {\n return this.#items.values();\n }\n}\n", "// What a Sheet reports and refuses (C#'s SheetColumnWidth.cs, SheetChange.cs, SheetRefusal.cs and\n// RepeatedKeyException.cs; ADR-0046, ADR-0047, ADR-0049, ADR-0050).\nimport { CellAddress } from './cell-address';\nimport { formatRoundTrip } from './dotnet';\nimport type { Value } from './value';\n\n/**\n * What recorded a column's width (ADR-0046, 2026-09-28; SH-26). `widenedByEntry`: an entry that widened the column,\n * which a longer entry widens again (CW-028, third run). `setByUser`: a drag, a size to fit, a command, or a column\n * inserted to the right of a recorded width; an entry never widens it.\n */\nexport type SheetColumnWidthKind = 'widenedByEntry' | 'setByUser';\n\n/**\n * A width recorded on a column (ADR-0046): how wide it is, in characters of the default font (Excel's unit,\n * ADR-0047), and what recorded it. Both kinds are marked custom, as Excel's file marks a column an entry widened as\n * well as one the user set (`customWidth`; CW-018, CW-027..029).\n */\nexport class SheetColumnWidth {\n/** How wide the column is, in characters of the default font. */\n readonly width: number;\n\n/** What recorded it. */\n readonly kind: SheetColumnWidthKind;\n\n constructor(width: number, kind: SheetColumnWidthKind) {\n this.width = width;\n this.kind = kind;\n }\n\n /** Whether Excel's file marks the width custom (`customWidth`): every recorded width is, whichever its kind. */\n get isCustom(): boolean {\n return true;\n }\n\n /** Whether the user set the width, so an entry never widens the column. */\n get isSetByUser(): boolean {\n return this.kind === 'setByUser';\n }\n\n/** Whether `other` is the same width, recorded the same way. */\n equals(other: SheetColumnWidth): boolean {\n return this.width === other.width && this.kind === other.kind;\n }\n}\n\n/**\n * What one change to a Sheet did, reported after its recalculation has completed. Every Value it names is already\n * published, and all of them come from that one recalculation (ADR-0047).\n */\nexport class SheetChange {\n /** The cells whose Value changed (a cell becoming blank included), in row-major order. */\n readonly valueChanges: readonly CellAddress[];\n /** The Formula cells this change recomputed, in row-major order: the changed cells and the cells that depend on them, and no other (ADR-0047). */\n readonly recalculated: readonly CellAddress[];\n /** The rows whose painted content may differ \u2014 a Value, an Entry or a cell's formatting changed \u2014 in ascending order, each once. */\n readonly rows: readonly number[];\n /** The columns whose recorded width changed (ADR-0046) \u2014 set, cleared back to the default, or moved by an insertion or deletion \u2014 in ascending order, each once. */\n readonly columns: readonly number[];\n /**\n * Whether the Cell Format shown in rows `rows` does not name may have changed (ADR-0071): after a whole row's or\n * column's Cell Format set, cleared or moved, or rows or columns inserted or deleted. A component that paints a\n * Cell Format then reads again what each row it paints shows.\n */\n readonly reformatsUnnamedRows: boolean;\n\n /** @internal */\n constructor(valueChanges: readonly CellAddress[], recalculated: readonly CellAddress[], rows: readonly number[],\n columns: readonly number[] = [], reformatsUnnamedRows = false) {\n this.valueChanges = valueChanges;\n this.recalculated = recalculated;\n this.rows = rows;\n this.columns = columns;\n this.reformatsUnnamedRows = reformatsUnnamedRows;\n }\n\n /** A change that changed nothing. @internal */\n static readonly none = new SheetChange([], [], []);\n\n /** This change, also reporting that it may have reformatted rows it does not name. @internal */\n reformattingUnnamedRows(): SheetChange {\n return this.reformatsUnnamedRows ? this : new SheetChange(this.valueChanges, this.recalculated, this.rows, this.columns, true);\n }\n\n /** Several changes made as one, such as the parts of one step. @internal */\n static merge(changes: Iterable<SheetChange>): SheetChange {\n const list = [...changes];\n const valueChanges = distinctAddresses(list.flatMap(c => c.valueChanges));\n const recalculated = distinctAddresses(list.flatMap(c => c.recalculated));\n const rows = distinctNumbers(list.flatMap(c => c.rows));\n const columns = distinctNumbers(list.flatMap(c => c.columns));\n const reformats = list.some(c => c.reformatsUnnamedRows);\n return valueChanges.length === 0 && recalculated.length === 0 && rows.length === 0 && columns.length === 0 && !reformats\n ? SheetChange.none\n : new SheetChange(valueChanges, recalculated, rows, columns, reformats);\n }\n}\n\n/** Addresses each once, in row-major order. @internal */\nexport function distinctAddresses(addresses: Iterable<CellAddress>): CellAddress[] {\n const keys = new Set<number>();\n for (const address of addresses) keys.add(address.key);\n return [...keys].toSorted((a, b) => a - b).map(key => CellAddress.fromKey(key));\n}\n\n/** Numbers each once, ascending. @internal */\nexport function distinctNumbers(numbers: Iterable<number>): number[] {\n return [...new Set(numbers)].toSorted((a, b) => a - b);\n}\n\n/**\n * Why a Sheet refused an operation. A refusal changes nothing: the engine says an operation cannot be done rather\n * than do something close to it (ADR-0047, ADR-0050).\n *\n * - `entriesWouldLeaveSheet`: an insertion would push a cell holding an Entry off the Sheet's edge.\n * - `blockWouldLeaveSheet`: a block written at a place would run past the Sheet's edge (ADR-0050).\n * - `waitingForData`: a copy reaches a cell whose Value is `#GETTING_DATA` (ADR-0049).\n * - `fillPatternNotSupported`: a fill whose source is a pattern ExSheet does not continue (ADR-0050).\n * - `fillShapeNotSupported`: a fill whose target does not extend its source along one axis (ADR-0050).\n * - `editIsOpen`: a command that changes the Sheet, given while an edit is open (ADR-0048, ADR-0049).\n * - `sheetNameTaken`: a Sheet would be given a name another Sheet of the Workbook has, without regard to case (ADR-0331).\n * - `lastSheet`: the Workbook's last Sheet would be deleted (ADR-0331).\n * - `sheetNotNamed`: a command or an address that names no Sheet, given while the Workbook holds several (ADR-0331 \u00A76).\n * - `selectionMoved`: a change made from the Focus cell's Cell Format away from the Sheet, set once the Selection, or the\n * Sheet shown, is no longer the one it was read from (ADR-0100).\n * - `focusFormatChanged`: such a change, set once the Focus cell's Cell Format is no longer the one it was made from\n * (ADR-0100).\n */\nexport type SheetRefusalReason = 'entriesWouldLeaveSheet' | 'blockWouldLeaveSheet' | 'waitingForData' | 'fillPatternNotSupported'\n | 'fillShapeNotSupported' | 'editIsOpen' | 'sheetNameTaken' | 'lastSheet' | 'sheetNotNamed' | 'selectionMoved' | 'focusFormatChanged';\n\n/** An operation a Sheet refused, and why, with the refusal in words naming what caused it. Nothing was changed. */\nexport class SheetRefusal {\n/** Why it was refused. */\n readonly reason: SheetRefusalReason;\n\n/** The refusal in words, naming what caused it. */\n readonly message: string;\n\n constructor(reason: SheetRefusalReason, message: string) {\n this.reason = reason;\n this.message = message;\n }\n\n/** Whether `other` is the same refusal, for the same reason and in the same words. */\n equals(other: SheetRefusal): boolean {\n return this.reason === other.reason && this.message === other.message;\n }\n}\n\n/** Thrown when an operation the caller asked for is refused. Nothing was changed. */\nexport class SheetRefusedError extends Error {\n/** The refusal. */\n readonly refusal: SheetRefusal;\n\n constructor(refusal: SheetRefusal) {\n super(refusal.message);\n this.refusal = refusal;\n this.name = 'SheetRefusedError';\n }\n}\n\n/**\n * Thrown when a snapshot of a Linked Table declared with a key is refused because a key repeats in it (ADR-0049,\n * 2026-09-30): two rows whose keys `XLOOKUP`'s exact match cannot tell apart. Case does not tell keys apart, and a\n * blank key is not a key. The snapshot is not taken, and the previous one is not kept: the table waits again, and\n * every Formula that reads it shows `#GETTING_DATA` until a snapshot in which no key repeats is pushed.\n */\nexport class RepeatedKeyError extends Error {\n /** The table's name, as declared. */\n readonly table: string;\n /** The key column's name, as declared; for a key of several columns, their names joined by `, `. */\n readonly keyColumn: string;\n /** The key that repeats, as the first of its rows holds it; for a key of several columns, its first column's Value. */\n readonly key: Value;\n /** The key's columns, as declared (ADR-0058, amended 2026-10-03). */\n readonly keyColumns: readonly string[];\n /** The key that repeats, one Value per key column, as the first of its rows holds it. */\n readonly keys: readonly Value[];\n /** The first row of the snapshot, from 0, that holds the key. */\n readonly firstRow: number;\n /** The row of the snapshot, from 0, that holds it again. */\n readonly secondRow: number;\n /** What the table's going back to waiting changed: its readers, and what depends on them, now show `#GETTING_DATA`. */\n readonly change: SheetChange;\n /** The key as the second of its rows holds it, one Value per key column, which the message names. @internal */\n readonly repeats: readonly Value[];\n\n /** @internal */\n constructor(table: string, keyColumns: readonly string[], keys: readonly Value[], firstRow: number, repeats: readonly Value[], secondRow: number,\n change: SheetChange) {\n super(describe(table, keyColumns, keys, firstRow, repeats, secondRow));\n this.name = 'RepeatedKeyError';\n this.table = table;\n this.keyColumns = keyColumns;\n this.keys = keys;\n this.keyColumn = keyColumns.join(', ');\n const first = keys[0];\n if (first === undefined) throw new Error('Internal: a repeated key has at least one column.');\n this.key = first;\n this.firstRow = firstRow;\n this.secondRow = secondRow;\n this.change = change;\n this.repeats = repeats;\n }\n}\n\nfunction describe(table: string, keyColumns: readonly string[], keys: readonly Value[], firstRow: number, repeats: readonly Value[], secondRow: number): string {\n const key = keys.map(written).join(', ');\n const repeat = repeats.map(written).join(', ');\n const same = keys.length === repeats.length && keys.every((k, i) => repeats[i]?.equals(k) === true);\n const held = same\n ? `holds ${key} in rows ${String(firstRow)} and ${String(secondRow)}`\n : `holds ${key} in row ${String(firstRow)} and ${repeat} in row ${String(secondRow)}, which ${keys.length === 1 ? 'XLOOKUP' : 'its lookup'} does not tell apart`;\n const columns = keyColumns.length === 1 ? `its key column '${String(keyColumns[0])}'` : `its key columns ${keyColumns.map(c => `'${c}'`).join(', ')}`;\n return `The snapshot of '${table}' is refused: ${columns} ${held}. The table waits for a snapshot in which no key repeats, and every Formula that reads it shows #GETTING_DATA.`;\n}\n\n// As a Formula writes the constant (ADR-0058): text quoted, a number invariant, a boolean in capitals.\nfunction written(key: Value): string {\n switch (key.kind) {\n case 'text': return `\"${key.text.replaceAll('\"', '\"\"')}\"`;\n case 'number': return formatRoundTrip(key.number);\n case 'boolean':\n case 'error':\n return key.boolean ? 'TRUE' : 'FALSE';\n default: throw new Error(`Internal: ${String(key.kind)} is no kind of Value.`);\n }\n}\n", "// The parts a Sheet Document records (C#'s SheetDocumentCell, SheetDocumentAxisFormat, SheetDocumentColumnWidth and\n// SheetDocumentTable in SheetDocument.cs; ADR-0046, ADR-0047, ADR-0048, ADR-0049, ADR-0071).\nimport type { CellAddress } from './cell-address';\nimport type { CellBorders, CellFill, CellFont, HorizontalAlignment } from './cell-format';\nimport { AxisFormat } from './cell-format-change';\nimport type { Entry } from './entry';\nimport type { NumberFormat } from './number-format';\nimport type { SheetColumnWidthKind } from './sheet-change';\n\n/** One cell of a Sheet Document: where it is, its Entry and its own Cell Format. Never its Value (ADR-0048). */\nexport class SheetDocumentCell {\n/** Where the cell is. */\n readonly address: CellAddress;\n\n /** What the user put into it; `undefined` for a cell that holds only a Cell Format. */\n readonly entry: Entry | undefined;\n\n /** The Number Format the cell records itself; `undefined` when it takes its row's or column's (ADR-0047). */\n readonly numberFormat: NumberFormat | undefined;\n\n/** The horizontal alignment the cell records itself; `undefined` when it takes its row's or column's. */\n readonly alignment: HorizontalAlignment | undefined;\n\n/** The Font the cell records itself; `undefined` when it takes its row's or column's (ADR-0071). */\n readonly font: CellFont | undefined;\n\n/** The Fill the cell records itself; `undefined` when it takes its row's or column's (ADR-0071). */\n readonly fill: CellFill | undefined;\n\n/** The Borders the cell records itself; `undefined` for none (ADR-0071). */\n readonly borders: CellBorders | undefined;\n\n constructor(\n address: CellAddress,\n entry: Entry | undefined,\n numberFormat?: NumberFormat,\n alignment?: HorizontalAlignment,\n font?: CellFont,\n fill?: CellFill,\n borders?: CellBorders,\n ) {\n this.address = address;\n this.entry = entry;\n this.numberFormat = numberFormat;\n this.alignment = alignment;\n this.font = font;\n this.fill = fill;\n this.borders = borders;\n }\n}\n\n/**\n * A Cell Format recorded on whole columns or whole rows, as a Sheet Document records it: one entry for a run of\n * adjacent columns (rows) recorded alike, never one per cell (ADR-0047, ADR-0071).\n */\nexport class SheetDocumentAxisFormat {\n /** The first column (row) of the run, from 0. */\n readonly first: number;\n\n /** The last column (row) of the run. */\n readonly last: number;\n\n/** The Number Format the run records; `undefined` for none. */\n readonly numberFormat: NumberFormat | undefined;\n\n/** The horizontal alignment the run records; `undefined` for none. */\n readonly alignment: HorizontalAlignment | undefined;\n\n/** The Font the run records; `undefined` for none. */\n readonly font: CellFont | undefined;\n\n/** The Fill the run records; `undefined` for none. */\n readonly fill: CellFill | undefined;\n\n/** The Borders the run records; `undefined` for none. */\n readonly borders: CellBorders | undefined;\n\n constructor(\n first: number,\n last: number,\n numberFormat: NumberFormat | undefined,\n alignment: HorizontalAlignment | undefined,\n font: CellFont | undefined,\n fill: CellFill | undefined,\n borders: CellBorders | undefined,\n ) {\n this.first = first;\n this.last = last;\n this.numberFormat = numberFormat;\n this.alignment = alignment;\n this.font = font;\n this.fill = fill;\n this.borders = borders;\n }\n\n /** The level each row (column) of the run records. @internal */\n get level(): AxisFormat {\n return new AxisFormat(this.numberFormat, this.alignment, this.font, this.fill, this.borders);\n }\n}\n\n/** A width recorded on columns, as a Sheet Document records it: one entry for a run of adjacent columns of one width and one kind (ADR-0046). */\nexport class SheetDocumentColumnWidth {\n/** The first column of the run, from 0. */\n readonly first: number;\n\n/** The last column of the run. */\n readonly last: number;\n\n /** The width, in characters of the default font (Excel's unit, ADR-0047). */\n readonly width: number;\n\n/** What recorded the width. */\n readonly kind: SheetColumnWidthKind;\n\n constructor(\n first: number,\n last: number,\n width: number,\n kind: SheetColumnWidthKind = 'setByUser',\n ) {\n this.first = first;\n this.last = last;\n this.width = width;\n this.kind = kind;\n }\n\n /** Whether Excel's file marks the width custom: every recorded width is. */\n get isCustom(): boolean {\n return true;\n }\n}\n\n/** A Linked Table's declaration as a Sheet Document records it: its name, its column names and its key, never its rows (ADR-0049). */\nexport class SheetDocumentTable {\n /** The key's columns: one, several for a key of several columns (version 9; ADR-0058), or none. */\n readonly keyColumns: readonly string[];\n\n/** The table's name, as declared. */\n readonly name: string;\n\n/** Its column names, in the declared order. */\n readonly columns: readonly string[];\n\n constructor(name: string, columns: readonly string[], keyColumns: readonly string[] = []) {\n this.name = name;\n this.columns = columns;\n this.keyColumns = keyColumns;\n }\n\n /** The key column when the key is one column; `undefined` for none, and for a key of several columns. */\n get key(): string | undefined {\n return this.keyColumns.length === 1 ? this.keyColumns[0] : undefined;\n }\n}\n\n/** A Sheet Document that cannot be read: an unknown version, or anything the version does not define (ADR-0048). */\nexport class SheetDocumentError extends Error {\n /** The version the document declared, when that is why it was refused. */\n readonly documentVersion: number | undefined;\n\n constructor(message: string, options?: { cause?: unknown; documentVersion?: number }) {\n super(message, options?.cause === undefined ? undefined : { cause: options.cause });\n this.name = 'SheetDocumentError';\n this.documentVersion = options?.documentVersion;\n }\n}\n", "// The grid of cells ExSheet holds (C#'s Sheet.cs and its partials; CONTEXT.md): Excel's extent, held sparsely, each\n// cell holding an Entry, and a Value computed from it. After every change the Sheet recalculates only what depends\n// on the change, and publishes the new Values only when that recalculation has completed (ADR-0047). Its declared\n// culture decides how typed constants are read and how Values are displayed (ADR-0048). One class here holds what\n// C#'s partial class spreads over its files, in their order: the cells and the dependency graph, the state an undo\n// compares, Cell Formats, recalculation, spills, the volatile functions, the Sheet Day and the draws, Linked\n// Tables, the name, the format a Formula gives on entry, column widths, insertion and deletion, steps, the\n// clipboard and the fill.\nimport { CellAddress, columnCount, rowCount } from './cell-address';\nimport { BorderLine, CellBorders, CellFill, CellFont, CellFormat, type CellDisplay, type HorizontalAlignment, type RangeEdgeLines } from './cell-format';\nimport { AxisFormat, CellFormatChange, CellState, defaultCellFormat, own, PlaceInRange, samePart } from './cell-format-change';\nimport { CellRange } from './cell-range';\nimport { isPlainNumber, parseConstantWithFormat } from './constant-parser';\nimport { Culture } from './culture';\nimport { equalsIgnoreCase, formatExponential, formatRoundTrip, ignoreCaseKey, isDigit, toUpperInvariant, trimWhiteSpace } from './dotnet';\nimport { Entry } from './entry';\nimport { entryText } from './entry-text';\nimport { completeFormula, formulaReferences, type FormulaCompletion, type FormulaReference, type LinkedTableColumn } from './formula-entry';\nimport { FormulaSyntaxError } from './formula-syntax-error';\nimport { atFifteenDigits } from './formulas/arithmetic';\nimport type { CellReader, SheetDay, SheetMoment } from './formulas/cell-reader';\nimport { drawOf } from './formulas/draws';\nimport { Evaluator, isMulti } from './formulas/evaluator';\nimport { rewriteStructuredReferences } from './formulas/formula-text';\nimport { knownShape } from './formulas/known-shape';\nimport type { Node } from './formulas/nodes';\nimport { Operand } from './formulas/operand';\nimport { Area, type Reference } from './formulas/reference';\nimport { StructuralEdit } from './formulas/structural-edit';\nimport { textEqualityKey } from './formulas/text-order';\nimport { ValueArray } from './formulas/value-array';\nimport { defined, unreachable } from './must';\nimport { abbreviatedMonthNamesOf, NumberFormat } from './number-format';\nimport { generalFitted, generalLimit, isGeneralScientific } from './number-text';\nimport { SheetCell, SheetCellMap, SheetCellSet } from './sheet-cell';\nimport { distinctAddresses, distinctNumbers, RepeatedKeyError, SheetChange, SheetColumnWidth, SheetRefusal, SheetRefusedError } from './sheet-change';\nimport { SheetDocumentAxisFormat, SheetDocumentCell, SheetDocumentColumnWidth, SheetDocumentTable } from './sheet-document-parts';\nimport type { SheetEdit } from './sheet-edit';\nimport type { SheetDocument } from './sheet-document';\nimport { Value, type ErrorValue, type ValueKind } from './value';\nimport type { SheetRename, Workbook } from './workbook';\n\n/** A typed text for a cell. */\nexport type TypedCell = readonly [CellAddress, string];\n\n/** An Entry set on a cell, or cleared (`undefined`). */\nexport type EntryOfCell = readonly [CellAddress, Entry | undefined];\n\n/** A cell's address with its state. @internal */\nexport interface AddressedState {\n readonly address: CellAddress;\n readonly state: CellState;\n}\n\n/** A Formula rewritten on a Sheet, as it was before. @internal */\nexport interface RewrittenEntry {\n readonly sheet: Sheet;\n readonly address: CellAddress;\n readonly entry: Entry;\n}\n\n/** Which way a fill extends its source (ADR-0050): along one axis, away from the source. */\nexport type FillDirection = 'down' | 'right' | 'up' | 'left';\n\n/** A Linked Table as a Sheet knows it (CONTEXT.md, ADR-0049): its name, its columns, its key, and whether its data has arrived. */\nexport class LinkedTable {\n /** The name Formulas use, as declared; matched without regard to case. */\n readonly name: string;\n\n /** The column names, in order, as declared; matched without regard to case. */\n readonly columns: readonly string[];\n\n /** Whether no snapshot is held: none has arrived yet, or the last was refused because a key repeated in it. */\n readonly isWaiting: boolean;\n\n /** How many rows the current snapshot holds; 0 while waiting. */\n readonly rowCount: number;\n\n /** The key's columns, as declared there: one, several, or none for a table declared without a key (ADR-0058). */\n readonly keyColumns: readonly string[];\n\n constructor(\n name: string,\n columns: readonly string[],\n isWaiting: boolean,\n rows: number,\n keyColumns: readonly string[] = [],\n ) {\n this.name = name;\n this.columns = columns;\n this.isWaiting = isWaiting;\n this.rowCount = rows;\n this.keyColumns = keyColumns;\n }\n\n /** The key column when the key is one column; `undefined` for none, and for a key of several columns. */\n get key(): string | undefined {\n return this.keyColumns.length === 1 ? this.keyColumns[0] : undefined;\n }\n}\n\n/** A Linked Table's state, which every Sheet of the Workbook reads (ADR-0331). @internal */\nexport class TableState {\n /** The current snapshot, column by column; `undefined` until the first arrives, and after one is refused. */\n data: readonly (readonly (Value | undefined)[])[] | undefined;\n /** For each column of `data`, whether it holds a refusal. */\n refusing: readonly boolean[] = [];\n rowCount = 0;\n\n readonly name: string;\n\n readonly columns: readonly string[];\n\n /** Each column's index, by its name read without regard to case. */\n readonly columnIndex: ReadonlyMap<string, number>;\n\n /** The key's columns, as `columns` spells them; empty for none. */\n readonly key: readonly string[];\n\n readonly order: number;\n\n constructor(\n name: string,\n columns: readonly string[],\n columnIndex: ReadonlyMap<string, number>,\n key: readonly string[],\n order: number,\n ) {\n this.name = name;\n this.columns = columns;\n this.columnIndex = columnIndex;\n this.key = key;\n this.order = order;\n }\n}\n\n/** One cell the Sheet holds. @internal */\nexport class Cell {\n entry: Entry | undefined;\n value: Value | undefined;\n /** The cell's own Number Format; `undefined` when it takes its row's or column's (ADR-0047). */\n numberFormat: NumberFormat | undefined;\n alignment: HorizontalAlignment | undefined;\n font: CellFont | undefined;\n fill: CellFill | undefined;\n borders: CellBorders | undefined;\n /** For an Anchor, the array its Formula computed (ADR-0125); `undefined` for a result of one Value. */\n array: ValueArray | undefined;\n /** For an Anchor: whether the last layout found its Spill Range in the way, so that it shows `#SPILL!`. */\n spillBlocked = false;\n /** For a cell of a Spill Range, the Anchor whose array gives its Value; it holds no Entry of its own. */\n spilledFrom: CellAddress | undefined;\n\n readonly address: CellAddress;\n\n constructor(address: CellAddress) {\n this.address = address;\n }\n\n /** Whether the cell records any part of a Cell Format of its own. */\n get isFormatted(): boolean {\n return this.numberFormat !== undefined || this.alignment !== undefined || this.font !== undefined || this.fill !== undefined || this.borders !== undefined;\n }\n\n get isEmpty(): boolean {\n return this.entry === undefined && !this.isFormatted && this.spilledFrom === undefined;\n }\n\n /** What the cell shows over `inherited`: each part its own, else the level's. */\n over(inherited: CellFormat): CellFormat {\n return new CellFormat(this.numberFormat ?? inherited.numberFormat, this.alignment ?? inherited.alignment, this.font ?? inherited.font,\n this.fill ?? inherited.fill, this.borders ?? inherited.borders);\n }\n\n /** Records the Cell Format `other` records of its own, and nothing else of it. */\n takeFormatOf(other: Cell): void {\n this.numberFormat = other.numberFormat;\n this.alignment = other.alignment;\n this.font = other.font;\n this.fill = other.fill;\n this.borders = other.borders;\n }\n\n /** Records each part `change` sets as `shown` has it, and nothing where `inherited` gives the same; whether anything changed. */\n take(change: CellFormatChange, shown: CellFormat, inherited: CellFormat): boolean {\n const was = new CellState(undefined, undefined, this.numberFormat, this.alignment, this.font, this.fill, this.borders);\n if (change.numberFormat !== undefined) this.numberFormat = own(shown.numberFormat, inherited.numberFormat);\n if (change.alignment !== undefined) this.alignment = own(shown.alignment, inherited.alignment);\n if (change.setsFont) this.font = own(shown.font, inherited.font);\n if (change.fill !== undefined) this.fill = own(shown.fill, inherited.fill);\n if (change.setsBorders) this.borders = own(shown.borders, inherited.borders);\n return !was.sameFormat(this);\n }\n}\n\n/** What a formatting command did, and what undoing it puts back. @internal */\nexport interface CellFormatOutcome {\n readonly change: SheetChange;\n readonly before: readonly AddressedState[];\n readonly rowsBefore: ReadonlyMap<number, AxisFormat>;\n readonly columnsBefore: ReadonlyMap<number, AxisFormat>;\n}\n\n/** What a change set on several ranges did: each range's outcome, in the order they were set. @internal */\nexport interface CellFormatsOutcome {\n readonly change: SheetChange;\n readonly parts: readonly CellFormatOutcome[];\n}\n\n/** What a structural edit did, and what undoing it needs besides the inverse edit. @internal */\nexport interface StructuralOutcome {\n readonly change: SheetChange;\n readonly dropped: readonly AddressedState[];\n readonly rewritten: readonly { readonly address: CellAddress; readonly entry: Entry }[];\n readonly rowsBefore: ReadonlyMap<number, AxisFormat>;\n readonly columnsBefore: ReadonlyMap<number, AxisFormat>;\n readonly widthsBefore: ReadonlyMap<number, SheetColumnWidth>;\n readonly rewrittenElsewhere: readonly RewrittenEntry[];\n}\n\n/** The formats a fill from whole columns (`columns`) or whole rows writes on its target's columns (rows), by index. @internal */\nexport interface FillLevels {\n readonly columns: boolean;\n readonly levels: readonly { readonly index: number; readonly level: AxisFormat }[];\n}\n\n/** What a fill writes, or why it is refused, and then nothing. @internal */\nexport interface FillPlan {\n readonly refusal: SheetRefusal | undefined;\n readonly states: readonly AddressedState[];\n readonly levels: FillLevels | undefined;\n}\n\n/**\n * One operation a Sheet has done, as one step of ExSheet's one undo stack (ADR-0048): undoing it restores every\n * Entry, format and Reference it changed exactly, with one recalculation; redoing it does it again. Steps are\n * undone in the reverse of the order they were done, and redone in the order they were undone.\n */\nexport class SheetStep {\n readonly #undo: (sheet: Sheet) => SheetChange;\n readonly #redo: (sheet: Sheet) => SheetChange;\n #isUndone = false;\n\n/** The Sheet the operation was done on. */\n readonly sheet: Sheet;\n\n/** What doing the operation changed. */\n readonly change: SheetChange;\n\n /** @internal */\n constructor(sheet: Sheet, change: SheetChange, undo: (sheet: Sheet) => SheetChange, redo: (sheet: Sheet) => SheetChange) {\n this.sheet = sheet;\n this.change = change;\n this.#undo = undo;\n this.#redo = redo;\n }\n\n /** Whether the step is currently undone. */\n get isUndone(): boolean {\n return this.#isUndone;\n }\n\n /** Undoes the operation, and says what that changed. Throws when the step is already undone. */\n undo(): SheetChange {\n if (this.#isUndone) throw new Error('The step is already undone.');\n // An undo is one change, however many steps it takes (ADR-0180).\n const change = this.sheet.asOneChange(() => this.#undo(this.sheet));\n this.#isUndone = true;\n return change;\n }\n\n /** Does the operation again after `undo`, and says what that changed. Throws when the step is not undone. */\n redo(): SheetChange {\n if (!this.#isUndone) throw new Error('Only an undone step can be redone.');\n const change = this.sheet.asOneChange(() => this.#redo(this.sheet));\n this.#isUndone = false;\n return change;\n }\n}\n\n/**\n * A rectangle of cells copied inside ExSheet: each cell's Entry and the Cell Format it showed, as they were at the\n * copy, and where they came from (ADR-0048, ADR-0071). Pasting it writes the Entries with their relative References\n * shifted by the distance pasted, as Excel does, and the Cell Formats with them. Immutable.\n */\nexport class SheetBlock {\n readonly #cells: readonly CellState[];\n\n/** The range the block was copied from. */\n readonly source: CellRange;\n\n /** @internal */\n constructor(source: CellRange, cells: readonly CellState[]) {\n this.source = source;\n this.#cells = cells;\n }\n\n/** How many rows the block holds. */\n get rowCount(): number {\n return this.source.rowCount;\n }\n\n/** How many columns the block holds. */\n get columnCount(): number {\n return this.source.columnCount;\n }\n\n /** The Entry at a position inside the block, as copied; `undefined` for a blank cell. */\n entryAt(row: number, column: number): Entry | undefined {\n return this.at(row, column).entry;\n }\n\n /** The Cell Format at a position inside the block: what the cell showed at the copy, its Borders its own four sides. */\n cellFormatAt(row: number, column: number): CellFormat {\n return this.at(row, column).cellFormat;\n }\n\n /** The cell at a position inside the block, as copied: its Entry and the Cell Format it showed. @internal */\n at(row: number, column: number): CellState {\n if (!Number.isInteger(row) || row < 0 || row >= this.rowCount) throw new RangeError(`The block has ${String(this.rowCount)} row(s).`);\n if (!Number.isInteger(column) || column < 0 || column >= this.columnCount) throw new RangeError(`The block has ${String(this.columnCount)} column(s).`);\n return defined(this.#cells[row * this.columnCount + column], 'a cell of the block');\n }\n}\n\n/**\n * A copy of a rectangle of cells, or its refusal (ADR-0048, ADR-0049): the Entries for a paste inside ExSheet, and\n * the Values for anywhere else in the two flavours ExGrid puts on the clipboard (ADR-0005).\n */\nexport class SheetCopy {\n /** Why the copy is refused \u2014 a cell in it is `#GETTING_DATA` (ADR-0049) \u2014 or `undefined`. A refused copy carries nothing. */\n readonly refusal: SheetRefusal | undefined;\n\n /** The Entries, for a paste inside ExSheet. */\n readonly block: SheetBlock | undefined;\n\n /** The `text/plain` flavour: each Value as the cell shows it, tab-separated, one line per row ending in CR LF. */\n readonly text: string | undefined;\n\n /** The `text/html` flavour: a table of the unformatted Values, invariant, in Excel's markup. */\n readonly html: string | undefined;\n\n /** @internal */\n constructor(\n refusal: SheetRefusal | undefined,\n block: SheetBlock | undefined,\n text: string | undefined,\n html: string | undefined,\n ) {\n this.refusal = refusal;\n this.block = block;\n this.text = text;\n this.html = html;\n }\n\n/** Whether the copy is refused (`refusal`). */\n get isRefused(): boolean {\n return this.refusal !== undefined;\n }\n}\n\n/** The functions whose answer can change while no cell their Formula names changes (ADR-0124). */\nconst volatileFunctions = new Set(['NOW', 'OFFSET', 'INDIRECT', 'RAND', 'RANDBETWEEN']);\n\n/** The most passes one recalculation makes before it stops, for spills that keep moving each other (ADR-0125). */\nconst mostPasses = 64;\n\n/** The namespace Excel's own HTML declares for its `x:` attributes. */\nconst excelNamespace = 'xmlns:x=\"urn:schemas-microsoft-com:office:excel\"';\n\n/** The format a number constant with `%` gives a Formula's result beside an unformatted operand: `0.0%`, as Excel was observed to give `=10+50%`. */\nconst percentConstant = NumberFormat.parse('0.0%');\n\nconst tableNamePattern = /^[A-Za-z_\\\\][A-Za-z0-9_.]{0,254}$/u;\nconst rowColumnPattern = /^[Rr][0-9]*[Cc][0-9]*$|^[RrCc]$/u;\n\nlet nextSheetId = 0;\n\n/** What a recalculation's reads have met for the Formula being computed, whichever Sheet they read. */\ninterface ReadState {\n /** `#CIRC!` for a cell in a cycle or still being computed; else `#GETTING_DATA` for a waiting cell; else `undefined`. */\n met: ErrorValue | undefined;\n /** Whether a read has met a refusal while the Formula being computed was evaluated. */\n metRefusal: boolean;\n}\n\n/** The cells of one Sheet as one recalculation reads them. */\nclass StagedReader implements CellReader {\n readonly sheet: Sheet;\n\n readonly staged: Map<number, Value | undefined>;\n\n readonly onDemand: (address: CellAddress) => Value | undefined;\n\n readonly arrays: Map<number, ValueArray | undefined>;\n\n readonly reads: ReadState;\n\n readonly other: (name: string) => StagedReader | undefined;\n\n readonly span: (first: string, last: string) => readonly CellReader[] | undefined;\n\n constructor(\n sheet: Sheet,\n staged: Map<number, Value | undefined>,\n onDemand: (address: CellAddress) => Value | undefined,\n arrays: Map<number, ValueArray | undefined>,\n reads: ReadState,\n other: (name: string) => StagedReader | undefined,\n span: (first: string, last: string) => readonly CellReader[] | undefined,\n ) {\n this.sheet = sheet;\n this.staged = staged;\n this.onDemand = onDemand;\n this.arrays = arrays;\n this.reads = reads;\n this.other = other;\n this.span = span;\n }\n\n /** A cell as this recalculation leaves it: staged, or computed now when it is still to be (ADR-0124), or as it stood. */\n read(address: CellAddress): Value | undefined {\n const key = address.key;\n const value = this.staged.has(key) ? this.staged.get(key) : this.onDemand(address) ?? this.sheet.getValue(address);\n if (value !== undefined && value.isError && (value.error === '#CIRC!' || value.error === '#GETTING_DATA') && this.reads.met !== '#CIRC!') {\n this.reads.met = value.error;\n }\n if (value?.isRefused === true) this.reads.metRefusal = true;\n return value;\n }\n\n nonBlankIn(area: Area): Iterable<CellAddress> {\n return [...this.sheet.cellsIn(area)].filter(a => this.read(a) !== undefined).toSorted((a, b) => a.compareTo(b));\n }\n\n /** A Linked Table's column, which waits as a named one does (ADR-0049, ADR-0124). */\n tableColumn(table: string, column: string): Operand {\n const read = this.sheet.tableColumn(table, column);\n if (read.isError && read.scalar?.error === '#GETTING_DATA' && this.reads.met !== '#CIRC!') this.reads.met = '#GETTING_DATA';\n if (this.sheet.columnHoldsRefusal(table, column)) this.reads.metRefusal = true;\n return read;\n }\n\n isLinkedTable(name: string): boolean {\n return this.sheet.workbook.tables.has(ignoreCaseKey(name));\n }\n\n formulaAt(address: CellAddress): Node | undefined {\n return this.sheet.formulaShownAt(address);\n }\n\n resolve(sheetName: string | undefined): CellReader | undefined {\n return this.sheet.isThisSheet(sheetName) ? this : this.other(defined(sheetName, 'a qualifier'));\n }\n\n resolveSpan(first: string, last: string): readonly CellReader[] | undefined {\n return this.span(first, last);\n }\n\n get today(): SheetDay | undefined {\n return this.sheet.workbook.today;\n }\n\n get now(): SheetMoment | undefined {\n return this.sheet.moment;\n }\n\n draw(cell: CellAddress, place: number): bigint | undefined {\n return this.sheet.draw(cell, place);\n }\n\n /** The Anchor's array as this pass computed it, or as it stood; `#REF!` when it does not spill (ADR-0125). */\n spill(anchor: CellAddress): Operand {\n this.read(anchor);\n const cell = this.sheet.cellAt(anchor);\n let array: ValueArray | undefined;\n if (this.arrays.has(anchor.key)) array = this.arrays.get(anchor.key);\n else if (cell !== undefined) array = cell.array;\n if (array === undefined || cell === undefined || cell.spillBlocked) return Operand.ofError('#REF!');\n const shown = new ValueArray(array.rows, array.columns);\n for (let r = 0; r < array.rows; r++) {\n for (let c = 0; c < array.columns; c++) shown.set(r, c, array.at(r, c) ?? Value.fromNumber(0));\n }\n return Operand.ofSpillRange(shown);\n }\n}\n\n/**\n * The grid of cells ExSheet holds: Excel's extent, held sparsely. Not shared between threads of work: one Sheet is\n * changed and read by one caller at a time. A Sheet belongs to a Workbook (ADR-0331); change it through its\n * Workbook's `do`.\n */\nexport class Sheet {\n /** Excel's row count: 1,048,576 (ADR-0046). */\n static readonly rowCount = rowCount;\n\n /** Excel's column count: 16,384, `A` to `XFD` (ADR-0046). */\n static readonly columnCount = columnCount;\n\n /** The name a new Sheet has, as Excel's first sheet does (ADR-0046). */\n static readonly defaultName = 'Sheet1';\n\n /** The longest name a Sheet can have: 31 characters, as in Excel. */\n static readonly maximumNameLength = 31;\n\n /** The widest a column can be, in characters: 255, Excel's limit. */\n static readonly maxColumnWidth = 255;\n\n /** Excel's default column width, in characters: 8.43 (ADR-0047). */\n static readonly defaultColumnWidth = 8.43;\n\n /** A number unique to this Sheet in this process, which keys its cells across a Workbook. @internal */\n readonly id = nextSheetId++;\n\n /** The Workbook the Sheet belongs to: one of its own, of this Sheet alone, for a Sheet created on its own (ADR-0331). */\n readonly workbook: Workbook;\n\n /** The Sheet's declared culture (ADR-0048). Formulas are in invariant syntax whatever it is (ADR-0047). */\n readonly culture: Culture;\n\n #name: string;\n\n readonly #cells = new Map<number, Cell>();\n\n /** For each cell, the Formula cells that name it by a single-cell Reference. */\n readonly #cellDependents = new Map<number, Set<number>>();\n\n /** For each Formula cell that reads a multi-cell rectangle, the rectangles. */\n readonly #areaPrecedents = new Map<number, Area[]>();\n\n /** For each Formula cell that names another Sheet's cells, those References (ADR-0331). */\n readonly #remoteReferences = new Map<number, Reference[]>();\n\n /** For each cell, the Formula cells on other Sheets that name it by a single-cell Reference (ADR-0331). */\n readonly #remoteCellDependents = new Map<number, SheetCellSet>();\n\n /** For each Formula cell on another Sheet that reads a multi-cell rectangle of this Sheet, the rectangles (ADR-0331). */\n readonly #remoteAreaDependents = new SheetCellMap<Area[]>();\n\n /** The Cell Formats recorded on whole rows, by row; a row absent records nothing (ADR-0047). */\n #rowFormats = new Map<number, AxisFormat>();\n\n /** The Cell Formats recorded on whole columns, by column; a column absent records nothing (ADR-0047). */\n #columnFormats = new Map<number, AxisFormat>();\n\n /** The widths recorded on columns, and the kind of each, by column (ADR-0046). */\n #columnWidths = new Map<number, SheetColumnWidth>();\n\n /** The Formula cells that call a volatile function. */\n readonly #volatileFormulas = new Set<number>();\n\n /** The moment read at the start of the recalculation under way. */\n #moment: SheetMoment | undefined;\n\n /** The Formula cells that call `TODAY`, recalculated when the Sheet Day changes. */\n readonly #todayReaders = new Set<number>();\n\n /** The Formula cells that call `RAND` or `RANDBETWEEN`. */\n readonly #randomReaders = new Set<number>();\n\n /** For each table name, declared or not, read without regard to case, the Formula cells that name it. */\n readonly #tableReaders = new Map<string, Set<number>>();\n\n #cultureListNames: Set<string> | undefined;\n\n /** How many passes the last recalculation made (ADR-0124). Layer 1 reads it. @internal */\n recalculationPasses = 0;\n\n /** A Sheet named `name` in `workbook`, under its culture (ADR-0331). Throws for a name a Sheet cannot have. @internal */\n constructor(workbook: Workbook, name: string) {\n this.#name = Sheet.checkName(name);\n this.workbook = workbook;\n this.culture = workbook.culture;\n }\n\n // ---- The cells and the dependency graph (Sheet.cs) ----\n\n /** Records what a document records on this Sheet's columns, rows and cells besides Entries. @internal */\n openFormats(document: SheetDocument): void {\n for (const run of document.columns) {\n for (let column = run.first; column <= run.last; column++) this.#columnFormats.set(column, this.#opened(run.level));\n }\n for (const run of document.columnWidths) {\n for (let column = run.first; column <= run.last; column++) this.#columnWidths.set(column, new SheetColumnWidth(run.width, run.kind));\n }\n for (const run of document.rows) {\n for (let row = run.first; row <= run.last; row++) this.#rowFormats.set(row, this.#opened(run.level));\n }\n for (const cell of document.cells) {\n if (cell.numberFormat === undefined && cell.alignment === undefined && cell.font === undefined && cell.fill === undefined && cell.borders === undefined) continue;\n const held = new Cell(cell.address);\n held.numberFormat = cell.numberFormat?.openedIn(this.culture);\n held.alignment = cell.alignment;\n held.font = cell.font;\n held.fill = cell.fill;\n held.borders = cell.borders;\n this.#cells.set(cell.address.key, held);\n }\n }\n\n /** Takes a document's Entries, computing every Value again. Opening is no change (ADR-0180). @internal */\n openEntries(document: SheetDocument): void {\n this.setEntries(document.cells.filter(c => c.entry !== undefined).map(c => [c.address, c.entry] as const));\n this.workbook.forgetChanges();\n }\n\n #opened(level: AxisFormat): AxisFormat {\n return level.numberFormat === undefined ? level : level.replacing({ numberFormat: level.numberFormat.openedIn(this.culture) });\n }\n\n /** The Sheet as a Sheet Document declaring `tables` (ADR-0046, ADR-0047, ADR-0048, ADR-0049, ADR-0071). @internal */\n toDocumentParts(): {\n cells: SheetDocumentCell[]; columns: SheetDocumentAxisFormat[]; rows: SheetDocumentAxisFormat[]; columnWidths: SheetDocumentColumnWidth[];\n } {\n const cells = [...this.#cells.values()]\n .filter(c => c.entry !== undefined || c.isFormatted)\n .toSorted((a, b) => a.address.compareTo(b.address))\n .map(c => new SheetDocumentCell(c.address, c.entry, c.numberFormat, c.alignment, c.font, c.fill, c.borders));\n return { cells, columns: runs(this.#columnFormats), rows: runs(this.#rowFormats), columnWidths: this.#widthRuns() };\n }\n\n /** The cells of this Sheet whose Formula gives an array, spilled or `#SPILL!`: what a new size lays out again (ADR-0460). @internal */\n get anchors(): SheetCell[] {\n return [...this.#cells.values()].filter(c => c.array !== undefined).map(c => new SheetCell(this, c.address));\n }\n\n /** The addresses of every cell holding an Entry, in row-major order. */\n get entryAddresses(): CellAddress[] {\n return [...this.#cells.values()].filter(c => c.entry !== undefined).map(c => c.address).toSorted((a, b) => a.compareTo(b));\n }\n\n /**\n * The text `number` would show in the cell at `address`, under the cell's Number Format and the Sheet's culture\n * (ADR-0130). `undefined` where the format cannot show it.\n */\n formatAs(address: CellAddress, number: number): string | undefined {\n if (!Number.isFinite(number)) return undefined;\n const { text, cannotShow } = this.getNumberFormat(address).format(Value.fromNumber(number), this.culture);\n return cannotShow ? undefined : text;\n }\n\n /** The addresses of every cell holding a Value \u2014 an Entry's, or an array's spilled into it (ADR-0125) \u2014 in no particular order. */\n get valueAddresses(): CellAddress[] {\n return [...this.#cells.values()].filter(c => c.value !== undefined).map(c => c.address);\n }\n\n /** The cell's Value, or `undefined` for a blank cell. */\n getValue(address: CellAddress): Value | undefined {\n return this.#cells.get(address.key)?.value;\n }\n\n /** The cell's Entry, or `undefined` for a blank cell. */\n getEntry(address: CellAddress): Entry | undefined {\n return this.#cells.get(address.key)?.entry;\n }\n\n /** The text the Cell Editor opens with: the Formula for a Formula, the constant written under the Sheet's culture otherwise. Empty for a blank cell. */\n getEntryText(address: CellAddress): string {\n const entry = this.#cells.get(address.key)?.entry;\n if (entry === undefined) return '';\n return entry.formula ?? entryText(defined(entry.constant, 'a constant Entry\\'s Value'), this.getNumberFormat(address), this.culture);\n }\n\n /**\n * What the cell shows: its Value formatted by its number format under the Sheet's culture, with its alignment\n * resolved (ADR-0046/0047). Without a width, at no particular width \u2014 a number in General in full, at fifteen\n * significant digits. With a width, in a column `width` characters wide (ADR-0047, ADR-0016): General is fitted\n * as Excel's General fits it, and a number in any other format whose text is longer cannot be shown.\n */\n getDisplay(address: CellAddress, width?: number): CellDisplay {\n const characters = width === undefined ? undefined : charactersOf(width);\n const value = this.#cells.get(address.key)?.value;\n if (value === undefined) {\n return { text: '', alignment: resolveAlignment(this.getAlignment(address), undefined), isNumber: false, cannotShow: false, colour: undefined };\n }\n const format = this.getNumberFormat(address);\n const { text, cannotShow, colour } = characters === undefined ? format.format(value, this.culture) : format.formatIn(value, this.culture, characters);\n return { text: cannotShow ? '' : text, alignment: resolveAlignment(this.getAlignment(address), value.kind), isNumber: value.kind === 'number', cannotShow, colour };\n }\n\n /** Takes text as the user typed it into a cell, read under the Sheet's culture, and recalculates. @internal */\n enter(address: CellAddress, typed: string): SheetChange {\n return this.enterMany([[address, typed]]);\n }\n\n /**\n * Takes several typed texts as one change, with one recalculation. If any text is a Formula that cannot be\n * read, nothing changes. `pasted`: the texts were pasted from another program, and a text beginning with `=`\n * that cannot be read as a Formula is taken as text (ADR-0048). @internal\n */\n enterMany(typed: Iterable<TypedCell>, pasted = false): SheetChange {\n const entries: [CellAddress, Entry | undefined][] = [];\n const implied: { address: CellAddress; format: NumberFormat }[] = [];\n for (const [address, text] of typed) {\n const read = this.#readTyped(address, text, pasted);\n entries.push([address, read.entry]);\n if (read.implied !== undefined) implied.push({ address, format: read.implied });\n }\n return this.#writeTyped(entries, implied);\n }\n\n /** Excel's Ctrl+Enter (ADR-0050 item 5): `typed` read as entered in `enteredAt`, written into every cell of `cells`. @internal */\n enterInto(cells: readonly CellAddress[], enteredAt: CellAddress, typed: string): SheetChange {\n const entered = this.#readTyped(enteredAt, typed, false).entry;\n if (entered?.isFormula !== true) return this.enterMany(cells.map(cell => [cell, typed] as const), false);\n const entries: [CellAddress, Entry | undefined][] = [];\n for (const cell of cells) entries.push([cell, entered.movedBy(cell.row - enteredAt.row, cell.column - enteredAt.column)]);\n return this.#writeTyped(entries, []);\n }\n\n /** One typed text read into `address`: its Entry, and the format typing it implies for a General cell, if any. */\n #readTyped(address: CellAddress, text: string, pasted: boolean): { entry: Entry | undefined; implied: NumberFormat | undefined } {\n if (text.length === 0 || text.startsWith('=')) {\n let entry: Entry | undefined;\n try {\n entry = Entry.parse(text, this.culture);\n } catch (e) { // oxlint-disable-line ex-grid/no-catch -- a pasted Formula that cannot be read is text, as Excel takes a pasted =1+ (ADR-0048)\n if (!pasted || !(e instanceof FormulaSyntaxError)) throw e;\n entry = Entry.fromValue(Value.fromText(text));\n }\n return { entry: entry === undefined ? undefined : this.inDeclaredCase(this.inOwnName(entry)), implied: undefined };\n }\n // A date or a percentage typed into a General cell gives the cell its format, as in Excel.\n const parsed = parseConstantWithFormat(text, this.culture);\n let value = parsed.value;\n let signed: Entry | undefined;\n try {\n signed = value.kind === 'text' ? Entry.signedFormula(text) : undefined;\n } catch (e) { // oxlint-disable-line ex-grid/no-catch -- pasted text Excel would read as a Formula the engine does not implement is text (ADR-0048); typed, it is refused\n if (!pasted || !(e instanceof FormulaSyntaxError)) throw e;\n signed = undefined;\n }\n if (signed !== undefined) return { entry: this.inDeclaredCase(this.inOwnName(signed)), implied: undefined };\n // A plain number typed into a cell that shows percentages is read as a percentage (LVL-015, ADR-0047 second run). Only typed.\n if (!pasted && value.kind === 'number' && this.getNumberFormat(address).isPercent && isPlainNumber(text, this.culture)) {\n value = Value.fromNumber(value.number / 100);\n }\n return { entry: Entry.fromValue(value), implied: parsed.implied };\n }\n\n /** Typed Entries written as one change: the formats typing implied, then a Formula's format from what it reads, then the Entries. */\n #writeTyped(entries: [CellAddress, Entry | undefined][], implied: readonly { address: CellAddress; format: NumberFormat }[]): SheetChange {\n const rows = new Set<number>();\n for (const { address, format } of implied) {\n if (!this.getNumberFormat(address).isGeneral) continue;\n this.#cellFor(address).numberFormat = format;\n rows.add(address.row);\n }\n // A Formula entered into a General cell takes a format from what it reads, as in Excel (ADR-0047).\n for (const [address, entry] of entries) {\n const parsed = entry?.parsed;\n if (parsed === undefined || !this.getNumberFormat(address).isGeneral) continue;\n const inferred = this.#formatOnEntry(parsed);\n if (inferred === undefined) continue;\n this.#cellFor(address).numberFormat = inferred;\n rows.add(address.row);\n }\n // A 3D Reference is written with its ends in tab order, in their Sheets' own names (ADR-0331 \u00A77).\n for (let i = 0; i < entries.length; i++) {\n const [address, typed] = defined(entries[i], 'an entry');\n if (typed === undefined) continue;\n const ordered = this.workbook.entryInTabOrder(typed);\n if (ordered !== typed) entries[i] = [address, ordered];\n }\n const change = this.setEntries(entries);\n if (rows.size === 0) return change;\n for (const row of change.rows) rows.add(row);\n return new SheetChange(change.valueChanges, change.recalculated, distinctNumbers(rows));\n }\n\n /** The cell held at `address`, made and held if there is none. */\n #cellFor(address: CellAddress): Cell {\n let cell = this.#cells.get(address.key);\n if (cell === undefined) {\n cell = new Cell(address);\n this.#cells.set(address.key, cell);\n }\n return cell;\n }\n\n /** Sets or clears one cell's Entry, and recalculates. @internal */\n setEntry(address: CellAddress, entry: Entry | undefined): SheetChange {\n return this.setEntries([[address, entry]]);\n }\n\n /** Sets or clears several cells' Entries as one change, with one recalculation. A later pair for the same cell wins. @internal */\n setEntries(entries: Iterable<EntryOfCell>): SheetChange {\n const changed = new Set<number>();\n const rows = new Set<number>();\n for (const [address, entry] of entries) {\n let cell = this.#cells.get(address.key);\n if (Entry.same(cell?.entry, entry)) continue;\n const old = cell?.entry?.parsed;\n if (old !== undefined) this.#unregister(address, old);\n if (entry === undefined) {\n defined(cell, 'the cell whose Entry is cleared').entry = undefined;\n } else {\n cell ??= this.#cellFor(address);\n cell.entry = entry;\n if (entry.parsed !== undefined) this.#register(address, entry.parsed);\n }\n changed.add(address.key);\n rows.add(address.row);\n }\n if (changed.size === 0) return SheetChange.none;\n this.countChange();\n return this.#recalculate(new SheetCellSet([...changed].map(key => new SheetCell(this, CellAddress.fromKey(key)))), rows);\n }\n\n #register(formulaCell: CellAddress, formula: Node): void {\n const areas: Area[] = [];\n const remote: Reference[] = [];\n for (const reference of formula.references()) {\n if (!this.isLocal(reference)) {\n remote.push(reference);\n continue;\n }\n const area = reference.area;\n if (area.isSingleCell) {\n const target = new CellAddress(area.row1, area.column1).key;\n let set = this.#cellDependents.get(target);\n if (set === undefined) {\n set = new Set();\n this.#cellDependents.set(target, set);\n }\n set.add(formulaCell.key);\n } else {\n areas.push(area);\n }\n }\n if (areas.length > 0) this.#areaPrecedents.set(formulaCell.key, areas);\n if (remote.length > 0) {\n this.#remoteReferences.set(formulaCell.key, remote);\n this.#registerRemote(formulaCell, remote);\n }\n this.#registerTableReaders(formulaCell, formula);\n if (callsToday(formula)) this.#todayReaders.add(formulaCell.key);\n if ([...formula.calls()].some(call => call.function !== undefined && volatileFunctions.has(call.name))) this.#volatileFormulas.add(formulaCell.key);\n if (callsRandom(formula)) this.#randomReaders.add(formulaCell.key);\n }\n\n #unregister(formulaCell: CellAddress, formula: Node): void {\n for (const reference of formula.references()) {\n const area = reference.area;\n if (this.isLocal(reference) && area.isSingleCell) {\n const target = new CellAddress(area.row1, area.column1).key;\n const set = this.#cellDependents.get(target);\n if (set?.delete(formulaCell.key) === true && set.size === 0) this.#cellDependents.delete(target);\n }\n }\n this.#areaPrecedents.delete(formulaCell.key);\n this.#unregisterRemote(formulaCell);\n this.#unregisterTableReaders(formulaCell, formula);\n this.#todayReaders.delete(formulaCell.key);\n this.#volatileFormulas.delete(formulaCell.key);\n this.#randomReaders.delete(formulaCell.key);\n }\n\n /** Records a Formula cell's References to other Sheets on the Sheets they name; a 3D Reference on every Sheet of its span (ADR-0331 \u00A77). */\n #registerRemote(formulaCell: CellAddress, remote: readonly Reference[]): void {\n const dependent = new SheetCell(this, formulaCell);\n const groups = new Map<Sheet, Area[]>();\n for (const reference of remote) {\n for (const target of this.#targets(reference)) {\n let list = groups.get(target);\n if (list === undefined) {\n list = [];\n groups.set(target, list);\n }\n list.push(reference.area);\n }\n }\n for (const [target, group] of groups) {\n const areas: Area[] = [];\n for (const area of group) {\n if (!area.isSingleCell) {\n areas.push(area);\n continue;\n }\n const address = new CellAddress(area.row1, area.column1).key;\n let set = target.#remoteCellDependents.get(address);\n if (set === undefined) {\n set = new SheetCellSet();\n target.#remoteCellDependents.set(address, set);\n }\n set.add(dependent);\n }\n if (areas.length > 0) target.#remoteAreaDependents.set(dependent, areas);\n }\n }\n\n /** Forgets what `#registerRemote` recorded for a Formula cell. */\n #unregisterRemote(formulaCell: CellAddress): void {\n const remote = this.#remoteReferences.get(formulaCell.key);\n if (remote === undefined) return;\n this.#remoteReferences.delete(formulaCell.key);\n const dependent = new SheetCell(this, formulaCell);\n for (const reference of remote) {\n for (const target of this.#targets(reference)) {\n target.#remoteAreaDependents.delete(dependent);\n const area = reference.area;\n if (!area.isSingleCell) continue;\n const address = new CellAddress(area.row1, area.column1).key;\n const set = target.#remoteCellDependents.get(address);\n if (set?.delete(dependent) === true && set.size === 0) target.#remoteCellDependents.delete(address);\n }\n }\n }\n\n /** The Sheets a Reference to another Sheet, or a 3D Reference, reads, as the Workbook stands: none for a name no Sheet has. */\n #targets(reference: Reference): readonly Sheet[] {\n if (reference.isThreeD) return this.workbook.span(defined(reference.sheetName, 'a span\\'s first Sheet'), defined(reference.lastSheetName, 'a span\\'s last Sheet')) ?? []; // oxlint-disable-line ex-grid/no-stand-in-default -- a span an end of which no Sheet has spans no Sheet: it reads none (ADR-0331 \u00A77)\n const target = this.workbook.find(defined(reference.sheetName, 'a qualifier'));\n return target === undefined ? [] : [target];\n }\n\n /** The Formula cells that read `address` directly. */\n *#dependents(address: CellAddress): Generator<CellAddress> {\n const set = this.#cellDependents.get(address.key);\n if (set !== undefined) for (const dependent of set) yield CellAddress.fromKey(dependent);\n for (const [formulaCell, areas] of this.#areaPrecedents) {\n if (areas.some(area => area.contains(address))) yield CellAddress.fromKey(formulaCell);\n }\n }\n\n /** The addresses inside `area` that hold something, in no particular order. @internal */\n *cellsIn(area: Area): Generator<CellAddress> {\n if (area.cellCount <= this.#cells.size) {\n for (let row = area.row1; row <= area.row2; row++) {\n for (let column = area.column1; column <= area.column2; column++) {\n const address = new CellAddress(row, column);\n if (this.#cells.has(address.key)) yield address;\n }\n }\n } else {\n for (const cell of this.#cells.values()) {\n if (area.contains(cell.address)) yield cell.address;\n }\n }\n }\n\n /** The cell held at `address`. @internal */\n cellAt(address: CellAddress): Cell | undefined {\n return this.#cells.get(address.key);\n }\n\n /** The Formula whose result a cell shows: its own, or for a cell of a Spill Range its Anchor's (ADR-0125). @internal */\n formulaShownAt(address: CellAddress): Node | undefined {\n const cell = this.#cells.get(address.key);\n if (cell === undefined) return undefined;\n if (cell.entry !== undefined) return cell.entry.parsed;\n return cell.spilledFrom === undefined ? undefined : this.#cells.get(cell.spilledFrom.key)?.entry?.parsed;\n }\n\n // ---- The state an undo compares (Sheet.State.cs) ----\n\n /** Every held cell's state, keyed by address. @internal */\n snapshot(): Map<number, CellState> {\n const states = new Map<number, CellState>();\n for (const cell of this.#cells.values()) states.set(cell.address.key, stateOf(cell));\n return states;\n }\n\n #stateAt(address: CellAddress): CellState {\n const cell = this.#cells.get(address.key);\n return cell === undefined ? CellState.blank : stateOf(cell);\n }\n\n /** The cell as a copy or a fill carries it: its Entry, and every part of the Cell Format it records, from whichever level records it. */\n #carriedState(address: CellAddress): CellState {\n const shown = this.#ownFormat(address);\n return this.#stateAt(address).recorded.withFormat(shown);\n }\n\n /** States about to be written whole, each part kept only where it differs from what its row or column gives it. @internal */\n settle(states: Iterable<AddressedState>): AddressedState[] {\n return [...states].map(p => ({ address: p.address, state: settled(p.state, this.#inherited(p.address)) }));\n }\n\n /** The Cell Format every held cell shows, keyed by address. */\n #shownSnapshot(): Map<number, CellFormat> {\n const shown = new Map<number, CellFormat>();\n for (const cell of this.#cells.values()) shown.set(cell.address.key, this.getCellFormat(cell.address));\n return shown;\n }\n\n /** The change between `before` and now, address by address. @internal */\n diff(before: ReadonlyMap<number, CellState>, recalculated: Iterable<CellAddress>, shownBefore?: ReadonlyMap<number, CellFormat>): SheetChange {\n const valueChanges: CellAddress[] = [];\n const rows = new Set<number>();\n const compare = (address: CellAddress, old: CellState): void => {\n const now = this.#stateAt(address);\n const valueChanged = !Value.unchanged(old.value, now.value);\n if (valueChanged) valueChanges.push(address);\n const shown = shownBefore === undefined || (shownBefore.get(address.key) ?? defaultCellFormat).equals(this.getCellFormat(address));\n if (valueChanged || !old.sameRecord(now) || !shown) rows.add(address.row);\n };\n for (const [key, old] of before) compare(CellAddress.fromKey(key), old);\n for (const cell of this.#cells.values()) {\n if (!before.has(cell.address.key)) compare(cell.address, CellState.blank);\n }\n valueChanges.sort((a, b) => a.compareTo(b));\n const recomputed = distinctAddresses(recalculated);\n return valueChanges.length === 0 && rows.size === 0 && recomputed.length === 0\n ? SheetChange.none\n : new SheetChange(valueChanges, recomputed, distinctNumbers(rows));\n }\n\n /** Forgets and rebuilds the dependency graph from every Formula held. @internal */\n rebuildDependencies(): void {\n this.#cellDependents.clear();\n this.#areaPrecedents.clear();\n for (const formulaCell of this.#remoteReferences.keys()) this.#unregisterRemote(CellAddress.fromKey(formulaCell));\n this.#tableReaders.clear();\n this.#todayReaders.clear();\n this.#volatileFormulas.clear();\n this.#randomReaders.clear();\n for (const cell of this.#cells.values()) {\n const parsed = cell.entry?.parsed;\n if (parsed !== undefined) this.#register(cell.address, parsed);\n }\n }\n\n // ---- Cell Formats (Sheet.CellFormat.cs) ----\n\n /** The cell's Cell Format as it shows: each part the cell's own, else its row's, else its column's, else the part's default (ADR-0047, ADR-0071, SH-38). */\n getCellFormat(address: CellAddress): CellFormat {\n const recorded = this.#ownFormat(address);\n return new CellFormat(recorded.numberFormat, recorded.alignment, recorded.font, recorded.fill, this.getBorders(address));\n }\n\n /** The cell's Cell Format as it records it, cell over row over column, its Borders its own four sides. */\n #ownFormat(address: CellAddress): CellFormat {\n const cell = this.#cells.get(address.key);\n return cell === undefined ? this.#inherited(address) : cell.over(this.#inherited(address));\n }\n\n /** The cell's Number Format, as it takes effect: cell over row over column, else General (ADR-0047). */\n getNumberFormat(address: CellAddress): NumberFormat {\n return this.#cells.get(address.key)?.numberFormat ?? this.#rowFormats.get(address.row)?.numberFormat\n ?? this.#columnFormats.get(address.column)?.numberFormat ?? NumberFormat.general;\n }\n\n /** The cell's horizontal alignment setting, as it takes effect: cell over row over column (ADR-0047). */\n getAlignment(address: CellAddress): HorizontalAlignment {\n // oxlint-disable-next-line ex-grid/no-stand-in-default -- no level recording one is General, Excel's default (ADR-0047)\n return this.#cells.get(address.key)?.alignment ?? this.#rowFormats.get(address.row)?.alignment\n ?? this.#columnFormats.get(address.column)?.alignment ?? 'general';\n }\n\n /** The cell's Font, as it takes effect: cell over row over column (ADR-0071, SH-38). */\n getFont(address: CellAddress): CellFont {\n return this.#cells.get(address.key)?.font ?? this.#rowFormats.get(address.row)?.font ?? this.#columnFormats.get(address.column)?.font ?? CellFont.default;\n }\n\n /** The cell's Fill, as it takes effect: cell over row over column (ADR-0071, SH-38). */\n getFill(address: CellAddress): CellFill {\n return this.#cells.get(address.key)?.fill ?? this.#rowFormats.get(address.row)?.fill ?? this.#columnFormats.get(address.column)?.fill ?? CellFill.none;\n }\n\n /**\n * The line on each of the cell's four sides as it shows, which is the line on the edge it shares with the cell\n * beside it, read the same from either cell (ADR-0071; the twelfth Windows run): the upper cell's, or the left\n * cell's, where both record one; where only one does, that one.\n */\n getBorders(address: CellAddress): CellBorders {\n const sides = this.#ownSides(address);\n return new CellBorders({\n top: address.row > 0 ? edge(this.#ownSides(new CellAddress(address.row - 1, address.column)).bottom, sides.top) : sides.top,\n bottom: sides.bottom.isNone && address.row < rowCount - 1 ? this.#ownSides(new CellAddress(address.row + 1, address.column)).top : sides.bottom,\n left: address.column > 0 ? edge(this.#ownSides(new CellAddress(address.row, address.column - 1)).right, sides.left) : sides.left,\n right: sides.right.isNone && address.column < columnCount - 1 ? this.#ownSides(new CellAddress(address.row, address.column + 1)).left : sides.right,\n });\n }\n\n /** The cell's own four sides, as it records them: cell over row over column (ADR-0071, SH-38). */\n #ownSides(address: CellAddress): CellBorders {\n return this.#cells.get(address.key)?.borders ?? this.#rowFormats.get(address.row)?.borders\n ?? this.#columnFormats.get(address.column)?.borders ?? CellBorders.none;\n }\n\n /** The Number Format recorded on the whole row, or `undefined` when none is (ADR-0047). */\n getRowNumberFormat(row: number): NumberFormat | undefined {\n return this.#rowFormats.get(checkRow(row))?.numberFormat;\n }\n\n /** The Number Format recorded on the whole column, or `undefined` when none is (ADR-0047). */\n getColumnNumberFormat(column: number): NumberFormat | undefined {\n return this.#columnFormats.get(checkColumn(column))?.numberFormat;\n }\n\n /** The alignment recorded on the whole row, or `undefined` when none is (ADR-0047). */\n getRowAlignment(row: number): HorizontalAlignment | undefined {\n return this.#rowFormats.get(checkRow(row))?.alignment;\n }\n\n /** The alignment recorded on the whole column, or `undefined` when none is (ADR-0047). */\n getColumnAlignment(column: number): HorizontalAlignment | undefined {\n return this.#columnFormats.get(checkColumn(column))?.alignment;\n }\n\n /** Sets the Number Format of cells; `undefined` is General. No Value changes. @internal */\n setNumberFormatOf(addresses: Iterable<CellAddress>, format: NumberFormat | undefined): SheetChange {\n return this.#formatCells(addresses, new CellFormatChange({ numberFormat: format ?? NumberFormat.general }), undefined, undefined, undefined).change;\n }\n\n /** Sets the Number Format of a range; `undefined` is General. Whole columns and whole rows record one entry each (ADR-0047). @internal */\n setNumberFormat(range: CellRange, format: NumberFormat | undefined): SheetChange {\n return this.applyCellFormat(range, new CellFormatChange({ numberFormat: format ?? NumberFormat.general })).change;\n }\n\n /** Sets the horizontal alignment of cells. No Value changes. @internal */\n setAlignmentOf(addresses: Iterable<CellAddress>, alignment: HorizontalAlignment): SheetChange {\n return this.#formatCells(addresses, new CellFormatChange({ alignment: checkAlignment(alignment) }), undefined, undefined, undefined).change;\n }\n\n /** Sets the horizontal alignment of a range, recording whole columns and whole rows as one entry each. @internal */\n setAlignment(range: CellRange, alignment: HorizontalAlignment): SheetChange {\n return this.applyCellFormat(range, new CellFormatChange({ alignment: checkAlignment(alignment) })).change;\n }\n\n /** Sets the parts `change` names on several ranges at once (ADR-0046, ADR-0071). @internal */\n setCellFormat(ranges: Iterable<CellRange>, change: CellFormatChange): SheetChange {\n return this.applyCellFormats(Sheet.checkCellFormat(ranges, change), change).change;\n }\n\n /** The ranges a change is set on, checked with the change. Throws for no range, a change that sets nothing, or an alignment that is not one. @internal */\n static checkCellFormat(ranges: Iterable<CellRange>, change: CellFormatChange): CellRange[] {\n const list = [...ranges];\n if (list.length === 0) throw new RangeError('A Cell Format is set on at least one range.');\n if (change.isEmpty) throw new RangeError('The change sets no part of a Cell Format.');\n if (change.alignment !== undefined) checkAlignment(change.alignment);\n return list;\n }\n\n /** Sets `change` on each range in turn, as one change. @internal */\n applyCellFormats(ranges: readonly CellRange[], change: CellFormatChange): CellFormatsOutcome {\n const parts = ranges.map(range => this.applyCellFormat(range, change));\n return { change: SheetChange.merge(parts.map(p => p.change)), parts };\n }\n\n /** Undoes a change set on several ranges, each range's part in the reverse of the order it was set. @internal */\n undoCellFormats(outcome: CellFormatsOutcome): SheetChange {\n const changes: SheetChange[] = [];\n for (let i = outcome.parts.length - 1; i >= 0; i--) changes.push(this.undoCellFormat(defined(outcome.parts[i], 'a part')));\n return SheetChange.merge(changes);\n }\n\n /** What a cell shows where it records nothing of its own: its row's, else its column's, else the defaults. */\n #inherited(address: CellAddress): CellFormat {\n return (this.#rowFormats.get(address.row) ?? AxisFormat.empty).over((this.#columnFormats.get(address.column) ?? AxisFormat.empty).over(defaultCellFormat));\n }\n\n /**\n * A change set on a range, as Excel sets it (ADR-0047, ADR-0071): on the range, and, across each outer edge\n * the change sets, on the cells beside it, whose record of that edge it clears. Undoing it puts back both. @internal\n */\n applyCellFormat(range: CellRange, change: CellFormatChange): CellFormatOutcome {\n let set = change;\n if (set.borders !== undefined) set = set.withBorders(set.borders.on(range));\n const mine = this.#applyCellFormatOn(range, set);\n if (!set.setsBorders) return mine;\n const parts: CellFormatOutcome[] = [mine];\n for (const { range: beside, borders } of defined(set.borders, 'the Borders set').beside(range)) {\n parts.push(this.#applyCellFormatOn(beside, new CellFormatChange({ borders })));\n }\n return combined(parts);\n }\n\n /**\n * A change set on the range alone. Whole columns record it on the column level; whole rows on the row level.\n * The whole Sheet is whole columns. A cell a level alone would not show what it should is given it as its own.\n * Any other range sets its cells.\n */\n #applyCellFormatOn(range: CellRange, change: CellFormatChange): CellFormatOutcome {\n const rowsBefore = new Map(this.#rowFormats);\n const columnsBefore = new Map(this.#columnFormats);\n const wholeColumns = range.isWholeColumns;\n const wholeRows = range.isWholeRows;\n if (!wholeColumns && !wholeRows) return this.#formatCells(range.cells(), change, range, undefined, undefined);\n\n const touched = this.#cellsGivenTheirOwn(range, change);\n // What each of them records before the levels change under it: a Font or Borders is patched from that.\n const shownBefore = new Map<number, CellFormat>();\n for (const address of touched) if (!shownBefore.has(address.key)) shownBefore.set(address.key, this.#ownFormat(address));\n if (wholeColumns) {\n if (wholeRows) {\n for (const row of this.#rowFormats.keys()) setAxis(this.#rowFormats, row, underWholeSheet(defined(this.#rowFormats.get(row), 'a row\\'s level'), change));\n }\n for (let column = range.first.column; column <= range.last.column; column++) {\n // Nothing lies under a column: a part at its default records nothing. The whole Sheet has no outer edge (the twelfth run, case 15).\n const level = this.#columnFormats.get(column) ?? AxisFormat.empty;\n const next = change.applyTo(level.over(defaultCellFormat), wholeRows ? PlaceInRange.inside : new PlaceInRange(false, false, column === range.first.column, column === range.last.column));\n setAxis(this.#columnFormats, column, level.with(change, next, defaultCellFormat));\n }\n } else {\n // General, General alignment or no Fill on a row is recorded only where a column's would otherwise show through.\n const columnLevels = [...this.#columnFormats.values()];\n const formatted = change.numberFormat !== undefined && columnLevels.some(f => f.numberFormat !== undefined);\n const aligned = change.alignment !== undefined && columnLevels.some(f => f.alignment !== undefined);\n const filled = change.fill !== undefined && columnLevels.some(f => f.fill !== undefined);\n for (let row = range.first.row; row <= range.last.row; row++) {\n const level = this.#rowFormats.get(row) ?? AxisFormat.empty;\n const next = change.applyTo(level.over(defaultCellFormat), new PlaceInRange(row === range.first.row, row === range.last.row, false, false));\n const recorded = level.with(change, next, defaultCellFormat);\n setAxis(this.#rowFormats, row, new AxisFormat(\n formatted ? next.numberFormat : recorded.numberFormat,\n aligned ? next.alignment : recorded.alignment,\n recorded.font,\n filled ? next.fill : recorded.fill,\n recorded.borders));\n }\n }\n return this.#formatCells(touched, change, range, shownBefore, { rows: rowsBefore, columns: columnsBefore });\n }\n\n /** The cells a change set on whole columns or whole rows gives a record of their own, because the levels alone would not show them what they should. */\n #cellsGivenTheirOwn(range: CellRange, change: CellFormatChange): CellAddress[] {\n const touched: CellAddress[] = [];\n const borders = change.setsBorders ? change.borders : undefined;\n if (range.isWholeColumns) {\n for (const cell of this.#cells.values()) if (cell.address.column >= range.first.column && cell.address.column <= range.last.column) touched.push(cell.address);\n if (range.isWholeRows) return touched;\n for (const [row, level] of this.#rowFormats) {\n if (!change.touches(level)) continue;\n for (let column = range.first.column; column <= range.last.column; column++) touched.push(new CellAddress(row, column));\n }\n } else {\n for (const cell of this.#cells.values()) if (cell.address.row >= range.first.row && cell.address.row <= range.last.row) touched.push(cell.address);\n for (const [column, level] of this.#columnFormats) {\n if (!(change.setsFont && level.font !== undefined) && !(borders !== undefined && level.borders !== undefined)) continue;\n for (let row = range.first.row; row <= range.last.row; row++) touched.push(new CellAddress(row, column));\n }\n if (borders !== undefined && !samePart(borders.left, borders.insideVertical)) {\n for (let row = range.first.row; row <= range.last.row; row++) touched.push(new CellAddress(row, range.first.column));\n }\n }\n return touched;\n }\n\n /**\n * Gives each cell what it records once `change` is set on it at its place in `range`, patched from what it\n * recorded before, and recorded on the cell only where it differs from what its row or column gives it. A\n * changed top or bottom side names the row across it too.\n */\n #formatCells(addresses: Iterable<CellAddress>, change: CellFormatChange, range: CellRange | undefined,\n shownBefore: ReadonlyMap<number, CellFormat> | undefined,\n axesBefore: { rows: ReadonlyMap<number, AxisFormat>; columns: ReadonlyMap<number, AxisFormat> } | undefined): CellFormatOutcome {\n const before = new Map<number, AddressedState>();\n const rows = new Set<number>(axesBefore === undefined ? [] : this.#rowsAffectedByAxes(axesBefore.rows, axesBefore.columns));\n for (const address of addresses) {\n if (before.has(address.key)) continue;\n before.set(address.key, { address, state: this.#stateAt(address).recorded });\n const shown = shownBefore?.get(address.key) ?? this.#ownFormat(address);\n const next = change.applyTo(shown, range === undefined ? PlaceInRange.alone : PlaceInRange.of(range, address));\n let cell = this.#cells.get(address.key);\n const existing = cell !== undefined;\n cell ??= new Cell(address);\n const changed = cell.take(change, next, this.#inherited(address));\n if (cell.isEmpty && cell.value === undefined) this.#cells.delete(address.key);\n else if (!existing) this.#cells.set(address.key, cell);\n if (changed || (existing && axesBefore !== undefined)) rows.add(address.row);\n for (const row of rowsAcross(address, shown.borders, next.borders)) rows.add(row);\n }\n // A level shows in the cells that hold nothing too, and rows names only those that hold one.\n const levels = axesBefore !== undefined && this.#levelsDiffer(axesBefore.rows, axesBefore.columns);\n const sheetChange = rows.size === 0 && !levels ? SheetChange.none : new SheetChange([], [], distinctNumbers(rows), [], levels);\n return {\n change: sheetChange,\n before: [...before.values()],\n rowsBefore: axesBefore?.rows ?? new Map(this.#rowFormats),\n columnsBefore: axesBefore?.columns ?? new Map(this.#columnFormats),\n };\n }\n\n /** The rows holding a cell that shows under a row or column level that differs from `rows` and `columns`. */\n #rowsAffectedByAxes(rows: ReadonlyMap<number, AxisFormat>, columns: ReadonlyMap<number, AxisFormat>): number[] {\n const changedRows = new Set([...rows.keys(), ...this.#rowFormats.keys()].filter(r => !sameLevel(rows.get(r), this.#rowFormats.get(r))));\n const changedColumns = new Set([...columns.keys(), ...this.#columnFormats.keys()].filter(c => !sameLevel(columns.get(c), this.#columnFormats.get(c))));\n if (changedRows.size === 0 && changedColumns.size === 0) return [];\n return [...this.#cells.values()].filter(c => changedRows.has(c.address.row) || changedColumns.has(c.address.column)).map(c => c.address.row);\n }\n\n /** Undoes a formatting command: the row and column levels, then the cells, exactly as they were. @internal */\n undoCellFormat(outcome: CellFormatOutcome): SheetChange {\n const rowsNow = this.#rowFormats;\n const columnsNow = this.#columnFormats;\n this.#rowFormats = new Map(outcome.rowsBefore);\n this.#columnFormats = new Map(outcome.columnsBefore);\n const rows = new Set(this.#rowsAffectedByAxes(rowsNow, columnsNow));\n const levels = this.#levelsDiffer(rowsNow, columnsNow);\n const change = this.restore(outcome.before);\n for (const row of change.rows) rows.add(row);\n return rows.size === 0 && !levels\n ? SheetChange.none\n : new SheetChange(change.valueChanges, change.recalculated, distinctNumbers(rows), [], levels);\n }\n\n /** Whether the row or column levels now differ from `rows` and `columns`. */\n #levelsDiffer(rows: ReadonlyMap<number, AxisFormat>, columns: ReadonlyMap<number, AxisFormat>): boolean {\n return levelsDiffer(rows, this.#rowFormats) || levelsDiffer(columns, this.#columnFormats);\n }\n\n /**\n * The row (or column) levels after a structural edit: moved with their rows (columns), those deleted or pushed\n * off the edge dropped, and inserted rows (columns) given the level of the one before them, all but its\n * Borders, when `formatInserted` (ADR-0046, ADR-0071).\n */\n #shiftAxisFormats(edit: StructuralEdit, formatInserted: boolean): void {\n const rows = edit.axis === 'rows';\n const levels = rows ? this.#rowFormats : this.#columnFormats;\n const shifted = new Map<number, AxisFormat>();\n for (const [index, level] of levels) {\n const to = edit.move(rows ? new CellAddress(index, 0) : new CellAddress(0, index));\n if (to !== undefined) shifted.set(rows ? to.row : to.column, level);\n }\n const above = edit.start > 0 ? levels.get(edit.start - 1) : undefined;\n if (edit.isInsert && formatInserted && above !== undefined) {\n const taken = above.replacing({ borders: undefined });\n if (!taken.isEmpty) {\n for (let i = 0; i < edit.count; i++) shifted.set(edit.start + i, taken);\n }\n }\n if (rows) this.#rowFormats = shifted;\n else this.#columnFormats = shifted;\n }\n\n // ---- What a range of cells shows (Sheet.CellFormatSpread.cs) ----\n\n /**\n * The Cell Formats the cells of `range` show, each once (ADR-0071): what Format Cells reads to show a part that\n * differs across the Selection. Its Borders are each cell's own four sides. Read from what the Sheet records,\n * never cell by cell (principle 5).\n */\n getCellFormats(range: CellRange): CellFormat[] {\n const shown = new Map<string, CellFormat>();\n const add = (format: CellFormat): void => {\n if (!shown.has(format.key)) shown.set(format.key, format);\n };\n // How many cells recording a Cell Format of their own lie in each block of a row group and a column group.\n const recorded = new Map<string, number>();\n for (const cell of this.#cells.values()) {\n if (!cell.isFormatted || !range.contains(cell.address)) continue;\n add(this.#ownFormat(cell.address));\n const block = `${(this.#rowFormats.get(cell.address.row) ?? AxisFormat.empty).key}|${(this.#columnFormats.get(cell.address.column) ?? AxisFormat.empty).key}`;\n recorded.set(block, (recorded.get(block) ?? 0) + 1); // oxlint-disable-line ex-grid/no-stand-in-default -- a block no cell has counted yet holds none\n }\n const rows = levelGroups(this.#rowFormats, range.first.row, range.last.row);\n const columns = levelGroups(this.#columnFormats, range.first.column, range.last.column);\n for (const row of rows.values()) {\n for (const column of columns.values()) {\n if (row.count * column.count > (recorded.get(`${row.level.key}|${column.level.key}`) ?? 0)) add(row.level.over(column.level.over(defaultCellFormat))); // oxlint-disable-line ex-grid/no-stand-in-default -- a block no cell records holds none\n }\n }\n return [...shown.values()];\n }\n\n /** The lines drawn along each outer edge of `range`, each once per edge (ADR-0071; the fourteenth Windows run, case 13). */\n getEdgeLines(range: CellRange): RangeEdgeLines {\n const { first, last } = range;\n return {\n top: this.#linesBetween(true, first.row - 1, first.row, first.column, last.column),\n bottom: this.#linesBetween(true, last.row, last.row + 1, first.column, last.column),\n left: this.#linesBetween(false, first.column - 1, first.column, first.row, last.row),\n right: this.#linesBetween(false, last.column, last.column + 1, first.row, last.row),\n };\n }\n\n /** The lines drawn on the edges between two neighbouring lines of cells, each once. A line beyond the Sheet's edge records nothing. */\n #linesBetween(horizontal: boolean, before: number, after: number, first: number, last: number): BorderLine[] {\n const lines = new Map<string, BorderLine>();\n const addLine = (line: BorderLine): void => {\n if (!lines.has(line.key)) lines.set(line.key, line);\n };\n const count = horizontal ? rowCount : columnCount;\n const hasBefore = before >= 0;\n const hasAfter = after < count;\n const across = horizontal ? this.#columnFormats : this.#rowFormats;\n const groups = levelGroups(across, first, last);\n const shownOn = (upperOrLeft: CellBorders, lowerOrRight: CellBorders): BorderLine => horizontal\n ? edge(hasBefore ? upperOrLeft.bottom : BorderLine.none, hasAfter ? lowerOrRight.top : BorderLine.none)\n : edge(hasBefore ? upperOrLeft.right : BorderLine.none, hasAfter ? lowerOrRight.left : BorderLine.none);\n const ownAt = (line: number, position: number): CellBorders =>\n line < 0 || line >= count ? CellBorders.none : this.#ownSides(horizontal ? new CellAddress(line, position) : new CellAddress(position, line));\n const levelled = (line: number, level: AxisFormat): CellBorders => horizontal\n ? this.#rowFormats.get(line)?.borders ?? level.borders ?? CellBorders.none\n : level.borders ?? this.#columnFormats.get(line)?.borders ?? CellBorders.none;\n // Where a cell on either side records Borders of its own, the edge is read there, and that place leaves its level's group.\n const read = new Set<number>();\n for (const cell of this.#cells.values()) {\n if (cell.borders === undefined) continue;\n const line = horizontal ? cell.address.row : cell.address.column;\n const position = horizontal ? cell.address.column : cell.address.row;\n if ((line !== before && line !== after) || position < first || position > last || read.has(position)) continue;\n read.add(position);\n addLine(shownOn(ownAt(before, position), ownAt(after, position)));\n const group = defined(groups.get((across.get(position) ?? AxisFormat.empty).key), 'the level\\'s group');\n group.count--;\n }\n // Every other place shows what the levels record: each cell's row over its column.\n for (const { level, count: places } of groups.values()) {\n if (places > 0) addLine(shownOn(levelled(before, level), levelled(after, level)));\n }\n return [...lines.values()];\n }\n\n // ---- Recalculation (Sheet.Recalculation.cs) ----\n\n /** The Formula cells, on any Sheet of the Workbook, that read `address` of this Sheet directly. @internal */\n *dependentsInWorkbook(address: CellAddress): Generator<SheetCell> {\n for (const dependent of this.#dependents(address)) yield new SheetCell(this, dependent);\n const set = this.#remoteCellDependents.get(address.key);\n if (set !== undefined) yield* set;\n for (const [dependent, areas] of this.#remoteAreaDependents) {\n if (areas.some(area => area.contains(address))) yield dependent;\n }\n }\n\n /** The Sheet a Reference's qualifier names: this one for none or its own name, another of the Workbook for its name; `undefined` for a name no Sheet has. @internal */\n sheetNamed(qualifier: string | undefined): Sheet | undefined {\n return this.isThisSheet(qualifier) ? this : this.workbook.find(defined(qualifier, 'a qualifier'));\n }\n\n /** One recalculation of cells on any Sheet of the Workbook, started from this Sheet: what it changed here. */\n #recalculate(changed: SheetCellSet, rows: Set<number>): SheetChange {\n const changes = Sheet.recalculateWorkbook(this.workbook, changed, this, rows);\n let mine: SheetChange | undefined;\n for (const [sheet, change] of changes) {\n if (sheet === this) mine = change;\n else this.workbook.collect(sheet, change);\n }\n return mine ?? SheetChange.none;\n }\n\n /**\n * One recalculation: what `changed` reaches and every volatile Formula of the Workbook, the moment read once\n * (ADR-0124); then the spills laid out, Sheet by Sheet, and what their layout changed recalculated with every\n * volatile Formula, until a layout changes nothing. What it changed on each Sheet it reached; `initiator`'s\n * always. @internal\n */\n static recalculateWorkbook(workbook: Workbook, changed: SheetCellSet, initiator: Sheet, initiatorRows: Set<number>): Map<Sheet, SheetChange> {\n // Read once, so every NOW of the Workbook in one recalculation answers the same moment.\n const moment = workbook.nowSource?.();\n for (const sheet of workbook.sheets) sheet.#moment = moment;\n const rows = new Map<Sheet, Set<number>>(workbook.sheets.map(s => [s, s === initiator ? initiatorRows : new Set<number>()]));\n const changes = new Map<Sheet, SheetChange[]>(workbook.sheets.map(s => [s, []]));\n const add = (pass: Map<Sheet, SheetChange>): void => {\n for (const [sheet, change] of pass) defined(changes.get(sheet), 'a Sheet\\'s changes').push(change);\n };\n add(Sheet.#recalculatePass(workbook, changed, rows, true));\n let passes = 1;\n for (;;) {\n const laidOut: SheetCell[] = [];\n for (const sheet of workbook.sheets) {\n const cells = sheet.#layOutSpills();\n if (cells.length === 0) continue;\n const sheetRows = defined(rows.get(sheet), 'a Sheet\\'s rows');\n for (const address of cells) sheetRows.add(address.row);\n defined(changes.get(sheet), 'a Sheet\\'s changes').push(new SheetChange(cells, [], distinctNumbers(cells.map(a => a.row))));\n for (const address of cells) laidOut.push(new SheetCell(sheet, address));\n }\n if (laidOut.length === 0) break;\n const readers = new SheetCellSet();\n for (const cell of laidOut) readers.addAll(cell.sheet.dependentsInWorkbook(cell.address));\n if ((readers.size === 0 && !workbook.sheets.some(s => s.hasVolatileFormulas)) || passes === mostPasses) break;\n add(Sheet.#recalculatePass(workbook, readers, rows, true));\n passes++;\n }\n initiator.recalculationPasses = passes;\n const result = new Map<Sheet, SheetChange>();\n for (const [sheet, list] of changes) {\n if (sheet === initiator || list.length > 0) result.set(sheet, SheetChange.merge(list));\n }\n return result;\n }\n\n /**\n * Recomputes the changed cells and everything that depends on them, on any Sheet, in dependency order, into a\n * staging set; a cycle, and everything downstream of one, is `#CIRC!` (ADR-0047). Only when every Value is\n * computed are they published.\n */\n static #recalculatePass(workbook: Workbook, changed: SheetCellSet, rows: Map<Sheet, Set<number>>, withVolatile: boolean): Map<Sheet, SheetChange> {\n // 1. Everything the change can reach, and every volatile Formula, whatever the change (ADR-0124).\n const dirty = new SheetCellSet(changed);\n if (withVolatile) {\n for (const sheet of workbook.sheets) for (const key of sheet.#volatileFormulas) dirty.add(new SheetCell(sheet, CellAddress.fromKey(key)));\n }\n const queue: SheetCell[] = [...dirty];\n for (let head = 0; head < queue.length; head++) {\n const next = defined(queue[head], 'a queued cell');\n for (const dependent of next.sheet.dependentsInWorkbook(next.address)) {\n if (dirty.add(dependent)) queue.push(dependent);\n }\n }\n\n const staged = new Map<Sheet, Map<number, Value | undefined>>(workbook.sheets.map(s => [s, new Map()]));\n const arrays = new Map<Sheet, Map<number, ValueArray | undefined>>(workbook.sheets.map(s => [s, new Map()]));\n const recalculated = new Map<Sheet, CellAddress[]>(workbook.sheets.map(s => [s, []]));\n const stagedOf = (sheet: Sheet): Map<number, Value | undefined> => defined(staged.get(sheet), 'a Sheet\\'s staged Values');\n const arraysOf = (sheet: Sheet): Map<number, ValueArray | undefined> => defined(arrays.get(sheet), 'a Sheet\\'s arrays');\n const recalculatedOf = (sheet: Sheet): CellAddress[] => defined(recalculated.get(sheet), 'a Sheet\\'s recalculated cells');\n const formulas = new SheetCellSet();\n for (const target of dirty) {\n const cell = target.sheet.#cells.get(target.address.key);\n const entry = cell?.entry;\n if (entry?.parsed !== undefined) formulas.add(target);\n // A spilled cell with no Entry keeps its Value: the spill's layout gives it, after the pass (ADR-0125).\n else if (entry !== undefined || cell?.spilledFrom === undefined) stagedOf(target.sheet).set(target.address.key, entry?.constant);\n }\n\n // 2. Dependency order among the Formulas to recompute (Kahn). What never becomes ready is in a cycle or downstream of one.\n const edges = new SheetCellMap<SheetCell[]>();\n const waiting = new SheetCellMap<number>();\n for (const formula of formulas) waiting.set(formula, 0);\n for (const precedent of formulas) {\n const targets: SheetCell[] = [];\n const seen = new SheetCellSet();\n for (const dependent of precedent.sheet.dependentsInWorkbook(precedent.address)) {\n if (!seen.add(dependent) || !formulas.has(dependent)) continue;\n targets.push(dependent);\n waiting.set(dependent, defined(waiting.get(dependent), 'a waiting count') + 1);\n }\n edges.set(precedent, targets);\n }\n\n // A Reference a volatile function computes is read as it stands after this recalculation: a cell still to\n // compute is computed first, on demand, and a Formula that reaches itself that way is #CIRC! (ADR-0124).\n const inProgress = new SheetCellSet();\n const reads: ReadState = { met: undefined, metRefusal: false };\n const readers = new Map<Sheet, { reader: StagedReader; evaluator: Evaluator }>();\n\n // One Formula, once: in dependency order, or first, on demand, when a computed Reference reads it before its turn.\n const compute = (target: SheetCell): Value | undefined => {\n const { sheet, address } = target;\n const sheetStaged = stagedOf(sheet);\n if (sheetStaged.has(address.key)) return sheetStaged.get(address.key);\n if (inProgress.has(target)) return Value.fromError('#CIRC!');\n inProgress.add(target);\n const { reader, evaluator } = defined(readers.get(sheet), 'a Sheet\\'s reader');\n const anchor = defined(sheet.#cells.get(address.key), 'the Formula\\'s cell');\n const node = defined(anchor.entry?.parsed, 'the cell\\'s Formula');\n const outer = evaluator.self;\n evaluator.self = address;\n // The outer Formula's reads so far are its own; this one's start from none.\n const outerMet = reads.met;\n const outerMetRefusal = reads.metRefusal;\n reads.met = undefined;\n reads.metRefusal = false;\n let value: Value;\n const tainted = sheet.#taint(node, reader);\n const sheetArrays = arraysOf(sheet);\n if (tainted !== undefined) {\n value = tainted;\n sheetArrays.set(address.key, undefined);\n } else {\n // A result of more than one Value spills (ADR-0125): the anchor holds the array, and shows its first\n // Value until the layout after the pass says whether it spills.\n const computed = evaluator.evaluateResult(node);\n const array = isMulti(computed) ? evaluator.toArray(computed) : undefined;\n const scalar = array === undefined ? evaluator.scalarOf(computed) : undefined;\n const met = reads.met as ErrorValue | undefined;\n if (met !== undefined) {\n value = Value.fromError(met);\n sheetArrays.set(address.key, undefined);\n } else if (reads.metRefusal as boolean) {\n value = Value.refusal;\n sheetArrays.set(address.key, undefined);\n } else {\n sheetArrays.set(address.key, array);\n value = array === undefined ? scalar ?? Value.fromNumber(0)\n : stillBlocked(anchor, array) ? Value.fromError('#SPILL!')\n : array.at(0, 0) ?? Value.fromNumber(0);\n }\n }\n // A refused Anchor whose array's shape its text settles spills refusals over that shape (2026-10-13, decided with the user).\n if (value.isRefused) {\n const shape = knownShape(node, r => sheet.sheetNamed(r.sheetName) !== undefined);\n if (shape !== undefined && (shape.rows > 1 || shape.columns > 1)) {\n const refusals = new ValueArray(shape.rows, shape.columns);\n for (let r = 0; r < shape.rows; r++) {\n for (let c = 0; c < shape.columns; c++) refusals.set(r, c, Value.refusal);\n }\n sheetArrays.set(address.key, refusals);\n if (stillBlocked(anchor, refusals)) value = Value.fromError('#SPILL!');\n }\n }\n reads.met = outerMet;\n reads.metRefusal = outerMetRefusal;\n evaluator.self = outer;\n inProgress.delete(target);\n sheetStaged.set(address.key, value);\n recalculatedOf(sheet).push(address);\n return value;\n };\n\n for (const sheet of workbook.sheets) {\n const reader = new StagedReader(\n sheet, stagedOf(sheet),\n address => {\n const cell = new SheetCell(sheet, address);\n return formulas.has(cell) ? compute(cell) : undefined;\n },\n arraysOf(sheet), reads,\n name => {\n const other = workbook.find(name);\n return other === undefined ? undefined : readers.get(other)?.reader;\n },\n (first, last) => workbook.span(first, last)?.map(s => defined(readers.get(s), 'a Sheet\\'s reader').reader));\n readers.set(sheet, { reader, evaluator: new Evaluator(reader, sheet.culture) });\n }\n const ready: SheetCell[] = [];\n for (const [cell, count] of waiting) if (count === 0) ready.push(cell);\n for (let head = 0; head < ready.length; head++) {\n const target = defined(ready[head], 'a ready cell');\n if (!stagedOf(target.sheet).has(target.address.key)) compute(target);\n for (const dependent of defined(edges.get(target), 'a cell\\'s edges')) {\n const left = defined(waiting.get(dependent), 'a waiting count') - 1;\n waiting.set(dependent, left);\n if (left === 0) ready.push(dependent);\n }\n }\n for (const [target, count] of waiting) {\n if (count > 0) {\n const sheetStaged = stagedOf(target.sheet);\n if (!sheetStaged.has(target.address.key)) recalculatedOf(target.sheet).push(target.address);\n sheetStaged.set(target.address.key, Value.fromError('#CIRC!'));\n }\n }\n\n // 3. Publish, all at once.\n const result = new Map<Sheet, SheetChange>();\n for (const sheet of workbook.sheets) {\n const change = sheet.#publish(stagedOf(sheet), arraysOf(sheet), recalculatedOf(sheet), defined(rows.get(sheet), 'a Sheet\\'s rows'));\n if (change !== undefined) result.set(sheet, change);\n }\n return result;\n }\n\n /** Publishes what a pass computed on this Sheet: the Anchors' arrays, then every staged Value. `undefined` when the pass neither reached the Sheet nor holds rows for it. */\n #publish(staged: Map<number, Value | undefined>, arrays: Map<number, ValueArray | undefined>, recalculated: CellAddress[], rows: Set<number>): SheetChange | undefined {\n if (staged.size === 0 && arrays.size === 0 && recalculated.length === 0 && rows.size === 0) return undefined;\n for (const [key, array] of arrays) {\n const anchor = this.#cells.get(key);\n if (anchor !== undefined) {\n anchor.array = array;\n if (array === undefined) anchor.spillBlocked = false;\n }\n }\n const valueChanges: CellAddress[] = [];\n for (const [key, value] of staged) {\n const cell = this.#cells.get(key);\n const old = cell?.value;\n if (cell !== undefined) {\n cell.value = value;\n if (cell.isEmpty) this.#cells.delete(key);\n }\n if (!Value.unchanged(old, value)) {\n const address = CellAddress.fromKey(key);\n valueChanges.push(address);\n rows.add(address.row);\n }\n }\n valueChanges.sort((a, b) => a.compareTo(b));\n recalculated.sort((a, b) => a.compareTo(b));\n return new SheetChange(valueChanges, recalculated, distinctNumbers(rows));\n }\n\n /**\n * A Formula that reads a cell in a cycle is `#CIRC!` whatever it computes; one that reads a waiting cell, or\n * calls `TODAY` before the Sheet Day is known, or draws before the Sheet has a seed, waits; and one that reads a\n * refused cell, or a Linked Table's column that holds a refusal, is refused (ADR-0047, ADR-0049, ADR-0121,\n * ADR-0180). A cycle comes before a wait, and a wait before a refusal.\n */\n #taint(node: Node, reader: StagedReader): Value | undefined {\n let gettingData = this.#readsWaitingTable(node) || this.#waitsForToday(node) || this.#waitsForNow(node) || this.#waitsForSeed(node);\n let refused = this.#readsRefusingTable(node);\n for (const reference of node.references()) {\n // A 3D Reference reads its rectangle on every Sheet of its span (ADR-0331 \u00A77).\n let targets: readonly CellReader[];\n if (reference.isThreeD) {\n targets = reader.resolveSpan(defined(reference.sheetName, 'a span\\'s first Sheet'), defined(reference.lastSheetName, 'a span\\'s last Sheet')) ?? []; // oxlint-disable-line ex-grid/no-stand-in-default -- a span an end of which no Sheet has reads no Sheet (ADR-0331 \u00A77)\n } else {\n const one = reader.resolve(reference.sheetName);\n targets = one === undefined ? [] : [one];\n }\n for (const target of targets) {\n if (!(target instanceof StagedReader)) continue;\n for (const address of target.sheet.cellsIn(reference.area)) {\n const value = target.read(address);\n if (value?.isError !== true) continue;\n if (value.error === '#CIRC!') return value;\n if (value.error === '#GETTING_DATA') gettingData = true;\n if (value.isRefused) refused = true;\n }\n }\n }\n return gettingData ? Value.fromError('#GETTING_DATA') : refused ? Value.refusal : undefined;\n }\n\n // ---- Spilled arrays (Sheet.Spill.cs) ----\n\n /**\n * Decides where every array spills, Anchors in address order: an Anchor whose Spill Range passes the Sheet's\n * edge, or covers a cell holding an Entry or another Anchor's spill, shows `#SPILL!` and spills nothing. Cells\n * no Anchor spills into any more are released. The cells whose Value the layout changed, Anchors included.\n */\n #layOutSpills(): CellAddress[] {\n const changed: CellAddress[] = [];\n const set = (cell: Cell, value: Value | undefined): void => {\n if (Value.unchanged(cell.value, value)) return;\n cell.value = value;\n changed.push(cell.address);\n };\n const claimed = new Map<number, { anchor: CellAddress; value: Value }>();\n const anchors = [...this.#cells.values()].filter(c => c.array !== undefined).toSorted((a, b) => a.address.compareTo(b.address));\n for (const anchor of anchors) {\n if (anchor.entry?.parsed === undefined) {\n anchor.array = undefined;\n anchor.spillBlocked = false;\n continue;\n }\n const array = defined(anchor.array, 'the Anchor\\'s array');\n const origin = anchor.address;\n // Past the Sheet's edge, Excel's or the Workbook's size (ADR-0460), it is #SPILL! as Excel's is.\n let blocked = !this.workbook.size.holds(origin, array.rows, array.columns);\n for (let r = 0; r < array.rows && !blocked; r++) {\n for (let c = 0; c < array.columns && !blocked; c++) {\n if (r === 0 && c === 0) continue;\n const key = new CellAddress(origin.row + r, origin.column + c).key;\n blocked = claimed.has(key) || this.#cells.get(key)?.entry !== undefined;\n }\n }\n // Whether it spills is what A1# reads: a change of it is a change, whatever the Value shows.\n if (anchor.spillBlocked !== blocked) changed.push(anchor.address);\n anchor.spillBlocked = blocked;\n set(anchor, blocked ? Value.fromError('#SPILL!') : array.at(0, 0) ?? Value.fromNumber(0));\n if (blocked) continue;\n for (let r = 0; r < array.rows; r++) {\n for (let c = 0; c < array.columns; c++) {\n if (r === 0 && c === 0) continue;\n claimed.set(new CellAddress(origin.row + r, origin.column + c).key, { anchor: origin, value: array.at(r, c) ?? Value.fromNumber(0) });\n }\n }\n }\n for (const cell of [...this.#cells.values()].filter(c => c.spilledFrom !== undefined && !claimed.has(c.address.key))) {\n cell.spilledFrom = undefined;\n if (cell.entry === undefined) set(cell, undefined);\n if (cell.isEmpty) this.#cells.delete(cell.address.key);\n }\n for (const [key, { anchor, value }] of claimed) {\n const cell = this.#cellFor(CellAddress.fromKey(key));\n cell.spilledFrom = anchor;\n set(cell, value);\n }\n changed.sort((a, b) => a.compareTo(b));\n return changed;\n }\n\n /** The Anchor whose array gives a cell its Value, or `undefined` for a cell no array spills into (ADR-0125). */\n spilledFrom(address: CellAddress): CellAddress | undefined {\n return this.#cells.get(address.key)?.spilledFrom;\n }\n\n // ---- Volatile functions, the Sheet Day and the draws (Sheet.Volatile.cs, Sheet.Today.cs, Sheet.Random.cs) ----\n\n /** The moment read at the start of the recalculation under way. @internal */\n get moment(): SheetMoment | undefined {\n return this.#moment;\n }\n\n /** Whether any Formula of this Sheet calls a volatile function. @internal */\n get hasVolatileFormulas(): boolean {\n return this.#volatileFormulas.size > 0;\n }\n\n /** One recalculation of `cells`, on any Sheet of the Workbook, started from this Sheet, with every volatile Formula: what it changed here. @internal */\n recalculateCells(cells: SheetCellSet): SheetChange {\n return this.#recalculate(cells, new Set());\n }\n\n #waitsForNow(node: Node): boolean {\n return this.#moment === undefined && [...node.calls()].some(call => call.function !== undefined && call.name === 'NOW');\n }\n\n /** The Formula cells of this Sheet that call `TODAY`. @internal */\n get todayReaders(): SheetCell[] {\n return [...this.#todayReaders].map(key => new SheetCell(this, CellAddress.fromKey(key)));\n }\n\n #waitsForToday(node: Node): boolean {\n return this.workbook.today === undefined && callsToday(node);\n }\n\n /** The Formula cells of this Sheet that call `RAND` or `RANDBETWEEN`. @internal */\n get randomReaders(): SheetCell[] {\n return [...this.#randomReaders].map(key => new SheetCell(this, CellAddress.fromKey(key)));\n }\n\n /** Does `operation` as one operation of the Workbook. @internal */\n asOneChange<T>(operation: () => T): T {\n return this.workbook.asOneChange(operation);\n }\n\n /** Counts a change of the Workbook. @internal */\n countChange(): void {\n this.workbook.countChange();\n }\n\n /** The draw for the call at `place` in the Formula of `cell`, or `undefined` without a seed (ADR-0180). @internal */\n draw(cell: CellAddress, place: number): bigint | undefined {\n const seed = this.workbook.seed;\n return seed === undefined ? undefined : drawOf(seed, this.#name, cell, place, BigInt(this.workbook.changes));\n }\n\n #waitsForSeed(node: Node): boolean {\n return this.workbook.seed === undefined && callsRandom(node);\n }\n\n // ---- Typing aids (FormulaEntry.cs) ----\n\n /**\n * Completion for the Formula being typed (ADR-0051, ADR-0058): the declared functions and the Workbook's Linked\n * Tables whose names begin with the name at the caret, the columns of one of its tables after `Table[`, and an\n * argument's values where it takes one of a fixed list (`completeFormula`).\n */\n complete(text: string, caret: number): FormulaCompletion | undefined {\n const tables = [...this.workbook.tables.values()].toSorted((a, b) => a.order - b.order);\n return completeFormula(text, caret, tables.map(t => t.name),\n name => this.workbook.tables.get(ignoreCaseKey(name))?.columns);\n }\n\n /**\n * The References in the Formula being edited (ADR-0057), a qualifier naming this Sheet by its name as it is now\n * (`formulaReferences`). A structured reference is kept only when its Linked Table is declared with that\n * column: one naming a table or a column that is not names nothing, as a Reference to another Sheet does not. A\n * declared table still waiting for its data is kept.\n */\n references(text: string): readonly FormulaReference[] {\n return formulaReferences(text, this.#name).filter(r => r.linkedColumn === undefined || this.#isDeclared(r.linkedColumn));\n }\n\n #isDeclared(column: LinkedTableColumn): boolean {\n return this.workbook.tables.get(ignoreCaseKey(column.table))?.columnIndex.has(ignoreCaseKey(column.column)) === true;\n }\n\n // ---- Linked Tables (Sheet.LinkedTables.cs) ----\n\n /** The Linked Tables declared on the Sheet's Workbook, in the order they were declared. @internal */\n get linkedTables(): LinkedTable[] {\n return [...this.workbook.tables.values()].toSorted((a, b) => a.order - b.order)\n .map(t => new LinkedTable(t.name, t.columns, t.data === undefined, t.rowCount, t.key));\n }\n\n /** Declares a Linked Table on the Workbook: what it changed on this Sheet. @internal */\n declareLinkedTable(name: string, columns: readonly string[], key: readonly string[] = []): SheetChange {\n const why = Sheet.whyNotALinkedTable(name, columns);\n if (why !== undefined) throw new RangeError(why);\n const whyNotKey = Sheet.whyNotAKey(name, columns, key);\n if (whyNotKey !== undefined) throw new RangeError(whyNotKey);\n const tables = this.workbook.tables;\n const held = tables.get(ignoreCaseKey(name));\n if (held !== undefined) {\n // The same declaration again changes nothing; other columns or another key replace it (ADR-0049).\n if (sameStrings(held.columns, columns) && sameStrings(held.key, keyAsDeclared(columns, key))) return SheetChange.none;\n tables.delete(ignoreCaseKey(name));\n this.declare(name, columns, key, held.order);\n } else {\n this.declare(name, columns, key);\n }\n // A declaration that takes effect is a change, as a snapshot is (ADR-0180, 2026-10-11).\n this.countChange();\n return this.#recalculateReaders(name);\n }\n\n /** Records a Linked Table's declaration on the Workbook, checked already. @internal */\n declare(name: string, columns: readonly string[], key: readonly string[], order?: number): void {\n const tables = this.workbook.tables;\n const index = new Map<string, number>();\n columns.forEach((column, i) => index.set(ignoreCaseKey(column), i));\n const next = tables.size === 0 ? 0 : Math.max(...[...tables.values()].map(t => t.order)) + 1;\n tables.set(ignoreCaseKey(name), new TableState(name, [...columns], index, keyAsDeclared(columns, key), order ?? next));\n }\n\n /** Why a name and columns cannot be declared as a Linked Table, or `undefined` when they can. @internal */\n static whyNotALinkedTable(name: string, columns: readonly string[]): string | undefined {\n if (!isTableName(name)) return `'${name}' is not a name a Linked Table can have.`;\n if (columns.length === 0) return 'A Linked Table has at least one column.';\n const seen = new Set<string>();\n for (const column of columns) {\n if (column.length === 0) return 'A column name is empty.';\n const key = ignoreCaseKey(column);\n if (seen.has(key)) return `The column '${column}' is declared twice.`;\n seen.add(key);\n }\n return undefined;\n }\n\n /** Why a key cannot be declared with a table's columns, or `undefined` when it can (ADR-0049, 2026-09-30). @internal */\n static whyNotAKey(name: string, columns: readonly string[], key: readonly string[]): string | undefined {\n const seen = new Set<string>();\n for (const column of key) {\n if (!columns.some(c => equalsIgnoreCase(c, column))) return `The key '${column}' is not one of the columns of '${name}'.`;\n const k = ignoreCaseKey(column);\n if (seen.has(k)) return `The key column '${column}' of '${name}' is named twice.`;\n seen.add(k);\n }\n return undefined;\n }\n\n /** The declarations, as a Sheet Document records them (ADR-0049). @internal */\n get tableDeclarations(): SheetDocumentTable[] {\n return [...this.workbook.tables.values()].toSorted((a, b) => a.order - b.order).map(t => new SheetDocumentTable(t.name, t.columns, t.key));\n }\n\n /** Takes a Linked Table's snapshot: what it changed on this Sheet. @internal */\n pushLinkedTable(name: string, rows: Iterable<readonly (Value | undefined)[]>): SheetChange {\n const table = this.workbook.tables.get(ignoreCaseKey(name));\n if (table === undefined) throw new Error(`No Linked Table named '${name}' is declared.`);\n const width = table.columns.length;\n const columns: (Value | undefined)[][] = Array.from({ length: width }, () => []);\n let count = 0;\n for (const row of rows) {\n if (row.length !== width) throw new RangeError(`Row ${String(count)} does not hold one Value for each of the ${String(width)} columns of '${table.name}'.`);\n for (let c = 0; c < width; c++) {\n const value = row[c];\n if (value?.isError === true && (value.error === '#GETTING_DATA' || value.error === '#CIRC!')) {\n throw new RangeError(`${value.error} is not data a Linked Table can hold.`);\n }\n defined(columns[c], 'a column').push(value);\n }\n count++;\n }\n // A snapshot is a change, refused or taken: what the Sheet's Formulas read changes (ADR-0180).\n this.countChange();\n if (table.key.length > 0) {\n const parts = table.key.map(k => defined(columns[defined(table.columnIndex.get(ignoreCaseKey(k)), 'a key column\\'s index')], 'a key column'));\n const repeat = firstRepeat(parts);\n if (repeat !== undefined) {\n // The table waits again; the previous snapshot is not kept: it would show an older value (ADR-0049, 2026-09-30).\n table.data = undefined;\n table.rowCount = 0;\n const waiting = this.#recalculateReaders(table.name);\n throw new RepeatedKeyError(table.name, table.key, parts.map(p => defined(p[repeat.first], 'a key')), repeat.first,\n parts.map(p => defined(p[repeat.second], 'a key')), repeat.second, waiting);\n }\n }\n // The snapshot is built whole before it replaces the old one.\n table.data = columns;\n table.refusing = columns.map(c => c.some(v => v?.isRefused === true));\n table.rowCount = count;\n return this.#recalculateReaders(table.name);\n }\n\n /** Recalculates every Formula that reads the table, on any Sheet of the Workbook (ADR-0331). */\n #recalculateReaders(name: string): SheetChange {\n const readers = new SheetCellSet();\n for (const sheet of this.workbook.sheets) {\n const cells = sheet.#tableReaders.get(ignoreCaseKey(name));\n if (cells !== undefined) for (const key of cells) readers.add(new SheetCell(sheet, CellAddress.fromKey(key)));\n }\n // Nothing reads the table, but a volatile Formula is recalculated whatever the change (ADR-0124).\n if (readers.size === 0 && !this.workbook.sheets.some(s => s.hasVolatileFormulas)) return SheetChange.none;\n return this.#recalculate(readers, new Set());\n }\n\n /** What a structured reference reads (ADR-0049). @internal */\n tableColumn(name: string, column: string): Operand {\n const table = this.workbook.tables.get(ignoreCaseKey(name));\n if (table === undefined) return Operand.ofError('#NAME?');\n if (table.data === undefined) return Operand.ofError('#GETTING_DATA');\n const index = table.columnIndex.get(ignoreCaseKey(column));\n return index === undefined ? Operand.ofError('#REF!') : Operand.ofColumn(defined(table.data[index], 'a column'));\n }\n\n /** Whether a Linked Table's column holds a refusal (ADR-0047; 2026-10-12, decided with the user). @internal */\n columnHoldsRefusal(name: string, column: string): boolean {\n const table = this.workbook.tables.get(ignoreCaseKey(name));\n if (table?.data === undefined) return false;\n const index = table.columnIndex.get(ignoreCaseKey(column));\n return index !== undefined && table.refusing[index] === true;\n }\n\n #readsRefusingTable(node: Node): boolean {\n for (const reference of node.structuredReferences()) {\n if (this.columnHoldsRefusal(reference.table, reference.column)) return true;\n }\n return false;\n }\n\n #readsWaitingTable(node: Node): boolean {\n for (const reference of node.structuredReferences()) {\n const table = this.workbook.tables.get(ignoreCaseKey(reference.table));\n if (table !== undefined && table.data === undefined) return true;\n }\n return false;\n }\n\n #registerTableReaders(formulaCell: CellAddress, formula: Node): void {\n for (const table of tablesRead(formula)) {\n let set = this.#tableReaders.get(table);\n if (set === undefined) {\n set = new Set();\n this.#tableReaders.set(table, set);\n }\n set.add(formulaCell.key);\n }\n }\n\n #unregisterTableReaders(formulaCell: CellAddress, formula: Node): void {\n for (const table of tablesRead(formula)) {\n const set = this.#tableReaders.get(table);\n if (set?.delete(formulaCell.key) === true && set.size === 0) this.#tableReaders.delete(table);\n }\n }\n\n // ---- The name (Sheet.Name.cs) ----\n\n /**\n * The Sheet's name (ADR-0046). A Reference qualified with it (`Sheet1!A1`, matched without regard to case) names\n * this Sheet's cells.\n */\n get name(): string {\n return this.#name;\n }\n\n /** Gives the Sheet a new name; the Workbook checks it and rewrites the References that name the Sheet. @internal */\n setName(name: string): void {\n this.#name = name;\n }\n\n /**\n * Why `name` is not a name a Sheet can have, as Excel decides one \u2014 1 to 31 characters, none of `: \\ / ? * [ ]`,\n * not beginning or ending with `'`, and not `History` \u2014 or `undefined` when it is one.\n */\n static whyNotAName(name: string): string | undefined {\n if (name.length === 0) return \"A Sheet's name cannot be empty.\";\n if (name.length > Sheet.maximumNameLength) return `A Sheet's name is at most ${String(Sheet.maximumNameLength)} characters.`;\n if (/[:\\\\/?*[\\]]/u.test(name)) return \"A Sheet's name cannot contain any of : \\\\ / ? * [ ].\";\n if (name.startsWith(\"'\") || name.endsWith(\"'\")) return \"A Sheet's name cannot begin or end with an apostrophe.\";\n if (equalsIgnoreCase(name, 'History')) return \"'History' is a name Excel reserves.\";\n return undefined;\n }\n\n /** Whether `name` is a name a Sheet can have (`whyNotAName`). */\n static isValidName(name: string): boolean {\n return Sheet.whyNotAName(name) === undefined;\n }\n\n /** `name`, checked: throws a RangeError for a name a Sheet cannot have. @internal */\n static checkName(name: string): string {\n const reason = Sheet.whyNotAName(name);\n if (reason !== undefined) throw new RangeError(reason);\n return name;\n }\n\n /** Renames the Sheet (ADR-0046) through its Workbook. @internal */\n rename(name: string): SheetChange {\n return this.applyRename(name).change;\n }\n\n /** Whether `qualifier`, a Reference's Sheet name, names this Sheet: no qualifier, or this Sheet's name without regard to case. @internal */\n isThisSheet(qualifier: string | undefined): boolean {\n return Sheet.names(qualifier, this.#name);\n }\n\n /** Whether `qualifier` names the Sheet called `name`: no qualifier, or that name without regard to case. @internal */\n static names(qualifier: string | undefined, name: string): boolean {\n return qualifier === undefined || equalsIgnoreCase(qualifier, name);\n }\n\n /** Whether a Reference names this Sheet's cells alone: a 3D Reference never does (ADR-0331 \u00A77). @internal */\n isLocal(reference: Reference): boolean {\n return !reference.isThreeD && this.isThisSheet(reference.sheetName);\n }\n\n /** A typed Formula with every qualifier that names this Sheet written in the Sheet's own name (TEXT-083). The same instance when nothing changes. @internal */\n inOwnName(entry: Entry): Entry {\n if (entry.parsed === undefined || entry.formula?.includes('!') !== true) return entry;\n const other = (qualifier: string): boolean => this.isThisSheet(qualifier) && qualifier !== this.#name;\n return Entry.rewrite(entry,\n r => r.with({\n sheetName: r.sheetName !== undefined && other(r.sheetName) ? this.#name : r.sheetName,\n lastSheetName: r.lastSheetName !== undefined && other(r.lastSheetName) ? this.#name : r.lastSheetName,\n }),\n q => (other(q) ? this.#name : q));\n }\n\n /** A typed Formula with every structured reference to a declared Linked Table written in the declared case (ticket 180). The same instance when nothing changes. @internal */\n inDeclaredCase(entry: Entry): Entry {\n const formula = entry.formula;\n if (entry.parsed === undefined || formula?.includes('[') !== true) return entry;\n const rewritten = rewriteStructuredReferences(formula, (table, column) => {\n const declared = this.workbook.tables.get(ignoreCaseKey(table));\n const index = declared?.columnIndex.get(ignoreCaseKey(column));\n return declared === undefined || index === undefined ? undefined : { table: declared.name, column: defined(declared.columns[index], 'a column') };\n });\n return rewritten === formula ? entry : Entry.fromFormula(rewritten);\n }\n\n /** Renames the Sheet through its Workbook, which rewrites every Sheet's References to it (ADR-0331). @internal */\n applyRename(name: string): SheetRename {\n Sheet.checkName(name);\n return this.workbook.renameSheet(this, name);\n }\n\n /** Undoes a rename. @internal */\n undoRename(rename: SheetRename): SheetChange {\n return this.workbook.undoRename(this, rename);\n }\n\n /** Every Formula cell and its Entry. @internal */\n formulaEntries(): { address: CellAddress; entry: Entry }[] {\n const list: { address: CellAddress; entry: Entry }[] = [];\n for (const cell of this.#cells.values()) {\n if (cell.entry?.parsed !== undefined) list.push({ address: cell.address, entry: cell.entry });\n }\n return list;\n }\n\n /** The Formula cells with a qualified Reference. @internal */\n qualifiedFormulas(): CellAddress[] {\n const list: CellAddress[] = [];\n for (const cell of this.#cells.values()) {\n const parsed = cell.entry?.parsed;\n if (parsed !== undefined && [...parsed.references()].some(r => r.sheetName !== undefined)) list.push(cell.address);\n }\n return list;\n }\n\n /** Puts an Entry in a cell without recalculating or registering it. @internal */\n replaceEntry(address: CellAddress, entry: Entry): void {\n this.#cellFor(address).entry = entry;\n }\n\n /** Forgets every Reference this Sheet's Formulas make to another Sheet, on the Sheets they name. @internal */\n unregisterAllRemote(): void {\n for (const formulaCell of this.#remoteReferences.keys()) this.#unregisterRemote(CellAddress.fromKey(formulaCell));\n }\n\n // ---- The format a Formula gives on entry (Sheet.FormulaFormat.cs) ----\n\n /**\n * The format a Formula gives a General cell when it is entered, as Excel's does (ADR-0047), or `undefined` for\n * none: the smallest rule consistent with every case the corpus has observed Excel to answer.\n */\n #formatOnEntry(formula: Node): NumberFormat | undefined {\n const operand = (node: Node): NumberFormat | undefined => {\n switch (node.kind) {\n case 'reference': {\n // A 3D Reference gives none (ADR-0331 \u00A77).\n if (node.reference.isThreeD) return undefined;\n const owner = this.sheetNamed(node.reference.sheetName);\n if (owner === undefined) return undefined;\n const given = owner.getNumberFormat(new CellAddress(node.reference.row1, node.reference.column1));\n return given.showsNumbersAsGeneral ? undefined : given;\n }\n case 'parentheses':\n return operand(node.inner);\n case 'unary':\n return operand(node.operand);\n case 'binary': {\n const spine = node.spine;\n let left = operand(node.leftmost);\n for (const b of spine) left = binary(b.operator, b.left, b.right, left, operand(b.right));\n return left;\n }\n case 'function':\n if (node.name === 'DATE' || node.name === 'TODAY') return NumberFormat.shortDate;\n if (node.name === 'NOW') return NumberFormat.shortDateTime;\n for (const argument of node.arguments) {\n const format = operand(argument);\n if (format !== undefined) return format;\n }\n return undefined;\n case 'boolean':\n case 'error':\n case 'intersection':\n case 'let':\n case 'missing':\n case 'name':\n case 'number':\n case 'percent':\n case 'structuredReference':\n case 'text':\n return undefined;\n default:\n return unreachable(node);\n }\n };\n return simple(formula) ? operand(formula) : undefined;\n }\n\n // ---- Column widths (Sheet.Width.cs) ----\n\n /** The width recorded on the column, and its kind, or `undefined` when none is (ADR-0046). Throws for a column outside `A` to `XFD`. */\n getColumnWidth(column: number): SheetColumnWidth | undefined {\n return this.#columnWidths.get(checkColumn(column));\n }\n\n /** Sets the width of every column `columns` spans, as a width the user set; `undefined` puts them back at the default width (ADR-0046). @internal */\n setColumnWidth(columns: CellRange, width: number | undefined): SheetChange {\n const checked = Sheet.checkColumnWidth(width);\n return this.applyColumnWidth(columns, checked === undefined ? undefined : new SheetColumnWidth(checked, 'setByUser')).change;\n }\n\n /** Sets the width of every column `columns` spans, as a width an entry widened them to (ADR-0046, 2026-09-28). @internal */\n setAutomaticColumnWidth(columns: CellRange, width: number): SheetChange {\n return this.applyColumnWidth(columns, new SheetColumnWidth(defined(Sheet.checkColumnWidth(width), 'a width'), 'widenedByEntry')).change;\n }\n\n /** `width`, checked: more than 0 and at most `maxColumnWidth`, or `undefined`. @internal */\n static checkColumnWidth(width: number | undefined): number | undefined {\n if (width === undefined || (width > 0 && width <= Sheet.maxColumnWidth)) return width;\n throw new RangeError(`A column's width is more than 0 and at most ${String(Sheet.maxColumnWidth)} characters; a hidden column (width 0) is not supported.`);\n }\n\n /** A width set on columns, and the widths before it for undoing it. @internal */\n applyColumnWidth(columns: CellRange, width: SheetColumnWidth | undefined): { change: SheetChange; before: Map<number, SheetColumnWidth> } {\n const before = new Map(this.#columnWidths);\n for (let column = columns.first.column; column <= columns.last.column; column++) {\n if (width === undefined) this.#columnWidths.delete(column);\n else this.#columnWidths.set(column, width);\n }\n return { change: new SheetChange([], [], [], this.#widthsChangedSince(before)), before };\n }\n\n /** Puts every column's width back to `widths`, and says which columns that changed. @internal */\n restoreColumnWidths(widths: ReadonlyMap<number, SheetColumnWidth>): SheetChange {\n const now = this.#columnWidths;\n this.#columnWidths = new Map(widths);\n const columns = this.#widthsChangedSince(now);\n return columns.length === 0 ? SheetChange.none : new SheetChange([], [], [], columns);\n }\n\n /** A copy of the widths recorded now. @internal */\n columnWidthsNow(): Map<number, SheetColumnWidth> {\n return new Map(this.#columnWidths);\n }\n\n /** The columns whose width or its kind differs between `before` and now, ascending. */\n #widthsChangedSince(before: ReadonlyMap<number, SheetColumnWidth>): number[] {\n return distinctNumbers([...before.keys(), ...this.#columnWidths.keys()].filter(c => {\n const was = before.get(c);\n const now = this.#columnWidths.get(c);\n return !(was !== undefined && now !== undefined && was.equals(now));\n }));\n }\n\n /** The widths after an insertion or deletion of columns (ADR-0046; the seventeenth Windows run, b10). */\n #shiftColumnWidths(edit: StructuralEdit, formatInserted: boolean): void {\n if (edit.axis !== 'columns') return;\n const shifted = new Map<number, SheetColumnWidth>();\n for (const [column, width] of this.#columnWidths) {\n const moved = edit.move(new CellAddress(0, column));\n if (moved !== undefined) shifted.set(moved.column, width);\n }\n const left = edit.start > 0 ? this.#columnWidths.get(edit.start - 1) : undefined;\n if (edit.isInsert && formatInserted && left !== undefined) {\n const taken = new SheetColumnWidth(left.width, 'setByUser');\n for (let i = 0; i < edit.count; i++) shifted.set(edit.start + i, taken);\n }\n this.#columnWidths = shifted;\n }\n\n /** The widths as a Sheet Document records them: adjacent columns of one width and one kind are one run. */\n #widthRuns(): SheetDocumentColumnWidth[] {\n const list: SheetDocumentColumnWidth[] = [];\n for (const column of [...this.#columnWidths.keys()].toSorted((a, b) => a - b)) {\n const width = defined(this.#columnWidths.get(column), 'a width');\n const last = list.at(-1);\n if (last !== undefined && last.last === column - 1 && last.width === width.width && last.kind === width.kind) {\n list[list.length - 1] = new SheetDocumentColumnWidth(last.first, column, last.width, last.kind);\n } else {\n list.push(new SheetDocumentColumnWidth(column, column, width.width, width.kind));\n }\n }\n return list;\n }\n\n /**\n * The width, in characters, that the number typed into this cell needs, for widening a column whose width the\n * user has not set when the number is typed, as Excel does (ADR-0047); `undefined` when what the cell holds never\n * widens a column.\n */\n getWidthOnEntry(address: CellAddress): number | undefined {\n const cell = this.#cells.get(address.key);\n const entry = cell?.entry;\n if (cell === undefined || entry === undefined) return undefined;\n // A Formula's number widens the column as a typed one does (WD-007).\n const shown = entry.isFormula ? cell.value : entry.constant;\n if (shown?.kind !== 'number') return undefined;\n const number = shown.number;\n const format = this.getNumberFormat(address);\n if (!format.showsNumbersAsGeneral) {\n const { text, cannotShow } = format.format(shown, this.culture);\n return cannotShow ? undefined : text.length;\n }\n const widest = generalLimit + 1;\n if (isGeneralScientific(number, widest) === true) return defined(generalFitted(number, widest, this.culture), 'the scientific form').length;\n for (let characters = 1; characters <= widest; characters++) {\n if (isGeneralScientific(number, characters) === false) return characters;\n }\n return undefined;\n }\n\n /** The cells in `range` that hold an Entry, in no particular order (ADR-0071, case 17). */\n entryAddressesIn(range: CellRange): CellAddress[] {\n return [...this.cellsIn(new Area(range.first.row, range.first.column, range.last.row, range.last.column))]\n .filter(address => this.#cells.get(address.key)?.entry !== undefined);\n }\n\n // ---- Insertion and deletion (Sheet.Structure.cs) ----\n\n /** Inserts `count` rows at `row` (ADR-0046/0047). @internal */\n insertRows(row: number, count = 1): SheetChange {\n return this.restructure(new StructuralEdit('rows', row, count, true)).change;\n }\n\n /** Deletes `count` rows from `row` (ADR-0047). @internal */\n deleteRows(row: number, count = 1): SheetChange {\n return this.restructure(new StructuralEdit('rows', row, count, false)).change;\n }\n\n /** Inserts columns, as `insertRows` does rows (ADR-0046, ADR-0047, ADR-0071). @internal */\n insertColumns(column: number, count = 1): SheetChange {\n return this.restructure(new StructuralEdit('columns', column, count, true)).change;\n }\n\n /** Deletes columns, as `deleteRows` does rows (ADR-0046). @internal */\n deleteColumns(column: number, count = 1): SheetChange {\n return this.restructure(new StructuralEdit('columns', column, count, false)).change;\n }\n\n /** Whether `edit` would be refused, and why; nothing changes either way. @internal */\n checkStructural(edit: StructuralEdit): SheetRefusal | undefined {\n edit.validate();\n if (!edit.isInsert) return undefined;\n for (const cell of this.#cells.values()) {\n // Only an Entry stops an insertion, as in Excel.\n if (cell.entry === undefined) continue;\n const moved = edit.move(cell.address);\n // Pushed past Excel's edge, or past the Workbook's size (ADR-0460).\n if (moved === undefined || !this.workbook.size.contains(moved)) {\n return new SheetRefusal('entriesWouldLeaveSheet', `${capitalise(edit.describe())} would push ${cell.address.toString()}, which holds an Entry, off the Sheet.`);\n }\n }\n return undefined;\n }\n\n /** Gives each cell of the inserted rows (columns) the Cell Format of the cell before the insertion, all but its Borders (ADR-0046, ADR-0071). */\n #formatInserted(edit: StructuralEdit, moved: readonly Cell[]): void {\n const rows = edit.axis === 'rows';\n for (const source of moved) {\n if ((rows ? source.address.row : source.address.column) !== edit.start - 1) continue;\n for (let i = 0; i < edit.count; i++) {\n const at = rows ? new CellAddress(edit.start + i, source.address.column) : new CellAddress(source.address.row, edit.start + i);\n const cell = new Cell(at);\n cell.takeFormatOf(source);\n cell.borders = undefined;\n if (cell.isFormatted) this.#cells.set(at.key, cell);\n }\n }\n }\n\n /** An insertion or deletion. `formatInserted`: whether inserted rows or columns take the Cell Format of the one before them (ADR-0046). @internal */\n restructure(edit: StructuralEdit, formatInserted = true): StructuralOutcome {\n const refusal = this.checkStructural(edit);\n if (refusal !== undefined) throw new SheetRefusedError(refusal);\n this.countChange();\n\n const before = this.snapshot();\n const shownBefore = this.#shownSnapshot();\n const rowsBefore = new Map(this.#rowFormats);\n const columnsBefore = new Map(this.#columnFormats);\n const widthsBefore = this.columnWidthsNow();\n const dropped: AddressedState[] = [];\n const rewritten: { address: CellAddress; entry: Entry }[] = [];\n const moved: Cell[] = [];\n const dirty = new Set<number>();\n for (const cell of this.#cells.values()) {\n // A spilled Value is its Anchor's to lay out again from wherever the Anchor moves (ADR-0125).\n if (cell.entry === undefined && cell.spilledFrom !== undefined && !cell.isFormatted) continue;\n const to = edit.move(cell.address);\n if (to === undefined) {\n dropped.push({ address: cell.address, state: defined(before.get(cell.address.key), 'the cell\\'s state') });\n continue;\n }\n let entry = cell.entry;\n const parsed = entry?.parsed;\n // ROW() and COLUMN() read their own cell's place, which a move changes without a word of the Formula's.\n if (parsed !== undefined && !to.equals(cell.address) && readsOwnPlace(parsed)) dirty.add(to.key);\n if (entry !== undefined && parsed !== undefined) {\n const mapped = Entry.rewrite(entry, r => edit.map(r, this));\n if (mapped !== entry) {\n rewritten.push({ address: cell.address, entry });\n dirty.add(to.key);\n } else if ([...parsed.references()].some(r => edit.reaches(r, this) || this.workbook.spans(r, this))) {\n // A:A kept its text, but what it covers moved underneath it; so did what a 3D Reference spanning this Sheet reads here (ADR-0331 \u00A77).\n dirty.add(to.key);\n }\n entry = mapped;\n }\n const movedCell = new Cell(to);\n movedCell.entry = entry;\n movedCell.value = entry === undefined ? undefined : cell.value;\n if (cell.array !== undefined) dirty.add(to.key);\n movedCell.takeFormatOf(cell);\n moved.push(movedCell);\n }\n\n const elsewhere = this.#rewriteElsewhere(edit);\n const elsewhereBefore = new Map<Sheet, Map<number, CellState>>();\n for (const r of elsewhere.rewritten) if (!elsewhereBefore.has(r.sheet)) elsewhereBefore.set(r.sheet, r.sheet.snapshot());\n\n this.#cells.clear();\n for (const cell of moved) this.#cells.set(cell.address.key, cell);\n if (edit.isInsert && formatInserted && edit.start > 0) this.#formatInserted(edit, moved);\n this.#shiftAxisFormats(edit, formatInserted);\n this.#shiftColumnWidths(edit, formatInserted);\n this.rebuildDependencies();\n for (const r of elsewhere.rewritten) r.sheet.#reregister(r.address, r.entry);\n const changed = new SheetCellSet([...dirty].map(key => new SheetCell(this, CellAddress.fromKey(key))));\n changed.addAll(elsewhere.dirty);\n // A volatile Formula is recalculated whatever the change (ADR-0124).\n const recalculated = changed.size === 0 && !this.workbook.sheets.some(s => s.hasVolatileFormulas) ? [] : this.#recalculate(changed, new Set()).recalculated;\n // The Formulas rewritten on another Sheet changed there, whatever their Values did.\n for (const [other, snapshot] of elsewhereBefore) this.workbook.collect(other, other.diff(snapshot, []));\n // Rows and columns moved: two cells' sides meet on a new edge, from cells that may hold nothing.\n const change = SheetChange.merge([this.diff(before, recalculated, shownBefore), new SheetChange([], [], [], this.#widthsChangedSince(widthsBefore))])\n .reformattingUnnamedRows();\n return {\n change, dropped, rewritten, rowsBefore, columnsBefore, widthsBefore,\n rewrittenElsewhere: elsewhere.rewritten.map(r => ({ sheet: r.sheet, address: r.address, entry: r.before })),\n };\n }\n\n /** What an insertion or deletion on this Sheet does to the Formulas of the Workbook's other Sheets (ADR-0331, ADR-0046). Nothing changes yet. */\n #rewriteElsewhere(edit: StructuralEdit): { rewritten: { sheet: Sheet; address: CellAddress; entry: Entry; before: Entry }[]; dirty: SheetCellSet } {\n const rewritten: { sheet: Sheet; address: CellAddress; entry: Entry; before: Entry }[] = [];\n const dirty = new SheetCellSet();\n const mine = (r: Reference): boolean => r.sheetName !== undefined && this.isThisSheet(r.sheetName);\n for (const other of this.workbook.sheets) {\n if (other === this) continue;\n for (const { address, entry } of other.formulaEntries()) {\n if (entry.formula?.includes('!') !== true) continue;\n const mapped = Entry.rewrite(entry, r => (mine(r) ? edit.map(r, this) : r));\n if (mapped !== entry) {\n rewritten.push({ sheet: other, address, entry: mapped, before: entry });\n dirty.add(new SheetCell(other, address));\n } else if ([...defined(entry.parsed, 'a Formula').references()].some(r => (mine(r) && edit.reaches(r, this)) || this.workbook.spans(r, this))) {\n dirty.add(new SheetCell(other, address));\n }\n }\n }\n return { rewritten, dirty };\n }\n\n /** Puts a rewritten Formula in a cell of this Sheet, its References registered again; nothing is recalculated. */\n #reregister(address: CellAddress, entry: Entry): void {\n const cell = defined(this.#cells.get(address.key), 'the rewritten cell');\n const old = cell.entry?.parsed;\n if (old !== undefined) this.#unregister(address, old);\n cell.entry = entry;\n if (entry.parsed !== undefined) this.#register(address, entry.parsed);\n }\n\n /** Puts back, on the Workbook's other Sheets, the Formulas an insertion or deletion on this Sheet rewrote, and recalculates them: what it changed here. */\n #putBackElsewhere(rewritten: readonly RewrittenEntry[]): SheetChange {\n if (rewritten.length === 0) return SheetChange.none;\n const before = new Map<Sheet, Map<number, CellState>>();\n for (const r of rewritten) if (!before.has(r.sheet)) before.set(r.sheet, r.sheet.snapshot());\n for (const r of rewritten) r.sheet.#reregister(r.address, r.entry);\n const change = this.#recalculate(new SheetCellSet(rewritten.map(r => new SheetCell(r.sheet, r.address))), new Set());\n for (const [other, snapshot] of before) this.workbook.collect(other, other.diff(snapshot, []));\n return change;\n }\n\n // ---- Steps (Sheet.Steps.cs) ----\n\n /** Does `edit` as one operation and returns the step that undoes it (ADR-0048). @internal */\n do(edit: SheetEdit): SheetStep {\n const refusal = this.check(edit);\n if (refusal !== undefined) throw new SheetRefusedError(refusal);\n // However many steps the edit takes, it is one change (ADR-0180).\n return this.asOneChange(() => edit.apply(this));\n }\n\n /** Whether `do` would refuse `edit` as the Sheet stands, and why. @internal */\n check(edit: SheetEdit): SheetRefusal | undefined {\n // What the edit changes lies inside the Workbook's size, whatever it is (ADR-0460).\n return edit.check(this) ?? this.pastSize(edit.ranges);\n }\n\n /** What each of `addresses` records: Entry and Cell Format, never a Value. @internal */\n record(addresses: Iterable<CellAddress>): AddressedState[] {\n return [...addresses].map(address => ({ address, state: this.#stateAt(address).recorded }));\n }\n\n /** Puts cells back to what they recorded, as one change with one recalculation. A changed top or bottom side names the row across it too. @internal */\n restore(states: Iterable<AddressedState>): SheetChange {\n const list = [...states];\n const rows = new Set<number>();\n for (const { address, state } of list) {\n let cell = this.#cells.get(address.key);\n const existing = cell !== undefined;\n cell ??= new Cell(address);\n if (state.sameFormat(cell)) continue;\n if (!samePart(cell.borders, state.borders)) {\n const inherited = this.#inherited(address).borders;\n for (const row of rowsAcross(address, cell.borders ?? inherited, state.borders ?? inherited)) rows.add(row);\n }\n cell.numberFormat = state.numberFormat;\n cell.alignment = state.alignment;\n cell.font = state.font;\n cell.fill = state.fill;\n cell.borders = state.borders;\n rows.add(address.row);\n if (!existing) this.#cells.set(address.key, cell);\n else if (cell.isEmpty && cell.value === undefined) this.#cells.delete(address.key);\n }\n const change = this.setEntries(list.map(p => [p.address, p.state.entry] as const));\n // A cell given formatting only for the moment of the swap, and left with nothing, goes.\n for (const { address } of list) {\n const cell = this.#cells.get(address.key);\n if (cell?.isEmpty === true && cell.value === undefined) this.#cells.delete(address.key);\n }\n if (rows.size === 0) return change;\n for (const row of change.rows) rows.add(row);\n return new SheetChange(change.valueChanges, change.recalculated, distinctNumbers(rows));\n }\n\n /** Undoes a structural edit: the inverse edit, then the rewritten Formulas and the dropped cells put back. @internal */\n unrestructure(edit: StructuralEdit, outcome: StructuralOutcome): SheetChange {\n const before = this.snapshot();\n const shownBefore = this.#shownSnapshot();\n const widthsBefore = this.columnWidthsNow();\n const recalculated = [...this.restructure(edit.inverse, false).change.recalculated];\n this.#rowFormats = new Map(outcome.rowsBefore);\n this.#columnFormats = new Map(outcome.columnsBefore);\n this.#columnWidths = new Map(outcome.widthsBefore);\n const states: AddressedState[] = [];\n for (const { address, entry } of outcome.rewritten) states.push({ address, state: this.#stateAt(address).recorded.withEntry(entry) });\n for (const d of outcome.dropped) states.push({ address: d.address, state: d.state.recorded });\n recalculated.push(...this.restore(states).recalculated);\n recalculated.push(...this.#putBackElsewhere(outcome.rewrittenElsewhere).recalculated);\n return SheetChange.merge([this.diff(before, recalculated, shownBefore), new SheetChange([], [], [], this.#widthsChangedSince(widthsBefore))])\n .reformattingUnnamedRows();\n }\n\n // ---- The clipboard (Sheet.Clipboard.cs) ----\n\n /** Copies a rectangle (ADR-0048): its Entries for a paste inside ExSheet, and its Values for anywhere else. A rectangle holding a `#GETTING_DATA` Value is refused whole (ADR-0049). */\n copy(range: CellRange): SheetCopy {\n const area = new Area(range.first.row, range.first.column, range.last.row, range.last.column);\n let waiting: CellAddress | undefined;\n for (const address of this.cellsIn(area)) {\n const value = this.getValue(address);\n if (value?.isError === true && value.error === '#GETTING_DATA' && (waiting === undefined || address.compareTo(waiting) < 0)) waiting = address;\n }\n if (waiting !== undefined) {\n return new SheetCopy(new SheetRefusal('waitingForData',\n `${waiting.toString()} is waiting for a Linked Table's data (#GETTING_DATA); a copy would carry a wait that means nothing where it lands.`), undefined, undefined, undefined);\n }\n const states: CellState[] = [];\n let text = '';\n let html = `<table ${excelNamespace}>`;\n for (let row = range.first.row; row <= range.last.row; row++) {\n html += '<tr>';\n for (let column = range.first.column; column <= range.last.column; column++) {\n const address = new CellAddress(row, column);\n states.push(this.#spilledState(address, range) ?? this.#carriedState(address));\n if (column > range.first.column) text += '\\t';\n const value = this.getValue(address);\n const raw = value?.toString() ?? ''; // oxlint-disable-line ex-grid/no-stand-in-default -- a blank cell copies as no text, as Excel's does (ADR-0005)\n const display = this.getDisplay(address);\n // What a cell that cannot be shown holds is its Value, never the #### it paints (ADR-0016).\n text += quoteForTsv(display.cannotShow ? raw : display.text);\n html += cellHtml(value, raw, this.getNumberFormat(address));\n }\n text += '\\r\\n';\n html += '</tr>';\n }\n html += '</table>';\n return new SheetCopy(undefined, new SheetBlock(range, states), text, html);\n }\n\n /** A spilled cell as a copy carries it (ADR-0125); `undefined` for a cell no array spills into. */\n #spilledState(address: CellAddress, range: CellRange): CellState | undefined {\n const anchor = this.spilledFrom(address);\n if (anchor === undefined) return undefined;\n const carried = this.#carriedState(address);\n const inside = range.contains(anchor);\n const value = this.getValue(address);\n if (inside || value === undefined || (value.isError && (value.error === '#GETTING_DATA' || value.error === '#CIRC!')) || value.isRefused) return carried;\n return carried.withEntry(Entry.fromValue(value));\n }\n\n /** The states a block pasted at `origin` writes; a blank cell of the block clears the cell it lands on. @internal */\n static *place(block: SheetBlock, origin: CellAddress): Generator<AddressedState> {\n const rows = origin.row - block.source.first.row;\n const columns = origin.column - block.source.first.column;\n for (let r = 0; r < block.rowCount; r++) {\n for (let c = 0; c < block.columnCount; c++) {\n const state = block.at(r, c);\n yield { address: new CellAddress(origin.row + r, origin.column + c), state: state.withEntry(state.entry?.movedBy(rows, columns)) };\n }\n }\n }\n\n /** A block of `rows` \u00D7 `columns` at `origin` that would run past the Sheet's edge: Excel's, or the Workbook's size (ADR-0460). @internal */\n offSheet(origin: CellAddress, rows: number, columns: number): SheetRefusal | undefined {\n const size = this.workbook.size;\n if (size.holds(origin, rows, columns)) return undefined;\n return new SheetRefusal('blockWouldLeaveSheet', `A block of ${String(rows)} \u00D7 ${String(columns)} at ${origin.toString()} would run past the Sheet's edge (${size.lastCell.toString()}).`);\n }\n\n /** The first of `ranges` that runs past the Workbook's size, refused by name (ADR-0460). @internal */\n pastSize(ranges: Iterable<CellRange>): SheetRefusal | undefined {\n const size = this.workbook.size;\n for (const range of ranges) {\n // Whole columns or whole rows are Excel's lines, and lie inside when their columns or rows do.\n if (size.fit(range) === undefined) {\n return new SheetRefusal('blockWouldLeaveSheet', `${range.toString()} runs past the Sheet's edge (${size.lastCell.toString()}).`);\n }\n }\n return undefined;\n }\n\n // ---- The fill (Sheet.Fill.cs) ----\n\n /** What a Fill Intent writes, as Excel fills (ADR-0050, item 5), or why it is refused. `copyOnly`: Excel's fill keys. @internal */\n planFill(source: CellRange, target: CellRange, direction: FillDirection, copyOnly = false): FillPlan {\n const vertical = direction === 'down' || direction === 'up';\n const forward = direction === 'down' || direction === 'right';\n const states: AddressedState[] = [];\n let fillTarget = target;\n // The target may be given as the extension alone, or as the whole extended range.\n if (fillTarget.contains(source.first) && fillTarget.contains(source.last) && !fillTarget.equals(source)) {\n fillTarget = forward\n ? new CellRange(vertical ? new CellAddress(source.last.row + 1, fillTarget.first.column) : new CellAddress(fillTarget.first.row, source.last.column + 1), fillTarget.last)\n : new CellRange(fillTarget.first, vertical ? new CellAddress(source.first.row - 1, fillTarget.last.column) : new CellAddress(fillTarget.last.row, source.first.column - 1));\n }\n // A fill dragged as far as the edge stops there; one asked past it is refused, never cut (ADR-0460).\n const pastEdge = this.pastSize([fillTarget]);\n if (pastEdge !== undefined) return { refusal: pastEdge, states, levels: undefined };\n const adjacent = vertical\n ? fillTarget.first.column === source.first.column && fillTarget.last.column === source.last.column\n && (forward ? fillTarget.first.row === source.last.row + 1 : fillTarget.last.row === source.first.row - 1)\n : fillTarget.first.row === source.first.row && fillTarget.last.row === source.last.row\n && (forward ? fillTarget.first.column === source.last.column + 1 : fillTarget.last.column === source.first.column - 1);\n if (!adjacent) {\n return {\n refusal: new SheetRefusal('fillShapeNotSupported', `A fill ${direction} from ${source.toString()} extends it along one axis; ${fillTarget.toString()} does not.`),\n states, levels: undefined,\n };\n }\n\n const length = vertical ? source.rowCount : source.columnCount;\n const count = vertical ? fillTarget.rowCount : fillTarget.columnCount;\n // Lines that run the whole axis: a fill down from whole rows, or across from whole columns.\n const wholeAxis = vertical ? source.isWholeRows : source.isWholeColumns;\n const single = source.first.equals(source.last);\n const held: Cell[] = [];\n for (const cell of this.#cells.values()) {\n if (cell.entry !== undefined && source.contains(cell.address)) {\n held.push(cell);\n if (held.length === 2) break;\n }\n }\n // The source's one Entry, a number: it goes on as a series from a source of several cells.\n const loneNumber = !single && held.length === 1 && held[0]?.entry?.constant?.kind === 'number';\n // Every cell of a source of several cells holds a number, so a line of one cell copies its own.\n let allNumbers = !single && !wholeAxis;\n for (let r = 0; r < source.rowCount && allNumbers; r++) {\n for (let c = 0; c < source.columnCount && allNumbers; c++) {\n allNumbers = this.#stateAt(new CellAddress(source.first.row + r, source.first.column + c)).recorded.entry?.constant?.kind === 'number';\n }\n }\n for (const line of this.#linesToFill(source, fillTarget, vertical, wholeAxis)) {\n const sourceAt = (i: number): CellAddress => vertical\n ? new CellAddress(source.first.row + i, source.first.column + line)\n : new CellAddress(source.first.row + line, source.first.column + i);\n // Position along the axis relative to the source's first cell: 0..length-1 is the source.\n const cells = Array.from({ length }, (_, i) => this.#carriedState(sourceAt(i)));\n const { rule, refusal } = this.#fillRule(cells, sourceAt, copyOnly, wholeAxis, single, loneNumber, allNumbers);\n if (refusal !== undefined) return { refusal, states: [], levels: undefined };\n for (let k = 0; k < count; k++) {\n const x = forward ? length + k : -1 - k;\n const at = vertical\n ? new CellAddress(source.first.row + x, source.first.column + line)\n : new CellAddress(source.first.row + line, source.first.column + x);\n const i = ((x % length) + length) % length;\n states.push({ address: at, state: defined(cells[i], 'a source cell').withEntry(rule(x, i, at)) });\n }\n }\n return { refusal: undefined, states, levels: wholeAxis ? this.#levelsOf(source, vertical, forward, length, count) : undefined };\n }\n\n /** The level each column (row) of a fill from whole columns (whole rows) takes: the one recorded on the source column (row) it repeats. */\n #levelsOf(source: CellRange, vertical: boolean, forward: boolean, length: number, count: number): FillLevels {\n const along = vertical ? this.#rowFormats : this.#columnFormats;\n const first = vertical ? source.first.row : source.first.column;\n const levels: { index: number; level: AxisFormat }[] = [];\n for (let k = 0; k < count; k++) {\n const x = forward ? length + k : -1 - k;\n const i = ((x % length) + length) % length;\n levels.push({ index: first + x, level: along.get(first + i) ?? AxisFormat.empty });\n }\n return { columns: !vertical, levels };\n }\n\n /** Does a fill planned with levels: the target columns' (rows') formats first, then each cell's state settled against them, as one step. @internal */\n doFillWithLevels(plan: FillPlan): SheetStep {\n const levels = defined(plan.levels, 'the fill\\'s levels');\n const addresses = distinctAddresses(plan.states.map(p => p.address));\n const before = this.record(addresses);\n const rowsBefore = new Map(this.#rowFormats);\n const columnsBefore = new Map(this.#columnFormats);\n const rowsAfter = new Map(this.#rowFormats);\n const columnsAfter = new Map(this.#columnFormats);\n for (const { index, level } of levels.levels) setAxis(levels.columns ? columnsAfter : rowsAfter, index, level);\n const change = this.#putLevelsAndCells(rowsAfter, columnsAfter, plan.states, true);\n const after = this.record(addresses);\n return new SheetStep(this, change,\n s => s.#putLevelsAndCells(rowsBefore, columnsBefore, before, false),\n s => s.#putLevelsAndCells(rowsAfter, columnsAfter, after, false));\n }\n\n /** Puts the row and column levels as given, then the cells, each settled against those levels when `settle`, as one change. */\n #putLevelsAndCells(rows: ReadonlyMap<number, AxisFormat>, columns: ReadonlyMap<number, AxisFormat>, cells: Iterable<AddressedState>, settleCells: boolean): SheetChange {\n const rowsNow = this.#rowFormats;\n const columnsNow = this.#columnFormats;\n this.#rowFormats = new Map(rows);\n this.#columnFormats = new Map(columns);\n const affected = new Set(this.#rowsAffectedByAxes(rowsNow, columnsNow));\n const levels = this.#levelsDiffer(rowsNow, columnsNow);\n const change = this.restore(settleCells ? this.settle(cells) : cells);\n if (affected.size === 0 && !levels) return change;\n for (const row of change.rows) affected.add(row);\n return new SheetChange(change.valueChanges, change.recalculated, distinctNumbers(affected), [], levels);\n }\n\n /** The lines of a fill that can write anything, ascending, counted from the source's first. */\n #linesToFill(source: CellRange, target: CellRange, vertical: boolean, wholeAxis: boolean): number[] {\n const lines = vertical ? source.columnCount : source.rowCount;\n const firstLine = vertical ? source.first.column : source.first.row;\n const alongFirst = Math.min(vertical ? source.first.row : source.first.column, vertical ? target.first.row : target.first.column);\n const alongLast = Math.max(vertical ? source.last.row : source.last.column, vertical ? target.last.row : target.last.column);\n const along = vertical ? this.#rowFormats : this.#columnFormats;\n const across = vertical ? this.#columnFormats : this.#rowFormats;\n // A format on a row (a column) the fill runs along reaches every line, unless the fill writes it on the target's own rows (columns).\n if (!wholeAxis && [...along.keys()].some(i => i >= alongFirst && i <= alongLast)) return Array.from({ length: lines }, (_, i) => i);\n const filled = new Set<number>();\n if (!wholeAxis) {\n for (const i of across.keys()) if (i >= firstLine && i < firstLine + lines) filled.add(i - firstLine);\n }\n for (const cell of this.#cells.values()) {\n const lineAt = vertical ? cell.address.column : cell.address.row;\n const alongAt = vertical ? cell.address.row : cell.address.column;\n if (lineAt >= firstLine && lineAt < firstLine + lines && alongAt >= alongFirst && alongAt <= alongLast) filled.add(lineAt - firstLine);\n }\n return distinctNumbers(filled);\n }\n\n /** The rule for one line: given a position along the axis, the source cell it repeats and its address, the Entry written there. */\n #fillRule(cells: readonly CellState[], sourceAt: (i: number) => CellAddress, copyOnly: boolean, wholeAxis: boolean, single: boolean, loneNumber: boolean,\n allNumbers: boolean): { rule: (x: number, i: number, at: CellAddress) => Entry | undefined; refusal: SheetRefusal | undefined } {\n const copy = (_x: number, i: number, at: CellAddress): Entry | undefined => {\n const from = sourceAt(i);\n return defined(cells[i], 'a source cell').entry?.movedBy(at.row - from.row, at.column - from.column);\n };\n const refuse = (refusal: SheetRefusal): { rule: typeof copy; refusal: SheetRefusal } => ({ rule: copy, refusal });\n if (copyOnly) return { rule: copy, refusal: undefined };\n\n let numbers = 0;\n let dates = 0;\n for (let i = 0; i < cells.length; i++) {\n const cell = defined(cells[i], 'a source cell');\n const constant = cell.entry?.constant;\n if (constant === undefined) continue;\n if (constant.kind === 'number') {\n numbers++;\n const format = defined(cell.numberFormat, 'a carried Number Format');\n if (format.isDate) {\n if (!format.isDateOnly || cells.length > 1) {\n return refuse(fillRefusal(sourceAt(i), format.isDateOnly\n ? 'two or more dates, which Excel may step by month or year'\n : 'a time of day, which Excel steps by the hour'));\n }\n dates++;\n }\n } else if (constant.kind === 'text' && this.#continuesAsSeries(constant.text)) {\n return refuse(fillRefusal(sourceAt(i), `'${constant.text}', text Excel would continue as a series`));\n }\n }\n\n if (numbers === 0) return { rule: copy, refusal: undefined };\n const numberAt = (i: number): number => defined(defined(cells[i], 'a source cell').entry?.constant, 'a number').number;\n if (cells.length === 1) {\n const number = numberAt(0);\n if (dates === 1) return { rule: x => series(number + x), refusal: undefined };\n // A single number is copied from one cell's handle and goes on by one from a whole column's (R5), and from a\n // source of several cells that holds nothing else (run 18a, 4); among numbers in every cell it is copied.\n if (single || allNumbers) return { rule: copy, refusal: undefined };\n if (wholeAxis || loneNumber) return { rule: x => series(trendStep(number, 1, x)), refusal: undefined };\n return refuse(fillRefusal(sourceAt(0), 'a single number in a line of a source of several cells, which Excel was not read to copy or continue there'));\n }\n if (loneNumber && numbers === 1 && dates === 0) {\n // The source's one number and the blanks beside it in its line (run 18a, 5).\n const at = cells.findIndex(c => c.entry !== undefined);\n const number = numberAt(at);\n const length = cells.length;\n return { rule: (x, i) => (i === at ? series(trendStep(number, 1, Math.floor(x / length))) : undefined), refusal: undefined };\n }\n if (numbers !== cells.length) {\n return refuse(fillRefusal(sourceAt(cells.findIndex(c => c.entry?.constant?.kind === 'number')), 'numbers mixed with other cells, which Excel continues in ways ExSheet does not yet'));\n }\n\n // Excel's linear trend: the least-squares line through (0, y0) .. (n-1, yn-1).\n const ys = cells.map((_, i) => numberAt(i));\n const meanX = (ys.length - 1) / 2;\n const meanY = average(ys);\n let sxy = 0;\n let sxx = 0;\n for (let i = 0; i < ys.length; i++) {\n sxy += (i - meanX) * (defined(ys[i], 'a number') - meanY);\n sxx += (i - meanX) * (i - meanX);\n }\n const slope = sxy / sxx;\n // Excel stores a trend at 15 significant digits (verification/2026-09-27-windows-excel item 4).\n const step = trendRound(slope);\n const ahead = trendRound(meanY + slope * (ys.length - meanX));\n const behind = trendRound(meanY + slope * (-1 - meanX));\n return { rule: x => series(x >= 0 ? trendStep(ahead, step, x - ys.length) : trendStep(behind, -step, -1 - x)), refusal: undefined };\n }\n\n /** Text Excel's fill would not simply copy: text holding a digit, and the day and month names of its built-in lists, in English and in the Sheet's culture. */\n #continuesAsSeries(text: string): boolean {\n for (let i = 0; i < text.length; i++) if (isDigit(text.charCodeAt(i))) return true;\n // No list name holds half of a character (C#'s normalising one alone throws).\n if (/[\\uD800-\\uDFFF]/u.test(text)) return false;\n const key = listKey(trimWhiteSpace(text));\n this.#cultureListNames ??= cultureListNames(this.culture);\n return invariantListNames().has(key) || this.#cultureListNames.has(key);\n }\n}\n\n// ---- Helpers ----\n\nfunction stateOf(c: Cell): CellState {\n return new CellState(c.entry, c.value, c.numberFormat, c.alignment, c.font, c.fill, c.borders);\n}\n\nfunction settled(state: CellState, inherited: CellFormat): CellState {\n return state.withFormat({\n numberFormat: state.numberFormat !== undefined && state.numberFormat.equals(inherited.numberFormat) ? undefined : state.numberFormat,\n alignment: state.alignment !== undefined && state.alignment === inherited.alignment ? undefined : state.alignment,\n font: state.font !== undefined && state.font.equals(inherited.font) ? undefined : state.font,\n fill: state.fill !== undefined && state.fill.equals(inherited.fill) ? undefined : state.fill,\n borders: state.borders !== undefined && state.borders.equals(inherited.borders) ? undefined : state.borders,\n });\n}\n\nfunction resolveAlignment(alignment: HorizontalAlignment, kind: ValueKind | undefined): Exclude<HorizontalAlignment, 'general'> {\n if (alignment !== 'general') return alignment;\n switch (kind) {\n case 'number': return 'right';\n case 'boolean':\n case 'error':\n return 'center';\n case 'text':\n case undefined:\n return 'left';\n default: throw new Error(`Internal: ${String(kind)} is no kind of Value.`);\n }\n}\n\n/** Whether an Anchor whose spill was blocked computed an array of the same shape again: it is still blocked until the layout says otherwise. */\nfunction stillBlocked(anchor: Cell, array: ValueArray): boolean {\n return anchor.spillBlocked && anchor.array !== undefined && anchor.array.rows === array.rows && anchor.array.columns === array.columns;\n}\n\n/** The line shown on an edge two cells record a side of: the upper (left) cell's where it records one, else the lower (right) cell's. */\nfunction edge(upperOrLeft: BorderLine, lowerOrRight: BorderLine): BorderLine {\n return upperOrLeft.isNone ? lowerOrRight : upperOrLeft;\n}\n\nconst horizontalAlignments: readonly HorizontalAlignment[] = ['general', 'left', 'center', 'right'];\n\nfunction checkAlignment(alignment: HorizontalAlignment): HorizontalAlignment {\n if (!horizontalAlignments.includes(alignment)) throw new RangeError(`Not an alignment: ${alignment}.`);\n return alignment;\n}\n\nfunction checkRow(row: number): number {\n if (!Number.isInteger(row) || row < 0 || row >= rowCount) throw new RangeError(`A row is 0 to ${String(rowCount - 1)}.`);\n return row;\n}\n\nfunction checkColumn(column: number): number {\n if (!Number.isInteger(column) || column < 0 || column >= columnCount) throw new RangeError(`A column is 0 to ${String(columnCount - 1)}.`);\n return column;\n}\n\n/** The parts of one change as one outcome: the levels as they were before the first part, and each cell as it was before the first part that touched it. */\nfunction combined(parts: readonly CellFormatOutcome[]): CellFormatOutcome {\n const seen = new Set<number>();\n const first = defined(parts[0], 'the first part');\n return {\n change: SheetChange.merge(parts.map(p => p.change)),\n before: parts.flatMap(p => p.before).filter(b => {\n if (seen.has(b.address.key)) return false;\n seen.add(b.address.key);\n return true;\n }),\n rowsBefore: first.rowsBefore,\n columnsBefore: first.columnsBefore,\n };\n}\n\n/** A row's level when a change is set on the whole Sheet (the twelfth Windows run, case 15). */\nfunction underWholeSheet(level: AxisFormat, change: CellFormatChange): AxisFormat {\n return new AxisFormat(\n change.numberFormat === undefined ? level.numberFormat : undefined,\n change.alignment === undefined ? level.alignment : undefined,\n change.setsFont && level.font !== undefined ? change.applyToFont(level.font) : level.font,\n change.fill === undefined ? level.fill : undefined,\n change.setsBorders && level.borders !== undefined ? defined(change.borders, 'the Borders set').applyTo(level.borders, PlaceInRange.inside) : level.borders);\n}\n\nfunction setAxis(levels: Map<number, AxisFormat>, index: number, level: AxisFormat): void {\n if (level.isEmpty) levels.delete(index);\n else levels.set(index, level);\n}\n\nfunction sameLevel(a: AxisFormat | undefined, b: AxisFormat | undefined): boolean {\n return (a ?? AxisFormat.empty).equals(b ?? AxisFormat.empty);\n}\n\nfunction levelsDiffer(a: ReadonlyMap<number, AxisFormat>, b: ReadonlyMap<number, AxisFormat>): boolean {\n if (a.size !== b.size) return true;\n for (const [key, level] of a) {\n const other = b.get(key);\n if (other === undefined || !other.equals(level)) return true;\n }\n return false;\n}\n\n/** The rows beside a cell whose painted edge changes with the cell's own sides. */\nfunction rowsAcross(address: CellAddress, before: CellBorders, after: CellBorders): number[] {\n const rows: number[] = [];\n if (!before.top.equals(after.top) && address.row > 0) rows.push(address.row - 1);\n if (!before.bottom.equals(after.bottom) && address.row < rowCount - 1) rows.push(address.row + 1);\n return rows;\n}\n\n/** The row or column levels as a Sheet Document records them: adjacent indexes recorded alike are one run. */\nfunction runs(levels: ReadonlyMap<number, AxisFormat>): SheetDocumentAxisFormat[] {\n const list: { first: number; last: number; level: AxisFormat }[] = [];\n for (const index of [...levels.keys()].toSorted((a, b) => a - b)) {\n const level = defined(levels.get(index), 'a level');\n const last = list.at(-1);\n if (last !== undefined && last.last === index - 1 && last.level.equals(level)) last.last = index;\n else list.push({ first: index, last: index, level });\n }\n return list.map(r => new SheetDocumentAxisFormat(r.first, r.last, r.level.numberFormat, r.level.alignment, r.level.font, r.level.fill, r.level.borders));\n}\n\n/** The levels recorded on the rows or columns `first` to `last`, each with how many of them record it; those recording nothing are counted under the empty level. */\nfunction levelGroups(levels: ReadonlyMap<number, AxisFormat>, first: number, last: number): Map<string, { level: AxisFormat; count: number }> {\n const groups = new Map<string, { level: AxisFormat; count: number }>();\n let counted = 0;\n for (const [index, level] of levels) {\n if (index < first || index > last) continue;\n const group = groups.get(level.key);\n if (group === undefined) groups.set(level.key, { level, count: 1 });\n else group.count++;\n counted++;\n }\n const unrecorded = last - first + 1 - counted;\n if (unrecorded > 0) {\n const group = groups.get(AxisFormat.empty.key);\n if (group === undefined) groups.set(AxisFormat.empty.key, { level: AxisFormat.empty, count: unrecorded });\n else group.count += unrecorded;\n }\n return groups;\n}\n\nfunction charactersOf(width: number): number {\n if (!Number.isFinite(width) || width < 0) throw new RangeError('A column width is a finite number of characters, zero or more.');\n // A width typed as 8 may arrive as 7.9999999 after a round trip through pixels.\n return Math.min(2_147_483_647, Math.floor(width + 1e-9));\n}\n\nfunction callsToday(node: Node): boolean {\n return [...node.calls()].some(call => call.function !== undefined && call.name === 'TODAY');\n}\n\nfunction callsRandom(node: Node): boolean {\n return [...node.calls()].some(call => call.function !== undefined && (call.name === 'RAND' || call.name === 'RANDBETWEEN'));\n}\n\nfunction sameStrings(a: readonly string[], b: readonly string[]): boolean {\n return a.length === b.length && a.every((s, i) => s === b[i]);\n}\n\n/** The key's columns as the columns spell them, so that `id` and `Id` declare the same key. */\nfunction keyAsDeclared(columns: readonly string[], key: readonly string[]): string[] {\n return key.map(k => defined(columns.find(column => equalsIgnoreCase(column, k)), 'a key column'));\n}\n\n/**\n * The first two rows whose keys the lookup a Pointing Scope writes cannot tell apart, or `undefined` (ADR-0058). A\n * row whose key, or any part of it, is blank or an Error Value is passed over.\n */\nfunction firstRepeat(parts: readonly (readonly (Value | undefined)[])[]): { first: number; second: number } | undefined {\n const several = parts.length > 1;\n const seen = new Map<string, number>();\n const rows = defined(parts[0], 'a key column').length;\n for (let row = 0; row < rows; row++) {\n let identity = '';\n let isKey = true;\n for (const part of parts) {\n const key = part[row];\n if (key === undefined || key.isError) {\n isKey = false;\n break;\n }\n const exact = exactMatchIdentity(key);\n const number = several && exact.kind === 'number' ? atFifteenDigits(exact.number) : exact.number;\n identity += `${exact.kind}:${formatRoundTrip(number)}:${String(exact.text?.length ?? -1)}:${exact.text ?? ''}|`; // oxlint-disable-line ex-grid/no-stand-in-default -- a key with no text writes its length as -1 and its text as nothing, as the C# identity does\n }\n if (!isKey) continue;\n const first = seen.get(identity);\n if (first !== undefined) return { first, second: row };\n seen.set(identity, row);\n }\n return undefined;\n}\n\n/** What `XLOOKUP`'s exact match compares of a Value: its kind, and then its number, its text in Excel's collation, or its boolean. */\nfunction exactMatchIdentity(value: Value): { kind: ValueKind; number: number; text: string | undefined } {\n switch (value.kind) {\n case 'text': return { kind: 'text', number: 0, text: textEqualityKey(value.text) };\n case 'number': return { kind: 'number', number: value.number, text: undefined };\n case 'boolean':\n case 'error':\n return { kind: 'boolean', number: value.boolean ? 1 : 0, text: undefined };\n default: throw new Error(`Internal: ${String(value.kind)} is no kind of Value.`);\n }\n}\n\n/** The tables a Formula reads: those its structured references name, and every bare name it holds (TABLE-024), each once without regard to case. */\nfunction tablesRead(formula: Node): string[] {\n const names = new Set<string>();\n for (const reference of formula.structuredReferences()) names.add(ignoreCaseKey(reference.table));\n for (const name of bareNames(formula)) names.add(ignoreCaseKey(name));\n return [...names];\n}\n\n/** The names a Formula holds that no `LET` binds, which a Linked Table's name could be. */\nfunction bareNames(node: Node): string[] {\n switch (node.kind) {\n case 'name': return node.binding === undefined ? [node.name] : [];\n case 'intersection': return [...bareNames(node.left), ...bareNames(node.right)];\n case 'parentheses': return bareNames(node.inner);\n case 'unary': return bareNames(node.operand);\n case 'percent': return bareNames(node.operand);\n case 'binary': return [...node.operands()].flatMap(bareNames);\n case 'function': return node.arguments.flatMap(bareNames);\n case 'let': return [...node.bindings.flatMap(b => bareNames(b.value)), ...bareNames(node.calculation)];\n case 'number':\n case 'text':\n case 'boolean':\n case 'error':\n case 'missing':\n case 'reference':\n case 'structuredReference':\n return [];\n default: throw new Error(`Internal: ${String((node as { kind: unknown }).kind)} is no kind of node.`);\n }\n}\n\nfunction isTableName(name: string): boolean {\n return tableNamePattern.test(name)\n && CellAddress.tryParse(name) === undefined\n && !rowColumnPattern.test(name)\n && !equalsIgnoreCase(name, 'TRUE')\n && !equalsIgnoreCase(name, 'FALSE');\n}\n\n/** Whether a Formula is one the format-on-entry rule reads: References to single cells, numbers, `+ - * /`, parentheses, and a few functions. */\nfunction simple(node: Node): boolean {\n switch (node.kind) {\n case 'number': return true;\n case 'reference': return node.reference.shape === 'cell';\n case 'parentheses': return simple(node.inner);\n case 'unary': return simple(node.operand);\n case 'percent': return node.operand.kind === 'number';\n case 'binary': return node.spine.every(s => s.operator === '+' || s.operator === '-' || s.operator === '*' || s.operator === '/') && [...node.operands()].every(simple);\n case 'function':\n if (node.function === undefined) return false;\n if (node.name === 'DATE' || node.name === 'TODAY' || node.name === 'NOW') return true;\n return (node.name === 'MIN' || node.name === 'MAX' || node.name === 'SUM') && node.arguments.every(a => a.kind === 'reference' || a.kind === 'number');\n case 'boolean':\n case 'error':\n case 'intersection':\n case 'let':\n case 'missing':\n case 'name':\n case 'structuredReference':\n case 'text':\n return false;\n default:\n return unreachable(node);\n }\n}\n\n/** A number constant with `%`, possibly in parentheses or under a sign. */\nfunction isPercentConstant(node: Node): boolean {\n switch (node.kind) {\n case 'percent': return true;\n case 'parentheses': return isPercentConstant(node.inner);\n case 'unary': return isPercentConstant(node.operand);\n case 'binary':\n case 'boolean':\n case 'error':\n case 'function':\n case 'intersection':\n case 'let':\n case 'missing':\n case 'name':\n case 'number':\n case 'reference':\n case 'structuredReference':\n case 'text':\n return false;\n default:\n return unreachable(node);\n }\n}\n\n/** The format one operator gives, from the formats of its operands. */\nfunction binary(operator: string, leftNode: Node, rightNode: Node, left: NumberFormat | undefined, right: NumberFormat | undefined): NumberFormat | undefined {\n if (operator !== '+' && operator !== '-') {\n const product = left ?? right;\n return product !== undefined && !product.isPercent ? product : undefined;\n }\n if (isPercentConstant(leftNode) || isPercentConstant(rightNode)) {\n const other = isPercentConstant(leftNode) ? right : left;\n return other === undefined ? percentConstant : undefined;\n }\n if (operator === '-' && left?.isDate === true && right?.isDate === true) return undefined;\n return left ?? right;\n}\n\nfunction capitalise(text: string): string {\n return toUpperInvariant(text.charAt(0)) + text.slice(1);\n}\n\n/** Whether a Formula calls `ROW()` or `COLUMN()` with no argument: its Value is its own cell's place. */\nfunction readsOwnPlace(formula: Node): boolean {\n return [...formula.calls()].some(call => call.function !== undefined && (call.name === 'ROW' || call.name === 'COLUMN') && call.arguments.length === 0);\n}\n\n/**\n * One cell of the `text/html` flavour, in Excel's own markup (ADR-0048): a number carries its unformatted Value in\n * `x:num`, and a cell whose format is not General carries the format code in `mso-number-format`.\n */\nfunction cellHtml(value: Value | undefined, raw: string, format: NumberFormat): string {\n let html = '<td';\n if (value?.kind === 'number') html += ` x:num=\"${raw}\"`;\n if (!format.isGeneral) html += ` style='mso-number-format:\"${cssFormatCode(format.code)}\"'`;\n return `${html}>${escapeHtml(raw)}</td>`;\n}\n\n/**\n * A format code as Excel's HTML writes it inside `mso-number-format:\"\u2026\"`: letters, digits, characters outside\n * ASCII, the space and `_ * ? % -` as they are; every other ASCII character escaped with a backslash; and the\n * characters that would end the CSS string or the attribute around it as CSS hex escapes. @internal\n */\nexport function cssFormatCode(code: string): string {\n let css = '';\n for (let i = 0; i < code.length; i++) {\n const c = code.charAt(i);\n const n = code.charCodeAt(i);\n if (/[A-Za-z0-9]/u.test(c) || n > 0x7f || c === '_' || c === '*' || c === '?' || c === '%' || c === '-' || c === ' ') {\n css += c;\n } else if (c === '\"' || c === \"'\" || c === '&' || c === '<' || c === '>') {\n css += `\\\\${n.toString(16).toUpperCase().padStart(4, '0')}`;\n // A hex escape runs on through hex digits and swallows one space after it.\n const next = code.charAt(i + 1);\n if (i + 1 < code.length && (/[0-9A-Fa-f]/u.test(next) || next === ' ')) css += ' ';\n } else {\n css += `\\\\${c}`;\n }\n }\n return css;\n}\n\n/** Excel's TSV: a field holding a tab, a line break or a quote is quoted, inner quotes doubled. */\nfunction quoteForTsv(value: string): string {\n return /[\\t\\n\\r\"]/u.test(value) ? `\"${value.replaceAll('\"', '\"\"')}\"` : value;\n}\n\nfunction escapeHtml(value: string): string {\n return value.replaceAll('&', '&').replaceAll('<', '<').replaceAll('>', '>');\n}\n\nfunction fillRefusal(at: CellAddress, what: string): SheetRefusal {\n return new SheetRefusal('fillPatternNotSupported', `${at.toString()} holds ${what}; ExSheet refuses the fill rather than fill it with copies.`);\n}\n\nfunction series(number: number): Entry {\n return Entry.fromValue(Number.isFinite(number) ? Value.fromNumber(number) : Value.fromError('#NUM!'));\n}\n\n/** `Enumerable.Average`: the sum in order, divided by the count. */\nfunction average(values: readonly number[]): number {\n let sum = 0;\n for (const v of values) sum += v;\n return sum / values.length;\n}\n\n// Excel's 15 significant digits, for a fill's linear trend (ADR-0050, ticket 15). C# counts the steps in `decimal`;\n// here a decimal is a whole number of units of 10^exponent, held in a bigint, which counts them exactly.\n\nconst trendDigits = 15;\n\n/** `number` rounded to 15 significant digits, as the nearest double. */\nfunction trendRound(number: number): number {\n return Number.isFinite(number) && number !== 0 ? Number(formatExponential(number, trendDigits - 1)) : number;\n}\n\n/** A decimal: `units` \u00D7 10^`exponent`. */\ninterface Decimal {\n readonly units: bigint;\n readonly exponent: number;\n}\n\n/** Decimal keeps 15 significant digits from 1e-13 (its 28 places) up to 1e15 (a whole number of 15 digits). */\nfunction insideDecimal(number: number): boolean {\n return number === 0 || (Math.abs(number) >= 1e-13 && Math.abs(number) < 1e15);\n}\n\n/** The number at 15 significant digits, exactly, as C# reads its `E14` text into a decimal; `undefined` outside decimal's range. */\nfunction exactDecimal(number: number): Decimal | undefined {\n if (!insideDecimal(number)) return undefined;\n if (number === 0) return { units: 0n, exponent: 0 };\n const text = formatExponential(number, trendDigits - 1);\n const e = text.indexOf('E');\n const mantissa = text.slice(0, e).replace('.', '');\n return { units: BigInt(mantissa), exponent: Number(text.slice(e + 1)) - (trendDigits - 1) };\n}\n\n/** `first` plus `count` steps, rounded to 15 significant digits: counted exactly where both are inside decimal's range, and in doubles otherwise. */\nfunction trendStep(first: number, step: number, count: number): number {\n if (count === 0) return first;\n const a = exactDecimal(first);\n const s = exactDecimal(step);\n if (a !== undefined && s !== undefined) {\n const exponent = Math.min(a.exponent, s.exponent);\n const units = a.units * 10n ** BigInt(a.exponent - exponent) + BigInt(count) * s.units * 10n ** BigInt(s.exponent - exponent);\n const rounded = roundDecimal({ units, exponent });\n if (rounded !== undefined) return Number(`${String(rounded.units)}e${String(rounded.exponent)}`);\n }\n return trendRound(first + count * step);\n}\n\n/** A decimal rounded to 15 significant digits, half away from zero; `undefined` outside decimal's range of 1e-13 to 1e15. */\nfunction roundDecimal(number: Decimal): Decimal | undefined {\n if (number.units === 0n) return { units: 0n, exponent: 0 };\n const negative = number.units < 0n;\n const magnitude = negative ? -number.units : number.units;\n const digits = magnitude.toString().length;\n // The decimal exponent of the leading digit: 10^(digits - 1 + exponent).\n const leading = digits - 1 + number.exponent;\n if (leading < -13 || leading >= 15) return undefined;\n const drop = digits - trendDigits;\n if (drop <= 0) return number;\n const divisor = 10n ** BigInt(drop);\n let kept = magnitude / divisor;\n if ((magnitude % divisor) * 2n >= divisor) kept += 1n;\n return { units: negative ? -kept : kept, exponent: number.exponent + drop };\n}\n\nlet invariantNames: Set<string> | undefined;\n\nfunction invariantListNames(): Set<string> {\n invariantNames ??= cultureListNames(Culture.invariant);\n return invariantNames;\n}\n\nfunction cultureListNames(culture: Culture): Set<string> {\n const data = culture.data;\n return new Set([...data.dayNames, ...data.abbreviatedDayNames, ...data.monthNames, ...abbreviatedMonthNamesOf(culture)]\n .filter(n => n.length > 0).map(listKey));\n}\n\n/**\n * A list name as it is compared: composed, its invisible characters (a soft hyphen, the zero-width space,\n * joiners and the word joiner, the byte order mark) dropped, in upper case. A name in doubt is refused\n * rather than copied, and the comparison is the engine's own, not the platform's collation.\n */\nfunction listKey(name: string): string {\n return ignoreCaseKey(name.normalize('NFC').replace(/[\\u00AD\\u200B-\\u200D\\u2060\\uFEFF]/gu, ''));\n}\n\n", "// The serialisable form of a Sheet (C#'s SheetDocument.cs; CONTEXT.md, ADR-0048), read and written as the C#\n// engine reads and writes it, so a document written by either opens in the other.\nimport { CellAddress } from './cell-address';\nimport { BorderLine, borderLineStyles, CellBorders, CellColour, CellFill, CellFont, type BorderLineStyle, type HorizontalAlignment } from './cell-format';\nimport { CellRange } from './cell-range';\nimport { Culture } from './culture';\nimport { equalsIgnoreCase, hex } from './dotnet';\nimport { Entry } from './entry';\nimport { elementAt } from './must';\nimport { FormulaSyntaxError } from './formula-syntax-error';\nimport { JsonSyntaxError, JsonWriter, jsonDouble, jsonInt32, jsonText, parseJson, type JsonElement } from './json-element';\nimport { NumberFormat } from './number-format';\nimport { Sheet } from './sheet';\nimport type { SheetColumnWidthKind } from './sheet-change';\nimport { SheetDocumentAxisFormat, SheetDocumentCell, SheetDocumentColumnWidth, SheetDocumentError, SheetDocumentTable } from './sheet-document-parts';\nimport { parseTypedError, Value } from './value';\n\n/** The parts of a Sheet Document besides its culture, name, Linked Tables and cells. */\nexport interface SheetDocumentLayout {\n /** The Cell Formats recorded on whole columns, in column order, adjacent columns recorded alike as one run (ADR-0047, ADR-0071). */\n readonly columns?: readonly SheetDocumentAxisFormat[];\n /** The Cell Formats recorded on whole rows, in row order, adjacent rows recorded alike as one run. */\n readonly rows?: readonly SheetDocumentAxisFormat[];\n /** The widths recorded on columns, in column order, adjacent columns of one width and one kind as one run (ADR-0046). */\n readonly columnWidths?: readonly SheetDocumentColumnWidth[];\n}\n\n/**\n * The serialisable form of a Sheet (CONTEXT.md, ADR-0048): its culture, its name (ADR-0046), the Linked Tables declared\n * on it \u2014 names, columns and keys, never rows (ADR-0049) \u2014 its Entries, the Cell Formats recorded on its columns, rows\n * and cells (ADR-0047, ADR-0071) and the widths set on its columns (ADR-0046), and never a Value: opening one computes\n * every Value again. The Consumer persists it; ExSheet never does.\n *\n * The document is a format with a version. A reader meeting a version it does not know refuses the document rather\n * than guess at it (ADR-0048); so does a reader meeting anything it does not understand. This engine writes version 9\n * and reads versions 1 to 9, each as the C# engine's remarks on SheetDocument describe.\n */\nexport class SheetDocument {\n /** The version this engine writes. */\n static readonly currentVersion = 9;\n\n /** The oldest version this engine reads. */\n static readonly oldestReadableVersion = 1;\n\n /** The cells that hold something, in row-major order. */\n readonly cells: readonly SheetDocumentCell[];\n\n /** The Cell Formats recorded on whole columns, in column order. Empty for a document read from version 1 or 2. */\n readonly columns: readonly SheetDocumentAxisFormat[];\n\n /** The Cell Formats recorded on whole rows, in row order. Empty for a document read from version 1 or 2. */\n readonly rows: readonly SheetDocumentAxisFormat[];\n\n /** The widths recorded on columns, in column order. Empty for a document read from versions 1 to 3. */\n readonly columnWidths: readonly SheetDocumentColumnWidth[];\n\n /** The name of the Sheet's declared culture, such as `en-US`; empty for the invariant culture, as .NET names it. */\n readonly culture: string;\n\n /** The Sheet's name (ADR-0046); `Sheet1` for a document read from version 1. */\n readonly name: string;\n\n /** The Linked Tables declared on the Sheet, in the order they were declared (ADR-0049). */\n readonly linkedTables: readonly SheetDocumentTable[];\n\n /** @internal */\n constructor(\n culture: string,\n name: string,\n linkedTables: readonly SheetDocumentTable[],\n cells: readonly SheetDocumentCell[],\n layout: SheetDocumentLayout = {},\n ) {\n this.culture = culture;\n this.name = name;\n this.linkedTables = linkedTables;\n this.cells = cells;\n this.columns = layout.columns ?? []; // oxlint-disable-line ex-grid/no-stand-in-default -- a document that records no column format has none, as C#'s init default\n this.rows = layout.rows ?? []; // oxlint-disable-line ex-grid/no-stand-in-default -- none recorded is none\n this.columnWidths = layout.columnWidths ?? []; // oxlint-disable-line ex-grid/no-stand-in-default -- none recorded is none\n }\n\n /**\n * A Sheet Document built from its parts, as a reader of another format builds one (ADR-0330): a Sheet named `name`\n * holding `cells` under `culture`, declaring no Linked Table. The cells are recorded in row-major order whatever\n * order they come in. Throws a RangeError for a culture this engine does not know, a name a Sheet cannot have, or a\n * cell that appears twice. Nothing is guessed.\n */\n static of(culture: Culture, name: string, cells: Iterable<SheetDocumentCell>, layout: SheetDocumentLayout = {}): SheetDocument {\n Sheet.checkName(name);\n const list: SheetDocumentCell[] = [];\n const seen = new Set<number>();\n for (const cell of cells) {\n if (seen.has(cell.address.key)) throw new RangeError(`The cell ${cell.address.toString()} appears twice.`);\n seen.add(cell.address.key);\n list.push(cell);\n }\n list.sort((a, b) => a.address.compareTo(b.address));\n return new SheetDocument(culture.name, name, [], list, layout);\n }\n\n /** The format version the document is written in: `currentVersion`, whatever version it was read from. */\n get version(): number {\n return SheetDocument.currentVersion;\n }\n\n /** Writes the document as JSON, as the C# engine writes it. */\n toJson(): string {\n const json = new JsonWriter();\n json.startObject();\n json.number('version', SheetDocument.currentVersion);\n json.string('culture', this.culture);\n json.string('name', this.name);\n SheetDocument.writeTables(json, this.linkedTables);\n this.writeBody(json);\n json.endObject();\n return json.toString();\n }\n\n /** The Linked Tables' declarations, as a Sheet Document and a Workbook Document both write them; nothing for none. @internal */\n static writeTables(json: JsonWriter, tables: readonly SheetDocumentTable[]): void {\n if (tables.length === 0) return;\n json.startArray('linkedTables');\n for (const table of tables) {\n json.startObject();\n json.string('name', table.name);\n json.startArray('columns');\n for (const column of table.columns) json.string(undefined, column);\n json.endArray();\n // One key column is written as its name, as version 7 wrote it; several as a list (version 9).\n if (table.keyColumns.length === 1) {\n json.string('key', elementAt(table.keyColumns, 0));\n } else if (table.keyColumns.length > 1) {\n json.startArray('key');\n for (const column of table.keyColumns) json.string(undefined, column);\n json.endArray();\n }\n json.endObject();\n }\n json.endArray();\n }\n\n /** What a Sheet records of its own: the formats on its columns and rows, its column widths and its cells. @internal */\n writeBody(json: JsonWriter): void {\n writeAxis(json, 'columns', this.columns, run => `${CellAddress.columnName(run.first)}:${CellAddress.columnName(run.last)}`);\n writeAxis(json, 'rows', this.rows, run => `${String(run.first + 1)}:${String(run.last + 1)}`);\n if (this.columnWidths.length > 0) {\n json.startArray('columnWidths');\n for (const run of this.columnWidths) {\n json.startObject();\n json.string('at', `${CellAddress.columnName(run.first)}:${CellAddress.columnName(run.last)}`);\n json.number('width', run.width);\n json.string('kind', run.kind);\n json.endObject();\n }\n json.endArray();\n }\n json.startArray('cells');\n for (const cell of this.cells) writeCell(json, cell);\n json.endArray();\n }\n\n /** A cell as the document records it, as JSON: two cells record the same exactly when their texts are equal. @internal */\n static cellJson(cell: SheetDocumentCell): string {\n const json = new JsonWriter();\n writeCell(json, cell);\n return json.toString();\n }\n\n /**\n * Reads a document written by `toJson`, or by the C# engine. Throws a SheetDocumentError when the version is not\n * one this engine reads (`oldestReadableVersion` to `currentVersion`), or the document holds anything its version\n * does not define. Nothing is guessed.\n */\n static fromJson(text: string): SheetDocument {\n const root = parseDocument(text, 'Sheet Document');\n if (root.kind !== 'object') throw new SheetDocumentError('A Sheet Document is a JSON object.');\n // The version is read before anything else: a document of another version is refused whatever else it holds (ADR-0048).\n const version = property(root, 'version');\n const number = version === undefined ? undefined : jsonInt32(version);\n if (number === undefined) throw new SheetDocumentError('The Sheet Document has no version.');\n if (number < SheetDocument.oldestReadableVersion || number > SheetDocument.currentVersion) {\n throw new SheetDocumentError(\n `The Sheet Document is version ${String(number)}; this engine reads versions ${String(SheetDocument.oldestReadableVersion)} to ${String(SheetDocument.currentVersion)}.`,\n { documentVersion: number });\n }\n return read(root, number, undefined);\n }\n\n /**\n * Reads one Sheet of a Workbook Document (ADR-0331): its name and what it records of its own, in the current\n * version, under the Workbook's culture. The version, the culture and the Linked Tables are the Workbook's, and are\n * refused here. @internal\n */\n static readSheetOfWorkbook(element: JsonElement, culture: string): SheetDocument {\n if (element.kind !== 'object') throw new SheetDocumentError('A Sheet of a Workbook Document is a JSON object.');\n return read(element, SheetDocument.currentVersion, culture);\n }\n\n /** The Linked Tables' declarations, as a Sheet Document and a Workbook Document both read them; none declared twice. @internal */\n static readTables(array: JsonElement, version: number): SheetDocumentTable[] {\n if (array.kind !== 'array') throw new SheetDocumentError('The Linked Tables are not an array.');\n const tables: SheetDocumentTable[] = [];\n for (const element of array.items) {\n const table = readTable(element, version);\n if (tables.some(t => equalsIgnoreCase(t.name, table.name))) throw new SheetDocumentError(`The Linked Table '${table.name}' is declared twice.`);\n tables.push(table);\n }\n return tables;\n }\n\n /** The culture a document names: `''` is the invariant culture, as .NET names it. Throws a SheetDocumentError for one this engine does not know. @internal */\n static resolveCulture(name: string): Culture {\n if (name === '') return Culture.invariant;\n try {\n return Culture.of(name);\n } catch (e) {\n throw new SheetDocumentError(`The culture '${name}' is not known here.`, { cause: e });\n }\n }\n}\n\n/** Parses a document's text, refusing text that is not JSON as the document's refusal. @internal */\nexport function parseDocument(text: string, what: string): JsonElement {\n try {\n return parseJson(text);\n } catch (e) {\n if (e instanceof JsonSyntaxError) throw new SheetDocumentError(`The ${what} is not JSON.`, { cause: e });\n throw e;\n }\n}\n\n/** The first property of `object` named `name`, as `TryGetProperty` finds it; `undefined` for none. @internal */\nexport function property(object: JsonElement & { kind: 'object' }, name: string): JsonElement | undefined {\n return object.properties.find(([n]) => n === name)?.[1];\n}\n\n/** The Sheet as a Sheet Document declaring `tables`: none for a Sheet of a Workbook Document, which records them once (ADR-0331). @internal */\nexport function sheetDocumentOf(sheet: Sheet, tables: readonly SheetDocumentTable[] = sheet.tableDeclarations): SheetDocument {\n const parts = sheet.toDocumentParts();\n return new SheetDocument(sheet.culture.name, sheet.name, tables, parts.cells, parts);\n}\n\n/** A cell as a Sheet Document records it, one object of its `\"cells\"`. */\nfunction writeCell(json: JsonWriter, cell: SheetDocumentCell): void {\n json.startObject();\n json.string('at', cell.address.toString());\n const entry = cell.entry;\n if (entry !== undefined) {\n if (entry.formula !== undefined) {\n json.string('formula', entry.formula);\n } else {\n const constant = entry.constant;\n if (constant === undefined) throw new Error('Internal: an Entry holds neither a Formula nor a constant.');\n switch (constant.kind) {\n case 'number': json.number('number', constant.number); break;\n case 'text': json.string('text', constant.text); break;\n case 'boolean': json.boolean('boolean', constant.boolean); break;\n case 'error': json.string('error', constant.error); break;\n default: throw new Error(`Internal: ${String(constant.kind satisfies never)} is not a constant's kind.`);\n }\n }\n }\n writeCellFormat(json, cell.numberFormat, cell.alignment, cell.font, cell.fill, cell.borders);\n json.endObject();\n}\n\nfunction writeAxis(json: JsonWriter, name: string, runs: readonly SheetDocumentAxisFormat[], at: (run: SheetDocumentAxisFormat) => string): void {\n if (runs.length === 0) return;\n json.startArray(name);\n for (const run of runs) {\n json.startObject();\n json.string('at', at(run));\n writeCellFormat(json, run.numberFormat, run.alignment, run.font, run.fill, run.borders);\n json.endObject();\n }\n json.endArray();\n}\n\n/**\n * The parts of a Cell Format a cell, row or column records, each only where it records one: `\"format\"`, `\"align\"`,\n * `\"font\"` (only what differs from the default Font), `\"fill\"` (`\"none\"` or `\"#RRGGBB\"`) and `\"borders\"` (each side\n * that has a line, as `\"style\"` in Excel's file's name for it and `\"color\"`). An Automatic colour is not written.\n */\nfunction writeCellFormat(\n json: JsonWriter, format: NumberFormat | undefined, alignment: HorizontalAlignment | undefined, font: CellFont | undefined,\n fill: CellFill | undefined, borders: CellBorders | undefined,\n): void {\n if (format !== undefined) json.string('format', format.code);\n if (alignment !== undefined) json.string('align', alignment);\n if (font !== undefined) {\n json.startObject('font');\n if (!font.colour.isAutomatic) json.string('color', colourText(font.colour));\n if (font.bold) json.boolean('bold', true);\n if (font.italic) json.boolean('italic', true);\n if (font.underline) json.boolean('underline', true);\n if (font.strikethrough) json.boolean('strikethrough', true);\n json.endObject();\n }\n if (fill !== undefined) json.string('fill', fill.colour === undefined ? 'none' : colourText(fill.colour));\n if (borders !== undefined) {\n json.startObject('borders');\n writeSide(json, 'top', borders.top);\n writeSide(json, 'bottom', borders.bottom);\n writeSide(json, 'left', borders.left);\n writeSide(json, 'right', borders.right);\n json.endObject();\n }\n}\n\nfunction writeSide(json: JsonWriter, side: string, line: BorderLine): void {\n if (line.isNone) return;\n json.startObject(side);\n json.string('style', lineStyleName(line.style));\n if (!line.colour.isAutomatic) json.string('color', colourText(line.colour));\n json.endObject();\n}\n\nfunction colourText(colour: CellColour): string {\n return `#${hex(colour.rgb, 6)}`;\n}\n\n/** Reads a Sheet Document's object, or with `workbookCulture` one Sheet of a Workbook Document. */\nfunction read(root: JsonElement & { kind: 'object' }, number: number, workbookCulture: string | undefined): SheetDocument {\n let culture = workbookCulture;\n let name: string | undefined;\n let tables: SheetDocumentTable[] = [];\n const cells: SheetDocumentCell[] = [];\n const seen = new Set<number>();\n let columns: SheetDocumentAxisFormat[] = [];\n let rows: SheetDocumentAxisFormat[] = [];\n let widths: SheetDocumentColumnWidth[] = [];\n for (const [key, value] of root.properties) {\n if (key === 'version' && workbookCulture === undefined) continue;\n if (key === 'culture' && workbookCulture === undefined) {\n if (value.kind !== 'string') throw new SheetDocumentError('The culture is not a string.');\n culture = value.value;\n } else if (key === 'name' && number >= 2) {\n if (value.kind !== 'string') throw new SheetDocumentError('The name is not a string.');\n name = value.value;\n const why = Sheet.whyNotAName(name);\n if (why !== undefined) throw new SheetDocumentError(`'${name}' is not a Sheet's name: ${why}`);\n } else if (key === 'linkedTables' && number >= 2 && workbookCulture === undefined) {\n tables = SheetDocument.readTables(value, number);\n } else if (key === 'columns' && number >= 3) {\n // The whole Sheet is recorded as whole columns (A:XFD), so a column run may span every row and every column.\n columns = readAxis(value, 'column', number, text => {\n const r = text === undefined ? undefined : CellRange.tryParse(text);\n return r?.isWholeColumns === true ? [r.first.column, r.last.column] : undefined;\n });\n } else if (key === 'rows' && number >= 3) {\n rows = readAxis(value, 'row', number, text => {\n const r = text === undefined ? undefined : CellRange.tryParse(text);\n return r?.isWholeRows === true && !r.isWholeColumns ? [r.first.row, r.last.row] : undefined;\n });\n } else if (key === 'columnWidths' && number >= 4) {\n widths = readWidths(value, number);\n } else if (key === 'cells') {\n if (value.kind !== 'array') throw new SheetDocumentError('The cells are not an array.');\n for (const element of value.items) {\n const cell = readCell(element, number);\n if (seen.has(cell.address.key)) throw new SheetDocumentError(`The cell ${cell.address.toString()} appears twice.`);\n seen.add(cell.address.key);\n cells.push(cell);\n }\n } else {\n throw new SheetDocumentError(workbookCulture === undefined\n ? `'${key}' is not part of a version ${String(number)} Sheet Document.`\n : `'${key}' is not part of a Sheet of a Workbook Document.`);\n }\n }\n if (culture === undefined) throw new SheetDocumentError('The Sheet Document records no culture.');\n if (number >= 2 && name === undefined) {\n throw new SheetDocumentError(workbookCulture === undefined ? 'The Sheet Document records no name.' : 'A Sheet of the Workbook Document records no name.');\n }\n SheetDocument.resolveCulture(culture);\n cells.sort((a, b) => a.address.compareTo(b.address));\n return new SheetDocument(culture, name ?? Sheet.defaultName, tables, cells, { columns, rows, columnWidths: widths });\n}\n\nfunction readAxis(\n array: JsonElement, what: string, version: number, parse: (text: string | undefined) => readonly [number, number] | undefined,\n): SheetDocumentAxisFormat[] {\n if (array.kind !== 'array') throw new SheetDocumentError(`The ${what} formats are not an array.`);\n const runs: SheetDocumentAxisFormat[] = [];\n for (const element of array.items) {\n if (element.kind !== 'object') throw new SheetDocumentError(`A ${what} format is not a JSON object.`);\n let at: readonly [number, number] | undefined;\n let format: NumberFormat | undefined;\n let alignment: HorizontalAlignment | undefined;\n let font: CellFont | undefined;\n let fill: CellFill | undefined;\n let borders: CellBorders | undefined;\n for (const [key, value] of element.properties) {\n if (key === 'at') {\n at = value.kind === 'string' ? parse(value.value) : undefined;\n if (at === undefined) throw new SheetDocumentError(`'${jsonText(value)}' is not a ${what} or a run of them.`);\n } else if (key === 'format') {\n format = readFormat(value);\n } else if (key === 'align') {\n alignment = readAlignment(value, true);\n } else if (key === 'font' && version >= 8) {\n font = readFont(value);\n } else if (key === 'fill' && version >= 8) {\n fill = readFill(value);\n } else if (key === 'borders' && version >= 8) {\n borders = readBorders(value);\n } else {\n throw new SheetDocumentError(`'${key}' is not part of a version ${String(version)} ${what} format.`);\n }\n }\n if (at === undefined) throw new SheetDocumentError(`A ${what} format says no ${what}.`);\n const [first, last] = at;\n if (format === undefined && alignment === undefined && font === undefined && fill === undefined && borders === undefined) {\n throw new SheetDocumentError(`The ${what} format at ${String(first)} sets nothing.`);\n }\n if (runs.some(r => r.first <= last && first <= r.last)) throw new SheetDocumentError(`A ${what} is formatted twice.`);\n runs.push(new SheetDocumentAxisFormat(first, last, format, alignment, font, fill, borders));\n }\n runs.sort((a, b) => a.first - b.first);\n return runs;\n}\n\nfunction readWidths(array: JsonElement, version: number): SheetDocumentColumnWidth[] {\n if (array.kind !== 'array') throw new SheetDocumentError('The column widths are not an array.');\n const runs: SheetDocumentColumnWidth[] = [];\n for (const element of array.items) {\n if (element.kind !== 'object') throw new SheetDocumentError('A column width is not a JSON object.');\n let at: readonly [number, number] | undefined;\n let width: number | undefined;\n // Version 4 recorded only widths the user set (ADR-0046).\n let kind: SheetColumnWidthKind | undefined = version < 5 ? 'setByUser' : undefined;\n for (const [key, value] of element.properties) {\n if (key === 'at') {\n const r = value.kind === 'string' ? CellRange.tryParse(value.value) : undefined;\n if (r?.isWholeColumns !== true) throw new SheetDocumentError(`'${jsonText(value)}' is not a column or a run of them.`);\n at = [r.first.column, r.last.column];\n } else if (key === 'width') {\n const w = jsonDouble(value);\n if (w === undefined || !(w > 0 && w <= Sheet.maxColumnWidth)) {\n throw new SheetDocumentError(`'${jsonText(value)}' is not a column's width: more than 0 and at most ${String(Sheet.maxColumnWidth)} characters.`);\n }\n width = w;\n } else if (key === 'custom' && version === 5) {\n // Version 5's custom width stopped widening; any other was widened again (ADR-0046, 2026-09-28).\n if (value.kind === 'true') kind = 'setByUser';\n else if (value.kind === 'false') kind = 'widenedByEntry';\n else throw new SheetDocumentError(`'${jsonText(value)}' does not say whether a column's width is custom.`);\n } else if (key === 'kind' && version >= 6) {\n if (value.kind !== 'string' || (value.value !== 'setByUser' && value.value !== 'widenedByEntry')) {\n throw new SheetDocumentError(`'${jsonText(value)}' is not a kind of column width: \"widenedByEntry\" or \"setByUser\".`);\n }\n kind = value.value;\n } else {\n throw new SheetDocumentError(`'${key}' is not part of a version ${String(version)} column width.`);\n }\n }\n if (at === undefined) throw new SheetDocumentError('A column width says no column.');\n const [first, last] = at;\n if (width === undefined) throw new SheetDocumentError(`The column width at ${CellAddress.columnName(first)} gives no width.`);\n if (kind === undefined) throw new SheetDocumentError(`The column width at ${CellAddress.columnName(first)} does not say its kind.`);\n if (runs.some(r => r.first <= last && first <= r.last)) throw new SheetDocumentError('A column is given a width twice.');\n runs.push(new SheetDocumentColumnWidth(first, last, width, kind));\n }\n runs.sort((a, b) => a.first - b.first);\n return runs;\n}\n\nfunction readFormat(value: JsonElement): NumberFormat {\n const reading = value.kind === 'string' ? NumberFormat.tryParse(value.value) : undefined;\n if (reading?.format === undefined) throw new SheetDocumentError(`'${jsonText(value)}' is not a number format this version reads.`);\n return reading.format;\n}\n\n/**\n * A colour as version 8 records it: `\"automatic\"` or `\"#RRGGBB\"`. Any other kind \u2014 an `.xlsx` theme colour, a colour's\n * name \u2014 is refused by name, never guessed at (ADR-0048, 2026-09-30).\n */\nfunction readColour(value: JsonElement): CellColour {\n if (value.kind === 'string') {\n if (value.value === 'automatic') return CellColour.automatic;\n const rgb = CellColour.fromHex(value.value);\n if (rgb !== undefined) return rgb;\n }\n throw new SheetDocumentError(`'${jsonText(value)}' is not a colour a Sheet Document records: a colour is \"automatic\" or \"#RRGGBB\", and no other kind is read.`);\n}\n\nfunction readFont(value: JsonElement): CellFont {\n if (value.kind !== 'object') throw new SheetDocumentError(`'${jsonText(value)}' is not a Font.`);\n let font = CellFont.default;\n for (const [key, element] of value.properties) {\n switch (key) {\n case 'color': font = font.with({ colour: readColour(element) }); break;\n case 'bold': font = font.with({ bold: readEmphasis(key, element) }); break;\n case 'italic': font = font.with({ italic: readEmphasis(key, element) }); break;\n case 'underline': font = font.with({ underline: readEmphasis(key, element) }); break;\n case 'strikethrough': font = font.with({ strikethrough: readEmphasis(key, element) }); break;\n default: throw new SheetDocumentError(`'${key}' is not part of a Font: its colour, bold, italic, a single underline and strikethrough.`);\n }\n }\n return font;\n}\n\nfunction readEmphasis(name: string, element: JsonElement): boolean {\n if (element.kind === 'true') return true;\n if (element.kind === 'false') return false;\n throw new SheetDocumentError(`'${jsonText(element)}' does not say whether a Font is ${name}.`);\n}\n\nfunction readFill(value: JsonElement): CellFill {\n if (value.kind === 'string') {\n if (value.value === 'none') return CellFill.none;\n const rgb = CellColour.fromHex(value.value);\n if (rgb !== undefined) return CellFill.solid(rgb);\n }\n throw new SheetDocumentError(`'${jsonText(value)}' is not a Fill a Sheet Document records: a Fill is \"none\" or \"#RRGGBB\", and no other kind of colour is read.`);\n}\n\nfunction readBorders(value: JsonElement): CellBorders {\n if (value.kind !== 'object') throw new SheetDocumentError(`'${jsonText(value)}' is not a cell's Borders.`);\n let borders = CellBorders.none;\n for (const [key, element] of value.properties) {\n switch (key) {\n case 'top': borders = borders.with({ top: readSide(key, element) }); break;\n case 'bottom': borders = borders.with({ bottom: readSide(key, element) }); break;\n case 'left': borders = borders.with({ left: readSide(key, element) }); break;\n case 'right': borders = borders.with({ right: readSide(key, element) }); break;\n default: throw new SheetDocumentError(`'${key}' is not a side of a cell: top, bottom, left or right.`);\n }\n }\n return borders;\n}\n\nfunction readSide(side: string, value: JsonElement): BorderLine {\n if (value.kind !== 'object') throw new SheetDocumentError(`'${jsonText(value)}' is not the line on a cell's ${side} side.`);\n let style: BorderLineStyle | undefined;\n let colour = CellColour.automatic;\n for (const [key, element] of value.properties) {\n if (key === 'style') {\n style = element.kind === 'string' ? lineStyleOf(element.value) : undefined;\n if (style === undefined) throw new SheetDocumentError(`'${jsonText(element)}' is not one of Excel's thirteen line styles.`);\n } else if (key === 'color') {\n colour = readColour(element);\n } else {\n throw new SheetDocumentError(`'${key}' is not part of a Border: its line style and its colour.`);\n }\n }\n if (style === undefined) throw new SheetDocumentError(`The line on a cell's ${side} side says no line style.`);\n return new BorderLine(style, colour);\n}\n\n/** The names Excel's own file gives the thirteen line styles (`ST_BorderStyle`), where they differ from the style's own. */\nconst fileNames: Partial<Record<BorderLineStyle, string>> = { slantedDashDot: 'slantDashDot' };\n\nfunction lineStyleName(style: BorderLineStyle): string {\n return fileNames[style] ?? style;\n}\n\nfunction lineStyleOf(name: string): BorderLineStyle | undefined {\n return borderLineStyles.find(s => s !== 'none' && lineStyleName(s) === name);\n}\n\nfunction readAlignment(value: JsonElement, allowGeneral: boolean): HorizontalAlignment {\n if (value.kind === 'string') {\n switch (value.value) {\n case 'general':\n if (allowGeneral) return 'general';\n break;\n case 'left':\n case 'center':\n case 'right':\n return value.value;\n default:\n break;\n }\n }\n throw new SheetDocumentError(`'${jsonText(value)}' is not an alignment.`);\n}\n\nfunction readTable(element: JsonElement, version: number): SheetDocumentTable {\n if (element.kind !== 'object') throw new SheetDocumentError('A Linked Table is not a JSON object.');\n let name: string | undefined;\n let columns: string[] | undefined;\n let key: string[] = [];\n for (const [property_, value] of element.properties) {\n if (property_ === 'name') {\n if (value.kind !== 'string') throw new SheetDocumentError(`'${jsonText(value)}' is not a Linked Table's name.`);\n name = value.value;\n } else if (property_ === 'columns') {\n if (value.kind !== 'array') throw new SheetDocumentError(\"A Linked Table's columns are not an array.\");\n columns = value.items.map(c => {\n if (c.kind !== 'string') throw new SheetDocumentError(`'${jsonText(c)}' is not a column name.`);\n return c.value;\n });\n } else if (property_ === 'key' && version >= 7 && value.kind === 'string') {\n key = [value.value];\n } else if (property_ === 'key' && version >= 9 && value.kind === 'array') {\n key = value.items.map(c => {\n if (c.kind !== 'string') throw new SheetDocumentError(`'${jsonText(c)}' is not a Linked Table's key column.`);\n return c.value;\n });\n if (key.length < 2) throw new SheetDocumentError(`A key of several columns lists at least two; '${jsonText(value)}' does not.`);\n } else if (property_ === 'key' && version >= 7) {\n throw new SheetDocumentError(`'${jsonText(value)}' is not a Linked Table's key column.`);\n } else {\n throw new SheetDocumentError(`'${property_}' is not part of a version ${String(version)} Linked Table's declaration.`);\n }\n }\n if (name === undefined) throw new SheetDocumentError('A Linked Table has no name.');\n if (columns === undefined) throw new SheetDocumentError(`The Linked Table '${name}' has no columns.`);\n const why = Sheet.whyNotALinkedTable(name, columns);\n if (why !== undefined) throw new SheetDocumentError(why);\n const whyNotKey = Sheet.whyNotAKey(name, columns, key);\n if (whyNotKey !== undefined) throw new SheetDocumentError(whyNotKey);\n return new SheetDocumentTable(name, columns, key);\n}\n\nfunction readCell(element: JsonElement, version: number): SheetDocumentCell {\n if (element.kind !== 'object') throw new SheetDocumentError('A cell is not a JSON object.');\n let address: CellAddress | undefined;\n let entry: Entry | undefined;\n let format: NumberFormat | undefined;\n let alignment: HorizontalAlignment | undefined;\n let font: CellFont | undefined;\n let fill: CellFill | undefined;\n let borders: CellBorders | undefined;\n const single = (next: Entry): Entry => {\n if (entry !== undefined) throw new SheetDocumentError('A cell holds more than one Entry.');\n return next;\n };\n for (const [key, value] of element.properties) {\n switch (key) {\n case 'at': {\n const at = value.kind === 'string' ? CellAddress.tryParse(value.value) : undefined;\n if (at === undefined) throw new SheetDocumentError(`'${jsonText(value)}' is not a cell address.`);\n address = at;\n break;\n }\n case 'number': {\n const n = jsonDouble(value);\n if (n === undefined) throw new SheetDocumentError(`'${jsonText(value)}' is not a number.`);\n entry = single(Entry.fromValue(Value.fromNumber(n)));\n break;\n }\n case 'text':\n if (value.kind !== 'string') throw new SheetDocumentError(`'${jsonText(value)}' is not text.`);\n entry = single(Entry.fromValue(Value.fromText(value.value)));\n break;\n case 'boolean':\n if (value.kind !== 'true' && value.kind !== 'false') throw new SheetDocumentError(`'${jsonText(value)}' is not a boolean.`);\n entry = single(Entry.fromValue(Value.fromBoolean(value.kind === 'true')));\n break;\n case 'error': {\n const error = value.kind === 'string' ? parseTypedError(value.value) : undefined;\n if (error === undefined) throw new SheetDocumentError(`'${jsonText(value)}' is not an Error Value a cell can hold.`);\n entry = single(Entry.fromValue(Value.fromError(error)));\n break;\n }\n case 'formula': {\n if (value.kind !== 'string') throw new SheetDocumentError(`'${jsonText(value)}' is not a Formula.`);\n let formula: Entry;\n try {\n formula = Entry.fromFormula(value.value);\n } catch (e) {\n if (e instanceof FormulaSyntaxError) throw new SheetDocumentError(e.message, { cause: e });\n throw e;\n }\n entry = single(formula);\n break;\n }\n case 'format':\n format = readFormat(value);\n // Before version 3 a cell's General was no format of its own: no level could show through it.\n if (version < 3 && format.isGeneral) format = undefined;\n break;\n case 'align':\n alignment = readAlignment(value, version >= 3);\n break;\n default:\n if (key === 'font' && version >= 8) font = readFont(value);\n else if (key === 'fill' && version >= 8) fill = readFill(value);\n else if (key === 'borders' && version >= 8) borders = readBorders(value);\n else throw new SheetDocumentError(`'${key}' is not part of a version ${String(version)} cell.`);\n }\n }\n if (address === undefined) throw new SheetDocumentError('A cell has no address.');\n if (entry === undefined && format === undefined && alignment === undefined && font === undefined && fill === undefined && borders === undefined) {\n throw new SheetDocumentError(`The cell ${address.toString()} holds nothing.`);\n }\n return new SheetDocumentCell(address, entry, format, alignment, font, fill, borders);\n}\n", "// The serialisable form of a Workbook (C#'s WorkbookDocument.cs; CONTEXT.md, ADR-0331), read and written as the C#\n// engine reads and writes it.\nimport type { Culture } from './culture';\nimport { equalsIgnoreCase } from './dotnet';\nimport { JsonWriter, jsonInt32, type JsonElement } from './json-element';\nimport { parseDocument, property, SheetDocument } from './sheet-document';\nimport { SheetDocumentError, type SheetDocumentTable } from './sheet-document-parts';\n\n/**\n * The serialisable form of a Workbook (CONTEXT.md, ADR-0331): its Sheets in order, the Sheet shown, its culture and its\n * Linked Tables' declarations, and for each Sheet what a Sheet Document records of it \u2014 never a Value: opening one\n * computes every Value again. The Consumer persists it; ExSheet never does.\n *\n * The document is a format with a version, beside the Sheet Document's. A reader meeting a version it does not know\n * refuses the document rather than guess at it, and so does a reader meeting anything it does not understand\n * (ADR-0048). This engine writes version 1, whose Sheets are recorded as a Sheet Document of the current version\n * records a Sheet. `fromJson` also reads a Sheet Document of every version `SheetDocument.fromJson` reads, as a\n * Workbook of that one Sheet.\n */\nexport class WorkbookDocument {\n /** The version this engine writes. */\n static readonly currentVersion = 1;\n\n /** The oldest version this engine reads. */\n static readonly oldestReadableVersion = 1;\n\n /** The name of the Workbook's declared culture, such as `en-US`; empty for the invariant culture, as .NET names it. */\n readonly culture: string;\n\n /** The name of the Sheet shown, one of `sheets`. */\n readonly shown: string;\n\n /** The Linked Tables declared on the Workbook, in the order they were declared: names, columns and keys only (ADR-0049). */\n readonly linkedTables: readonly SheetDocumentTable[];\n\n /** The Sheets, in the order their tabs stand, each under the Workbook's culture and declaring no Linked Table of its own. */\n readonly sheets: readonly SheetDocument[];\n\n /** @internal */\n constructor(\n culture: string,\n shown: string,\n linkedTables: readonly SheetDocumentTable[],\n sheets: readonly SheetDocument[],\n ) {\n this.culture = culture;\n this.shown = shown;\n this.linkedTables = linkedTables;\n this.sheets = sheets;\n }\n\n /**\n * A Workbook Document built from its Sheets, as a reader of another format builds one (ADR-0330 \u00A73): `sheets` in the\n * order their tabs stand, the one named `shown` shown, under `culture`, declaring no Linked Table. Throws a\n * RangeError when there is no Sheet, two share a name, a Sheet records another culture or declares a Linked Table,\n * or no Sheet is named `shown`. Nothing is guessed.\n */\n static of(culture: Culture, shown: string, sheets: Iterable<SheetDocument>): WorkbookDocument {\n const list: SheetDocument[] = [];\n for (const sheet of sheets) {\n if (list.some(s => equalsIgnoreCase(s.name, sheet.name))) throw new RangeError(`Two Sheets are named '${sheet.name}'.`);\n if (sheet.culture !== culture.name) {\n throw new RangeError(`The Sheet '${sheet.name}' records the culture '${sheet.culture}', not the Workbook's '${culture.name}'.`);\n }\n if (sheet.linkedTables.length > 0) {\n throw new RangeError(`The Sheet '${sheet.name}' declares a Linked Table; a Workbook's Linked Tables are declared on the Workbook.`);\n }\n list.push(sheet);\n }\n if (list.length === 0) throw new RangeError('A Workbook holds at least one Sheet.');\n const shownSheet = list.find(s => equalsIgnoreCase(s.name, shown));\n if (shownSheet === undefined) throw new RangeError(`The Sheet shown, '${shown}', is not one of the Sheets.`);\n return new WorkbookDocument(culture.name, shownSheet.name, [], list);\n }\n\n /** The format version the document is written in: `currentVersion`, whatever it was read from. */\n get version(): number {\n return WorkbookDocument.currentVersion;\n }\n\n /** Writes the document as JSON, as the C# engine writes it. */\n toJson(): string {\n const json = new JsonWriter();\n json.startObject();\n json.number('workbookVersion', WorkbookDocument.currentVersion);\n json.string('culture', this.culture);\n json.string('shown', this.shown);\n SheetDocument.writeTables(json, this.linkedTables);\n json.startArray('sheets');\n for (const sheet of this.sheets) {\n json.startObject();\n json.string('name', sheet.name);\n sheet.writeBody(json);\n json.endObject();\n }\n json.endArray();\n json.endObject();\n return json.toString();\n }\n\n /**\n * Reads a document written by `toJson`, or by the C# engine, or a Sheet Document of any version\n * `SheetDocument.fromJson` reads, as a Workbook of that one Sheet, shown, with its Linked Tables declared on the\n * Workbook (ADR-0331). Throws a SheetDocumentError when the version is not one this engine reads, the document holds\n * anything its version does not define, it holds no Sheet or two of one name, or the Sheet it shows is not one of\n * them. Nothing is guessed.\n */\n static fromJson(text: string): WorkbookDocument {\n const root = parseDocument(text, 'Workbook Document');\n if (root.kind !== 'object') throw new SheetDocumentError('A Workbook Document is a JSON object.');\n const version = property(root, 'workbookVersion');\n if (version === undefined) {\n // No Workbook version: a Sheet Document, read as one, or refused as one is.\n const sheet = SheetDocument.fromJson(text);\n return new WorkbookDocument(sheet.culture, sheet.name, sheet.linkedTables,\n [new SheetDocument(sheet.culture, sheet.name, [], sheet.cells, sheet)]);\n }\n const number = jsonInt32(version);\n if (number === undefined) throw new SheetDocumentError(\"The Workbook Document's version is not a number.\");\n if (number < WorkbookDocument.oldestReadableVersion || number > WorkbookDocument.currentVersion) {\n throw new SheetDocumentError(\n `The Workbook Document is version ${String(number)}; this engine reads versions ${String(WorkbookDocument.oldestReadableVersion)} to ${String(WorkbookDocument.currentVersion)}.`,\n { documentVersion: number });\n }\n let culture: string | undefined;\n let shown: string | undefined;\n let tables: SheetDocumentTable[] = [];\n let sheetsElement: (JsonElement & { kind: 'array' }) | undefined;\n for (const [key, value] of root.properties) {\n switch (key) {\n case 'workbookVersion':\n break;\n case 'culture':\n if (value.kind !== 'string') throw new SheetDocumentError('The culture is not a string.');\n culture = value.value;\n break;\n case 'shown':\n if (value.kind !== 'string') throw new SheetDocumentError('The Sheet shown is not a string.');\n shown = value.value;\n break;\n case 'linkedTables':\n tables = SheetDocument.readTables(value, SheetDocument.currentVersion);\n break;\n case 'sheets':\n if (value.kind !== 'array') throw new SheetDocumentError('The Sheets are not an array.');\n sheetsElement = value;\n break;\n default:\n throw new SheetDocumentError(`'${key}' is not part of a version ${String(number)} Workbook Document.`);\n }\n }\n if (culture === undefined) throw new SheetDocumentError('The Workbook Document records no culture.');\n SheetDocument.resolveCulture(culture);\n if (sheetsElement === undefined) throw new SheetDocumentError('The Workbook Document records no Sheets.');\n const sheets: SheetDocument[] = [];\n for (const element of sheetsElement.items) {\n const sheet = SheetDocument.readSheetOfWorkbook(element, culture);\n if (sheets.some(s => equalsIgnoreCase(s.name, sheet.name))) throw new SheetDocumentError(`Two Sheets of the Workbook Document are named '${sheet.name}'.`);\n sheets.push(sheet);\n }\n if (sheets.length === 0) throw new SheetDocumentError('The Workbook Document records no Sheets.');\n if (shown === undefined) throw new SheetDocumentError('The Workbook Document records no Sheet shown.');\n const wanted = shown;\n const shownSheet = sheets.find(s => equalsIgnoreCase(s.name, wanted));\n if (shownSheet === undefined) throw new SheetDocumentError(`The Sheet shown, '${shown}', is not a Sheet of the Workbook Document.`);\n return new WorkbookDocument(culture, shownSheet.name, tables, sheets);\n }\n}\n", "// The Workbook Documents a Sheet raises, written for an adapter as what changed since the one written before (ADR-0370\n// section 1's note of 2026-10-30), which ExSheet.Engine's DocumentChangesReader reads against the document it read\n// before. A document of thousands of cells changes a few at an edit; written whole, every edit crossed all of them\n// and .NET read every Formula again.\nimport { SheetDocument } from './sheet-document';\nimport type { SheetDocumentCell } from './sheet-document-parts';\nimport { WorkbookDocument } from './workbook-document';\n\n/**\n * Writes each Workbook Document raised as what changed since the one it wrote before: an object of three keys,\n * `\"number\"`, counting the documents written from 1, `\"workbook\"`, a Workbook Document recording every part whole but\n * the cells, and `\"emptied\"`, one entry per Sheet in the same order. A Sheet whose entry is `null` holds all its cells;\n * any other holds only the cells that changed since the Sheet of its name was written, in the document numbered one\n * less, and its entry lists the addresses of the cells emptied since. The first document, and the first after\n * `forget`, are written whole.\n */\nexport class DocumentChanges {\n // Each Sheet last written, by name, and its cells, by their address's key.\n #written = new Map<string, ReadonlyMap<number, SheetDocumentCell>>();\n #number = 0;\n\n /** Forgets what was written, as when its reader stops reading: the next document is written whole. */\n forget(): void {\n this.#written = new Map();\n }\n\n /** `document` as what changed since the document written before it, as JSON. */\n write(document: WorkbookDocument): string {\n const written = new Map<string, ReadonlyMap<number, SheetDocumentCell>>();\n const emptied: (readonly string[] | null)[] = [];\n const sheets = document.sheets.map(sheet => {\n const before = this.#written.get(sheet.name);\n const now = new Map<number, SheetDocumentCell>();\n const changed: SheetDocumentCell[] = [];\n for (const cell of sheet.cells) {\n now.set(cell.address.key, cell);\n const was = before?.get(cell.address.key);\n if (was === undefined || !recordsAlike(was, cell)) changed.push(cell);\n }\n written.set(sheet.name, now);\n if (before === undefined) {\n emptied.push(null);\n return sheet;\n }\n const gone: string[] = [];\n for (const [key, cell] of before) if (!now.has(key)) gone.push(cell.address.toString());\n emptied.push(gone);\n return new SheetDocument(sheet.culture, sheet.name, sheet.linkedTables, changed, sheet);\n });\n this.#written = written;\n const changes = new WorkbookDocument(document.culture, document.shown, document.linkedTables, sheets);\n this.#number += 1;\n return `{\"number\":${String(this.#number)},\"workbook\":${changes.toJson()},\"emptied\":${JSON.stringify(emptied)}}`;\n }\n}\n\n// Whether two cells of one address record the same: at once where they hold the same parts, as a cell the Sheet left\n// alone does, and otherwise by what each writes.\nfunction recordsAlike(a: SheetDocumentCell, b: SheetDocumentCell): boolean {\n if (a.entry === b.entry && a.numberFormat === b.numberFormat && a.alignment === b.alignment && a.font === b.font && a.fill === b.fill\n && a.borders === b.borders) {\n return true;\n }\n return recorded(a) === recorded(b);\n}\n\n// What a cell writes, written once for each cell object.\nconst cellTexts = new WeakMap<SheetDocumentCell, string>();\nfunction recorded(cell: SheetDocumentCell): string {\n let text = cellTexts.get(cell);\n if (text === undefined) {\n text = SheetDocument.cellJson(cell);\n cellTexts.set(cell, text);\n }\n return text;\n}\n", "import { CellAddress, columnCount, rowCount } from './cell-address';\nimport { CellRange } from './cell-range';\n\n/**\n * How many rows and columns the Sheets of a Workbook hold (ADR-0460): Excel's 1,048,576 \u00D7 16,384 unless a Consumer\n * gives fewer. It bounds where a cell may hold an Entry and what the user reaches, not the address space: a Reference\n * past it is still a Reference, to a cell that is empty and can hold nothing.\n */\nexport class SheetSize {\n /** Excel's full size, 1,048,576 rows by 16,384 columns (`A1` to `XFD1048576`): what a Sheet holds unless given another. */\n static readonly excel = new SheetSize(rowCount, columnCount);\n\n /** How many rows, from 1 to 1,048,576. */\n readonly rows: number;\n\n /** How many columns, from 1 to 16,384. */\n readonly columns: number;\n\n /** A size of `rows` by `columns`; one of no rows or no columns, or larger than Excel's, is refused with a `RangeError`. */\n constructor(rows: number, columns: number) {\n if (!Number.isInteger(rows) || rows < 1 || rows > rowCount) {\n throw new RangeError(`A Sheet holds from 1 to 1,048,576 rows; ${String(rows)} is not that.`);\n }\n if (!Number.isInteger(columns) || columns < 1 || columns > columnCount) {\n throw new RangeError(`A Sheet holds from 1 to 16,384 columns; ${String(columns)} is not that.`);\n }\n this.rows = rows;\n this.columns = columns;\n }\n\n /** The last cell inside the size: `XFD1048576` for Excel's, `J10` for ten by ten. */\n get lastCell(): CellAddress {\n return new CellAddress(this.rows - 1, this.columns - 1);\n }\n\n /** Whether `address` lies inside the size. */\n contains(address: CellAddress): boolean {\n return address.row < this.rows && address.column < this.columns;\n }\n\n /** Whether a block of `rows` \u00D7 `columns` with its top-left cell at `origin` lies wholly inside the size. */\n holds(origin: CellAddress, rows: number, columns: number): boolean {\n return origin.row + rows <= this.rows && origin.column + columns <= this.columns;\n }\n\n /**\n * `range` as it stands inside the size, or `undefined` when it runs past it. Whole columns and whole rows are\n * Excel's lines, inside when their columns or rows are, and are answered as long as the size's: `B:B` of ten rows\n * is `B1:B10`.\n */\n fit(range: CellRange): CellRange | undefined {\n const last = new CellAddress(range.isWholeColumns ? this.rows - 1 : range.last.row, range.isWholeRows ? this.columns - 1 : range.last.column);\n return this.contains(last) && this.contains(range.first) ? new CellRange(range.first, last) : undefined;\n }\n\n /** Whether the two are the same size. */\n equals(other: SheetSize): boolean {\n return this.rows === other.rows && this.columns === other.columns;\n }\n}\n", "// One user operation on a Sheet, described before it is done (C#'s SheetEdit.cs; ADR-0048, ADR-0331).\nimport { CellAddress } from './cell-address';\nimport type { HorizontalAlignment } from './cell-format';\nimport { CellFormatChange } from './cell-format-change';\nimport { CellRange } from './cell-range';\nimport { StructuralEdit } from './formulas/structural-edit';\nimport { elementAt, defined } from './must';\nimport { NumberFormat } from './number-format';\nimport { Sheet, type AddressedState, type EntryOfCell, type FillDirection, type RewrittenEntry, type SheetBlock, SheetStep, type TypedCell } from './sheet';\nimport { SheetChange, SheetColumnWidth, SheetRefusal, SheetRefusedError } from './sheet-change';\nimport { SheetSize } from './sheet-size';\nimport type { Workbook } from './workbook';\n\nconst alignments: readonly HorizontalAlignment[] = ['general', 'left', 'center', 'right'];\nconst fillDirections: readonly FillDirection[] = ['down', 'right', 'up', 'left'];\n\n/**\n * One user operation on a Sheet, described before it is done: an edit, a paste, a Cell Format, an insertion or\n * deletion, a fill, or an operation on the Workbook's Sheets. `Workbook.do` does it and returns the one step that\n * undoes it (ADR-0048): a paste over a thousand cells is one step.\n */\nexport abstract class SheetEdit {\n /** @internal */\n protected constructor() {\n // Only this module's edits derive from it, as C#'s private protected constructor allows.\n }\n\n /** Text typed into one cell, read under the Sheet's culture (`Sheet.enter`). */\n static enter(address: CellAddress, typed: string): SheetEdit {\n return SheetEdit.enterMany([[address, typed]]);\n }\n\n /** Several typed texts as one operation, such as a paste from another program. */\n static enterMany(typed: Iterable<TypedCell>): SheetEdit {\n const list = [...typed];\n return new CellsEdit(list.map(([a]) => a), sheet => sheet.enterMany(list));\n }\n\n /** Entries set or cleared (`undefined`) as one operation. */\n static setEntries(entries: Iterable<EntryOfCell>): SheetEdit {\n const list = [...entries];\n return new CellsEdit(list.map(([a]) => a), sheet => sheet.setEntries(list));\n }\n\n /** A Number Format set on cells; `undefined` is General. */\n static setNumberFormatOf(addresses: Iterable<CellAddress>, format: NumberFormat | undefined): SheetEdit {\n const list = [...addresses];\n return new CellsEdit(list, sheet => sheet.setNumberFormatOf(list, format));\n }\n\n /** A horizontal alignment set on cells. */\n static setAlignmentOf(addresses: Iterable<CellAddress>, alignment: HorizontalAlignment): SheetEdit {\n const list = [...addresses];\n return new CellsEdit(list, sheet => sheet.setAlignmentOf(list, alignment));\n }\n\n /**\n * A Number Format set on a range (`Sheet.setNumberFormat`); `undefined` is General. Whole columns and whole rows\n * are recorded as one entry each, and undoing the step puts back every level exactly (ADR-0047).\n */\n static setNumberFormat(range: CellRange, format: NumberFormat | undefined): SheetEdit {\n return new CellFormatEdit(range, new CellFormatChange({ numberFormat: format ?? NumberFormat.general }));\n }\n\n /** A horizontal alignment set on a range, recorded as `setNumberFormat` records a Number Format. Throws a RangeError for one that is not an alignment. */\n static setAlignment(range: CellRange, alignment: HorizontalAlignment): SheetEdit {\n if (!alignments.includes(alignment)) throw new RangeError(`Not an alignment: ${alignment}.`);\n return new CellFormatEdit(range, new CellFormatChange({ alignment }));\n }\n\n /**\n * The parts `change` names set on several ranges as one step (ADR-0046, ADR-0071), such as a selection of several\n * rectangles, whole columns and whole rows among them. The change's Borders are relative to each range, so each\n * range gets its own outline. Undoing the step puts back every level exactly. Throws when there is no range, or the\n * change sets nothing.\n */\n static setCellFormat(ranges: Iterable<CellRange>, change: CellFormatChange): SheetEdit {\n return new CellFormatsEdit(Sheet.checkCellFormat(ranges, change), change);\n }\n\n /**\n * A width the user set on every column `columns` spans, in characters (`Sheet.setColumnWidth`): set by the user, so\n * an entry never widens them; `undefined` puts them back at the default width. Undoing the step puts back every\n * column's width, and its kind, exactly (ADR-0046). Throws a RangeError for a width not more than 0 and at most 255.\n */\n static setColumnWidth(columns: CellRange, width: number | undefined): SheetEdit {\n const checked = Sheet.checkColumnWidth(width);\n return new ColumnWidthEdit(columns, checked === undefined ? undefined : new SheetColumnWidth(checked, 'setByUser'));\n }\n\n /**\n * A width an entry widened every column `columns` spans to, in characters (`Sheet.setAutomaticColumnWidth`):\n * widened by entry, and widened again by a longer entry (ADR-0046, 2026-09-28; CW-028). Undoing the step puts back\n * every column's width, and its kind, exactly.\n */\n static setAutomaticColumnWidth(columns: CellRange, width: number): SheetEdit {\n const checked = Sheet.checkColumnWidth(width);\n if (checked === undefined) throw new Error('Internal: a width checked is a width.');\n return new ColumnWidthEdit(columns, new SheetColumnWidth(checked, 'widenedByEntry'));\n }\n\n /** Rows inserted (`Sheet.insertRows`). */\n static insertRows(row: number, count = 1): SheetEdit {\n return new StructureEdit(new StructuralEdit('rows', row, count, true));\n }\n\n /** Rows deleted (`Sheet.deleteRows`). */\n static deleteRows(row: number, count = 1): SheetEdit {\n return new StructureEdit(new StructuralEdit('rows', row, count, false));\n }\n\n /** Columns inserted (`Sheet.insertColumns`). */\n static insertColumns(column: number, count = 1): SheetEdit {\n return new StructureEdit(new StructuralEdit('columns', column, count, true));\n }\n\n /** Columns deleted (`Sheet.deleteColumns`). */\n static deleteColumns(column: number, count = 1): SheetEdit {\n return new StructureEdit(new StructuralEdit('columns', column, count, false));\n }\n\n /**\n * A block copied inside ExSheet, pasted (ADR-0048, ADR-0071): Entries with their relative References shifted by the\n * distance pasted (a Reference shifted off the Sheet is `#REF!`, as in Excel), Cell Formats with them.\n *\n * - At a cell, its top-left cell lands there. A block that would run past the Sheet's edge is refused by name (ADR-0050).\n * - Over a range, it is repeated to fill it, as Excel repeats a paste over a selection that is a whole multiple of\n * the block's size.\n * - Over several ranges, it is pasted over each as one operation (ADR-0014, ADR-0180); a cell two ranges share is\n * written once, with what the later range gives it.\n *\n * Throws when there is no range, or a range is not a whole multiple of the block in both directions.\n */\n static paste(block: SheetBlock, at: CellAddress | CellRange | Iterable<CellRange>): SheetEdit {\n if (at instanceof CellAddress) {\n // The edge is the Sheet's own, Excel's or the Workbook's size (ADR-0460), so it is asked of the Sheet the paste is done on.\n const fits = SheetSize.excel.holds(at, block.rowCount, block.columnCount);\n return new PlacedEdit(sheet => sheet.offSheet(at, block.rowCount, block.columnCount), () => Sheet.place(block, at),\n fits ? [new CellRange(at, new CellAddress(at.row + block.rowCount - 1, at.column + block.columnCount - 1))] : []);\n }\n if (at instanceof CellRange) {\n checkWholeMultiple(block, at);\n return new PlacedEdit(() => undefined, () => [...tiles(block, at)].flatMap(origin => [...Sheet.place(block, origin)]), [at]);\n }\n const ranges = [...at];\n if (ranges.length === 0) throw new RangeError('There is no range to paste over.');\n for (const target of ranges) checkWholeMultiple(block, target);\n return new PlacedEdit(() => undefined, () => {\n const states = new Map<number, AddressedState>();\n for (const target of ranges) {\n for (const origin of tiles(block, target)) {\n for (const placed of Sheet.place(block, origin)) {\n // A later range's state replaces an earlier one's where it stood, as a C# Dictionary's indexer does.\n states.set(placed.address.key, placed);\n }\n }\n }\n return [...states.values()];\n }, ranges);\n }\n\n /**\n * Text pasted from another program, each field taken as if the user had typed it into its cell under the Sheet's\n * culture: `=A1+1` becomes a Formula and `1,234` a number under `en-US` (ADR-0048). A field beginning with `=` that\n * cannot be read as a Formula is taken as text, as Excel takes a pasted `=1+`. `fields` is rectangular, rows of\n * columns, with the top-left field at `origin`; an empty field clears its cell. A block that would run past the\n * Sheet's edge is refused by name (ADR-0050). Throws when the rows are not all the same length, or there are none.\n */\n static pasteText(fields: readonly (readonly string[])[], origin: CellAddress): SheetEdit {\n const first = fields[0];\n if (first === undefined || first.length === 0) throw new RangeError('Nothing to paste.');\n const width = first.length;\n if (fields.some(row => row.length !== width)) throw new RangeError('The pasted fields are not rectangular.');\n // Past Excel's edge, no address can be made; past the Workbook's size, the Sheet it is done on refuses it (ADR-0460).\n if (!SheetSize.excel.holds(origin, fields.length, width)) {\n return new RefusedEdit(new SheetRefusal('blockWouldLeaveSheet',\n `A block of ${String(fields.length)} \u00D7 ${String(width)} at ${origin.toString()} would run past the Sheet's edge (${SheetSize.excel.lastCell.toString()}).`));\n }\n const typed: TypedCell[] = [];\n fields.forEach((row, r) => {\n row.forEach((field, c) => typed.push([new CellAddress(origin.row + r, origin.column + c), field]));\n });\n return SheetEdit.pasteFields(typed);\n }\n\n /**\n * Text pasted from another program, given field by field, each taken as `pasteText` takes it; with `entries`,\n * some cells carry their exact Value, set as they are, such as an invariant number with every digit its double\n * holds (ADR-0048, ADR-0050 item 10). The fields are read first, so a format typing gives a cell is given before\n * the Entries are set; a cell named in both takes its Entry. One operation: one step, and one change (ADR-0180).\n */\n static pasteFields(fields: Iterable<TypedCell>, entries?: Iterable<EntryOfCell>): SheetEdit {\n const typed = [...fields];\n if (entries === undefined) return new CellsEdit(typed.map(([a]) => a), sheet => sheet.enterMany(typed, true));\n const exact = [...entries];\n return new CellsEdit([...typed.map(([a]) => a), ...exact.map(([a]) => a)],\n sheet => SheetChange.merge([sheet.enterMany(typed, true), sheet.setEntries(exact)]));\n }\n\n /**\n * A Fill Intent resolved as Excel fills (ADR-0050, item 5): `target` extends `source` in `direction`, given as the\n * new cells alone or as the whole extended range. Formulas are copied with their References shifted, two or more\n * numbers continue as Excel's linear trend, a single date goes on by day, a single number in a line of a fill from\n * whole columns or whole rows goes on by one, and any other single number, text without a pattern, booleans, Error\n * Values and blanks are copied. Any other pattern is refused (`fillPatternNotSupported`), never filled with copies;\n * `Workbook.check` says so before anything is written.\n */\n static fill(source: CellRange, target: CellRange, direction: FillDirection): SheetEdit {\n if (!fillDirections.includes(direction)) throw new RangeError(`Not a fill direction: ${direction}.`);\n return new FillEdit(source, target, direction, false);\n }\n\n /**\n * Excel's fill keys, Ctrl+D and Ctrl+R (ADR-0035; ADR-0050, item 5, 2026-09-28): `target` extends `source` in\n * `direction` as a copy of it, repeated, and never as a series. Only a target that does not extend the source along\n * one axis is refused.\n */\n static fillCopy(source: CellRange, target: CellRange, direction: FillDirection): SheetEdit {\n if (!fillDirections.includes(direction)) throw new RangeError(`Not a fill direction: ${direction}.`);\n return new FillEdit(source, target, direction, true);\n }\n\n /**\n * Excel's Ctrl+Enter (ADR-0050, item 5, 2026-09-28): `typed`, read under the Sheet's culture as entered in\n * `enteredAt`, written into every cell of `targets` as one operation. A Formula is written as entered in\n * `enteredAt`, and into every other cell with its relative References shifted by that cell's offset from it, by the\n * rule `fillCopy` shifts them. Anything else is entered into every cell as typed. Overlapping ranges write their\n * shared cells once. Throws when there is no target, or `enteredAt` lies outside every target; doing it throws a\n * FormulaSyntaxError for a Formula that cannot be read, and nothing changes.\n */\n static enterInto(targets: Iterable<CellRange>, enteredAt: CellAddress, typed: string): SheetEdit {\n const ranges = [...targets];\n if (ranges.length === 0) throw new RangeError('There is no cell to enter into.');\n if (!ranges.some(range => range.contains(enteredAt))) throw new RangeError(`${enteredAt.toString()} is not inside any target range.`);\n const seen = new Set<number>();\n const cells: CellAddress[] = [];\n for (const range of ranges) {\n for (const cell of range.cells()) {\n if (seen.has(cell.key)) continue;\n seen.add(cell.key);\n cells.push(cell);\n }\n }\n return new CellsEdit(cells, sheet => sheet.enterInto(cells, enteredAt, typed), focusFirst(ranges, enteredAt));\n }\n\n /**\n * The Sheet renamed (ADR-0046, ADR-0331): every Reference on every Sheet qualified with the old name is rewritten to\n * the new one, as Excel rewrites them. A rename is a change, so `RAND` and `RANDBETWEEN` draw again (ADR-0180); a\n * rename to the name the Sheet already has changes nothing. A name another Sheet has, without regard to case, is\n * refused (`sheetNameTaken`). Throws a RangeError for a name a Sheet cannot have.\n */\n static rename(name: string): SheetEdit {\n return new RenameEdit(Sheet.checkName(name));\n }\n\n /**\n * A new, empty Sheet inserted beside the Sheet the edit is done on \u2014 after it, as Excel's `+` button adds one, or\n * before it, as Shift+F11 does \u2014 named `name`, or `Sheet` and the next number of the Workbook's count of the Sheets\n * it has made, as Excel numbers one (ADR-0331). Undoing it takes the Sheet out again, and gives its number back. The\n * step's Sheet is the new Sheet.\n */\n static insertSheet(name?: string, before = false): SheetEdit {\n return new InsertSheetEdit(name === undefined ? undefined : Sheet.checkName(name), before);\n }\n\n /**\n * The Sheet deleted (ADR-0331): every Reference on another Sheet qualified with its name becomes `#REF!`. Undoing it\n * gives back the Sheet and those Formulas exactly. The Workbook's last Sheet is not deleted (`lastSheet`).\n */\n static deleteSheet(): SheetEdit {\n return new DeleteSheetEdit();\n }\n\n /** The Sheet moved to `index` in the order of the Sheets after the move (ADR-0331). Throws a RangeError for a negative index. */\n static moveSheet(index: number): SheetEdit {\n if (!Number.isInteger(index) || index < 0) throw new RangeError(`${String(index)} is not a place in the order.`);\n return new MoveSheetEdit(index);\n }\n\n /**\n * A copy of the Sheet \u2014 its Entries, Cell Formats and column widths \u2014 named as Excel names one, `Name (2)`, placed at\n * `index` in the order after the copy, or just after the Sheet (ADR-0331). A Reference in it qualified with the\n * Sheet's name names the copy. The step's Sheet is the copy.\n */\n static copySheet(index?: number): SheetEdit {\n if (index !== undefined && (!Number.isInteger(index) || index < 0)) throw new RangeError(`${String(index)} is not a place in the order.`);\n return new CopySheetEdit(index);\n }\n\n /** Whether the Sheet would refuse this operation as it stands, and why. Changes nothing. @internal */\n check(_sheet: Sheet): SheetRefusal | undefined {\n return undefined;\n }\n\n /** Does the operation on `sheet`, checked already, and answers the step that undoes it. @internal */\n abstract apply(sheet: Sheet): SheetStep;\n\n /** The ranges the operation changes on its Sheet: what an undo or a redo of it selects (ADR-0331 \u00A73). None for an operation on the Sheets. @internal */\n get ranges(): readonly CellRange[] {\n return [];\n }\n\n /** The smallest range holding every one of `cells`; none for no cells. @internal */\n static bounding(cells: Iterable<CellAddress>): CellRange[] {\n let top = Number.MAX_SAFE_INTEGER;\n let left = Number.MAX_SAFE_INTEGER;\n let bottom = -1;\n let right = -1;\n for (const cell of cells) {\n top = Math.min(top, cell.row);\n left = Math.min(left, cell.column);\n bottom = Math.max(bottom, cell.row);\n right = Math.max(right, cell.column);\n }\n return bottom < 0 ? [] : [new CellRange(new CellAddress(top, left), new CellAddress(bottom, right))];\n }\n}\n\nfunction checkWholeMultiple(block: SheetBlock, target: CellRange): void {\n if (target.rowCount % block.rowCount !== 0 || target.columnCount % block.columnCount !== 0) {\n throw new RangeError(`A ${String(target.rowCount)} \u00D7 ${String(target.columnCount)} target is not a whole multiple of a ${String(block.rowCount)} \u00D7 ${String(block.columnCount)} block.`);\n }\n}\n\n/** The top-left cell of each copy of `block` that fills `target`. */\nfunction* tiles(block: SheetBlock, target: CellRange): Generator<CellAddress> {\n for (let row = target.first.row; row <= target.last.row; row += block.rowCount) {\n for (let column = target.first.column; column <= target.last.column; column += block.columnCount) yield new CellAddress(row, column);\n }\n}\n\n/** `ranges` with the one holding `cell` first. */\nfunction focusFirst(ranges: readonly CellRange[], cell: CellAddress): readonly CellRange[] {\n const at = ranges.findIndex(range => range.contains(cell));\n return at <= 0 ? ranges : [elementAt(ranges, at), ...ranges.filter((_, i) => i !== at)];\n}\n\n/** An operation on cells in place: undone by putting back what those cells recorded before, redone by what they recorded after. */\nclass CellsEdit extends SheetEdit {\n readonly #touched: readonly CellAddress[];\n readonly #apply: (sheet: Sheet) => SheetChange;\n #ranges: readonly CellRange[] | undefined;\n\n constructor(touched: readonly CellAddress[], apply: (sheet: Sheet) => SheetChange, ranges?: readonly CellRange[]) {\n super();\n this.#touched = touched;\n this.#apply = apply;\n this.#ranges = ranges;\n }\n\n // The cells it names, unless it was given the ranges they were named from.\n override get ranges(): readonly CellRange[] {\n this.#ranges ??= SheetEdit.bounding(this.#touched);\n return this.#ranges;\n }\n\n apply(sheet: Sheet): SheetStep {\n const distinct = new Map<number, CellAddress>();\n for (const address of this.#touched) if (!distinct.has(address.key)) distinct.set(address.key, address);\n const addresses = [...distinct.values()];\n const before = sheet.record(addresses);\n const change = this.#apply(sheet);\n const after = sheet.record(addresses);\n return new SheetStep(sheet, change, s => s.restore(before), s => s.restore(after));\n }\n}\n\n/** Cells written whole \u2014 Entry and Cell Format \u2014 such as a paste of Entries: the states are computed when the edit is done, and a refusal known in advance stops it. */\nclass PlacedEdit extends SheetEdit {\n readonly #refusal: (sheet: Sheet) => SheetRefusal | undefined;\n readonly #states: () => Iterable<AddressedState>;\n readonly #ranges: readonly CellRange[];\n\n constructor(refusal: (sheet: Sheet) => SheetRefusal | undefined, states: () => Iterable<AddressedState>, ranges: readonly CellRange[]) {\n super();\n this.#refusal = refusal;\n this.#states = states;\n this.#ranges = ranges;\n }\n\n override check(sheet: Sheet): SheetRefusal | undefined {\n return this.#refusal(sheet);\n }\n\n override get ranges(): readonly CellRange[] {\n return this.#ranges;\n }\n\n apply(sheet: Sheet): SheetStep {\n const placed = sheet.settle(this.#states());\n return new CellsEdit(placed.map(p => p.address), s => s.restore(placed)).apply(sheet);\n }\n}\n\n/** A fill, planned against the Sheet as it stands when it is checked or done. */\nclass FillEdit extends SheetEdit {\n readonly source: CellRange;\n\n readonly target: CellRange;\n\n readonly direction: FillDirection;\n\n readonly copyOnly: boolean;\n\n constructor(source: CellRange, target: CellRange, direction: FillDirection, copyOnly: boolean) {\n super();\n this.source = source;\n this.target = target;\n this.direction = direction;\n this.copyOnly = copyOnly;\n }\n\n override check(sheet: Sheet): SheetRefusal | undefined {\n return sheet.planFill(this.source, this.target, this.direction, this.copyOnly).refusal;\n }\n\n // The source and what it was extended over, as Excel's fill leaves them selected.\n override get ranges(): readonly CellRange[] {\n const { source, target } = this;\n return [new CellRange(\n new CellAddress(Math.min(source.first.row, target.first.row), Math.min(source.first.column, target.first.column)),\n new CellAddress(Math.max(source.last.row, target.last.row), Math.max(source.last.column, target.last.column)))];\n }\n\n apply(sheet: Sheet): SheetStep {\n const plan = sheet.planFill(this.source, this.target, this.direction, this.copyOnly);\n if (plan.refusal !== undefined) throw new SheetRefusedError(plan.refusal);\n // From whole columns or whole rows: the target's own formats, then its cells.\n if (plan.levels !== undefined) return sheet.doFillWithLevels(plan);\n const settled = sheet.settle(plan.states);\n return new CellsEdit(settled.map(s => s.address), s => s.restore(settled)).apply(sheet);\n }\n}\n\n/** A change set on a range: undone by the row and column levels and the cells it touched put back exactly, redone by setting it again. */\nclass CellFormatEdit extends SheetEdit {\n readonly range: CellRange;\n\n readonly change: CellFormatChange;\n\n constructor(range: CellRange, change: CellFormatChange) {\n super();\n this.range = range;\n this.change = change;\n }\n\n override get ranges(): readonly CellRange[] {\n return [this.range];\n }\n\n apply(sheet: Sheet): SheetStep {\n const outcome = sheet.applyCellFormat(this.range, this.change);\n return new SheetStep(sheet, outcome.change, s => s.undoCellFormat(outcome), s => s.applyCellFormat(this.range, this.change).change);\n }\n}\n\n/** A change set on several ranges: undone by every range's part undone in reverse, redone by setting it again. */\nclass CellFormatsEdit extends SheetEdit {\n readonly #ranges: readonly CellRange[];\n\n readonly change: CellFormatChange;\n\n constructor(ranges: readonly CellRange[], change: CellFormatChange) {\n super();\n this.change = change;\n this.#ranges = ranges;\n }\n\n override get ranges(): readonly CellRange[] {\n return this.#ranges;\n }\n\n apply(sheet: Sheet): SheetStep {\n const outcome = sheet.applyCellFormats(this.#ranges, this.change);\n return new SheetStep(sheet, outcome.change, s => s.undoCellFormats(outcome), s => s.applyCellFormats(this.#ranges, this.change).change);\n }\n}\n\n/** A width set on columns: undone by every column's width put back, redone by the widths it left. */\nclass ColumnWidthEdit extends SheetEdit {\n readonly columns: CellRange;\n\n readonly width: SheetColumnWidth | undefined;\n\n constructor(columns: CellRange, width: SheetColumnWidth | undefined) {\n super();\n this.columns = columns;\n this.width = width;\n }\n\n override get ranges(): readonly CellRange[] {\n return [this.columns];\n }\n\n apply(sheet: Sheet): SheetStep {\n const { change, before } = sheet.applyColumnWidth(this.columns, this.width);\n const after = sheet.columnWidthsNow();\n return new SheetStep(sheet, change, s => s.restoreColumnWidths(before), s => s.restoreColumnWidths(after));\n }\n}\n\n/** A rename: undone by the old name and the Formulas it rewrote put back. */\nclass RenameEdit extends SheetEdit {\n readonly name: string;\n\n constructor(name: string) {\n super();\n this.name = name;\n }\n\n override check(sheet: Sheet): SheetRefusal | undefined {\n return sheet.workbook.nameTaken(this.name, sheet);\n }\n\n apply(sheet: Sheet): SheetStep {\n const outcome = sheet.applyRename(this.name);\n return new SheetStep(sheet, outcome.change, s => s.undoRename(outcome), s => s.applyRename(this.name).change);\n }\n}\n\n/** What a Workbook operation changed on the Sheet it names, and how to undo and redo it. @internal */\nexport interface WorkbookEditDone {\n readonly sheet: Sheet;\n readonly change: SheetChange;\n readonly undo: () => SheetChange;\n readonly redo: () => SheetChange;\n}\n\n/** An operation on the Workbook's Sheets rather than on one Sheet's cells (ADR-0331). @internal */\nexport abstract class WorkbookEdit extends SheetEdit {\n abstract checkIn(workbook: Workbook, sheet: Sheet): SheetRefusal | undefined;\n\n abstract applyIn(workbook: Workbook, sheet: Sheet): WorkbookEditDone;\n\n override check(sheet: Sheet): SheetRefusal | undefined {\n return this.checkIn(sheet.workbook, sheet);\n }\n\n apply(sheet: Sheet): SheetStep {\n const done = this.applyIn(sheet.workbook, sheet);\n return new SheetStep(done.sheet, done.change, () => done.undo(), () => done.redo());\n }\n\n /**\n * A new Sheet's step, an insertion's or a copy's: undone, the Sheet is taken out and the count of Sheets made put\n * back; redone, it is put back and counted again.\n */\n protected static counted(workbook: Workbook, made: Sheet, index: number, numbered: number | undefined, counted: number, change: SheetChange): WorkbookEditDone {\n return {\n sheet: made,\n change,\n undo: () => {\n workbook.uncountSheetMade(counted);\n return workbook.takeOut(made, false, []);\n },\n redo: () => {\n workbook.countSheetMade(numbered);\n return workbook.reinsert(made, index);\n },\n };\n }\n\n protected static checkIndex(index: number, count: number): number {\n if (index > count - 1) throw new RangeError(`${String(index)} is past the last place in the order, ${String(count - 1)}.`);\n return index;\n }\n}\n\nclass InsertSheetEdit extends WorkbookEdit {\n readonly name: string | undefined;\n\n readonly before: boolean;\n\n constructor(name: string | undefined, before: boolean) {\n super();\n this.name = name;\n this.before = before;\n }\n\n checkIn(workbook: Workbook): SheetRefusal | undefined {\n return this.name === undefined ? undefined : workbook.nameTaken(this.name, undefined);\n }\n\n applyIn(workbook: Workbook, sheet: Sheet): WorkbookEditDone {\n const index = workbook.indexOf(sheet) + (this.before ? 0 : 1);\n const numbered = this.name === undefined ? workbook.nextSheetNumber() : undefined;\n const counted = workbook.countSheetMade(numbered);\n const name = this.name ?? workbook.sheetName(defined(numbered, 'the next number'));\n const { sheet: inserted, change } = workbook.insertSheet(index, name);\n return WorkbookEdit.counted(workbook, inserted, index, numbered, counted, change);\n }\n}\n\nclass DeleteSheetEdit extends WorkbookEdit {\n checkIn(workbook: Workbook, sheet: Sheet): SheetRefusal | undefined {\n return workbook.sheets.length === 1\n ? new SheetRefusal('lastSheet', `'${sheet.name}' is the Workbook's only Sheet, and a Workbook holds at least one.`)\n : undefined;\n }\n\n applyIn(workbook: Workbook, sheet: Sheet): WorkbookEditDone {\n const index = workbook.indexOf(sheet);\n const shown = workbook.shown === sheet;\n const rewritten: RewrittenEntry[] = [];\n const change = workbook.takeOut(sheet, true, rewritten);\n return {\n sheet,\n change,\n undo: () => workbook.putBack(sheet, index, rewritten, shown),\n redo: () => {\n rewritten.length = 0;\n return workbook.takeOut(sheet, true, rewritten);\n },\n };\n }\n}\n\nclass MoveSheetEdit extends WorkbookEdit {\n readonly index: number;\n\n constructor(index: number) {\n super();\n this.index = index;\n }\n\n checkIn(): SheetRefusal | undefined {\n return undefined;\n }\n\n applyIn(workbook: Workbook, sheet: Sheet): WorkbookEditDone {\n const to = WorkbookEdit.checkIndex(this.index, workbook.sheets.length);\n const from = workbook.indexOf(sheet);\n if (from === to) return { sheet, change: SheetChange.none, undo: () => SheetChange.none, redo: () => SheetChange.none };\n const rewritten: RewrittenEntry[] = [];\n const change = workbook.move(sheet, to, rewritten);\n return {\n sheet,\n change,\n undo: () => workbook.moveBack(sheet, from, rewritten),\n redo: () => {\n rewritten.length = 0;\n return workbook.move(sheet, to, rewritten);\n },\n };\n }\n}\n\nclass CopySheetEdit extends WorkbookEdit {\n readonly index: number | undefined;\n\n constructor(index: number | undefined) {\n super();\n this.index = index;\n }\n\n checkIn(): SheetRefusal | undefined {\n return undefined;\n }\n\n applyIn(workbook: Workbook, sheet: Sheet): WorkbookEditDone {\n const at = this.index === undefined ? workbook.indexOf(sheet) + 1 : WorkbookEdit.checkIndex(this.index, workbook.sheets.length + 1);\n const counted = workbook.countSheetMade(undefined);\n const { sheet: copy, change } = workbook.copy(sheet, at, workbook.copyName(sheet.name));\n return WorkbookEdit.counted(workbook, copy, at, undefined, counted, change);\n }\n}\n\n/** An operation refused before anything was computed for it. */\nclass RefusedEdit extends SheetEdit {\n readonly refusal: SheetRefusal;\n\n constructor(refusal: SheetRefusal) {\n super();\n this.refusal = refusal;\n }\n\n override check(): SheetRefusal | undefined {\n return this.refusal;\n }\n\n apply(): SheetStep {\n throw new SheetRefusedError(this.refusal);\n }\n}\n\n/**\n * An insertion or deletion: undone by the inverse edit, then putting back the Formulas it rewrote and the cells it\n * dropped, exactly as they were \u2014 the inverse alone does not restore a range a deletion shrank, nor a Reference it\n * made `#REF!`.\n */\nclass StructureEdit extends SheetEdit {\n readonly edit: StructuralEdit;\n\n constructor(edit: StructuralEdit) {\n super();\n this.edit = edit;\n }\n\n override check(sheet: Sheet): SheetRefusal | undefined {\n return sheet.checkStructural(this.edit);\n }\n\n // The whole rows or columns inserted, or deleted.\n override get ranges(): readonly CellRange[] {\n const { axis, start, count } = this.edit;\n return [axis === 'rows' ? CellRange.wholeRows(start, start + count - 1) : CellRange.wholeColumns(start, start + count - 1)];\n }\n\n apply(sheet: Sheet): SheetStep {\n const outcome = sheet.restructure(this.edit);\n return new SheetStep(sheet, outcome.change, s => s.unrestructure(this.edit, outcome), s => s.restructure(this.edit).change);\n }\n}\n\n", "// What crosses between .NET and the Sheet in the browser, for Blazor's adapter (ADR-0370 section 1): a Sheet Edit, a\n// Cell Format change and a Linked Table's rows read from the JSON ExSheet.Engine's SheetWire writes, and a Cell Format\n// and a refused snapshot written as it reads them. The vocabulary is the one the shared cases of both engines write\n// edits, changes and Values in (tests/cases/sheet), so an edit means the same on both sides; the shared cases read\n// their edits through this reader.\nimport { CellAddress } from './cell-address';\nimport { borderLineStyles, BorderLine, CellBorders, CellColour, CellFill, CellFont, type BorderLineStyle, type CellFormat, type HorizontalAlignment } from './cell-format';\nimport { BorderChange, CellFormatChange, CellState } from './cell-format-change';\nimport { CellRange } from './cell-range';\nimport { Entry } from './entry';\nimport { FormatError } from './format-error';\nimport { JsonSyntaxError, parseJson, type JsonElement } from './json-element';\nimport { NumberFormat } from './number-format';\nimport { SheetBlock, type EntryOfCell, type FillDirection, type TypedCell } from './sheet';\nimport type { RepeatedKeyError, SheetChange } from './sheet-change';\nimport { SheetEdit } from './sheet-edit';\nimport { parseWrittenError, Value } from './value';\n\ntype JsonObject = JsonElement & { kind: 'object' };\n\nconst alignments: readonly HorizontalAlignment[] = ['general', 'left', 'center', 'right'];\nconst directions: readonly FillDirection[] = ['down', 'right', 'up', 'left'];\nconst changeParts = new Set(['numberFormat', 'alignment', 'fontColour', 'bold', 'italic', 'underline', 'strikethrough', 'fill', 'borders']);\nconst edges = new Set(['top', 'bottom', 'left', 'right', 'insideHorizontal', 'insideVertical']);\n\n/**\n * A Sheet Edit read from its JSON: an object of one key, the factory, and its arguments as the factory takes them\n * (ADR-0370 section 1). The factory checks them as it checks any caller's; what is not an edit so written is refused\n * with a `FormatError`.\n */\nexport function readSheetEdit(json: string): SheetEdit {\n return editOf(parse(json));\n}\n\n/** A Cell Format change read from its JSON: each part it sets, by its name. */\nexport function readCellFormatChange(json: string): CellFormatChange {\n return changeOf(parse(json));\n}\n\n/** A Linked Table's snapshot read from its JSON: rows of Values, a blank as `null`. */\nexport function readLinkedRows(json: string): (Value | undefined)[][] {\n return items(parse(json), 'the rows').map(row => items(row, 'a row').map(valueOf));\n}\n\n/**\n * A Linked Table's snapshot as JSON, rows of Values, a blank as `null` and a refusal as one, as `readLinkedRows` and\n * .NET's `SheetWire.ReadRows` read it.\n */\nexport function writeLinkedRows(rows: Iterable<readonly (Value | undefined)[]>): string {\n return JSON.stringify([...rows].map(row => row.map(value => value === undefined ? null : rowValueJson(value))));\n}\n\n/** A Cell Format as JSON: its Number Format's code, its alignment, its whole Font, its Fill and its four Borders. */\nexport function writeCellFormat(format: CellFormat): string {\n return JSON.stringify({\n numberFormat: format.numberFormat.code,\n alignment: format.alignment,\n font: fontJson(format.font),\n fill: fillText(format.fill),\n borders: bordersJson(format.borders),\n });\n}\n\n/**\n * A refused snapshot as JSON (ADR-0049): the table, its key's columns, the key as its first and its second row hold\n * it, the two rows, and what the table's going back to waiting changed, so that .NET raises the refusal as the C#\n * Sheet raises it.\n */\nexport function writeRepeatedKey(error: RepeatedKeyError): string {\n return JSON.stringify({\n table: error.table,\n keyColumns: error.keyColumns,\n keys: error.keys.map(valueJson),\n firstRow: error.firstRow,\n repeats: error.repeats.map(valueJson),\n secondRow: error.secondRow,\n change: changeJson(error.change),\n });\n}\n\nfunction parse(json: string): JsonElement {\n // A text that is not JSON is refused as the reader refuses a text that is not an edit.\n try {\n return parseJson(json);\n } catch (error) {\n if (error instanceof JsonSyntaxError) throw new FormatError(`Not JSON: ${error.message}`);\n throw error;\n }\n}\n\nfunction editOf(element: JsonElement): SheetEdit {\n const edit = object(element, 'an edit');\n const only = edit.properties.length === 1 ? edit.properties[0] : undefined;\n if (only === undefined) throw new FormatError(`An edit names one operation: ${edit.raw}.`);\n const [name, argument] = only;\n switch (name) {\n case 'enter':\n return SheetEdit.enterMany(typedOf(argument));\n case 'setEntries':\n return SheetEdit.setEntries(entriesOf(argument));\n case 'setNumberFormat': {\n const args = object(argument, name);\n const code = member(args, 'format');\n const format = code.kind === 'null' ? undefined : NumberFormat.parse(text(code, 'format'));\n const at = member(args, 'at');\n return at.kind === 'array'\n ? SheetEdit.setNumberFormatOf(at.items.map(addressOf), format)\n : SheetEdit.setNumberFormat(rangeOf(at), format);\n }\n case 'setAlignment': {\n const args = object(argument, name);\n const alignment = oneOf(alignments, text(member(args, 'alignment'), 'alignment'), 'an alignment');\n const at = member(args, 'at');\n return at.kind === 'array'\n ? SheetEdit.setAlignmentOf(at.items.map(addressOf), alignment)\n : SheetEdit.setAlignment(rangeOf(at), alignment);\n }\n case 'setCellFormat': {\n const args = object(argument, name);\n return SheetEdit.setCellFormat(items(member(args, 'ranges'), 'ranges').map(rangeOf), changeOf(member(args, 'change')));\n }\n case 'insertRows':\n return SheetEdit.insertRows(...placeAndCount(argument));\n case 'deleteRows':\n return SheetEdit.deleteRows(...placeAndCount(argument));\n case 'insertColumns':\n return SheetEdit.insertColumns(...placeAndCount(argument));\n case 'deleteColumns':\n return SheetEdit.deleteColumns(...placeAndCount(argument));\n case 'setColumnWidth': {\n const args = object(argument, name);\n const width = member(args, 'width');\n return SheetEdit.setColumnWidth(rangeOf(member(args, 'columns')), width.kind === 'null' ? undefined : number(width, 'width'));\n }\n case 'setAutomaticColumnWidth': {\n const args = object(argument, name);\n return SheetEdit.setAutomaticColumnWidth(rangeOf(member(args, 'columns')), number(member(args, 'width'), 'width'));\n }\n case 'fill':\n case 'fillCopy': {\n const args = object(argument, name);\n const source = rangeOf(member(args, 'source'));\n const target = rangeOf(member(args, 'target'));\n const direction = oneOf(directions, text(member(args, 'direction'), 'direction'), 'a fill direction');\n return name === 'fill' ? SheetEdit.fill(source, target, direction) : SheetEdit.fillCopy(source, target, direction);\n }\n case 'paste': {\n const args = object(argument, name);\n const block = blockOf(member(args, 'block'));\n const at = member(args, 'at');\n if (at.kind === 'array') return SheetEdit.paste(block, at.items.map(rangeOf));\n const target = text(at, 'at');\n return SheetEdit.paste(block, target.includes(':') ? CellRange.parse(target) : CellAddress.parse(target));\n }\n case 'pasteText': {\n const args = object(argument, name);\n return SheetEdit.pasteText(items(member(args, 'fields'), 'fields').map(row => items(row, 'a row').map(f => text(f, 'a field'))),\n addressOf(member(args, 'at')));\n }\n case 'pasteFields': {\n const args = object(argument, name);\n const entries = optional(args, 'entries');\n return SheetEdit.pasteFields(typedOf(member(args, 'typed')), entries === undefined ? undefined : entriesOf(entries));\n }\n case 'enterInto': {\n const args = object(argument, name);\n return SheetEdit.enterInto(items(member(args, 'targets'), 'targets').map(rangeOf), addressOf(member(args, 'at')), text(member(args, 'typed'), 'typed'));\n }\n case 'rename':\n return SheetEdit.rename(text(argument, 'rename'));\n case 'insertSheet': {\n const args = object(argument, name);\n const sheetName = optional(args, 'name');\n const before = optional(args, 'before');\n return SheetEdit.insertSheet(sheetName === undefined || sheetName.kind === 'null' ? undefined : text(sheetName, 'name'),\n before === undefined ? false : flag(before, 'before'));\n }\n case 'deleteSheet':\n return SheetEdit.deleteSheet();\n case 'moveSheet':\n return SheetEdit.moveSheet(whole(argument, 'moveSheet'));\n case 'copySheet':\n return SheetEdit.copySheet(argument.kind === 'number' ? whole(argument, 'copySheet') : undefined);\n default:\n throw new FormatError(`'${name}' is no Sheet Edit.`);\n }\n}\n\nfunction changeOf(element: JsonElement): CellFormatChange {\n const parts = object(element, 'a Cell Format change');\n for (const [key] of parts.properties) {\n if (!changeParts.has(key)) throw new FormatError(`'${key}' is no part of a Cell Format change.`);\n }\n const part = (key: string): JsonElement | undefined => optional(parts, key);\n const numberFormat = part('numberFormat');\n const alignment = part('alignment');\n const fontColour = part('fontColour');\n const fill = part('fill');\n const borders = part('borders');\n const emphasis = (key: string): boolean | undefined => {\n const given = part(key);\n return given === undefined ? undefined : flag(given, key);\n };\n return new CellFormatChange({\n numberFormat: numberFormat === undefined ? undefined : NumberFormat.parse(text(numberFormat, 'numberFormat')),\n alignment: alignment === undefined ? undefined : oneOf(alignments, text(alignment, 'alignment'), 'an alignment'),\n fontColour: fontColour === undefined ? undefined : colourOf(fontColour),\n bold: emphasis('bold'),\n italic: emphasis('italic'),\n underline: emphasis('underline'),\n strikethrough: emphasis('strikethrough'),\n fill: fill === undefined ? undefined : fillOf(fill),\n borders: borders === undefined ? undefined : borderChangeOf(borders),\n });\n}\n\nfunction borderChangeOf(element: JsonElement): BorderChange {\n if (element.kind === 'string' && element.value === 'none') return BorderChange.none;\n const given = object(element, 'a Border change');\n const outline = optional(given, 'outline');\n if (given.properties.length === 1 && outline !== undefined) return BorderChange.outline(lineOf(outline));\n const inside = optional(given, 'inside');\n if (given.properties.length === 1 && inside !== undefined) return BorderChange.inside(lineOf(inside));\n for (const [key] of given.properties) {\n if (!edges.has(key)) throw new FormatError(`'${key}' is no edge of a Border change.`);\n }\n const edge = (key: string): BorderLine | undefined => {\n const line = optional(given, key);\n return line === undefined ? undefined : lineOf(line);\n };\n return new BorderChange({\n top: edge('top'), bottom: edge('bottom'), left: edge('left'), right: edge('right'),\n insideHorizontal: edge('insideHorizontal'), insideVertical: edge('insideVertical'),\n });\n}\n\n// A block copied inside ExSheet: the range it came from, and each cell as copied, rows of columns, each part of its Cell\n// Format written only where the cell records it (ADR-0048, ADR-0071).\nfunction blockOf(element: JsonElement): SheetBlock {\n const block = object(element, 'a block');\n const source = rangeOf(member(block, 'source'));\n const rows = items(member(block, 'cells'), 'the cells');\n if (rows.length !== source.rowCount) throw new FormatError(`A block copied from ${source.toString()} holds ${String(source.rowCount)} row(s), not ${String(rows.length)}.`);\n const cells = rows.flatMap(row => {\n const columns = items(row, 'a row of the block');\n if (columns.length !== source.columnCount) throw new FormatError(`A row of a block copied from ${source.toString()} holds ${String(source.columnCount)} cell(s), not ${String(columns.length)}.`);\n return columns.map(stateOf);\n });\n return new SheetBlock(source, cells);\n}\n\nfunction stateOf(element: JsonElement): CellState {\n const cell = object(element, 'a cell of a block');\n for (const [key] of cell.properties) {\n if (!['entry', 'numberFormat', 'alignment', 'font', 'fill', 'borders'].includes(key)) throw new FormatError(`'${key}' is no part of a copied cell.`);\n }\n const entry = optional(cell, 'entry');\n const numberFormat = optional(cell, 'numberFormat');\n const alignment = optional(cell, 'alignment');\n const font = optional(cell, 'font');\n const fill = optional(cell, 'fill');\n const borders = optional(cell, 'borders');\n return new CellState(\n entry === undefined ? undefined : entryOf(entry),\n undefined,\n numberFormat === undefined ? undefined : NumberFormat.parse(text(numberFormat, 'numberFormat')),\n alignment === undefined ? undefined : oneOf(alignments, text(alignment, 'alignment'), 'an alignment'),\n font === undefined ? undefined : fontOf(font),\n fill === undefined ? undefined : fillOf(fill),\n borders === undefined ? undefined : bordersOf(borders));\n}\n\nfunction fontOf(element: JsonElement): CellFont {\n const font = object(element, 'a Font');\n return new CellFont({\n colour: colourOf(member(font, 'colour')),\n bold: flag(member(font, 'bold'), 'bold'),\n italic: flag(member(font, 'italic'), 'italic'),\n underline: flag(member(font, 'underline'), 'underline'),\n strikethrough: flag(member(font, 'strikethrough'), 'strikethrough'),\n });\n}\n\nfunction bordersOf(element: JsonElement): CellBorders {\n const sides = object(element, 'the Borders');\n return new CellBorders({\n top: lineOf(member(sides, 'top')),\n bottom: lineOf(member(sides, 'bottom')),\n left: lineOf(member(sides, 'left')),\n right: lineOf(member(sides, 'right')),\n });\n}\n\nfunction lineOf(element: JsonElement): BorderLine {\n if (element.kind === 'string' && element.value === 'none') return BorderLine.none;\n const line = object(element, 'a line');\n const style: BorderLineStyle = oneOf(borderLineStyles, text(member(line, 'style'), 'style'), 'a line style');\n const colour = optional(line, 'colour');\n return new BorderLine(style, colour === undefined ? CellColour.automatic : colourOf(colour));\n}\n\nfunction colourOf(element: JsonElement): CellColour {\n const written = text(element, 'a colour');\n if (written === 'Automatic') return CellColour.automatic;\n const colour = CellColour.fromHex(written);\n if (colour === undefined) throw new FormatError(`'${written}' is no colour: Automatic, or #RRGGBB.`);\n return colour;\n}\n\nfunction fillOf(element: JsonElement): CellFill {\n return element.kind === 'string' && element.value === 'none' ? CellFill.none : CellFill.solid(colourOf(element));\n}\n\nfunction typedOf(element: JsonElement): TypedCell[] {\n // Each cell in its place in the list, as .NET wrote it: a cell named twice is typed twice, in order.\n return object(element, 'typed cells').properties.map(([at, typed]) => [CellAddress.parse(at), text(typed, at)] as const);\n}\n\nfunction entriesOf(element: JsonElement): EntryOfCell[] {\n return object(element, 'Entries').properties.map(([at, entry]) => [CellAddress.parse(at), entry.kind === 'null' ? undefined : entryOf(entry)] as const);\n}\n\nfunction entryOf(element: JsonElement): Entry {\n const entry = object(element, 'an Entry');\n const formula = optional(entry, 'formula');\n if (formula !== undefined && entry.properties.length === 1) return Entry.fromFormula(text(formula, 'formula'));\n const constant = optional(entry, 'constant');\n if (constant !== undefined && entry.properties.length === 1) {\n const value = valueOf(constant);\n if (value === undefined) throw new FormatError('A constant is not blank.');\n return Entry.fromValue(value);\n }\n throw new FormatError(`${entry.raw} is no Entry: {\"formula\": text} or {\"constant\": value}.`);\n}\n\nfunction valueOf(element: JsonElement): Value | undefined {\n switch (element.kind) {\n case 'null':\n return undefined;\n case 'string':\n return Value.fromText(element.value);\n case 'true':\n return Value.fromBoolean(true);\n case 'false':\n return Value.fromBoolean(false);\n case 'number':\n return Value.fromNumber(number(element, 'a number'));\n case 'object': {\n const written = optional(element, 'error');\n const refused = optional(element, 'refused');\n const code = written === undefined ? undefined : text(written, 'an Error Value');\n if (code !== undefined && refused !== undefined && element.properties.length === 2 && refused.kind === 'true') {\n // A refusal, as a Consumer holds one read from a refused cell: the engine refuses it where it is no data.\n if (code === '#VALUE!') return Value.refusal;\n if (code === '#NAME?') return Value.refusedName;\n }\n const error = code === '#CIRC!' || code === '#GETTING_DATA' ? code : code === undefined ? undefined : parseWrittenError(code);\n if (error !== undefined && element.properties.length === 1) return Value.fromError(error);\n throw new FormatError(`${element.raw} is no Value.`);\n }\n case 'array':\n throw new FormatError(`${element.raw} is no Value.`);\n default:\n throw new FormatError('Internal: no kind of JSON.');\n }\n}\n\n// A Value of a snapshot: a refusal a Consumer read from a refused cell crosses as one.\nfunction rowValueJson(value: Value): unknown {\n return value.isRefused ? { error: value.error, refused: true } : valueJson(value);\n}\n\nfunction valueJson(value: Value): unknown {\n switch (value.kind) {\n case 'number':\n return value.number;\n case 'text':\n return value.text;\n case 'boolean':\n return value.boolean;\n case 'error':\n return { error: value.error };\n default:\n throw new Error('Internal: no kind of Value.');\n }\n}\n\nfunction changeJson(change: SheetChange): unknown {\n return {\n valueChanges: change.valueChanges.map(a => a.toString()),\n recalculated: change.recalculated.map(a => a.toString()),\n rows: change.rows,\n columns: change.columns,\n reformatsUnnamedRows: change.reformatsUnnamedRows,\n };\n}\n\nfunction fontJson(font: CellFont): unknown {\n return { colour: font.colour.toString(), bold: font.bold, italic: font.italic, underline: font.underline, strikethrough: font.strikethrough };\n}\n\nfunction fillText(fill: CellFill): string {\n return fill.colour === undefined ? 'none' : fill.colour.toString();\n}\n\nfunction lineJson(line: BorderLine): unknown {\n return line.isNone ? 'none' : { style: line.style, colour: line.colour.toString() };\n}\n\nfunction bordersJson(borders: CellBorders): unknown {\n return { top: lineJson(borders.top), bottom: lineJson(borders.bottom), left: lineJson(borders.left), right: lineJson(borders.right) };\n}\n\nfunction placeAndCount(element: JsonElement): [number, number] {\n const pair = items(element, 'a place and count');\n const [place, count] = pair;\n if (place === undefined || pair.length > 2) throw new FormatError(`${raw(element)} is no place and count.`);\n return [whole(place, 'a place'), count === undefined ? 1 : whole(count, 'a count')];\n}\n\nfunction raw(element: JsonElement): string {\n return element.kind === 'object' || element.kind === 'array' ? element.raw : JSON.stringify(element);\n}\n\nfunction oneOf<T extends string>(names: readonly T[], written: string, what: string): T {\n const found = names.find(name => name === written);\n if (found === undefined) throw new RangeError(`'${written}' is not ${what}.`);\n return found;\n}\n\nfunction addressOf(element: JsonElement): CellAddress {\n return CellAddress.parse(text(element, 'a cell'));\n}\n\nfunction rangeOf(element: JsonElement): CellRange {\n return CellRange.parse(text(element, 'a range'));\n}\n\nfunction object(element: JsonElement, what: string): JsonObject {\n if (element.kind !== 'object') throw new FormatError(`${what} is not an object.`);\n return element;\n}\n\n// A named argument, refused when it is written twice: one of the two would be ignored.\nfunction optional(element: JsonObject, name: string): JsonElement | undefined {\n const found = element.properties.filter(([key]) => key === name);\n if (found.length > 1) throw new FormatError(`'${name}' is written twice in ${element.raw}.`);\n return found[0]?.[1];\n}\n\nfunction member(element: JsonObject, name: string): JsonElement {\n const found = optional(element, name);\n if (found === undefined) throw new FormatError(`'${name}' is missing from ${element.raw}.`);\n return found;\n}\n\nfunction items(element: JsonElement, what: string): readonly JsonElement[] {\n if (element.kind !== 'array') throw new FormatError(`${what} is not a list.`);\n return element.items;\n}\n\nfunction text(element: JsonElement, what: string): string {\n if (element.kind !== 'string') throw new FormatError(`${what} is not text.`);\n return element.value;\n}\n\nfunction flag(element: JsonElement, what: string): boolean {\n if (element.kind === 'true') return true;\n if (element.kind === 'false') return false;\n throw new FormatError(`${what} is not true or false.`);\n}\n\nfunction number(element: JsonElement, what: string): number {\n if (element.kind !== 'number') throw new FormatError(`${what} is not a number.`);\n const read = Number(element.raw);\n // A number JSON writes is finite; one written past a double's range is no Value .NET sent.\n if (!Number.isFinite(read)) throw new FormatError(`${element.raw} is no number a double holds.`);\n return read;\n}\n\nfunction whole(element: JsonElement, what: string): number {\n const read = number(element, what);\n if (!Number.isSafeInteger(read)) throw new FormatError(`${what} is not a whole number.`);\n return read;\n}\n", "// The Sheets ExSheet holds, in order, under one culture, with one dependency graph across them (C#'s Workbook.cs and\n// its partials, WorkbookChange and WorkbookStep; CONTEXT.md, ADR-0331).\nimport type { CellAddress } from './cell-address';\nimport type { CellRange } from './cell-range';\nimport type { Culture } from './culture';\nimport { serialFromDate, daysInMonth } from './date-serial';\nimport { equalsIgnoreCase, ignoreCaseKey } from './dotnet';\nimport { Entry } from './entry';\nimport { elementAt } from './must';\nimport type { SheetDay, SheetMoment } from './formulas/cell-reader';\nimport type { Reference } from './formulas/reference';\nimport { Sheet, type LinkedTable, type RewrittenEntry, type TableState } from './sheet';\nimport { SheetCell, SheetCellSet } from './sheet-cell';\nimport { SheetChange, SheetRefusal, SheetRefusedError } from './sheet-change';\nimport { SheetDocument, sheetDocumentOf } from './sheet-document';\nimport { SheetEdit, WorkbookEdit, type WorkbookEditDone } from './sheet-edit';\nimport { SheetSize } from './sheet-size';\nimport { quoteSheetName } from './formulas/reference';\nimport type { Value } from './value';\nimport { WorkbookDocument } from './workbook-document';\n\n/** What a rename did, and the Formulas it rewrote on every Sheet, as they were, for undoing it. @internal */\nexport interface SheetRename {\n readonly change: SheetChange;\n readonly oldName: string;\n readonly rewritten: readonly RewrittenEntry[];\n}\n\n/** The largest seed: a seed is an unsigned 64-bit integer, as C#'s ulong holds it (ADR-0180). */\nconst maxSeed = (1n << 64n) - 1n;\n\n/** The number at the end of a copy's name, which a copy of the copy replaces: ` (2)`. */\nconst copyNumber = / \\([0-9]+\\)$/u;\n\n/**\n * The Sheets ExSheet holds, in order, under one culture, with one dependency graph across them (CONTEXT.md, ADR-0331).\n * A Formula on one Sheet reads another's cells by qualifying a Reference with its name (`=Sheet2!A1`), and a change on\n * any Sheet recalculates what depends on it on every Sheet, publishing the new Values only when that whole\n * recalculation has completed (ADR-0047). Linked Tables are declared on the Workbook, and read from any of its Sheets.\n * Changed and read by one caller at a time.\n */\nexport class Workbook {\n readonly #sheets: Sheet[] = [];\n\n /** What a Workbook operation under way has changed on the Sheets it did not start on; `undefined` when none is under way. */\n #collected: Map<Sheet, SheetChange[]> | undefined;\n\n /** Whether the Workbook operation under way has changed which Sheets the Workbook holds, their order or their names. */\n #reshaped = false;\n\n /**\n * How many Sheets the Workbook has made since it was created or opened, which numbers a new Sheet\n * (`nextSheetName`), as Excel's count does: an opened one has made none; a new one has made the Sheets it starts with.\n */\n #sheetsMade: number;\n\n #shown: Sheet;\n\n /** How deep the operations under way are nested: one operation counts as one change, however many steps it takes. */\n #operationDepth = 0;\n\n /** Whether the operation under way has counted its change already. */\n #operationCounted = false;\n\n #today: SheetDay | undefined;\n #seed: bigint | undefined;\n #changes = 0;\n\n /** The Workbook's declared culture, which every one of its Sheets reads and shows under (ADR-0048, ADR-0331). */\n readonly culture: Culture;\n\n #size: SheetSize;\n\n /** The Linked Tables' state, which every Sheet of the Workbook reads, by name read without regard to case (ADR-0331). @internal */\n readonly tables = new Map<string, TableState>();\n\n /**\n * Where the engine reads the current moment for `NOW`: the date and time of day in the Workbook's zone, or\n * `undefined` while it is not known, when `NOW` is `#GETTING_DATA` (ADR-0124). The engine reads no clock itself; it\n * calls this once at the start of each recalculation, so every `NOW` on every Sheet in one recalculation answers the\n * same moment. Unset, the default, leaves `NOW` waiting.\n */\n nowSource: (() => SheetMoment | undefined) | undefined;\n\n /**\n * A Workbook of empty Sheets named `sheetNames`, in that order \u2014 one, `Sheet1`, when none are given \u2014 whose constants\n * are read and whose Values are shown under `culture` (ADR-0048). Throws a RangeError when no name is given, a name\n * is not one a Sheet can have (`Sheet.isValidName`), or two names are the same without regard to case. Every Sheet\n * holds `size`, Excel's unless given (ADR-0460).\n */\n constructor(culture: Culture, sheetNames: Iterable<string> = [Sheet.defaultName], size: SheetSize = SheetSize.excel) {\n this.culture = culture;\n this.#size = size;\n for (const name of sheetNames) {\n Sheet.checkName(name);\n if (this.find(name) !== undefined) throw new RangeError(`Two Sheets cannot both be named '${name}'.`);\n this.#sheets.push(new Sheet(this, name));\n }\n const first = this.#sheets[0];\n if (first === undefined) throw new RangeError('A Workbook holds at least one Sheet.');\n this.#shown = first;\n this.#sheetsMade = this.#sheets.length;\n }\n\n /**\n * Opens a Workbook Document: a Workbook in the document's culture, with its Sheets in order, the Sheet it shows\n * shown, its Linked Tables declared and waiting for their first snapshot, and each Sheet's Entries, Cell Formats and\n * column widths, with every Value computed again (ADR-0048, ADR-0049, ADR-0331). A Sheet Document opens as a\n * Workbook of that one Sheet. The culture of the caller plays no part. Every Sheet holds `size`, Excel's unless given,\n * and a document with an Entry past it is refused with a `RangeError` naming the first such cell, never opened\n * without it (ADR-0460).\n */\n static open(document: WorkbookDocument | SheetDocument, size: SheetSize = SheetSize.excel): Workbook {\n const sheets = document instanceof SheetDocument ? [document] : document.sheets;\n for (const sheet of sheets) {\n // The first in address order, whatever order the document lists its cells in, as `resize` names one.\n const past = sheet.cells.filter(cell => cell.entry !== undefined && !size.contains(cell.address))\n .map(cell => cell.address).toSorted((a, b) => a.compareTo(b))[0];\n if (past !== undefined) throw new RangeError(Workbook.#pastSize(sheet.name, past, size));\n }\n if (document instanceof SheetDocument) {\n const workbook = new Workbook(SheetDocument.resolveCulture(document.culture), [document.name], size);\n const sheet = workbook.#first;\n // Declared before any Formula is computed: a reader shows #GETTING_DATA, never #NAME? (ADR-0049).\n for (const table of document.linkedTables) sheet.declare(table.name, table.columns, table.keyColumns);\n sheet.openFormats(document);\n sheet.openEntries(document);\n workbook.opened();\n return workbook;\n }\n const workbook = new Workbook(SheetDocument.resolveCulture(document.culture), document.sheets.map(s => s.name), size);\n for (const table of document.linkedTables) workbook.#first.declare(table.name, table.columns, table.keyColumns);\n document.sheets.forEach((sheet, i) => workbook.#sheetAt(i).openFormats(sheet));\n document.sheets.forEach((sheet, i) => workbook.#sheetAt(i).openEntries(sheet));\n const shown = workbook.find(document.shown);\n if (shown === undefined) throw new Error('Internal: a Workbook Document shows one of its Sheets.');\n workbook.#shown = shown;\n workbook.opened();\n return workbook;\n }\n\n /** How many rows and columns every Sheet of the Workbook holds (ADR-0460): Excel's unless one was given. */\n get size(): SheetSize {\n return this.#size;\n }\n\n /**\n * Gives every Sheet another size (ADR-0460). A size that would leave an Entry past it is refused with a `RangeError`\n * naming the first such cell, and the Workbook keeps the size it had. Every spilled array is laid out again against\n * the new edge: one that no longer fits shows `#SPILL!`, and one that now fits spills. It is not an operation a user\n * undoes.\n */\n resize(size: SheetSize): WorkbookChange {\n const shown = this.#shown;\n if (size.equals(this.#size)) return this.collectOn(shown, () => SheetChange.none);\n for (const sheet of this.#sheets) {\n // In address order, so the cell named is the first.\n const past = sheet.entryAddresses.find(address => !size.contains(address));\n if (past !== undefined) throw new RangeError(Workbook.#pastSize(sheet.name, past, size));\n }\n this.#size = size;\n const anchors = new SheetCellSet(this.#sheets.flatMap(sheet => sheet.anchors));\n return this.collectOn(shown, () => (anchors.size === 0 ? SheetChange.none : shown.recalculateCells(anchors)));\n }\n\n static #pastSize(sheet: string, address: CellAddress, size: SheetSize): string {\n return `${quoteSheetName(sheet)}!${address.toString()} holds an Entry, and a Sheet of ${String(size.rows)} rows by ${String(size.columns)} columns ends at ${size.lastCell.toString()}.`;\n }\n\n get #first(): Sheet {\n return this.#sheetAt(0);\n }\n\n #sheetAt(index: number): Sheet {\n const sheet = this.#sheets[index];\n if (sheet === undefined) throw new Error(`Internal: the Workbook has no Sheet at ${String(index)}.`);\n return sheet;\n }\n\n /**\n * The Sheet named `sheet` as a Sheet Document: the Workbook's culture, the Sheet's name, the Linked Tables'\n * declarations, its Entries, Cell Formats and column widths \u2014 never its Values, nor a table's rows. A Reference to\n * another Sheet is kept as it is written, so opened on its own it reads `#REF!`. Throws a RangeError when no Sheet\n * is named so.\n */\n toSheetDocument(sheet: string): SheetDocument {\n return sheetDocumentOf(this.#named(sheet));\n }\n\n /**\n * The Workbook as a Workbook Document: its culture, the Sheet shown, its Linked Tables' declarations, and each Sheet\n * as a Sheet Document records one, in order \u2014 never a Value, nor a table's rows (ADR-0331).\n */\n toDocument(): WorkbookDocument {\n return new WorkbookDocument(this.culture.name, this.#shown.name, this.#first.tableDeclarations, this.#sheets.map(s => sheetDocumentOf(s, [])));\n }\n\n /**\n * The Sheet shown: the one whose tab is selected (ADR-0331). Showing another Sheet changes nothing a step records.\n * Setting a Sheet that is not one of this Workbook's throws a RangeError.\n */\n get shown(): Sheet {\n return this.#shown;\n }\n\n set shown(sheet: Sheet) {\n if (!this.#sheets.includes(sheet)) throw new RangeError(\"The Sheet is not one of this Workbook's.\");\n this.#shown = sheet;\n }\n\n /** The Sheets, in the order their tabs stand. Change one through `do`. */\n get sheets(): readonly Sheet[] {\n return this.#sheets;\n }\n\n /** The Sheet named `name`, without regard to case, as a Reference's qualifier names one; `undefined` when none is. */\n find(name: string): Sheet | undefined {\n return this.#sheets.find(sheet => equalsIgnoreCase(sheet.name, name));\n }\n\n /** The Linked Tables declared, in the order they were first declared (ADR-0049). */\n get linkedTables(): LinkedTable[] {\n return this.#first.linkedTables;\n }\n\n /**\n * The current snapshot of the Linked Table named `name`, without regard to case, column by column in the order the\n * columns are declared, each holding one Value per row (`undefined` for a blank); `undefined` while it waits. A later\n * snapshot replaces it whole. Throws when no table of that name is declared.\n */\n linkedTableColumns(name: string): readonly (readonly (Value | undefined)[])[] | undefined {\n const table = this.tables.get(ignoreCaseKey(name));\n if (table === undefined) throw new Error(`No Linked Table named '${name}' is declared.`);\n return table.data;\n }\n\n /**\n * Does `edit` on the Sheet named `sheet` as one operation, and returns the step that undoes it (ADR-0048, ADR-0331).\n * A refused or unreadable operation changes nothing and returns no step. Throws a RangeError when no Sheet is named\n * so, a SheetRefusedError when the Sheet refuses the operation (`check` says why), and a FormulaSyntaxError when a\n * typed Formula cannot be read.\n */\n do(sheet: string, edit: SheetEdit): WorkbookStep {\n const target = this.#named(sheet);\n if (edit instanceof WorkbookEdit) {\n const refusal = edit.checkIn(this, target);\n if (refusal !== undefined) throw new SheetRefusedError(refusal);\n let done: WorkbookEditDone | undefined;\n const change = this.collecting(() => {\n const result = edit.applyIn(this, target);\n done = result;\n return { sheet: result.sheet, change: result.change };\n });\n if (done === undefined) throw new Error('Internal: a Sheet operation done says what it did.');\n const { sheet: made, undo, redo } = done;\n return new WorkbookStep(made, change, () => this.collectOn(made, undo), () => this.collectOn(made, redo), []);\n }\n let step: ReturnType<Sheet['do']> | undefined;\n const made = this.collectOn(target, () => {\n step = target.do(edit);\n return step.change;\n });\n const done = step;\n if (done === undefined) throw new Error('Internal: an edit done returns its step.');\n return new WorkbookStep(target, made, () => this.collectOn(target, () => done.undo()), () => this.collectOn(target, () => done.redo()), edit.ranges);\n }\n\n /**\n * Does several edits, each on the Sheet it names, as one operation, and returns the one step that undoes them all\n * (ADR-0048, ADR-0331 \u00A73): a Replace All over the Workbook (ADR-0332 \u00A75) is one step and one change (ADR-0180). The\n * edits are done in the order given and undone in the reverse. Every edit is checked before any is done, and one\n * that cannot be done leaves the Workbook as it was: the edits done before it are put back, and the count of changes\n * with them. A Sheet operation is done alone, with `do`.\n *\n * Each edit is recalculated across the Workbook as it is done, before the next: the operation is one recalculation\n * per edit, its change reporting them together once the last has completed.\n */\n doAll(edits: readonly (readonly [string, SheetEdit])[]): WorkbookStep {\n if (edits.length === 0) throw new RangeError('An operation is at least one edit.');\n const targets = edits.map(([sheet, edit]) => {\n if (edit instanceof WorkbookEdit) throw new RangeError('A Sheet operation is done alone, with do(sheet, edit) (ADR-0331).');\n return this.#named(sheet);\n });\n edits.forEach(([, edit], i) => {\n const refusal = elementAt(targets, i).check(edit);\n if (refusal !== undefined) throw new SheetRefusedError(refusal);\n });\n const first = elementAt(targets, 0);\n const steps: ReturnType<Sheet['do']>[] = [];\n const countBefore = this.#changes;\n const undoAll = (): WorkbookChange => this.asOneChange(() => this.collecting(() => {\n for (let i = steps.length - 1; i >= 0; i--) {\n const step = elementAt(steps, i);\n this.collect(step.sheet, step.undo());\n }\n return { sheet: first, change: SheetChange.none };\n }));\n let change: WorkbookChange;\n try {\n change = this.asOneChange(() => this.collecting(() => {\n edits.forEach(([, edit], i) => {\n const target = elementAt(targets, i);\n const step = target.do(edit);\n steps.push(step);\n this.collect(target, step.change);\n });\n return { sheet: first, change: SheetChange.none };\n }));\n } catch (e) {\n // Put back what was done before the edit that could not be, with the count of changes: the same Entries,\n // seed and count draw the same, so the Workbook is as it was (ADR-0180).\n undoAll();\n if (this.#changes !== countBefore) this.setSeed(this.#seed, countBefore);\n throw e;\n }\n return new WorkbookStep(first, change, undoAll,\n () => this.asOneChange(() => this.collecting(() => {\n for (const step of steps) this.collect(step.sheet, step.redo());\n return { sheet: first, change: SheetChange.none };\n })),\n // What an undo or a redo selects is on the Sheet acted on first: the smallest range holding what the edits\n // on it changed (ADR-0331 \u00A73, one range selected).\n SheetEdit.bounding(edits.filter((_, i) => targets[i] === first).flatMap(([, edit]) => edit.ranges).flatMap(r => [r.first, r.last])));\n }\n\n /** Whether `do` would refuse `edit` on the Sheet named `sheet` as it stands, and why; `undefined` when it would not. */\n check(sheet: string, edit: SheetEdit): SheetRefusal | undefined {\n return this.#named(sheet).check(edit);\n }\n\n /**\n * Declares a Linked Table by name and columns (ADR-0049), before any of its rows arrive. Formulas that read it stop\n * being `#NAME?` and show `#GETTING_DATA` until the first snapshot is pushed, on every Sheet. The declaration is\n * recorded in the document; a table is never undeclared. Declaring it again with the same columns, in the same\n * order, with the same key, changes nothing; other columns or another key replace the declaration and drop the rows\n * held so far.\n *\n * `key` is the key column, or the key's columns for a table whose rows are told apart by several columns together\n * (ADR-0058), each one of `columns` named without regard to case; none declares no key. Throws a RangeError when the\n * name or the columns are not ones a structured reference can name, or a key column is not one of the columns, or is\n * named twice.\n */\n declareLinkedTable(name: string, columns: readonly string[], key: string | readonly string[] = []): WorkbookChange {\n const keyColumns = typeof key === 'string' ? [key] : key;\n const first = this.#first;\n return this.collectOn(first, () => first.declareLinkedTable(name, columns, keyColumns));\n }\n\n /**\n * Replaces a Linked Table's data with a whole snapshot, in one step (ADR-0049): no recalculation sees part of one\n * snapshot and part of another, and only the Formulas that read the table \u2014 and what depends on them \u2014 recalculate.\n * A snapshot of a keyed table in which a key repeats is refused with a RepeatedKeyError, and the table waits again.\n * Throws when no table of that name is declared, and a RangeError when a row does not have one Value per column or\n * holds `#GETTING_DATA` or `#CIRC!`.\n */\n pushLinkedTable(name: string, rows: Iterable<readonly (Value | undefined)[]>): WorkbookChange {\n const first = this.#first;\n return this.collectOn(first, () => first.pushLinkedTable(name, rows));\n }\n\n #named(sheet: string): Sheet {\n const found = this.find(sheet);\n if (found === undefined) throw new RangeError(`No Sheet of the Workbook is named '${sheet}'.`);\n return found;\n }\n\n /** Runs an operation on `sheet`, and reports what it changed there with what its recalculation changed on every other Sheet. @internal */\n collectOn(sheet: Sheet, operation: () => SheetChange): WorkbookChange {\n return this.collecting(() => ({ sheet, change: operation() }));\n }\n\n /**\n * Runs an operation, and reports what it changed on the Sheet it names together with what its recalculation changed\n * on every other Sheet, and whether it changed which Sheets the Workbook holds. @internal\n */\n collecting(operation: () => { sheet: Sheet; change: SheetChange }): WorkbookChange {\n const outer = this.#collected;\n const outerReshaped = this.#reshaped;\n const collected = new Map<Sheet, SheetChange[]>();\n this.#collected = collected;\n this.#reshaped = false;\n let sheet: Sheet;\n let reshaped: boolean;\n try {\n const result = operation();\n sheet = result.sheet;\n const own = collected.get(sheet);\n if (own === undefined) collected.set(sheet, [result.change]);\n else own.push(result.change);\n } finally {\n reshaped = this.#reshaped;\n this.#collected = outer;\n this.#reshaped = outerReshaped || reshaped;\n }\n if (outer !== undefined) {\n for (const [other, changes] of collected) {\n const list = outer.get(other);\n if (list === undefined) outer.set(other, [...changes]);\n else list.push(...changes);\n }\n }\n const changes: { sheet: Sheet; change: SheetChange }[] = [];\n for (const s of this.#sheets) {\n const list = collected.get(s);\n if (list === undefined) continue;\n const change = SheetChange.merge(list);\n if (s === sheet || change !== SheetChange.none) changes.push({ sheet: s, change });\n }\n return new WorkbookChange(changes, reshaped);\n }\n\n /** Records what a recalculation changed on `sheet`, which the operation under way did not start on. @internal */\n collect(sheet: Sheet, change: SheetChange): void {\n if (this.#collected === undefined || change === SheetChange.none) return;\n const list = this.#collected.get(sheet);\n if (list === undefined) this.#collected.set(sheet, [change]);\n else list.push(change);\n }\n\n // ---- The Sheet Day and NOW (Workbook.Clock.cs) ----\n\n /**\n * The Sheet Day: the calendar day `TODAY()` answers on every Sheet, or `undefined` while it is not known, when every\n * Formula that calls `TODAY` is `#GETTING_DATA` (ADR-0121). The engine never reads a clock; whoever runs it says\n * which day it is. It is not part of a document.\n */\n get today(): SheetDay | undefined {\n return this.#today;\n }\n\n /**\n * The moment `NOW` answers on every Sheet: the one the last recalculation read from `nowSource`, or `undefined`\n * while none was read (ADR-0124). A copy of the Workbook made in the other engine is given it as its own moment,\n * so that its `NOW` answers what this one shows.\n */\n get moment(): SheetMoment | undefined {\n return this.#first.moment;\n }\n\n /** Whether any Formula on any Sheet calls a volatile function, so that moving the clock on can change a Value. */\n get hasVolatileFormulas(): boolean {\n return this.#sheets.some(sheet => sheet.hasVolatileFormulas);\n }\n\n /**\n * Sets the Sheet Day, and recalculates only the Formulas that call `TODAY`, on every Sheet, and what reads them, in\n * one recalculation. Setting the day the Workbook already has changes nothing. It is not an operation a user undoes.\n * Throws a RangeError for a day that is not a calendar day from 1 January 1900, where Excel's dates begin (ADR-0047).\n */\n setToday(today: SheetDay | undefined): WorkbookChange {\n if (today !== undefined) checkDay(today);\n const shown = this.#shown;\n if (sameDay(today, this.#today)) return this.collectOn(shown, () => SheetChange.none);\n this.#today = today === undefined ? undefined : { year: today.year, month: today.month, day: today.day };\n const readers = new SheetCellSet(this.#sheets.flatMap(sheet => sheet.todayReaders));\n return this.collectOn(shown, () => (readers.size === 0 ? SheetChange.none : shown.recalculateCells(readers)));\n }\n\n /**\n * Recalculates the Formulas that call a volatile function, on every Sheet, and what reads them, reading the moment\n * again: what ExSheet does as the minute turns (ADR-0124). It is not an operation a user undoes.\n */\n recalculateVolatile(): WorkbookChange {\n const shown = this.#shown;\n return this.collectOn(shown, () => (this.hasVolatileFormulas ? shown.recalculateCells(new SheetCellSet()) : SheetChange.none));\n }\n\n // ---- The Workbook Seed and the count of changes (Workbook.Random.cs) ----\n\n /**\n * The seed every draw of `RAND` and `RANDBETWEEN` on every Sheet is made from, with the Sheet's name, the cell, the\n * call's place in its Formula and `changes` (ADR-0180); `undefined` while it is not set, when every Formula that\n * calls either is `#GETTING_DATA`. The engine never chooses a random number of its own. It is not part of a document.\n */\n get seed(): bigint | undefined {\n return this.#seed;\n }\n\n /**\n * How many changes the Workbook has had since it was made or opened (ADR-0180): each draws again, on every Sheet. An\n * edit of an Entry, an insertion or a deletion, a Sheet added, deleted, renamed, moved or copied, the undo or redo of\n * one of those, a Linked Table's snapshot, and a declaration that declares or replaces one, each count once.\n */\n get changes(): number {\n return this.#changes;\n }\n\n /**\n * Sets the seed \u2014 an unsigned 64-bit integer, or `undefined` to make the draws wait again \u2014 and with `changes` the\n * count of changes too, and recalculates only the Formulas that draw, on every Sheet, and what reads them. The same\n * Entries, seed and count give the same draws (SH-17). Setting what the Workbook already has changes nothing. It is\n * not a change, and not an operation a user undoes. Throws a RangeError for a seed outside 0 to 2^64 - 1 or a count\n * below 0.\n */\n setSeed(seed: bigint | undefined, changes: number = this.#changes): WorkbookChange {\n if (seed !== undefined && (seed < 0n || seed > maxSeed)) throw new RangeError(`${String(seed)} is not a seed: a seed is from 0 to 2^64 - 1.`);\n if (!Number.isSafeInteger(changes) || changes < 0) throw new RangeError(`${String(changes)} is not a count of changes.`);\n const shown = this.#shown;\n if (seed === this.#seed && changes === this.#changes) return this.collectOn(shown, () => SheetChange.none);\n this.#seed = seed;\n this.#changes = changes;\n const readers = new SheetCellSet(this.#sheets.flatMap(sheet => sheet.randomReaders));\n return this.collectOn(shown, () => (readers.size === 0 ? SheetChange.none : shown.recalculateCells(readers)));\n }\n\n /** Does `operation` as one operation: whatever steps it takes, on whichever Sheets, it counts as one change at most. @internal */\n asOneChange<T>(operation: () => T): T {\n if (this.#operationDepth++ === 0) this.#operationCounted = false;\n try {\n return operation();\n } finally {\n this.#operationDepth--;\n }\n }\n\n /** Counts a change (ADR-0180), before the recalculation it brings draws: once for the operation under way, or once on its own. @internal */\n countChange(): void {\n if (this.#operationDepth > 0) {\n if (this.#operationCounted) return;\n this.#operationCounted = true;\n }\n this.#changes++;\n }\n\n /** Opening is no change: the count starts from 0 (ADR-0180). @internal */\n forgetChanges(): void {\n this.#changes = 0;\n }\n\n // ---- Adding, renaming, moving, copying and deleting a Sheet (Workbook.Sheets.cs) ----\n\n /** Where `sheet` stands in the order; -1 for a Sheet the Workbook does not hold. @internal */\n indexOf(sheet: Sheet): number {\n return this.#sheets.indexOf(sheet);\n }\n\n /**\n * The Sheets a 3D Reference from `first` to `last` spans (ADR-0331 \u00A77): those from one to the other in tab order,\n * both included, whichever stands first; the names are read without regard to case. `undefined` when no Sheet has\n * one of the names. @internal\n */\n span(first: string, last: string): Sheet[] | undefined {\n const from = this.find(first);\n const to = this.find(last);\n if (from === undefined || to === undefined) return undefined;\n const a = this.#sheets.indexOf(from);\n const b = this.#sheets.indexOf(to);\n return this.#sheets.slice(Math.min(a, b), Math.max(a, b) + 1);\n }\n\n /**\n * Renames `sheet`: every Reference on every Sheet qualified with its old name is rewritten to the new one, as Excel\n * rewrites them (ADR-0046, ADR-0331). A rename to the name the Sheet already has changes nothing. Throws a\n * SheetRefusedError when another Sheet of the Workbook has the name, without regard to case. @internal\n */\n renameSheet(sheet: Sheet, name: string): SheetRename {\n const oldName = sheet.name;\n if (oldName === name) return { change: SheetChange.none, oldName, rewritten: [] };\n const refusal = this.nameTaken(name, sheet);\n if (refusal !== undefined) throw new SheetRefusedError(refusal);\n const rewritten: RewrittenEntry[] = [];\n const change = this.#reshape(sheet, dirty => {\n const requalify = (qualifier: string): string => (Sheet.names(qualifier, oldName) ? name : qualifier);\n // Either end of a 3D Reference's span is renamed as a qualifier is (ADR-0331 \u00A77).\n this.#rewrite(r => r.with({\n sheetName: r.sheetName !== undefined && Sheet.names(r.sheetName, oldName) ? name : r.sheetName,\n lastSheetName: r.lastSheetName !== undefined && Sheet.names(r.lastSheetName, oldName) ? name : r.lastSheetName,\n }), requalify, rewritten, dirty);\n sheet.setName(name);\n });\n return { change, oldName, rewritten };\n }\n\n /** Undoes a rename: the old name back, and the Formulas it rewrote exactly as they were. @internal */\n undoRename(sheet: Sheet, rename: SheetRename): SheetChange {\n if (sheet.name === rename.oldName) return SheetChange.none;\n return this.#reshape(sheet, () => {\n for (const { sheet: owner, address, entry } of rename.rewritten) owner.replaceEntry(address, entry);\n sheet.setName(rename.oldName);\n });\n }\n\n /** Why `name` cannot be given to `sheet`: another Sheet has it, without regard to case; `undefined` when none does. @internal */\n nameTaken(name: string, sheet: Sheet | undefined): SheetRefusal | undefined {\n const other = this.find(name);\n return other !== undefined && other !== sheet\n ? new SheetRefusal('sheetNameTaken', `A Sheet of the Workbook is already named '${other.name}'.`)\n : undefined;\n }\n\n /**\n * The name a new Sheet takes, as Excel names one (exsheet-workbook ticket 12, answer 13): `Sheet` and the next number\n * of the Workbook's count of the Sheets it has made, passing over a name a Sheet has. @internal\n */\n nextSheetName(): string {\n return this.sheetName(this.nextSheetNumber());\n }\n\n /** The number `nextSheetName` gives the next new Sheet. @internal */\n nextSheetNumber(): number {\n for (let n = this.#sheetsMade + 1; ; n++) {\n if (this.find(this.sheetName(n)) === undefined) return n;\n }\n }\n\n /** `Sheet` and `number`: the name a new Sheet numbered so takes. @internal */\n sheetName(number: number): string {\n return `Sheet${String(number)}`;\n }\n\n /** A Workbook just opened from a document: it has made no Sheet yet, as Excel's opened workbook has not. @internal */\n opened(): void {\n this.#sheetsMade = 0;\n }\n\n /**\n * Counts a new Sheet as made, as Excel counts it: one numbered by the count takes the count to its number, past the\n * names it passed over; any other counts one. The count before is returned, for `uncountSheetMade`. @internal\n */\n countSheetMade(numbered: number | undefined): number {\n const before = this.#sheetsMade;\n this.#sheetsMade = numbered ?? this.#sheetsMade + 1;\n return before;\n }\n\n /** Puts back the count of Sheets made as it stood before an insertion or a copy, when the step is undone. @internal */\n uncountSheetMade(before: number): void {\n this.#sheetsMade = before;\n }\n\n /** The name a copy of the Sheet named `name` takes, as Excel names one: `Name (2)`, or the next number free, the name cut to fit 31 characters. @internal */\n copyName(name: string): string {\n const root = name.replace(copyNumber, '');\n for (let n = 2; ; n++) {\n const suffix = ` (${String(n)})`;\n const candidate = root.slice(0, Math.min(root.length, Sheet.maximumNameLength - suffix.length)) + suffix;\n if (this.find(candidate) === undefined) return candidate;\n }\n }\n\n /** Inserts a new, empty Sheet at `index`. @internal */\n insertSheet(index: number, name: string): { sheet: Sheet; change: SheetChange } {\n const sheet = new Sheet(this, name);\n const change = this.#reshape(sheet, () => {\n this.#sheets.splice(index, 0, sheet);\n });\n return { sheet, change };\n }\n\n /** Puts back a Sheet taken out, at `index`, with what it held. @internal */\n putBack(sheet: Sheet, index: number, rewritten: readonly RewrittenEntry[], shown: boolean): SheetChange {\n return this.#reshape(sheet, () => {\n this.#sheets.splice(index, 0, sheet);\n for (const { sheet: owner, address, entry } of rewritten) owner.replaceEntry(address, entry);\n if (shown) this.#shown = sheet;\n });\n }\n\n /**\n * Takes `sheet` out of the Workbook. Deleted, every Reference on another Sheet qualified with its name becomes\n * `#REF!` (ADR-0331), and a 3D Reference it ends hands that end to the Sheet next to it inward; taken out to undo its\n * insertion or copy, nothing is rewritten. The Sheet shown, if it was this one, becomes the one that takes its place.\n * @internal\n */\n takeOut(sheet: Sheet, deleting: boolean, rewritten: RewrittenEntry[]): SheetChange {\n const index = this.#sheets.indexOf(sheet);\n const before = this.#sheets.map(s => s.name);\n return this.#reshape(sheet, dirty => {\n this.#sheets.splice(index, 1);\n if (deleting) {\n const name = sheet.name;\n this.#rewrite(\n r => (r.isThreeD ? deleted(r, before, name) : r.sheetName !== undefined && Sheet.names(r.sheetName, name) ? undefined : r),\n q => (Sheet.names(q, name) ? undefined : q), rewritten, dirty);\n }\n if (this.#shown === sheet) this.#shown = this.#sheetAt(Math.min(index, this.#sheets.length - 1));\n });\n }\n\n /**\n * Moves `sheet` to `index` in the order. A 3D Reference whose end it is, moved past the other end, hands that end to\n * the Sheet next to it inward; each Formula so rewritten is added to `rewritten` as it was, for undoing the move.\n * @internal\n */\n move(sheet: Sheet, index: number, rewritten: RewrittenEntry[]): SheetChange {\n const before = this.#sheets.map(s => s.name);\n return this.#reshape(sheet, dirty => {\n this.#sheets.splice(this.#sheets.indexOf(sheet), 1);\n this.#sheets.splice(index, 0, sheet);\n const after = this.#sheets.map(s => s.name);\n this.#rewrite(r => (r.isThreeD ? moved(r, before, after, sheet.name) : r), q => q, rewritten, dirty);\n });\n }\n\n /** Undoes a move: `sheet` back at `index`, and the Formulas it rewrote exactly as they were. @internal */\n moveBack(sheet: Sheet, index: number, rewritten: readonly RewrittenEntry[]): SheetChange {\n return this.#reshape(sheet, () => {\n this.#sheets.splice(this.#sheets.indexOf(sheet), 1);\n this.#sheets.splice(index, 0, sheet);\n for (const { sheet: owner, address, entry } of rewritten) owner.replaceEntry(address, entry);\n });\n }\n\n /**\n * A copy of `source` named `name` at `index`: its Entries, Cell Formats and column widths. A Reference in it\n * qualified with the source's name names the copy, as Excel's copy does (ADR-0331); a 3D Reference the source ends is\n * `#REF!` in the copy, and any other is copied as it is (ADR-0331 \u00A77). @internal\n */\n copy(source: Sheet, index: number, name: string): { sheet: Sheet; change: SheetChange } {\n const copy = new Sheet(this, name);\n const document = sheetDocumentOf(source, []);\n const sourceName = source.name;\n const change = this.#reshape(copy, dirty => {\n this.#sheets.splice(index, 0, copy);\n copy.openFormats(document);\n for (const cell of document.cells) {\n const entry = cell.entry;\n if (entry === undefined) continue;\n const requalified = Entry.rewrite(entry,\n r => (r.isThreeD\n ? Sheet.names(r.sheetName, sourceName) || Sheet.names(r.lastSheetName, sourceName) ? undefined : r\n : r.sheetName !== undefined && Sheet.names(r.sheetName, sourceName) ? r.with({ sheetName: name }) : r),\n q => (Sheet.names(q, sourceName) ? name : q));\n copy.replaceEntry(cell.address, requalified);\n dirty.add(new SheetCell(copy, cell.address));\n }\n });\n return { sheet: copy, change };\n }\n\n /** Puts back a copy, or an inserted Sheet, taken out by an undo. @internal */\n reinsert(sheet: Sheet, index: number): SheetChange {\n return this.#reshape(sheet, () => {\n this.#sheets.splice(index, 0, sheet);\n });\n }\n\n /**\n * Changes the Workbook's Sheets \u2014 which it holds, their order or their names \u2014 as one change: the References to\n * other Sheets are forgotten before and learnt again after, and every Formula whose qualifier may now name another\n * Sheet, or none, is recalculated with every volatile Formula, and whatever `mutate` adds. What it changed on\n * `initiator` is returned; what it changed on every other Sheet is reported to the Workbook operation under way.\n */\n #reshape(initiator: Sheet, mutate: (dirty: SheetCellSet) => void): SheetChange {\n // A change, and draws again, as a rename did in Excel (ADR-0180).\n initiator.countChange();\n const before = new Map(this.#sheets.map(s => [s, s.snapshot()] as const));\n for (const sheet of this.#sheets) sheet.unregisterAllRemote();\n const dirty = new SheetCellSet();\n mutate(dirty);\n this.#reshaped = true;\n for (const sheet of this.#sheets) sheet.rebuildDependencies();\n // INDIRECT's text may name a Sheet by a name it has had or now has (ADR-0124): it is volatile.\n for (const sheet of this.#sheets) dirty.addAll(sheet.qualifiedFormulas().map(a => new SheetCell(sheet, a)));\n const from = this.#sheets.includes(initiator) ? initiator : this.#first;\n const recalculated = dirty.size === 0 && !this.#sheets.some(s => s.hasVolatileFormulas)\n ? new Map<Sheet, SheetChange>()\n : Sheet.recalculateWorkbook(this, dirty, from, new Set());\n let own = SheetChange.none;\n for (const sheet of this.#sheets) {\n const change = sheet.diff(before.get(sheet) ?? new Map(), recalculated.get(sheet)?.recalculated ?? []); // oxlint-disable-line ex-grid/no-stand-in-default -- a Sheet put back has no snapshot from before, and a Sheet not recalculated recalculated nothing, as C#'s GetValueOrDefault\n if (sheet === initiator) own = change;\n else this.collect(sheet, change);\n }\n return own;\n }\n\n /**\n * Rewrites every Formula on every Sheet that names a Sheet through `map` and `requalify`, recording each as it was,\n * and marks it to be recalculated: a Formula left naming no Sheet (`=#REF!*2`) is no longer among the qualified ones\n * the change recalculates.\n */\n #rewrite(map: (reference: Reference) => Reference | undefined, requalify: (qualifier: string) => string | undefined, rewritten: RewrittenEntry[], dirty: SheetCellSet): void {\n for (const sheet of this.#sheets) {\n for (const { address, entry } of sheet.formulaEntries()) {\n // A qualified #REF! (Sheet1!#REF!) is no Reference, but its qualifier is rewritten too.\n if (entry.formula?.includes('!') !== true) continue;\n const mapped = Entry.rewrite(entry, map, requalify);\n if (mapped === entry) continue;\n rewritten.push({ sheet, address, entry });\n sheet.replaceEntry(address, mapped);\n dirty.add(new SheetCell(sheet, address));\n }\n }\n }\n\n // ---- 3D References (Workbook.ThreeD.cs) ----\n\n /**\n * A 3D Reference as a Formula is entered with it (ADR-0331 \u00A77): its ends in tab order, each written in its Sheet's\n * own name, and a span of one Sheet written as a Reference to that Sheet. One naming a Sheet the Workbook lacks is\n * left as typed: it is `#NAME?`. @internal\n */\n inTabOrder(reference: Reference): Reference {\n const names = this.#sheets.map(s => s.name);\n const found = ends(reference, names);\n return found === undefined ? reference : spanning(reference, elementAt(names, found[0]), elementAt(names, found[1]));\n }\n\n /** An Entry with every 3D Reference in it written as `inTabOrder` writes one; the same instance when it holds none, or nothing changes. @internal */\n entryInTabOrder(entry: Entry): Entry {\n const parsed = entry.parsed;\n return parsed !== undefined && [...parsed.references()].some(r => r.isThreeD)\n ? Entry.rewrite(entry, r => (r.isThreeD ? this.inTabOrder(r) : r), q => q)\n : entry;\n }\n\n /** Whether `reference` is a 3D Reference whose span holds `sheet`, as the Workbook stands. @internal */\n spans(reference: Reference, sheet: Sheet): boolean {\n if (!reference.isThreeD || reference.sheetName === undefined || reference.lastSheetName === undefined) return false;\n return this.span(reference.sheetName, reference.lastSheetName)?.includes(sheet) === true;\n }\n}\n\nfunction checkDay(today: SheetDay): void {\n const { year, month, day } = today;\n const valid = Number.isInteger(year) && Number.isInteger(month) && Number.isInteger(day) && year >= 1 && year <= 9999\n && month >= 1 && month <= 12 && day >= 1 && day <= daysInMonth(year, month);\n if (!valid) throw new RangeError(`${String(year)}-${String(month)}-${String(day)} is not a calendar day.`);\n if (serialFromDate(year, month, day) === undefined) {\n throw new RangeError('The Sheet Day is a day from 1 January 1900, where Excel\\'s dates begin.');\n }\n}\n\nfunction sameDay(a: SheetDay | undefined, b: SheetDay | undefined): boolean {\n if (a === undefined || b === undefined) return a === b;\n return a.year === b.year && a.month === b.month && a.day === b.day;\n}\n\n/**\n * A 3D Reference as the move of the Sheet named `movedName` leaves it: `before` names the Sheets in their order before\n * the move, and `after` after it. An end that stays on its side of the other is kept; one moved past the other hands\n * its end to the Sheet that stood next to it inward.\n */\nfunction moved(reference: Reference, before: readonly string[], after: readonly string[], movedName: string): Reference {\n const found = ends(reference, before);\n if (found === undefined) return reference;\n const [a, b] = found;\n let first = elementAt(before, a);\n let last = elementAt(before, b);\n if (indexOfName(after, first) < indexOfName(after, last)) return reference;\n if (Sheet.names(first, movedName)) first = elementAt(before, a + 1);\n else last = elementAt(before, b - 1);\n return spanning(reference, first, last);\n}\n\n/**\n * A 3D Reference as the deletion of the Sheet named `deletedName` leaves it: an end it names is handed to the Sheet\n * next to it inward, in `before`'s order. `undefined` (`#REF!`) for one whose two ends were that Sheet.\n */\nfunction deleted(reference: Reference, before: readonly string[], deletedName: string): Reference | undefined {\n const found = ends(reference, before);\n if (found === undefined) return reference;\n const [a, b] = found;\n const atA = elementAt(before, a);\n const atB = elementAt(before, b);\n if (a === b) return Sheet.names(atA, deletedName) ? undefined : reference;\n if (!Sheet.names(atA, deletedName) && !Sheet.names(atB, deletedName)) return reference;\n const first = Sheet.names(atA, deletedName) ? elementAt(before, a + 1) : atA;\n const last = Sheet.names(atB, deletedName) ? elementAt(before, b - 1) : atB;\n return spanning(reference, first, last);\n}\n\n/** A 3D Reference's two ends by where they stand in `names`, the first first; `undefined` for any other Reference, or one an end of which no Sheet has. */\nfunction ends(reference: Reference, names: readonly string[]): readonly [number, number] | undefined {\n if (!reference.isThreeD || reference.sheetName === undefined || reference.lastSheetName === undefined) return undefined;\n const a = indexOfName(names, reference.sheetName);\n const b = indexOfName(names, reference.lastSheetName);\n return a < 0 || b < 0 ? undefined : [Math.min(a, b), Math.max(a, b)];\n}\n\n/** The Reference over the Sheets from `first` to `last`; one to that Sheet alone when they are one. */\nfunction spanning(reference: Reference, first: string, last: string): Reference {\n return Sheet.names(first, last)\n ? reference.with({ sheetName: first, lastSheetName: undefined })\n : reference.with({ sheetName: first, lastSheetName: last });\n}\n\nfunction indexOfName(names: readonly string[], name: string): number {\n return names.findIndex(n => equalsIgnoreCase(n, name));\n}\n\n/**\n * What one change to a Workbook did, Sheet by Sheet, reported after its recalculation has completed: every Value it\n * names is already published, and all of them come from that one recalculation (ADR-0047, ADR-0331) \u2014 or, for an\n * operation of several edits, from the last of the recalculations its edits were done with.\n */\nexport class WorkbookChange {\n readonly #changes: readonly { readonly sheet: Sheet; readonly change: SheetChange }[];\n\n /** @internal */\n constructor(changes: readonly { readonly sheet: Sheet; readonly change: SheetChange }[], changesSheets: boolean) {\n this.#changes = changes;\n this.changesSheets = changesSheets;\n }\n\n /** Whether the change added, deleted, renamed, moved or copied a Sheet, so that the Sheets and their tabs may differ (ADR-0331). */\n readonly changesSheets: boolean;\n\n /** The Sheets the change reached, in the Workbook's order: the one it was made on, and every other whose Values or formats it changed. */\n get sheets(): Sheet[] {\n return this.#changes.map(c => c.sheet);\n }\n\n /** What the change did on `sheet`; a change that changed nothing for a Sheet it did not reach. */\n for(sheet: Sheet): SheetChange {\n return this.#changes.find(c => c.sheet === sheet)?.change ?? SheetChange.none;\n }\n}\n\n/**\n * One operation a Workbook has done on one of its Sheets, or on several (`doAll`), as one step of ExSheet's one undo\n * stack (ADR-0048, ADR-0331): undoing it restores what it changed exactly; redoing it does it again.\n */\nexport class WorkbookStep {\n readonly #undo: () => WorkbookChange;\n readonly #redo: () => WorkbookChange;\n #isUndone = false;\n\n /** The ranges the operation changed on `sheet`: what an undo or a redo of it selects, as Excel's do (ADR-0331 \u00A73). None for an operation on the Sheets. */\n readonly ranges: readonly CellRange[];\n\n /** The Sheet the operation was done on: for a Sheet added or copied, the new Sheet. */\n readonly sheet: Sheet;\n\n /** What doing the operation changed. */\n readonly change: WorkbookChange;\n\n /** @internal */\n constructor(\n sheet: Sheet,\n change: WorkbookChange,\n undo: () => WorkbookChange,\n redo: () => WorkbookChange,\n ranges: readonly CellRange[],\n ) {\n this.sheet = sheet;\n this.change = change;\n this.#undo = undo;\n this.#redo = redo;\n this.ranges = [...ranges];\n }\n\n /** Whether the step is currently undone. */\n get isUndone(): boolean {\n return this.#isUndone;\n }\n\n /** Undoes the operation, and says what that changed. Throws when the step is already undone. */\n undo(): WorkbookChange {\n if (this.#isUndone) throw new Error('The step is already undone.');\n const change = this.#undo();\n this.#isUndone = true;\n return change;\n }\n\n /** Does the operation again after `undo`, and says what that changed. Throws when the step is not undone. */\n redo(): WorkbookChange {\n if (!this.#isUndone) throw new Error('Only an undone step can be redone.');\n const change = this.#redo();\n this.#isUndone = false;\n return change;\n }\n}\n\n"],
|
|
5
|
+
"mappings": ";AAOO,SAAS,aAAa,GAAoB;AAC7C,SAAO,KAAK,MAAQ,KAAK;AAC7B;AAGO,SAAS,cAAc,GAAoB;AAC9C,SAAQ,KAAK,MAAQ,KAAK,MAAU,KAAK,MAAQ,KAAK;AAC1D;AAGO,SAAS,qBAAqB,GAAoB;AACrD,SAAO,cAAc,CAAC,KAAK,aAAa,CAAC;AAC7C;AAGO,SAAS,QAAQ,GAAoB;AACxC,SAAO,KAAK;AAChB;AAMO,SAAS,aAAa,GAAoB;AAC7C,MAAI,MAAM,MAAS,KAAK,KAAQ,KAAK,MAAS,MAAM,OAAQ,MAAM,IAAM,QAAO;AAC/E,MAAI,IAAI,KAAQ,QAAO;AACvB,SAAO,MAAM,QAAW,KAAK,QAAU,KAAK,QAAW,MAAM,QAAU,MAAM,QAAU,MAAM,QAAU,MAAM,QACtG,MAAM;AACjB;AAEA,IAAM,SAAS;AACf,IAAM,eAAe;AAGd,SAAS,SAAS,GAAoB;AACzC,MAAI,IAAI,IAAM,QAAO,cAAc,CAAC;AACpC,SAAO,OAAO,KAAK,OAAO,aAAa,CAAC,CAAC;AAC7C;AAGO,SAAS,QAAQ,GAAoB;AACxC,MAAI,IAAI,IAAM,QAAO,aAAa,CAAC;AACnC,SAAO,aAAa,KAAK,OAAO,aAAa,CAAC,CAAC;AACnD;AAGO,SAAS,eAAeA,OAAsB;AACjD,MAAI,QAAQ;AACZ,MAAI,MAAMA,MAAK;AACf,SAAO,QAAQ,OAAO,aAAaA,MAAK,WAAW,KAAK,CAAC,EAAG;AAC5D,SAAO,MAAM,SAAS,aAAaA,MAAK,WAAW,MAAM,CAAC,CAAC,EAAG;AAC9D,SAAOA,MAAK,MAAM,OAAO,GAAG;AAChC;AAYO,SAAS,YAAYC,OAAc,GAAmB;AACzD,MAAI,MAAMA,MAAK;AACf,SAAO,MAAM,KAAKA,MAAK,MAAM,CAAC,MAAM,EAAG;AACvC,SAAOA,MAAK,MAAM,GAAG,GAAG;AAC5B;AAMO,SAAS,eAAe,GAAmB;AAC9C,MAAI,IAAI,IAAM,QAAO,KAAK,MAAQ,KAAK,MAAO,IAAI,KAAO;AACzD,QAAMC,SAAQ,OAAO,aAAa,CAAC,EAAE,YAAY;AACjD,SAAOA,OAAM,WAAW,IAAIA,OAAM,WAAW,CAAC,IAAI;AACtD;AAGO,SAAS,eAAe,GAAmB;AAC9C,MAAI,IAAI,IAAM,QAAO,KAAK,MAAQ,KAAK,KAAO,IAAI,KAAO;AACzD,QAAMC,SAAQ,OAAO,aAAa,CAAC,EAAE,YAAY;AACjD,SAAOA,OAAM,WAAW,IAAIA,OAAM,WAAW,CAAC,IAAI;AACtD;AAGO,SAAS,iBAAiBF,OAAsB;AACnD,MAAI,SAAS;AACb,WAAS,IAAI,GAAG,IAAIA,MAAK,QAAQ,IAAK,WAAU,OAAO,aAAa,eAAeA,MAAK,WAAW,CAAC,CAAC,CAAC;AACtG,SAAO;AACX;AAUO,SAAS,iBAAiB,GAAW,GAAoB;AAC5D,MAAI,EAAE,WAAW,EAAE,OAAQ,QAAO;AAClC,WAAS,IAAI,GAAG,IAAI,EAAE,QAAQ,KAAK;AAC/B,UAAM,IAAI,EAAE,WAAW,CAAC;AACxB,UAAM,IAAI,EAAE,WAAW,CAAC;AACxB,QAAI,MAAM,KAAK,eAAe,CAAC,MAAM,eAAe,CAAC,EAAG,QAAO;AAAA,EACnE;AACA,SAAO;AACX;AAGO,SAAS,kBAAkB,GAAW,GAAmB;AAC5D,QAAM,SAAS,KAAK,IAAI,EAAE,QAAQ,EAAE,MAAM;AAC1C,WAAS,IAAI,GAAG,IAAI,QAAQ,KAAK;AAC7B,UAAM,IAAI,eAAe,EAAE,WAAW,CAAC,CAAC;AACxC,UAAM,IAAI,eAAe,EAAE,WAAW,CAAC,CAAC;AACxC,QAAI,MAAM,EAAG,QAAO,IAAI;AAAA,EAC5B;AACA,SAAO,EAAE,SAAS,EAAE;AACxB;AAGO,SAAS,eAAe,GAAW,GAAmB;AACzD,QAAM,SAAS,KAAK,IAAI,EAAE,QAAQ,EAAE,MAAM;AAC1C,WAAS,IAAI,GAAG,IAAI,QAAQ,KAAK;AAC7B,UAAM,IAAI,EAAE,WAAW,CAAC;AACxB,UAAM,IAAI,EAAE,WAAW,CAAC;AACxB,QAAI,MAAM,EAAG,QAAO,IAAI;AAAA,EAC5B;AACA,SAAO,EAAE,SAAS,EAAE;AACxB;AAGO,SAAS,aAAaG,OAAc,IAAYC,OAAuB;AAC1E,SAAOD,MAAK,WAAWC,OAAM,EAAE;AACnC;AAGO,SAAS,uBAAuBD,OAAc,IAAYC,OAAuB;AACpF,MAAI,KAAKA,MAAK,SAASD,MAAK,OAAQ,QAAO;AAC3C,SAAO,iBAAiBA,MAAK,MAAM,IAAI,KAAKC,MAAK,MAAM,GAAGA,KAAI;AAClE;AAGO,SAAS,cAAcD,OAAsB;AAChD,SAAO,iBAAiBA,KAAI;AAChC;AAKO,SAAS,gBAAgB,GAAmB;AAC/C,MAAI,CAAC,OAAO,SAAS,CAAC,EAAG,QAAO;AAChC,QAAM,QAAQ,KAAK,MAAM,CAAC;AAC1B,QAAM,aAAa,IAAI;AACvB,QAAME,WAAU,aAAa,MAAM,QAAQ,aAAa,MAAM,QAAQ,IAAI,QAAQ,MAAM,IAAI,QAAQ,QAAQ;AAC5G,SAAOA,aAAY,KAAK,IAAI,IAAI,KAAKA;AACzC;AAGO,SAAS,sBAAsB,GAAmB;AACrD,MAAI,CAAC,OAAO,SAAS,CAAC,EAAG,QAAO;AAChC,QAAM,YAAY,KAAK,MAAM,KAAK,IAAI,CAAC,IAAI,GAAG;AAE9C,QAAM,YAAY,YAAY,KAAK,IAAI,CAAC,IAAI,MAAM,YAAY,IAAI;AAClE,SAAO,IAAI,IAAI,CAAC,YAAY;AAChC;AAEA,IAAM,UAAU,IAAI,SAAS,IAAI,YAAY,CAAC,CAAC;AAGxC,SAAS,WAAW,GAAmB;AAC1C,UAAQ,WAAW,GAAG,CAAC;AACvB,SAAO,QAAQ,YAAY,CAAC;AAChC;AAGO,SAAS,WAAW,MAAsB;AAC7C,UAAQ,YAAY,GAAG,OAAO,OAAO,IAAI,IAAI,CAAC;AAC9C,SAAO,QAAQ,WAAW,CAAC;AAC/B;AAGO,SAAS,aAAa,GAAmB;AAC5C,MAAI,OAAO,MAAM,CAAC,KAAK,MAAM,SAAU,QAAO;AAC9C,MAAI,MAAM,EAAG,QAAO,OAAO;AAC3B,QAAM,OAAO,WAAW,CAAC;AACzB,SAAO,WAAW,IAAI,IAAI,OAAO,KAAK,OAAO,EAAE;AACnD;AAGO,SAAS,aAAa,GAAmB;AAC5C,MAAI,OAAO,MAAM,CAAC,KAAK,MAAM,UAAW,QAAO;AAC/C,MAAI,MAAM,EAAG,QAAO,CAAC,OAAO;AAC5B,QAAM,OAAO,WAAW,CAAC;AACzB,SAAO,WAAW,IAAI,IAAI,OAAO,KAAK,OAAO,EAAE;AACnD;AAGO,SAAS,eAAe,GAAoB;AAC/C,UAAQ,WAAW,CAAC,IAAI,QAAQ;AACpC;AAMO,SAAS,OAAO,GAAW,GAAmB;AACjD,MAAI,IAAI;AACR,MAAI,IAAI;AACR,MAAI,IAAI,MAAM;AACV,SAAK,KAAK;AACV,SAAK;AACL,QAAI,IAAI,MAAM;AACV,WAAK,KAAK;AACV,WAAK;AACL,UAAI,IAAI,KAAM,KAAI;AAAA,IACtB;AAAA,EACJ,WAAW,IAAI,OAAO;AAElB,SAAK,KAAK,QAAQ,KAAK;AACvB,SAAK,OAAO;AACZ,QAAI,IAAI,OAAO;AACX,WAAK,KAAK,QAAQ,KAAK;AACvB,WAAK,OAAO;AACZ,UAAI,IAAI,MAAO,KAAI;AAAA,IACvB;AAAA,EACJ;AACA,SAAO,IAAI,KAAK;AACpB;AAQO,SAAS,aAAa,GAAW,GAAmB;AACvD,QAAM,IAAI,IAAI;AACd,QAAM,CAAC,OAAO,IAAI,IAAI,MAAM,CAAC;AAC7B,QAAM,CAAC,OAAO,IAAI,IAAI,MAAM,CAAC;AAC7B,SAAS,QAAQ,QAAQ,IAAK,QAAQ,OAAO,OAAO,QAAS,OAAO;AACxE;AAEA,IAAM,WAAW;AAEjB,SAAS,MAAM,GAA6B;AACxC,QAAM,IAAI,WAAW;AACrB,QAAM,OAAO,KAAK,IAAI;AACtB,SAAO,CAAC,MAAM,IAAI,IAAI;AAC1B;AAGO,SAAS,kBAAkB,GAAW,GAAW,cAA8B;AAClF,MAAI,iBAAiB,EAAE,IAAI,GAAI,OAAM,IAAI,MAAM,qEAAqE;AACpH,SAAO,aAAa,GAAG,CAAC;AAC5B;AASA,SAAS,YAAY,GAAW,QAAsD;AAClF,QAAM,UAAU,KAAK,IAAI,CAAC,EAAE,cAAc,SAAS,CAAC;AACpD,QAAM,IAAI,QAAQ,QAAQ,GAAG;AAC7B,SAAO,EAAE,QAAQ,QAAQ,MAAM,GAAG,CAAC,EAAE,QAAQ,KAAK,EAAE,GAAG,UAAU,OAAO,QAAQ,MAAM,IAAI,CAAC,CAAC,EAAE;AAClG;AAGA,SAAS,SAAS,GAAiD;AAC/D,QAAM,UAAU,KAAK,IAAI,CAAC,EAAE,cAAc;AAC1C,QAAM,IAAI,QAAQ,QAAQ,GAAG;AAC7B,SAAO,EAAE,QAAQ,QAAQ,MAAM,GAAG,CAAC,EAAE,QAAQ,KAAK,EAAE,GAAG,UAAU,OAAO,QAAQ,MAAM,IAAI,CAAC,CAAC,EAAE;AAClG;AAGA,SAAS,aAAa,UAAkB,SAAyB;AAC7D,SAAO,IAAI,WAAW,IAAI,MAAM,GAAG,GAAG,OAAO,KAAK,IAAI,QAAQ,CAAC,EAAE,SAAS,SAAS,GAAG,CAAC;AAC3F;AAMO,SAAS,kBAAkB,GAAW,QAAwB;AACjE,MAAI,CAAC,OAAO,SAAS,CAAC,EAAG,OAAM,IAAI,WAAW,GAAG,OAAO,CAAC,CAAC,2BAA2B;AACrF,QAAM,OAAO,IAAI,KAAK,OAAO,GAAG,GAAG,EAAE,IAAI,MAAM;AAC/C,MAAI,MAAM,EAAG,QAAO,GAAG,IAAI,IAAI,SAAS,IAAI,IAAI,IAAI,OAAO,MAAM,CAAC,KAAK,EAAE;AACzE,QAAM,EAAE,QAAQ,GAAG,SAAS,IAAI,YAAY,GAAG,SAAS,CAAC;AACzD,SAAO,GAAG,IAAI,GAAG,EAAE,OAAO,CAAC,CAAC,GAAG,SAAS,IAAI,IAAI,EAAE,MAAM,CAAC,CAAC,KAAK,EAAE,GAAG,aAAa,UAAU,CAAC,CAAC;AACjG;AAGA,SAAS,QAAQ,UAAmB,QAAgB,UAAkB,WAAmB,kBAA0B,cAA8B;AAC7I,QAAM,UAAU,OAAO,QAAQ,OAAO,EAAE;AACxC,QAAM,OAAO,YAAY,KAAK,MAAM;AACpC,QAAM,OAAO,WAAW,eAAe;AACvC,MAAI,YAAY,aAAa,WAAW,IAAI;AACxC,UAAM,WAAW,KAAK,SAAS,IAAI,GAAG,KAAK,OAAO,CAAC,CAAC,GAAG,gBAAgB,GAAG,KAAK,MAAM,CAAC,CAAC,KAAK;AAC5F,WAAO,GAAG,IAAI,GAAG,QAAQ,GAAG,aAAa,UAAU,CAAC,CAAC;AAAA,EACzD;AACA,MAAI,WAAW,EAAG,QAAO,GAAG,IAAI,IAAI,gBAAgB,GAAG,IAAI,OAAO,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI;AACvF,MAAI,KAAK,UAAU,WAAW,EAAG,QAAO,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,OAAO,WAAW,IAAI,KAAK,MAAM,CAAC;AAC/F,SAAO,GAAG,IAAI,GAAG,KAAK,MAAM,GAAG,WAAW,CAAC,CAAC,GAAG,gBAAgB,GAAG,KAAK,MAAM,WAAW,CAAC,CAAC;AAC9F;AAGO,SAAS,gBAAgB,GAAmB;AAC/C,MAAI,OAAO,MAAM,CAAC,EAAG,QAAO;AAC5B,MAAI,MAAM,SAAU,QAAO;AAC3B,MAAI,MAAM,UAAW,QAAO;AAC5B,MAAI,MAAM,EAAG,QAAO,OAAO,GAAG,GAAG,EAAE,IAAI,OAAO;AAC9C,QAAM,EAAE,QAAQ,SAAS,IAAI,SAAS,CAAC;AACvC,SAAO,QAAQ,IAAI,GAAG,QAAQ,UAAU,IAAI,KAAK,GAAG;AACxD;AAGO,SAAS,cAAc,GAAW,WAAmB,mBAAmB,KAAK,eAAe,KAAa;AAC5G,MAAI,CAAC,OAAO,SAAS,CAAC,EAAG,OAAM,IAAI,WAAW,GAAG,OAAO,CAAC,CAAC,4BAA4B;AACtF,MAAI,MAAM,EAAG,QAAO,OAAO,GAAG,GAAG,EAAE,IAAI,GAAG,YAAY,MAAM;AAC5D,QAAM,EAAE,QAAQ,SAAS,IAAI,YAAY,GAAG,SAAS;AACrD,SAAO,QAAQ,IAAI,GAAG,QAAQ,UAAU,WAAW,kBAAkB,YAAY;AACrF;AAGO,SAAS,IAAI,GAAW,OAAuB;AAClD,SAAO,EAAE,SAAS,EAAE,EAAE,YAAY,EAAE,SAAS,OAAO,GAAG;AAC3D;AAaO,SAAS,qBAAqBC,OAAsB;AACvD,QAAM,QAAQ,wBAAwBA,KAAI;AAC1C,MAAI,UAAU,OAAW,OAAM,IAAI,MAAM,cAAcA,KAAI,8BAA8B;AACzF,SAAO;AACX;AAEA,IAAM,eAAe;AAOd,SAAS,wBAAwBA,OAAkC;AACtE,MAAI,aAAa,KAAKA,KAAI,EAAG,QAAO,OAAOA,MAAK,KAAK,CAAC;AAEtD,QAAM,SAAS,6CAA6C,KAAKA,KAAI;AACrE,MAAI,WAAW,KAAM,QAAO;AAC5B,MAAI,OAAO,CAAC,GAAG,YAAY,MAAM,MAAO,QAAO,OAAO;AACtD,SAAO,OAAO,CAAC,MAAM,MAAM,YAAY;AAC3C;;;AChXO,IAAM,cAAN,cAA0B,UAAU;AAAA;AAAA,EAEvC,YAAY,SAAiB;AACzB,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EAChB;AACJ;;;ACNO,IAAM,WAAW;AAGjB,IAAM,cAAc;AAOpB,IAAM,cAAN,MAAM,aAAY;AAAA,EACZ;AAAA,EACA;AAAA;AAAA,EAGT,YAAYC,MAAaC,SAAgB;AACrC,QAAI,CAAC,OAAO,UAAUD,IAAG,KAAKA,OAAM,KAAKA,QAAO,SAAU,OAAM,IAAI,WAAW,iBAAiB,WAAW,CAAC,KAAKA,IAAG,UAAU;AAC9H,QAAI,CAAC,OAAO,UAAUC,OAAM,KAAKA,UAAS,KAAKA,WAAU,YAAa,OAAM,IAAI,WAAW,oBAAoB,cAAc,CAAC,KAAKA,OAAM,UAAU;AACnJ,SAAK,OAAOD;AACZ,SAAK,UAAUC;AAAA,EACnB;AAAA;AAAA,EAGA,IAAI,MAAc;AACd,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA,EAGA,IAAI,SAAiB;AACjB,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA,EAGA,IAAI,MAAc;AACd,WAAO,KAAK,OAAO,cAAc,KAAK;AAAA,EAC1C;AAAA;AAAA,EAGA,OAAO,QAAQ,KAA0B;AACrC,WAAO,IAAI,aAAY,KAAK,MAAM,MAAM,WAAW,GAAG,MAAM,WAAW;AAAA,EAC3E;AAAA;AAAA,EAGA,OAAO,OAA6B;AAChC,WAAO,KAAK,SAAS,MAAM,QAAQ,KAAK,YAAY,MAAM;AAAA,EAC9D;AAAA;AAAA,EAGA,UAAU,OAA4B;AAClC,WAAO,KAAK,SAAS,MAAM,OAAO,KAAK,OAAO,MAAM,OAAO,KAAK,UAAU,MAAM;AAAA,EACpF;AAAA;AAAA,EAGA,OAAO,MAAMC,OAA2B;AACpC,UAAM,UAAU,aAAY,SAASA,KAAI;AACzC,QAAI,YAAY,OAAW,OAAM,IAAI,YAAY,IAAIA,KAAI,gDAAgD;AACzG,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,SAASA,OAAuC;AACnD,QAAIA,MAAK,WAAW,EAAG,QAAO;AAC9B,QAAI,IAAI;AACR,QAAID,UAAS;AACb,WAAO,IAAIC,MAAK,UAAU,cAAcA,MAAK,WAAW,CAAC,CAAC,GAAG;AACzD,UAAI,MAAM,EAAG,QAAO;AACpB,MAAAD,UAASA,UAAS,MAAM,eAAeC,MAAK,WAAW,CAAC,CAAC,IAAI,KAAO;AACpE;AAAA,IACJ;AACA,QAAI,MAAM,KAAK,MAAMA,MAAK,OAAQ,QAAO;AACzC,QAAIA,MAAK,CAAC,MAAM,IAAK,QAAO;AAC5B,QAAIF,OAAM;AACV,WAAO,IAAIE,MAAK,QAAQ,KAAK;AACzB,UAAI,CAAC,aAAaA,MAAK,WAAW,CAAC,CAAC,KAAKF,OAAM,SAAU,QAAO;AAChE,MAAAA,OAAMA,OAAM,MAAME,MAAK,WAAW,CAAC,IAAI;AAAA,IAC3C;AACA,QAAID,UAAS,eAAeD,OAAM,SAAU,QAAO;AACnD,WAAO,IAAI,aAAYA,OAAM,GAAGC,UAAS,CAAC;AAAA,EAC9C;AAAA;AAAA,EAGA,OAAO,WAAWA,SAAwB;AACtC,QAAI,CAAC,OAAO,UAAUA,OAAM,KAAKA,UAAS,KAAKA,WAAU,YAAa,OAAM,IAAI,WAAW,oBAAoB,cAAc,CAAC,KAAKA,OAAM,UAAU;AACnJ,QAAI,OAAO;AACX,QAAI,IAAIA,UAAS;AACjB,WAAO,IAAI,GAAG;AACV;AACA,aAAO,OAAO,aAAa,KAAQ,IAAI,EAAG,IAAI;AAC9C,UAAI,KAAK,MAAM,IAAI,EAAE;AAAA,IACzB;AACA,WAAO;AAAA,EACX;AAAA;AAAA,EAGA,OAAO,eAAe,SAAqC;AACvD,QAAI,QAAQ,WAAW,KAAK,QAAQ,SAAS,EAAG,QAAO;AACvD,QAAI,IAAI;AACR,aAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACrC,YAAM,IAAI,QAAQ,WAAW,CAAC;AAC9B,UAAI,CAAC,cAAc,CAAC,EAAG,QAAO;AAC9B,UAAI,IAAI,MAAM,eAAe,CAAC,IAAI,KAAO;AAAA,IAC7C;AACA,QAAI,IAAI,YAAa,QAAO;AAC5B,WAAO,IAAI;AAAA,EACf;AAAA;AAAA,EAGA,WAAmB;AACf,WAAO,aAAY,WAAW,KAAK,OAAO,IAAI,OAAO,KAAK,OAAO,CAAC;AAAA,EACtE;AACJ;;;AC3GO,IAAM,aAAN,MAAM,YAAW;AAAA;AAAA,EAEX;AAAA,EAED,YAAY,OAAe;AAC/B,SAAK,SAAS;AAAA,EAClB;AAAA;AAAA,EAGA,OAAgB,YAAY,IAAI,YAAW,EAAE;AAAA;AAAA,EAG7C,OAAO,QAAQ,KAAyB;AACpC,QAAI,CAAC,OAAO,UAAU,GAAG,KAAK,MAAM,KAAK,MAAM,SAAU,OAAM,IAAI,WAAW,8CAA8C,OAAO,GAAG,CAAC,GAAG;AAC1I,WAAO,IAAI,YAAW,GAAG;AAAA,EAC7B;AAAA;AAAA,EAGA,OAAO,UAAU,KAAa,OAAe,MAA0B;AACnE,eAAWE,SAAQ,CAAC,KAAK,OAAO,IAAI;AAChC,UAAI,CAAC,OAAO,UAAUA,KAAI,KAAKA,QAAO,KAAKA,QAAO,IAAK,OAAM,IAAI,WAAW,oCAAoC,OAAOA,KAAI,CAAC,GAAG;AACnI,WAAO,IAAI,YAAY,OAAO,KAAO,SAAS,IAAK,IAAI;AAAA,EAC3D;AAAA;AAAA,EAGA,OAAO,QAAQC,OAAkD;AAC7D,QAAIA,UAAS,UAAa,CAAC,qBAAqB,KAAKA,KAAI,EAAG,QAAO;AACnE,WAAO,YAAW,QAAQ,OAAO,SAASA,MAAK,MAAM,CAAC,GAAG,EAAE,CAAC;AAAA,EAChE;AAAA;AAAA,EAGA,IAAI,cAAuB;AACvB,WAAO,KAAK,SAAS;AAAA,EACzB;AAAA;AAAA,EAGA,IAAI,MAAc;AACd,QAAI,KAAK,YAAa,OAAM,IAAI,MAAM,2CAA2C;AACjF,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA,EAGA,IAAI,MAAc;AACd,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA,EAGA,OAAO,OAA4B;AAC/B,WAAO,KAAK,WAAW,MAAM;AAAA,EACjC;AAAA;AAAA,EAGA,WAAmB;AACf,WAAO,KAAK,cAAc,cAAc,IAAI,IAAI,KAAK,QAAQ,CAAC,CAAC;AAAA,EACnE;AACJ;AASO,IAAM,WAAN,MAAM,UAAS;AAAA;AAAA,EAET;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA,EAET,YAAY,QAAiH,CAAC,GAAG;AAC7H,SAAK,SAAS,MAAM,UAAU,WAAW;AACzC,SAAK,OAAO,MAAM,SAAS;AAC3B,SAAK,SAAS,MAAM,WAAW;AAC/B,SAAK,YAAY,MAAM,cAAc;AACrC,SAAK,gBAAgB,MAAM,kBAAkB;AAAA,EACjD;AAAA;AAAA,EAGA,OAAgB,UAAU,IAAI,UAAS;AAAA;AAAA,EAGvC,KAAK,OAA0H;AAC3H,WAAO,IAAI,UAAS;AAAA,MAChB,QAAQ,MAAM,UAAU,KAAK;AAAA,MAC7B,MAAM,MAAM,QAAQ,KAAK;AAAA,MACzB,QAAQ,MAAM,UAAU,KAAK;AAAA,MAC7B,WAAW,MAAM,aAAa,KAAK;AAAA,MACnC,eAAe,MAAM,iBAAiB,KAAK;AAAA,IAC/C,CAAC;AAAA,EACL;AAAA;AAAA,EAGA,IAAI,MAAc;AACd,WAAO,GAAG,OAAO,KAAK,OAAO,GAAG,CAAC,GAAG,KAAK,OAAO,MAAM,EAAE,GAAG,KAAK,SAAS,MAAM,EAAE,GAAG,KAAK,YAAY,MAAM,EAAE,GAAG,KAAK,gBAAgB,MAAM,EAAE;AAAA,EACjJ;AAAA;AAAA,EAGA,OAAO,OAA0B;AAC7B,WAAO,KAAK,OAAO,OAAO,MAAM,MAAM,KAAK,KAAK,SAAS,MAAM,QAAQ,KAAK,WAAW,MAAM,UACtF,KAAK,cAAc,MAAM,aAAa,KAAK,kBAAkB,MAAM;AAAA,EAC9E;AACJ;AAMO,IAAM,WAAN,MAAM,UAAS;AAAA;AAAA,EAET;AAAA,EAED,YAAY,QAAgC;AAChD,SAAK,SAAS;AAAA,EAClB;AAAA;AAAA,EAGA,OAAgB,OAAO,IAAI,UAAS,MAAS;AAAA;AAAA;AAAA;AAAA;AAAA,EAM7C,OAAO,MAAM,QAA8B;AACvC,QAAI,OAAO,YAAa,OAAM,IAAI,WAAW,iDAAiD;AAC9F,WAAO,IAAI,UAAS,MAAM;AAAA,EAC9B;AAAA;AAAA,EAGA,IAAI,SAAkB;AAClB,WAAO,KAAK,WAAW;AAAA,EAC3B;AAAA;AAAA,EAGA,IAAI,MAAc;AACd,WAAO,KAAK,WAAW,SAAY,KAAK,KAAK,OAAO;AAAA,EACxD;AAAA;AAAA,EAGA,OAAO,OAA0B;AAC7B,WAAO,KAAK,QAAQ,MAAM;AAAA,EAC9B;AACJ;AAOO,IAAM,mBAA+C;AAAA,EAAC;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAU;AAAA,EAAS;AAAA,EAAU;AAAA,EAAU;AAAA,EAAU;AAAA,EAClI;AAAA,EAAc;AAAA,EAAgB;AAAA,EAAiB;AAAA,EAAoB;AAAgB;AAGhF,IAAM,aAAN,MAAM,YAAW;AAAA;AAAA,EAEX;AAAA;AAAA,EAEA;AAAA;AAAA,EAGT,YAAY,OAAwB,SAAqB,WAAW,WAAW;AAC3E,QAAI,CAAC,iBAAiB,SAAS,KAAK,EAAG,OAAM,IAAI,WAAW,qBAAqB,KAAK,GAAG;AACzF,SAAK,QAAQ;AACb,SAAK,SAAS,UAAU,SAAS,WAAW,YAAY;AAAA,EAC5D;AAAA;AAAA,EAGA,OAAgB,OAAO,IAAI,YAAW,MAAM;AAAA;AAAA,EAG5C,IAAI,SAAkB;AAClB,WAAO,KAAK,UAAU;AAAA,EAC1B;AAAA;AAAA,EAGA,IAAI,MAAc;AACd,WAAO,GAAG,KAAK,KAAK,IAAI,OAAO,KAAK,OAAO,GAAG,CAAC;AAAA,EACnD;AAAA;AAAA,EAGA,OAAO,OAA4B;AAC/B,WAAO,KAAK,UAAU,MAAM,SAAS,KAAK,OAAO,OAAO,MAAM,MAAM;AAAA,EACxE;AACJ;AASO,IAAM,cAAN,MAAM,aAAY;AAAA;AAAA,EAEZ;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA,EAET,YAAY,QAA0F,CAAC,GAAG;AACtG,SAAK,MAAM,MAAM,OAAO,WAAW;AACnC,SAAK,SAAS,MAAM,UAAU,WAAW;AACzC,SAAK,OAAO,MAAM,QAAQ,WAAW;AACrC,SAAK,QAAQ,MAAM,SAAS,WAAW;AAAA,EAC3C;AAAA;AAAA,EAGA,OAAgB,OAAO,IAAI,aAAY;AAAA;AAAA,EAGvC,KAAK,OAAsG;AACvG,WAAO,IAAI,aAAY;AAAA,MACnB,KAAK,MAAM,OAAO,KAAK;AAAA,MACvB,QAAQ,MAAM,UAAU,KAAK;AAAA,MAC7B,MAAM,MAAM,QAAQ,KAAK;AAAA,MACzB,OAAO,MAAM,SAAS,KAAK;AAAA,IAC/B,CAAC;AAAA,EACL;AAAA;AAAA,EAGA,IAAI,MAAc;AACd,WAAO,GAAG,KAAK,IAAI,GAAG,IAAI,KAAK,OAAO,GAAG,IAAI,KAAK,KAAK,GAAG,IAAI,KAAK,MAAM,GAAG;AAAA,EAChF;AAAA;AAAA,EAGA,OAAO,OAA6B;AAChC,WAAO,KAAK,IAAI,OAAO,MAAM,GAAG,KAAK,KAAK,OAAO,OAAO,MAAM,MAAM,KAAK,KAAK,KAAK,OAAO,MAAM,IAAI,KAAK,KAAK,MAAM,OAAO,MAAM,KAAK;AAAA,EAC1I;AACJ;AAsBO,IAAM,aAAN,MAAiB;AAAA;AAAA,EAEX;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA,EAET,YACI,cACA,WACA,MACA,MACA,SACF;AACE,SAAK,eAAe;AACpB,SAAK,YAAY;AACjB,SAAK,OAAO;AACZ,SAAK,OAAO;AACZ,SAAK,UAAU;AAAA,EACnB;AAAA;AAAA,EAGA,IAAI,MAAc;AACd,WAAO,GAAG,KAAK,aAAa,IAAI,KAAS,KAAK,SAAS,KAAS,KAAK,KAAK,GAAG,KAAS,OAAO,KAAK,KAAK,GAAG,CAAC,KAAS,KAAK,QAAQ,GAAG;AAAA,EACxI;AAAA;AAAA,EAGA,OAAO,OAA4B;AAC/B,WAAO,KAAK,aAAa,OAAO,MAAM,YAAY,KAAK,KAAK,cAAc,MAAM,aAAa,KAAK,KAAK,OAAO,MAAM,IAAI,KACjH,KAAK,KAAK,OAAO,MAAM,IAAI,KAAK,KAAK,QAAQ,OAAO,MAAM,OAAO;AAAA,EAC5E;AACJ;;;ACxSO,IAAM,YAAN,MAAM,WAAU;AAAA,EACV;AAAA,EACA;AAAA;AAAA,EAGT,YAAY,SAAsB,UAAuB,SAAS;AAC9D,SAAK,SAAS,IAAI,YAAY,KAAK,IAAI,QAAQ,KAAK,QAAQ,GAAG,GAAG,KAAK,IAAI,QAAQ,QAAQ,QAAQ,MAAM,CAAC;AAC1G,SAAK,QAAQ,IAAI,YAAY,KAAK,IAAI,QAAQ,KAAK,QAAQ,GAAG,GAAG,KAAK,IAAI,QAAQ,QAAQ,QAAQ,MAAM,CAAC;AAAA,EAC7G;AAAA;AAAA,EAGA,IAAI,QAAqB;AACrB,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA,EAGA,IAAI,OAAoB;AACpB,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA,EAGA,IAAI,WAAmB;AACnB,WAAO,KAAK,MAAM,MAAM,KAAK,OAAO,MAAM;AAAA,EAC9C;AAAA;AAAA,EAGA,IAAI,cAAsB;AACtB,WAAO,KAAK,MAAM,SAAS,KAAK,OAAO,SAAS;AAAA,EACpD;AAAA;AAAA,EAGA,IAAI,YAAoB;AACpB,WAAO,KAAK,WAAW,KAAK;AAAA,EAChC;AAAA;AAAA,EAGA,SAAS,SAA+B;AACpC,WAAO,QAAQ,OAAO,KAAK,OAAO,OAAO,QAAQ,OAAO,KAAK,MAAM,OAC5D,QAAQ,UAAU,KAAK,OAAO,UAAU,QAAQ,UAAU,KAAK,MAAM;AAAA,EAChF;AAAA;AAAA,EAGA,IAAI,iBAA0B;AAC1B,WAAO,KAAK,OAAO,QAAQ,KAAK,KAAK,MAAM,QAAQ,WAAW;AAAA,EAClE;AAAA;AAAA,EAGA,IAAI,cAAuB;AACvB,WAAO,KAAK,OAAO,WAAW,KAAK,KAAK,MAAM,WAAW,cAAc;AAAA,EAC3E;AAAA;AAAA,EAGA,OAAO,OAA2B;AAC9B,WAAO,KAAK,OAAO,OAAO,MAAM,MAAM,KAAK,KAAK,MAAM,OAAO,MAAM,KAAK;AAAA,EAC5E;AAAA;AAAA,EAGA,OAAO,aAAa,OAAe,MAAyB;AACxD,WAAO,IAAI,WAAU,IAAI,YAAY,GAAG,KAAK,GAAG,IAAI,YAAY,WAAW,GAAG,IAAI,CAAC;AAAA,EACvF;AAAA;AAAA,EAGA,OAAO,UAAU,OAAe,MAAyB;AACrD,WAAO,IAAI,WAAU,IAAI,YAAY,OAAO,CAAC,GAAG,IAAI,YAAY,MAAM,cAAc,CAAC,CAAC;AAAA,EAC1F;AAAA;AAAA,EAGA,CAAC,QAAuC;AACpC,aAASC,OAAM,KAAK,OAAO,KAAKA,QAAO,KAAK,MAAM,KAAKA,QAAO;AAC1D,eAASC,UAAS,KAAK,OAAO,QAAQA,WAAU,KAAK,MAAM,QAAQA,UAAU,OAAM,IAAI,YAAYD,MAAKC,OAAM;AAAA,IAClH;AAAA,EACJ;AAAA;AAAA,EAGA,OAAO,MAAMC,OAAyB;AAClC,UAAM,QAAQ,WAAU,SAASA,KAAI;AACrC,QAAI,UAAU,OAAW,OAAM,IAAI,YAAY,IAAIA,KAAI,4CAA4C;AACnG,WAAO;AAAA,EACX;AAAA;AAAA,EAGA,OAAO,SAASA,OAAqC;AACjD,UAAM,QAAQA,MAAK,QAAQ,GAAG;AAC9B,QAAI,QAAQ,GAAG;AACX,YAAM,SAAS,YAAY,SAASA,KAAI;AACxC,aAAO,WAAW,SAAY,SAAY,IAAI,WAAU,MAAM;AAAA,IAClE;AACA,UAAMC,QAAOD,MAAK,MAAM,GAAG,KAAK;AAChC,UAAME,SAAQF,MAAK,MAAM,QAAQ,CAAC;AAClC,UAAM,KAAK,YAAY,eAAeC,KAAI;AAC1C,UAAM,KAAK,YAAY,eAAeC,MAAK;AAC3C,QAAI,OAAO,UAAa,OAAO,OAAW,QAAO,WAAU,aAAa,KAAK,IAAI,IAAI,EAAE,GAAG,KAAK,IAAI,IAAI,EAAE,CAAC;AAC1G,UAAM,KAAK,SAASD,KAAI;AACxB,UAAM,KAAK,SAASC,MAAK;AACzB,QAAI,OAAO,UAAa,OAAO,OAAW,QAAO,WAAU,UAAU,KAAK,IAAI,IAAI,EAAE,GAAG,KAAK,IAAI,IAAI,EAAE,CAAC;AACvG,UAAM,IAAI,YAAY,SAASD,KAAI;AACnC,UAAM,IAAI,YAAY,SAASC,MAAK;AACpC,QAAI,MAAM,UAAa,MAAM,OAAW,QAAO;AAC/C,WAAO,IAAI,WAAU,GAAG,CAAC;AAAA,EAC7B;AAAA;AAAA,EAGA,WAAmB;AACf,WAAO,KAAK,OAAO,OAAO,KAAK,KAAK,IAAI,KAAK,OAAO,SAAS,IAAI,GAAG,KAAK,OAAO,SAAS,CAAC,IAAI,KAAK,MAAM,SAAS,CAAC;AAAA,EACvH;AACJ;AAEA,SAAS,SAASF,OAAkC;AAChD,MAAIA,MAAK,WAAW,KAAKA,MAAK,SAAS,KAAKA,MAAK,CAAC,MAAM,IAAK,QAAO;AACpE,WAAS,IAAI,GAAG,IAAIA,MAAK,QAAQ,KAAK;AAClC,QAAI,CAAC,aAAaA,MAAK,WAAW,CAAC,CAAC,EAAG,QAAO;AAAA,EAClD;AACA,QAAM,IAAI,OAAOA,KAAI;AACrB,MAAI,IAAI,SAAU,QAAO;AACzB,SAAO,IAAI;AACf;;;ACvHO,SAAS,UAAwE,MAAoB,OAAkB;AAC1H,QAAM,QAAQ,KAAK,KAAK;AACxB,MAAI,UAAU,QAAW;AACrB,UAAM,IAAI,MAAM,mBAAmB,KAAK,yBAAyB,KAAK,MAAM,GAAG;AAAA,EACnF;AACA,SAAO;AACX;AAGO,SAAS,QAAW,OAAsB,MAAiB;AAC9D,MAAI,UAAU,QAAW;AACrB,UAAM,IAAI,MAAM,aAAa,IAAI,cAAc;AAAA,EACnD;AACA,SAAO;AACX;AAGO,IAAM,WAAW,EAAE,MAAM;AAGzB,IAAM,YAAY,MAAM,OAAO;AAG/B,SAAS,YAAY,OAAqB;AAC7C,QAAM,IAAI,MAAM,aAAa,OAAO,KAAK,CAAC,oCAAoC;AAClF;;;ACOA,IAAM,gBAAgB,CAAC,WAAW,YAAY,SAAS,SAAS,OAAO,QAAQ,QAAQ,UAAU,aAAa,WAAW,YAAY,UAAU;AAC/I,IAAM,cAAc,CAAC,UAAU,UAAU,WAAW,aAAa,YAAY,UAAU,UAAU;AACjG,IAAM,mBAAmB,CAAC,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,KAAK;AACzE,IAAM,iBAAiB,CAAC,WAAM,WAAM,WAAM,WAAM,WAAM,WAAM,WAAM,WAAM,WAAM,YAAO,YAAO,UAAK;AAGjG,IAAM,QAAgC;AAAA,EAClC;AAAA,IACI,MAAM;AAAA,IAAI,mBAAmB;AAAA,IAC7B,wBAAwB;AAAA,IAAK,sBAAsB;AAAA,IAAK,kBAAkB,CAAC,CAAC;AAAA,IAAG,cAAc;AAAA,IAC7F,gBAAgB;AAAA,IAAK,yBAAyB;AAAA,IAAG,yBAAyB;AAAA,IAAG,uBAAuB;AAAA,IACpG,kBAAkB;AAAA,IAAc,iBAAiB;AAAA,IAAY,kBAAkB;AAAA,IAAS,eAAe;AAAA,IACvG,YAAY;AAAA,IACZ,uBAAuB,CAAC,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,KAAK;AAAA,IAC1G,UAAU;AAAA,IAAa,qBAAqB;AAAA,EAChD;AAAA,EACA;AAAA,IACI,MAAM;AAAA,IAAS,mBAAmB;AAAA,IAClC,wBAAwB;AAAA,IAAK,sBAAsB;AAAA,IAAK,kBAAkB,CAAC,CAAC;AAAA,IAAG,cAAc;AAAA,IAC7F,gBAAgB;AAAA,IAAK,yBAAyB;AAAA,IAAG,yBAAyB;AAAA,IAAG,uBAAuB;AAAA,IACpG,kBAAkB;AAAA,IAAY,iBAAiB;AAAA,IAAc,kBAAkB;AAAA,IAAW,eAAe;AAAA,IACzG,YAAY;AAAA,IACZ,uBAAuB,CAAC,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,KAAK;AAAA,IAC1G,UAAU;AAAA,IAAa,qBAAqB;AAAA,EAChD;AAAA,EACA;AAAA,IACI,MAAM;AAAA,IAAS,mBAAmB;AAAA,IAClC,wBAAwB;AAAA,IAAK,sBAAsB;AAAA,IAAK,kBAAkB,CAAC,CAAC;AAAA,IAAG,cAAc;AAAA,IAC7F,gBAAgB;AAAA,IAAK,yBAAyB;AAAA,IAAG,yBAAyB;AAAA,IAAG,uBAAuB;AAAA,IACpG,kBAAkB;AAAA,IAAc,iBAAiB;AAAA,IAAY,kBAAkB;AAAA,IAAS,eAAe;AAAA,IACvG,YAAY;AAAA,IACZ,uBAAuB,CAAC,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,QAAQ,OAAO,OAAO,KAAK;AAAA,IAC3G,UAAU;AAAA,IAAa,qBAAqB;AAAA,EAChD;AAAA,EACA;AAAA,IACI,MAAM;AAAA,IAAS,mBAAmB;AAAA,IAClC,wBAAwB;AAAA,IAAK,sBAAsB;AAAA,IAAK,kBAAkB,CAAC,CAAC;AAAA,IAAG,cAAc;AAAA,IAC7F,gBAAgB;AAAA,IAAK,yBAAyB;AAAA,IAAG,yBAAyB;AAAA,IAAG,uBAAuB;AAAA,IACpG,kBAAkB;AAAA,IAAc,iBAAiB;AAAA,IAAY,kBAAkB;AAAA,IAAS,eAAe;AAAA,IACvG,YAAY,CAAC,UAAU,WAAW,WAAQ,SAAS,OAAO,QAAQ,QAAQ,UAAU,aAAa,WAAW,YAAY,UAAU;AAAA,IAClI,uBAAuB,CAAC,OAAO,OAAO,UAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,KAAK;AAAA,IAC1G,UAAU,CAAC,WAAW,UAAU,YAAY,YAAY,cAAc,WAAW,SAAS;AAAA,IAC1F,qBAAqB,CAAC,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,IAAI;AAAA,EAClE;AAAA,EACA;AAAA,IACI,MAAM;AAAA,IAAS,mBAAmB;AAAA,IAClC,wBAAwB;AAAA,IAAK,sBAAsB;AAAA,IAAK,kBAAkB,CAAC,CAAC;AAAA,IAAG,cAAc;AAAA,IAC7F,gBAAgB;AAAA,IAAK,yBAAyB;AAAA,IAAG,yBAAyB;AAAA,IAAG,uBAAuB;AAAA,IACpG,kBAAkB;AAAA,IAAc,iBAAiB;AAAA,IAAW,kBAAkB;AAAA,IAAQ,eAAe;AAAA,IACrG,YAAY;AAAA,IAAgB,uBAAuB;AAAA,IACnD,UAAU,CAAC,sBAAO,sBAAO,sBAAO,sBAAO,sBAAO,sBAAO,oBAAK;AAAA,IAC1D,qBAAqB,CAAC,UAAK,UAAK,UAAK,UAAK,UAAK,UAAK,QAAG;AAAA,EAC3D;AAAA,EACA;AAAA,IACI,MAAM;AAAA,IAAS,mBAAmB;AAAA,IAClC,wBAAwB;AAAA,IAAK,sBAAsB;AAAA,IAAK,kBAAkB,CAAC,CAAC;AAAA,IAAG,cAAc;AAAA,IAC7F,gBAAgB;AAAA,IAAK,yBAAyB;AAAA,IAAG,yBAAyB;AAAA,IAAG,uBAAuB;AAAA,IACpG,kBAAkB;AAAA,IAAc,iBAAiB;AAAA,IAAY,kBAAkB;AAAA,IAAS,eAAe;AAAA,IACvG,YAAY,CAAC,WAAW,cAAW,QAAQ,SAAS,OAAO,QAAQ,WAAW,WAAQ,aAAa,WAAW,YAAY,aAAU;AAAA,IACpI,uBAAuB,CAAC,SAAS,YAAS,QAAQ,QAAQ,OAAO,QAAQ,SAAS,WAAQ,SAAS,QAAQ,QAAQ,SAAM;AAAA,IACzH,UAAU,CAAC,YAAY,SAAS,SAAS,YAAY,SAAS,YAAY,QAAQ;AAAA,IAClF,qBAAqB,CAAC,QAAQ,QAAQ,QAAQ,QAAQ,QAAQ,QAAQ,MAAM;AAAA,EAChF;AACJ;AAOO,IAAM,UAAN,MAAM,SAAQ;AAAA,EACR;AAAA,EAED,YAAY,MAAmB;AACnC,SAAK,QAAQ;AAAA,EACjB;AAAA;AAAA,EAGA,OAAgB,YAAqB,IAAI,SAAQ,UAAU,OAAO,CAAC,CAAC;AAAA,EAEpE,OAAgB,UAAU,IAAI,IAAqB,MAAM,IAAI,UAAQ,CAAC,KAAK,KAAK,YAAY,GAAG,KAAK,SAAS,KAAK,SAAQ,YAAY,IAAI,SAAQ,IAAI,CAAC,CAAC,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOzJ,OAAO,GAAG,QAAyB;AAC/B,QAAI,WAAW,YAAa,QAAO,SAAQ;AAC3C,QAAI,WAAW,GAAI,OAAM,IAAI,WAAW,wFAAwF;AAChI,UAAM,UAAU,SAAQ,QAAQ,IAAI,OAAO,YAAY,CAAC;AACxD,QAAI,YAAY,QAAW;AACvB,YAAM,IAAI,WAAW,eAAe,MAAM,4FAA4F;AAAA,IAC1I;AACA,WAAO;AAAA,EACX;AAAA;AAAA,EAGA,IAAI,OAAe;AACf,WAAO,KAAK,MAAM;AAAA,EACtB;AAAA;AAAA,EAGA,IAAI,SAAiB;AACjB,WAAO,KAAK,MAAM,SAAS,KAAK,cAAc,KAAK,MAAM;AAAA,EAC7D;AAAA;AAAA,EAGA,IAAI,OAAoB;AACpB,WAAO,KAAK;AAAA,EAChB;AACJ;AAGO,SAAS,SAAS,SAAyC;AAC9D,MAAI,QAAQ;AACZ,aAAW,KAAK,QAAQ,KAAK,kBAAkB;AAC3C,UAAMG,QAAO,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM;AACnE,QAAIA,UAAS,MAAM,CAAC,MAAM,SAASA,KAAI,EAAG,UAASA;AAAA,EACvD;AACA,SAAO,UAAU,SAAS,UAAU,QAAQ,QAAQ;AACxD;AAGO,SAAS,SAAS,SAA0B;AAC/C,QAAM,UAAU,QAAQ,KAAK;AAC7B,MAAI,OAAO;AACX,WAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACrC,UAAM,IAAI,QAAQ,OAAO,CAAC;AAC1B,YAAQ,GAAG;AAAA,MACP,KAAK;AAAA,MACL,KAAK;AACD,gBAAQ;AACR;AAAA,MACJ,KAAK;AACD,gBAAQ;AACR;AAAA,MACJ,KAAK;AACD,gBAAQ,QAAQ,QAAQ,KAAK,aAAa;AAC1C;AAAA,MACJ,KAAK,KAAK;AACN,YAAI,QAAQ,QAAQ,QAAQ,KAAK,IAAI,CAAC;AACtC,YAAI,QAAQ,EAAG,SAAQ,QAAQ;AAC/B,gBAAQ,QAAQ,QAAQ,MAAM,IAAI,GAAG,KAAK,CAAC;AAC3C,YAAI;AACJ;AAAA,MACJ;AAAA,MACA;AACI,gBAAQ,QAAQ,CAAC;AACjB;AAAA,IACR;AAAA,EACJ;AACA,SAAO;AACX;AAGA,SAAS,QAAQC,OAAsB;AACnC,MAAI,OAAO;AACX,aAAW,KAAKA,OAAM;AAClB,QAAI,0BAA0B,KAAK,CAAC,GAAG;AACnC,cAAQ,MAAM,MAAM,QAAQ,IAAI,CAAC;AAAA,IACrC,OAAO;AACH,cAAQ;AAAA,IACZ;AAAA,EACJ;AACA,SAAO;AACX;;;ACrMO,IAAM,gBAAgB;AAGtB,SAAS,UAAU,MAAc,OAAe,KAAqB;AACxE,QAAM,IAAI,SAAS,IAAI,OAAO,IAAI;AAClC,QAAM,MAAM,KAAK,MAAM,IAAI,GAAG;AAC9B,QAAM,YAAY,IAAI,MAAM;AAC5B,QAAM,YAAY,KAAK,OAAO,OAAO,SAAS,QAAQ,IAAI,KAAK,MAAM,KAAK,CAAC,IAAI,MAAM;AACrF,QAAM,WAAW,YAAY,MAAM,KAAK,MAAM,YAAY,CAAC,IAAI,KAAK,MAAM,YAAY,GAAG,IAAI;AAE7F,SAAO,MAAM,SAAS,WAAW;AACrC;AAGO,SAAS,cAAcC,SAA8D;AACxF,QAAM,IAAIA,UAAS;AACnB,QAAM,MAAM,KAAK,MAAM,IAAI,MAAM;AACjC,QAAM,WAAW,IAAI,MAAM;AAC3B,QAAM,YAAY,KAAK,OAAO,WAAW,KAAK,MAAM,WAAW,IAAI,IAAI,KAAK,MAAM,WAAW,KAAK,IAAI,KAAK,MAAM,WAAW,MAAM,KAAK,GAAG;AAC1I,QAAM,YAAY,YAAY,MAAM,YAAY,KAAK,MAAM,YAAY,CAAC,IAAI,KAAK,MAAM,YAAY,GAAG;AACtG,QAAM,KAAK,KAAK,OAAO,IAAI,YAAY,KAAK,GAAG;AAC/C,QAAM,MAAM,YAAY,KAAK,OAAO,MAAM,KAAK,KAAK,CAAC,IAAI;AACzD,QAAM,QAAQ,KAAK,KAAK,KAAK,IAAI,KAAK;AACtC,SAAO,EAAE,MAAM,YAAY,MAAM,OAAO,SAAS,IAAI,IAAI,IAAI,OAAO,IAAI;AAC5E;AAGO,SAAS,WAAW,MAAuB;AAC9C,SAAQ,OAAO,MAAM,KAAK,OAAO,QAAQ,KAAM,OAAO,QAAQ;AAClE;AAGO,SAAS,YAAY,MAAc,OAAuB;AAC7D,MAAI,UAAU,EAAG,QAAO,WAAW,IAAI,IAAI,KAAK;AAChD,SAAO,UAAU,KAAK,UAAU,KAAK,UAAU,KAAK,UAAU,KAAK,KAAK;AAC5E;AAEA,IAAM,OAAO,UAAU,MAAM,IAAI,EAAE;AAG5B,SAAS,eAAe,MAAc,OAAe,KAAiC;AACzF,MAAI,SAAS,QAAQ,UAAU,KAAK,QAAQ,GAAI,QAAO;AACvD,MAAI,OAAO,QAAQ,OAAO,QAAQ,QAAQ,KAAK,QAAQ,MAAM,MAAM,KAAK,MAAM,YAAY,MAAM,KAAK,EAAG,QAAO;AAC/G,QAAM,SAAS,UAAU,MAAM,OAAO,GAAG,IAAI;AAC7C,SAAO,UAAU,KAAK,SAAS,IAAI;AACvC;AAGO,SAAS,eAAe,QAA8D;AACzF,MAAI,WAAW,EAAG,QAAO,EAAE,MAAM,MAAM,OAAO,GAAG,KAAK,EAAE;AACxD,MAAI,WAAW,GAAI,QAAO,EAAE,MAAM,MAAM,OAAO,GAAG,KAAK,GAAG;AAC1D,SAAO,cAAc,QAAQ,SAAS,KAAK,SAAS,IAAI,OAAO;AACnE;AAGO,SAAS,gBAAgB,QAAwB;AACpD,UAAQ,SAAS,KAAK;AAC1B;;;ACvDO,IAAM,eAAe;AAGrB,IAAM,iBAAiB;AAGvB,IAAM,yBAAyB;AAG/B,SAAS,cAAc,WAAyD;AACnF,QAAM,MAAM,kBAAkB,WAAW,EAAE;AAC3C,SAAO,EAAE,QAAQ,IAAI,OAAO,CAAC,IAAI,IAAI,MAAM,GAAG,EAAE,GAAG,UAAU,OAAO,IAAI,MAAM,EAAE,CAAC,EAAE;AACvF;AAMO,SAAS,YAAYC,SAAgB,SAA0B;AAClE,SAAO,cAAcA,SAAQ,IAAI,QAAQ,KAAK,wBAAwB,QAAQ,KAAK,YAAY;AACnG;AAQO,SAAS,YAAYA,SAAgB,SAAkB,UAAU,gBAAwB;AAC5F,MAAIA,YAAW,EAAG,QAAO;AACzB,QAAM,EAAE,QAAQ,KAAK,SAAS,IAAI,cAAc,KAAK,IAAIA,OAAM,CAAC;AAChE,QAAM,SAAS,IAAI,QAAQ,OAAO,EAAE;AACpC,QAAM,aAAa,WAAW,IACxB,KAAK,CAAC,WAAW,KAAK,OAAO,SAC7B,KAAK,IAAI,OAAO,QAAQ,WAAW,CAAC,KAAK,OAAO,SAAS,WAAW,IAAI,IAAI;AAClF,MAAI,aAAa,QAAS,QAAO,YAAYA,SAAQ,OAAO;AAC5D,QAAM,YAAY,QAAQ,KAAK;AAC/B,QAAM,OAAOA,UAAS,IAAI,MAAM;AAChC,MAAI,WAAW,EAAG,QAAO,GAAG,IAAI,IAAI,SAAS,GAAG,IAAI,OAAO,CAAC,WAAW,CAAC,CAAC,GAAG,MAAM;AAClF,MAAI,OAAO,UAAU,WAAW,EAAG,QAAO,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,OAAO,WAAW,IAAI,OAAO,MAAM,CAAC;AACrG,SAAO,GAAG,IAAI,GAAG,OAAO,MAAM,GAAG,WAAW,CAAC,CAAC,GAAG,SAAS,GAAG,OAAO,MAAM,WAAW,CAAC,CAAC;AAC3F;AASO,SAAS,cAAcA,SAAgB,YAAoB,SAAsC;AACpG,SAAO,YAAYA,SAAQ,YAAY,QAAQ,KAAK,sBAAsB,GAAG;AACjF;AAGO,SAAS,oBAAoBA,SAAgB,YAAyC;AACzF,SAAO,YAAYA,SAAQ,YAAY,GAAG,GAAG;AACjD;AAEA,SAAS,YAAYA,SAAgB,YAAoB,WAAsE;AAC3H,QAAM,QAAQA,UAAS;AACvB,QAAM,QAAQ,KAAK,IAAI,cAAc,QAAQ,IAAI,IAAI,YAAY;AACjE,MAAI,QAAQ,EAAG,QAAO;AACtB,MAAIA,YAAW,EAAG,QAAO,EAAE,MAAM,KAAK,YAAY,MAAM;AAGxD,QAAM,YAAY,KAAK,IAAIA,OAAM;AACjC,QAAM,EAAE,QAAQ,SAAS,IAAI,cAAc,SAAS;AACpD,QAAM,YAAY,YAAY,QAAQ,UAAU,KAAK;AACrD,QAAM,iBAAiB,WAAW,QAAQ,UAAU,KAAK;AAEzD,MAAI;AACJ,MAAI;AACJ,MAAI,cAAc,WAAc,mBAAmB,UAAa,MAAM,WAAW,SAAS,KAAK,MAAM,gBAAgB,SAAS,IAAI;AAC9H,aAAS;AACT,mBAAe;AAAA,EACnB,WAAW,mBAAmB,QAAW;AACrC,aAAS;AACT,mBAAe;AAAA,EACnB,OAAO;AACH,WAAO;AAAA,EACX;AACA,MAAI,cAAc,IAAK,UAAS,OAAO,WAAW,KAAK,SAAS;AAChE,SAAO,EAAE,OAAO,QAAQ,MAAM,MAAM,QAAQ,YAAY,aAAa;AACzE;AAEA,SAAS,MAAM,WAAmB,WAA2B;AACzD,SAAO,KAAK,IAAI,qBAAqB,SAAS,IAAI,SAAS;AAC/D;AAGA,SAAS,YAAY,QAAgB,UAAkB,OAAmC;AACtF,QAAM,gBAAgB,YAAY,IAAI,WAAW,IAAI;AACrD,MAAI,gBAAgB,MAAO,QAAO;AAClC,QAAM,WAAW,KAAK,IAAI,GAAG,QAAQ,gBAAgB,CAAC;AACtD,QAAM,EAAE,QAAQC,UAAS,GAAG,IAAI,MAAM,QAAQ,UAAU,WAAW,IAAI,QAAQ;AAC/E,MAAIA,SAAQ,WAAW,EAAG,QAAO;AAGjC,QAAM,UAAU,CAACC,WAA0B;AACvC,UAAM,IAAI,KAAKA;AACf,WAAO,KAAK,KAAK,IAAID,SAAQ,SAASA,SAAQ,OAAO,CAAC,IAAI;AAAA,EAC9D;AAEA,MAAIE,QAAO,KAAK,IAAI,MAAM;AAC1B,WAAS,IAAI,IAAI,KAAK,GAAG,IAAK,CAAAA,SAAQ,QAAQ,CAAC;AAC/C,MAAI,eAAe;AACnB,WAAS,IAAI,IAAI,KAAK,CAAC,UAAU,IAAK,iBAAgB,QAAQ,CAAC;AAC/D,QAAM,UAAU,aAAa,QAAQ,OAAO,EAAE;AAC9C,MAAI,QAAQ,SAAS,EAAG,CAAAA,SAAQ,IAAI,OAAO;AAC3C,SAAOA,MAAK,UAAU,QAAQA,QAAO;AACzC;AAGA,SAAS,WAAW,QAAgB,UAAkB,OAAmC;AACrF,WAAS,mBAAmB,KAAK,IAAI,GAAG,QAAQ,CAAC,GAAG,oBAAoB,GAAG,oBAAoB;AAC3F,UAAM,EAAE,QAAQF,UAAS,GAAG,IAAI,MAAM,QAAQ,UAAU,IAAI,gBAAgB;AAC5E,UAAM,WAAWA,SAAQ,QAAQ,OAAO,EAAE;AAC1C,QAAIE,QAAO,SAAS,OAAO,CAAC;AAC5B,QAAI,SAAS,SAAS,EAAG,CAAAA,SAAQ,IAAI,SAAS,MAAM,CAAC,CAAC;AACtD,UAAMD,SAAQ,KAAK,IAAI,EAAE;AACzB,IAAAC,UAAS,KAAK,IAAI,OAAO,QAAQ,OAAOD,MAAK,EAAE,SAASA,UAAS,MAAM,IAAI,GAAG,GAAG;AACjF,QAAIC,MAAK,UAAU,MAAO,QAAOA;AAAA,EACrC;AACA,SAAO;AACX;AAUA,SAAS,MAAM,QAAgB,UAAkB,MAA8C;AAC3F,MAAI,QAAQ,OAAO,OAAQ,QAAO,EAAE,QAAQ,IAAI,SAAS;AACzD,MAAI,OAAO,EAAG,QAAO,EAAE,QAAQ,IAAI,IAAI,SAAS;AAChD,MAAI,SAAS,EAAG,QAAO,OAAO,OAAO,CAAC,KAAK,MAAM,EAAE,QAAQ,KAAK,IAAI,WAAW,EAAE,IAAI,EAAE,QAAQ,IAAI,IAAI,SAAS;AAChH,MAAI,OAAO,OAAO,MAAM,GAAG,IAAI;AAC/B,MAAI,OAAO,OAAO,IAAI,KAAK,KAAK;AAC5B,QAAI,IAAI,OAAO;AACf,WAAO,KAAK,KAAK,KAAK,OAAO,CAAC,MAAM,IAAK;AACzC,QAAI,IAAI,EAAG,QAAO,EAAE,QAAQ,IAAI,IAAI,OAAO,IAAI,CAAC,IAAI,IAAI,WAAW,EAAE;AACrE,WAAO,KAAK,MAAM,GAAG,CAAC,IAAI,OAAO,aAAa,KAAK,WAAW,CAAC,IAAI,CAAC,IAAI,IAAI,OAAO,OAAO,IAAI,CAAC;AAAA,EACnG;AACA,SAAO,EAAE,QAAQ,MAAM,IAAI,SAAS;AACxC;;;ACpJO,SAAS,wBAAwBC,SAAgB,QAAwB;AAC5E,SAAO,QAAQA,SAAQ,QAAQ,kBAAkB;AACrD;AAQO,SAAS,QAAQA,SAAgB,QAAgB,UAA4B;AAChF,MAAIA,YAAW,EAAG,QAAO;AACzB,QAAM,EAAE,QAAQ,UAAU,SAAS,IAAI,cAAc,KAAK,IAAIA,OAAM,CAAC;AAErE,QAAM,OAAO,WAAW,IAAI;AAC5B,MAAI,QAAQ,GAAI,QAAOA;AACvB,MAAI,OAAO,GAAG;AAEV,QAAI,aAAa,eAAgB,QAAO;AACxC,UAAMC,SAAQ,WAAW,CAAC,MAAM;AAChC,WAAOD,UAAS,IAAI,CAACC,SAAQA;AAAA,EACjC;AACA,QAAM,WAAW,SAAS,MAAM,GAAG,IAAI;AACvC,MAAIC;AACJ,UAAQ,UAAU;AAAA,IACd,KAAK;AAAoB,MAAAA,WAAU,SAAS,OAAO,IAAI,KAAK;AAAK;AAAA,IACjE,KAAK;AAAgB,MAAAA,WAAU,QAAQ,KAAK,SAAS,MAAM,IAAI,CAAC;AAAG;AAAA,IACnE,KAAK;AAAc,MAAAA,WAAU;AAAO;AAAA,IACpC;AAAS,aAAO,oBAAoB,QAAQ;AAAA,EAChD;AAEA,QAAM,aAAa,SAAS,IAAI,KAAK,OAAO,QAAQ,MAAMA,WAAU,KAAK;AACzE,MAAI,cAAc,GAAI,QAAO;AAE7B,QAAM,SAAS,OAAO,GAAG,UAAU,SAAS,CAAC,IAAI,OAAO,WAAW,IAAI,IAAI,CAAC,EAAE;AAC9E,SAAOF,UAAS,IAAI,CAAC,SAAS;AAClC;AAMO,SAAS,WAAW,GAAmB;AAC1C,MAAI,CAAC,OAAO,UAAU,CAAC,EAAG,OAAM,IAAI,MAAM,gBAAgB,OAAO,CAAC,CAAC,mCAAmC;AAEtG,MAAI,IAAI,IAAK,QAAO;AACpB,MAAI,IAAI,KAAM,QAAO;AACrB,SAAO,OAAO,KAAK,OAAO,CAAC,CAAC,EAAE;AAClC;AAEA,SAAS,oBAAoB,UAAwB;AACjD,QAAM,IAAI,MAAM,aAAa,OAAO,QAAQ,CAAC,kBAAkB;AACnE;;;AC3CA,IAAM,UAAyC,CAAC,SAAS,QAAQ,QAAQ,SAAS,WAAW,OAAO,SAAS,QAAQ;AAG9G,SAAS,sBAAsB,QAAoC;AACtE,UAAQ,QAAQ;AAAA,IACZ,KAAK;AAAS,aAAO;AAAA,IACrB,KAAK;AAAQ,aAAO;AAAA,IACpB,KAAK;AAAQ,aAAO;AAAA,IACpB,KAAK;AAAS,aAAO;AAAA,IACrB,KAAK;AAAW,aAAO;AAAA,IACvB,KAAK;AAAO,aAAO;AAAA,IACnB,KAAK;AAAS,aAAO;AAAA,IACrB,KAAK;AAAU,aAAO;AAAA,IACtB;AAAS,YAAM,IAAI,WAAW,mDAAmD,OAAO,MAAM,CAAC,GAAG;AAAA,EACtG;AACJ;AAGA,SAAS,YAAY,MAA8C;AAC/D,SAAO,QAAQ,KAAK,YAAU,iBAAiB,QAAQ,IAAI,CAAC;AAChE;AAyBA,SAAS,KAAK,MAAgBG,OAAc,OAAO,IAAIC,SAAQ,GAAS;AACpE,SAAO,EAAE,MAAM,MAAAD,OAAM,MAAM,OAAAC,OAAM;AACrC;AAeA,IAAM,UAAN,MAAc;AAAA,EACD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAET,YAAY,OAAwB,MAAmB,OAAoB,YAAqB,QAAwC;AACpI,SAAK,SAAS;AACd,SAAK,OAAO;AACZ,SAAK,UAAU,MAAM;AACrB,SAAK,SAAS;AACd,SAAK,SAAS,MAAM;AACpB,SAAK,aAAa,MAAM;AACxB,SAAK,uBAAuB,MAAM;AAClC,SAAK,wBAAwB,MAAM;AACnC,SAAK,wBAAwB,MAAM;AACnC,SAAK,cAAc;AAAA,EACvB;AAAA;AAAA,EAGA,IAAI,UAAmB;AACnB,WAAO,KAAK,OAAO,KAAK,OAAK,EAAE,SAAS,UAAW,EAAE,SAAS,eAAe,EAAE,SAAS,OAAO,EAAE,SAAS,IAAK;AAAA,EACnH;AAAA,EAEA,OAAO,MAAMD,OAA8B;AACvC,UAAM,QAAgB,CAAC;AACvB,QAAI;AACJ,aAAS,IAAI,GAAG,IAAIA,MAAK,QAAQ,KAAK;AAClC,YAAM,IAAIA,MAAK,OAAO,CAAC;AACvB,cAAQ,GAAG;AAAA,QACP,KAAK,KAAK;AACN,gBAAM,QAAQ,QAAQA,OAAM,KAAK,IAAI,CAAC;AACtC,gBAAM,KAAK,KAAK,WAAWA,MAAK,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC;AACpD,cAAI;AACJ;AAAA,QACJ;AAAA,QACA,KAAK;AACD,cAAI,IAAI,KAAKA,MAAK,OAAQ,QAAO,EAAE,QAAQ,sBAAsB;AACjE,gBAAM,KAAK,KAAK,WAAWA,MAAK,OAAO,IAAI,CAAC,CAAC,CAAC;AAC9C;AACA;AAAA,QACJ,KAAK;AAED,cAAI,IAAI,KAAKA,MAAK,OAAQ,QAAO,EAAE,QAAQ,qBAAqB;AAChE,gBAAM,KAAK,KAAK,WAAW,GAAG,CAAC;AAC/B;AACA;AAAA,QACJ,KAAK;AACD,iBAAO,EAAE,QAAQ,wEAAwE;AAAA,QAC7F,KAAK,KAAK;AACN,gBAAM,aAAaA,MAAK,QAAQ,KAAK,IAAI,CAAC;AAC1C,cAAI,aAAa,KAAK,uBAAuBA,MAAK,MAAM,IAAI,GAAG,UAAU,GAAG,GAAG,OAAO,GAAG;AACrF,mBAAO,EAAE,QAAQ,wGAAwG;AAAA,UAC7H;AACA,gBAAM,QAAQ,aAAa,IAAI,YAAYA,MAAK,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI;AAC5E,cAAI,UAAU,QAAW;AAErB,gBAAI,MAAM,SAAS,KAAK,WAAW,OAAW,QAAO,EAAE,QAAQ,2DAA2D;AAC1H,qBAAS;AACT,gBAAI;AACJ;AAAA,UACJ;AACA,iBAAO,EAAE,QAAQ,sEAAsE;AAAA,QAC3F;AAAA,QACA,KAAK;AACD,gBAAM,KAAK,KAAK,aAAa,GAAG,CAAC;AACjC;AAAA,QACJ,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AACD,gBAAM,KAAK,KAAK,SAAS,GAAG,CAAC,CAAC;AAC9B;AAAA,QACJ,KAAK;AACD,gBAAM,KAAK,KAAK,gBAAgB,GAAG,CAAC;AACpC;AAAA,QACJ,KAAK;AACD,gBAAM,KAAK,KAAK,SAAS,GAAG,CAAC;AAC7B;AAAA,QACJ,KAAK;AACD,gBAAM,KAAK,KAAK,WAAW,GAAG,CAAC;AAC/B;AAAA,QACJ;AACI;AAAA,MACR;AAEA,WAAK,MAAM,OAAO,MAAM,QAAQ,IAAI,IAAIA,MAAK,WAAWA,MAAK,OAAO,IAAI,CAAC,MAAM,OAAOA,MAAK,OAAO,IAAI,CAAC,MAAM,MAAM;AAC/G,cAAM,KAAK,KAAK,YAAYA,MAAK,MAAM,GAAG,IAAI,CAAC,GAAGA,MAAK,OAAO,IAAI,CAAC,CAAC,CAAC;AACrE;AACA;AAAA,MACJ;AACA,UAAI,uBAAuBA,OAAM,GAAG,OAAO,GAAG;AAC1C,cAAM,KAAK,KAAK,QAAQA,MAAK,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC;AAC7C,aAAK;AACL;AAAA,MACJ;AACA,UAAI,uBAAuBA,OAAM,GAAG,KAAK,GAAG;AACxC,cAAM,KAAK,KAAK,QAAQA,MAAK,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC;AAC7C,aAAK;AACL;AAAA,MACJ;AACA,YAAME,SAAQ,OAAO,aAAa,eAAeF,MAAK,WAAW,CAAC,CAAC,CAAC;AACpE,UAAIE,WAAU,OAAOA,WAAU,OAAOA,WAAU,OAAOA,WAAU,OAAOA,WAAU,KAAK;AACnF,YAAI,MAAM;AACV,eAAO,IAAI,MAAMF,MAAK,UAAU,OAAO,aAAa,eAAeA,MAAK,WAAW,IAAI,GAAG,CAAC,CAAC,MAAME,OAAO;AACzG,cAAM,KAAK,KAAK,YAAYF,MAAK,MAAM,GAAG,IAAI,GAAG,GAAGE,QAAO,GAAG,CAAC;AAC/D,aAAK,MAAM;AACX;AAAA,MACJ;AACA,UAAI,cAAcF,MAAK,WAAW,CAAC,CAAC,EAAG,QAAO,EAAE,QAAQ,IAAI,CAAC,gEAAgE;AAC7H,YAAM,KAAK,KAAK,WAAW,CAAC,CAAC;AAAA,IACjC;AACA,WAAO,SAAS,OAAO,MAAM;AAAA,EACjC;AAAA,EAEA,WAAWA,OAAsB;AAC7B,QAAI,SAAS;AACb,eAAW,KAAK,KAAK,OAAQ,WAAU,EAAE,SAAS,cAAcA,QAAO,EAAE;AACzE,WAAO;AAAA,EACX;AAAA,EAEA,aAAa,WAAmB,OAAgB,SAAyD;AACrG,YAAQ,KAAK,MAAM;AAAA,MACf,KAAK;AAAQ,eAAO,KAAK,YAAY,WAAW,OAAO,OAAO;AAAA,MAC9D,KAAK;AAAW,eAAO,EAAE,OAAO,QAAQ,MAAM,MAAM,KAAK,OAAO,IAAI,OAAK,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,YAAY,MAAM;AAAA,MAC7G,KAAK;AAAA,MACL,KAAK,QAAQ;AACT,cAAM,SAAS,KAAK,cAAc,WAAW,OAAO,OAAO;AAC3D,eAAO,WAAW,SAAY,EAAE,MAAM,IAAI,YAAY,KAAK,IAAI,EAAE,MAAM,QAAQ,YAAY,MAAM;AAAA,MACrG;AAAA,MACA;AAAS,eAAO,mBAAmB,KAAK,IAAI;AAAA,IAChD;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,cAAc,WAAmB,YAAqB,SAAsC;AACxF,QAAI,QAAQ;AAEZ,UAAM,QAAQ,IAAI,KAAK,UAAU,IAAI,KAAK;AAC1C,UAAM,QAAQ,SAAS,IAAI,YAAY,WAAW,KAAK,IAAI,YAAY,WAAW,CAAC,KAAK;AACxF,QAAI,CAAC,OAAO,SAAS,KAAK,EAAG,QAAO;AACpC,QAAI;AACJ,QAAI;AACJ,QAAI,WAAW;AACf,QAAI,KAAK,wBAAwB,GAAG;AAChC,OAAC,EAAE,SAAS,eAAe,UAAU,gBAAgB,SAAS,IAAI,iBAAiB,OAAO,KAAK,qBAAqB;AAAA,IACxH,OAAO;AACH,YAAMG,WAAU,wBAAwB,OAAO,KAAK,qBAAqB;AACzE,OAAC,EAAE,SAAS,eAAe,UAAU,eAAe,IAAI,SAASA,UAAS,KAAK,qBAAqB;AAEpG,UAAIA,aAAY,EAAG,SAAQ;AAAA,IAC/B;AAEA,UAAM,OAAO,QAAQ;AACrB,QAAI,SAAS,QAAQ,MAAM;AAG3B,UAAM,eAAuB,CAAC;AAC9B,eAAW,KAAK,KAAK,QAAQ;AACzB,UAAI,EAAE,SAAS,kBAAkB,EAAE,SAAS,WAAY;AACxD,UAAI,EAAE,SAAS,QAAS,cAAa,KAAK,CAAC;AAAA,IAC/C;AACA,UAAM,gBAA0B,MAAM,KAAK,EAAE,QAAQ,KAAK,qBAAqB,GAAG,MAAM,EAAE;AAC1F,QAAI,aAAa,cAAc;AAC/B,aAAS,IAAI,aAAa,SAAS,GAAG,KAAK,GAAG,KAAK;AAC/C;AACA,UAAI;AACJ,UAAI,cAAc,GAAG;AACjB,mBAAW,MAAM,IAAI,cAAc,MAAM,GAAG,aAAa,CAAC,IAAI,cAAc,OAAO,UAAU;AAAA,MACjG,OAAO;AACH,cAAM,OAAO,UAAU,cAAc,CAAC,EAAE;AACxC,mBAAW,SAAS,MAAM,MAAM,SAAS,MAAM,MAAM;AAAA,MACzD;AACA,oBAAc,CAAC,IAAI;AAAA,IACvB;AACA,QAAI,KAAK,YAAY;AACjB,YAAM,SAAS,MAAM,cAAc,KAAK,EAAE,GAAG,KAAK,sBAAsB,KAAK,gBAAgB;AAC7F,eAAS,IAAI,GAAG,IAAI,cAAc,QAAQ,IAAK,eAAc,CAAC,IAAI,MAAM,IAAI,SAAS;AAAA,IACzF;AAGA,UAAM,gBAAwB,CAAC;AAC/B,QAAI,aAAa;AACjB,eAAW,KAAK,KAAK,QAAQ;AACzB,UAAI,EAAE,SAAS,WAAY;AAC3B,UAAI,EAAE,SAAS,eAAgB,cAAa;AAAA,eACnC,cAAc,EAAE,SAAS,QAAS,eAAc,KAAK,CAAC;AAAA,IACnE;AACA,UAAM,iBAA2B,MAAM,KAAK,EAAE,QAAQ,KAAK,sBAAsB,GAAG,MAAM,EAAE;AAC5F,QAAIC,eAAc;AAClB,aAAS,IAAI,cAAc,SAAS,GAAG,KAAK,GAAG,KAAK;AAChD,YAAMC,SAAQ,eAAe,OAAO,CAAC;AACrC,YAAM,OAAO,UAAU,eAAe,CAAC,EAAE;AACzC,UAAID,gBAAeC,WAAU,OAAO,SAAS,KAAK;AAC9C,uBAAe,CAAC,IAAI,SAAS,MAAM,MAAM;AACzC;AAAA,MACJ;AACA,MAAAD,eAAc;AACd,qBAAe,CAAC,IAAIC;AAAA,IACxB;AAEA,QAAI,YAAY;AAChB,QAAI,aAAa;AACjB,QAAI,aAAa;AACjB,UAAM,iBAAiB,OAAO,KAAK,IAAI,QAAQ,CAAC,EAAE,SAAS,KAAK,uBAAuB,GAAG;AAC1F,QAAI,aAAa;AACjB,iBAAa;AACb,eAAW,KAAK,KAAK,QAAQ;AACzB,cAAQ,EAAE,MAAM;AAAA,QACZ,KAAK;AACD,cAAI,YAAY;AAEZ,gBAAI,iBAAiB,EAAG,WAAU;AAAA,UACtC,WAAW,YAAY;AACnB,sBAAU,UAAU,gBAAgB,YAAY;AAAA,UACpD,OAAO;AACH,sBAAU,UAAU,eAAe,WAAW;AAAA,UAClD;AACA;AAAA,QACJ,KAAK;AACD,uBAAa;AACb,oBAAU,KAAK;AACf;AAAA,QACJ,KAAK;AACD,uBAAa;AACb,oBAAU,EAAE,KAAK,OAAO,CAAC;AACzB,cAAI,WAAW,EAAG,WAAU;AAAA,mBACnB,EAAE,SAAS,IAAK,WAAU;AACnC;AAAA,QACJ,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AACD,oBAAU,EAAE;AACZ;AAAA,QACJ;AACI,iBAAO,gBAAgB,EAAE,IAAI;AAAA,MACrC;AAAA,IACJ;AACA,WAAO;AAAA,EACX;AAAA,EAEA,YAAY,WAAmB,OAAgB,SAAyD;AACpG,QAAI,SAAS,aAAa,gBAAgB,EAAG,QAAO,EAAE,MAAM,IAAI,YAAY,KAAK;AAEjF,UAAM,eAAeC,uBAAsB,YAAY,KAAM;AAC7D,UAAM,SAAS,KAAK,MAAM,eAAe,KAAM;AAC/C,QAAI,SAAS,cAAe,QAAO,EAAE,MAAM,IAAI,YAAY,KAAK;AAChE,UAAM,cAAc,eAAe;AACnC,UAAM,EAAE,MAAM,OAAO,IAAI,IAAI,eAAe,MAAM;AAClD,UAAM,OAAO,KAAK,MAAM,cAAc,IAAI;AAC1C,UAAM,SAAS,KAAK,MAAM,cAAc,EAAE,IAAI;AAC9C,UAAM,SAAS,cAAc;AAC7B,UAAM,QAAQ,QAAQ;AAEtB,QAAI,SAAS;AACb,aAAS,IAAI,GAAG,IAAI,KAAK,OAAO,QAAQ,KAAK;AACzC,YAAM,IAAI,UAAU,KAAK,QAAQ,CAAC;AAClC,cAAQ,EAAE,MAAM;AAAA,QACZ,KAAK;AACD,kBAAQ,EAAE,MAAM;AAAA,YACZ,KAAK;AACD,wBAAU,EAAE,SAAS,IAAI,IAAI,OAAO,GAAG,IAAI,OAAO,IAAI,EAAE,SAAS,GAAG,GAAG;AACvE;AAAA,YACJ,KAAK;AACD,kBAAI,KAAK,UAAU,CAAC,GAAG;AACnB,0BAAU,EAAE,UAAU,IAAI,OAAO,MAAM,IAAI,IAAI,MAAM;AAAA,cACzD,WAAW,EAAE,UAAU,GAAG;AACtB,0BAAU,OAAO,KAAK;AAAA,cAC1B,WAAW,EAAE,UAAU,GAAG;AACtB,0BAAU,IAAI,KAAK;AAAA,cACvB,WAAW,EAAE,UAAU,GAAG;AACtB,0BAAU,UAAU,wBAAwB,OAAO,GAAG,QAAQ,CAAC;AAAA,cACnE,WAAW,EAAE,UAAU,GAAG;AACtB,0BAAU,UAAU,MAAM,YAAY,QAAQ,CAAC;AAAA,cACnD,OAAO;AACH,0BAAU,UAAU,MAAM,YAAY,QAAQ,CAAC,EAAE,OAAO,CAAC;AAAA,cAC7D;AACA;AAAA,YACJ,KAAK;AACD,kBAAI,EAAE,UAAU,EAAG,WAAU,OAAO,GAAG;AAAA,uBAC9B,EAAE,UAAU,EAAG,WAAU,IAAI,GAAG;AAAA,uBAChC,EAAE,UAAU,EAAG,WAAU,UAAU,MAAM,qBAAqB,gBAAgB,MAAM,CAAC;AAAA,kBACzF,WAAU,UAAU,MAAM,UAAU,gBAAgB,MAAM,CAAC;AAChE;AAAA,YACJ,KAAK,KAAK;AACN,oBAAM,QAAQ,KAAK,cAAe,OAAO,OAAO,IAAI,KAAK,OAAO,KAAM;AACtE,wBAAU,EAAE,UAAU,IAAI,OAAO,KAAK,IAAI,IAAI,KAAK;AACnD;AAAA,YACJ;AAAA,YACA;AACI,wBAAU,EAAE,UAAU,IAAI,OAAO,MAAM,IAAI,IAAI,MAAM;AACrD;AAAA,UACR;AACA;AAAA,QACJ,KAAK,QAAQ;AACT,gBAAM,YAAY,QAAQ;AAC1B,oBAAU,EAAE,KAAK,WAAW,IACrB,YAAY,EAAE,KAAK,MAAM,GAAG,CAAC,IAAI,EAAE,KAAK,MAAM,GAAG,CAAC,IAClD,YAAY,EAAE,KAAK,MAAM,GAAG,CAAC,IAAI,EAAE,KAAK,MAAM,GAAG,CAAC;AACzD;AAAA,QACJ;AAAA,QACA,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AACD,oBAAU,EAAE;AACZ;AAAA,QACJ;AACI,iBAAO,gBAAgB,EAAE,IAAI;AAAA,MACrC;AAAA,IACJ;AACA,WAAO,EAAE,MAAM,QAAQ,YAAY,MAAM;AAAA,EAC7C;AAAA;AAAA,EAGA,UAAU,OAAwB;AAC9B,aAAS,IAAI,QAAQ,GAAG,KAAK,GAAG,KAAK;AACjC,YAAM,IAAI,UAAU,KAAK,QAAQ,CAAC;AAClC,UAAI,EAAE,SAAS,WAAY;AAC3B,UAAI,EAAE,SAAS,IAAK,QAAO;AAC3B;AAAA,IACJ;AACA,aAAS,IAAI,QAAQ,GAAG,IAAI,KAAK,OAAO,QAAQ,KAAK;AACjD,YAAM,IAAI,UAAU,KAAK,QAAQ,CAAC;AAClC,UAAI,EAAE,SAAS,WAAY;AAC3B,aAAO,EAAE,SAAS;AAAA,IACtB;AACA,WAAO;AAAA,EACX;AACJ;AAEA,SAAS,QAAQ,UAAU,GAAgB;AACvC,SAAO,EAAE,OAAO,GAAG,WAAW,OAAO,qBAAqB,GAAG,sBAAsB,GAAG,sBAAsB,GAAG,QAAQ;AAC3H;AAEA,SAAS,SAAS,OAAwB,QAAwD;AAC9F,QAAM,UAAU,MAAM,KAAK,OAAK,EAAE,SAAS,cAAc,EAAE,SAAS,MAAM;AAC1E,QAAM,YAAY,MAAM,KAAK,OAAK,EAAE,SAAS,OAAO;AACpD,QAAM,UAAU,MAAM,KAAK,OAAK,EAAE,SAAS,WAAW;AACtD,MAAI,YAAY,WAAW,WAAY,QAAO,EAAE,QAAQ,sDAAsD;AAC9G,MAAI,QAAS,QAAO,EAAE,SAAS,IAAI,QAAQ,WAAW,OAAO,CAAC,SAAS,gBAAgB,SAAS,CAAC,GAAG,QAAQ,QAAQ,GAAG,OAAO,MAAM,EAAE;AAEtI,MAAI,SAAS;AACT,QAAI,aAAa,MAAM,KAAK,OAAK,EAAE,SAAS,cAAc,EAAE,SAAS,SAAS,GAAG;AAC7E,aAAO,EAAE,QAAQ,iFAAiF;AAAA,IACtG;AACA,WAAO,EAAE,SAAS,IAAI,QAAQ,WAAW,OAAO,CAAC,SAAS,cAAc,CAAC,GAAG,QAAQ,QAAQ,GAAG,MAAM,KAAK,OAAK,EAAE,SAAS,MAAM,GAAG,MAAM,EAAE;AAAA,EAC/I;AAEA,MAAI,CAAC,WAAW;AACZ,WAAO;AAAA,MACH,SAAS,IAAI,QAAQ,WAAW,OAAO,CAAC,SAAS,cAAc,CAAC,GAAG,WAAW,QAAQ,MAAM,OAAO,OAAK,EAAE,SAAS,SAAS,EAAE,MAAM,GAAG,OAAO,MAAM;AAAA,IACxJ;AAAA,EACJ;AAGA,QAAM,SAAiB,CAAC;AACxB,QAAM,QAAQ,QAAQ;AACtB,MAAI,YAAY;AAChB,MAAI,eAAe;AACnB,QAAM,YAAY,MAAM,cAAc,OAAK,EAAE,SAAS,OAAO;AAC7D,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACnC,UAAM,IAAI,UAAU,OAAO,CAAC;AAC5B,YAAQ,EAAE,MAAM;AAAA,MACZ,KAAK;AACD,YAAI,aAAc,OAAM;AAAA,iBACf,UAAW,OAAM;AAAA,YACrB,OAAM;AACX,eAAO,KAAK,CAAC;AACb;AAAA,MACJ,KAAK;AACD,YAAI,aAAa,aAAc,QAAO,EAAE,QAAQ,yCAAyC;AACzF,oBAAY;AACZ,eAAO,KAAK,CAAC;AACb;AAAA,MACJ,KAAK,SAAS;AACV,cAAM,WAAW,IAAI,IAAI,UAAU,OAAO,IAAI,CAAC,EAAE,OAAO;AACxD,cAAM,SAAS,aAAa,WAAW,aAAa;AACpD,YAAI,sBAAsB;AAC1B,iBAAS,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACvC,gBAAM,QAAQ,UAAU,OAAO,CAAC,EAAE;AAClC,cAAI,UAAU,kBAAkB,UAAU,WAAY;AACtD,cAAI,UAAU,QAAS,uBAAsB;AAAA,QACjD;AACA,YAAI,CAAC,aAAa,CAAC,gBAAgB,UAAU,qBAAqB;AAC9D,gBAAM,YAAY;AAAA,QACtB,WAAW,CAAC,gBAAgB,UAAU,CAAC,wBAAwB,CAAC,aAAa,IAAI,YAAY;AACzF,gBAAM;AAAA,QACV,OAAO;AACH,iBAAO,KAAK,KAAK,WAAW,GAAG,CAAC;AAAA,QACpC;AACA;AAAA,MACJ;AAAA,MACA,KAAK;AACD,cAAM;AACN,eAAO,KAAK,CAAC;AACb;AAAA,MACJ,KAAK;AACD,YAAI,gBAAgB,MAAM,wBAAwB,GAAG;AACjD,iBAAO,EAAE,QAAQ,iFAAiF;AAAA,QACtG;AACA,uBAAe;AACf,eAAO,KAAK,CAAC;AACb;AAAA,MACJ,KAAK;AACD,YAAI,EAAE,SAAS,OAAO,MAAM,MAAM,IAAI,CAAC,EAAE,KAAK,WAAS,MAAM,SAAS,OAAO,EAAG,QAAO,EAAE,QAAQ,+BAA+B;AAChI,eAAO,KAAK,CAAC;AACb;AAAA,MACJ,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACD,eAAO,KAAK,CAAC;AACb;AAAA,MACJ;AACI,eAAO,gBAAgB,EAAE,IAAI;AAAA,IACrC;AAAA,EACJ;AACA,MAAI,gBAAgB,MAAM,yBAAyB,EAAG,QAAO,EAAE,QAAQ,0CAA0C;AACjH,SAAO,EAAE,SAAS,IAAI,QAAQ,QAAQ,UAAU,OAAO,OAAO,MAAM,EAAE;AAC1E;AAEA,SAAS,WAAW,OAAwB,OAAoC;AAC5E,SAAO,MAAM,IAAI,OAAM,MAAM,SAAS,EAAE,IAAI,IAAI,KAAK,WAAW,EAAE,IAAI,IAAI,CAAE;AAChF;AAEA,SAAS,MAAM,SAAiB,WAAmB,OAAkC;AACjF,QAAM,SAAS,QAAQ,QAAQ,OAAO,EAAE;AACxC,QAAM,UAAU,QAAQ,MAAM,GAAG,QAAQ,SAAS,OAAO,MAAM;AAC/D,MAAI,OAAO,WAAW,EAAG,QAAO;AAChC,QAAM,SAAmB,CAAC;AAC1B,MAAI,MAAM,OAAO;AACjB,MAAI,YAAY;AAChB,SAAO,MAAM,GAAG;AACZ,UAAM,OAAO,MAAM,WAAW,IAAI,IAAI,UAAU,OAAO,KAAK,IAAI,WAAW,MAAM,SAAS,CAAC,CAAC;AAC5F,QAAI,QAAQ,GAAG;AACX,aAAO,KAAK,OAAO,MAAM,GAAG,GAAG,CAAC;AAChC;AAAA,IACJ;AACA,UAAM,QAAQ,KAAK,IAAI,GAAG,MAAM,IAAI;AACpC,WAAO,KAAK,OAAO,MAAM,OAAO,GAAG,CAAC;AACpC,UAAM;AACN;AAAA,EACJ;AACA,SAAO,UAAU,OAAO,WAAW,EAAE,KAAK,SAAS;AACvD;AAGA,SAAS,SAAS,OAAe,gBAA+D;AAC5F,MAAI,UAAU,EAAG,QAAO,EAAE,SAAS,IAAI,UAAU,IAAI,OAAO,cAAc,EAAE;AAC5E,QAAM,UAAU,kBAAkB,OAAO,EAAE;AAC3C,QAAM,WAAW,QAAQ,OAAO,CAAC,IAAI,QAAQ,MAAM,GAAG,EAAE;AACxD,QAAM,WAAW,OAAO,QAAQ,MAAM,EAAE,CAAC;AACzC,MAAI;AACJ,MAAI;AACJ,MAAI,YAAY,GAAG;AACf,cAAU,WAAW,KAAK,KAAK,WAAW,IAAI,OAAO,WAAW,IAAI,EAAE,IAAI,SAAS,MAAM,GAAG,WAAW,CAAC;AACxG,eAAW,WAAW,KAAK,KAAK,KAAK,SAAS,MAAM,WAAW,CAAC;AAAA,EACpE,OAAO;AACH,cAAU;AACV,eAAW,IAAI,OAAO,CAAC,WAAW,CAAC,IAAI;AAAA,EAC3C;AACA,aAAW,SAAS,UAAU,iBAAiB,SAAS,MAAM,GAAG,cAAc,IAAI,SAAS,OAAO,gBAAgB,GAAG;AACtH,SAAO,EAAE,SAAS,SAAS;AAC/B;AAGA,SAAS,iBAAiB,OAAe,gBAAiF;AACtH,MAAI,UAAU,EAAG,QAAO,EAAE,SAAS,KAAK,UAAU,IAAI,OAAO,cAAc,GAAG,UAAU,EAAE;AAC1F,QAAM,UAAU,kBAAkB,OAAO,EAAE;AAC3C,QAAM,WAAW,QAAQ,OAAO,CAAC,IAAI,QAAQ,MAAM,GAAG,EAAE;AACxD,MAAI,WAAW,OAAO,QAAQ,MAAM,EAAE,CAAC;AACvC,QAAM,OAAO,KAAK,IAAI,IAAI,gBAAgB,EAAE;AAC5C,MAAI,SAAS,SAAS,MAAM,GAAG,IAAI,EAAE,MAAM,EAAE;AAC7C,MAAI,OAAO,MAAM,SAAS,OAAO,IAAI,KAAK,KAAK;AAC3C,QAAI,IAAI,OAAO;AACf,WAAO,KAAK,GAAG;AACX,UAAI,OAAO,CAAC,MAAM,KAAK;AACnB,eAAO,CAAC,IAAI;AACZ;AACA;AAAA,MACJ;AACA,aAAO,CAAC,IAAI,OAAO,OAAO,UAAU,QAAQ,CAAC,CAAC,IAAI,CAAC;AACnD;AAAA,IACJ;AACA,QAAI,IAAI,GAAG;AACP,eAAS,CAAC,KAAK,GAAG,OAAO,MAAM,GAAG,EAAE,CAAC;AACrC;AAAA,IACJ;AAAA,EACJ;AACA,QAAM,MAAM,OAAO,KAAK,EAAE,EAAE,OAAO,IAAI,gBAAgB,GAAG;AAC1D,SAAO,EAAE,SAAS,IAAI,MAAM,GAAG,CAAC,GAAG,UAAU,IAAI,MAAM,CAAC,GAAG,SAAS;AACxE;AAGA,SAASA,uBAAsB,GAAmB;AAC9C,SAAO,KAAK,MAAM,KAAK,IAAI,IAAI,uBAAuB,oBAAoB;AAC9E;AAEA,SAAS,IAAI,GAAmB;AAC5B,SAAO,OAAO,CAAC,EAAE,SAAS,GAAG,GAAG;AACpC;AAEA,SAAS,QAAQN,OAAc,OAAe,MAAsB;AAChE,QAAM,QAAQA,MAAK,QAAQ,OAAO,IAAI;AACtC,MAAI,QAAQ,EAAG,OAAM,IAAI,MAAM,gEAAgE;AAC/F,SAAO;AACX;AAEA,SAAS,mBAAmB,MAAoB;AAC5C,QAAM,IAAI,MAAM,aAAa,OAAO,IAAI,CAAC,yBAAyB;AACtE;AAEA,SAAS,gBAAgB,MAAoB;AACzC,QAAM,IAAI,MAAM,aAAa,OAAO,IAAI,CAAC,sBAAsB;AACnE;AAQO,SAAS,wBAAwB,SAAqC;AACzE,QAAM,WAAW,QAAQ,KAAK,sBAAsB;AACpD,SAAO,QAAQ,KAAK,sBAAsB,IAAI,CAAC,MAAM,MAAM;AACvD,UAAMO,UAAS,OAAO,IAAI,CAAC;AAC3B,QAAI,SAAS,OAAQ,QAAO;AAC5B,QAAI,YAAY,SAAS,GAAGA,OAAM,SAAK,QAAOA;AAC9C,WAAO;AAAA,EACX,CAAC;AACL;AAMO,SAAS,iBAAiB,SAA0B;AACvD,SAAO,QAAQ,KAAK,eAAe,WAAW,UAAK,MAAG;AAC1D;AAMA,SAAS,kBAAkB,SAAkB,UAA2B;AACpE,QAAM,OAAO,QAAQ;AACrB,QAAM,iBAAiB,iBAAiB,OAAO;AAC/C,QAAM,SAAS,aAAa,KAAK,cAAc,KAAK,CAAC,kBAAkB,KAAK,cAAc,IACpF,iBACA,IAAI,eAAe,WAAW,KAAK,EAAE,CAAC;AAC5C,QAAM,IAAI,WAAW,aAAa;AAGlC,QAAM,kBAAkB,KAAK,SAAS,UAAU,IAAI,KAAK;AACzD,QAAM,YAA8C;AAAA,IAChD,GAAG,IAAI,MAAM,GAAG,CAAC;AAAA,IAAK,GAAG,GAAG,MAAM,IAAI,CAAC;AAAA,IAAI,GAAG,GAAG,MAAM,GAAG,CAAC;AAAA,IAAK,GAAG,IAAI,CAAC,GAAG,MAAM;AAAA,IAAK,GAAG,IAAI,CAAC,GAAG,MAAM;AAAA,IACvG,GAAG,GAAG,CAAC,IAAI,MAAM;AAAA,IAAI,GAAG,GAAG,CAAC,GAAG,MAAM;AAAA,IAAK,GAAG,IAAI,CAAC,IAAI,MAAM;AAAA,IAAI,GAAG,IAAI,MAAM,IAAI,CAAC;AAAA,IAAI,IAAI,GAAG,CAAC,IAAI,MAAM;AAAA,IACxG,IAAI,GAAG,MAAM,IAAI,CAAC;AAAA,IAAK,IAAI,GAAG,MAAM,KAAK,CAAC;AAAA,IAAI,IAAI,GAAG,CAAC,KAAK,MAAM;AAAA,IAAI,IAAI,IAAI,MAAM,IAAI,CAAC;AAAA,IAAK,IAAI,IAAI,CAAC,IAAI,MAAM;AAAA,IAChH,IAAI,GAAG,MAAM,KAAK,CAAC;AAAA,EACvB;AACA,QAAM,WAAW,UAAU,eAAe,KAAK,IAAI,MAAM,GAAG,CAAC;AAC7D,QAAM,WAAW,KAAK,4BAA4B,IAAI,GAAG,MAAM,GAAG,CAAC,KAC7D,KAAK,4BAA4B,IAAI,GAAG,CAAC,GAAG,MAAM,KAC9C,KAAK,4BAA4B,IAAI,GAAG,MAAM,IAAI,CAAC,KAC/C,GAAG,CAAC,IAAI,MAAM;AAC5B,SAAO,GAAG,SAAS,SAAS,GAAG,IAAI,GAAG,QAAQ,OAAO,QAAQ,SAAS,QAAQ;AAClF;AAEA,IAAM,gBAAgB;AACtB,IAAM,oBAAoB;AAE1B,IAAM,eAAe;AAErB,IAAM,mBAAmB;AAEzB,IAAM,iBAAiB;AACvB,IAAM,eAAe;AACrB,IAAM,oBAAoB;AASnB,IAAM,eAAN,MAAM,cAAa;AAAA,EACb;AAAA,EACA;AAAA,EAED,YAAY,MAAc,UAA8B;AAC5D,SAAK,QAAQ;AACb,SAAK,YAAY;AAAA,EACrB;AAAA;AAAA,EAGA,OAAgB,UAAwB,IAAI,cAAa,WAAW,CAAC,CAAC;AAAA;AAAA,EAGtE,IAAI,OAAe;AACf,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA,EAGA,IAAI,YAAqB;AACrB,WAAO,KAAK,UAAU,WAAW;AAAA,EACrC;AAAA;AAAA,EAGA,IAAI,SAAkB;AAClB,WAAO,KAAK,UAAU,SAAS,KAAK,UAAU,KAAK,WAAW,CAAC,EAAE,SAAS;AAAA,EAC9E;AAAA;AAAA,EAGA,IAAI,aAAsB;AACtB,WAAO,KAAK,UAAU,CAAC,UAAU,KAAK,WAAW,CAAC,EAAE;AAAA,EACxD;AAAA;AAAA,EAGA,IAAI,YAAqB;AACrB,WAAO,KAAK,UAAU,SAAS,KAAK,UAAU,KAAK,WAAW,CAAC,EAAE,UAAU;AAAA,EAC/E;AAAA;AAAA,EAGA,OAAO,MAAM,MAA4B;AACrC,UAAM,UAAU,cAAa,SAAS,IAAI;AAC1C,QAAI,QAAQ,WAAW,OAAW,OAAM,IAAI,YAAY,sBAAsB,IAAI,uBAAuB,QAAQ,MAAM,EAAE;AACzH,WAAO,QAAQ;AAAA,EACnB;AAAA;AAAA,EAGA,OAAO,SAAS,OAAoC;AAChD,QAAI,iBAAiB,OAAO,SAAS,EAAG,QAAO,EAAE,QAAQ,cAAa,QAAQ;AAC9E,UAAM,OAAO,cAAc,KAAK;AAChC,UAAM,QAAQ,cAAc,IAAI;AAChC,QAAI,OAAO,UAAU,SAAU,QAAO,EAAE,QAAQ,MAAM;AACtD,QAAI,MAAM,SAAS,EAAG,QAAO,EAAE,QAAQ,sCAAsC;AAC7E,UAAM,WAAsB,CAAC;AAC7B,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACnC,YAAM,UAAU,QAAQ,MAAM,UAAU,OAAO,CAAC,CAAC;AACjD,UAAI,QAAQ,YAAY,OAAW,QAAO,EAAE,QAAQ,QAAQ,OAAO;AACnE,YAAM,UAAU,QAAQ;AACxB,UAAI,QAAQ,SAAS,UAAU,IAAI,MAAM,SAAS,EAAG,QAAO,EAAE,QAAQ,iCAAiC;AACvG,UAAI,MAAM,KAAK,QAAQ,SAAS,UAAU,QAAQ,SAAS,UAAW,QAAO,EAAE,QAAQ,kCAAkC;AACzH,eAAS,KAAK,OAAO;AAAA,IACzB;AACA,WAAO,EAAE,QAAQ,IAAI,cAAa,MAAM,QAAQ,EAAE;AAAA,EACtD;AAAA;AAAA,EAGA,IAAI,wBAAiC;AACjC,WAAO,KAAK,oBAAoB;AAAA,EACpC;AAAA;AAAA,EAGA,IAAI,kBAA0B;AAC1B,UAAMN,SAAQ,KAAK,UAAU;AAC7B,WAAOA,SAAQ,KAAKA,SAAQ,KAAK,UAAU,KAAK,WAAWA,SAAQ,CAAC,EAAE,SAAS,SAASA,SAAQ,IAAIA;AAAA,EACxG;AAAA;AAAA,EAGA,IAAI,eAAoC;AACpC,UAAMA,SAAQ,KAAK,UAAU;AAC7B,QAAIA,WAAU,EAAG,QAAO,UAAU,KAAK,WAAW,CAAC;AACnD,QAAIA,SAAQ,KAAK,UAAU,KAAK,WAAWA,SAAQ,CAAC,EAAE,SAAS,OAAQ,QAAO,UAAU,KAAK,WAAWA,SAAQ,CAAC;AACjH,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,SAAS,OAAc,SAAkB,YAAoC;AACzE,QAAI,MAAM,SAAS,SAAU,QAAO,KAAK,OAAO,OAAO,OAAO;AAC9D,QAAI,KAAK,uBAAuB;AAC5B,YAAM,SAAS,cAAc,MAAM,QAAQ,YAAY,OAAO;AAC9D,aAAO,WAAW,SAAY,EAAE,MAAM,IAAI,YAAY,MAAM,QAAQ,OAAU,IAAI,EAAE,MAAM,QAAQ,YAAY,OAAO,QAAQ,OAAU;AAAA,IAC3I;AACA,UAAM,QAAQ,KAAK,OAAO,OAAO,OAAO;AACxC,WAAO,MAAM,cAAc,MAAM,KAAK,SAAS,aAAa,EAAE,MAAM,IAAI,YAAY,MAAM,QAAQ,MAAM,OAAO,IAAI;AAAA,EACvH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,OAAc,SAAkC;AACnD,QAAI,MAAM,SAAS,UAAU;AACzB,YAAM,QAAQ,KAAK,SAAS,OAAO;AACnC,UAAI,UAAU,OAAW,QAAO,MAAM,OAAO,OAAO,OAAO;AAAA,IAC/D;AACA,YAAQ,MAAM,MAAM;AAAA,MAChB,KAAK;AAAA,MACL,KAAK;AACD,eAAO,EAAE,MAAM,MAAM,SAAS,GAAG,YAAY,OAAO,QAAQ,OAAU;AAAA,MAC1E,KAAK,QAAQ;AACT,cAAM,cAAc,KAAK;AACzB,eAAO,gBAAgB,SACjB,EAAE,MAAM,MAAM,MAAM,YAAY,OAAO,QAAQ,OAAU,IACzD,EAAE,MAAM,YAAY,WAAW,MAAM,IAAI,GAAG,YAAY,OAAO,QAAQ,YAAY,OAAO;AAAA,MACpG;AAAA,MACA,KAAK;AACD;AAAA,MACJ;AACI,cAAM,IAAI,MAAM,aAAa,OAAO,MAAM,IAAI,CAAC,uBAAuB;AAAA,IAC9E;AAEA,UAAMM,UAAS,MAAM;AACrB,QAAI,KAAK,sBAAuB,QAAO,EAAE,MAAM,YAAYA,SAAQ,OAAO,GAAG,YAAY,OAAO,QAAQ,OAAU;AAClH,QAAI;AACJ,QAAI,iBAAiB;AACrB,QAAIA,UAAS,KAAK,KAAK,mBAAmB,GAAG;AACzC,eAAS,UAAU,KAAK,WAAW,CAAC;AAAA,IACxC,WAAWA,YAAW,KAAK,KAAK,mBAAmB,GAAG;AAClD,eAAS,UAAU,KAAK,WAAW,CAAC;AAAA,IACxC,OAAO;AACH,eAAS,UAAU,KAAK,WAAW,CAAC;AACpC,uBAAiBA,UAAS;AAAA,IAC9B;AACA,UAAM,EAAE,MAAAP,OAAM,WAAW,IAAI,OAAO,aAAa,KAAK,IAAIO,OAAM,GAAG,gBAAgB,OAAO;AAC1F,WAAO,EAAE,MAAAP,OAAM,YAAY,QAAQ,OAAO,OAAO;AAAA,EACrD;AAAA;AAAA,EAGA,OAAO,OAA8B;AACjC,WAAO,KAAK,UAAU,MAAM;AAAA,EAChC;AAAA;AAAA,EAGA,WAAmB;AACf,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAgB,YAA0B,cAAa,MAAM,aAAa;AAAA;AAAA,EAG1E,OAAgB,gBAA8B,cAAa,MAAM,iBAAiB;AAAA,EAElF,OAAgB,kBAAkB,cAAa,MAAM,SAAS;AAAA,EAC9D,OAAgB,oBAAoB,cAAa,MAAM,QAAQ;AAAA,EAC/D,OAAgB,YAAY,cAAa,MAAM,YAAY;AAAA,EAC3D,OAAgB,iBAAiB,cAAa,MAAM,iBAAiB;AAAA,EACrE,OAAgB,cAAc,oBAAI,IAA0B;AAAA,EAC5D,OAAgB,iBAAiB,oBAAI,IAA0B;AAAA,EAC/D,OAAgB,cAAc,oBAAI,IAA0B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAO5D,OAAgB,qBAA8C;AAAA,IAC1D,cAAa;AAAA,IAAW,cAAa;AAAA,IAAe,cAAa,MAAM,YAAY;AAAA,IAAG,cAAa,MAAM,gBAAgB;AAAA,IACzH,cAAa,MAAM,cAAc;AAAA,IAAG,cAAa;AAAA,IAAW,cAAa;AAAA,EAC7E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,gBAAgB,SAAgC;AACnD,WAAO,QAAQ,KAAK,0BAA0B,IAAI,cAAa,iBAAiB,cAAa;AAAA,EACjG;AAAA;AAAA,EAGA,YAAY,SAA4C;AACpD,QAAI,CAAC,iBAAiB,KAAK,OAAO,YAAY,EAAG,QAAO;AACxD,QAAI,QAAQ,KAAK,SAAS,QAAS,QAAO,cAAa;AACvD,WAAO,QAAQ,KAAK,iBAAiB,SAAS,IAAI,IAAI,cAAa,oBAAoB;AAAA,EAC3F;AAAA;AAAA,EAGA,aAAa,SAA4C;AACrD,UAAM,WAAW,KAAK,YAAY,OAAO;AACzC,QAAI,aAAa,OAAW,QAAO;AACnC,UAAMQ,QAAO,iBAAiB,KAAK,OAAO,iBAAiB;AAC3D,QAAI,CAACA,SAAQ,CAAC,iBAAiB,KAAK,OAAO,aAAa,EAAG,QAAO;AAClE,UAAM,MAAM,GAAG,QAAQ,KAAK,IAAI,IAAI,OAAOA,KAAI,CAAC;AAChD,QAAI,QAAQ,cAAa,YAAY,IAAI,GAAG;AAC5C,QAAI,UAAU,QAAW;AACrB,YAAM,OAAO,SAAS,OAAO,KAAKA,QAAO,UAAU;AACnD,YAAM,SAAS,SAAS,KAAK,QAAQ,SAAY,cAAa,SAAS,IAAI,EAAE;AAC7E,cAAQ,WAAW,SAAY,OAAO;AACtC,oBAAa,YAAY,IAAI,KAAK,KAAK;AAAA,IAC3C;AACA,WAAO,UAAU,QAAQ,MAAM,UAAU,KAAK,QAAQ,SAAY;AAAA,EACtE;AAAA;AAAA,EAGA,cAAc,SAA4C;AACtD,QAAI;AACJ,QAAI,iBAAiB,KAAK,OAAO,gBAAgB,GAAG;AAChD,aAAO,GAAG,QAAQ,KAAK,iBAAiB,SAAS,IAAI,IAAI,OAAO,GAAG;AAAA,IACvE,WAAW,iBAAiB,KAAK,OAAO,cAAc,GAAG;AACrD,YAAMA,QAAO,QAAQ,KAAK;AAC1B,aAAOA,MAAK,SAAS,IAAI,KAAKA,MAAK,SAAS,IAAI,IAAI,UAAU;AAAA,IAClE,OAAO;AACH,aAAO;AAAA,IACX;AACA,QAAI,SAAS,KAAK,MAAO,QAAO;AAChC,UAAM,MAAM,GAAG,QAAQ,KAAK,IAAI,IAAI,IAAI;AACxC,QAAI,QAAQ,cAAa,eAAe,IAAI,GAAG;AAC/C,QAAI,UAAU,QAAW;AACrB,cAAQ,cAAa,MAAM,IAAI;AAC/B,oBAAa,eAAe,IAAI,KAAK,KAAK;AAAA,IAC9C;AACA,WAAO;AAAA,EACX;AAAA;AAAA,EAGA,YAAY,SAA4C;AACpD,UAAM,WAAW,iBAAiB,KAAK,OAAO,YAAY;AAC1D,QAAI,CAAC,YAAY,CAAC,iBAAiB,KAAK,OAAO,iBAAiB,EAAG,QAAO;AAC1E,UAAM,MAAM,GAAG,QAAQ,KAAK,IAAI,IAAI,OAAO,QAAQ,CAAC;AACpD,QAAI,QAAQ,cAAa,YAAY,IAAI,GAAG;AAC5C,QAAI,UAAU,QAAW;AACrB,YAAM,OAAO,kBAAkB,SAAS,QAAQ;AAChD,YAAM,SAAS,SAAS,KAAK,QAAQ,SAAY,cAAa,SAAS,IAAI,EAAE;AAC7E,cAAQ,WAAW,SAAY,OAAO;AACtC,oBAAa,YAAY,IAAI,KAAK,KAAK;AAAA,IAC3C;AACA,WAAO,UAAU,QAAQ,MAAM,UAAU,KAAK,QAAQ,SAAY;AAAA,EACtE;AAAA,EAEA,SAAS,SAA4C;AACjD,WAAO,KAAK,aAAa,OAAO,KAAK,KAAK,cAAc,OAAO,KAAK,KAAK,YAAY,OAAO;AAAA,EAChG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,UAAU,SAA0B;AAChC,UAAM,QAAQ,KAAK,SAAS,OAAO;AACnC,QAAI,UAAU,OAAW,QAAO,MAAM;AACtC,UAAM,UAAU,eAAe,KAAK,OAAO,cAAa,kBAAkB;AAC1E,WAAO,YAAY,SAAY,KAAK,QAAQ;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,cAAc,MAAc,SAAuC;AACtE,UAAM,UAAU,cAAa,SAAS,IAAI;AAC1C,QAAI,QAAQ,WAAW,OAAW,QAAO;AACzC,UAAM,SAAS,QAAQ;AACvB,eAAW,WAAW,cAAa,oBAAoB;AACnD,UAAI,iBAAiB,OAAO,OAAO,QAAQ,UAAU,OAAO,CAAC,EAAG,QAAO,EAAE,QAAQ,QAAQ;AAAA,IAC7F;AAEA,QAAI,OAAO,SAAS,OAAO,MAAM,OAAW,QAAO,EAAE,QAAQ,cAAa,MAAM,YAAY,OAAO,KAAK,CAAC,EAAE;AAC3G,WAAO,EAAE,OAAO;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAAS,SAAgC;AACrC,UAAM,YAAY,eAAe,KAAK,OAAO,cAAa,kBAAkB;AAC5E,QAAI,cAAc,OAAW,QAAO;AACpC,UAAMC,QAAO,cAAa,cAAc,WAAW,OAAO,EAAE;AAC5D,WAAOA,UAAS,UAAa,cAAa,mBAAmB,KAAK,aAAW,QAAQ,OAAOA,KAAI,CAAC,IAAIA,QAAO;AAAA,EAChH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,kBAAkB,MAAmC;AACxD,UAAM,UAAU,cAAa,SAAS,IAAI;AAC1C,QAAI,QAAQ,WAAW,OAAW,QAAO;AACzC,UAAMC,WAAU,QAAQ,OAAO;AAC/B,QAAI,cAAa,mBAAmB,KAAK,aAAW,iBAAiB,QAAQ,OAAOA,QAAO,CAAC,GAAG;AAC3F,aAAO,EAAE,QAAQ,cAAa,MAAM,YAAYA,QAAO,CAAC,EAAE;AAAA,IAC9D;AACA,WAAO;AAAA,EACX;AACJ;AAGA,SAAS,YAAY,SAAyB;AAC1C,MAAI,UAAU;AACd,aAAW,KAAK,SAAS;AACrB,QAAI,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,IAAK,YAAW;AACjE,eAAW;AAAA,EACf;AACA,SAAO;AACX;AAGA,SAAS,eAAe,MAAc,UAAuD;AACzF,MAAI,CAAC,KAAK,SAAS,IAAI,EAAG,QAAO;AACjC,QAAM,YAAY,KAAK,WAAW,MAAM,EAAE;AAC1C,SAAO,YAAY,SAAS,MAAM,QAAQ,SAAS,KAAK,aAAW,iBAAiB,QAAQ,MAAM,SAAS,CAAC,IAAI,YAAY;AAChI;AAMA,SAAS,cAAc,MAAsB;AACzC,MAAI,YAAY;AAChB,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AAClC,YAAQ,KAAK,OAAO,CAAC,GAAG;AAAA,MACpB,KAAK,KAAK;AACN,cAAM,QAAQ,KAAK,QAAQ,KAAK,IAAI,CAAC;AACrC,YAAI,QAAQ,EAAG,QAAO;AACtB,YAAI;AACJ;AAAA,MACJ;AAAA,MACA,KAAK,KAAK;AACN,cAAM,MAAM,KAAK,QAAQ,KAAK,IAAI,CAAC;AACnC,YAAI,MAAM,EAAG,QAAO;AACpB,YAAI;AACJ;AAAA,MACJ;AAAA,MACA,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACD;AACA;AAAA,MACJ;AACI;AAAA,IACR;AACA,QAAI,CAAC,uBAAuB,MAAM,GAAG,OAAO,EAAG;AAC/C,QAAI,KAAK,MAAM,GAAG,IAAI,CAAC,MAAM,QAAS,aAAY,GAAG,UAAU,MAAM,GAAG,CAAC,CAAC,QAAQ,UAAU,MAAM,IAAI,CAAC,CAAC;AACxG,SAAK;AAAA,EACT;AACA,SAAO;AACX;AAGA,SAAS,cAAc,MAAiC;AACpD,QAAM,QAAkB,CAAC;AACzB,MAAI,QAAQ;AACZ,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AAClC,YAAQ,KAAK,OAAO,CAAC,GAAG;AAAA,MACpB,KAAK,KAAK;AACN,cAAM,QAAQ,KAAK,QAAQ,KAAK,IAAI,CAAC;AACrC,YAAI,QAAQ,EAAG,QAAO;AACtB,YAAI;AACJ;AAAA,MACJ;AAAA,MACA,KAAK,KAAK;AACN,cAAM,MAAM,KAAK,QAAQ,KAAK,IAAI,CAAC;AACnC,YAAI,MAAM,EAAG,QAAO;AACpB,YAAI;AACJ;AAAA,MACJ;AAAA,MACA,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACD;AACA;AAAA,MACJ,KAAK;AACD,cAAM,KAAK,KAAK,MAAM,OAAO,CAAC,CAAC;AAC/B,gBAAQ,IAAI;AACZ;AAAA,MACJ;AACI;AAAA,IACR;AAAA,EACJ;AACA,QAAM,KAAK,KAAK,MAAM,KAAK,CAAC;AAC5B,SAAO;AACX;;;ACliCO,IAAM,oBAAoB,IAAI,WAAW,aAAa,SAAS,WAAW,SAAS,SAAS,SAAS,MAAM,YAAY,IAAI;AAM3H,SAAS,SAA+C,GAAkB,GAA2B;AACxG,MAAI,MAAM,UAAa,MAAM,OAAW,QAAO,MAAM;AACrD,MAAI,OAAO,MAAM,YAAY,OAAO,MAAM,SAAU,QAAO,MAAM;AACjE,SAAO,EAAE,OAAO,CAAU;AAC9B;AAGO,SAAS,IAA0C,OAAU,OAAyB;AACzF,SAAO,SAAS,OAAO,KAAK,IAAI,SAAY;AAChD;AAGO,IAAM,aAAN,MAAM,YAAW;AAAA,EACX;AAAA,EAEA;AAAA,EAEA;AAAA,EAEA;AAAA,EAEA;AAAA,EAET,YACI,cACA,WACA,MACA,MACA,SACF;AACE,SAAK,eAAe;AACpB,SAAK,YAAY;AACjB,SAAK,OAAO;AACZ,SAAK,OAAO;AACZ,SAAK,UAAU;AAAA,EACnB;AAAA;AAAA,EAGA,OAAgB,QAAQ,IAAI,YAAW,QAAW,QAAW,QAAW,QAAW,MAAS;AAAA,EAE5F,IAAI,UAAmB;AACnB,WAAO,KAAK,iBAAiB,UAAa,KAAK,cAAc,UAAa,KAAK,SAAS,UAAa,KAAK,SAAS,UAAa,KAAK,YAAY;AAAA,EACrJ;AAAA;AAAA,EAGA,KAAK,OAA+B;AAChC,WAAO,IAAI;AAAA,MAAW,KAAK,gBAAgB,MAAM;AAAA,MAAc,KAAK,aAAa,MAAM;AAAA,MAAW,KAAK,QAAQ,MAAM;AAAA,MACjH,KAAK,QAAQ,MAAM;AAAA,MAAM,KAAK,WAAW,MAAM;AAAA,IAAO;AAAA,EAC9D;AAAA;AAAA,EAGA,KAAK,QAA0B,MAAkB,OAA+B;AAC5E,WAAO,IAAI;AAAA,MACP,OAAO,iBAAiB,SAAY,KAAK,eAAe,IAAI,KAAK,cAAc,MAAM,YAAY;AAAA,MACjG,OAAO,cAAc,SAAY,KAAK,YAAY,IAAI,KAAK,WAAW,MAAM,SAAS;AAAA,MACrF,OAAO,WAAW,IAAI,KAAK,MAAM,MAAM,IAAI,IAAI,KAAK;AAAA,MACpD,OAAO,SAAS,SAAY,KAAK,OAAO,IAAI,KAAK,MAAM,MAAM,IAAI;AAAA,MACjE,OAAO,cAAc,IAAI,KAAK,SAAS,MAAM,OAAO,IAAI,KAAK;AAAA,IAAO;AAAA,EAC5E;AAAA;AAAA,EAGA,UAAU,OAA6K;AACnL,WAAO,IAAI;AAAA,MACP,kBAAkB,QAAQ,MAAM,eAAe,KAAK;AAAA,MACpD,eAAe,QAAQ,MAAM,YAAY,KAAK;AAAA,MAC9C,KAAK;AAAA,MACL,UAAU,QAAQ,MAAM,OAAO,KAAK;AAAA,MACpC,aAAa,QAAQ,MAAM,UAAU,KAAK;AAAA,IAAO;AAAA,EACzD;AAAA;AAAA,EAGA,IAAI,MAAc;AACd,WAAO,GAAG,KAAK,iBAAiB,SAAY,MAAM,IAAI,KAAK,aAAa,IAAI,EAAE,KAAS,KAAK,aAAa,GAAG,KAAS,KAAK,MAAM,OAAO,GAAG,KAAS,KAAK,SAAS,SAAY,MAAM,OAAO,KAAK,KAAK,GAAG,CAAC,KAAS,KAAK,SAAS,OAAO,GAAG;AAAA,EAC7O;AAAA,EAEA,OAAO,OAA4B;AAC/B,WAAO,SAAS,KAAK,cAAc,MAAM,YAAY,KAAK,KAAK,cAAc,MAAM,aAAa,SAAS,KAAK,MAAM,MAAM,IAAI,KACvH,SAAS,KAAK,MAAM,MAAM,IAAI,KAAK,SAAS,KAAK,SAAS,MAAM,OAAO;AAAA,EAClF;AACJ;AA6BO,IAAM,mBAAN,MAAM,kBAAkD;AAAA;AAAA,EAElD;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA,EAET,YAAY,OAA8B;AACtC,SAAK,eAAe,MAAM;AAC1B,SAAK,YAAY,MAAM;AACvB,SAAK,aAAa,MAAM;AACxB,SAAK,OAAO,MAAM;AAClB,SAAK,SAAS,MAAM;AACpB,SAAK,YAAY,MAAM;AACvB,SAAK,gBAAgB,MAAM;AAC3B,SAAK,OAAO,MAAM;AAClB,SAAK,UAAU,MAAM;AAAA,EACzB;AAAA;AAAA,EAGA,YAAY,SAAyC;AACjD,WAAO,IAAI,kBAAiB,EAAE,GAAG,KAAK,OAAO,GAAG,QAAQ,CAAC;AAAA,EAC7D;AAAA,EAEA,SAAgC;AAC5B,WAAO;AAAA,MACH,cAAc,KAAK;AAAA,MAAc,WAAW,KAAK;AAAA,MAAW,YAAY,KAAK;AAAA,MAAY,MAAM,KAAK;AAAA,MAAM,QAAQ,KAAK;AAAA,MACvH,WAAW,KAAK;AAAA,MAAW,eAAe,KAAK;AAAA,MAAe,MAAM,KAAK;AAAA,MAAM,SAAS,KAAK;AAAA,IACjG;AAAA,EACJ;AAAA;AAAA,EAGA,IAAI,UAAmB;AACnB,WAAO,KAAK,iBAAiB,UAAa,KAAK,cAAc,UAAa,CAAC,KAAK,YAAY,KAAK,SAAS,UAAa,CAAC,KAAK;AAAA,EACjI;AAAA;AAAA,EAGA,IAAI,WAAoB;AACpB,WAAO,KAAK,eAAe,UAAa,KAAK,SAAS,UAAa,KAAK,WAAW,UAAa,KAAK,cAAc,UAAa,KAAK,kBAAkB;AAAA,EAC3J;AAAA;AAAA,EAGA,IAAI,cAAuB;AACvB,WAAO,KAAK,YAAY,UAAa,CAAC,KAAK,QAAQ;AAAA,EACvD;AAAA;AAAA,EAGA,QAAQ,OAA4B;AAChC,WAAQ,KAAK,iBAAiB,UAAa,MAAM,iBAAiB,UAC1D,KAAK,cAAc,UAAa,MAAM,cAAc,UACpD,KAAK,YAAY,MAAM,SAAS,UAChC,KAAK,SAAS,UAAa,MAAM,SAAS,UAC1C,KAAK,eAAe,MAAM,YAAY;AAAA,EAClD;AAAA;AAAA,EAGA,QAAQ,OAAmBC,QAAiC;AACxD,WAAO,IAAI;AAAA,MACP,KAAK,gBAAgB,MAAM;AAAA,MAC3B,KAAK,aAAa,MAAM;AAAA,MACxB,KAAK,YAAY,MAAM,IAAI;AAAA,MAC3B,KAAK,QAAQ,MAAM;AAAA,MACnB,KAAK,YAAY,SAAY,MAAM,UAAU,KAAK,QAAQ,QAAQ,MAAM,SAASA,MAAK;AAAA,IAAC;AAAA,EAC/F;AAAA;AAAA,EAGA,YAAY,MAA0B;AAClC,WAAO,IAAI,SAAS;AAAA,MAChB,QAAQ,KAAK,cAAc,KAAK;AAAA,MAChC,MAAM,KAAK,QAAQ,KAAK;AAAA,MACxB,QAAQ,KAAK,UAAU,KAAK;AAAA,MAC5B,WAAW,KAAK,aAAa,KAAK;AAAA,MAClC,eAAe,KAAK,iBAAiB,KAAK;AAAA,IAC9C,CAAC;AAAA,EACL;AACJ;AAyBO,IAAM,eAAN,MAAM,cAA0C;AAAA;AAAA,EAE1C;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA,EAET,YAAY,OAA0B;AAClC,SAAK,MAAM,MAAM;AACjB,SAAK,SAAS,MAAM;AACpB,SAAK,OAAO,MAAM;AAClB,SAAK,QAAQ,MAAM;AACnB,SAAK,mBAAmB,MAAM;AAC9B,SAAK,iBAAiB,MAAM;AAAA,EAChC;AAAA;AAAA,EAGA,OAAO,QAAQ,MAAgC;AAC3C,WAAO,IAAI,cAAa,EAAE,KAAK,MAAM,QAAQ,MAAM,MAAM,MAAM,OAAO,KAAK,CAAC;AAAA,EAChF;AAAA;AAAA,EAGA,OAAO,OAAO,MAAgC;AAC1C,WAAO,IAAI,cAAa,EAAE,kBAAkB,MAAM,gBAAgB,KAAK,CAAC;AAAA,EAC5E;AAAA;AAAA,EAGA,OAAgB,OAAO,IAAI,cAAa;AAAA,IACpC,KAAK,WAAW;AAAA,IAAM,QAAQ,WAAW;AAAA,IAAM,MAAM,WAAW;AAAA,IAAM,OAAO,WAAW;AAAA,IACxF,kBAAkB,WAAW;AAAA,IAAM,gBAAgB,WAAW;AAAA,EAClE,CAAC;AAAA;AAAA,EAGD,IAAI,UAAmB;AACnB,WAAO,KAAK,QAAQ,UAAa,KAAK,WAAW,UAAa,KAAK,SAAS,UAAa,KAAK,UAAU,UACjG,KAAK,qBAAqB,UAAa,KAAK,mBAAmB;AAAA,EAC1E;AAAA;AAAA,EAGA,QAAQ,SAAsBA,QAAkC;AAC5D,WAAO,IAAI,YAAY;AAAA,MACnB,MAAMA,OAAM,WAAW,KAAK,MAAM,KAAK,qBAAqB,QAAQ;AAAA,MACpE,SAASA,OAAM,UAAU,KAAK,SAAS,KAAK,qBAAqB,QAAQ;AAAA,MACzE,OAAOA,OAAM,cAAc,KAAK,OAAO,KAAK,mBAAmB,QAAQ;AAAA,MACvE,QAAQA,OAAM,aAAa,KAAK,QAAQ,KAAK,mBAAmB,QAAQ;AAAA,IAC5E,CAAC;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,GAAG,OAAgC;AAC/B,WAAO,KAAK,SAAS,UAAa,KAAK,mBAAmB,UAAa,MAAM,eAAe,CAAC,MAAM,iBAC7F,IAAI,cAAa,EAAE,GAAG,KAAK,OAAO,GAAG,MAAM,KAAK,eAAe,CAAC,IAChE;AAAA,EACV;AAAA,EAEA,SAA4B;AACxB,WAAO,EAAE,KAAK,KAAK,KAAK,QAAQ,KAAK,QAAQ,MAAM,KAAK,MAAM,OAAO,KAAK,OAAO,kBAAkB,KAAK,kBAAkB,gBAAgB,KAAK,eAAe;AAAA,EAClK;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,CAAC,OAAO,OAA0E;AAC9E,UAAM,EAAE,OAAO,KAAK,IAAI;AACxB,QAAI,KAAK,QAAQ,UAAa,MAAM,MAAM,GAAG;AACzC,YAAM,EAAE,OAAO,IAAI,UAAU,IAAI,YAAY,MAAM,MAAM,GAAG,MAAM,MAAM,GAAG,IAAI,YAAY,MAAM,MAAM,GAAG,KAAK,MAAM,CAAC,GAAG,SAAS,IAAI,cAAa,EAAE,QAAQ,WAAW,KAAK,CAAC,EAAE;AAAA,IACpL;AACA,QAAI,KAAK,WAAW,UAAa,KAAK,MAAM,WAAW,GAAG;AACtD,YAAM,EAAE,OAAO,IAAI,UAAU,IAAI,YAAY,KAAK,MAAM,GAAG,MAAM,MAAM,GAAG,IAAI,YAAY,KAAK,MAAM,GAAG,KAAK,MAAM,CAAC,GAAG,SAAS,IAAI,cAAa,EAAE,KAAK,WAAW,KAAK,CAAC,EAAE;AAAA,IAC/K;AACA,QAAI,KAAK,SAAS,UAAa,MAAM,SAAS,GAAG;AAC7C,YAAM,EAAE,OAAO,IAAI,UAAU,IAAI,YAAY,MAAM,KAAK,MAAM,SAAS,CAAC,GAAG,IAAI,YAAY,KAAK,KAAK,MAAM,SAAS,CAAC,CAAC,GAAG,SAAS,IAAI,cAAa,EAAE,OAAO,WAAW,KAAK,CAAC,EAAE;AAAA,IACnL;AACA,QAAI,KAAK,UAAU,UAAa,KAAK,SAAS,cAAc,GAAG;AAC3D,YAAM,EAAE,OAAO,IAAI,UAAU,IAAI,YAAY,MAAM,KAAK,KAAK,SAAS,CAAC,GAAG,IAAI,YAAY,KAAK,KAAK,KAAK,SAAS,CAAC,CAAC,GAAG,SAAS,IAAI,cAAa,EAAE,MAAM,WAAW,KAAK,CAAC,EAAE;AAAA,IAChL;AAAA,EACJ;AACJ;AAGO,IAAM,eAAN,MAAM,cAAa;AAAA,EACb;AAAA,EAEA;AAAA,EAEA;AAAA,EAEA;AAAA,EAET,YAAY,UAAmB,SAAkB,aAAsB,YAAqB;AACxF,SAAK,WAAW;AAChB,SAAK,UAAU;AACf,SAAK,cAAc;AACnB,SAAK,aAAa;AAAA,EACtB;AAAA;AAAA,EAGA,OAAgB,QAAQ,IAAI,cAAa,MAAM,MAAM,MAAM,IAAI;AAAA;AAAA,EAG/D,OAAgB,SAAS,IAAI,cAAa,OAAO,OAAO,OAAO,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA,EAMpE,OAAO,GAAG,OAAkB,IAA+B;AACvD,UAAM,UAAU,MAAM;AACtB,UAAM,OAAO,MAAM;AACnB,WAAO,IAAI;AAAA,MACP,CAAC,WAAW,GAAG,QAAQ,MAAM,MAAM;AAAA,MACnC,CAAC,WAAW,GAAG,QAAQ,MAAM,KAAK;AAAA,MAClC,EAAE,WAAW,SAAS,GAAG,WAAW,MAAM,MAAM;AAAA,MAChD,CAAC,QAAQ,GAAG,WAAW,MAAM,KAAK;AAAA,IAAM;AAAA,EAChD;AACJ;AAMO,IAAM,YAAN,MAAM,WAAU;AAAA,EACV;AAAA,EAEA;AAAA,EAEA;AAAA,EAEA;AAAA,EAEA;AAAA,EAEA;AAAA,EAEA;AAAA,EAET,YACI,OACA,OACA,cACA,WACA,MACA,MACA,SACF;AACE,SAAK,QAAQ;AACb,SAAK,QAAQ;AACb,SAAK,eAAe;AACpB,SAAK,YAAY;AACjB,SAAK,OAAO;AACZ,SAAK,OAAO;AACZ,SAAK,UAAU;AAAA,EACnB;AAAA,EAEA,OAAgB,QAAQ,IAAI,WAAU,QAAW,QAAW,QAAW,QAAW,QAAW,QAAW,MAAS;AAAA;AAAA,EAGjH,IAAI,WAAsB;AACtB,WAAO,KAAK,UAAU,SAAY,OAAO,IAAI,WAAU,KAAK,OAAO,QAAW,KAAK,cAAc,KAAK,WAAW,KAAK,MAAM,KAAK,MAAM,KAAK,OAAO;AAAA,EACvJ;AAAA;AAAA,EAGA,UAAU,OAAqC;AAC3C,WAAO,IAAI,WAAU,OAAO,KAAK,OAAO,KAAK,cAAc,KAAK,WAAW,KAAK,MAAM,KAAK,MAAM,KAAK,OAAO;AAAA,EACjH;AAAA;AAAA,EAGA,WAAW,QAAqM;AAC5M,WAAO,IAAI,WAAU,KAAK,OAAO,KAAK,OAAO,OAAO,cAAc,OAAO,WAAW,OAAO,MAAM,OAAO,MAAM,OAAO,OAAO;AAAA,EAChI;AAAA,EAEA,WAAW,OAA2B;AAClC,WAAO,UAAU,KAAK,OAAO,MAAM,KAAK,KAAK,KAAK,WAAW,KAAK;AAAA,EACtE;AAAA;AAAA,EAGA,WAAW,OAAkM;AACzM,WAAO,SAAS,KAAK,cAAc,MAAM,YAAY,KAAK,KAAK,cAAc,MAAM,aAAa,SAAS,KAAK,MAAM,MAAM,IAAI,KACvH,SAAS,KAAK,MAAM,MAAM,IAAI,KAAK,SAAS,KAAK,SAAS,MAAM,OAAO;AAAA,EAClF;AAAA;AAAA,EAGA,IAAI,aAAyB;AACzB,WAAO,IAAI;AAAA,MACP,KAAK,gBAAgB,aAAa;AAAA,MAClC,KAAK,aAAa;AAAA;AAAA,MAClB,KAAK,QAAQ,SAAS;AAAA,MACtB,KAAK,QAAQ,SAAS;AAAA,MACtB,KAAK,WAAW,YAAY;AAAA,IAAI;AAAA,EACxC;AACJ;AAEA,SAAS,UAAU,GAAsB,GAA+B;AACpE,MAAI,MAAM,UAAa,MAAM,OAAW,QAAO,MAAM;AACrD,SAAO,EAAE,OAAO,CAAC;AACrB;;;ACtbO,IAAM,OAAN,MAAW;AAAA,EACL;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAET,YAAY,MAAc,SAAiB,MAAc,SAAiB;AACtE,SAAK,OAAO;AACZ,SAAK,UAAU;AACf,SAAK,OAAO;AACZ,SAAK,UAAU;AAAA,EACnB;AAAA,EAEA,IAAI,eAAwB;AACxB,WAAO,KAAK,SAAS,KAAK,QAAQ,KAAK,YAAY,KAAK;AAAA,EAC5D;AAAA,EAEA,IAAI,YAAoB;AACpB,YAAQ,KAAK,OAAO,KAAK,OAAO,MAAM,KAAK,UAAU,KAAK,UAAU;AAAA,EACxE;AAAA,EAEA,IAAI,OAAe;AACf,WAAO,KAAK,OAAO,KAAK,OAAO;AAAA,EACnC;AAAA,EAEA,IAAI,UAAkB;AAClB,WAAO,KAAK,UAAU,KAAK,UAAU;AAAA,EACzC;AAAA,EAEA,SAAS,SAA+B;AACpC,WAAO,QAAQ,OAAO,KAAK,QAAQ,QAAQ,OAAO,KAAK,QAAQ,QAAQ,UAAU,KAAK,WAAW,QAAQ,UAAU,KAAK;AAAA,EAC5H;AAAA,EAEA,OAAO,OAAsB;AACzB,WAAO,KAAK,SAAS,MAAM,QAAQ,KAAK,YAAY,MAAM,WAAW,KAAK,SAAS,MAAM,QAAQ,KAAK,YAAY,MAAM;AAAA,EAC5H;AACJ;AAyBO,IAAM,YAAN,MAAM,WAAoC;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAET,YAAY,OAAuB;AAC/B,SAAK,YAAY,MAAM;AACvB,SAAK,QAAQ,MAAM;AACnB,SAAK,OAAO,MAAM;AAClB,SAAK,UAAU,MAAM;AACrB,SAAK,OAAO,MAAM;AAClB,SAAK,UAAU,MAAM;AACrB,SAAK,eAAe,MAAM;AAC1B,SAAK,kBAAkB,MAAM;AAC7B,SAAK,eAAe,MAAM;AAC1B,SAAK,kBAAkB,MAAM;AAC7B,SAAK,UAAU,MAAM;AACrB,SAAK,gBAAgB,MAAM;AAAA,EAC/B;AAAA;AAAA,EAGA,OAAO,KAAK,OAA2B,OAAe,UAAkB,aAAsB,gBAAoC;AAC9H,WAAO,IAAI,WAAU;AAAA,MACjB,WAAW;AAAA,MAAO,OAAO;AAAA,MAAQ,MAAM;AAAA,MAAO,SAAS;AAAA,MAAU,MAAM;AAAA,MAAO,SAAS;AAAA,MACvF,cAAc;AAAA,MAAa,iBAAiB;AAAA,MAAgB,cAAc;AAAA,MAAa,iBAAiB;AAAA,MACxG,SAAS;AAAA,MAAO,eAAe;AAAA,IACnC,CAAC;AAAA,EACL;AAAA;AAAA,EAGA,KAAK,SAA6C;AAC9C,WAAO,IAAI,WAAU,EAAE,GAAG,KAAK,OAAO,GAAG,GAAG,QAAQ,CAAC;AAAA,EACzD;AAAA,EAEA,SAAyB;AACrB,WAAO;AAAA,MACH,WAAW,KAAK;AAAA,MAAW,OAAO,KAAK;AAAA,MAAO,MAAM,KAAK;AAAA,MAAM,SAAS,KAAK;AAAA,MAAS,MAAM,KAAK;AAAA,MAAM,SAAS,KAAK;AAAA,MACrH,cAAc,KAAK;AAAA,MAAc,iBAAiB,KAAK;AAAA,MAAiB,cAAc,KAAK;AAAA,MAAc,iBAAiB,KAAK;AAAA,MAC/H,SAAS,KAAK;AAAA,MAAS,eAAe,KAAK;AAAA,IAC/C;AAAA,EACJ;AAAA;AAAA,EAGA,OAAO,OAA2B;AAC9B,WAAO,KAAK,cAAc,MAAM,aAAa,KAAK,UAAU,MAAM,SAAS,KAAK,SAAS,MAAM,QAAQ,KAAK,YAAY,MAAM,WACvH,KAAK,SAAS,MAAM,QAAQ,KAAK,YAAY,MAAM,WAAW,KAAK,iBAAiB,MAAM,gBAC1F,KAAK,oBAAoB,MAAM,mBAAmB,KAAK,iBAAiB,MAAM,gBAC9E,KAAK,oBAAoB,MAAM,mBAAmB,KAAK,YAAY,MAAM,WAAW,KAAK,kBAAkB,MAAM;AAAA,EAC5H;AAAA;AAAA,EAGA,IAAI,WAAoB;AACpB,WAAO,KAAK,kBAAkB;AAAA,EAClC;AAAA;AAAA,EAGA,IAAI,OAAa;AACb,YAAQ,KAAK,OAAO;AAAA,MAChB,KAAK;AAAW,eAAO,IAAI,KAAK,GAAG,KAAK,SAAS,WAAW,GAAG,KAAK,OAAO;AAAA,MAC3E,KAAK;AAAQ,eAAO,IAAI,KAAK,KAAK,MAAM,GAAG,KAAK,MAAM,cAAc,CAAC;AAAA,MACrE,KAAK;AAAA,MACL,KAAK;AACD,eAAO,IAAI,KAAK,KAAK,MAAM,KAAK,SAAS,KAAK,MAAM,KAAK,OAAO;AAAA,MACpE;AAAS,eAAO,iBAAiB,KAAK,KAAK;AAAA,IAC/C;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,UAAU,OAA2B,MAAc,SAAiB,MAAc,SACrF,cAAuB,iBAA0B,cAAuB,iBAAqC;AAC7G,QAAI,YAAY,KAAK,YAAY,cAAc,GAAG;AAC9C,aAAO,IAAI,WAAU;AAAA,QACjB,WAAW;AAAA,QAAO,OAAO;AAAA,QAAQ;AAAA,QAAM,SAAS;AAAA,QAAG;AAAA,QAAM;AAAA,QAAS;AAAA,QAAc,iBAAiB;AAAA,QAAM;AAAA,QACvG,iBAAiB;AAAA,QAAM,SAAS;AAAA,QAAO,eAAe;AAAA,MAC1D,CAAC;AAAA,IACL;AACA,QAAI,SAAS,KAAK,SAAS,WAAW,GAAG;AACrC,aAAO,IAAI,WAAU;AAAA,QACjB,WAAW;AAAA,QAAO,OAAO;AAAA,QAAW,MAAM;AAAA,QAAG;AAAA,QAAS;AAAA,QAAM;AAAA,QAAS,cAAc;AAAA,QAAM;AAAA,QAAiB,cAAc;AAAA,QACxH;AAAA,QAAiB,SAAS;AAAA,QAAO,eAAe;AAAA,MACpD,CAAC;AAAA,IACL;AACA,WAAO,IAAI,WAAU;AAAA,MACjB,WAAW;AAAA,MAAO,OAAO;AAAA,MAAQ;AAAA,MAAM;AAAA,MAAS;AAAA,MAAM;AAAA,MAAS;AAAA,MAAc;AAAA,MAAiB;AAAA,MAAc;AAAA,MAC5G,SAAS;AAAA,MAAO,eAAe;AAAA,IACnC,CAAC;AAAA,EACL;AAAA;AAAA,EAGA,QAAgB;AACZ,QAAI,KAAK,UAAU,QAAQ;AACvB,YAAM,SAAS,WAAU;AAAA,QAAU,KAAK;AAAA,QAAW,KAAK;AAAA,QAAM,KAAK;AAAA,QAAS,KAAK;AAAA,QAAM,KAAK;AAAA,QAAS,KAAK;AAAA,QACtG,KAAK;AAAA,QAAiB,KAAK;AAAA,QAAc,KAAK;AAAA,MAAe,EAAE,KAAK,EAAE,eAAe,KAAK,cAAc,CAAC;AAC7G,UAAI,OAAO,UAAU,KAAK,MAAO,QAAO,OAAO,MAAM;AAAA,IACzD;AACA,QAAIC,QAAO;AACX,QAAI,KAAK,kBAAkB,QAAW;AAClC,UAAI,KAAK,cAAc,OAAW,OAAM,IAAI,MAAM,gEAAgE;AAClH,MAAAA,SAAQ,GAAG,eAAe,KAAK,WAAW,KAAK,aAAa,CAAC;AAAA,IACjE,WAAW,KAAK,cAAc,QAAW;AACrC,MAAAA,SAAQ,GAAG,eAAe,KAAK,SAAS,CAAC;AAAA,IAC7C;AACA,YAAQ,KAAK,OAAO;AAAA,MAChB,KAAK;AACD,QAAAA,SAAQ,OAAO,KAAK,SAAS,KAAK,eAAe,IAAI,IAAI,KAAK,MAAM,KAAK,YAAY;AACrF,YAAI,KAAK,QAAS,CAAAA,SAAQ;AAC1B;AAAA,MACJ,KAAK;AACD,QAAAA,SAAQ,GAAG,OAAO,KAAK,SAAS,KAAK,eAAe,CAAC,GAAG,IAAI,KAAK,MAAM,KAAK,YAAY,CAAC,IAAI,OAAO,KAAK,SAAS,KAAK,eAAe,CAAC,GAAG,IAAI,KAAK,MAAM,KAAK,YAAY,CAAC;AAC3K;AAAA,MACJ,KAAK;AACD,QAAAA,SAAQ,GAAG,OAAO,KAAK,SAAS,KAAK,eAAe,CAAC,IAAI,OAAO,KAAK,SAAS,KAAK,eAAe,CAAC;AACnG;AAAA,MACJ,KAAK;AACD,QAAAA,SAAQ,GAAG,IAAI,KAAK,MAAM,KAAK,YAAY,CAAC,IAAI,IAAI,KAAK,MAAM,KAAK,YAAY,CAAC;AACjF;AAAA,MACJ;AACI,eAAO,iBAAiB,KAAK,KAAK;AAAA,IAC1C;AACA,WAAOA;AAAA,EACX;AACJ;AAEA,SAAS,OAAO,OAAe,UAA2B;AACtD,UAAQ,WAAW,MAAM,MAAM,YAAY,WAAW,KAAK;AAC/D;AAEA,SAAS,IAAI,OAAe,UAA2B;AACnD,UAAQ,WAAW,MAAM,MAAM,OAAO,QAAQ,CAAC;AACnD;AAEA,SAAS,iBAAiB,OAAqB;AAC3C,QAAM,IAAI,MAAM,aAAa,OAAO,KAAK,CAAC,4BAA4B;AAC1E;AAMO,SAAS,eAAe,OAAe,MAAsB;AAChE,QAAM,OAAO,eAAe,KAAK,MAAM,SAAS,eAAe,IAAI,MAAM;AACzE,QAAM,OAAO,GAAG,KAAK,IAAI,IAAI;AAC7B,SAAO,OAAO,OAAO,IAAI,KAAK,WAAW,KAAK,IAAI,CAAC;AACvD;AAGO,SAAS,eAAe,MAAsB;AACjD,MAAI,OAAO,KAAK,SAAS,MAAM,cAAc,KAAK,WAAW,CAAC,CAAC,KAAK,KAAK,CAAC,MAAM;AAChF,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AAClC,UAAM,IAAI,KAAK,WAAW,CAAC;AAC3B,QAAI,EAAE,qBAAqB,CAAC,KAAK,MAAM,MAAQ,MAAM,IAAO,QAAO;AAAA,EACvE;AAEA,MAAI,SAAS,YAAY,SAAS,IAAI,MAAM,UAAa,UAAU,IAAI,KAAK,iBAAiB,MAAM,MAAM,KAAK,iBAAiB,MAAM,OAAO,IAAI;AAC5I,WAAO;AAAA,EACX;AACA,SAAO,OAAO,OAAO,IAAI,KAAK,WAAW,KAAK,IAAI,CAAC;AACvD;AAGA,SAAS,UAAU,MAAuB;AACtC,MAAI,IAAI;AACR,MAAI,IAAI,KAAK,WAAW,KAAK,CAAC,MAAM,OAAO,KAAK,CAAC,MAAM,MAAM;AACzD;AACA,WAAO,IAAI,KAAK,UAAU,aAAa,KAAK,WAAW,CAAC,CAAC,EAAG;AAAA,EAChE;AACA,MAAI,IAAI,KAAK,WAAW,KAAK,CAAC,MAAM,OAAO,KAAK,CAAC,MAAM,MAAM;AACzD;AACA,WAAO,IAAI,KAAK,UAAU,aAAa,KAAK,WAAW,CAAC,CAAC,EAAG;AAAA,EAChE;AACA,SAAO,IAAI,KAAK,MAAM,KAAK;AAC/B;;;AChPA,IAAe,WAAf,MAAwB;AAAA;AAAA,EAEpB,CAAC,aAAmC;AAAA,EAEpC;AAAA;AAAA,EAGA,CAAC,uBAA2D;AAAA,EAE5D;AAAA;AAAA,EAGA,CAAC,QAAiC;AAAA,EAElC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,QAAgB;AAChB,WAAO;AAAA,EACX;AACJ;AAEO,IAAM,aAAN,cAAyB,SAAS;AAAA,EAC5B,OAAO;AAAA,EACP;AAAA,EAET,YAAYC,SAAgB;AACxB,UAAM;AACN,SAAK,SAASA;AAAA,EAClB;AACJ;AAEO,IAAM,WAAN,cAAuB,SAAS;AAAA,EAC1B,OAAO;AAAA,EACP;AAAA,EAET,YAAYC,OAAc;AACtB,UAAM;AACN,SAAK,OAAOA;AAAA,EAChB;AACJ;AAEO,IAAM,cAAN,cAA0B,SAAS;AAAA,EAC7B,OAAO;AAAA,EACP;AAAA,EAET,YAAY,OAAgB;AACxB,UAAM;AACN,SAAK,QAAQ;AAAA,EACjB;AACJ;AAEO,IAAM,YAAN,cAAwB,SAAS;AAAA,EAC3B,OAAO;AAAA,EACP;AAAA,EAET,YAAYC,QAAmB;AAC3B,UAAM;AACN,SAAK,QAAQA;AAAA,EACjB;AACJ;AAGO,IAAM,cAAN,MAAM,qBAAoB,SAAS;AAAA,EAC7B,OAAO;AAAA,EAEhB,OAAgB,WAAW,IAAI,aAAY;AAAA,EAEnC,cAAc;AAClB,UAAM;AAAA,EACV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,QAAQ,UAAyB;AACpC,QAAI,SAAS,SAAS,UAAW,QAAO;AACxC,QAAI,SAAS,SAAS,UAAU,SAAS,YAAY,OAAW,QAAO,aAAY,QAAQ,SAAS,QAAQ,KAAK;AACjH,WAAO;AAAA,EACX;AACJ;AAEO,IAAM,gBAAN,cAA4B,SAAS;AAAA,EAC/B,OAAO;AAAA,EACP;AAAA,EAET,YAAY,WAAsB;AAC9B,UAAM;AACN,SAAK,YAAY;AAAA,EACrB;AAAA,EAEA,CAAU,aAAmC;AACzC,UAAM,KAAK;AAAA,EACf;AACJ;AAGO,IAAM,0BAAN,cAAsC,SAAS;AAAA,EACzC,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EAET,YAAYC,QAAeC,SAAgB;AACvC,UAAM;AACN,SAAK,QAAQD;AACb,SAAK,SAASC;AAAA,EAClB;AAAA,EAEA,CAAU,uBAA2D;AACjE,UAAM;AAAA,EACV;AACJ;AAGO,IAAM,aAAN,MAAiB;AAAA;AAAA,EAEX;AAAA;AAAA,EAET,QAAc,YAAY;AAAA,EAE1B,YAAY,MAAc;AACtB,SAAK,OAAO;AAAA,EAChB;AACJ;AAMO,IAAM,WAAN,cAAuB,SAAS;AAAA,EAC1B,OAAO;AAAA,EACP;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EAET,YAAY,MAAc,UAAkB,SAAiC;AACzE,UAAM;AACN,SAAK,OAAO;AACZ,SAAK,WAAW;AAChB,SAAK,UAAU;AAEf,SAAK,SAAS,YAAY,SAAY,IAAI,QAAQ,MAAM,QAAQ;AAAA,EACpE;AAAA,EAEA,IAAa,QAAgB;AACzB,WAAO,KAAK;AAAA,EAChB;AACJ;AAOO,IAAM,UAAN,cAAsB,SAAS;AAAA,EACzB,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EAET,YAAY,UAAiC,aAAmB;AAC5D,UAAM;AACN,SAAK,WAAW;AAChB,SAAK,cAAc;AACnB,SAAK,SAAS,KAAK,IAAI,KAAK,IAAI,GAAG,GAAG,SAAS,IAAI,OAAK,EAAE,MAAM,KAAK,CAAC,GAAG,YAAY,KAAK,IAAI;AAAA,EAClG;AAAA,EAEA,IAAI,SAAiB;AACjB,WAAO,CAAC,GAAG,KAAK,SAAS,IAAI,OAAK,EAAE,KAAK,GAAG,KAAK,WAAW;AAAA,EAChE;AAAA,EAEA,CAAU,aAAmC;AACzC,eAAW,KAAK,KAAK,OAAQ,QAAO,EAAE,WAAW;AAAA,EACrD;AAAA,EAEA,CAAU,uBAA2D;AACjE,eAAW,KAAK,KAAK,OAAQ,QAAO,EAAE,qBAAqB;AAAA,EAC/D;AAAA,EAEA,CAAU,QAAiC;AACvC,eAAW,KAAK,KAAK,OAAQ,QAAO,EAAE,MAAM;AAAA,EAChD;AAAA,EAEA,IAAa,QAAgB;AACzB,WAAO,KAAK;AAAA,EAChB;AACJ;AAMO,IAAM,mBAAN,cAA+B,SAAS;AAAA,EAClC,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EAET,YAAYC,OAAYC,QAAa;AACjC,UAAM;AACN,SAAK,OAAOD;AACZ,SAAK,QAAQC;AACb,SAAK,SAAS,KAAK,IAAID,MAAK,OAAOC,OAAM,KAAK,IAAI;AAAA,EACtD;AAAA,EAEA,CAAU,aAAmC;AACzC,WAAO,KAAK,KAAK,WAAW;AAC5B,WAAO,KAAK,MAAM,WAAW;AAAA,EACjC;AAAA,EAEA,CAAU,QAAiC;AACvC,WAAO,KAAK,KAAK,MAAM;AACvB,WAAO,KAAK,MAAM,MAAM;AAAA,EAC5B;AAAA,EAEA,IAAa,QAAgB;AACzB,WAAO,KAAK;AAAA,EAChB;AACJ;AAEO,IAAM,eAAN,cAA2B,SAAS;AAAA,EAC9B,OAAO;AAAA;AAAA,EAEP;AAAA,EACA;AAAA;AAAA,EAEA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA;AAAA,EACA;AAAA,EAET,YAAY,MAAc,MAAuB,YAA4CC,SAAQ,GAAG;AACpG,UAAM;AACN,SAAK,OAAO;AACZ,SAAK,YAAY;AACjB,SAAK,WAAW;AAChB,SAAK,QAAQA;AACb,SAAK,SAAS,KAAK,IAAI,GAAG,GAAG,KAAK,IAAI,OAAK,EAAE,KAAK,CAAC,IAAI;AAAA,EAC3D;AAAA,EAEA,CAAU,aAAmC;AACzC,eAAW,KAAK,KAAK,UAAW,QAAO,EAAE,WAAW;AACpD,WAAO,yBAAyB,IAAI;AAAA,EACxC;AAAA,EAEA,CAAU,uBAA2D;AACjE,eAAW,KAAK,KAAK,UAAW,QAAO,EAAE,qBAAqB;AAAA,EAClE;AAAA,EAEA,CAAU,QAAiC;AACvC,UAAM;AACN,eAAW,KAAK,KAAK,UAAW,QAAO,EAAE,MAAM;AAAA,EACnD;AAAA,EAEA,IAAa,QAAgB;AACzB,WAAO,KAAK;AAAA,EAChB;AACJ;AAEO,IAAM,kBAAN,cAA8B,SAAS;AAAA,EACjC,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EAET,YAAY,OAAa;AACrB,UAAM;AACN,SAAK,QAAQ;AACb,SAAK,SAAS,MAAM,QAAQ;AAAA,EAChC;AAAA,EAEA,CAAU,aAAmC;AACzC,WAAO,KAAK,MAAM,WAAW;AAAA,EACjC;AAAA,EAEA,CAAU,uBAA2D;AACjE,WAAO,KAAK,MAAM,qBAAqB;AAAA,EAC3C;AAAA,EAEA,CAAU,QAAiC;AACvC,WAAO,KAAK,MAAM,MAAM;AAAA,EAC5B;AAAA,EAEA,IAAa,QAAgB;AACzB,WAAO,KAAK;AAAA,EAChB;AACJ;AAEO,IAAM,YAAN,cAAwB,SAAS;AAAA,EAC3B,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EAET,YAAY,UAAqB,SAAe;AAC5C,UAAM;AACN,SAAK,WAAW;AAChB,SAAK,UAAU;AACf,SAAK,SAAS,QAAQ,QAAQ;AAAA,EAClC;AAAA,EAEA,CAAU,aAAmC;AACzC,WAAO,KAAK,QAAQ,WAAW;AAAA,EACnC;AAAA,EAEA,CAAU,uBAA2D;AACjE,WAAO,KAAK,QAAQ,qBAAqB;AAAA,EAC7C;AAAA,EAEA,CAAU,QAAiC;AACvC,WAAO,KAAK,QAAQ,MAAM;AAAA,EAC9B;AAAA,EAEA,IAAa,QAAgB;AACzB,WAAO,KAAK;AAAA,EAChB;AACJ;AAEO,IAAM,cAAN,cAA0B,SAAS;AAAA,EAC7B,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EAET,YAAY,SAAe;AACvB,UAAM;AACN,SAAK,UAAU;AACf,SAAK,SAAS,QAAQ,QAAQ;AAAA,EAClC;AAAA,EAEA,CAAU,aAAmC;AACzC,WAAO,KAAK,QAAQ,WAAW;AAAA,EACnC;AAAA,EAEA,CAAU,uBAA2D;AACjE,WAAO,KAAK,QAAQ,qBAAqB;AAAA,EAC7C;AAAA,EAEA,CAAU,QAAiC;AACvC,WAAO,KAAK,QAAQ,MAAM;AAAA,EAC9B;AAAA,EAEA,IAAa,QAAgB;AACzB,WAAO,KAAK;AAAA,EAChB;AACJ;AAOO,IAAM,aAAN,cAAyB,SAAS;AAAA,EAC5B,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAET,YAAY,UAAkBF,OAAYC,QAAa;AACnD,UAAM;AACN,SAAK,WAAW;AAChB,SAAK,OAAOD;AACZ,SAAK,QAAQC;AAEb,SAAK,SAAS,KAAK,IAAID,MAAK,OAAOC,OAAM,QAAQ,CAAC;AAAA,EACtD;AAAA,EAEA,IAAa,QAAgB;AACzB,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,CAAU,aAAmC;AACzC,eAAW,KAAK,KAAK,SAAS,EAAG,QAAO,EAAE,WAAW;AAAA,EACzD;AAAA,EAEA,CAAU,uBAA2D;AACjE,eAAW,KAAK,KAAK,SAAS,EAAG,QAAO,EAAE,qBAAqB;AAAA,EACnE;AAAA,EAEA,CAAU,QAAiC;AACvC,eAAW,KAAK,KAAK,SAAS,EAAG,QAAO,EAAE,MAAM;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,QAAsB;AACtB,UAAM,QAAsB,CAAC,IAAI;AACjC,aAAS,OAAO,KAAK,MAAM,KAAK,SAAS,UAAU,OAAO,KAAK,KAAM,OAAM,KAAK,IAAI;AACpF,WAAO,MAAM,WAAW;AAAA,EAC5B;AAAA;AAAA,EAGA,IAAI,WAAiB;AACjB,QAAI,OAAO,KAAK;AAChB,WAAO,KAAK,SAAS,SAAU,QAAO,KAAK;AAC3C,WAAO;AAAA,EACX;AAAA;AAAA,EAGA,CAAC,WAA4B;AACzB,UAAM,QAAQ,KAAK;AACnB,UAAM,KAAK;AACX,eAAWE,WAAU,MAAO,OAAMA,QAAO;AAAA,EAC7C;AACJ;AAMA,UAAU,yBAAyB,MAA0C;AACzE,MAAI,KAAK,aAAa,UAAc,KAAK,SAAS,WAAW,KAAK,SAAS,eAAgB,KAAK,UAAU,WAAW,EAAG;AACxH,QAAM,WAAW,iBAAiB,KAAK,UAAU,CAAC,CAAC;AACnD,QAAM,SAAS,iBAAiB,KAAK,UAAU,CAAC,CAAC;AACjD,MAAI,aAAa,UAAa,SAAS,WAAW,WAAW,UAAa,OAAO,QAAS;AAC1F,QAAM,IAAI,SAAS;AACnB,QAAM,IAAI,OAAO;AACjB,MAAI,EAAE,OAAO,EAAE,OAAO,YAAY,EAAE,UAAU,EAAE,UAAU,YAAa;AACvE,QAAM,UAAU,UAAU,OAAO,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,UAAU,EAAE,UAAU,GAAG,MAAM,MAAM,MAAM,IAAI,EAChI,KAAK,EAAE,eAAe,OAAO,cAAc,CAAC;AACrD;AAGO,SAAS,iBAAiB,MAA+C;AAC5E,MAAI,SAAS,OAAW,QAAO;AAC/B,MAAI,KAAK,SAAS,YAAa,QAAO,KAAK;AAC3C,MAAI,KAAK,SAAS,cAAe,QAAO,iBAAiB,KAAK,KAAK;AACnE,SAAO;AACX;;;AC1bO,IAAM,cAAqC;AAAA,EAC9C;AAAA,EAAU;AAAA,EAAW;AAAA,EAAW;AAAA,EAAS;AAAA,EAAU;AAAA,EAAS;AAAA,EAAQ;AAAA,EAAiB;AAAA,EACrF;AAAA,EAAW;AAAA,EAAU;AAAA,EAAW;AAAA,EAAa;AAAA,EAAa;AAC9D;AAOO,SAAS,gBAAgBC,OAAsC;AAClE,SAAO,SAASA,OAAM,IAAI;AAC9B;AAGO,SAAS,kBAAkBA,OAAsC;AACpE,SAAO,SAASA,OAAM,KAAK;AAC/B;AAEA,SAAS,SAASA,OAAc,YAA6C;AACzE,aAAWC,UAAS,aAAa;AAC7B,QAAIA,WAAU,mBAAmBA,WAAU,SAAU;AACrD,QAAI,aAAa,iBAAiBA,QAAOD,KAAI,IAAIC,WAAUD,MAAM,QAAOC;AAAA,EAC5E;AACA,SAAO;AACX;AAUO,IAAM,QAAN,MAAM,OAAM;AAAA,EACN;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAED,YAAY,MAAiBC,SAAgBF,OAA0BC,QAA+B,SAAkB;AAC5H,SAAK,QAAQ;AACb,SAAK,UAAUC;AACf,SAAK,QAAQF;AACb,SAAK,SAASC;AACd,SAAK,WAAW;AAAA,EACpB;AAAA;AAAA,EAGA,OAAO,WAAWC,SAAuB;AACrC,QAAI,CAAC,OAAO,SAASA,OAAM,EAAG,OAAM,IAAI,WAAW,iDAAiD,OAAOA,OAAM,CAAC,YAAY;AAC9H,WAAO,IAAI,OAAM,UAAUA,YAAW,IAAI,IAAIA,SAAQ,QAAW,QAAW,KAAK;AAAA,EACrF;AAAA;AAAA,EAGA,OAAO,SAASF,OAAqB;AACjC,WAAO,IAAI,OAAM,QAAQ,GAAGA,OAAM,QAAW,KAAK;AAAA,EACtD;AAAA;AAAA,EAGA,OAAO,YAAY,OAAuB;AACtC,WAAO,QAAQ,OAAM,QAAQ,OAAM;AAAA,EACvC;AAAA;AAAA,EAGA,OAAO,UAAUC,QAA0B;AACvC,WAAO,OAAM,QAAQ,IAAIA,MAAK,KAAK,IAAI,OAAM,SAAS,GAAG,QAAWA,QAAO,KAAK;AAAA,EACpF;AAAA,EAEA,OAAgB,QAAQ,IAAI,OAAM,WAAW,GAAG,QAAW,QAAW,KAAK;AAAA,EAC3E,OAAgB,SAAS,IAAI,OAAM,WAAW,GAAG,QAAW,QAAW,KAAK;AAAA,EAC5E,OAAgB,UAAU,IAAI,IAAuB,YAAY,IAAI,OAAK,CAAC,GAAG,IAAI,OAAM,SAAS,GAAG,QAAW,GAAG,KAAK,CAAC,CAAC,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAO1H,OAAgB,UAAiB,IAAI,OAAM,SAAS,GAAG,QAAW,WAAW,IAAI;AAAA;AAAA,EAGjF,OAAgB,cAAqB,IAAI,OAAM,SAAS,GAAG,QAAW,UAAU,IAAI;AAAA;AAAA,EAGpF,IAAI,OAAkB;AAClB,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,YAAqB;AACrB,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA,EAGA,IAAI,UAAmB;AACnB,WAAO,KAAK,UAAU;AAAA,EAC1B;AAAA;AAAA,EAGA,IAAI,SAAiB;AACjB,QAAI,KAAK,UAAU,SAAU,OAAM,KAAK,OAAO,QAAQ;AACvD,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA,EAGA,IAAI,OAAe;AACf,QAAI,KAAK,UAAU,OAAW,OAAM,KAAK,OAAO,MAAM;AACtD,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA,EAGA,IAAI,UAAmB;AACnB,QAAI,KAAK,UAAU,UAAW,OAAM,KAAK,OAAO,SAAS;AACzD,WAAO,KAAK,YAAY;AAAA,EAC5B;AAAA;AAAA,EAGA,IAAI,QAAoB;AACpB,QAAI,KAAK,WAAW,OAAW,OAAM,KAAK,OAAO,OAAO;AACxD,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,OAAO,OAAyB;AAC5B,WAAO,IAAI,MAAM,iBAAiB,KAAK,KAAK,SAAS,KAAK,GAAG;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,OAAuB;AAC1B,WAAO,KAAK,UAAU,MAAM,SAAS,KAAK,YAAY,MAAM,WAAW,KAAK,UAAU,MAAM,SAAS,KAAK,WAAW,MAAM;AAAA,EAC/H;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,UAAU,QAA2B,OAAmC;AAC3E,QAAI,WAAW,UAAa,UAAU,OAAW,QAAO,WAAW;AACnE,WAAO,OAAO,OAAO,KAAK,KAAK,OAAO,aAAa,MAAM;AAAA,EAC7D;AAAA;AAAA,EAGA,OAAO,KAAK,GAAsB,GAA+B;AAC7D,QAAI,MAAM,UAAa,MAAM,OAAW,QAAO,MAAM;AACrD,WAAO,EAAE,OAAO,CAAC;AAAA,EACrB;AAAA;AAAA,EAGA,WAAmB;AACf,YAAQ,KAAK,OAAO;AAAA,MAChB,KAAK;AAAU,eAAO,gBAAgB,KAAK,OAAO;AAAA,MAClD,KAAK;AAAQ,eAAO,KAAK;AAAA,MACzB,KAAK;AAAW,eAAO,KAAK,YAAY,IAAI,SAAS;AAAA,MACrD,KAAK;AAAS,eAAO,KAAK;AAAA,MAC1B;AAAS,eAAO,gBAAgB,KAAK,KAAK;AAAA,IAC9C;AAAA,EACJ;AACJ;AAEA,SAAS,gBAAgB,MAAoB;AACzC,QAAM,IAAI,MAAM,aAAa,OAAO,IAAI,CAAC,uBAAuB;AACpE;;;AChLO,IAAM,aAAN,MAAM,YAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMpB,OAAgB,YAAY,KAAK;AAAA,EAExB;AAAA,EACA;AAAA,EACA;AAAA,EAET,YAAY,MAAc,SAAiB;AACvC,QAAI,OAAO,KAAK,UAAU,EAAG,OAAM,IAAI,WAAW,+CAA+C;AACjG,QAAI,OAAO,UAAU,YAAW,UAAW,OAAM,IAAI,WAAW,2CAA2C;AAC3G,SAAK,OAAO;AACZ,SAAK,UAAU;AACf,SAAK,UAAU,MAAM,KAAwB,EAAE,QAAQ,OAAO,QAAQ,CAAC;AAAA,EAC3E;AAAA;AAAA,EAGA,IAAI,WAAoB;AACpB,WAAO,KAAK,SAAS,KAAK,KAAK,YAAY;AAAA,EAC/C;AAAA,EAEA,GAAGE,MAAaC,SAAmC;AAC/C,WAAO,KAAK,QAAQD,OAAM,KAAK,UAAUC,OAAM;AAAA,EACnD;AAAA,EAEA,IAAID,MAAaC,SAAgB,OAAgC;AAC7D,SAAK,QAAQD,OAAM,KAAK,UAAUC,OAAM,IAAI;AAAA,EAChD;AAAA;AAAA,EAGA,MAAsC;AAClC,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA,EAGA,CAAC,WAA6B;AAC1B,eAAW,KAAK,KAAK,SAAS;AAC1B,UAAI,MAAM,OAAW,OAAM;AAAA,IAC/B;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAUD,MAAaC,SAAmC;AACtD,UAAM,IAAI,KAAK,SAAS,IAAI,IAAID;AAChC,UAAM,IAAI,KAAK,YAAY,IAAI,IAAIC;AACnC,WAAO,IAAI,KAAK,QAAQ,IAAI,KAAK,UAAU,KAAK,GAAG,GAAG,CAAC,IAAI,MAAM,UAAU,MAAM;AAAA,EACrF;AAAA,EAEA,OAAO,OAAO,OAAsC;AAChD,UAAM,QAAQ,IAAI,YAAW,GAAG,CAAC;AACjC,UAAM,IAAI,GAAG,GAAG,KAAK;AACrB,WAAO;AAAA,EACX;AACJ;;;ACzCA,IAAM,SAAS,IAAI,KAAK,GAAG,GAAG,GAAG,CAAC;AAO3B,IAAM,UAAN,MAAM,SAAQ;AAAA,EACR;AAAA;AAAA,EAEA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA;AAAA,EAED,YAAY,OAAqB;AACrC,SAAK,OAAO,MAAM;AAClB,SAAK,SAAS,MAAM;AACpB,SAAK,OAAO,MAAM,QAAQ;AAC1B,SAAK,QAAQ,MAAM;AACnB,SAAK,SAAS,MAAM;AACpB,SAAK,WAAW,MAAM,aAAa;AACnC,SAAK,SAAS,MAAM;AACpB,SAAK,QAAQ,MAAM;AACnB,SAAK,eAAe,MAAM,iBAAiB;AAC3C,SAAK,YAAY,MAAM,cAAc;AAAA,EACzC;AAAA;AAAA,EAGA,IAAI,cAAuB;AACvB,WAAO,KAAK,SAAS,UAAU,KAAK;AAAA,EACxC;AAAA;AAAA,EAGA,IAAI,UAAmB;AACnB,WAAO,KAAK,SAAS,UAAU,KAAK,SAAS,YAAY,KAAK,SAAS,WAAW,KAAK,SAAS;AAAA,EACpG;AAAA,EAEA,OAAgB,UAAU,IAAI,SAAQ,EAAE,MAAM,UAAU,CAAC;AAAA,EAEzD,OAAgB,QAAQ,IAAI,SAAQ,EAAE,MAAM,SAAS,CAAC;AAAA;AAAA,EAGtD,OAAO,GAAG,OAAuB;AAC7B,WAAO,IAAI,SAAQ,EAAE,MAAM,UAAU,QAAQ,MAAM,CAAC;AAAA,EACxD;AAAA;AAAA,EAGA,OAAO,QAAQC,QAA4B;AACvC,WAAO,IAAI,SAAQ,EAAE,MAAM,UAAU,QAAQ,MAAM,UAAUA,MAAK,EAAE,CAAC;AAAA,EACzE;AAAA;AAAA,EAGA,OAAO,SAAS,OAAmC;AAC/C,WAAO,UAAU,SAAY,SAAQ,QAAQ,SAAQ,GAAG,KAAK;AAAA,EACjE;AAAA;AAAA,EAGA,OAAO,OAAO,MAAY,OAA4B;AAClD,WAAO,IAAI,SAAQ,EAAE,MAAM,QAAQ,MAAM,MAAM,CAAC;AAAA,EACpD;AAAA;AAAA,EAGA,OAAO,SAAS,MAAY,QAAwC;AAChE,WAAO,IAAI,SAAQ,EAAE,MAAM,UAAU,MAAM,OAAO,CAAC;AAAA,EACvD;AAAA;AAAA,EAGA,SAAkB;AACd,WAAO,KAAK,SAAS,WAAW,IAAI,SAAQ,EAAE,MAAM,UAAU,MAAM,KAAK,MAAM,QAAQ,KAAK,QAAQ,UAAU,KAAK,CAAC,IAAI;AAAA,EAC5H;AAAA;AAAA,EAGA,UAAU,MAAqB;AAC3B,QAAI,KAAK,SAAS,UAAU,KAAK,UAAU,OAAW,OAAM,IAAI,MAAM,2BAA2B;AACjG,WAAO,SAAQ,OAAO,MAAM,KAAK,KAAK;AAAA,EAC1C;AAAA;AAAA,EAGA,OAAO,SAASC,SAAiD;AAC7D,WAAO,IAAI,SAAQ,EAAE,MAAM,UAAU,QAAAA,QAAO,CAAC;AAAA,EACjD;AAAA;AAAA,EAGA,OAAO,QAAQ,OAA4B;AACvC,WAAO,MAAM,WAAW,IAAI,SAAQ,EAAE,MAAM,UAAU,QAAQ,MAAM,GAAG,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,SAAQ,EAAE,MAAM,SAAS,MAAM,CAAC;AAAA,EAC1H;AAAA;AAAA,EAGA,OAAO,aAAa,OAA4B;AAC5C,WAAO,IAAI,SAAQ,EAAE,MAAM,SAAS,OAAO,cAAc,KAAK,CAAC;AAAA,EACnE;AAAA;AAAA,EAGA,OAAO,QAAQ,OAAmC;AAC9C,WAAO,IAAI,SAAQ,EAAE,MAAM,SAAS,OAAO,WAAW,OAAO,KAAK,EAAE,CAAC;AAAA,EACzE;AAAA,EAEA,IAAI,UAAmB;AACnB,WAAO,KAAK,SAAS,YAAY,KAAK,WAAW,UAAa,KAAK,OAAO;AAAA,EAC9E;AAAA;AAAA,EAGA,IAAI,aAAsB;AACtB,YAAQ,KAAK,MAAM;AAAA,MACf,KAAK;AAAU,eAAO,KAAK,WAAW;AAAA,MACtC,KAAK;AAAS,eAAO,KAAK,QAAQ,EAAE,IAAI,EAAE,SAAS,MAAS;AAAA,MAC5D,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACD,eAAO;AAAA,MACX;AAAS,cAAM,IAAI,MAAM,aAAa,OAAO,KAAK,IAAI,CAAC,yBAAyB;AAAA,IACpF;AAAA,EACJ;AAAA;AAAA,EAGA,gBAAyB;AACrB,WAAO,KAAK,aACN,IAAI,SAAQ;AAAA,MACV,MAAM,KAAK;AAAA,MAAM,QAAQ,KAAK;AAAA,MAAQ,MAAM,KAAK;AAAA,MAAM,QAAQ,KAAK;AAAA,MAAQ,OAAO,KAAK;AAAA,MAAO,cAAc,KAAK;AAAA,MAClH,WAAW;AAAA,MAAM,OAAO,KAAK;AAAA,IACjC,CAAC,IACC;AAAA,EACV;AAAA;AAAA,EAGA,UAAsB;AAClB,QAAI,KAAK,UAAU,OAAW,OAAM,IAAI,MAAM,eAAe,KAAK,IAAI,0BAA0B;AAChG,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA,EAGA,WAA2C;AACvC,QAAI,KAAK,WAAW,OAAW,OAAM,IAAI,MAAM,eAAe,KAAK,IAAI,2BAA2B;AAClG,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA,EAGA,UAAsB;AAClB,QAAI,KAAK,UAAU,OAAW,OAAM,IAAI,MAAM,eAAe,KAAK,IAAI,0BAA0B;AAChG,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA,EAGA,WAAkC;AAC9B,QAAI,KAAK,WAAW,OAAW,OAAM,IAAI,MAAM,eAAe,KAAK,IAAI,2BAA2B;AAClG,WAAO,KAAK;AAAA,EAChB;AACJ;;;AC5JO,IAAM,qBAAN,MAAyB;AAAA,EACnB;AAAA,EACA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAET,YAAY,MAAc,SAAiB,SAAiB,MAAc,aAAqB,QAC3F,SAAyB,CAAC,GAAG;AAC7B,SAAK,OAAO;AACZ,SAAK,mBAAmB;AACxB,SAAK,mBAAmB;AACxB,SAAK,YAAY;AACjB,SAAK,cAAc;AACnB,SAAK,UAAU;AACf,SAAK,SAAS,OAAO,UAAU,CAAC;AAChC,SAAK,UAAU,OAAO,YAAY;AAClC,SAAK,aAAa,OAAO,cAAc;AACvC,SAAK,gBAAgB,OAAO;AAC5B,SAAK,mBAAmB,OAAO,qBAAqB;AACpD,SAAK,SAAS,OAAO;AAAA,EACzB;AAAA,EAEA,OAAO,MAA6B;AAChC,WAAO,KAAK,QAAQ,IAAI;AAAA,EAC5B;AACJ;AAGO,IAAM,eAAN,MAAmB;AAAA,EACb;AAAA,EACA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA,EAET,YAAY,WAAsB,MAAuBC,SAAQ,GAAG,QAA2D;AAC3H,SAAK,YAAY;AACjB,SAAK,aAAa;AAClB,SAAK,QAAQA;AACb,SAAK,SAAS;AAAA,EAClB;AAAA,EAEA,IAAI,QAAgB;AAChB,WAAO,KAAK,WAAW;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAQ,OAAwB;AAC5B,UAAM,UAAU,KAAK,UAAU,OAAO,KAAK,UAAU,QAAQ,KAAK,SAAS,KAAK,CAAC,CAAC;AAClF,WAAO,QAAQ,YAAY,KAAK,UAAU,OAAO,IAAI;AAAA,EACzD;AAAA;AAAA,EAGA,cAAc,OAAwB;AAClC,WAAO,KAAK,UAAU,OAAO,KAAK,UAAU,QAAQ,KAAK,SAAS,KAAK,CAAC,CAAC;AAAA,EAC7E;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAU,OAAe,SAA2B;AAChD,QAAI,QAAQ,SAAS,SAAU,QAAO;AACtC,UAAM,SAAS,KAAK,WAAW,SAAY,UAAU,KAAK,OAAO,OAAO,KAAK,WAAW,MAAM;AAC9F,YAAQ,QAAQ;AAAA,MACZ,KAAK;AAAS,eAAO;AAAA,MACrB,KAAK;AAAU,eAAO,QAAQ,OAAO;AAAA,MACrC,KAAK;AAAA,MACL,KAAK;AACD,eAAO,QAAQ,QAAQ,SAAS;AAAA,MACpC,KAAK,SAAS;AACV,cAAM,QAAQ,KAAK,UAAU,SAAS,OAAO;AAC7C,YAAI,UAAU,OAAW,OAAM,IAAI,MAAM,+DAA+D;AACxG,eAAO,QAAQ,GAAG,KAAK;AAAA,MAC3B;AAAA,MACA;AAAS,cAAM,IAAI,MAAM,aAAa,OAAO,MAAM,CAAC,wBAAwB;AAAA,IAChF;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAAS,OAAwB;AAC7B,UAAM,UAAU,KAAK,UAAU,OAAO,KAAK,UAAU,QAAQ,KAAK,SAAS,KAAK,CAAC,CAAC;AAClF,WAAO,QAAQ,aAAa,QAAQ,SAAS,UAAU,KAAK,UAAU,OAAO,IAAI;AAAA,EACrF;AAAA;AAAA,EAGA,SAAS,OAAqB;AAC1B,UAAM,OAAO,KAAK,WAAW,KAAK;AAClC,QAAI,SAAS,OAAW,OAAM,IAAI,MAAM,sBAAsB,OAAO,KAAK,CAAC,OAAO,OAAO,KAAK,WAAW,MAAM,CAAC,WAAW;AAC3H,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAAS,OAAwB;AAC7B,WAAO,KAAK,UAAU,OAAO,KAAK,UAAU,QAAQ,KAAK,SAAS,KAAK,CAAC,CAAC;AAAA,EAC7E;AAAA;AAAA,EAGA,IAAI,OAAwB;AACxB,UAAM,OAAO,KAAK,WAAW,KAAK;AAClC,WAAO,SAAS,UAAa,CAAC,YAAY,QAAQ,IAAI;AAAA,EAC1D;AACJ;;;AC9HO,SAAS,cAAsB;AAClC,UAAO,oBAAI,KAAK,GAAE,YAAY;AAClC;AAGO,SAAS,cAAc,OAAe,SAAyB;AAClE,SAAO,wBAAwB,OAAO,OAAO,EAAE;AACnD;AAGO,SAAS,wBAAwB,OAAe,SAAkC;AAErF,MAAI,MAAM,SAAS,KAAK,MAAM,OAAO,CAAC,MAAM,IAAK,QAAO,EAAE,OAAO,MAAM,SAAS,MAAM,MAAM,CAAC,CAAC,GAAG,SAAS,OAAU;AACpH,MAAI,iBAAiB,OAAO,MAAM,EAAG,QAAO,EAAE,OAAO,MAAM,YAAY,IAAI,GAAG,SAAS,OAAU;AACjG,MAAI,iBAAiB,OAAO,OAAO,EAAG,QAAO,EAAE,OAAO,MAAM,YAAY,KAAK,GAAG,SAAS,OAAU;AACnG,QAAMC,SAAQ,gBAAgB,KAAK;AACnC,MAAIA,WAAU,OAAW,QAAO,EAAE,OAAO,MAAM,UAAUA,MAAK,GAAG,SAAS,OAAU;AACpF,QAAM,UAAU,WAAW,KAAK;AAChC,QAAMC,UAAS,WAAW,SAAS,OAAO;AAC1C,MAAIA,YAAW,OAAW,QAAO,EAAE,OAAO,MAAM,WAAWA,QAAO,MAAM,GAAG,SAAS,QAAQA,QAAO,KAAK,EAAE;AAC1G,QAAM,UAAU,YAAY,SAAS,OAAO;AAC5C,MAAI,YAAY,QAAW;AACvB,WAAO;AAAA,MACH,OAAO,MAAM,WAAW,QAAQ,MAAM;AAAA,MACtC,SAAS,aAAa,MAAM,QAAQ,MAAM,WAAW,iCAAiC,wBAAwB;AAAA,IAClH;AAAA,EACJ;AACA,QAAM,WAAW,cAAc,SAAS,SAAS,YAAY,CAAC;AAC9D,MAAI,aAAa,OAAW,QAAO,EAAE,OAAO,MAAM,WAAW,SAAS,MAAM,GAAG,SAAS,SAAS,OAAO;AACxG,SAAO,EAAE,OAAO,MAAM,SAAS,KAAK,GAAG,SAAS,OAAU;AAC9D;AAMA,SAAS,QAAQ,OAA8C;AAC3D,MAAI,MAAM,QAAS,QAAO,aAAa,MAAM,MAAM,WAAW,UAAU,IAAI;AAC5E,MAAI,MAAM,SAAU,QAAO,aAAa,MAAM,UAAU;AACxD,MAAI,MAAM,QAAS,QAAO,aAAa,MAAM,MAAM,WAAW,aAAa,OAAO;AAClF,SAAO;AACX;AAGA,SAAS,WAAWC,OAAsB;AACtC,SAAOA,MAAK,QAAQ,YAAY,EAAE;AACtC;AAOA,SAAS,YAAYA,OAAc,SAA0C;AACzE,MAAI,QAAQ,KAAK,mBAAmB,OAAO,QAAQ,KAAK,4BAA4B,EAAG,QAAO;AAC9F,QAAM,WAAWA,MAAK,WAAW,IAAI,KAAKA,MAAK,WAAW,IAAI;AAC9D,QAAM,SAAS,WAAWA,MAAK,MAAM,CAAC,IAAIA,MAAK,WAAW,GAAG,IAAIA,MAAK,MAAM,CAAC,IAAI;AACjF,MAAI,WAAW,UAAa,OAAO,WAAW,KAAK,CAAC,aAAa,OAAO,WAAW,CAAC,CAAC,EAAG,QAAO;AAC/F,QAAMC,QAAO,WAAW,QAAQ,OAAO;AACvC,MAAIA,UAAS,UAAaA,MAAK,MAAM,WAAWA,MAAK,MAAM,SAAU,QAAO;AAC5E,SAAO,WAAW,EAAE,QAAQ,CAACA,MAAK,QAAQ,OAAOA,MAAK,MAAM,IAAIA;AACpE;AAGO,SAAS,cAAc,OAAe,SAA2B;AACpE,QAAMA,QAAO,WAAW,WAAW,KAAK,GAAG,OAAO;AAClD,SAAOA,UAAS,UAAa,CAACA,MAAK,MAAM;AAC7C;AAGO,SAAS,YAAYD,OAAc,SAAsC;AAC5E,QAAM,UAAU,WAAWA,KAAI;AAC/B,QAAMD,UAAS,WAAW,SAAS,OAAO;AAC1C,MAAIA,YAAW,OAAW,QAAOA,QAAO;AAExC,QAAM,UAAU,YAAY,SAAS,OAAO;AAC5C,MAAI,YAAY,OAAW,QAAO,QAAQ;AAC1C,SAAO,cAAc,SAAS,SAAS,YAAY,CAAC,GAAG;AAC3D;AAOA,SAAS,WAAWC,OAAc,SAA0C;AACxE,MAAIA,MAAK,WAAW,EAAG,QAAO;AAC9B,QAAM,QAAqB,EAAE,SAAS,OAAO,UAAU,OAAO,SAAS,OAAO,UAAU,MAAM;AAC9F,QAAM,mBAAmB,QAAQ,KAAK;AACtC,QAAM,iBAAiB,QAAQ,KAAK;AACpC,MAAI,IAAI;AACR,MAAI,WAAW;AACf,MAAI,gBAAgB;AACpB,MAAIA,MAAK,OAAO,CAAC,MAAM,OAAOA,MAAK,OAAO,CAAC,MAAM,KAAK;AAClD,eAAWA,MAAK,OAAO,CAAC,MAAM;AAC9B;AAAA,EACJ,WAAWA,MAAK,OAAO,CAAC,MAAM,KAAK;AAC/B,oBAAgB;AAChB,eAAW;AACX;AAAA,EACJ;AAEA,MAAI,UAAU;AACd,MAAI,WAAW;AACf,SAAO,IAAIA,MAAK,QAAQ;AACpB,QAAI,aAAaA,MAAK,WAAW,CAAC,CAAC,GAAG;AAClC,iBAAWA,MAAK,OAAO,CAAC;AACxB,UAAI,YAAY,EAAG;AACnB;AACA;AAAA,IACJ;AACA,UAAM,kBAAkB,iBAAiBA,OAAM,GAAG,cAAc;AAChE,QAAI,kBAAkB,KAAK,QAAQ,SAAS,MAAM,aAAa,KAAK,QAAQ,UAAU,IAAI,aAAa,IAAI;AACvG,iBAAW;AACX,WAAK;AACL;AAAA,IACJ;AACA;AAAA,EACJ;AACA,MAAI,YAAY,KAAK,aAAa,EAAG,QAAO;AAC5C,MAAI,YAAY,EAAG,OAAM,UAAU;AAEnC,MAAI,WAAW;AACf,MAAIA,MAAK,WAAW,kBAAkB,CAAC,GAAG;AACtC,SAAK,iBAAiB;AACtB,UAAM,WAAW;AACjB,WAAO,IAAIA,MAAK,UAAU,aAAaA,MAAK,WAAW,CAAC,CAAC,EAAG,aAAYA,MAAK,OAAO,GAAG;AAAA,EAC3F;AACA,MAAI,QAAQ,WAAW,KAAK,SAAS,WAAW,EAAG,QAAO;AAE1D,MAAI,WAAW;AACf,MAAI,IAAIA,MAAK,WAAWA,MAAK,OAAO,CAAC,MAAM,OAAOA,MAAK,OAAO,CAAC,MAAM,MAAM;AACvE,QAAI,IAAI,IAAI;AACZ,QAAI,mBAAmB;AACvB,QAAI,IAAIA,MAAK,WAAWA,MAAK,OAAO,CAAC,MAAM,OAAOA,MAAK,OAAO,CAAC,MAAM,MAAM;AACvE,yBAAmBA,MAAK,OAAO,CAAC,MAAM;AACtC;AAAA,IACJ;AACA,UAAM,QAAQ;AACd,WAAO,IAAIA,MAAK,UAAU,aAAaA,MAAK,WAAW,CAAC,CAAC,EAAG;AAC5D,QAAI,MAAM,SAAS,IAAI,QAAQ,EAAG,QAAO;AACzC,eAAW,OAAOA,MAAK,MAAM,OAAO,CAAC,CAAC;AACtC,QAAI,iBAAkB,YAAW,CAAC;AAClC,UAAM,WAAW;AACjB,QAAI;AAAA,EACR;AACA,MAAI,IAAIA,MAAK,UAAUA,MAAK,OAAO,CAAC,MAAM,KAAK;AAC3C,UAAM,UAAU;AAChB;AAAA,EACJ;AACA,MAAI,eAAe;AACf,QAAI,KAAKA,MAAK,UAAUA,MAAK,OAAO,CAAC,MAAM,IAAK,QAAO;AACvD;AAAA,EACJ;AACA,MAAI,MAAMA,MAAK,OAAQ,QAAO;AAG9B,QAAM,OAAO,mBAAmB,UAAU,QAAQ;AAClD,QAAM,UAAU,GAAG,KAAK,MAAM,GAAG,QAAQ,MAAM,CAAC,GAAG,SAAS,SAAS,IAAI,IAAI,KAAK,MAAM,QAAQ,MAAM,CAAC,KAAK,EAAE,IAAI,OAAO,QAAQ,CAAC;AAClI,MAAID,UAAS,OAAO,OAAO;AAC3B,MAAI,CAAC,OAAO,SAASA,OAAM,EAAG,QAAO;AACrC,MAAI,MAAM,QAAS,CAAAA,WAAU;AAC7B,MAAI,SAAU,CAAAA,UAAS,CAACA;AACxB,SAAO,OAAO,SAASA,OAAM,IAAI,EAAE,QAAAA,SAAQ,MAAM,IAAI;AACzD;AAGA,SAAS,mBAAmB,QAAwB;AAChD,MAAIG,eAAc;AAClB,MAAI,OAAO;AACX,aAAWC,UAAS,QAAQ;AACxB,QAAID,iBAAgB,KAAKC,WAAU,KAAK;AACpC,cAAQA;AACR;AAAA,IACJ;AACA,YAAQ,EAAED,eAAc,KAAK,MAAMC;AAAA,EACvC;AACA,SAAO;AACX;AAOO,SAAS,mBAAmB,WAA2B;AAC1D,MAAID,eAAc;AAClB,MAAI,OAAO;AACX,MAAI,IAAI;AACR,SAAO,IAAI,UAAU,QAAQ,KAAK;AAC9B,UAAM,IAAI,UAAU,OAAO,CAAC;AAC5B,QAAI,MAAM,OAAO,MAAM,IAAK;AAC5B,QAAI,CAAC,aAAa,UAAU,WAAW,CAAC,CAAC,KAAMA,iBAAgB,KAAK,MAAM,KAAM;AAC5E,cAAQ;AACR;AAAA,IACJ;AACA,YAAQ,EAAEA,eAAc,KAAK,MAAM;AAAA,EACvC;AACA,QAAMH,UAAS,OAAO,OAAO,UAAU,MAAM,CAAC,CAAC;AAC/C,MAAI,OAAO,MAAMA,OAAM,EAAG,OAAM,IAAI,MAAM,cAAc,SAAS,4BAA4B;AAC7F,SAAOA;AACX;AAGA,SAAS,iBAAiBC,OAAc,IAAY,WAA2B;AAC3E,MAAIA,MAAK,WAAW,WAAW,EAAE,EAAG,QAAO,UAAU;AACrD,QAAM,YAAY,UAAU,WAAW,KAAK,aAAa,UAAU,WAAW,CAAC,CAAC;AAChF,QAAM,IAAIA,MAAK,OAAO,EAAE;AACxB,SAAO,cAAc,MAAM,OAAO,MAAM,UAAO,MAAM,YAAO,IAAI;AACpE;AAMA,IAAM,4BAA4B;AAGlC,IAAM,cAAc;AAEpB,IAAM,cAAc;AACpB,IAAM,mBAAmB;AAclB,SAAS,cAAcA,OAAc,SAAkB,MAA0C;AACpG,MAAII,YAAWJ;AACf,MAAIK;AACJ,QAAMC,SAAQN,MAAK,QAAQ,GAAG;AAC9B,MAAIM,SAAQ,KAAK,YAAY,KAAK,WAAWN,MAAK,MAAMM,SAAQ,CAAC,CAAC,CAAC,GAAG;AAClE,IAAAF,YAAWJ,MAAK,MAAM,GAAGM,MAAK;AAC9B,IAAAD,YAAW,WAAWL,MAAK,MAAMM,SAAQ,CAAC,CAAC;AAAA,EAC/C;AAEA,MAAID,cAAa,QAAW;AACxB,UAAM,WAAW,UAAUL,KAAI;AAC/B,QAAI,aAAa,OAAW,QAAO,EAAE,QAAQ,SAAS,UAAU,QAAQ,aAAa,MAAM,SAAS,MAAM,EAAE;AAC5G,UAAM,QAAQ,eAAeI,WAAU,SAAS,IAAI;AACpD,QAAI,UAAU,OAAW,QAAO;AAAA,EACpC;AAEA,QAAM,QAAQ,YAAY,KAAKA,SAAQ;AACvC,MAAI,UAAU,KAAM,QAAO;AAC3B,QAAM,SAASG,SAAQ,MAAM,MAAM;AACnC,QAAM,YAAYC,OAAM,QAAQ,IAAI;AACpC,MAAI,cAAc,OAAO,QAAQ,KAAK,kBAAkB,IAAK,QAAO;AAEpE,QAAM,IAAIA,OAAM,QAAQ,GAAG;AAC3B,QAAM,IAAIA,OAAM,QAAQ,GAAG;AAC3B,QAAM,IAAI,OAAO,GAAG;AACpB,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,QAAM,QAAQ,SAAS,OAAO;AAC9B,MAAI,EAAE,UAAU,KAAK,UAAU,OAAO;AAClC,QAAI,MAAM,OAAW,QAAO;AAC5B,QAAI,OAAO,CAAC;AACZ,YAAQ,OAAO,CAAC;AAChB,UAAM,OAAO,CAAC;AAAA,EAClB,WAAW,UAAU,OAAO;AACxB,UAAM,OAAO,CAAC;AACd,YAAQ,OAAO,CAAC;AAChB,QAAI,MAAM,SAAY,OAAO,OAAO,CAAC;AAAA,EACzC,OAAO;AACH,YAAQ,OAAO,CAAC;AAChB,UAAM,OAAO,CAAC;AACd,QAAI,MAAM,SAAY,OAAO,OAAO,CAAC;AAAA,EACzC;AACA,QAAMC,SAAQ,eAAe,GAAG,OAAO,GAAG;AAC1C,MAAIA,WAAU,OAAW,QAAO;AAEhC,MAAI,WAAW;AACf,MAAIJ,cAAa,QAAW;AACxB,UAAMK,QAAO,UAAUL,SAAQ;AAC/B,QAAIK,UAAS,OAAW,QAAO;AAC/B,eAAWA,MAAK;AAAA,EACpB;AAGA,QAAM,SAASL,cAAa,SAAY,aAAa,gBAAgB,MAAM,SAAY,aAAa,MAAM,OAAO,IAAI,aAAa;AAClI,SAAO,EAAE,QAAQI,SAAQ,UAAU,OAAO;AAC9C;AAEA,SAAS,OAAO,QAAwB;AACpC,QAAM,QAAQ,OAAO,MAAM;AAC3B,MAAI,OAAO,SAAS,EAAG,QAAO;AAC9B,SAAO,QAAQ,4BAA4B,MAAO,QAAQ,OAAO;AACrE;AAOA,SAAS,eAAeT,OAAc,SAAkB,kBAAsD;AAC1G,QAAM,QAAQ,iBAAiB,KAAKA,KAAI;AACxC,MAAI,UAAU,KAAM,QAAO;AAC3B,QAAM,SAASO,SAAQ,MAAM,MAAM;AACnC,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,QAAM,KAAK,OAAO,IAAI;AACtB,MAAI,OAAO,QAAW;AAClB,YAAQ,WAAWC,OAAM,QAAQ,IAAI,GAAG,OAAO;AAC/C,UAAM,OAAO,EAAE;AACf,UAAM,IAAI,OAAO,IAAI;AACrB,WAAO,MAAM,SAAY,OAAO,CAAC,IAAI;AACrC,WAAO,MAAM,SAAY,aAAa;AAAA,EAC1C,OAAO;AACH,YAAQ,WAAWA,OAAM,QAAQ,IAAI,GAAG,OAAO;AAC/C,UAAMT,UAASS,OAAM,QAAQ,IAAI;AACjC,UAAM,QAAQ,OAAOT,OAAM;AAC3B,QAAIA,QAAO,UAAU,KAAK,SAAS,KAAK,SAAS,IAAI;AACjD,YAAM;AACN,aAAO;AACP,aAAO;AAAA,IACX,OAAO;AACH,YAAM;AACN,aAAO,OAAOA,OAAM;AACpB,aAAO;AAAA,IACX;AAAA,EACJ;AACA,MAAI,UAAU,OAAW,QAAO;AAChC,QAAMU,SAAQ,eAAe,MAAM,OAAO,GAAG;AAC7C,MAAIA,WAAU,OAAW,QAAO;AAChC,SAAO,EAAE,QAAQA,QAAO,QAAQ,aAAa,MAAM,IAAI,EAAE;AAC7D;AAGA,SAAS,WAAW,MAAc,SAAsC;AACpE,QAAM,SAAS,YAAY,MAAM,GAAG;AACpC,QAAM,cAAc,wBAAwB,OAAO;AACnD,WAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AACzB,QAAI,iBAAiB,QAAQ,YAAY,UAAU,aAAa,CAAC,GAAG,GAAG,CAAC,KAAK,iBAAiB,QAAQ,UAAU,QAAQ,KAAK,YAAY,CAAC,CAAC,GAAG;AAC1I,aAAO,IAAI;AAAA,IACf;AAAA,EACJ;AACA,SAAO;AACX;AAEA,SAAS,UAAUT,OAAgE;AAC/E,QAAM,QAAQ,YAAY,KAAKA,KAAI;AACnC,MAAI,UAAU,KAAM,QAAO;AAC3B,QAAM,SAASO,SAAQ,MAAM,MAAM;AACnC,MAAI,OAAO,OAAOC,OAAM,QAAQ,GAAG,CAAC;AACpC,QAAM,SAAS,OAAOA,OAAM,QAAQ,GAAG,CAAC;AACxC,QAAM,IAAI,OAAO,GAAG;AACpB,QAAM,SAAS,MAAM,SAAY,IAAI,OAAO,CAAC;AAC7C,MAAI,SAAS,MAAM,SAAS,GAAI,QAAO;AACvC,QAAM,WAAW,OAAO,MAAM;AAC9B,QAAM,OAAO,aAAa,SAAY,KAAK,OAAO,aAAa,eAAe,SAAS,WAAW,CAAC,CAAC,CAAC;AACrG,MAAI,SAAS,IAAI;AACb,QAAI,OAAO,KAAK,OAAO,GAAI,QAAO;AAClC,YAAQ;AACR,QAAI,SAAS,IAAK,SAAQ;AAAA,EAC9B,WAAW,OAAO,IAAI;AAClB,WAAO;AAAA,EACX;AACA,SAAO;AAAA,IACH,WAAW,OAAO,OAAO,SAAS,KAAK,UAAU;AAAA,IACjD,SAAS,MAAM,SAAY,YAAY,WAAW,SAAS,KAAK,WAAW;AAAA,EAC/E;AACJ;AAEA,SAASD,SAAQ,QAA4F;AACzG,MAAI,WAAW,OAAW,OAAM,IAAI,MAAM,6DAA6D;AACvG,SAAO;AACX;AAEA,SAASC,OAAM,QAA4C,MAAsB;AAC7E,QAAM,QAAQ,OAAO,IAAI;AACzB,MAAI,UAAU,OAAW,OAAM,IAAI,MAAM,wBAAwB,IAAI,4BAA4B;AACjG,SAAO;AACX;;;AC1ZO,IAAM,OAAN,MAAM,MAAK;AAAA,EACL;AAAA,EACA;AAAA,EAET,YAAY,MAAc,MAAM,GAAG;AAC/B,SAAK,OAAO;AACZ,SAAK,MAAM;AAAA,EACf;AAAA;AAAA,EAGA,OAAO,IAAI,GAAW,GAAiB;AACnC,UAAMG,OAAM,IAAI;AAChB,UAAM,KAAKA,OAAM;AACjB,WAAO,IAAI,MAAKA,MAAM,KAAKA,OAAM,OAAQ,IAAI,GAAG;AAAA,EACpD;AAAA;AAAA,EAGA,OAAO,SAAS,GAAW,GAAiB;AACxC,UAAMA,OAAM,IAAI;AAChB,WAAO,IAAI,MAAKA,MAAK,KAAKA,OAAM,EAAE;AAAA,EACtC;AAAA;AAAA,EAGA,OAAO,QAAQ,GAAW,GAAiB;AACvC,WAAO,IAAI,MAAK,IAAI,GAAG,aAAa,GAAG,CAAC,CAAC;AAAA,EAC7C;AAAA,EAEA,SAAe;AACX,WAAO,IAAI,MAAK,CAAC,KAAK,MAAM,CAAC,KAAK,GAAG;AAAA,EACzC;AAAA,EAEA,KAAK,OAA4B;AAC7B,UAAM,IAAI,OAAO,UAAU,WAAW,IAAI,MAAK,KAAK,IAAI;AACxD,UAAM,OAAO,MAAK,IAAI,KAAK,MAAM,EAAE,IAAI;AACvC,UAAM,MAAM,MAAK,IAAI,KAAK,KAAK,EAAE,GAAG;AACpC,UAAMA,OAAM,MAAK,SAAS,KAAK,MAAM,KAAK,MAAM,IAAI,IAAI;AACxD,WAAO,MAAK,SAASA,KAAI,MAAMA,KAAI,MAAM,IAAI,GAAG;AAAA,EACpD;AAAA,EAEA,MAAM,OAA4B;AAC9B,UAAM,IAAI,OAAO,UAAU,WAAW,IAAI,MAAK,KAAK,IAAI;AACxD,WAAO,KAAK,KAAK,EAAE,OAAO,CAAC;AAAA,EAC/B;AAAA,EAEA,MAAM,OAA4B;AAC9B,UAAM,IAAI,OAAO,UAAU,WAAW,IAAI,MAAK,KAAK,IAAI;AACxD,UAAMC,WAAU,MAAK,QAAQ,KAAK,MAAM,EAAE,IAAI;AAC9C,WAAO,MAAK,SAASA,SAAQ,MAAMA,SAAQ,OAAQ,KAAK,OAAO,EAAE,MAAQ,KAAK,MAAM,EAAE,KAAM;AAAA,EAChG;AAAA,EAEA,UAAU,OAA4B;AAClC,UAAM,IAAI,OAAO,UAAU,WAAW,IAAI,MAAK,KAAK,IAAI;AACxD,UAAM,QAAQ,KAAK,OAAO,EAAE;AAC5B,QAAI,OAAO,KAAK,MAAM,EAAE,MAAM,KAAK,CAAC;AACpC,UAAM,SAAS,KAAK,OAAO,EAAE;AAC7B,WAAO,KAAK,MAAM,EAAE,MAAM,MAAM,CAAC;AACjC,UAAM,QAAQ,KAAK,OAAO,EAAE;AAC5B,WAAO,MAAK,SAAS,OAAO,MAAM,EAAE,KAAK,KAAK;AAAA,EAClD;AACJ;;;AC3DO,SAAS,UAAU,OAAuB;AAC7C,MAAI,QAAQ,GAAI,OAAM,IAAI,MAAM,yDAAyD;AACzF,MAAI,UAAU,GAAI,QAAO;AACzB,QAAMC,OAAM,MAAM,SAAS,EAAE;AAC7B,UAAQA,KAAI,SAAS,KAAK,IAAI,OAAO,SAASA,KAAI,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,CAAC,EAAE;AACjF;AAGA,IAAM,QAAQ,KAAK;AACnB,IAAM,aAAa,KAAK;AACxB,IAAM,YAAY;AAClB,IAAM,QAAQ,KAAK,KAAK,CAAC;AAGzB,IAAM,QAAQ;AACd,IAAM,WAAW,MAAM,OAAO,KAAK;AAcnC,IAAI;AAGJ,SAAS,cAAyB;AAC9B,MAAI,cAAc,OAAW,QAAO;AACpC,QAAM,WAAW,OAAO,IAAI,EAAE;AAC9B,QAAM,OAAO,YAAY,OAAO,QAAQ,EAAE;AAC1C,QAAM,UAAU,OAAO,OAAO,IAAI,GAAG,GAAG;AACxC,MAAI,OAAO,YAAY,QAAQ,OAAO,QAAQ,EAAE;AAChD,QAAM,SAAS,cAAc,MAAM,CAAC,KAAK;AACzC,UAAQ,QAAQ,QAAQ,KAAK;AAC7B,QAAM,YAAY,cAAc,MAAM,CAAC,KAAK;AAE5C,QAAM,oBAAoB,YAAY,OAAO,KAAK,MAAM,KAAK,WAAW,OAAO,IAAI,EAAE;AACrF,QAAM,cAAc,cAAc,kBAAkB,CAAC,KAAK;AAC1D,QAAM,cAAc,IAAI,KAAK,aAAa,cAAc,mBAAmB,QAAQ,aAAa,KAAK,GAAG,CAAC,KAAK,CAAC;AAC/G,QAAM,oBAA4B,CAAC;AACnC,WAAS,IAAI,GAAG,IAAI,IAAI,IAAK,mBAAkB,KAAK,IAAI,KAAK,CAAC,EAAE,UAAU,IAAI,IAAI,CAAC,CAAC;AACpF,cAAY,EAAE,UAAU,SAAS,QAAQ,WAAW,aAAa,kBAAkB;AACnF,SAAO;AACX;AAGO,SAAS,IAAI,GAAmB;AACnC,MAAI,OAAO,MAAM,CAAC,EAAG,QAAO;AAC5B,MAAI,MAAM,EAAG,QAAO;AACpB,MAAI,KAAK,IAAI,CAAC,IAAI,IAAK,QAAO,SAAS,CAAC;AACxC,QAAM,EAAE,SAAS,QAAQ,UAAU,IAAI,YAAY;AACnD,QAAM,IAAI,gBAAgB,IAAI,UAAU;AAExC,QAAMC,WAAU,IAAI,KAAK,IAAI,IAAI,OAAO,EAAE,MAAM,KAAK,QAAQ,GAAG,MAAM,CAAC,EAAE,MAAM,IAAI,KAAK,IAAI,SAAS,CAAC;AAEtG,QAAM,IAAIA,SAAQ,MAAM,IAAI,EAAE;AAC9B,MAAIC,SAAQ,IAAI,KAAK,CAAC;AACtB,WAAS,IAAI,IAAI,KAAK,GAAG,IAAK,CAAAA,SAAQ,IAAI,KAAK,CAAC,EAAE,KAAK,EAAE,MAAMA,MAAK,EAAE,UAAU,CAAC,CAAC;AAClF,WAAS,IAAI,GAAG,IAAI,GAAG,IAAK,CAAAA,SAAQA,OAAM,MAAMA,MAAK;AACrD,QAAMC,WAAU,UAAUD,MAAK;AAC/B,SAAOC,aAAY,SAAY,SAAS,CAAC,IAAI,OAAOA,UAAS,CAAC;AAClE;AAGO,SAAS,IAAI,GAAmB;AACnC,MAAI,OAAO,MAAM,CAAC,KAAK,IAAI,EAAG,QAAO;AACrC,MAAI,MAAM,EAAG,QAAO;AACpB,MAAI,MAAM,SAAU,QAAO;AAC3B,MAAI,MAAM,EAAG,QAAO;AACpB,MAAI,IAAI,UAAW,QAAO,SAAS,CAAC;AACpC,QAAMA,WAAU,UAAU,QAAQ,CAAC,CAAC;AACpC,SAAOA,aAAY,SAAY,SAAS,CAAC,IAAIA;AACjD;AAMO,SAAS,SAAS,GAA+B;AACpD,MAAI,MAAM,EAAG,QAAO;AACpB,MAAI,EAAE,KAAK,cAAc,CAAC,OAAO,SAAS,CAAC,EAAG,QAAO;AACrD,SAAO,UAAU,QAAQ,CAAC,EAAE,MAAM,YAAY,EAAE,WAAW,CAAC;AAChE;AAGA,SAAS,QAAQ,GAAiB;AAC9B,QAAM,EAAE,SAAS,QAAQ,WAAW,kBAAkB,IAAI,YAAY;AAEtE,QAAM,OAAO,WAAW,CAAC;AACzB,MAAI,IAAI,OAAQ,QAAQ,MAAO,MAAM,IAAI;AACzC,MAAI,IAAI,WAAY,OAAO,mBAAoB,mBAAmB;AAClE,MAAI,IAAI,OAAO;AACX,SAAK;AACL;AAAA,EACJ;AACA,QAAM,IAAI,IAAI,KAAK,IAAI,CAAC,EAAE,UAAU,KAAK,IAAI,GAAG,CAAC,CAAC;AAClD,QAAM,IAAI,EAAE,MAAM,CAAC;AACnB,MAAIC,UAAS,kBAAkB,kBAAkB,SAAS,CAAC;AAC3D,WAAS,IAAI,kBAAkB,SAAS,GAAG,KAAK,GAAG,IAAK,CAAAA,UAAU,kBAAkB,CAAC,EAAW,KAAK,EAAE,MAAMA,OAAM,CAAC;AACpH,SAAO,EAAE,MAAMA,OAAM,EAAE,KAAK,IAAI,KAAK,IAAI,OAAO,CAAC,EAAE,KAAK,KAAK,QAAQ,GAAG,MAAM,CAAC,EAAE,KAAK,IAAI,KAAK,IAAI,SAAS,CAAC;AACjH;AAGA,SAAS,UAAU,OAAiC;AAChD,QAAM,YAAY,MAAM,OAAO,IAAI,aAAa,MAAM,IAAI,IAAI,aAAa,MAAM,IAAI;AACrF,QAAM,UAAU,KAAK,IAAI,YAAY,MAAM,IAAI,IAAI;AACnD,QAAMC,SAAQ,QAAQ,KAAK,IAAI,MAAM,IAAI;AACzC,SAAO,KAAK,IAAI,MAAM,GAAG,IAAIA,SAAQ,WAAWA,SAAQ,UAAU,IAAI,MAAM,OAAO;AACvF;AAGO,SAAS,SAAS,GAAmB;AACxC,MAAI,OAAO,MAAM,CAAC,EAAG,QAAO;AAC5B,MAAI,MAAM,YAAY,IAAI,IAAK,QAAO;AACtC,MAAI,MAAM,aAAa,IAAI,KAAM,QAAO;AACxC,MAAI,KAAK,IAAI,CAAC,IAAI,KAAK,IAAK,QAAO;AACnC,QAAM,EAAE,SAAS,IAAI,YAAY;AACjC,QAAM,IAAI,QAAQ,GAAG,KAAK;AAC1B,QAAM,IAAI,gBAAgB,IAAI,KAAK,GAAG;AACtC,QAAM,IAAI,IAAI,OAAO,CAAC,IAAI;AAC1B,MAAIC,OAAM;AACV,MAAI,OAAO;AACX,WAAS,IAAI,IAAI,SAAS,IAAI,KAAK;AAC/B,IAAAA,QAAO;AACP,WAAQ,OAAO,KAAM,WAAW;AAAA,EACpC;AACA,SAAO,cAAcA,MAAK,IAAI,KAAK;AACvC;AAGO,SAAS,SAAS,GAAmB;AACxC,MAAI,OAAO,MAAM,CAAC,KAAK,IAAI,EAAG,QAAO;AACrC,MAAI,MAAM,EAAG,QAAO;AACpB,MAAI,MAAM,SAAU,QAAO;AAC3B,QAAM,EAAE,SAAS,IAAI,YAAY;AACjC,QAAM,EAAE,aAAa,SAAS,IAAI,UAAU,CAAC;AAC7C,QAAM,SAAS,UAAU,WAAW;AACpC,QAAM,IAAI,WAAW,SAAS;AAC9B,QAAM,MAAM,MAAM,OAAO,SAAS,CAAC;AACnC,SAAO,cAAc,OAAO,CAAC,IAAI,WAAW,OAAO,cAAc,KAAK,cAAc,GAAG,GAAG,CAAC,KAAK;AACpG;AAGA,SAAS,OAAO,GAAW,GAAmB;AAC1C,QAAM,KAAK,KAAK,OAAO,KAAK,KAAK;AACjC,QAAM,KAAM,IAAI,IAAK;AACrB,MAAI,OAAO;AACX,MAAIA,OAAM;AACV,WAAS,IAAI,IAAI,SAAS,IAAI,KAAK,IAAI;AACnC,IAAAA,QAAO,OAAO;AACd,WAAQ,OAAO,KAAM;AAAA,EACzB;AACA,SAAO,KAAKA;AAChB;AAGO,SAAS,UAAU,GAAsD;AAC5E,QAAM,OAAO,WAAW,KAAK,IAAI,CAAC,CAAC;AACnC,QAAM,SAAS,OAAQ,QAAQ,MAAO,MAAM;AAC5C,QAAM,WAAW,OAAO;AACxB,SAAO,WAAW,IAAI,EAAE,aAAa,UAAU,UAAU,MAAM,IAAI,EAAE,aAAa,WAAY,MAAM,KAAM,UAAU,SAAS,KAAK;AACtI;AAGA,SAAS,QAAQ,GAAW,OAAuB;AAC/C,QAAM,EAAE,aAAa,SAAS,IAAI,UAAU,CAAC;AAC7C,QAAM,SAAS,WAAW,SAAS,IAAI,eAAe,OAAO,WAAW,KAAK,IAAI,eAAe,OAAO,EAAE,WAAW,MAAM;AAC1H,SAAO,IAAI,IAAI,CAAC,SAAS;AAC7B;AAGO,SAAS,cAAc,GAAW,GAAmB;AACxD,MAAI,MAAM,GAAI,QAAO;AACrB,QAAM,WAAW,IAAI;AACrB,QAAM,IAAI,WAAW,CAAC,IAAI;AAC1B,QAAM,SAAS,UAAU,CAAC;AAC1B,QAAM,MAAM,IAAI,SAAS;AACzB,MAAI,MAAM,KAAM,QAAO,WAAW,YAAY;AAC9C,QAAM,YAAY,OAAO,QAAQ,KAAK,MAAM,QAAQ;AACpD,QAAM,QAAQ,SAAS;AACvB,MAAI;AACJ,MAAI,SAAS,EAAG,QAAO;AAAA,OAClB;AACD,WAAO,KAAK,OAAO,KAAK;AACxB,UAAM,OAAO,KAAK,QAAQ,OAAO,KAAK;AACtC,UAAMC,QAAO,MAAM,OAAO,QAAQ,CAAC;AACnC,QAAI,OAAOA,SAAS,SAASA,UAAS,OAAO,QAAQ,GAAK,SAAQ;AAAA,EACtE;AACA,QAAM,SAAS,OAAO,OAAO,IAAI,GAAG,IAAI,KAAK,IAAI,OAAO,CAAC,CAAC;AAC1D,SAAO,WAAW,CAAC,SAAS;AAChC;;;ACtMO,IAAM,UAAN,MAAM,SAAQ;AAAA,EACR;AAAA,EACA;AAAA,EAET,YAAY,GAAW,GAAW;AAC9B,SAAK,IAAI;AACT,SAAK,IAAI;AAAA,EACb;AAAA,EAEA,OAAgB,OAAO,IAAI,SAAQ,IAAI,CAAC;AAAA,EACxC,OAAgB,MAAM,IAAI,SAAQ,IAAI,CAAC;AAAA;AAAA,EAGvC,OAAO,GAAG,GAAoB;AAC1B,QAAI,CAAC,OAAO,SAAS,CAAC,EAAG,OAAM,IAAI,WAAW,GAAG,OAAO,CAAC,CAAC,uBAAuB;AACjF,QAAI,MAAM,EAAG,QAAO,SAAQ;AAC5B,UAAM,EAAE,aAAa,SAAS,IAAI,UAAU,CAAC;AAC7C,WAAO,IAAI,SAAQ,IAAI,IAAI,CAAC,cAAc,aAAa,QAAQ;AAAA,EACnE;AAAA;AAAA,EAGA,OAAO,MAAM,GAA6B;AACtC,WAAO,IAAI,SAAQ,OAAO,CAAC,GAAG,CAAC;AAAA,EACnC;AAAA,EAEA,IAAI,OAAe;AACf,WAAO,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,KAAK;AAAA,EAChD;AAAA;AAAA,EAGA,IAAI,MAAc;AACd,WAAO,KAAK,MAAM,KAAK,YAAY,KAAK,IAAI,UAAU,KAAK,IAAI,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI;AAAA,EAC5F;AAAA;AAAA,EAGA,WAAmB;AACf,WAAO,cAAc,KAAK,GAAG,KAAK,CAAC;AAAA,EACvC;AAAA,EAEA,UAAmB;AACf,WAAO,IAAI,SAAQ,CAAC,KAAK,GAAG,KAAK,CAAC;AAAA,EACtC;AAAA,EAEA,MAAe;AACX,WAAO,KAAK,IAAI,KAAK,KAAK,QAAQ,IAAI;AAAA,EAC1C;AAAA;AAAA,EAGA,OAAO,GAAoB;AACvB,WAAO,IAAI,SAAQ,KAAK,GAAG,KAAK,IAAI,CAAC;AAAA,EACzC;AAAA,EAEA,KAAK,OAAyB;AAC1B,QAAI,KAAK,MAAM,GAAI,QAAO;AAC1B,QAAI,MAAM,MAAM,GAAI,QAAO;AAC3B,UAAM,IAAI,KAAK,IAAI,KAAK,GAAG,MAAM,CAAC;AAClC,WAAO,IAAI,UAAS,KAAK,KAAK,OAAO,KAAK,IAAI,CAAC,MAAM,MAAM,KAAK,OAAO,MAAM,IAAI,CAAC,IAAI,CAAC;AAAA,EAC3F;AAAA,EAEA,MAAM,OAAyB;AAC3B,WAAO,KAAK,KAAK,MAAM,QAAQ,CAAC;AAAA,EACpC;AAAA;AAAA,EAGA,KAAK,WAA4B;AAC7B,UAAM,YAAY,KAAK,IAAI,KAAK,CAAC,KAAK,IAAI,KAAK;AAC/C,UAAM,SAAS,UAAU,SAAS,IAAI;AACtC,QAAI,UAAU,EAAG,QAAO;AACxB,UAAM,UAAU,aAAa,OAAO,MAAM;AAC1C,WAAO,IAAI,SAAQ,KAAK,IAAI,KAAK,CAAC,UAAU,SAAS,KAAK,IAAI,MAAM;AAAA,EACxE;AAAA,EAEA,MAAM,OAAgB,WAA4B;AAC9C,WAAO,IAAI,SAAQ,KAAK,IAAI,MAAM,GAAG,KAAK,IAAI,MAAM,CAAC,EAAE,KAAK,SAAS;AAAA,EACzE;AAAA,EAEA,UAAU,OAAgB,WAA4B;AAClD,QAAI,MAAM,MAAM,GAAI,OAAM,IAAI,WAAW,sCAAsC;AAC/E,QAAI,KAAK,MAAM,GAAI,QAAO,SAAQ;AAClC,UAAM,IAAI,KAAK,IAAI,KAAK,CAAC,KAAK,IAAI,KAAK;AACvC,UAAM,IAAI,MAAM,IAAI,KAAK,CAAC,MAAM,IAAI,MAAM;AAC1C,UAAM,QAAQ,KAAK,IAAI,GAAG,YAAY,UAAU,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC;AACrE,UAAM,KAAK,KAAK,OAAO,KAAK,KAAK;AACjC,UAAM,WAAY,KAAK,IAAI,OAAS,MAAM,IAAI;AAC9C,WAAO,IAAI,SAAQ,WAAW,CAAC,IAAI,GAAG,KAAK,IAAI,MAAM,IAAI,KAAK,EAAE,KAAK,SAAS;AAAA,EAClF;AAAA;AAAA,EAGA,KAAK,WAA4B;AAC7B,QAAI,KAAK,IAAI,GAAI,OAAM,IAAI,WAAW,2DAA2D;AACjG,QAAI,KAAK,MAAM,GAAI,QAAO,SAAQ;AAClC,QAAI,QAAQ,KAAK,IAAI,GAAG,IAAI,YAAY,IAAI,UAAU,KAAK,CAAC,CAAC;AAC7D,SAAK,KAAK,IAAI,SAAS,MAAM,EAAG;AAChC,WAAO,IAAI,SAAQ,MAAM,KAAK,KAAK,OAAO,KAAK,CAAC,IAAI,KAAK,IAAI,SAAS,CAAC,EAAE,KAAK,SAAS;AAAA,EAC3F;AAAA,EAEA,QAAQ,OAAwB;AAC5B,UAAM,aAAa,KAAK,MAAM,KAAK;AACnC,WAAO,WAAW;AAAA,EACtB;AACJ;AAGA,SAAS,MAAM,GAAmB;AAC9B,MAAI,IAAI,MAAM,OAAO,KAAK,KAAK,UAAU,CAAC,IAAI,CAAC,CAAC;AAChD,aAAS;AACL,UAAM,IAAK,IAAI,IAAI,KAAM;AACzB,QAAI,KAAK,EAAG,QAAO;AACnB,QAAI;AAAA,EACR;AACJ;AAIA,IAAM,WAAW,oBAAI,IAAqB;AAC1C,IAAM,UAAU,oBAAI,IAAqB;AACzC,IAAM,YAAY,oBAAI,IAAqB;AAG3C,SAAS,YAAY,GAAY,GAAoB;AACjD,QAAM,KAAK,EAAE,MAAM,GAAG,CAAC;AACvB,MAAI,OAAO;AACX,MAAIC,OAAM,QAAQ;AAClB,WAAS,IAAI,IAAI,KAAK,MAAM,MAAM,KAAK,MAAM,EAAE,MAAM,IAAI,GAAG,KAAK,IAAI;AACjE,IAAAA,OAAMA,KAAI,KAAK,KAAK,UAAU,QAAQ,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC;AAC9D,WAAO,KAAK,MAAM,IAAI,CAAC;AAAA,EAC3B;AACA,SAAOA;AACX;AAGA,SAAS,WAAW,GAAY,GAAoB;AAChD,QAAM,KAAK,EAAE,MAAM,GAAG,CAAC,EAAE,QAAQ;AACjC,MAAI,OAAO;AACX,MAAIA,OAAM,QAAQ;AAClB,WAAS,IAAI,IAAI,KAAK,MAAM,MAAM,KAAK,MAAM,EAAE,MAAM,IAAI,GAAG,KAAK,IAAI;AACjE,IAAAA,OAAMA,KAAI,KAAK,KAAK,UAAU,QAAQ,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC;AAC9D,WAAO,KAAK,MAAM,IAAI,CAAC;AAAA,EAC3B;AACA,SAAOA;AACX;AAGO,SAAS,IAAI,GAAoB;AACpC,QAAMC,SAAQ,SAAS,IAAI,CAAC;AAC5B,MAAIA,WAAU,OAAW,QAAOA;AAChC,QAAM,QAAQ,YAAY,QAAQ,IAAI,UAAU,QAAQ,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE,OAAO,CAAC,EAAE,KAAK,CAAC;AACjG,WAAS,IAAI,GAAG,KAAK;AACrB,SAAO;AACX;AAGO,SAAS,GAAG,GAAoB;AACnC,QAAMA,SAAQ,QAAQ,IAAI,CAAC;AAC3B,MAAIA,WAAU,OAAW,QAAOA;AAChC,QAAM,IAAI,IAAI;AACd,QAAM,QAAQ,aAAa,QAAQ,IAAI,UAAU,QAAQ,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC;AACxE,QAAM,OAAO,WAAW,QAAQ,IAAI,UAAU,QAAQ,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC;AACvE,QAAM,QAAQ,MAAM,OAAO,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC;AAC1D,UAAQ,IAAI,GAAG,KAAK;AACpB,SAAO;AACX;AAGA,SAAS,aAAa,GAAY,GAAoB;AAClD,SAAO,WAAW,OAAO,GAAG,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC;AAC/C;AAGA,SAAS,OAAO,GAAY,GAAoB;AAC5C,SAAO,EAAE,UAAU,QAAQ,IAAI,KAAK,QAAQ,IAAI,KAAK,EAAE,MAAM,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC;AACnF;AAGO,SAAS,GAAG,GAAY,GAAoB;AAC/C,MAAI,EAAE,KAAK,GAAI,OAAM,IAAI,WAAW,4DAA4D;AAEhG,MAAI,IAAI,EAAE;AACV,MAAI,IAAI,EAAE,OAAO,CAAC,CAAC;AACnB,MAAI,EAAE,KAAK,EAAE,EAAE,SAAS,IAAI,KAAK,OAAO;AACpC;AACA,QAAI,EAAE,OAAO,EAAE;AAAA,EACnB;AACA,QAAM,IAAI,EAAE,MAAM,QAAQ,GAAG,EAAE,UAAU,EAAE,KAAK,QAAQ,GAAG,GAAG,IAAI,CAAC;AACnE,QAAM,YAAY,YAAY,GAAG,IAAI,CAAC,EAAE,OAAO,CAAC;AAChD,SAAO,MAAM,IAAI,UAAU,KAAK,CAAC,IAAI,UAAU,KAAK,IAAI,IAAI,EAAE,EAAE,MAAM,QAAQ,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC;AAC3G;AAGO,SAAS,KAAK,GAAY,GAAoB;AACjD,MAAI,EAAE,MAAM,GAAI,QAAO,QAAQ;AAC/B,MAAI,EAAE,MAAM,GAAI,QAAO,YAAY,EAAE,UAAU,EAAE,KAAK,QAAQ,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE,OAAO,CAAC,EAAE,KAAK,CAAC;AACxG,SAAO,GAAG,QAAQ,IAAI,KAAK,CAAC,GAAG,CAAC;AACpC;AAGA,SAAS,KAAK,GAAoB;AAC9B,QAAMA,SAAQ,UAAU,IAAI,CAAC;AAC7B,MAAIA,WAAU,OAAW,QAAOA;AAChC,QAAM,QAAQ,GAAG,QAAQ,MAAM,EAAE,GAAG,CAAC;AACrC,YAAU,IAAI,GAAG,KAAK;AACtB,SAAO;AACX;AAGO,SAAS,MAAM,GAAY,GAAoB;AAClD,SAAO,GAAG,GAAG,IAAI,CAAC,EAAE,UAAU,KAAK,IAAI,CAAC,GAAG,CAAC;AAChD;AAGO,SAASC,KAAI,GAAY,GAAoB;AAChD,MAAI,EAAE,MAAM,GAAI,QAAO,QAAQ;AAC/B,MAAI,EAAE,MAAM,GAAI,OAAM,IAAI,WAAW,gDAAgD;AACrF,QAAM,IAAI,IAAI;AACd,QAAM,IAAI,KAAK,MAAM,EAAE,KAAK,EAAE,EAAE,SAAS,IAAI,KAAK,GAAG;AACrD,QAAM,IAAI,MAAM,IAAI,IAAI,EAAE,MAAM,IAAI,IAAI,EAAE,EAAE,MAAM,QAAQ,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC;AAEnF,QAAM,IAAI,EAAE,OAAO,EAAE;AACrB,MAAI,OAAO,QAAQ;AACnB,MAAIF,OAAM,QAAQ;AAClB,WAAS,IAAI,IAAI,KAAK,MAAM,MAAM,KAAK,MAAM,CAAC,IAAI,GAAG,KAAK;AACtD,IAAAA,OAAMA,KAAI,KAAK,IAAI,EAAE,KAAK,IAAI,CAAC;AAC/B,WAAO,KAAK,MAAM,GAAG,CAAC,EAAE,UAAU,QAAQ,MAAM,CAAC,GAAG,CAAC;AAAA,EACzD;AACA,MAAIG,SAAQH;AACZ,WAAS,IAAI,GAAG,IAAI,GAAG,IAAK,CAAAG,SAAQA,OAAM,MAAMA,QAAO,CAAC;AACxD,SAAOA,OAAM,OAAO,CAAC,EAAE,KAAK,CAAC;AACjC;AAGO,SAAS,MAAM,GAAY,GAAoB;AAClD,MAAI,EAAE,MAAM,GAAI,QAAO,QAAQ;AAC/B,MAAI,EAAE,OAAO,EAAG,QAAOD,KAAI,GAAG,IAAI,CAAC,EAAE,MAAM,QAAQ,GAAG,EAAE,KAAK,CAAC;AAC9D,MAAI,OAAO;AACX,MAAIF,OAAM,QAAQ;AAClB,WAAS,IAAI,IAAI,KAAK,MAAM,MAAM,KAAK,MAAM,EAAE,MAAM,IAAI,GAAG,KAAK;AAC7D,IAAAA,OAAMA,KAAI,KAAK,IAAI,EAAE,KAAK,IAAI,CAAC;AAC/B,WAAO,KAAK,MAAM,GAAG,IAAI,CAAC,EAAE,UAAU,QAAQ,MAAM,CAAC,GAAG,IAAI,CAAC;AAAA,EACjE;AACA,SAAOA,KAAI,KAAK,CAAC;AACrB;AAGO,SAAS,KAAK,GAAY,GAAoB;AACjD,MAAI,EAAE,MAAM,GAAI,QAAO,QAAQ;AAC/B,QAAM,IAAI,IAAI;AACd,QAAM,IAAI,EAAE,IAAI;AAChB,MAAI;AACJ,MAAI,EAAE,QAAQ,QAAQ,GAAG,IAAI,GAAG;AAE5B,aAAS,GAAG,CAAC,EAAE,OAAO,EAAE,EAAE,MAAM,YAAY,QAAQ,IAAI,UAAU,GAAG,CAAC,GAAG,CAAC,CAAC;AAAA,EAC/E,OAAO;AACH,aAAS,YAAY,GAAG,CAAC;AAAA,EAC7B;AACA,UAAQ,EAAE,IAAI,KAAK,OAAO,QAAQ,IAAI,QAAQ,KAAK,CAAC;AACxD;AAGA,SAAS,YAAY,GAAY,GAAoB;AACjD,MAAI,IAAI;AACR,WAAS,IAAI,GAAG,IAAI,GAAG,IAAK,KAAI,OAAO,GAAG,CAAC;AAC3C,SAAO,WAAW,GAAG,CAAC,EAAE,OAAO,CAAC;AACpC;AAGO,SAAS,KAAK,GAAY,GAAoB;AACjD,MAAI,EAAE,MAAM,GAAG;AAEX,UAAM,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;AAC3B,QAAI,OAAO;AACX,QAAIA,OAAM,QAAQ;AAClB,aAAS,IAAI,IAAI,KAAK,MAAM,MAAM,KAAK,MAAM,EAAE,MAAM,IAAI,GAAG,KAAK,IAAI;AACjE,MAAAA,OAAMA,KAAI,KAAK,IAAI,EAAE,KAAK,IAAI,CAAC;AAC/B,aAAO,KAAK,MAAM,IAAI,IAAI,CAAC,EAAE,UAAU,QAAQ,MAAM,KAAK,IAAI,GAAG,GAAG,IAAI,CAAC;AAAA,IAC7E;AACA,WAAOA,KAAI,KAAK,CAAC;AAAA,EACrB;AACA,QAAM,KAAKE,KAAI,GAAG,IAAI,CAAC;AACvB,SAAO,GAAG,MAAM,QAAQ,IAAI,UAAU,IAAI,IAAI,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,KAAK,CAAC;AACvE;AAGO,SAAS,KAAK,GAAY,GAAoB;AACjD,QAAM,KAAKA,KAAI,GAAG,IAAI,CAAC;AACvB,SAAO,GAAG,KAAK,QAAQ,IAAI,UAAU,IAAI,IAAI,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,KAAK,CAAC;AACtE;AAGO,SAAS,KAAK,GAAY,GAAoB;AACjD,QAAM,IAAI,EAAE,IAAI;AAEhB,QAAM,KAAK,EAAE,MAAM,KAAK,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,IAAIA,KAAI,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,EAAE,MAAM,QAAQ,GAAG;AAC7F,QAAM,SAAS,GAAG,UAAU,GAAG,KAAK,QAAQ,MAAM,CAAC,CAAC,GAAG,CAAC;AACxD,SAAO,EAAE,IAAI,KAAK,OAAO,QAAQ,IAAI;AACzC;AAGO,SAAS,MAAM,GAAY,GAAoB;AAClD,QAAM,IAAI,EAAE,IAAI;AAChB,QAAM,IAAI,IAAI;AACd,QAAM,KAAK,EAAE,MAAM,GAAG,CAAC;AACvB,QAAM,OAAO,QAAQ,IAAI,KAAK,EAAE,EAAE,KAAK,CAAC;AACxC,QAAM,SAAS,EAAE,MAAM,IACjB,KAAK,EAAE,KAAK,GAAG,UAAU,QAAQ,IAAI,KAAK,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,IACvD,GAAG,EAAE,KAAK,IAAI,GAAG,CAAC;AACxB,SAAO,EAAE,IAAI,KAAK,OAAO,QAAQ,IAAI;AACzC;AAGO,SAAS,MAAM,GAAY,GAAoB;AAClD,QAAM,IAAI,EAAE,MAAM,QAAQ,GAAG;AAC7B,MAAI,EAAE,IAAI,GAAI,OAAM,IAAI,WAAW,gDAAgD;AACnF,QAAM,IAAI,IAAI;AACd,MAAI,EAAE,MAAM,EAAG,QAAO,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,QAAQ,MAAM,CAAC,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC;AAClF,SAAO,GAAG,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC,EAAE,MAAM,QAAQ,GAAG,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC;AACrE;AAGO,SAAS,MAAM,GAAY,GAAoB;AAClD,QAAM,IAAI,EAAE,IAAI;AAChB,QAAM,SAAS,KAAK,EAAE,OAAO,CAAC,EAAE,UAAU,QAAQ,IAAI,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE,OAAO,EAAE,EAAE,KAAK,CAAC;AAChG,SAAO,EAAE,IAAI,KAAK,OAAO,QAAQ,IAAI;AACzC;AAGO,SAAS,KAAK,GAAY,GAAoB;AACjD,QAAM,IAAI,IAAI;AACd,QAAM,SAAS,QAAQ,IAAI,MAAM,CAAC,EAAE,MAAM,QAAQ,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC;AACxE,SAAO,KAAK,EAAE,UAAU,QAAQ,CAAC,GAAG,CAAC;AACzC;AAGO,SAAS,KAAK,GAAY,GAAoB;AACjD,QAAM,IAAI,IAAI;AACd,SAAO,KAAK,QAAQ,IAAI,MAAM,CAAC,EAAE,UAAU,QAAQ,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,EAAE,KAAK,CAAC;AACnG;AAGO,SAAS,MAAM,GAAY,GAAY,GAAoB;AAC9D,QAAM,IAAI,IAAI;AACd,QAAME,SAAQ,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,GAAG,CAAC,GAAG,CAAC;AACnD,QAAM,SAAS,EAAE,IAAI,KAAK,GAAG,CAAC,EAAE,MAAMA,MAAK,IAAIA;AAC/C,UAAQ,EAAE,IAAI,KAAK,OAAO,QAAQ,IAAI,QAAQ,KAAK,CAAC;AACxD;;;ACnVA,IAAM,YAAY;AAGlB,SAAS,QAAQ,SAAiD;AAC9D,WAAS,YAAY,KAAK,aAAa,MAAM,aAAa,GAAG;AACzD,UAAM,QAAQ,QAAQ,SAAS;AAC/B,QAAI,MAAM,MAAM,GAAI,QAAO;AAC3B,UAAM,UAAU,MAAM,IAAI,KAAK,CAAC,MAAM,IAAI,MAAM,MAAM,OAAO,YAAY,SAAS,KAAK;AACvF,UAAM,MAAM,cAAc,MAAM,IAAI,OAAO,MAAM,CAAC;AAClD,UAAM,OAAO,cAAc,MAAM,IAAI,OAAO,MAAM,CAAC;AACnD,QAAI,QAAQ,KAAM,QAAO;AAAA,EAC7B;AACA,QAAM,IAAI,MAAM,mFAAmF;AACvG;AAEO,IAAMC,OAAM;AACZ,IAAMC,OAAM;AAGZ,SAASC,OAAM,GAAmB;AACrC,MAAI,EAAE,IAAI,MAAM,CAAC,OAAO,SAAS,CAAC,EAAG,OAAM,IAAI,WAAW,+BAA+B,OAAO,CAAC,CAAC,GAAG;AACrG,QAAM,OAAO,SAAS,CAAC;AACvB,SAAO,SAAS,SAAY,QAAQ,OAAS,MAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI;AAC5E;AAEO,SAASC,MAAK,GAAmB;AACpC,SAAO,MAAM,IAAI,IAAI,QAAQ,OAAS,KAAK,QAAQ,GAAG,CAAC,GAAG,CAAC,CAAC;AAChE;AAGO,SAASC,OAAM,GAAW,GAAmB;AAChD,MAAI,MAAM,EAAG,QAAO,KAAK,KAAK,CAAC,OAAO,GAAG,GAAG,EAAE,IAAI,IAAI,OAAO,GAAG,GAAG,EAAE,IAAI,CAAC,QAAQ,OAAS,GAAG,CAAC,CAAC,IAAI,QAAQ,OAAS,GAAG,CAAC,CAAC;AAC1H,MAAI,MAAM,EAAG,QAAO,QAAQ,OAAS,GAAG,CAAC,EAAE,OAAO,EAAE,CAAC,IAAI,KAAK,KAAK,CAAC;AACpE,SAAO,QAAQ,OAAS,MAAM,QAAQ,GAAG,CAAC,GAAG,QAAQ,GAAG,CAAC,GAAG,CAAC,CAAC;AAClE;AAGO,SAASC,MAAK,GAAmB;AACpC,MAAI,KAAK,IAAI,CAAC,MAAM,EAAG,QAAO,QAAQ,OAAS,GAAG,CAAC,EAAE,OAAO,EAAE,CAAC,IAAI;AACnE,SAAO,MAAM,IAAI,IAAI,QAAQ,OAAS,KAAK,QAAQ,GAAG,CAAC,GAAG,CAAC,CAAC;AAChE;AAGO,SAASC,MAAK,GAAmB;AACpC,MAAI,MAAM,EAAG,QAAO;AACpB,MAAI,MAAM,GAAI,QAAO,QAAQ,OAAS,GAAG,CAAC,CAAC;AAC3C,SAAO,QAAQ,OAAS,KAAK,QAAQ,GAAG,CAAC,GAAG,CAAC,CAAC;AAClD;AAGA,IAAM,qBAAqB;AAEpB,SAASC,MAAK,GAAmB;AACpC,MAAI,MAAM,EAAG,QAAO;AACpB,MAAI,KAAK,IAAI,CAAC,IAAI,mBAAoB,QAAO,IAAI,IAAI,WAAW;AAChE,SAAO,QAAQ,OAAS,KAAK,QAAQ,GAAG,CAAC,GAAG,CAAC,CAAC;AAClD;AAEO,SAASC,MAAK,GAAmB;AACpC,MAAI,KAAK,IAAI,CAAC,IAAI,mBAAoB,QAAO;AAC7C,SAAO,QAAQ,OAAS,KAAK,QAAQ,GAAG,CAAC,GAAG,CAAC,CAAC;AAClD;AAGO,SAASC,MAAK,GAAmB;AACpC,MAAI,MAAM,EAAG,QAAO;AACpB,MAAI,KAAK,IAAI,CAAC,KAAK,GAAI,QAAO,KAAK,KAAK,CAAC;AACzC,SAAO,QAAQ,OAAS,KAAK,QAAQ,GAAG,CAAC,GAAG,CAAC,CAAC;AAClD;AAEO,SAASC,OAAM,GAAmB;AACrC,SAAO,MAAM,IAAI,IAAI,QAAQ,OAAS,MAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,CAAC;AACjE;AAGO,SAASC,OAAM,GAAmB;AACrC,SAAO,QAAQ,OAAS,MAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,CAAC;AACnD;AAGO,SAASC,OAAM,GAAmB;AACrC,SAAO,MAAM,IAAI,IAAI,QAAQ,OAAS,MAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,CAAC;AACjE;AAMO,SAAS,SAAS,GAAW,GAAmB;AACnD,MAAI,CAAC,OAAO,UAAU,CAAC,EAAG,OAAM,IAAI,WAAW,aAAa,OAAO,CAAC,CAAC,qBAAqB;AAC1F,MAAI,MAAM,EAAG,QAAO;AAEpB,MAAI,MAAM,EAAG,QAAO;AACpB,MAAI,MAAM,EAAG,QAAO,IAAI;AACxB,MAAI,MAAM,GAAI,QAAO,IAAI;AACzB,MAAI,KAAK,IAAI,CAAC,MAAM,MAAM,KAAK,IAAI,CAAC,KAAK,IAAI;AACzC,UAAMC,SAAQ,OAAO,KAAK,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE;AAC/C,UAAM,QAAQ,IAAI,IAAIA,SAAQ,IAAIA;AAClC,WAAO,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,QAAQ;AAAA,EACrD;AACA,QAAM,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM;AAChC,QAAM,WAAW,IAAI,KAAK;AAC1B,MAAI,MAAM,EAAG,QAAO,IAAI,IAAK,OAAO,GAAG,GAAG,EAAE,KAAK,MAAM,KAAK,IAAM,OAAO,GAAG,GAAG,EAAE,KAAK,MAAM,YAAY;AACxG,QAAM,YAAY,KAAK,IAAI,CAAC;AAC5B,MAAI,cAAc,EAAG,QAAO,WAAW,KAAK;AAG5C,QAAMC,QAAO,KAAK,KAAK,SAAS,IAAI;AACpC,MAAIA,QAAO,KAAM,QAAO,WAAW,YAAY;AAC/C,MAAIA,QAAO,MAAO,QAAO,WAAW,KAAK;AACzC,QAAM,EAAE,aAAa,SAAS,IAAI,UAAU,SAAS;AACrD,QAAM,OAAO,cAAc,WAAW;AACtC,QAAM,UAAU,eAAe,OAAO,IAAI;AAC1C,QAAMC,SAAQ,WAAW;AACzB,MAAI;AACJ,MAAI,YAAY,IAAI;AAChB,aAAS,cAAc,IAAIA,SAAQ,CAAC;AAAA,EACxC,WAAW,KAAK,IAAI,CAAC,KAAK,IAAI;AAC1B,UAAM,IAAI,WAAW,OAAO,KAAK,IAAI,CAAC,CAAC;AACvC,QAAI,IAAI,GAAG;AACP,eAAS,cAAc,GAAGA,SAAQ,CAAC;AAAA,IACvC,OAAO;AAEH,YAAM,QAAQ,UAAU,CAAC,IAAI;AAC7B,YAAM,YAAY,MAAM,OAAO,KAAK;AACpC,YAAM,WAAW,YAAY;AAC7B,YAAM,SAAS,YAAY,MAAM,KAAK,KAAK;AAC3C,eAAS,cAAe,YAAY,KAAM,QAAQA,SAAQ,IAAI,QAAQ,CAAC;AAAA,IAC3E;AAAA,EACJ,OAAO;AACH,aAAS,QAAQ,OAASf,KAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,IAAI,EAAE,EAAE,MAAM,QAAQ,MAAM,CAAC,GAAG,IAAI,EAAE,GAAG,CAAC,CAAC;AAAA,EAC3G;AACA,SAAO,WAAW,CAAC,SAAS;AAChC;AAEA,SAAS,cAAc,GAAmB;AACtC,MAAIgB,SAAQ;AACZ,MAAI,OAAO;AACX,UAAQ,OAAO,QAAQ,IAAI;AACvB,aAAS;AACT,IAAAA;AAAA,EACJ;AACA,SAAOA;AACX;;;AC9IO,IAAM,kBAAkB,IAAI;AAM5B,SAAS,mBAAmB,GAAW,GAAoB;AAC9D,SAAO,MAAM,KAAK,gBAAgB,CAAC,MAAM,gBAAgB,CAAC;AAC9D;AAGO,SAAS,gBAAgB,GAAmB;AAC/C,SAAO,OAAO,SAAS,CAAC,IAAI,OAAO,kBAAkB,GAAG,EAAE,CAAC,IAAI;AACnE;AAEA,SAAS,KAAK,GAAW,GAAW,WAA4B;AAC5D,MAAI,MAAM,EAAG,QAAO;AACpB,MAAI,MAAM,KAAK,MAAM,EAAG,QAAO;AAC/B,QAAM,aAAa,KAAK,IAAI,IAAI,CAAC;AACjC,SAAO,aAAa,KAAK,IAAI,CAAC,IAAI,aAAa,aAAa,KAAK,IAAI,CAAC,IAAI;AAC9E;AAOO,SAAS,SAAS,GAAW,GAAmB;AACnD,QAAM,WAAY,IAAI,KAAK,IAAI,KAAO,IAAI,KAAK,IAAI;AACnD,SAAO,YAAY,KAAK,GAAG,CAAC,GAAG,eAAe,IAAI,IAAI,IAAI;AAC9D;AASO,SAAS,MAAM,GAAW,GAA+B;AAC5D,MAAI,MAAM,KAAK,MAAM,CAAC,EAAG,QAAO,SAAS,GAAG,CAAC;AAC7C,MAAI,MAAM,EAAG,QAAO,IAAI,IAAI,IAAI;AAChC,MAAI,IAAI,EAAG,QAAO,MAAM,MAAM,KAAK,KAAK,CAAC,IAAIC,KAAIC,KAAI,CAAC,IAAI,CAAC;AAC3D,QAAM,OAAO,IAAI;AACjB,MAAI,OAAO,SAAS,IAAI,KAAK,SAAS,KAAK,MAAM,IAAI,KAAK,KAAK,IAAI,OAAO,CAAC,MAAM,EAAG,QAAO,CAACD,KAAIC,KAAI,CAAC,CAAC,IAAI,CAAC;AAC3G,SAAO;AACX;;;ACjDO,IAAM,qBAAwC;AAAA,EACjD;AAAA,EAAW;AAAA,EAAY;AAAA,EAAW;AAAA,EAAa;AAAA,EAAY;AAAA,EAAU;AAAA,EAAS;AAAA,EAAe;AAAA,EAAO;AAAA,EACpG;AAAA,EAAY;AAAA,EAAY;AAAA,EAAQ;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAa;AAAA,EAAY;AAAA,EACrG;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAc;AAAA,EAAoB;AAAA,EAAa;AAAA,EAAa;AAAA,EACxG;AAAA,EAAa;AAAA,EAAS;AAAA,EAAa;AAAA,EAAU;AAAA,EAAS;AAAA,EAAS;AAAA,EAAQ;AAAA,EAAW;AAAA,EAAmB;AAAA,EACrG;AAAA,EAAQ;AAAA,EAAW;AAAA,EAAU;AAAA,EAAc;AAAA,EAAiB;AAAA,EAAa;AAAA,EAAgB;AAAA,EAAc;AAAA,EACvG;AAAA,EAAc;AAAA,EAAc;AAAA,EAAS;AAAA,EAAQ;AAAA,EAAU;AAAA,EAAW;AAAA,EAAW;AAAA,EAAc;AAAA,EAC3F;AAAA,EAAgB;AAAA,EAAW;AAAA,EAAW;AAAA,EAAU;AAAA,EAAa;AAAA,EAAY;AAAA,EAAc;AAAA,EAAW;AAAA,EAClG;AAAA,EAAW;AAAA,EAAS;AAAA,EAAgB;AAAA,EAAgB;AAAA,EAAa;AAAA,EAAiB;AAAA,EAClF;AAAA,EAAsB;AAAA,EAAoB;AAAA,EAAW;AAAA,EAAgB;AAAA,EAAa;AAAA,EAAW;AAAA,EAC7F;AAAA,EAAa;AAAA,EAAY;AAAA,EAAW;AAAA,EAAM;AAAA,EAAQ;AAAA,EAAU;AAAA,EAAW;AAAA,EAAO;AAAA,EAAW;AAAA,EAAW;AAAA,EACpG;AAAA,EAAW;AAAA,EAAS;AAAA,EAAkB;AAAA,EAAS;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAU;AAAA,EAAY;AAAA,EACrG;AAAA,EAAY;AAAA,EAAQ;AAAA,EAAU;AAAA,EAAW;AAAA,EAAQ;AAAA,EAAY;AAAA,EAAQ;AAAA,EAAS;AAAA,EAAgB;AAAA,EAC9F;AAAA,EAAa;AAAA,EAAO;AAAA,EAAe;AAAA,EAAQ;AAAA,EAAgB;AAAA,EAAe;AAAA,EAAQ;AAAA,EAAU;AAAA,EAC5F;AAAA,EAAa;AAAA,EAAU;AAAA,EAAa;AAAA,EAAS;AAAA,EAAY;AAAA,EAAU;AAAA,EAAQ;AAAA,EAAc;AAAA,EAAS;AAAA,EAClG;AAAA,EAAc;AAAA,EAAa;AAAA,EAAS;AAAA,EAAQ;AAAA,EAAU;AAAA,EAAa;AAAA,EAAS;AAAA,EAAS;AAAA,EAAiB;AAAA,EACtG;AAAA,EAAgB;AAAA,EAAwB;AAAA,EAA4B;AAAA,EAAqB;AAAA,EACzF;AAAA,EAAe;AAAA,EAAa;AAAA,EAAS;AAAA,EAAc;AAAA,EAAS;AAAA,EAAc;AAAA,EAAa;AAAA,EAAa;AAAA,EACpG;AAAA,EAAW;AAAA,EAAmB;AAAA,EAAS;AAAA,EAAO;AAAA,EAAW;AAAA,EAAU;AAAA,EAAgB;AAAA,EAAW;AAAA,EAAU;AAAA,EACxG;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAU;AAAA,EAAa;AAAA,EAAgB;AAAA,EAAe;AAAA,EAAS;AAAA,EAChG;AAAA,EAAa;AAAA,EAAc;AAAA,EAAe;AAAA,EAAS;AAAA,EAAU;AAAA,EAAS;AAAA,EAAS;AAAA,EAAU;AAAA,EAAS;AAAA,EAAS;AAAA,EAC3G;AAAA,EAAW;AAAA,EAAU;AAAA,EAAW;AAAA,EAAa;AAAA,EAAU;AAAA,EAAS;AAAA,EAAU;AAAA,EAAS;AAAA,EAAU;AAAA,EAAU;AAAA,EACvG;AAAA,EAAS;AAAA,EAAS;AAAA,EAAQ;AAAA,EAAa;AAAA,EAAW;AAAA,EAAQ;AAAA,EAAO;AAAA,EAAS;AAAA,EAAU;AAAA,EAAa;AAAA,EACjG;AAAA,EAAa;AAAA,EAAe;AAAA,EAAS;AAAA,EAAa;AAAA,EAAc;AAAA,EAAS;AAAA,EAAS;AAAA,EAAO;AAAA,EAAQ;AAAA,EAAU;AAAA,EAC3G;AAAA,EAAS;AAAA,EAAQ;AAAA,EAAU;AAAA,EAAU;AAAA,EAAU;AAAA,EAAgB;AAAA,EAAe;AAAA,EAAe;AAAA,EAC7F;AAAA,EAAa;AAAA,EAAO;AAAA,EAAQ;AAAA,EAAW;AAAA,EAAa;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAY;AAAA,EAAQ;AAAA,EAAS;AAAA,EACjG;AAAA,EAAa;AAAA,EAAa;AAAA,EAAe;AAAA,EAAS;AAAA,EAAK;AAAA,EAAiB;AAAA,EAAgB;AAAA,EACxF;AAAA,EAAW;AAAA,EAAa;AAAA,EAAY;AAAA,EAAe;AAAA,EAAc;AAAA,EAAY;AAAA,EAAW;AAAA,EAAa;AAAA,EACrG;AAAA,EAAQ;AAAA,EAAO;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAO;AAAA,EAAa;AAAA,EAAa;AAAA,EAAa;AAAA,EAC9F;AAAA,EAAa;AAAA,EAAW;AAAA,EAAc;AAAA,EAAkB;AAAA,EAAkB;AAAA,EAAa;AAAA,EACvF;AAAA,EAAmB;AAAA,EAAmB;AAAA,EAAU;AAAA,EAAgB;AAAA,EAAO;AAAA,EAAY;AAAA,EAAW;AAAA,EAC9F;AAAA,EAAgB;AAAA,EAAQ;AAAA,EAAS;AAAA,EAAa;AAAA,EAAY;AAAA,EAAQ;AAAA,EAAM;AAAA,EAAY;AAAA,EACpF;AAAA,EAAgB;AAAA,EAAY;AAAA,EAAa;AAAA,EAAQ;AAAA,EAAY;AAAA,EAAQ;AAAA,EAAY;AAAA,EAAU;AAAA,EAC3F;AAAA,EAAgB;AAAA,EAAa;AAAA,EAAe;AAAA,EAAY;AAAA,EAAU;AAAA,EAAS;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAQ;AAAA,EACxG;AAAA,EAAa;AAAA,EAAS;AAAA,EAAU;AAAA,EAAQ;AAAA,EAAU;AAAA,EAAO;AAAA,EAAS;AAAA,EAAU;AAAA,EAAe;AAAA,EAAS;AAAA,EACpG;AAAA,EAAU;AAAA,EAAW;AAAA,EAAS;AAAA,EAAgB;AAAA,EAAS;AAAA,EAAY;AAAA,EAAY;AAAA,EAAW;AAAA,EAAO;AAAA,EAAK;AAAA,EACtG;AAAA,EAAa;AAAA,EAAa;AAAA,EAAS;AAAA,EAAY;AAAA,EAAU;AAAA,EAAQ;AAAA,EAAW;AAAA,EAAc;AAAA,EAAc;AAAA,EACxG;AAAA,EAAa;AAAA,EAAc;AAAA,EAAa;AAAA,EAAa;AAAA,EAAQ;AAAA,EAAS;AAAA,EAAS;AAAA,EAAa;AAAA,EAAS;AAAA,EACrG;AAAA,EAAa;AAAA,EAAQ;AAAA,EAAS;AAAA,EAAQ;AAAA,EAAW;AAAA,EAAW;AAAA,EAAe;AAAA,EAAO;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAS;AAAA,EAC3G;AAAA,EAAU;AAAA,EAAc;AAAA,EAAW;AAAA,EAAW;AAAA,EAAgB;AAAA,EAAgB;AAAA,EAAY;AAAA,EAAY;AAAA,EACtG;AAAA,EAAS;AAAA,EAAa;AAAA,EAAY;AAAA,EAAU;AAChD;AAEA,IAAI;AAGG,SAAS,0BAA0B,MAAuB;AAC7D,iBAAe,IAAI,IAAI,mBAAmB,IAAI,aAAa,CAAC;AAC5D,SAAO,WAAW,IAAI,cAAc,IAAI,CAAC;AAC7C;;;ACtCO,SAAS,YAAYC,OAAcC,QAAuB;AAC7D,QAAM,IAAI,MAAMD,KAAI;AACpB,QAAM,IAAI,MAAMC,MAAK;AACrB,QAAM,SAAS,KAAK,IAAI,EAAE,QAAQ,QAAQ,EAAE,QAAQ,MAAM;AAC1D,WAAS,IAAI,GAAG,IAAI,QAAQ,KAAK;AAC7B,UAAM,IAAI,UAAU,EAAE,SAAS,CAAC;AAChC,UAAM,IAAI,UAAU,EAAE,SAAS,CAAC;AAChC,UAAM,UAAU,EAAE,gBAAgB,EAAE,cAAc,KAAK,KAAK,EAAE,cAAc,EAAE,WAAW,IAAI,KAAK,KAAK,EAAE,OAAO,EAAE,IAAI;AACtH,QAAI,YAAY,EAAG,QAAO;AAAA,EAC9B;AACA,MAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,OAAQ,QAAO,KAAK,KAAK,EAAE,QAAQ,SAAS,EAAE,QAAQ,MAAM;AAC/F,WAAS,IAAI,GAAG,IAAI,QAAQ,KAAK;AAC7B,UAAM,UAAU,eAAe,UAAU,EAAE,SAAS,CAAC,EAAE,SAAS,UAAU,EAAE,SAAS,CAAC,EAAE,OAAO;AAC/F,QAAI,YAAY,EAAG,QAAO,KAAK,KAAK,OAAO;AAAA,EAC/C;AACA,SAAO,KAAK,KAAK,EAAE,UAAU,EAAE,OAAO;AAC1C;AAMO,SAAS,gBAAgBC,OAAsB;AAClD,QAAM,EAAE,SAAS,QAAQ,IAAI,MAAMA,KAAI;AACvC,MAAI,MAAM;AAGV,aAAW,KAAK,SAAS;AACrB,WAAO,OAAO,aAAa,KAAO,EAAE,WAAW,IAAI,OAAO,aAAa,EAAE,IAAI,IAAI,OAAO,aAAa,EAAE,QAAQ,MAAM,IAAI,EAAE;AAAA,EAC/H;AACA,SAAO,GAAG,GAAG,IAAI,OAAO,OAAO,CAAC;AACpC;AAEA,IAAM,SAAiB,EAAE,aAAa,GAAG,MAAM,IAAM,SAAS,GAAG;AAGjE,SAAS,MAAMA,OAAsD;AACjE,MAAI,UAAU;AACd,QAAM,UAAoB,CAAC;AAC3B,WAAS,IAAI,GAAG,IAAIA,MAAK,QAAQ,KAAK;AAClC,UAAM,IAAIA,MAAK,WAAW,CAAC;AAC3B,UAAM,OAAOA,MAAK,YAAY,CAAC;AAC/B,QAAI,SAAS,UAAa,OAAO,OAAQ;AAIrC,YAAM,cAAc,iBAAiB,OAAO,cAAc,IAAI,CAAC;AAC/D,cAAQ,KAAK,EAAE,aAAa,MAAM,GAAG,SAAS,GAAG,GAAG,EAAE,aAAa,MAAMA,MAAK,WAAW,IAAI,CAAC,GAAG,SAAS,GAAG,CAAC;AAC9G;AACA;AAAA,IACJ;AACA,QAAI,MAAM,MAAQ,MAAM,IAAM;AAC1B;AACA;AAAA,IACJ;AACA,QAAI,MAAM,OAAQ,MAAM,MAAQ;AAC5B,cAAQ,KAAK,QAAQ,MAAM;AAC3B;AAAA,IACJ;AACA,YAAQ,KAAK,eAAe,CAAC,CAAC;AAAA,EAClC;AACA,SAAO,EAAE,SAAS,QAAQ;AAC9B;AAGA,SAAS,eAAe,GAAmB;AACvC,MAAI,IAAI,IAAK,QAAO,EAAE,aAAa,QAAQ,CAAC,GAAG,MAAM,eAAe,CAAC,GAAG,SAAS,GAAG;AAEpF,MAAI,KAAK,SAAU,KAAK,MAAQ,QAAO,EAAE,aAAa,GAAG,MAAM,GAAG,SAAS,GAAG;AAC9E,QAAM,aAAa,OAAO,aAAa,CAAC,EAAE,UAAU,KAAK;AACzD,QAAMC,QAAO,WAAW,WAAW,CAAC;AACpC,SAAO,EAAE,aAAa,QAAQA,KAAI,GAAG,MAAM,eAAeA,KAAI,GAAG,SAAS,WAAW,MAAM,CAAC,EAAE;AAClG;AAEA,IAAMC,gBAAe;AACrB,IAAMC,UAAS;AAEf,SAAS,QAAQ,GAAmB;AAChC,SAAO,iBAAiB,OAAO,aAAa,CAAC,CAAC;AAClD;AAEA,SAAS,iBAAiB,WAA2B;AACjD,MAAID,cAAa,KAAK,SAAS,EAAG,QAAO;AACzC,MAAIC,QAAO,KAAK,SAAS,EAAG,QAAO;AACnC,SAAO;AACX;;;ACxEO,IAAM,YAAN,MAAgB;AAAA,EACV;AAAA,EACA;AAAA;AAAA,EAET;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA;AAAA;AAAA,EAGS,YAAY,oBAAI,IAA6B;AAAA;AAAA,EAG7C,sBAAsB,oBAAI,IAA6B;AAAA,EAEhE,YAAY,OAAmB,SAAkB;AAC7C,SAAK,QAAQ;AACb,SAAK,UAAU;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAAS,MAAmB;AACxB,UAAM,QAAQ,KAAK,SAAS,KAAK,eAAe,IAAI,CAAC;AACrD,WAAO,UAAU,SAAY,MAAM,WAAW,CAAC,IAAI;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,eAAe,MAAqB;AAEhC,UAAM,eAAe,KAAK;AAC1B,SAAK,WAAW;AAChB,QAAI;AACA,YAAM,SAAS,KAAK,QAAQ,IAAI;AAChC,YAAM,UAAU,KAAK,cAAc;AACnC,aAAO,YAAY,SAAY,SAAS,QAAQ,GAAG,OAAO;AAAA,IAC9D,UAAE;AACE,WAAK,WAAW;AAAA,IACpB;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,SAAkB;AACd,SAAK,WAAW,MAAM;AACtB,WAAO,QAAQ,GAAG,MAAM,OAAO;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,aAAsB;AAClB,SAAK,aAAa,MAAM;AACxB,WAAO,QAAQ,GAAG,MAAM,WAAW;AAAA,EACvC;AAAA;AAAA,EAGA,UAAiB;AACb,SAAK,WAAW,MAAM;AACtB,WAAO,MAAM;AAAA,EACjB;AAAA;AAAA,EAGA,gBAAmC;AAC/B,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,QAAQ,MAAqB;AACzB,QAAI,KAAK,SAAS,aAAa,KAAK,aAAa,OAAO,KAAK,aAAa,MAAM;AAC5E,YAAMC,QAAO,KAAK,QAAQ,KAAK,IAAI;AACnC,YAAMC,SAAQ,KAAK,QAAQ,KAAK,KAAK;AACrC,UAAI,QAAQD,KAAI,KAAK,QAAQC,MAAK,EAAG,QAAO,KAAK,aAAa,KAAK,UAAUD,OAAMC,MAAK;AACxF,aAAO,QAAQ,GAAG,KAAK,cAAc,KAAK,UAAU,KAAK,SAASD,KAAI,GAAG,KAAK,SAASC,MAAK,GAAG,IAAI,CAAC;AAAA,IACxG;AACA,UAAM,SAAS,KAAK,QAAQ,IAAI;AAChC,QAAI,QAAQ,MAAM,EAAG,QAAO;AAC5B,UAAM,QAAQ,KAAK,SAAS,MAAM;AAClC,WAAO,QAAQ,GAAG,UAAU,SAAY,MAAM,WAAW,CAAC,IAAI,KAAK;AAAA,EACvE;AAAA;AAAA,EAGA,QAAQ,SAA8B;AAClC,YAAQ,QAAQ,MAAM;AAAA,MAClB,KAAK;AACD,eAAO,QAAQ,QAAQ;AAAA,MAC3B,KAAK,QAAQ;AACT,cAAM,OAAO,QAAQ;AACrB,YAAI,KAAK,OAAO,KAAK,UAAU,WAAW,UAAW,QAAO,WAAW,OAAO,MAAM,UAAU,OAAO,CAAC;AACtG,cAAM,QAAQ,IAAI,WAAW,KAAK,MAAM,KAAK,OAAO;AACpD,cAAM,QAAQ,QAAQ,QAAQ;AAC9B,mBAAW,WAAW,MAAM,WAAW,IAAI,EAAG,OAAM,IAAI,QAAQ,MAAM,KAAK,MAAM,QAAQ,SAAS,KAAK,SAAS,MAAM,KAAK,OAAO,CAAC;AACnI,eAAO;AAAA,MACX;AAAA,MACA,KAAK,UAAU;AACX,cAAMC,UAAS,QAAQ,SAAS;AAChC,YAAIA,QAAO,WAAW,EAAG,QAAO,WAAW,OAAO,MAAM,UAAU,SAAS,CAAC;AAC5E,cAAM,SAAS,IAAI,WAAWA,QAAO,QAAQ,CAAC;AAC9C,iBAAS,IAAI,GAAG,IAAIA,QAAO,QAAQ,IAAK,QAAO,IAAI,GAAG,GAAGA,QAAO,CAAC,CAAC;AAClE,eAAO;AAAA,MACX;AAAA,MACA,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACD,eAAO,WAAW,OAAO,KAAK,SAAS,OAAO,CAAC;AAAA,MACnD;AACI,cAAM,IAAI,MAAM,aAAa,OAAO,QAAQ,IAAI,CAAC,yBAAyB;AAAA,IAClF;AAAA,EACJ;AAAA;AAAA,EAGA,aAAa,IAAY,aAAsB,cAAgC;AAC3E,UAAMF,QAAO,KAAK,QAAQ,WAAW;AACrC,UAAMC,SAAQ,KAAK,QAAQ,YAAY;AACvC,UAAM,OAAOD,MAAK,SAAS,IAAIC,OAAM,OAAOA,OAAM,SAAS,IAAID,MAAK,OAAO,KAAK,IAAIA,MAAK,MAAMC,OAAM,IAAI;AACzG,UAAM,UAAUD,MAAK,YAAY,IAAIC,OAAM,UAAUA,OAAM,YAAY,IAAID,MAAK,UAAU,KAAK,IAAIA,MAAK,SAASC,OAAM,OAAO;AAC9H,QAAI,OAAO,UAAU,WAAW,UAAW,QAAO,QAAQ,QAAQ,OAAO;AACzE,UAAM,SAAS,IAAI,WAAW,MAAM,OAAO;AAC3C,aAAS,IAAI,GAAG,IAAI,MAAM,KAAK;AAC3B,eAAS,IAAI,GAAG,IAAI,SAAS,IAAK,QAAO,IAAI,GAAG,GAAG,KAAK,cAAc,IAAID,MAAK,UAAU,GAAG,CAAC,GAAGC,OAAM,UAAU,GAAG,CAAC,GAAG,KAAK,CAAC;AAAA,IACjI;AACA,WAAO,QAAQ,QAAQ,MAAM;AAAA,EACjC;AAAA;AAAA,EAGA,KAAK,SAAkB,MAAoD;AACvE,QAAI,CAAC,QAAQ,OAAO,EAAG,QAAO,QAAQ,GAAG,KAAK,KAAK,SAAS,OAAO,CAAC,CAAC;AACrE,UAAM,SAAS,KAAK,QAAQ,OAAO;AACnC,UAAM,SAAS,IAAI,WAAW,OAAO,MAAM,OAAO,OAAO;AACzD,aAAS,IAAI,GAAG,IAAI,OAAO,MAAM,KAAK;AAClC,eAAS,IAAI,GAAG,IAAI,OAAO,SAAS,IAAK,QAAO,IAAI,GAAG,GAAG,KAAK,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC;AAAA,IACnF;AACA,WAAO,QAAQ,QAAQ,MAAM;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,QAAQ,MAAqB;AACzB,YAAQ,KAAK,MAAM;AAAA,MACf,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACD,eAAO,KAAK,UAAU,IAAI;AAAA,MAC9B,KAAK;AACD,eAAO,KAAK,YAAY,SAAY,KAAK,MAAM,IAAI,IAAI,KAAK,UAAU,IAAI;AAAA,MAC9E,KAAK;AACD,eAAO,KAAK,KAAK,IAAI;AAAA,MACzB,KAAK;AACD,eAAO,KAAK,MAAM,IAAI;AAAA,MAC1B,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACD,eAAO,KAAK,MAAM,IAAI;AAAA,MAC1B;AACI,eAAO,gBAAgB,IAAI;AAAA,IACnC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,GAA0B;AAC5B,UAAM,aAAa,EAAE;AACrB,QAAI,eAAe,OAAW,QAAO,0BAA0B,EAAE,IAAI,IAAI,KAAK,WAAW,IAAI,QAAQ,QAAQ,QAAQ;AACrH,QAAI,yBAAyB,CAAC,EAAG,QAAO,QAAQ,QAAQ,SAAS;AACjE,WAAO,WAAW,OAAO,IAAI,aAAa,MAAM,EAAE,WAAW,EAAE,OAAO,WAAW,MAAM,CAAC;AAAA,EAC5F;AAAA;AAAA,EAGA,MAAM,MAAqB;AACvB,YAAQ,KAAK,MAAM;AAAA,MACf,KAAK;AAAU,eAAO,QAAQ,GAAG,MAAM,WAAW,KAAK,MAAM,CAAC;AAAA,MAC9D,KAAK;AAAQ,eAAO,QAAQ,GAAG,MAAM,SAAS,KAAK,IAAI,CAAC;AAAA,MACxD,KAAK;AAAW,eAAO,QAAQ,GAAG,MAAM,YAAY,KAAK,KAAK,CAAC;AAAA,MAC/D,KAAK;AAAS,eAAO,QAAQ,QAAQ,KAAK,KAAK;AAAA,MAC/C,KAAK;AAAW,eAAO,QAAQ;AAAA,MAC/B,KAAK,aAAa;AACd,cAAM,YAAY,KAAK;AACvB,YAAI,UAAU,kBAAkB,QAAW;AAGvC,cAAI,UAAU,QAAS,QAAO,QAAQ,QAAQ,OAAO;AACrD,cAAI,UAAU,cAAc,OAAW,OAAM,IAAI,MAAM,gEAAgE;AACvH,gBAAM,SAAS,KAAK,MAAM,YAAY,UAAU,WAAW,UAAU,aAAa;AAClF,iBAAO,WAAW,SAAY,QAAQ,QAAQ,QAAQ,IAAI,QAAQ,SAAS,UAAU,MAAM,MAAM;AAAA,QACrG;AAEA,cAAM,QAAQ,KAAK,MAAM,QAAQ,UAAU,SAAS;AACpD,YAAI,UAAU,OAAW,QAAO,QAAQ,QAAQ,OAAO;AACvD,YAAI,UAAU,QAAS,QAAO,MAAM,MAAM,IAAI,YAAY,UAAU,MAAM,UAAU,OAAO,CAAC;AAC5F,eAAO,QAAQ,OAAO,UAAU,MAAM,KAAK;AAAA,MAC/C;AAAA,MACA,KAAK;AAAuB,eAAO,KAAK,MAAM,YAAY,KAAK,OAAO,KAAK,MAAM;AAAA,MACjF,KAAK;AAAA,MACL,KAAK;AACD,eAAO,KAAK,kBAAkB,IAAI,IAAI,KAAK,WAAW,IAAI,QAAQ,QAAQ,QAAQ;AAAA,MACtF,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACD,cAAM,IAAI,MAAM,+BAA+B,KAAK,IAAI,aAAa;AAAA,MACzE;AACI,eAAO,gBAAgB,IAAI;AAAA,IACnC;AAAA,EACJ;AAAA;AAAA,EAGA,kBAAkB,MAAqB;AACnC,QAAI,KAAK,SAAS,OAAQ,QAAO,KAAK,YAAY,UAAa,KAAK,MAAM,cAAc,KAAK,IAAI;AACjG,QAAI,KAAK,SAAS,eAAgB,QAAO,KAAK,kBAAkB,KAAK,IAAI,KAAK,KAAK,kBAAkB,KAAK,KAAK;AAC/G,QAAI,KAAK,SAAS,cAAe,QAAO,KAAK,kBAAkB,KAAK,KAAK;AACzE,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,SAAS,SAAqC;AAC1C,YAAQ,QAAQ,MAAM;AAAA,MAClB,KAAK;AACD,eAAO,QAAQ;AAAA,MACnB,KAAK;AACD,eAAO,QAAQ,KAAK,eAAe,QAAQ,QAAQ,EAAE,KAAK,IAAI,YAAY,QAAQ,KAAK,MAAM,QAAQ,KAAK,OAAO,CAAC,IAAI,KAAK,QAAQ;AAAA,MACvI,KAAK,UAAU;AACX,cAAMC,UAAS,QAAQ,SAAS;AAChC,eAAOA,QAAO,WAAW,IAAIA,QAAO,CAAC,IAAI,KAAK,QAAQ;AAAA,MAC1D;AAAA,MACA,KAAK,SAAS;AACV,cAAM,QAAQ,QAAQ,QAAQ;AAC9B,eAAO,MAAM,WAAW,MAAM,GAAG,GAAG,CAAC,IAAI,KAAK,QAAQ;AAAA,MAC1D;AAAA,MACA,KAAK;AACD,eAAO,MAAM,UAAU,QAAQ,WAAW,YAAY,OAAO;AAAA,MACjE,KAAK;AACD,eAAO;AAAA,MACX;AACI,cAAM,IAAI,MAAM,aAAa,OAAO,QAAQ,IAAI,CAAC,yBAAyB;AAAA,IAClF;AAAA,EACJ;AAAA;AAAA,EAGA,CAAC,YAAY,OAAkC;AAC3C,YAAQ,MAAM,MAAM;AAAA,MAChB,KAAK,QAAQ;AACT,cAAM,QAAQ,MAAM,QAAQ;AAC5B,mBAAW,WAAW,MAAM,WAAW,MAAM,IAAI,EAAG,OAAM,aAAa,OAAO,OAAO;AACrF;AAAA,MACJ;AAAA,MACA,KAAK;AACD,mBAAW,SAAS,MAAM,SAAS,GAAG;AAClC,cAAI,UAAU,OAAW,OAAM;AAAA,QACnC;AACA;AAAA,MACJ,KAAK;AACD,eAAO,MAAM,QAAQ,EAAE,SAAS;AAChC;AAAA,MACJ,KAAK;AAED,mBAAW,SAAS,MAAM,SAAS,GAAG;AAClC,qBAAW,WAAW,MAAM,WAAW,MAAM,IAAI,EAAG,OAAM,aAAa,OAAO,OAAO;AAAA,QACzF;AACA;AAAA,MACJ,KAAK;AAAA,MACL,KAAK;AACD,cAAM,IAAI,WAAW,cAAc;AAAA,MACvC;AACI,cAAM,IAAI,MAAM,aAAa,OAAO,MAAM,IAAI,CAAC,yBAAyB;AAAA,IAChF;AAAA,EACJ;AAAA,EAEA,OAAO,MAA+B;AAClC,WAAO,KAAK,SAAS,KAAK,QAAQ,IAAI,CAAC;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,KAAK,MAAwB;AACzB,UAAM,QAAQ,KAAK,SAAS,IAAI,aAAW;AACvC,YAAM,OAAO,KAAK,UAAU,IAAI,OAAO;AACvC,WAAK,UAAU,IAAI,SAAS,EAAE,OAAO,OAAU,CAAC;AAChD,aAAO;AAAA,IACX,CAAC;AACD,QAAI;AACA,aAAO,KAAK,QAAQ,KAAK,WAAW;AAAA,IACxC,UAAE;AACE,YAAM,QAAQ,CAAC,MAAM,MAAM;AACvB,cAAM,UAAU,KAAK,SAAS,CAAC;AAC/B,YAAI,YAAY,OAAW,OAAM,IAAI,MAAM,iCAAiC;AAC5E,YAAI,SAAS,OAAW,MAAK,UAAU,OAAO,OAAO;AAAA,YAChD,MAAK,UAAU,IAAI,SAAS,IAAI;AAAA,MACzC,CAAC;AAAA,IACL;AAAA,EACJ;AAAA,EAEA,QAAQ,IAAe,OAAiC;AACpD,UAAM,UAAU,KAAK,SAAS,KAAK;AACnC,QAAI,OAAO,YAAY,SAAU,QAAO,MAAM,UAAU,OAAO;AAC/D,WAAO,MAAM,WAAW,OAAO,MAAM,CAAC,UAAU,OAAO;AAAA,EAC3D;AAAA,EAEA,SAAS,OAAiC;AACtC,UAAM,UAAU,KAAK,SAAS,KAAK;AACnC,WAAO,OAAO,YAAY,WAAW,MAAM,UAAU,OAAO,IAAI,YAAY,UAAU,GAAG;AAAA,EAC7F;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,UAAU,KAAoB;AAC1B,UAAM,OAAe,CAAC,EAAE,MAAM,KAAK,UAAU,MAAM,CAAC;AACpD,UAAM,OAAkB,CAAC;AAEzB,UAAM,YAA0B,CAAC;AACjC,QAAI;AACA,eAAS,OAAO,KAAK,IAAI,GAAG,SAAS,QAAW,OAAO,KAAK,IAAI,GAAG;AAC/D,YAAI,KAAK,SAAU,MAAK,SAAS,KAAK,MAAM,MAAM,SAAS;AAAA,YACtD,MAAK,QAAQ,KAAK,MAAM,MAAM,MAAM,SAAS;AAAA,MACtD;AAAA,IACJ,UAAE;AACE,WAAK,SAAS,SAAS;AAAA,IAC3B;AACA,WAAO,IAAI,IAAI;AAAA,EACnB;AAAA;AAAA,EAGA,SAAS,WAAwC;AAC7C,eAAW,WAAW,WAAW;AAC7B,YAAM,OAAO,KAAK,oBAAoB,IAAI,OAAO;AACjD,UAAI,SAAS,OAAW,OAAM,IAAI,MAAM,iDAAiD;AACzF,WAAK,UAAU,IAAI,SAAS,IAAI;AAChC,WAAK,oBAAoB,OAAO,OAAO;AAAA,IAC3C;AAAA,EACJ;AAAA;AAAA,EAGA,QAAQ,MAAY,MAAc,MAAiB,WAA+B;AAC9E,YAAQ,KAAK,MAAM;AAAA,MACf,KAAK;AAED,YAAI,KAAK,MAAM,SAAS,eAAe,KAAK,MAAM,UAAU,UAAU;AAClE,eAAK,KAAK,QAAQ,QAAQ,QAAQ,CAAC;AACnC;AAAA,QACJ;AACA,aAAK,KAAK,EAAE,MAAM,KAAK,OAAO,UAAU,MAAM,CAAC;AAC/C;AAAA,MACJ,KAAK;AAAA,MACL,KAAK;AACD,aAAK,KAAK,EAAE,MAAM,UAAU,KAAK,GAAG,EAAE,MAAM,KAAK,SAAS,UAAU,MAAM,CAAC;AAC3E;AAAA,MACJ,KAAK;AACD,aAAK,KAAK,EAAE,MAAM,UAAU,KAAK,GAAG,EAAE,MAAM,KAAK,OAAO,UAAU,MAAM,GAAG,EAAE,MAAM,KAAK,MAAM,UAAU,MAAM,CAAC;AAC/G;AAAA,MACJ,KAAK,QAAQ;AACT,cAAM,UAAU,KAAK;AACrB,YAAI,YAAY,QAAW;AACvB,eAAK,KAAK,KAAK,QAAQ,IAAI,CAAC;AAC5B;AAAA,QACJ;AAEA,cAAM,OAAO,KAAK,UAAU,IAAI,OAAO;AACvC,YAAI,SAAS,QAAW;AACpB,eAAK,KAAK,QAAQ,QAAQ,QAAQ,CAAC;AACnC;AAAA,QACJ;AACA,YAAI,KAAK,UAAU,QAAW;AAC1B,eAAK,KAAK,KAAK,KAAK;AACpB;AAAA,QACJ;AACA,aAAK,UAAU,OAAO,OAAO;AAC7B,aAAK,oBAAoB,IAAI,SAAS,IAAI;AAC1C,kBAAU,KAAK,OAAO;AACtB,aAAK,KAAK,EAAE,MAAM,UAAU,KAAK,GAAG,EAAE,MAAM,QAAQ,OAAO,UAAU,MAAM,CAAC;AAC5E;AAAA,MACJ;AAAA,MACA,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACD,aAAK,KAAK,KAAK,QAAQ,IAAI,CAAC;AAC5B;AAAA,MACJ;AACI,eAAO,gBAAgB,IAAI;AAAA,IACnC;AAAA,EACJ;AAAA;AAAA,EAGA,SAAS,MAAY,MAAiB,WAA+B;AACjE,YAAQ,KAAK,MAAM;AAAA,MACf,KAAK,SAAS;AACV,cAAM,WAAW,KAAK;AACtB,aAAK,KAAK,KAAK,KAAK,IAAI,IAAI,GAAG,WAAS,KAAK,QAAQ,UAAU,KAAK,CAAC,CAAC;AACtE;AAAA,MACJ;AAAA,MACA,KAAK;AACD,aAAK,KAAK,KAAK,KAAK,IAAI,IAAI,GAAG,WAAS,KAAK,SAAS,KAAK,CAAC,CAAC;AAC7D;AAAA,MACJ,KAAK,UAAU;AACX,cAAMD,SAAQ,IAAI,IAAI;AACtB,cAAMD,QAAO,IAAI,IAAI;AACrB,aAAK,KAAK,QAAQA,KAAI,KAAK,QAAQC,MAAK,IAClC,KAAK,aAAa,KAAK,UAAUD,OAAMC,MAAK,IAC5C,QAAQ,GAAG,KAAK,cAAc,KAAK,UAAU,KAAK,SAASD,KAAI,GAAG,KAAK,SAASC,MAAK,GAAG,KAAK,CAAC,CAAC;AACrG;AAAA,MACJ;AAAA,MACA,KAAK,QAAQ;AACT,cAAM,UAAU,KAAK;AACrB,YAAI,YAAY,OAAW,OAAM,IAAI,MAAM,uDAAuD;AAClG,cAAM,OAAO,KAAK,oBAAoB,IAAI,OAAO;AACjD,YAAI,SAAS,OAAW,OAAM,IAAI,MAAM,6CAA6C;AACrF,aAAK,oBAAoB,OAAO,OAAO;AACvC,kBAAU,OAAO,UAAU,QAAQ,OAAO,GAAG,CAAC;AAC9C,aAAK,UAAU,IAAI,SAAS,IAAI;AAEhC,cAAM,QAAQ,IAAI,IAAI,EAAE,OAAO;AAC/B,aAAK,QAAQ;AACb,aAAK,KAAK,KAAK;AACf;AAAA,MACJ;AAAA,MACA,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACD,cAAM,IAAI,MAAM,aAAa,KAAK,IAAI,8BAA8B;AAAA,MACxE;AACI,cAAM,IAAI,MAAM,aAAa,OAAO,IAAI,CAAC,sBAAsB;AAAA,IACvE;AAAA,EACJ;AAAA,EAEA,cAAc,IAAYD,OAAyBC,QAA0B,gBAAgC;AACzG,YAAQ,IAAI;AAAA,MACR,KAAK;AACD,YAAID,OAAM,YAAY,KAAM,QAAOA;AACnC,YAAIC,QAAO,YAAY,KAAM,QAAOA;AACpC,eAAO,MAAM,SAAS,KAAK,OAAOD,KAAI,IAAI,KAAK,OAAOC,MAAK,CAAC;AAAA,MAChE,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK,MAAM;AACP,YAAID,OAAM,YAAY,KAAM,QAAOA;AACnC,YAAIC,QAAO,YAAY,KAAM,QAAOA;AACpC,cAAM,QAAQ,cAAcD,OAAMC,QAAO,kBAAkB;AAC3D,gBAAQ,IAAI;AAAA,UACR,KAAK;AAAK,mBAAO,MAAM,YAAY,UAAU,CAAC;AAAA,UAC9C,KAAK;AAAM,mBAAO,MAAM,YAAY,UAAU,CAAC;AAAA,UAC/C,KAAK;AAAK,mBAAO,MAAM,YAAY,QAAQ,CAAC;AAAA,UAC5C,KAAK;AAAK,mBAAO,MAAM,YAAY,QAAQ,CAAC;AAAA,UAC5C,KAAK;AAAM,mBAAO,MAAM,YAAY,SAAS,CAAC;AAAA,UAC9C,KAAK;AAAM,mBAAO,MAAM,YAAY,SAAS,CAAC;AAAA,QAClD;AAAA,MACJ;AAAA,MACA;AACI;AAAA,IACR;AAEA,UAAM,IAAI,KAAK,SAASD,KAAI;AAC5B,QAAI,OAAO,MAAM,SAAU,QAAO,MAAM,UAAU,CAAC;AACnD,UAAM,IAAI,KAAK,SAASC,MAAK;AAC7B,QAAI,OAAO,MAAM,SAAU,QAAO,MAAM,UAAU,CAAC;AACnD,YAAQ,IAAI;AAAA,MACR,KAAK;AAAK,eAAO,YAAY,iBAAiB,SAAS,GAAG,CAAC,IAAI,IAAI,CAAC;AAAA,MACpE,KAAK;AAAK,eAAO,YAAY,iBAAiB,SAAS,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC;AAAA,MACrE,KAAK;AAAK,eAAO,YAAY,IAAI,CAAC;AAAA,MAClC,KAAK;AAAK,eAAO,MAAM,IAAI,MAAM,UAAU,SAAS,IAAI,YAAY,IAAI,CAAC;AAAA,MACzE,KAAK,KAAK;AACN,YAAI,MAAM,KAAK,MAAM,EAAG,QAAO,MAAM,UAAU,OAAO;AACtD,YAAI,MAAM,KAAK,IAAI,EAAG,QAAO,MAAM,UAAU,SAAS;AACtD,cAAM,SAAS,MAAM,GAAG,CAAC;AACzB,eAAO,WAAW,SAAY,MAAM,UAAU,OAAO,IAAI,YAAY,MAAM;AAAA,MAC/E;AAAA,MACA;AAAS,cAAM,IAAI,MAAM,yBAAyB,EAAE,GAAG;AAAA,IAC3D;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAAS,OAAyC;AAC9C,QAAI,UAAU,OAAW,QAAO;AAChC,YAAQ,MAAM,MAAM;AAAA,MAChB,KAAK;AAAU,eAAO,MAAM;AAAA,MAC5B,KAAK;AAAW,eAAO,MAAM,UAAU,IAAI;AAAA,MAC3C,KAAK;AAAS,eAAO,MAAM;AAAA,MAC3B,KAAK,QAAQ;AACT,cAAM,SAAS,YAAY,MAAM,MAAM,KAAK,OAAO;AACnD,eAAO,WAAW,SAAY,YAAY;AAAA,MAC9C;AAAA,MACA;AAAS,cAAM,IAAI,MAAM,aAAa,OAAO,MAAM,IAAI,CAAC,uBAAuB;AAAA,IACnF;AAAA,EACJ;AAAA;AAAA,EAGA,OAAO,OAAkC;AACrC,QAAI,UAAU,OAAW,QAAO;AAChC,YAAQ,MAAM,MAAM;AAAA,MAChB,KAAK;AAAQ,eAAO,MAAM;AAAA,MAC1B,KAAK;AAAU,eAAO,YAAY,MAAM,QAAQ,KAAK,OAAO;AAAA,MAC5D,KAAK;AAAW,eAAO,MAAM,UAAU,SAAS;AAAA,MAChD,KAAK;AAAS,eAAO,MAAM;AAAA,MAC3B;AAAS,cAAM,IAAI,MAAM,aAAa,OAAO,MAAM,IAAI,CAAC,uBAAuB;AAAA,IACnF;AAAA,EACJ;AACJ;AAGO,SAAS,QAAQ,SAA2B;AAC/C,UAAQ,QAAQ,MAAM;AAAA,IAClB,KAAK;AAAQ,aAAO,CAAC,QAAQ,KAAK;AAAA,IAClC,KAAK;AAAU,aAAO,QAAQ,SAAS,EAAE,WAAW;AAAA,IACpD,KAAK;AAAS,aAAO;AAAA,IACrB,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACD,aAAO;AAAA,IACX;AAAS,YAAM,IAAI,MAAM,aAAa,OAAO,QAAQ,IAAI,CAAC,yBAAyB;AAAA,EACvF;AACJ;AAGO,SAAS,YAAY,QAAuB;AAC/C,SAAO,OAAO,SAAS,MAAM,IAAI,MAAM,WAAW,MAAM,IAAI,MAAM,UAAU,OAAO;AACvF;AAOO,SAAS,cAAcD,OAAyBC,QAA0B,cAA0D;AACvI,MAAID,UAAS,UAAaC,WAAU,OAAW,QAAO;AACtD,QAAM,IAAID,SAAQ,QAAQG,SAAQF,MAAK,EAAE,IAAI;AAC7C,QAAM,IAAIA,UAAS,QAAQ,EAAE,IAAI;AACjC,MAAI,EAAE,SAAS,EAAE,KAAM,QAAO,KAAK,KAAK,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC;AACzD,UAAQ,EAAE,MAAM;AAAA,IACZ,KAAK;AACD,UAAI,eAAe,EAAE,QAAQ,EAAE,MAAM,MAAM,KAAM,QAAO;AACxD,aAAO,EAAE,SAAS,EAAE,SAAS,KAAK,EAAE,SAAS,EAAE,SAAS,IAAI;AAAA,IAChE,KAAK;AAAQ,aAAO,YAAY,EAAE,MAAM,EAAE,IAAI;AAAA,IAC9C,KAAK;AAAA,IACL,KAAK;AACD,aAAO,KAAK,KAAK,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,OAAO,CAAC;AAAA,IAC1D;AAAS,YAAM,IAAI,MAAM,aAAa,OAAO,EAAE,IAAI,CAAC,uBAAuB;AAAA,EAC/E;AACJ;AAEA,SAAS,KAAK,OAAsB;AAChC,SAAO,MAAM,SAAS,WAAW,IAAI,MAAM,SAAS,SAAS,IAAI;AACrE;AAEA,SAAS,QAAQ,MAA4B;AACzC,SAAO,SAAS,SAAS,MAAM,SAAS,EAAE,IAAI,SAAS,YAAY,MAAM,YAAY,KAAK,IAAI,MAAM,WAAW,CAAC;AACpH;AAEA,SAASE,SAAQ,OAAiC;AAC9C,MAAI,UAAU,OAAW,OAAM,IAAI,MAAM,gDAAgD;AACzF,SAAO;AACX;AAEA,SAAS,aAAa,OAAmB,SAA6B;AAClE,QAAM,QAAQ,MAAM,KAAK,OAAO;AAChC,MAAI,UAAU,OAAW,OAAM,IAAI,MAAM,aAAa,QAAQ,SAAS,CAAC,2BAA2B;AACnG,SAAO;AACX;AAEA,SAAS,IAAO,OAAe;AAC3B,QAAM,MAAM,MAAM,IAAI;AACtB,MAAI,QAAQ,OAAW,OAAM,IAAI,MAAM,gDAAgD;AACvF,SAAO;AACX;AAMA,SAAS,yBAAyB,GAA0B;AACxD,QAAM,SAAS,EAAE,UAAU;AAC3B,MAAI,WAAW,OAAW,QAAO;AACjC,SAAO,EAAE,UAAU,KAAK,CAAC,UAAU,MAAM,SAAS,SAAS,eAAe,SAAS,UAAU,YAAY,OAAO,GAAG,EAAE,UAAU,MAAM,MAAM,UAAU;AACzJ;AAEA,SAAS,gBAAgB,MAAoB;AACzC,QAAM,IAAI,MAAM,+BAA+B,OAAO,IAAI,CAAC,GAAG;AAClE;;;AChoBO,SAAS,QAAQ,SAA2B;AAC/C,SAAQ,QAAQ,SAAS,UAAU,CAAC,QAAQ,KAAK,gBACzC,QAAQ,SAAS,YAAY,QAAQ,SAAS,EAAE,WAAW,KAC5D,QAAQ,SAAS,WAAW,QAAQ,SAAS;AACxD;AAOO,SAAS,SAAS,MAA6B;AAClD,SAAO,KAAK,UAAU,OAAO;AACjC;AAOO,SAAS,eAAe,MAAoB,OAA4C;AAC3F,QAAM,UAAU,KAAK,SAAS,KAAK;AACnC,MAAI,QAAQ,OAAO,EAAG,QAAO,SAAS,IAAI;AAC1C,QAAM,QAAQ,KAAK,UAAU,SAAS,OAAO;AAC7C,MAAI,OAAO,YAAY,KAAM,QAAO,QAAQ,GAAG,KAAK;AACpD,SAAO;AACX;AAGO,SAAS,eAAe,MAAoB,OAAiC;AAChF,QAAM,QAAQ,eAAe,MAAM,KAAK;AACxC,MAAI,iBAAiB,QAAS,QAAO;AACrC,SAAO,gBAAgB,KAAK,UAAU,SAAS,KAAK,CAAC;AACzD;AAGO,SAAS,aAAa,MAAoB,OAAiC;AAC9E,QAAM,QAAQ,eAAe,MAAM,KAAK;AACxC,MAAI,iBAAiB,QAAS,QAAO;AACrC,SAAO,KAAK,UAAU,OAAO,KAAK;AACtC;AAQO,SAAS,gBAAgBC,SAA+C;AAC3E,SAAO,OAAOA,YAAW,WAAWA,UAAS,QAAQ,QAAQA,OAAM;AACvE;AAGO,SAAS,aAAaA,SAAyB;AAClD,SAAO,QAAQ,GAAG,OAAO,SAASA,OAAM,IAAI,MAAM,WAAWA,OAAM,IAAI,MAAM,UAAU,OAAO,CAAC;AACnG;AAGO,SAAS,cAAc,OAAyB;AACnD,SAAO,QAAQ,GAAG,MAAM,YAAY,KAAK,CAAC;AAC9C;AAOO,SAAS,QAAQ,OAAmC;AACvD,UAAQ,MAAM,MAAM;AAAA,IAChB,KAAK;AAAU,aAAO,MAAM,WAAW;AAAA,IACvC,KAAK;AAAW,aAAO,MAAM;AAAA,IAC7B,KAAK;AACD,UAAI,iBAAiB,MAAM,MAAM,MAAM,EAAG,QAAO;AACjD,UAAI,iBAAiB,MAAM,MAAM,OAAO,EAAG,QAAO;AAClD,aAAO;AAAA,IACX,KAAK;AAAS,aAAO;AAAA,IACrB;AAAS,YAAM,IAAI,MAAM,aAAa,OAAO,MAAM,IAAI,CAAC,uBAAuB;AAAA,EACnF;AACJ;AAWO,SAAS,eAAe,MAAoB,SAAmB,OAAO,GAA2B;AACpG,WAAS,IAAI,MAAM,IAAI,KAAK,OAAO,KAAK;AACpC,UAAMC,SAAQ,WAAW,KAAK,WAAW,KAAK,cAAc,CAAC,GAAG,SAAS,KAAK;AAC9E,QAAIA,WAAU,OAAW,QAAOA;AAAA,EACpC;AACA,SAAO;AACX;AAOO,SAAS,WAAW,WAAsB,SAAkB,SAAmB,iBAAkD;AACpI,UAAQ,QAAQ,MAAM;AAAA,IAClB,KAAK;AACD,UAAI,QAAQ,aAAa,iBAAiB;AACtC,mBAAW,QAAQ,QAAQ,QAAQ,EAAE,IAAI,GAAG;AACxC,cAAI,SAAS,OAAW,SAAQ,KAAK,CAAC;AAAA,mBAC7B,KAAK,SAAS,SAAU,SAAQ,KAAK,KAAK,MAAM;AAAA,mBAChD,KAAK,QAAS,QAAO,KAAK;AAAA,QACvC;AACA,eAAO;AAAA,MACX;AACA,aAAO,SAAS,WAAW,SAAS,OAAO;AAAA,IAC/C,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACD,aAAO,SAAS,WAAW,SAAS,OAAO;AAAA,IAC/C,KAAK;AACD,cAAQ,KAAK,CAAC;AACd,aAAO;AAAA,IACX,KAAK,UAAU;AACX,YAAM,SAAS,QAAQ;AACvB,UAAI,WAAW,QAAW;AACtB,YAAI,CAAC,QAAQ,aAAa,gBAAiB,SAAQ,KAAK,CAAC;AACzD,eAAO;AAAA,MACX;AACA,YAAMD,UAAS,UAAU,SAAS,MAAM;AACxC,UAAI,OAAOA,YAAW,SAAU,QAAOA;AACvC,cAAQ,KAAKA,OAAM;AACnB,aAAO;AAAA,IACX;AAAA,IACA;AAAS,YAAM,IAAI,MAAM,aAAa,OAAO,QAAQ,IAAI,CAAC,yBAAyB;AAAA,EACvF;AACJ;AAEA,SAAS,SAAS,WAAsB,SAAkB,SAA2C;AACjG,aAAW,SAAS,UAAU,YAAY,OAAO,GAAG;AAChD,QAAI,MAAM,SAAS,SAAU,SAAQ,KAAK,MAAM,MAAM;AAAA,aAC7C,MAAM,QAAS,QAAO,MAAM;AAAA,EACzC;AACA,SAAO;AACX;AAGO,SAAS,cAAcE,OAAc,WAA+B;AACvE,SAAO,YAAYA,OAAM,UAAU,OAAO,MAAM;AACpD;AAMO,SAAS,aAAa,SAA2B;AACpD,SAAO,QAAQ,SAAS,YAAY,QAAQ,WAAW,UAAa,CAAC,QAAQ,OAAO,UAAU,QAAQ,QAAQ,QAAQ,MAAM,IAAI;AACpI;AAGO,SAAS,YAAY,SAAyB;AACjD,UAAQ,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC;AAChC;;;ACpKA,SAAS,cAAc,MAAoB,OAAe,gBAAgB,OAA6B;AACnG,QAAM,UAAU,gBAAgB,KAAK,cAAc,KAAK,IAAI,KAAK,QAAQ,KAAK;AAC9E,MAAI,QAAQ,QAAS,QAAO;AAC5B,QAAM,QAAQ,KAAK,UAAU,QAAQ,OAAO;AAC5C,QAAM,SAAS,MAAM,WAAW,MAAM,GAAG,GAAG,CAAC,IAAI;AACjD,MAAI,QAAQ,YAAY,QAAQ,CAAC,QAAQ,QAAS,QAAO,QAAQ,GAAG,MAAM;AAC1E,SAAO;AACX;AAOA,SAAS,KAAK,QAA6B;AACvC,SAAO,QAAQ,QAAQ,MAAM,EAAE,cAAc;AACjD;AAOO,SAAS,OAAO,MAA6B;AAChD,QAAM,QAAQ,cAAc,MAAM,CAAC;AACnC,MAAI,iBAAiB,QAAS,QAAO;AACrC,QAAM,UAAU,cAAc,MAAM,CAAC;AACrC,MAAI,mBAAmB,QAAS,QAAO;AACvC,MAAI;AACJ,MAAI,QAAQ,YAAY,KAAK,QAAQ,SAAS,MAAM,KAAM,UAAS;AAAA,WAC1D,QAAQ,SAAS,KAAK,QAAQ,YAAY,MAAM,QAAS,UAAS;AAAA,MACtE,QAAO,QAAQ,QAAQ,SAAS;AAErC,QAAMC,SAAQ,SAAS,MAAM,OAAO,MAAM;AAC1C,QAAM,OAAiB,CAAC;AACxB,WAAS,IAAI,GAAG,IAAIA,QAAO,KAAK;AAC5B,UAAMC,QAAO,SAAS,QAAQ,GAAG,GAAG,CAAC,IAAI,QAAQ,GAAG,GAAG,CAAC;AACxD,QAAIA,UAAS,OAAW;AACxB,QAAIA,MAAK,QAAS,QAAO,QAAQ,GAAGA,KAAI;AACxC,QAAIA,MAAK,SAAS,WAAW;AACzB,UAAIA,MAAK,QAAS,MAAK,KAAK,CAAC;AAAA,IACjC,WAAWA,MAAK,SAAS,UAAU;AAC/B,UAAIA,MAAK,WAAW,EAAG,MAAK,KAAK,CAAC;AAAA,IACtC,MAAO,QAAO,QAAQ,QAAQ,SAAS;AAAA,EAC3C;AACA,MAAI,KAAK,WAAW,EAAG,QAAO,KAAK,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,IAAI,QAAQ,QAAQ,QAAQ;AAEtF,QAAM,SAAS,SAAS,IAAI,WAAW,KAAK,QAAQ,MAAM,OAAO,IAAI,IAAI,WAAW,MAAM,MAAM,KAAK,MAAM;AAC3G,OAAK,QAAQ,CAAC,MAAM,MAAM;AACtB,QAAI,QAAQ;AACR,eAAS,IAAI,GAAG,IAAI,MAAM,SAAS,IAAK,QAAO,IAAI,GAAG,GAAG,MAAM,GAAG,MAAM,CAAC,CAAC;AAAA,IAC9E,OAAO;AACH,eAAS,IAAI,GAAG,IAAI,MAAM,MAAM,IAAK,QAAO,IAAI,GAAG,GAAG,MAAM,GAAG,GAAG,IAAI,CAAC;AAAA,IAC3E;AAAA,EACJ,CAAC;AACD,SAAO,KAAK,MAAM;AACtB;AAQO,SAAS,OAAO,MAA6B;AAChD,QAAM,QAAQ,cAAc,MAAM,CAAC;AACnC,MAAI,iBAAiB,QAAS,QAAO;AACrC,QAAM,WAAW,aAAa,MAAM,CAAC;AACrC,MAAI,oBAAoB,QAAS,QAAO;AACxC,QAAM,cAAc,aAAa,MAAM,CAAC;AACxC,MAAI,uBAAuB,QAAS,QAAO;AAE3C,QAAMD,SAAQ,WAAW,MAAM,UAAU,MAAM;AAC/C,QAAM,QAAQ,WAAW,MAAM,OAAO,MAAM;AAC5C,QAAM,OAAO,CAAC,MAAc,OAAkC,WAAW,MAAM,GAAG,IAAI,IAAI,IAAI,MAAM,GAAG,MAAM,EAAE;AAC/G,QAAM,OAAO,CAAC,GAAW,MAAuB;AAC5C,aAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAC5B,UAAI,CAAC,SAAS,KAAK,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,EAAG,QAAO;AAAA,IAClD;AACA,WAAO;AAAA,EACX;AAGA,QAAM,QAAkB,CAAC;AACzB,QAAM,cAAc,oBAAI,IAAoB;AAC5C,WAAS,IAAI,GAAG,IAAIA,QAAO,KAAK;AAC5B,UAAM,KAAK,CAAC;AACZ,aAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AACxB,UAAI,MAAM,CAAC,MAAM,KAAK,KAAK,GAAG,CAAC,GAAG;AAC9B,cAAM,CAAC,IAAI;AACX;AAAA,MACJ;AAAA,IACJ;AACA,UAAM,OAAO,UAAU,OAAO,CAAC;AAC/B,gBAAY,IAAI,OAAO,YAAY,IAAI,IAAI,KAAK,KAAK,CAAC;AAAA,EAC1D;AACA,QAAM,OAAiB,CAAC;AACxB,WAAS,IAAI,GAAG,IAAIA,QAAO,KAAK;AAC5B,QAAI,MAAM,CAAC,MAAM,MAAM,CAAC,eAAe,YAAY,IAAI,CAAC,MAAM,GAAI,MAAK,KAAK,CAAC;AAAA,EACjF;AACA,MAAI,KAAK,WAAW,EAAG,QAAO,QAAQ,QAAQ,QAAQ;AAEtD,QAAM,SAAS,WAAW,IAAI,WAAW,OAAO,KAAK,MAAM,IAAI,IAAI,WAAW,KAAK,QAAQ,KAAK;AAChG,OAAK,QAAQ,CAAC,MAAM,MAAM;AACtB,aAAS,KAAK,GAAG,KAAK,OAAO,MAAM;AAC/B,UAAI,SAAU,QAAO,IAAI,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;AAAA,UACzC,QAAO,IAAI,GAAG,IAAI,KAAK,MAAM,EAAE,CAAC;AAAA,IACzC;AAAA,EACJ,CAAC;AACD,SAAO,KAAK,MAAM;AACtB;AAEA,SAAS,SAAS,GAAsB,GAA+B;AACnE,MAAI,MAAM,UAAa,MAAM,OAAW,QAAO,MAAM;AACrD,SAAO,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,cAAc,GAAG,CAAC,MAAM;AAC3F;AAQO,SAAS,KAAK,MAA6B;AAE9C,QAAM,QAAQ,cAAc,MAAM,GAAG,IAAI;AACzC,MAAI,iBAAiB,QAAS,QAAO;AACrC,MAAI,QAAQ;AACZ,MAAI,KAAK,IAAI,CAAC,GAAG;AACb,UAAM,QAAQ,eAAe,MAAM,CAAC;AACpC,QAAI,iBAAiB,QAAS,QAAO;AACrC,YAAQ;AAAA,EACZ;AACA,QAAM,aAAa,cAAc,MAAM,CAAC;AACxC,MAAI,sBAAsB,QAAS,QAAO;AAC1C,QAAM,WAAW,aAAa,MAAM,CAAC;AACrC,MAAI,oBAAoB,QAAS,QAAO;AACxC,UAAQ,KAAK,MAAM,KAAK;AACxB,QAAM,QAAQ,WAAW,MAAM,UAAU,MAAM;AAC/C,QAAME,UAAS,WAAW,MAAM,OAAO,MAAM;AAC7C,MAAI,QAAQ,KAAK,QAAQA,QAAQ,QAAO,QAAQ,QAAQ,SAAS;AACjE,QAAM,KAAK,QAAQ;AACnB,QAAM,OAA8B,CAAC;AACrC,WAAS,IAAI,GAAG,IAAI,OAAO,IAAK,MAAK,KAAK,WAAW,MAAM,GAAG,IAAI,CAAC,IAAI,MAAM,GAAG,GAAG,EAAE,CAAC;AACtF,QAAM,QAAQ,WAAW,CAAC,EAAE,MAAM,WAAW,CAAC,GAAG,KAAK;AACtD,MAAI,UAAU,OAAW,QAAO,KAAK,UAAU,OAAO;AACtD,SAAO,KAAK,QAAQ,OAAO,OAAO,QAAQ,CAAC;AAC/C;AAOO,SAAS,OAAO,MAA6B;AAChD,QAAM,QAAQ,cAAc,MAAM,CAAC;AACnC,MAAI,iBAAiB,QAAS,QAAO;AACrC,MAAI;AACJ,QAAM,OAAkB,CAAC;AACzB,WAAS,IAAI,GAAG,IAAI,KAAK,OAAO,KAAK,GAAG;AACpC,UAAM,KAAK,cAAc,MAAM,CAAC;AAChC,QAAI,cAAc,QAAS,QAAO;AAClC,QAAI;AACJ,QAAI,GAAG,YAAY,KAAK,GAAG,SAAS,MAAM,SAAS,GAAG,OAAO,KAAK,MAAM,YAAY,GAAI,WAAU;AAAA,aACzF,GAAG,SAAS,KAAK,GAAG,YAAY,MAAM,WAAW,GAAG,UAAU,EAAG,WAAU;AAAA,QAC/E,QAAO,QAAQ,QAAQ,SAAS;AACrC,QAAI,aAAa,UAAa,aAAa,QAAS,QAAO,QAAQ,QAAQ,SAAS;AACpF,eAAW;AACX,UAAM,aAAa,cAAc,MAAM,IAAI,CAAC;AAC5C,QAAI,sBAAsB,QAAS,QAAO;AAC1C,UAAM,SAAS,UAAU,GAAG,UAAU,GAAG;AACzC,UAAM,SAAgC,CAAC;AACvC,aAAS,IAAI,GAAG,IAAI,QAAQ,IAAK,QAAO,KAAK,UAAU,GAAG,GAAG,GAAG,CAAC,IAAI,GAAG,GAAG,GAAG,CAAC,CAAC;AAChF,SAAK,KAAK,EAAE,MAAM,QAAQ,WAAW,CAAC;AAAA,EAC1C;AACA,QAAM,QAAQ,aAAa,OAAO,MAAM,UAAU,MAAM;AACxD,QAAM,QAAQ,WAAW,MAAM,KAAK;AACpC,MAAI,UAAU,OAAW,QAAO,KAAK,UAAU,OAAO;AACtD,SAAO,KAAK,QAAQ,OAAO,OAAO,aAAa,IAAI,CAAC;AACxD;AAcA,SAAS,WAAW,MAA0B,OAAqC;AAC/E,aAAW,EAAE,MAAM,QAAQ,WAAW,KAAK,MAAM;AAC7C,QAAI,CAAC,iBAAiB,QAAQ,UAAU,EAAG,QAAO;AAAA,EACtD;AACA,QAAM,QAAkB,CAAC;AACzB,WAAS,IAAI,GAAG,IAAI,OAAO,IAAK,OAAM,KAAK,CAAC;AAC5C,SAAO,MAAM,SAAS,CAAC,GAAG,MAAM;AAC5B,eAAW,EAAE,MAAM,QAAQ,WAAW,KAAK,MAAM;AAC7C,YAAM,IAAI,OAAO,CAAC;AAClB,YAAM,IAAI,OAAO,CAAC;AAClB,UAAI;AACJ,UAAI,MAAM,UAAa,MAAM,OAAW,YAAW;AAAA,eAC1C,MAAM,OAAW,YAAW;AAAA,eAC5B,MAAM,OAAW,YAAW;AAAA,UAChC,YAAW,aAAa,CAAC,YAAY,GAAG,CAAC,IAAI,YAAY,GAAG,CAAC;AAClE,UAAI,aAAa,EAAG,QAAO;AAAA,IAC/B;AACA,WAAO,IAAI;AAAA,EACf,CAAC;AACL;AAEA,SAAS,aAAaC,QAA2B;AAC7C,SAAO,YAAY,QAAQA,MAAK;AACpC;AAGA,SAAS,YAAY,GAAU,GAAkB;AAC7C,MAAI,EAAE,WAAW,EAAE,QAAS,QAAO,KAAK,KAAK,aAAa,EAAE,KAAK,IAAI,aAAa,EAAE,KAAK,CAAC;AAC1F,MAAI,EAAE,QAAS,QAAO;AACtB,MAAI,EAAE,QAAS,QAAO;AACtB,SAAO,cAAc,GAAG,CAAC;AAC7B;AAOA,SAAS,iBAAiB,QAAwC,YAA8B;AAC5F,QAAM,SAAuB,CAAC;AAC9B,aAAW,SAAS,QAAQ;AACxB,QAAI,OAAO,YAAY,QAAQ,CAAC,OAAO,SAAS,MAAM,KAAK,EAAG,QAAO,KAAK,MAAM,KAAK;AAAA,EACzF;AACA,MAAI,OAAO,SAAS,EAAG,QAAO;AAC9B,MAAI,cAAc,OAAO,KAAK,OAAK,aAAa,CAAC,IAAI,aAAa,MAAM,CAAC,EAAG,QAAO;AACnF,QAAM,WAAW,OAAO,SAAS,CAAC,GAAG,MAAM,aAAa,CAAC,IAAI,aAAa,CAAC,CAAC;AAC5E,QAAM,SAAS,OAAO,SAAS,iBAAiB;AAChD,SAAO,SAAS,MAAM,CAAC,GAAG,MAAM,MAAM,OAAO,CAAC,CAAC;AACnD;AAEA,SAAS,QAAQ,OAAmB,OAA0B,UAA+B;AACzF,QAAM,SAAS,IAAI,WAAW,MAAM,MAAM,MAAM,OAAO;AACvD,QAAM,QAAQ,CAAC,MAAM,MAAM;AACvB,QAAI,UAAU;AACV,eAAS,IAAI,GAAG,IAAI,MAAM,MAAM,IAAK,QAAO,IAAI,GAAG,GAAG,MAAM,GAAG,GAAG,IAAI,CAAC;AAAA,IAC3E,OAAO;AACH,eAAS,IAAI,GAAG,IAAI,MAAM,SAAS,IAAK,QAAO,IAAI,GAAG,GAAG,MAAM,GAAG,MAAM,CAAC,CAAC;AAAA,IAC9E;AAAA,EACJ,CAAC;AACD,SAAO;AACX;AAGA,SAAS,cAAc,MAAoB,OAAkC;AACzE,MAAI,CAAC,KAAK,IAAI,KAAK,EAAG,QAAO;AAC7B,QAAM,QAAQ,eAAe,MAAM,KAAK;AACxC,MAAI,iBAAiB,QAAS,QAAO;AACrC,MAAI,UAAU,KAAK,UAAU,GAAI,QAAO,QAAQ,QAAQ,SAAS;AACjE,SAAO,UAAU;AACrB;AAGA,SAAS,aAAa,MAAoB,OAAkC;AACxE,MAAI,CAAC,KAAK,IAAI,KAAK,EAAG,QAAO;AAC7B,QAAM,QAAQ,eAAe,MAAM,KAAK;AACxC,MAAI,iBAAiB,QAAS,QAAO;AACrC,MAAI,UAAU,OAAW,QAAO;AAChC,MAAI,MAAM,SAAS,UAAW,QAAO,MAAM;AAC3C,MAAI,MAAM,SAAS,SAAU,QAAO,MAAM,WAAW;AACrD,SAAO,QAAQ,QAAQ,SAAS;AACpC;AAMO,SAAS,SAAS,MAA6B;AAClD,QAAM,YAAY,eAAe,MAAM,CAAC;AACxC,MAAI,qBAAqB,QAAS,QAAO;AACzC,MAAI,UAAU;AACd,MAAI,KAAK,IAAI,CAAC,GAAG;AACb,UAAM,QAAQ,eAAe,MAAM,CAAC;AACpC,QAAI,iBAAiB,QAAS,QAAO;AACrC,cAAU;AAAA,EACd;AACA,MAAI,QAAQ;AACZ,MAAI,KAAK,IAAI,CAAC,GAAG;AACb,UAAM,QAAQ,eAAe,MAAM,CAAC;AACpC,QAAI,iBAAiB,QAAS,QAAO;AACrC,YAAQ;AAAA,EACZ;AACA,MAAI,OAAO;AACX,MAAI,KAAK,IAAI,CAAC,GAAG;AACb,UAAM,QAAQ,eAAe,MAAM,CAAC;AACpC,QAAI,iBAAiB,QAAS,QAAO;AACrC,WAAO;AAAA,EACX;AACA,QAAM,OAAO,KAAK,MAAM,SAAS;AACjC,YAAU,KAAK,MAAM,OAAO;AAC5B,MAAI,OAAO,KAAK,UAAU,EAAG,QAAO,QAAQ,QAAQ,SAAS;AAC7D,MAAI,SAAS,KAAK,YAAY,EAAG,QAAO,QAAQ,QAAQ,QAAQ;AAChE,MAAI,OAAO,UAAU,WAAW,UAAW,QAAO,QAAQ,QAAQ,OAAO;AACzE,QAAM,SAAS,IAAI,WAAW,MAAM,OAAO;AAC3C,MAAI,IAAI;AACR,WAAS,IAAI,GAAG,IAAI,OAAO,MAAM,KAAK;AAClC,aAAS,IAAI,GAAG,IAAI,OAAO,SAAS,IAAK,QAAO,IAAI,GAAG,GAAG,MAAM,WAAW,QAAQ,OAAO,GAAG,CAAC;AAAA,EAClG;AACA,SAAO,QAAQ,QAAQ,MAAM;AACjC;AAGO,SAAS,UAAU,MAA6B;AACnD,QAAM,QAAQ,cAAc,MAAM,CAAC;AACnC,MAAI,iBAAiB,QAAS,QAAO;AACrC,QAAM,SAAS,IAAI,WAAW,MAAM,SAAS,MAAM,IAAI;AACvD,WAAS,IAAI,GAAG,IAAI,MAAM,MAAM,KAAK;AACjC,aAAS,IAAI,GAAG,IAAI,MAAM,SAAS,IAAK,QAAO,IAAI,GAAG,GAAG,MAAM,GAAG,GAAG,CAAC,CAAC;AAAA,EAC3E;AACA,SAAO,KAAK,MAAM;AACtB;AAOO,SAAS,WAAW,MAA6B;AACpD,QAAM,SAAuB,CAAC;AAC9B,WAAS,IAAI,GAAG,IAAI,KAAK,OAAO,KAAK;AACjC,QAAI,CAAC,KAAK,IAAI,CAAC,EAAG,QAAO,QAAQ,QAAQ,SAAS;AAClD,UAAM,QAAQ,cAAc,MAAM,GAAG,IAAI;AACzC,QAAI,iBAAiB,QAAS,QAAO;AACrC,UAAMC,QAAO,OAAO,CAAC;AACrB,QAAIA,UAAS,WAAc,MAAM,SAASA,MAAK,QAAQ,MAAM,YAAYA,MAAK,SAAU,QAAO,QAAQ,QAAQ,SAAS;AACxH,WAAO,KAAK,KAAK;AAAA,EACrB;AACA,QAAM,OAAO,UAAU,QAAQ,CAAC;AAChC,MAAIC,OAAM;AACV,WAAS,IAAI,GAAG,IAAI,KAAK,MAAM,KAAK;AAChC,aAAS,IAAI,GAAG,IAAI,KAAK,SAAS,KAAK;AACnC,UAAIC,WAAU;AACd,iBAAW,SAAS,QAAQ;AACxB,cAAM,QAAQ,MAAM,GAAG,GAAG,CAAC;AAC3B,YAAI,OAAO,YAAY,KAAM,QAAO,QAAQ,GAAG,KAAK;AACpD,QAAAA,YAAW,OAAO,SAAS,WAAW,MAAM,SAAS;AAAA,MACzD;AACA,MAAAD,QAAOC;AAAA,IACX;AAAA,EACJ;AACA,SAAO,aAAaD,IAAG;AAC3B;;;ACnWO,SAAS,IAAI,MAA6B;AAC7C,QAAM,UAAoB,CAAC;AAC3B,QAAME,SAAQ,eAAe,MAAM,OAAO;AAC1C,SAAOA,WAAU,SAAY,QAAQ,QAAQA,MAAK,IAAI,MAAM,OAAO;AACvE;AAMO,SAAS,MAAM,SAAqC;AACvD,MAAI,QAAQ;AACZ,WAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACrC,UAAM,IAAI,QAAQ,CAAC;AACnB,YAAQ,MAAM,QAAQ,SAAS,IAAI,SAAS,OAAO,CAAC,IAAI,QAAQ;AAAA,EACpE;AACA,SAAO,aAAa,KAAK;AAC7B;AAEO,SAAS,QAAQ,MAA6B;AACjD,QAAM,UAAoB,CAAC;AAC3B,QAAMA,SAAQ,eAAe,MAAM,OAAO;AAC1C,SAAOA,WAAU,SAAY,QAAQ,QAAQA,MAAK,IAAI,UAAU,OAAO;AAC3E;AAGO,SAAS,UAAU,SAAqC;AAC3D,MAAI,QAAQ,WAAW,EAAG,QAAO,QAAQ,QAAQ,SAAS;AAC1D,MAAI,QAAQ;AACZ,aAAW,KAAK,QAAS,UAAS;AAClC,SAAO,aAAa,QAAQ,QAAQ,MAAM;AAC9C;AAEO,SAAS,IAAI,MAA6B;AAC7C,QAAM,UAAoB,CAAC;AAC3B,QAAMA,SAAQ,eAAe,MAAM,OAAO;AAC1C,SAAOA,WAAU,SAAY,QAAQ,QAAQA,MAAK,IAAI,MAAM,OAAO;AACvE;AAGO,SAAS,MAAM,SAAqC;AACvD,MAAIC,SAAQ,QAAQ,WAAW,IAAI,IAAI;AACvC,aAAW,KAAK,QAAS,CAAAA,SAAQ,KAAK,IAAIA,QAAO,CAAC;AAClD,SAAO,QAAQ,GAAG,MAAM,WAAWA,MAAK,CAAC;AAC7C;AAEO,SAAS,IAAI,MAA6B;AAC7C,QAAM,UAAoB,CAAC;AAC3B,QAAMD,SAAQ,eAAe,MAAM,OAAO;AAC1C,SAAOA,WAAU,SAAY,QAAQ,QAAQA,MAAK,IAAI,MAAM,OAAO;AACvE;AAGO,SAAS,MAAM,SAAqC;AACvD,MAAIE,YAAW,QAAQ,WAAW,IAAI,IAAI;AAC1C,aAAW,KAAK,QAAS,CAAAA,YAAW,KAAK,IAAIA,WAAU,CAAC;AACxD,SAAO,QAAQ,GAAG,MAAM,WAAWA,SAAQ,CAAC;AAChD;AAOO,SAAS,MAAM,MAA6B;AAC/C,QAAM,YAAY,KAAK;AACvB,MAAI,UAAU;AACd,WAAS,IAAI,GAAG,IAAI,KAAK,OAAO,KAAK;AACjC,UAAM,UAAU,KAAK,cAAc,CAAC;AACpC,YAAQ,QAAQ,MAAM;AAAA,MAClB,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACD,mBAAW,SAAS,UAAU,YAAY,OAAO,GAAG;AAChD,cAAI,MAAM,SAAS,SAAU;AAAA,QACjC;AACA;AAAA,MACJ,KAAK;AACD;AACA;AAAA,MACJ,KAAK,UAAU;AACX,cAAM,SAAS,QAAQ;AACvB,YAAI,WAAW,OAAW;AAC1B,YAAI,OAAO,SAAS,YAAY,OAAO,SAAS,UAAW;AAAA,iBAClD,OAAO,SAAS,UAAU,cAAc,OAAO,MAAM,SAAS,EAAG;AAC1E;AAAA,MACJ;AAAA,MACA;AAAS,cAAM,IAAI,MAAM,aAAa,OAAO,QAAQ,IAAI,CAAC,yBAAyB;AAAA,IACvF;AAAA,EACJ;AACA,SAAO,QAAQ,GAAG,MAAM,WAAW,OAAO,CAAC;AAC/C;AASO,SAAS,OAAO,MAA6B;AAChD,QAAM,YAAY,KAAK;AACvB,MAAI,UAAU;AACd,WAAS,IAAI,GAAG,IAAI,KAAK,OAAO,KAAK;AACjC,UAAM,UAAU,KAAK,cAAc,CAAC;AACpC,QAAI,QAAQ,aAAa,QAAQ,SAAS,SAAS;AAC/C;AACA;AAAA,IACJ;AACA,YAAQ,QAAQ,MAAM;AAAA,MAClB,KAAK;AACD,YAAI,QAAQ,WAAW;AACnB,gBAAM,QAAQ,QAAQ,QAAQ;AAC9B,qBAAW,MAAM,OAAO,MAAM;AAC9B;AAAA,QACJ;AACA,mBAAW,KAAK,UAAU,YAAY,OAAO,EAAG;AAChD;AAAA,MACJ,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACD,mBAAW,KAAK,UAAU,YAAY,OAAO,EAAG;AAChD;AAAA,MACJ,KAAK;AACD;AACA;AAAA,MACJ,KAAK;AACD,YAAI,QAAQ,WAAW,OAAW;AAClC;AAAA,MACJ;AAAS,cAAM,IAAI,MAAM,aAAa,OAAO,QAAQ,IAAI,CAAC,yBAAyB;AAAA,IACvF;AAAA,EACJ;AACA,SAAO,QAAQ,GAAG,MAAM,WAAW,OAAO,CAAC;AAC/C;AAEO,SAAS,WAAW,MAA6B;AACpD,QAAM,OAAO,KAAK,QAAQ,CAAC;AAC3B,MAAI,QAAQ,IAAI,EAAG,QAAO,SAAS,IAAI;AACvC,QAAM,YAAY,KAAK,UAAU,SAAS,IAAI;AAC9C,MAAI,QAAQ;AACZ,MAAI,cAAc,QAAW;AACzB,UAAMC,QAAO,QAAQ,SAAS;AAC9B,QAAIA,UAAS,OAAW,QAAO,QAAQ,QAAQ,UAAU,UAAU,UAAU,QAAQ,SAAS;AAC9F,YAAQA;AAAA,EACZ;AAGA,MAAI,MAAO,QAAO,KAAK,IAAI,CAAC,IAAI,KAAK,cAAc,CAAC,IAAI,QAAQ,GAAG,MAAM,WAAW,CAAC,CAAC;AACtF,MAAI,KAAK,QAAQ,EAAG,QAAO,cAAc,KAAK;AAC9C,SAAO,KAAK,IAAI,CAAC,IAAI,KAAK,cAAc,CAAC,IAAI,QAAQ,GAAG,MAAM,WAAW,CAAC,CAAC;AAC/E;AAQO,SAAS,QAAQ,MAA6B;AACjD,QAAM,UAAU,KAAK,QAAQ,CAAC;AAC9B,MAAI,QAAQ,OAAO,EAAG,QAAO,SAAS,IAAI;AAC1C,QAAM,QAAQ,KAAK,UAAU,SAAS,OAAO;AAC7C,MAAI,OAAO,YAAY,QAAQ,MAAM,UAAU,mBAAmB,MAAM,UAAU,SAAU,QAAO,WAAW,IAAI;AAClH,SAAO,QAAQ,SAAS,KAAK;AACjC;AAGO,SAAS,WAAW,MAA6B;AACpD,MAAI,CAAC,KAAK,IAAI,CAAC,EAAG,QAAO,QAAQ;AACjC,QAAM,WAAW,KAAK,QAAQ,CAAC;AAC/B,MAAI,SAAS,SAAS,SAAU,QAAO;AACvC,MAAI,QAAQ,QAAQ,EAAG,QAAO,SAAS,IAAI;AAC3C,SAAO,QAAQ,SAAS,KAAK,UAAU,SAAS,QAAQ,CAAC;AAC7D;AAEO,SAAS,QAAQ,MAA6B;AACjD,QAAM,UAAU,KAAK,SAAS,CAAC;AAC/B,MAAI,QAAQ,OAAO,EAAG,QAAO,SAAS,IAAI;AAC1C,QAAM,QAAQ,KAAK,UAAU,SAAS,OAAO;AAC7C,MAAI,OAAO,YAAY,SAAS,MAAM,UAAU,mBAAmB,MAAM,UAAU,UAAW,QAAO,QAAQ,GAAG,KAAK;AACrH,SAAO,cAAc,OAAO,YAAY,IAAI;AAChD;AAEO,SAASC,OAAM,MAA6B;AAC/C,QAAM,YAAY,KAAK;AACvB,QAAM,QAAQ,KAAK,QAAQ,CAAC;AAC5B,QAAM,SAAS,KAAK,QAAQ,CAAC;AAC7B,MAAI,QAAQ,KAAK,KAAK,QAAQ,MAAM,EAAG,QAAO,SAAS,IAAI;AAC3D,QAAMC,UAAS,UAAU,SAAS,UAAU,SAAS,KAAK,CAAC;AAC3D,MAAI,OAAOA,YAAW,SAAU,QAAO,QAAQ,QAAQA,OAAM;AAC7D,QAAM,SAAS,UAAU,SAAS,UAAU,SAAS,MAAM,CAAC;AAC5D,MAAI,OAAO,WAAW,SAAU,QAAO,QAAQ,QAAQ,MAAM;AAC7D,SAAO,aAAa,QAAQA,SAAQ,KAAK,MAAM,MAAM,GAAG,kBAAkB,CAAC;AAC/E;AAGO,SAAS,QAAQ,MAAoB,UAAkD;AAC1F,QAAMA,UAAS,eAAe,MAAM,CAAC;AACrC,MAAIA,mBAAkB,QAAS,QAAOA;AACtC,QAAM,SAAS,eAAe,MAAM,CAAC;AACrC,MAAI,kBAAkB,QAAS,QAAO;AACtC,SAAO,aAAa,QAAQA,SAAQ,KAAK,MAAM,MAAM,GAAG,QAAQ,CAAC;AACrE;;;AC5MO,SAAS,MAAM,MAA6B;AAAE,SAAO,qBAAqB,MAAM,OAAO,IAAI;AAAG;AAC9F,SAAS,OAAO,MAA6B;AAAE,SAAO,qBAAqB,MAAM,OAAO,KAAK;AAAG;AAChG,SAAS,QAAQ,MAA6B;AAAE,SAAO,qBAAqB,MAAM,SAAS,IAAI;AAAG;AAClG,SAAS,SAAS,MAA6B;AAAE,SAAO,qBAAqB,MAAM,SAAS,KAAK;AAAG;AACpG,SAAS,UAAU,MAA6B;AAAE,SAAO,qBAAqB,MAAM,WAAW,IAAI;AAAG;AACtG,SAAS,WAAW,MAA6B;AAAE,SAAO,qBAAqB,MAAM,WAAW,KAAK;AAAG;AACxG,SAAS,OAAO,MAA6B;AAAE,SAAO,qBAAqB,MAAM,WAAW,KAAK;AAAG;AACpG,SAAS,OAAO,MAA6B;AAAE,SAAO,qBAAqB,MAAM,WAAW,KAAK;AAAG;AAGpG,SAAS,WAAW,MAA6B;AACpD,QAAM,UAAU,KAAK,QAAQ,CAAC;AAC9B,MAAI,QAAQ,QAAS,QAAO;AAC5B,QAAM,QAAQ,cAAc,KAAK,OAAO;AACxC,MAAI,UAAU,OAAW,QAAO,QAAQ,QAAQ,SAAS;AACzD,MAAIC,SAAQ,MAAM;AAClB,aAAW,YAAY,MAAM,SAAS,GAAG;AACrC,UAAM,QAAQ,MAAM,KAAK,QAAQ;AACjC,QAAI,UAAU,UAAa,EAAE,MAAM,SAAS,UAAU,MAAM,KAAK,WAAW,GAAI,CAAAA;AAAA,EACpF;AACA,SAAO,QAAQ,GAAG,MAAM,WAAWA,MAAK,CAAC;AAC7C;AASA,SAAS,qBAAqB,MAAoBC,YAA8B,QAA0B;AACtG,QAAM,WAAWA,eAAc;AAC/B,QAAM,OAAO,UAAU,WAAW,IAAI;AACtC,QAAM,aAA0B,CAAC;AACjC,WAAS,IAAI,MAAM,KAAK,SAAS,IAAI,KAAK,QAAQ,KAAK,GAAG;AACtD,UAAM,UAAU,KAAK,QAAQ,CAAC;AAC9B,QAAI,QAAQ,QAAS,QAAO;AAC5B,UAAM,QAAQ,cAAc,KAAK,OAAO;AACxC,QAAI,UAAU,OAAW,QAAO,QAAQ,QAAQ,SAAS;AACzD,UAAM,mBAAmB,KAAK,QAAQ,IAAI,CAAC;AAC3C,QAAI,QAAQ,gBAAgB,EAAG,QAAO,SAAS,IAAI;AACnD,UAAM,YAAY,UAAU,MAAM,KAAK,UAAU,SAAS,gBAAgB,GAAG,KAAK,UAAU,OAAO;AAEnG,QAAI,cAAc,OAAW,QAAO,KAAK,UAAU,OAAO;AAC1D,UAAM,iBAAiB,WAAW,CAAC;AACnC,QAAI,mBAAmB,UAAa,CAAC,MAAM,UAAU,eAAe,KAAK,EAAG,QAAO,QAAQ,QAAQ,SAAS;AAC5G,eAAW,KAAK,EAAE,OAAO,MAAM,UAAU,CAAC;AAAA,EAC9C;AACA,QAAM,UAAU,WAAW,CAAC;AAC5B,MAAI,YAAY,OAAW,OAAM,IAAI,MAAM,+DAA+D;AAC1G,QAAM,QAAQ,QAAQ;AACtB,MAAI;AACJ,MAAI,CAAC,UAAU;AACX,UAAM,UAAU,UAAU,KAAK,QAAQ,IAAI,KAAK,QAAQ,CAAC,IAAI,KAAK,QAAQ,CAAC;AAC3E,QAAI,QAAQ,QAAS,QAAO;AAC5B,cAAU,cAAc,KAAK,OAAO;AACpC,QAAI,YAAY,OAAW,QAAO,QAAQ,QAAQ,SAAS;AAC3D,QAAI,CAAC,QAAQ,UAAU,KAAK,GAAG;AAE3B,UAAI,CAAC,OAAQ,QAAO,QAAQ,QAAQ,SAAS;AAG7C,YAAM,oBAAoB,iBAAiB,KAAK,SAAS,CAAC,CAAC;AAC3D,YAAM,kBAAkB,KAAK,QAAQ,IAAI,iBAAiB,KAAK,SAAS,CAAC,CAAC,IAAI;AAC9E,UAAI,QAAQ,SAAS,UAAU,KAAK,SAAS,KACtC,sBAAsB,UAAa,kBAAkB,WACrD,oBAAoB,UAAa,gBAAgB,QAAS,QAAO,KAAK,UAAU,OAAO;AAC9F,YAAM,IAAI,QAAQ;AAClB,UAAI,EAAE,OAAO,MAAM,OAAO,YAAY,EAAE,UAAU,MAAM,UAAU,YAAa,QAAO,QAAQ,QAAQ,OAAO;AAC7G,gBAAU,IAAI;AAAA,QAAc,QAAQ,UAAU,IAAI,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,MAAM,OAAO,GAAG,EAAE,UAAU,MAAM,UAAU,CAAC,CAAC;AAAA,QAC7H,MAAM;AAAA,QAAM,MAAM;AAAA,MAAO;AAAA,IACjC;AAAA,EACJ;AAIA,QAAM,WAAW,oBAAI,IAAY;AACjC,MAAI,YAAY,QAAW;AACvB,eAAW,aAAa,WAAY,YAAW,YAAY,UAAU,MAAM,SAAS,EAAG,UAAS,IAAI,QAAQ;AAAA,EAChH,OAAO;AACH,eAAW,YAAY,QAAQ,SAAS,EAAG,UAAS,IAAI,QAAQ;AAAA,EACpE;AACA,QAAM,YAAY,CAAC,GAAG,QAAQ,EAAE,SAAS,CAAC,GAAG,MAAM,IAAI,CAAC;AACxD,QAAM,eAAe,YAAY,WAAW,MAAM,OAAK,EAAE,KAAK,QAAQ,MAAS,MAAM,IAAI;AACzF,MAAID,SAAQ,eAAe,MAAM,QAAQ,UAAU,SAAS;AAC5D,MAAI,QAAQ;AACZ,MAAI,UAAU;AACd,aAAW,YAAY,WAAW;AAC9B,QAAI,UAAU;AACd,eAAW,aAAa,YAAY;AAChC,YAAM,QAAQ,UAAU,KAAK,QAAQ,UAAU,MAAM,KAAK,QAAQ,CAAC;AAEnE,UAAI,UAAU,OAAW,QAAO,KAAK,UAAU,OAAO;AACtD,UAAI,CAAC,MAAO,WAAU;AAAA,IAC1B;AACA,QAAI,CAAC,QAAS;AACd,QAAI,YAAY,QAAW;AACvB,MAAAA;AACA;AAAA,IACJ;AACA,UAAM,QAAQ,QAAQ,KAAK,QAAQ;AACnC,QAAI,OAAO,YAAY,KAAM,QAAO,QAAQ,GAAG,KAAK;AACpD,QAAI,OAAO,SAAS,SAAU;AAC9B,UAAME,UAAS,MAAM;AACrB,QAAIF,WAAU,EAAG,WAAUE;AAAA,QACtB,WAAUD,eAAc,YAAY,KAAK,IAAI,SAASC,OAAM,IAAI,KAAK,IAAI,SAASA,OAAM;AAC7F,aAASA;AACT,IAAAF;AAAA,EACJ;AACA,UAAQC,YAAW;AAAA,IACf,KAAK;AAAS,aAAO,QAAQ,GAAG,MAAM,WAAWD,MAAK,CAAC;AAAA,IACvD,KAAK;AAAW,aAAOA,WAAU,IAAI,QAAQ,QAAQ,SAAS,IAAI,aAAa,QAAQA,MAAK;AAAA,IAC5F,KAAK;AAAA,IACL,KAAK;AACD,aAAO,QAAQ,GAAG,MAAM,WAAW,OAAO,CAAC;AAAA,IAC/C,KAAK;AAAO,aAAO,aAAa,KAAK;AAAA,IACrC;AAAS,YAAM,IAAI,MAAM,aAAa,OAAOC,UAAS,CAAC,+BAA+B;AAAA,EAC1F;AACJ;AAGA,IAAM,gBAAN,MAAM,eAAc;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EAET,YAAY,SAAkB,MAAc,SAAiB;AACzD,SAAK,WAAW;AAChB,SAAK,OAAO;AACZ,SAAK,UAAU;AAAA,EACnB;AAAA,EAEA,IAAI,QAAgB;AAChB,WAAO,KAAK,OAAO,KAAK;AAAA,EAC5B;AAAA,EAEA,UAAU,OAA+B;AACrC,WAAO,KAAK,SAAS,MAAM,QAAQ,KAAK,YAAY,MAAM;AAAA,EAC9D;AAAA,EAEA,OAAO,KAAK,SAA6C;AACrD,YAAQ,QAAQ,MAAM;AAAA,MAClB,KAAK;AAAQ,eAAO,IAAI,eAAc,SAAS,QAAQ,KAAK,MAAM,QAAQ,KAAK,OAAO;AAAA,MACtF,KAAK;AAAU,eAAO,IAAI,eAAc,SAAS,QAAQ,SAAS,EAAE,QAAQ,CAAC;AAAA,MAC7E,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACD,eAAO;AAAA,MACX;AAAS,cAAM,IAAI,MAAM,aAAa,OAAO,QAAQ,IAAI,CAAC,yBAAyB;AAAA,IACvF;AAAA,EACJ;AAAA;AAAA,EAGA,KAAK,UAAqC;AACtC,UAAM,UAAU,KAAK;AACrB,QAAI,QAAQ,SAAS,QAAQ;AACzB,aAAO,QAAQ,QAAQ,EAAE,KAAK,IAAI,YAAY,QAAQ,KAAK,OAAO,KAAK,MAAM,WAAW,KAAK,OAAO,GAAG,QAAQ,KAAK,UAAU,WAAW,KAAK,OAAO,CAAC;AAAA,IAC1J;AACA,WAAO,QAAQ,SAAS,EAAE,QAAQ;AAAA,EACtC;AAAA;AAAA,EAGA,CAAC,WAA8B;AAC3B,UAAM,UAAU,KAAK;AACrB,QAAI,QAAQ,SAAS,QAAQ;AACzB,iBAAW,WAAW,QAAQ,QAAQ,EAAE,WAAW,QAAQ,IAAI,GAAG;AAC9D,eAAO,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,UAAU,QAAQ,SAAS,QAAQ,KAAK;AAAA,MAC3F;AAAA,IACJ,OAAO;AACH,YAAME,UAAS,QAAQ,SAAS;AAChC,eAAS,IAAI,GAAG,IAAI,KAAK,MAAM,IAAK,KAAIA,QAAO,CAAC,MAAM,OAAW,OAAM;AAAA,IAC3E;AAAA,EACJ;AACJ;AAKA,SAAS,mBAAmBC,OAAuB;AAC/C,WAAS,IAAI,GAAG,IAAIA,MAAK,QAAQ,KAAK;AAClC,UAAM,IAAIA,MAAK,OAAO,CAAC;AACvB,QAAIA,MAAK,WAAW,CAAC,IAAI,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,IAAK,QAAO;AAAA,EAC1G;AACA,SAAO;AACX;AAGA,SAAS,YAAYA,OAAuB;AACxC,WAAS,IAAI,GAAG,IAAIA,MAAK,QAAQ,IAAK,KAAIA,MAAK,WAAW,CAAC,IAAI,IAAK,QAAO;AAC3E,SAAO;AACX;AAGA,SAAS,gBAAgBA,OAAmC;AACxD,MAAI,QAAQ;AACZ,MAAI,MAAMA,MAAK;AACf,SAAO,QAAQ,OAAO,UAAUA,MAAK,WAAW,KAAK,CAAC,EAAG;AACzD,SAAO,MAAM,SAAS,UAAUA,MAAK,WAAW,MAAM,CAAC,CAAC,EAAG;AAC3D,QAAMC,QAAOD,MAAK,MAAM,OAAO,GAAG,EAAE,YAAY;AAChD,SAAOC,UAAS,SAAS,OAAOA,UAAS,UAAU,QAAQ;AAC/D;AAGA,SAAS,UAAU,GAAoB;AACnC,SAAO,MAAM,KAAK,MAAM,MAAS,KAAK,KAAQ,KAAK,MAAS,MAAM,OAAQ,MAAM;AACpF;AAGA,SAAS,iBAAiBD,OAAuB;AAC7C,MAAI,SAAS;AACb,WAAS,IAAI,GAAG,IAAIA,MAAK,QAAQ,KAAK;AAClC,UAAM,IAAIA,MAAK,OAAO,CAAC;AACvB,QAAI,MAAM,OAAO,MAAM,IAAK;AAC5B,QAAI,KAAK,OAAO,KAAK,IAAK;AAAA,EAC9B;AACA,SAAO,UAAU;AACrB;AAGA,IAAM,YAAN,MAAM,WAAU;AAAA,EACH;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAED,YAAY,UAA6B,QAA2B,YAAqB,YAAqB;AAClH,SAAK,WAAW;AAChB,SAAK,SAAS;AACd,SAAK,aAAa;AAClB,SAAK,aAAa;AAAA,EACtB;AAAA;AAAA,EAGA,OAAO,MAAM,OAA0B,SAAyC;AAC5E,UAAM,aAAa,QAAQ,KAAK,2BAA2B;AAC3D,QAAI,CAAC,cAAc,OAAO,SAAS,UAAU,MAAM,KAAK,SAAS,GAAG,EAAG,QAAO;AAC9E,WAAO,WAAU,YAAY,OAAO,UAAU;AAAA,EAClD;AAAA,EAEA,OAAO,YAAY,OAA0B,YAA4C;AACrF,UAAM,OAAO,CAAC,UAA6B,QAA2B,aAAa,UAC/E,IAAI,WAAU,UAAU,QAAQ,YAAY,UAAU;AAC1D,QAAI,UAAU,OAAW,QAAO,KAAK,KAAK,MAAM,WAAW,CAAC,CAAC;AAC7D,QAAI,MAAM,SAAS,OAAQ,QAAO,KAAK,KAAK,KAAK;AACjD,UAAME,WAAU,MAAM;AACtB,QAAI,IAAIA;AACR,QAAI,EAAE,SAAS,IAAK,QAAO;AAC3B,QAAI,KAAwB;AAC5B,QAAI,EAAE,WAAW,IAAI,KAAK,EAAE,WAAW,IAAI,KAAK,EAAE,WAAW,IAAI,GAAG;AAChE,WAAK,EAAE,MAAM,GAAG,CAAC;AACjB,UAAI,EAAE,MAAM,CAAC;AAAA,IACjB,WAAW,EAAE,WAAW,GAAG,KAAK,EAAE,WAAW,GAAG,KAAK,EAAE,WAAW,GAAG,GAAG;AACpE,WAAK,EAAE,MAAM,GAAG,CAAC;AACjB,UAAI,EAAE,MAAM,CAAC;AAAA,IACjB;AACA,UAAM,WAAW,OAAO,OAAO,OAAO;AACtC,QAAI,EAAE,WAAW,KAAKA,SAAQ,SAAS,EAAG,QAAO,WAAW,KAAK,IAAI,QAAW,IAAI,IAAI;AACxF,eAAWC,UAAS,aAAa;AAC7B,UAAI,iBAAiB,GAAGA,MAAK,EAAG,QAAO,WAAW,KAAK,IAAI,MAAM,UAAUA,MAAK,CAAC,IAAI;AAAA,IACzF;AAIA,QAAI,mBAAmB,CAAC,EAAG,QAAO;AAClC,UAAML,UAAS,wBAAwB,CAAC;AACxC,QAAIA,YAAW,OAAW,QAAO,OAAO,SAASA,OAAM,KAAK,iBAAiB,CAAC,IAAI,KAAK,IAAI,MAAM,WAAWA,OAAM,CAAC,IAAI;AACvH,UAAM,UAAU,gBAAgB,CAAC;AACjC,QAAI,YAAY,OAAW,QAAO,WAAW,KAAK,IAAI,MAAM,YAAY,OAAO,CAAC,IAAI;AACpF,WAAO,WAAW,KAAK,IAAI,MAAM,SAAS,CAAC,CAAC,IAAI;AAAA,EACpD;AAAA;AAAA,EAGA,QAAQ,WAAmD;AACvD,QAAI,KAAK,YAAY;AACjB,cAAQ,KAAK,UAAU;AAAA,QACnB,KAAK;AAAK,iBAAO,cAAc;AAAA,QAC/B,KAAK;AAAM,iBAAO,cAAc;AAAA,QAChC,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AACD,iBAAO;AAAA,QACX;AAAS,gBAAM,IAAI,MAAM,aAAa,OAAO,KAAK,QAAQ,CAAC,4BAA4B;AAAA,MAC3F;AAAA,IACJ;AACA,UAAM,SAAS,KAAK;AACpB,QAAI,WAAW,OAAW,OAAM,IAAI,MAAM,mEAAmE;AAC7G,QAAI,OAAO,SAAS,UAAU;AAC1B,UAAI,WAAW,SAAS,SAAU,QAAO,KAAK,SAAS,cAAc,WAAW,MAAM,CAAC;AACvF,UAAI,KAAK,aAAa,OAAO,WAAW,SAAS,QAAQ;AACrD,cAAME,QAAO,UAAU;AACvB,YAAI,mBAAmBA,KAAI,KAAM,CAAC,KAAK,cAAcA,MAAK,SAAS,GAAG,EAAI,QAAO;AACjF,cAAMF,UAAS,wBAAwBE,KAAI;AAC3C,YAAIF,YAAW,QAAW;AACtB,iBAAO,OAAO,SAASA,OAAM,KAAK,iBAAiBE,KAAI,IAAI,cAAc,MAAM,WAAWF,OAAM,GAAG,MAAM,MAAM,IAAI;AAAA,QACvH;AAAA,MACJ;AACA,aAAO,KAAK,aAAa;AAAA,IAC7B;AACA,QAAI,OAAO,SAAS,aAAa,OAAO,SAAS,SAAS;AACtD,YAAM,OAAO,cAAc,UAAa,UAAU,SAAS,OAAO,QAAQ,UAAU,OAAO,MAAM;AACjG,aAAO,KAAK,aAAa,MAAM,OAAO,KAAK,aAAa,QAAQ,CAAC;AAAA,IACrE;AACA,QAAI,cAAc,OAAW,QAAQ,OAAO,KAAK,WAAW,KAAK,KAAK,aAAa,OAAS,OAAO,KAAK,SAAS,KAAK,KAAK,aAAa;AACxI,QAAI,UAAU,SAAS,OAAQ,QAAO,KAAK,aAAa;AACxD,QAAI,YAAY,UAAU,IAAI,EAAG,QAAO;AACxC,UAAM,WAAW,oBAAoB,OAAO,MAAM,UAAU,IAAI;AAChE,WAAO,KAAK,aAAa,MAAM,WAAW,CAAC;AAAA,EAC/C;AAAA,EAEA,SAAS,YAA6B;AAClC,YAAQ,KAAK,UAAU;AAAA,MACnB,KAAK;AAAK,eAAO,eAAe;AAAA,MAChC,KAAK;AAAM,eAAO,eAAe;AAAA,MACjC,KAAK;AAAK,eAAO,aAAa;AAAA,MAC9B,KAAK;AAAK,eAAO,aAAa;AAAA,MAC9B,KAAK;AAAM,eAAO,cAAc;AAAA,MAChC,KAAK;AAAM,eAAO,cAAc;AAAA,MAChC;AAAS,cAAM,IAAI,MAAM,aAAa,OAAO,KAAK,QAAQ,CAAC,4BAA4B;AAAA,IAC3F;AAAA,EACJ;AACJ;AAGA,SAAS,WAAW,GAAmB;AACnC,SAAO,KAAK,MAAQ,KAAK,MAAO,IAAI,KAAO;AAC/C;AAGA,SAAS,oBAAoB,SAAiBE,OAAuB;AAGjE,MAAI,IAAI;AACR,MAAI,IAAI;AACR,MAAI,OAAO;AACX,MAAI,QAAQ;AACZ,SAAO,IAAIA,MAAK,QAAQ;AACpB,QAAI,IAAI,QAAQ,UAAU,QAAQ,OAAO,CAAC,MAAM,KAAK;AACjD,aAAO,EAAE;AACT,cAAQ;AACR;AAAA,IACJ;AACA,QAAI,IAAI,QAAQ,QAAQ;AACpB,UAAI,IAAI,QAAQ,OAAO,CAAC;AACxB,UAAI,OAAO;AACX,YAAM,MAAM,MAAM;AAClB,YAAM,OAAO,QAAQ,OAAO,IAAI,CAAC;AACjC,UAAI,MAAM,OAAO,IAAI,IAAI,QAAQ,WAAW,SAAS,OAAO,SAAS,MAAM;AACvE,YAAI;AACJ,eAAO;AAAA,MACX;AACA,UAAI,OAAO,WAAW,EAAE,WAAW,CAAC,CAAC,MAAM,WAAWA,MAAK,WAAW,CAAC,CAAC,GAAG;AACvE,aAAK;AACL;AACA;AAAA,MACJ;AAAA,IACJ;AACA,QAAI,OAAO,EAAG,QAAO;AACrB,QAAI;AACJ,QAAI,EAAE;AAAA,EACV;AACA,SAAO,IAAI,QAAQ,UAAU,QAAQ,OAAO,CAAC,MAAM,IAAK;AACxD,SAAO,MAAM,QAAQ;AACzB;;;ACxWA,SAAS,aAAa,QAAyB;AAC3C,SAAO,QAAQ,GAAG,MAAM,WAAW,MAAM,CAAC;AAC9C;AAQO,SAAS,aAAa,MAA6B;AACtD,QAAM,YAAY,eAAe,MAAM,CAAC;AACxC,MAAI,qBAAqB,QAAS,QAAO;AACzC,QAAM,aAAa,eAAe,MAAM,CAAC;AACzC,MAAI,sBAAsB,QAAS,QAAO;AAC1C,QAAM,WAAW,eAAe,MAAM,CAAC;AACvC,MAAI,oBAAoB,QAAS,QAAO;AACxC,MAAI,OAAO,KAAK,MAAM,SAAS;AAC/B,QAAM,QAAQ,KAAK,MAAM,UAAU;AACnC,QAAM,MAAM,KAAK,MAAM,QAAQ;AAC/B,MAAI,OAAO,KAAK,QAAQ,IAAO,QAAO,QAAQ,QAAQ,OAAO;AAC7D,MAAI,OAAO,KAAM,SAAQ;AAGzB,QAAM,SAAS,OAAO,MAAM,QAAQ;AACpC,QAAM,YAAY,KAAK,MAAM,SAAS,EAAE;AACxC,MAAI,YAAY,KAAK,YAAY,KAAM,QAAO,QAAQ,QAAQ,OAAO;AACrE,QAAM,aAAa,KAAK,MAAM,SAAS,YAAY,EAAE,IAAI;AACzD,QAAM,QAAQ,cAAc,WAAW,UAAU;AAEjD,QAAM,SAAS,SAAS,MAAM;AAC9B,MAAI,SAAS,KAAK,SAAS,cAAe,QAAO,QAAQ,QAAQ,OAAO;AACxE,SAAO,aAAa,MAAM;AAC9B;AAGA,SAAS,cAAc,MAAc,OAAuB;AACxD,QAAM,OAAO,UAAU,MAAM,OAAO,CAAC,IAAI,UAAU,MAAM,IAAI,EAAE;AAC/D,SAAO,QAAQ,KAAK,OAAO,IAAI;AACnC;AAGO,SAAS,MAAM,MAA6B;AAC/C,QAAM,MAAM,KAAK,UAAU,MAAM;AACjC,QAAM,SAAS,QAAQ,SAAY,SAAY,eAAe,IAAI,MAAM,IAAI,OAAO,IAAI,GAAG;AAC1F,SAAO,WAAW,SAAY,QAAQ,QAAQ,eAAe,IAAI,aAAa,MAAM;AACxF;AAEO,SAAS,aAAa,MAA6B;AACtD,SAAO,SAAS,MAAM,UAAQ,KAAK,IAAI;AAC3C;AAEO,SAAS,cAAc,MAA6B;AACvD,SAAO,SAAS,MAAM,UAAQ,KAAK,KAAK;AAC5C;AAEO,SAAS,YAAY,MAA6B;AACrD,SAAO,SAAS,MAAM,UAAQ,KAAK,GAAG;AAC1C;AAMA,SAAS,SAAS,MAAoBI,OAA8C;AAChF,QAAM,QAAQ,eAAe,MAAM,CAAC;AACpC,MAAI,iBAAiB,QAAS,QAAO;AACrC,QAAM,SAAS,KAAK,MAAM,KAAK;AAC/B,MAAI,SAAS,KAAK,SAAS,cAAe,QAAO,QAAQ,QAAQ,OAAO;AACxE,SAAO,QAAQ,GAAG,MAAM,WAAWA,MAAK,eAAe,MAAM,CAAC,CAAC,CAAC;AACpE;AAEO,SAAS,QAAQ,MAA6B;AACjD,SAAO,WAAW,MAAM,IAAI;AAChC;AAEO,SAAS,MAAM,MAA6B;AAC/C,SAAO,WAAW,MAAM,KAAK;AACjC;AAUA,SAAS,WAAW,MAAoB,YAA8B;AAClE,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AACxB,UAAM,QAAQ,eAAe,MAAM,CAAC;AACpC,QAAI,iBAAiB,QAAS,QAAO;AACrC,QAAI,OAAO,SAAS,UAAW,QAAO,QAAQ,QAAQ,SAAS;AAAA,EACnE;AACA,QAAM,aAAa,eAAe,MAAM,CAAC;AACzC,MAAI,sBAAsB,QAAS,QAAO;AAC1C,QAAM,cAAc,eAAe,MAAM,CAAC;AAC1C,MAAI,uBAAuB,QAAS,QAAO;AAC3C,QAAM,QAAQ,KAAK,MAAM,UAAU;AACnC,QAAM,SAAS,KAAK,MAAM,WAAW;AACrC,MAAI,QAAQ,KAAK,QAAQ,cAAe,QAAO,QAAQ,QAAQ,OAAO;AAEtE,QAAM,OAAO,eAAe,KAAK;AACjC,QAAM,QAAQ,KAAK,OAAO,MAAM,KAAK,QAAQ,KAAK;AAClD,QAAM,SAAS,KAAK,MAAM,QAAQ,EAAE;AACpC,MAAI,SAAS,QAAQ,SAAS,KAAM,QAAO,QAAQ,QAAQ,OAAO;AAClE,QAAM,UAAU,KAAK,MAAM,QAAQ,SAAS,EAAE,IAAI;AAClD,MAAI,CAAC,cAAc,KAAK,QAAQ,EAAG,QAAO,aAAa,QAAQ,eAAe,QAAQ,SAAS,CAAC,GAAG,wCAAwC,IAAI,CAAC;AAChJ,QAAM,SAAS,YAAY,QAAQ,OAAO;AAC1C,SAAO,aAAa,QAAQ,eAAe,QAAQ,SAAS,aAAa,SAAS,KAAK,IAAI,KAAK,KAAK,MAAM,CAAC,GAAG,yBAAyB,CAAC;AAC7I;AAQO,SAAS,QAAQ,MAA6B;AACjD,QAAM,QAAQ,eAAe,MAAM,CAAC;AACpC,MAAI,iBAAiB,QAAS,QAAO;AACrC,QAAM,SAAS,KAAK,MAAM,KAAK;AAC/B,MAAI,SAAS,KAAK,SAAS,cAAe,QAAO,QAAQ,QAAQ,OAAO;AACxE,MAAI,OAAO;AACX,MAAI,KAAK,IAAI,CAAC,GAAG;AACb,UAAM,YAAY,eAAe,MAAM,CAAC;AACxC,QAAI,qBAAqB,QAAS,QAAO;AACzC,WAAO;AAAA,EACX;AACA,QAAM,IAAI,gBAAgB,MAAM;AAChC,MAAIC;AACJ,UAAQ,KAAK,MAAM,IAAI,GAAG;AAAA,IACtB,KAAK;AAAA,IACL,KAAK;AACD,MAAAA,UAAS,IAAI;AACb;AAAA,IACJ,KAAK;AAAA,IACL,KAAK;AACD,MAAAA,WAAW,IAAI,KAAK,IAAK;AACzB;AAAA,IACJ,KAAK;AAAG,MAAAA,WAAU,IAAI,KAAK;AAAG;AAAA,IAC9B,KAAK;AAAI,MAAAA,WAAW,IAAI,KAAK,IAAK;AAAG;AAAA,IACrC,KAAK;AAAI,MAAAA,WAAW,IAAI,KAAK,IAAK;AAAG;AAAA,IACrC,KAAK;AAAI,MAAAA,WAAW,IAAI,KAAK,IAAK;AAAG;AAAA,IACrC,KAAK;AAAI,MAAAA,WAAW,IAAI,KAAK,IAAK;AAAG;AAAA,IACrC,KAAK;AAAI,MAAAA,WAAW,IAAI,KAAK,IAAK;AAAG;AAAA,IACrC;AAAS,aAAO,QAAQ,QAAQ,OAAO;AAAA,EAC3C;AACA,SAAO,QAAQ,GAAG,MAAM,WAAWA,OAAM,CAAC;AAC9C;AAGO,SAAS,aAAa,MAA6B;AACtD,QAAM,WAAW,eAAe,MAAM,CAAC;AACvC,MAAI,oBAAoB,QAAS,QAAO;AACxC,QAAM,aAAa,eAAe,MAAM,CAAC;AACzC,MAAI,sBAAsB,QAAS,QAAO;AAC1C,QAAM,MAAM,KAAK,MAAM,QAAQ;AAC/B,QAAM,QAAQ,KAAK,MAAM,UAAU;AACnC,MAAI,MAAM,KAAK,QAAQ,KAAK,MAAM,iBAAiB,QAAQ,cAAe,QAAO,QAAQ,QAAQ,OAAO;AACxG,SAAO,QAAQ,GAAG,MAAM,WAAW,MAAM,KAAK,CAAC;AACnD;AAOA,SAAS,YAAY,MAAoB,OAAiC;AACtE,QAAM,QAAQ,eAAe,MAAM,KAAK;AACxC,MAAI,iBAAiB,QAAS,QAAO;AACrC,MAAI,OAAO,SAAS,UAAW,QAAO,QAAQ,QAAQ,SAAS;AAC/D,QAAM,QAAQ,eAAe,MAAM,KAAK;AACxC,MAAI,iBAAiB,QAAS,QAAO;AACrC,QAAMA,UAAS,KAAK,MAAM,KAAK;AAC/B,MAAIA,UAAS,KAAKA,UAAS,cAAe,QAAO,QAAQ,QAAQ,OAAO;AACxE,SAAOA;AACX;AAOA,SAAS,WAAW,MAAoB,OAAsC;AAC1E,QAAM,WAAW,oBAAI,IAAY;AACjC,MAAI,CAAC,KAAK,IAAI,KAAK,EAAG,QAAO;AAC7B,QAAM,UAAU,KAAK,QAAQ,KAAK;AAClC,MAAI;AACJ,MAAI,QAAQ,QAAS,UAAS,KAAK,UAAU,YAAY,OAAO;AAAA,WACvD,QAAQ,WAAW,OAAW,UAAS,CAAC,QAAQ,MAAM;AAAA,MAC1D,QAAO;AACZ,aAAW,SAAS,QAAQ;AACxB,QAAI,MAAM,QAAS,QAAO,QAAQ,GAAG,KAAK;AAC1C,QAAI,MAAM,SAAS,SAAU,QAAO,MAAM,SAAS,YAAY,KAAK,UAAU,OAAO,IAAI,QAAQ,QAAQ,SAAS;AAClH,aAAS,IAAI,KAAK,MAAM,MAAM,MAAM,CAAC;AAAA,EACzC;AACA,SAAO;AACX;AAEA,SAAS,UAAU,QAAyB;AACxC,QAAM,IAAI,gBAAgB,MAAM;AAChC,SAAO,MAAM,KAAK,MAAM;AAC5B;AAGO,SAAS,YAAY,MAA6B;AACrD,QAAM,QAAQ,YAAY,MAAM,CAAC;AACjC,MAAI,iBAAiB,QAAS,QAAO;AACrC,QAAM,MAAM,YAAY,MAAM,CAAC;AAC/B,MAAI,eAAe,QAAS,QAAO;AACnC,QAAM,WAAW,WAAW,MAAM,CAAC;AACnC,MAAI,oBAAoB,QAAS,QAAO;AACxC,QAAM,CAAC,MAAM,IAAI,IAAI,IAAI,SAAS,MAAM,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,OAAO,EAAE;AACzE,QAAM,OAAO,KAAK,OAAO;AACzB,QAAM,QAAQ,KAAK,MAAM,OAAO,CAAC;AACjC,MAAI,UAAU,QAAQ;AACtB,WAAS,SAAS,OAAO,QAAQ,GAAG,UAAU,IAAI,UAAU;AACxD,QAAI,UAAU,MAAM,EAAG;AAAA,EAC3B;AACA,aAAW,KAAK,UAAU;AACtB,QAAI,KAAK,QAAQ,KAAK,MAAM,UAAU,CAAC,EAAG;AAAA,EAC9C;AACA,SAAO,QAAQ,GAAG,MAAM,WAAW,OAAO,OAAO,CAAC;AACtD;AAOO,SAAS,QAAQ,MAA6B;AACjD,QAAM,QAAQ,YAAY,MAAM,CAAC;AACjC,MAAI,iBAAiB,QAAS,QAAO;AACrC,QAAM,YAAY,eAAe,MAAM,CAAC;AACxC,MAAI,qBAAqB,QAAS,QAAO;AACzC,QAAM,WAAW,WAAW,MAAM,CAAC;AACnC,MAAI,oBAAoB,QAAS,QAAO;AACxC,QAAMC,SAAQ,KAAK,MAAM,SAAS;AAClC,QAAM,OAAOA,SAAQ,IAAI,KAAK;AAC9B,MAAI,YAAY,KAAK,IAAIA,MAAK;AAC9B,MAAI,SAAS;AACb,SAAO,YAAY,GAAG;AAClB,cAAU;AACV,QAAI,SAAS,KAAK,SAAS,cAAe,QAAO,QAAQ,QAAQ,OAAO;AACxE,QAAI,UAAU,MAAM,KAAK,CAAC,SAAS,IAAI,MAAM,EAAG;AAAA,EACpD;AACA,SAAO,aAAa,MAAM;AAC9B;AAEA,IAAM,gBAAgB;AAGf,SAAS,KAAK,MAA6B;AAC9C,QAAM,YAAY,eAAe,MAAM,CAAC;AACxC,MAAI,qBAAqB,QAAS,QAAO;AACzC,QAAM,cAAc,eAAe,MAAM,CAAC;AAC1C,MAAI,uBAAuB,QAAS,QAAO;AAC3C,QAAM,cAAc,eAAe,MAAM,CAAC;AAC1C,MAAI,uBAAuB,QAAS,QAAO;AAC3C,QAAM,OAAO,KAAK,MAAM,SAAS;AACjC,QAAM,SAAS,KAAK,MAAM,WAAW;AACrC,QAAM,SAAS,KAAK,MAAM,WAAW;AACrC,MAAI,OAAO,SAAS,SAAS,SAAS,SAAS,MAAO,QAAO,QAAQ,QAAQ,OAAO;AACpF,QAAM,QAAQ,OAAO,OAAO,SAAS,KAAK;AAC1C,MAAI,QAAQ,EAAG,QAAO,QAAQ,QAAQ,OAAO;AAC7C,SAAO,QAAQ,GAAG,MAAM,WAAW,QAAQ,gBAAgB,aAAa,CAAC;AAC7E;AAEO,SAAS,aAAa,MAA6B;AACtD,SAAO,SAAS,MAAM,aAAW,KAAK,MAAM,UAAU,IAAI,CAAC;AAC/D;AAEO,SAAS,eAAe,MAA6B;AACxD,SAAO,SAAS,MAAM,aAAW,KAAK,MAAM,UAAU,EAAE,IAAI,EAAE;AAClE;AAEO,SAAS,eAAe,MAA6B;AACxD,SAAO,SAAS,MAAM,aAAW,UAAU,EAAE;AACjD;AAMA,SAAS,SAAS,MAAoBF,OAA4C;AAC9E,QAAM,SAAS,eAAe,MAAM,CAAC;AACrC,MAAI,kBAAkB,QAAS,QAAO;AACtC,MAAI,SAAS,KAAK,UAAU,gBAAgB,EAAG,QAAO,QAAQ,QAAQ,OAAO;AAC7E,QAAM,UAAU,uBAAuB,SAAS,KAAK,MAAM,MAAM,KAAK,aAAa,IAAI;AACvF,SAAO,QAAQ,GAAG,MAAM,WAAWA,MAAK,OAAO,CAAC,CAAC;AACrD;AAGO,SAAS,IAAI,MAA6B;AAC7C,QAAM,SAAS,KAAK,UAAU,MAAM;AACpC,MAAI,WAAW,OAAW,QAAO,QAAQ,QAAQ,eAAe;AAChE,QAAM,SAAS,eAAe,OAAO,MAAM,OAAO,OAAO,OAAO,GAAG;AACnE,MAAI,WAAW,OAAW,QAAO,QAAQ,QAAQ,OAAO;AACxD,QAAM,iBAAiB,OAAO,OAAO,KAAK,OAAO,UAAU,KAAK,OAAO,UAAU,MAAO,OAAO;AAC/F,SAAO,QAAQ,GAAG,MAAM,WAAW,SAAS,eAAe,MAAO,aAAa,CAAC;AACpF;AAIO,SAAS,QAAQ,MAA6B;AACjD,QAAM,QAAQ,eAAe,MAAM,GAAG,IAAI;AAC1C,MAAI,iBAAiB,QAAS,QAAO;AACrC,QAAM,MAAM,eAAe,MAAM,GAAG,IAAI;AACxC,MAAI,eAAe,QAAS,QAAO;AACnC,QAAM,OAAO,aAAa,MAAM,CAAC;AACjC,MAAI,gBAAgB,QAAS,QAAO;AACpC,MAAI,QAAQ,IAAK,QAAO,QAAQ,QAAQ,OAAO;AAC/C,QAAM,QAAQ,eAAe,KAAK;AAClC,QAAM,OAAO,eAAe,GAAG;AAC/B,QAAM,oBAAoB,KAAK,QAAQ,MAAM,SAAU,KAAK,UAAU,MAAM,SAAS,KAAK,MAAM,MAAM;AACtG,QAAM,QAAQ,KAAK,OAAO,MAAM,QAAQ,oBAAoB,IAAI;AAChE,QAAM,UAAU,KAAK,OAAO,MAAM,QAAQ,KAAK,KAAK,QAAQ,MAAM,SAAS,KAAK,MAAM,MAAM,MAAM,IAAI;AACtG,UAAQ,iBAAiB,IAAI,GAAG;AAAA,IAC5B,KAAK;AAAK,aAAO,QAAQ,GAAG,MAAM,WAAW,KAAK,CAAC;AAAA,IACnD,KAAK;AAAK,aAAO,QAAQ,GAAG,MAAM,WAAW,MAAM,CAAC;AAAA,IACpD,KAAK;AAAK,aAAO,QAAQ,GAAG,MAAM,WAAW,MAAM,KAAK,CAAC;AAAA,IACzD,KAAK;AAAM,aAAO,QAAQ,GAAG,MAAM,WAAW,SAAS,EAAE,CAAC;AAAA;AAAA;AAAA,IAG1D,KAAK;AAAM,aAAO,UAAU,IAAI,QAAQ,GAAG,MAAM,WAAW,MAAM,KAAK,CAAC,IAAI,KAAK,UAAU,OAAO;AAAA,IAClG,KAAK;AAAM,aAAO,KAAK,UAAU,OAAO;AAAA,IACxC;AAAS,aAAO,QAAQ,QAAQ,OAAO;AAAA,EAC3C;AACJ;AAEO,SAAS,SAAS,MAA6B;AAClD,QAAM,aAAa,eAAe,MAAM,GAAG,KAAK;AAChD,MAAI,sBAAsB,QAAS,QAAO;AAC1C,QAAM,WAAW,eAAe,MAAM,GAAG,KAAK;AAC9C,MAAI,oBAAoB,QAAS,QAAO;AACxC,MAAI,QAAQ;AACZ,MAAI,KAAK,IAAI,CAAC,GAAG;AACb,UAAM,QAAQ,eAAe,MAAM,CAAC;AACpC,QAAI,iBAAiB,QAAS,QAAO;AACrC,YAAQ;AAAA,EACZ;AACA,UAAQ,KAAK,MAAM,KAAK;AACxB,MAAI,QAAQ,KAAK,QAAQ,EAAG,QAAO,QAAQ,QAAQ,OAAO;AAC1D,QAAM,CAAC,OAAO,GAAG,IAAI,aAAa,WAAW,CAAC,UAAU,UAAU,IAAI,CAAC,YAAY,QAAQ;AAC3F,QAAM,QAAQ,eAAe,KAAK;AAClC,QAAM,OAAO,eAAe,GAAG;AAC/B,MAAI;AACJ,UAAQ,OAAO;AAAA,IACX,KAAK;AAAG,eAAS,eAAe,OAAO,MAAM,KAAK,IAAI;AAAK;AAAA,IAC3D,KAAK;AAAG,gBAAU,MAAM,SAAS,iBAAiB,OAAO,IAAI;AAAG;AAAA,IAChE,KAAK;AAAG,gBAAU,MAAM,SAAS;AAAK;AAAA,IACtC,KAAK;AAAG,gBAAU,MAAM,SAAS;AAAK;AAAA,IACtC;AAAS,eAAS,eAAe,OAAO,MAAM,IAAI,IAAI;AAAK;AAAA,EAC/D;AACA,SAAO,QAAQ,GAAG,MAAM,WAAW,MAAM,CAAC;AAC9C;AAOA,SAAS,eAAe,OAAoB,MAAmB,UAA2B;AACtF,MAAI,WAAW,KAAK,IAAI,MAAM,KAAK,EAAE;AACrC,MAAI,UAAU,KAAK;AACnB,MAAI,YAAY,YAAY,GAAI,WAAU,KAAK,IAAI,SAAS,EAAE;AAC9D,MAAI,CAAC,YAAY,YAAY,KAAK,GAAG;AACjC,eAAW;AACX,QAAI,YAAY,IAAI,EAAG,WAAU;AAAA,EACrC;AACA,UAAQ,KAAK,OAAO,MAAM,QAAQ,OAAO,KAAK,QAAQ,MAAM,SAAS,KAAK,UAAU;AACxF;AAEA,SAAS,YAAY,MAA4B;AAC7C,SAAO,KAAK,UAAU,KAAK,KAAK,OAAO,YAAY,KAAK,MAAM,CAAC;AACnE;AAMA,SAAS,iBAAiB,OAAoB,MAA2B;AACrE,MAAI,MAAM,SAAS,KAAK,KAAM,QAAO,WAAW,MAAM,IAAI,IAAI,MAAM;AACpE,QAAM,oBAAoB,KAAK,SAAS,MAAM,OAAO,MAC7C,KAAK,QAAQ,MAAM,SAAU,KAAK,UAAU,MAAM,SAAS,KAAK,OAAO,MAAM;AACrF,MAAI,mBAAmB;AACnB,UAAM,sBAAsB,WAAW,MAAM,IAAI,MAAM,MAAM,QAAQ,KAAM,MAAM,UAAU,KAAK,MAAM,OAAO;AAC7G,UAAM,mBAAmB,WAAW,KAAK,IAAI,MAAM,KAAK,QAAQ,KAAM,KAAK,UAAU,KAAK,KAAK,OAAO;AACtG,WAAO,uBAAuB,mBAAmB,MAAM;AAAA,EAC3D;AACA,MAAI,QAAQ;AACZ,WAAS,IAAI,MAAM,MAAM,KAAK,KAAK,MAAM,IAAK,UAAS,WAAW,CAAC,IAAI,MAAM;AAC7E,SAAO,SAAS,KAAK,OAAO,MAAM,OAAO;AAC7C;AAMA,SAAS,eAAe,MAAoB,OAAe,cAAyC;AAChG,QAAM,QAAQ,eAAe,MAAM,KAAK;AACxC,MAAI,iBAAiB,QAAS,QAAO;AACrC,MAAI,CAAC,gBAAgB,OAAO,SAAS,UAAW,QAAO,QAAQ,QAAQ,SAAS;AAChF,QAAMC,UAAS,eAAe,MAAM,KAAK;AACzC,MAAIA,mBAAkB,QAAS,QAAOA;AACtC,MAAIA,UAAS,KAAK,KAAK,MAAMA,OAAM,IAAI,cAAe,QAAO,QAAQ,QAAQ,OAAO;AACpF,SAAO,KAAK,MAAMA,OAAM;AAC5B;;;ACpaA,SAAS,IAAI,OAAuB;AAChC,SAAO,QAAQ,KAAK,CAAC,QAAQ;AACjC;AAEA,SAAS,OAAO,OAAuB;AACnC,SAAO,QAAQ,KAAK,KAAK,QAAQ,KAAK,IAAI;AAC9C;AAOO,IAAM,SAAN,MAAM,QAAO;AAAA,EACP;AAAA,EACA;AAAA,EAET,YAAY,UAAkB,UAAkB;AAC5C,SAAK,WAAW;AAChB,SAAK,WAAW;AAAA,EACpB;AAAA,EAEA,OAAgB,OAAO,IAAI,QAAO,IAAI,CAAC;AAAA,EACvC,OAAgB,MAAM,IAAI,QAAO,IAAI,CAAC;AAAA;AAAA,EAGtC,OAAO,GAAG,OAAuB;AAC7B,QAAI,CAAC,OAAO,SAAS,KAAK,EAAG,OAAM,IAAI,WAAW,gDAAgD,OAAO,KAAK,CAAC,GAAG;AAClH,QAAI,UAAU,EAAG,QAAO,QAAO;AAC/B,UAAM,OAAO,WAAW,KAAK;AAC7B,UAAM,SAAS,OAAQ,QAAQ,MAAO,MAAM;AAC5C,UAAM,WAAW,OAAO;AACxB,UAAM,WAAW,WAAW,IAAI,WAAW,WAAY,MAAM;AAC7D,WAAO,IAAI,QAAO,QAAQ,IAAI,CAAC,WAAW,UAAU,WAAW,IAAI,QAAQ,SAAS,IAAI;AAAA,EAC5F;AAAA;AAAA,EAGA,OAAO,MAAM,OAAuB;AAChC,WAAO,IAAI,QAAO,OAAO,KAAK,GAAG,CAAC;AAAA,EACtC;AAAA,EAEA,IAAI,OAAe;AACf,WAAO,OAAO,KAAK,QAAQ;AAAA,EAC/B;AAAA,EAEA,IAAI,SAAkB;AAClB,WAAO,KAAK,aAAa;AAAA,EAC7B;AAAA;AAAA,EAGA,IAAI,MAAc;AACd,WAAO,KAAK,WAAW,UAAU,IAAI,KAAK,QAAQ,CAAC,IAAI;AAAA,EAC3D;AAAA,EAEA,SAAiB;AACb,WAAO,IAAI,QAAO,CAAC,KAAK,UAAU,KAAK,QAAQ;AAAA,EACnD;AAAA,EAEA,MAAc;AACV,WAAO,IAAI,QAAO,IAAI,KAAK,QAAQ,GAAG,KAAK,QAAQ;AAAA,EACvD;AAAA;AAAA,EAGA,MAAME,QAAuB;AACzB,WAAO,IAAI,QAAO,KAAK,UAAU,KAAK,WAAWA,MAAK;AAAA,EAC1D;AAAA,EAEA,KAAK,GAAmB;AACpB,QAAI,KAAK,OAAQ,QAAO;AACxB,QAAI,EAAE,OAAQ,QAAO;AACrB,UAAM,WAAW,KAAK,IAAI,KAAK,UAAU,EAAE,QAAQ;AACnD,WAAO,IAAI,SAAQ,KAAK,YAAY,OAAO,KAAK,WAAW,QAAQ,MAAM,EAAE,YAAY,OAAO,EAAE,WAAW,QAAQ,IAAI,QAAQ;AAAA,EACnI;AAAA,EAEA,MAAM,GAAmB;AACrB,WAAO,KAAK,KAAK,EAAE,OAAO,CAAC;AAAA,EAC/B;AAAA,EAEA,MAAM,GAAmB;AACrB,WAAO,IAAI,QAAO,KAAK,WAAW,EAAE,UAAU,KAAK,WAAW,EAAE,QAAQ;AAAA,EAC5E;AAAA,EAEA,OAAO,QAAQ,GAAW,GAAmB;AACzC,WAAO,EAAE,MAAM,CAAC,EAAE;AAAA,EACtB;AAAA;AAAA,EAGA,KAAK,MAAsB;AACvB,QAAI,KAAK,OAAQ,QAAO;AACxB,UAAM,QAAQ,UAAU,IAAI,KAAK,QAAQ,CAAC,IAAI;AAE9C,WAAO,SAAS,IAAI,OAAO,IAAI,QAAO,KAAK,YAAY,OAAO,KAAK,GAAG,KAAK,WAAW,KAAK;AAAA,EAC/F;AAAA;AAAA,EAGA,GAAG,MAAsB;AACrB,WAAO,KAAK,OAAO,EAAE,KAAK,IAAI,EAAE,OAAO;AAAA,EAC3C;AAAA;AAAA,EAGA,OAAO,SAAS,GAAW,GAAW,MAAc,IAAqB;AACrE,QAAI,EAAE,OAAQ,OAAM,IAAI,WAAW,mBAAmB;AACtD,QAAI,EAAE,OAAQ,QAAO,QAAO;AAC5B,UAAM,EAAE,UAAU,SAAS,SAAS,IAAI,OAAO,GAAG,GAAG,OAAO,CAAC;AAC7D,UAAM,WAAW,EAAE,SAAS,EAAE;AAE9B,UAAM,YAAY,WAAW,aAAa,KAAK,WAAW,KAAK;AAC/D,UAAM,SAAS,IAAI,QAAO,WAAW,YAAY,CAAC,WAAW,QAAQ;AACrE,WAAO,KAAK,OAAO,GAAG,IAAI,IAAI,OAAO,KAAK,IAAI;AAAA,EAClD;AAAA;AAAA,EAGA,WAAmB;AACf,WAAO,cAAc,KAAK,UAAU,KAAK,QAAQ;AAAA,EACrD;AACJ;AAGA,SAAS,OAAO,GAAW,GAAW,MAAwE;AAC1G,QAAM,YAAY,IAAI,EAAE,QAAQ;AAChC,QAAM,cAAc,IAAI,EAAE,QAAQ;AAClC,QAAM,QAAQ,KAAK,IAAI,GAAG,OAAO,UAAU,WAAW,IAAI,UAAU,SAAS,CAAC;AAC9E,QAAM,UAAU,aAAa,OAAO,KAAK;AACzC,QAAM,WAAW,UAAU;AAC3B,SAAO,EAAE,UAAU,SAAS,UAAU,WAAW,gBAAgB,IAAI,UAAU,EAAE,WAAW,EAAE,WAAW,MAAM;AACnH;AAEA,IAAMC,OAAM,IAAI,OAAO,IAAI,CAAC;AAOrB,IAAM,YAAN,MAAM,WAAU;AAAA,EACV;AAAA,EACA;AAAA,EAET,YAAY,KAAa,MAAc;AACnC,SAAK,MAAM;AACX,SAAK,OAAO;AAAA,EAChB;AAAA,EAEA,OAAO,QAAQ,OAAmC;AAC9C,UAAM,SAAS,OAAO,UAAU,WAAW,OAAO,GAAG,KAAK,IAAI;AAC9D,WAAO,IAAI,WAAU,QAAQ,MAAM;AAAA,EACvC;AAAA,EAEA,IAAI,eAAwB;AACxB,WAAO,KAAK,IAAI,QAAQ,KAAK,KAAK,KAAK,QAAQ;AAAA,EACnD;AAAA,EAEA,SAAoB;AAChB,WAAO,IAAI,WAAU,KAAK,KAAK,OAAO,GAAG,KAAK,IAAI,OAAO,CAAC;AAAA,EAC9D;AAAA;AAAA,EAGA,MAAMD,QAA0B;AAC5B,WAAO,IAAI,WAAU,KAAK,IAAI,MAAMA,MAAK,GAAG,KAAK,KAAK,MAAMA,MAAK,CAAC;AAAA,EACtE;AAAA;AAAA,EAGA,aAA8C;AAC1C,QAAI,KAAK,aAAc,OAAM,IAAI,MAAM,qDAAqD;AAC5F,WAAO,KAAK,IAAI,OAAO,IAAI,EAAE,OAAO,KAAK,KAAK,MAAM,KAAK,KAAK,IAAI,EAAE,OAAO,KAAK,KAAK,IAAI,GAAG,MAAM,KAAK,IAAI,IAAI,EAAE;AAAA,EACrH;AAAA;AAAA,EAGA,OAAO,KAAK,GAAc,GAAyB;AAC/C,WAAO,IAAI,WAAU,OAAO,QAAQ,EAAE,KAAK,EAAE,GAAG,KAAK,IAAI,EAAE,MAAM,EAAE,KAAK,OAAO,QAAQ,EAAE,MAAM,EAAE,IAAI,KAAK,IAAI,EAAE,OAAO,EAAE,IAAI;AAAA,EACjI;AAAA,EAEA,OAAO,IAAI,GAAc,GAAc,MAAyB;AAC5D,WAAO,IAAI,WAAU,EAAE,IAAI,KAAK,EAAE,GAAG,EAAE,KAAK,IAAI,GAAG,EAAE,KAAK,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;AAAA,EACnF;AAAA,EAEA,OAAO,SAAS,GAAc,GAAc,MAAyB;AACjE,WAAO,WAAU,IAAI,GAAG,EAAE,OAAO,GAAG,IAAI;AAAA,EAC5C;AAAA,EAEA,OAAO,SAAS,GAAc,GAAc,MAAyB;AACjE,QAAI,EAAE,KAAK,QAAQ,KAAK,EAAE,IAAI,OAAO,EAAG,QAAO,WAAU,SAAS,GAAG,EAAE,OAAO,GAAG,IAAI,EAAE,OAAO;AAC9F,QAAI,EAAE,IAAI,OAAO,GAAG;AAEhB,UAAI,EAAE,IAAI,QAAQ,KAAK,EAAE,KAAK,QAAQ,EAAG,QAAO,WAAU,SAAS,GAAG,GAAG,IAAI;AAC7E,YAAM,MAAM,MAAM,EAAE,IAAI,MAAM,EAAE,IAAI,GAAG,EAAE,KAAK,MAAM,EAAE,GAAG,CAAC;AAC1D,YAAM,OAAO,SAAS,EAAE,IAAI,MAAM,EAAE,GAAG,GAAG,EAAE,KAAK,MAAM,EAAE,IAAI,CAAC;AAC9D,aAAO,IAAI,WAAU,IAAI,KAAK,IAAI,GAAG,KAAK,GAAG,IAAI,CAAC;AAAA,IACtD;AAEA,UAAM,SAAS,EAAE,IAAI,QAAQ,IAAI,EAAE,IAAI,MAAM,EAAE,GAAG,IAAI,EAAE,IAAI,MAAM,EAAE,IAAI;AACxE,UAAM,OAAO,EAAE,KAAK,QAAQ,IAAI,EAAE,KAAK,MAAM,EAAE,IAAI,IAAI,EAAE,KAAK,MAAM,EAAE,GAAG;AACzE,WAAO,IAAI,WAAU,OAAO,KAAK,IAAI,GAAG,KAAK,GAAG,IAAI,CAAC;AAAA,EACzD;AAAA;AAAA,EAGA,OAAO,OAAO,GAAc,GAAc,MAAyB;AAC/D,QAAI,EAAE,aAAc,OAAM,IAAI,WAAW,gCAAgC;AACzE,QAAI,EAAE,KAAK,OAAO,EAAG,QAAO,WAAU,OAAO,GAAG,EAAE,OAAO,GAAG,IAAI,EAAE,OAAO;AAEzE,UAAM,MAAM,OAAO,SAAS,EAAE,KAAK,EAAE,IAAI,QAAQ,IAAI,EAAE,OAAO,EAAE,KAAK,MAAM,KAAK;AAChF,UAAM,OAAO,OAAO,SAAS,EAAE,MAAM,EAAE,KAAK,QAAQ,IAAI,EAAE,MAAM,EAAE,MAAM,MAAM,IAAI;AAClF,WAAO,IAAI,WAAU,KAAK,IAAI;AAAA,EAClC;AAAA,EAEA,OAAgB,QAAQ,oBAAI,IAAuB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMnD,OAAO,IAAI,MAAyB;AAChC,UAAME,SAAQ,WAAU,MAAM,IAAI,IAAI;AACtC,QAAIA,WAAU,OAAW,QAAOA;AAChC,UAAMC,SAAQ,OAAO;AACrB,UAAM,YAAY,MAAM,OAAOA,SAAQ,CAAC;AACxC,QAAIC,OAAM;AACV,QAAI,QAAQ;AACZ,QAAIJ,SAAQ;AACZ,aAAS,IAAI,MAAM,KAAK;AACpB,YAAM,OAAO,cAAc,KAAK,IAAI,MAAMA;AAC1C,UAAI,SAAS,GAAI;AACjB,MAAAI,QAAO;AACP;AACA,MAAAJ,UAAS;AAAA,IACb;AACA,UAAMK,OAAM,IAAI,WAAU,IAAI,OAAOD,MAAK,CAACD,MAAK,EAAE,KAAK,IAAI,GAAG,IAAI,OAAOC,OAAM,QAAQ,IAAI,CAACD,MAAK,EAAE,GAAG,IAAI,CAAC;AAC3G,eAAU,MAAM,IAAI,MAAME,IAAG;AAC7B,WAAOA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,MAAM,GAAW,MAAyB;AAC7C,QAAI,EAAE,OAAQ,QAAO,WAAU,QAAQ,OAAO,IAAI;AAClD,QAAI,OAAO,QAAQ,GAAG,OAAO,IAAI,OAAO,CAAC,KAAK,EAAG,OAAM,IAAI,WAAW,2BAA2B;AACjG,UAAM,UAAU,OAAO;AACvB,QAAI,EAAE,MAAM,IAAI;AACZ,YAAM,IAAI,WAAU,OAAO,WAAU,QAAQ,CAAC,GAAG,WAAU,QAAQ,EAAE,KAAKJ,IAAG,CAAC,GAAG,OAAO;AACxF,aAAO,WAAU,SAAS,GAAGK,aAAY,GAAG,OAAO,GAAG,OAAO,EAAE,MAAM,CAAC;AAAA,IAC1E;AACA,UAAM,UAAU,OAAO,IAAI,KAAK,CAAC;AACjC,QAAI,IAAI,QAAQ;AAChB,UAAM,UAAU,QAAQ,MAAM,CAAC,CAAC;AAChC,QAAI,OAAO,QAAQ,QAAQ,MAAM,OAAO,GAAGL,IAAG,KAAK,EAAG;AACtD,UAAM,OAAO,QAAQ,MAAM,CAAC,CAAC,EAAE,MAAM,OAAO,GAAG;AAC/C,WAAO,WAAU;AAAA,MACb,WAAU,SAAS,WAAU,QAAQ,OAAO,MAAM,CAAC,CAAC,GAAG,WAAU,IAAI,UAAU,EAAE,GAAG,OAAO;AAAA,MAC3F,WAAU,MAAM,MAAM,OAAO;AAAA,MAC7B;AAAA,IAAO;AAAA,EACf;AAAA;AAAA,EAGA,OAAO,MAAM,GAAc,MAAyB;AAChD,UAAM,MAAM,QAAQ,EAAE,KAAK,IAAI;AAC/B,WAAO,OAAO,QAAQ,EAAE,KAAK,EAAE,IAAI,MAAM,IAAI,MAAM,IAAI,WAAU,IAAI,KAAK,QAAQ,EAAE,MAAM,IAAI,EAAE,IAAI;AAAA,EACxG;AAAA;AAAA,EAGA,OAAO,IAAI,GAAc,MAAyB;AAC9C,UAAM,MAAM,MAAM,EAAE,KAAK,IAAI;AAC7B,WAAO,OAAO,QAAQ,EAAE,KAAK,EAAE,IAAI,MAAM,IAAI,MAAM,IAAI,WAAU,IAAI,KAAK,MAAM,EAAE,MAAM,IAAI,EAAE,IAAI;AAAA,EACtG;AACJ;AAGA,SAASK,aAAY,GAAc,MAAyB;AACxD,QAAM,SAAS,UAAU,SAAS,GAAG,GAAG,IAAI;AAC5C,QAAM,MAAM,OAAO,KAAK,MAAM;AAC9B,QAAMC,SAAQ,KAAK,IAAI,GAAG,KAAK,MAAM,OAAO,KAAK,CAAC,GAAG,IAAI,CAAC;AAC1D,MAAIH,OAAM,WAAW,IAAIG,SAAQ,GAAG,IAAI;AACxC,WAAS,IAAIA,SAAQ,GAAG,KAAK,GAAG,IAAK,CAAAH,OAAM,UAAU,IAAI,WAAW,IAAI,IAAI,GAAG,IAAI,GAAG,UAAU,SAAS,QAAQA,MAAK,IAAI,GAAG,IAAI;AAEjI,SAAO,UAAU,IAAIA,MAAK,IAAI,UAAU,OAAO,MAAM,OAAO,IAAI,MAAM,OAAOG,SAAQ,KAAK,CAAC,CAAC,GAAG,IAAI;AACvG;AAEA,SAAS,WAAW,GAAW,MAAyB;AACpD,QAAMC,SAAQ,OAAO,MAAM,CAAC;AAC5B,SAAO,IAAI,UAAU,OAAO,SAAS,OAAO,KAAKA,QAAO,MAAM,KAAK,GAAG,OAAO,SAAS,OAAO,KAAKA,QAAO,MAAM,IAAI,CAAC;AACxH;AAOA,SAAS,QAAQ,GAAW,MAAyB;AACjD,MAAI,EAAE,OAAQ,QAAO,UAAU,QAAQ,OAAO,IAAI;AAClD,QAAM,UAAU,OAAO;AACvB,MAAI,EAAE,OAAO,GAAI,QAAO,UAAU,SAAS,MAAM,GAAG,IAAI,GAAG,UAAU,QAAQ,OAAO,GAAG,GAAG,OAAO;AACjG,QAAM,WAAW,KAAK,IAAI,GAAG,EAAE,MAAM,CAAC;AACtC,QAAM,IAAI,EAAE,MAAM,CAAC,QAAQ;AAC3B,QAAM,MAAM,EAAE,MAAM;AACpB,QAAM,SAAS,KAAK,IAAI,GAAG,KAAK,MAAM,UAAU,KAAK,CAAC,GAAG,CAAC;AAC1D,QAAM,WAAW,UAAU,QAAQ,CAAC;AACpC,QAAMC,OAAM,UAAU,QAAQ,OAAO,GAAG;AACxC,MAAI,QAAQA;AACZ,WAAS,IAAI,QAAQ,KAAK,GAAG,KAAK;AAC9B,YAAQ,UAAU,IAAIA,MAAK,UAAU,OAAO,UAAU,SAAS,UAAU,OAAO,OAAO,GAAG,UAAU,QAAQ,OAAO,MAAM,CAAC,CAAC,GAAG,OAAO,GAAG,OAAO;AAAA,EACnJ;AACA,QAAM,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE;AACzC,MAAI,SAAS,UAAU,IAAI,UAAU,SAAS,UAAU,OAAO,OAAO,GAAG,IAAI,UAAU,KAAK,OAAO,GAAG,IAAI,GAAG,OAAO;AACpH,WAAS,IAAI,GAAG,IAAI,UAAU,IAAK,UAAS,UAAU,SAAS,QAAQ,UAAU,IAAI,QAAQ,UAAU,QAAQR,IAAG,GAAG,OAAO,GAAG,OAAO;AACtI,SAAO;AACX;AAGA,SAAS,MAAM,GAAW,MAAyB;AAC/C,QAAM,UAAU,OAAO;AACvB,MAAI,EAAE,MAAM,GAAI,QAAO,UAAU,IAAI,UAAU,QAAQ,OAAO,GAAG,GAAG,QAAQ,GAAG,IAAI,GAAG,OAAO;AAE7F,QAAM,IAAI,gBAAgB,EAAE,SAAS,IAAI,KAAK,GAAG;AACjD,QAAM,IAAI,UAAU;AAAA,IAChB,UAAU,QAAQ,CAAC;AAAA,IACnB,UAAU,SAAS,UAAU,QAAQ,OAAO,MAAM,CAAC,CAAC,GAAG,UAAU,IAAI,UAAU,EAAE,GAAG,UAAU,EAAE;AAAA,IAChG,UAAU;AAAA,EAAE;AAChB,QAAM,WAAW,IAAI,UAAU,QAAQ,EAAE,KAAK,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,OAAO,EAAE,IAAI;AACzF,SAAO,UAAU,IAAI,UAAU,QAAQ,OAAO,GAAG,GAAG,UAAU,OAAO,EAAE,MAAM,CAAC;AAClF;AAEA,SAAS,MAAM,GAAW,GAAmB;AACzC,SAAO,OAAO,QAAQ,GAAG,CAAC,KAAK,IAAI,IAAI;AAC3C;AAEA,SAAS,SAAS,GAAW,GAAmB;AAC5C,SAAO,OAAO,QAAQ,GAAG,CAAC,KAAK,IAAI,IAAI;AAC3C;;;ACrUA,IAAM,YAAY;AAClB,IAAM,WAAW;AACjB,IAAM,WAAW,OAAO,IAAI,MAAM,KAAK;AACvC,IAAM,UAAU,OAAO,IAAI,MAAM,IAAI;AACrC,IAAM,OAAO,OAAO,IAAI,MAAM,EAAE;AAGhC,IAAM,oBAAoB;AAMnB,SAAS,aAAa,MAAc,SAAiB,SAAiB,QAAgB,SAAsC;AAC/H,QAAM,IAAI,OAAO,GAAG,IAAI;AACxB,QAAM,cAAc,OAAO,IAAI,KAAK,CAAC;AACrC,QAAMS,MAAK,OAAO,GAAG,OAAO;AAC5B,QAAMC,MAAK,OAAO,GAAG,MAAM;AAC3B,QAAMC,OAAMF,IAAG,KAAKC,GAAE;AACtB,MAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAKD,GAAE,KAAK,CAAC,KAAKC,GAAE,KAAK,CAAC,KAAKC,IAAG,EAAG,QAAO;AAG7D,MAAI,EAAE,KAAK,IAAI,UAAUC,KAAI,IAAI,IAAI,CAAC,KAAK,OAAO,KAAK,KAAM,QAAO;AACpE,WAAS,OAAO,WAAW,QAAQ,UAAU,QAAQ,GAAG;AACpD,UAAM,EAAE,QAAQ,QAAQ,IAAI,SAAS,GAAG,aAAa,SAAS,IAAI;AAClE,QAAI,SAAS,aAAa,CAAC,cAAc,GAAGH,KAAIC,KAAIC,MAAK,QAAQ,SAAS,aAAa,OAAO,EAAG,QAAO;AAExG,UAAM,OAAO,UAAU;AAAA,MACnB,UAAU,IAAI,UAAU,SAAS,UAAU,QAAQF,GAAE,GAAG,QAAQ,IAAI,GAAG,UAAU,QAAQC,GAAE,GAAG,IAAI;AAAA,MAClG,UAAU,IAAI,UAAU,SAAS,UAAU,QAAQD,GAAE,GAAG,SAAS,IAAI,GAAG,UAAU,QAAQE,IAAG,GAAG,IAAI;AAAA,IAAC;AACzG,QAAI,SAAS,aAAa,CAAC,YAAY,GAAG,aAAa,SAASF,KAAIC,KAAIC,MAAK,QAAQ,SAAS,MAAM,SAAS,IAAI,EAAG,QAAO;AAC3H,UAAM,QAAQ,UAAU,OAAO,UAAU,SAAS,UAAU,QAAQ,EAAE,OAAO,CAAC,GAAG,MAAM,IAAI,GAAG,SAAS,IAAI;AAC3G,UAAM,UAAU,UAAU,UAAU,OAAO,OAAO,UAAU,QAAQ,WAAW,GAAG,IAAI,IAAI;AAC1F,UAAM,MAAM,QAAQ,IAAI,SAAS;AACjC,QAAI,QAAQ,QAAQ,KAAK,SAAS,EAAG;AACrC,WAAO,QAAQ,IAAI,IAAI;AAAA,EAC3B;AACA,SAAO;AACX;AAQA,SAAS,SAAS,MAAc,aAAqB,SAAiB,MAAyD;AAC3H,QAAME,OAAM,UAAU,QAAQ,OAAO,GAAG;AACxC,QAAM,YAAY,KAAK,IAAI,OAAO;AAClC,MAAI,cAAc,KAAK,MAAM,SAAS,GAAG;AACrC,UAAM,WAAW,UAAU,SAAS,UAAU,MAAM,MAAM,IAAI,GAAG,UAAU,QAAQ,OAAO,GAAG,IAAI;AACjG,UAAM,UAAU,UAAU,MAAM,UAAU,IAAI;AAC9C,WAAO,EAAE,QAAQ,OAAO,QAAQ,QAAQ,KAAK,KAAK,OAAO,CAAC,KAAK,IAAI,UAAU,IAAIA,MAAK,SAAS,IAAI,IAAI,UAAU,IAAI,UAAU,IAAI,GAAG,QAAQ;AAAA,EAClJ;AACA,MAAI;AACJ,MAAI,SAAS,UAAU,QAAQ,IAAI;AACnC,QAAMC,OAAM,UAAU,QAAQ,OAAO,MAAM,CAAC,CAAC;AAC7C,WAAS,IAAI,eAAc;AACvB,QAAI,IAAI,MAAM,EAAG,UAAS,WAAW,SAAY,SAAS,UAAU,IAAI,UAAU,IAAI,QAAQ,QAAQ,IAAI,GAAG,UAAU,SAAS,QAAQ,QAAQ,IAAI,GAAG,IAAI;AAC3J,QAAI,KAAK,MAAM,IAAI,CAAC;AACpB,QAAI,MAAM,EAAG;AACb,aAAS,UAAU,SAAS,QAAQ,UAAU,IAAI,QAAQA,MAAK,IAAI,GAAG,IAAI;AAAA,EAC9E;AACA,MAAI,WAAW,OAAW,OAAM,IAAI,MAAM,iEAAiE;AAC3G,QAAM,OAAO;AACb,QAAMC,SAAQ,OAAO,QAAQ,KAAK,KAAK,KAAK,OAAO,CAAC,KAAK,IAAI,UAAU,IAAIF,MAAK,MAAM,IAAI,IAAI,MAAM,aAAa,WAAW,IAAI;AAChI,MAAI,UAAU,EAAG,QAAO,EAAE,QAAQE,QAAO,SAAS,KAAK;AAEvD,SAAO,EAAE,QAAQ,UAAU,OAAOF,MAAKE,QAAO,IAAI,GAAG,SAAS,UAAU,OAAO,KAAK,OAAO,GAAGA,QAAO,IAAI,EAAE;AAC/G;AAEA,SAAS,MAAM,OAAe,UAAkB,MAAyB;AACrE,MAAI,SAAS,UAAU,QAAQ,OAAO,GAAG;AACzC,MAAI,SAAS,UAAU,QAAQ,KAAK;AACpC,MAAI,IAAI;AACR,aAAS;AACL,QAAI,IAAI,MAAM,EAAG,UAAS,UAAU,SAAS,QAAQ,QAAQ,IAAI;AACjE,QAAI,KAAK,MAAM,IAAI,CAAC;AACpB,QAAI,MAAM,EAAG,QAAO;AACpB,aAAS,UAAU,SAAS,QAAQ,QAAQ,IAAI;AAAA,EACpD;AACJ;AAMA,IAAM,aAAa;AAAA,EACf;AAAA,EAAK;AAAA,EAAM;AAAA,EAAM;AAAA,EAAK;AAAA,EAAK;AAAA,EAAO;AAAA,EAAK;AAAA,EAAK;AAAA,EAAO;AAAA,EAAK;AAAA,EACxD;AAAA,EAAS;AAAA,EAAS;AAAA,EAAS;AAAA,EAAW;AAAA,EAAO;AAAA,EAAW;AAAA,EAAW;AAAA,EAAa;AAAA,EAAS;AAAA,EACzF;AAAA,EAAO;AAAA,EAAO;AAAA,EACd;AAAA,EAAQ;AAAA,EAAU;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAU;AAAA,EAC5C;AAAA,EAAY;AAAA,EAAU;AAAA,EAAW;AAAA,EAAc;AAAA,EAC/C;AAAA,EAAO;AAAA,EAAS;AAAA,EAChB;AAAA,EAAgB;AACpB;AAGA,IAAM,oBAAoB,CAAC,gBAAgB,cAAc,kBAAkB,cAAc;AAGzF,IAAM,eAAe,oBAAI,IAAI,CAAC,KAAK,KAAK,SAAS,OAAO,WAAW,OAAO,OAAO,OAAO,QAAQ,QAAQ,CAAC;AAGzG,IAAM,eAAe,oBAAI,IAAI,CAAC,OAAO,SAAS,SAAS,WAAW,QAAQ,UAAU,KAAK,CAAC;AAE1F,IAAM,UAAU,CAAC,KAAK,MAAM,MAAM,KAAK,KAAK,KAAK,KAAK,GAAG;AASzD,SAAS,QAAQ,UAAyB;AACtC,SAAO,EAAE,QAAQ,SAAS,QAAQ,GAAG,OAAO,CAAC,aAAa,IAAI,QAAQ,GAAG,OAAO,CAAC,aAAa,IAAI,QAAQ,EAAE;AAChH;AAGA,SAAS,SAAS,UAA4B;AAC1C,QAAM,SAAS,QAAQ,IAAI,MAAM,CAAC;AAClC,MAAI,OAAO;AACX,aAAW,QAAQ,SAAS,MAAM,GAAG,EAAE,OAAO,CAAAC,UAAQA,MAAK,SAAS,CAAC,GAAG;AACpE,QAAI,SAAS,IAAK,QAAO;AAAA,SACpB;AACD,YAAM,KAAK,QAAQ,QAAQ,IAAI;AAC/B,UAAI,KAAK,EAAG,OAAM,IAAI,MAAM,aAAa,IAAI,kCAAkC;AAC/E,aAAO,EAAE,IAAK,OAAO,EAAE,IAAe;AAAA,IAC1C;AAAA,EACJ;AACA,SAAO;AACX;AAEA,IAAI;AAEJ,SAAS,SAAS,SAAoC;AAClD,aAAW,EAAE,OAAO,WAAW,IAAI,OAAO,GAAG,SAAS,CAAC,GAAG,YAAY,GAAG,iBAAiB,EAAE,IAAI,OAAO,EAAE;AACzG,SAAO,UAAU,OAAO,UAAU,OAAO;AAC7C;AAEA,SAAS,KAAK,OAAwB;AAClC,SAAO,MAAM,UAAW,OAAO,QAAQ,MAAM,IAAI,GAAG,QAAQ,KAAK,KAAK,OAAO,QAAQ,MAAM,IAAI,GAAG,OAAO,KAAK;AAClH;AAOA,SAAS,YAAY,GAAW,aAAqB,SAAiBP,KAAYC,KAAYC,MAAa,QAAmB,SAC1H,MAAiB,SAAkB,MAAuB;AAC1D,MAAI,QAAQ,gBAAgB,OAAO,aAAc,QAAO;AAGxD,QAAM,cAAcF,IAAG,UAAUC,IAAG;AACpC,MAAI,CAAC,eAAe,KAAK,aAAc,QAAO;AAC9C,QAAM,OAAO,OAAO,WAAW,EAAE;AACjC,QAAM,eAAe,QAAQ,WAAW,EAAE;AAC1C,QAAM,YAAY,UAAU,MAAM,GAAG,IAAI;AACzC,QAAM,UAAU,OAAO,QAAQ,UAAU,KAAK,IAAI,GAAG,UAAU,IAAI,IAAI,CAAC,KAAK,IAAI,UAAU,KAAK,IAAI,IAAI,UAAU,IAAI,IAAI;AAC1H,QAAM,eAAe,OAAO,GAAG,KAAK,IAAI,OAAO,CAAC,EAAE,MAAM,OAAO;AAC/D,QAAM,QAAQ,OAAO,IAAI,MAAM,iBAAiB;AAChD,QAAM,SAAS,CAAC,OAAe,WAA4B,OAAO,QAAQ,OAAO,MAAM,MAAM,MAAM,CAAC,KAAK;AACzG,MAAI,CAAC,aAAa;AACd,UAAM,YAAY,KAAK,WAAW,EAAE;AACpC,QAAI,CAAC,OAAOD,IAAG,IAAI,EAAE,MAAM,OAAO,IAAI,KAAK,IAAI,CAAC,EAAE,KAAKC,IAAG,IAAI,CAAC,GAAG,SAAS,EAAG,QAAO;AACrF,QAAI,CAAC,OAAO,aAAa,MAAMC,KAAI,IAAI,CAAC,EAAE,MAAM,IAAI,GAAG,aAAa,MAAM,SAAS,CAAC,EAAG,QAAO;AAC9F,QAAI,WAAW,CAAC,OAAO,YAAY,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,OAAO,GAAG,EAAG,QAAO;AAC5E,QAAI,WAAW,CAAC,OAAO,aAAa,MAAMF,IAAG,IAAI,CAAC,EAAE,MAAM,IAAI,GAAG,SAAS,EAAG,QAAO;AAAA,EACxF;AACA,QAAM,iBAAiB,OAAO,GAAG,OAAO,EAAE,KAAK,OAAO,GAAG,EAAE,IAAI;AAC/D,SAAO,CAAC,WAAW,OAAO,eAAe,MAAM,OAAO,EAAE,MAAM,WAAW,EAAE,MAAM,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,YAAY,MAAM,YAAY,CAAC;AACzI;AAQA,SAAS,MAAM,OAAuC;AAClD,SAAO,MAAM,SAAS,SAAY,EAAE,OAAO,MAAM,IAAI,GAAG,MAAM,MAAM,IAAI,EAAE;AAC9E;AAEA,SAAS,cAAc,GAAWA,KAAYC,KAAYC,MAAa,QAAmB,SAAoB,aAAqB,SAA2B;AAC1J,MAAI,OAAO,gBAAgB,QAAQ,aAAc,QAAO;AACxD,QAAME,OAAkB,EAAE,OAAO,OAAO,KAAK,MAAM,OAAO,IAAI;AAC9D,QAAM,aAAkD;AAAA,IACpD,MAAM,CAAC;AAAA,IAAG,MAAMJ,GAAE;AAAA,IAAG,MAAMC,GAAE;AAAA,IAAG,MAAMC,IAAG;AAAA,IAAG,OAAO,WAAW;AAAA,IAAG,QAAQ,WAAW;AAAA,IAAG,MAAM,WAAW;AAAA,IACxG,UAAU,MAAM,WAAW,IAAIE;AAAA,EACnC;AACA,aAAW,EAAE,QAAQ,OAAO,MAAM,KAAK,SAAS,OAAO,GAAG;AACtD,QAAI,iBAAiB,OAAO;AAC5B,QAAI,gBAAgB,OAAO;AAC3B,QAAI,mBAAmB,OAAO;AAC9B,QAAI,kBAAkB,OAAO;AAC7B,QAAI,OAAO;AACX,aAAS,IAAI,GAAG,IAAI,QAAQ,UAAU,CAAC,MAAM,KAAK;AAC9C,YAAME,SAAQ,OAAO,CAAC;AACtB,UAAIA,WAAU,EAAG;AACjB,YAAM,IAAI,WAAW,CAAC;AACtB,UAAI,MAAM,QAAW;AACjB,eAAO;AACP;AAAA,MACJ;AACA,eAAS,IAAI,GAAG,IAAI,KAAK,IAAIA,MAAK,GAAG,KAAK;AACtC,YAAIA,SAAQ,GAAG;AACX,2BAAiB,eAAe,MAAM,EAAE,KAAK;AAC7C,0BAAgB,cAAc,MAAM,EAAE,IAAI;AAAA,QAC9C,OAAO;AACH,6BAAmB,iBAAiB,MAAM,EAAE,KAAK;AACjD,4BAAkB,gBAAgB,MAAM,EAAE,IAAI;AAAA,QAClD;AAAA,MACJ;AAAA,IACJ;AACA,QAAI,KAAM;AAEV,QAAI,SAAS,OAAO,QAAQ,gBAAgB,SAAS,MAAM,eAAe,CAAC,IAAI,EAAG,QAAO;AACzF,QAAI,SAAS,OAAO,QAAQ,eAAe,QAAQ,MAAM,gBAAgB,CAAC,IAAI,EAAG,QAAO;AAAA,EAC5F;AACA,SAAO;AACX;;;ACzNA,IAAM,eAAe;AAgBrB,SAAS,UAAU,MAAuC;AACtD,QAAM,OAAO,eAAe,MAAM,CAAC;AACnC,MAAI,gBAAgB,QAAS,QAAO;AACpC,QAAM,UAAU,eAAe,MAAM,CAAC;AACtC,MAAI,mBAAmB,QAAS,QAAO;AACvC,QAAM,QAAQ,eAAe,MAAM,CAAC;AACpC,MAAI,iBAAiB,QAAS,QAAO;AACrC,MAAI,SAAS;AACb,MAAI,KAAK,IAAI,CAAC,GAAG;AACb,UAAM,QAAQ,eAAe,MAAM,CAAC;AACpC,QAAI,iBAAiB,QAAS,QAAO;AACrC,aAAS;AAAA,EACb;AACA,MAAI,OAAO;AACX,MAAI,KAAK,IAAI,CAAC,GAAG;AACb,UAAM,QAAQ,eAAe,MAAM,CAAC;AACpC,QAAI,iBAAiB,QAAS,QAAO;AACrC,WAAO;AAAA,EACX;AACA,MAAI,SAAS,KAAK,KAAK,IAAI,OAAO,IAAI,aAAc,QAAO,KAAK,UAAU,OAAO;AACjF,SAAO,EAAE,MAAM,SAAS,OAAO,QAAQ,SAAS,SAAS,EAAE;AAC/D;AASA,SAAS,aAAa,aAAqB,SAAsC;AAC7E,QAAM,UAAU,WAAW,aAAa,OAAO;AAC/C,MAAI,YAAY,OAAW,QAAO;AAClC,QAAM,YAAY,KAAK,IAAI,OAAO;AAClC,MAAIE;AACJ,MAAI,cAAc,KAAK,MAAM,SAAS,EAAG,CAAAA,SAAQC,OAAM,aAAa,SAAS;AAAA,WACpE,gBAAgB,EAAG,CAAAD,SAAQ;AAAA,WAC3B,cAAc,EAAG,CAAAA,SAAQ,cAAc,MAAM,KAAK,KAAK,WAAW,IAAI,IAAoB,YAAY,IAAoB,WAAW,CAAC;AAAA,MAC1I,CAAAA,SAAQ,CAAC,IAAoB,IAAoB,CAAC,WAAW,IAAI,SAAS;AAC/E,SAAO,UAAU,IAAI,IAAIA,SAAQA;AACrC;AAGA,SAAS,WAAW,aAAqB,SAAyC;AAC9E,MAAI,gBAAgB,KAAK,YAAY,EAAG,QAAO;AAC/C,MAAI,gBAAgB,KAAK,UAAU,EAAG,QAAO;AAC7C,MAAI,eAAe,KAAK,YAAY,KAAK,MAAM,OAAO,EAAG,QAAO;AAChE,QAAM,OAAO,IAAI,KAAK,IAAI,OAAO;AACjC,SAAO,OAAO,SAAS,IAAI,KAAK,SAAS,KAAK,MAAM,IAAI,KAAK,KAAK,IAAI,OAAO,CAAC,MAAM,IAAI,SAAY;AACxG;AAMA,SAASC,OAAM,OAAe,UAA0B;AACpD,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,IAAI;AACR,SAAO,IAAI,GAAG;AACV,QAAI,IAAI,MAAM,EAAG,WAAU;AAC3B,QAAI,KAAK,MAAM,IAAI,CAAC;AACpB,QAAI,IAAI,EAAG,WAAU;AAAA,EACzB;AACA,SAAO;AACX;AAQO,SAAS,IAAI,MAA6B;AAC7C,QAAM,UAAU,UAAU,IAAI;AAC9B,MAAI,mBAAmB,QAAS,QAAO;AACvC,QAAM,EAAE,MAAM,SAAS,OAAO,SAAS,QAAQ,QAAQ,QAAQ,IAAI;AACnE,MAAI,YAAY,KAAK,QAAQ,GAAI,QAAO,QAAQ,QAAQ,OAAO;AAC/D,MAAI,SAAS,EAAG,QAAO,aAAa,EAAE,UAAU,UAAU,OAAO;AACjE,QAAM,UAAU,aAAa,MAAM,SAAS,SAAS,QAAQ,OAAO;AACpE,SAAO,YAAY,SAAY,KAAK,UAAU,OAAO,IAAI,aAAa,OAAO;AACjF;AAOO,SAAS,GAAG,MAA6B;AAC5C,QAAM,UAAU,UAAU,IAAI;AAC9B,MAAI,mBAAmB,QAAS,QAAO;AACvC,QAAM,EAAE,MAAM,SAAS,OAAO,SAAS,QAAQ,QAAQ,QAAQ,IAAI;AACnE,MAAI,SAAS,EAAG,QAAO,aAAa,EAAE,SAAS,UAAU,QAAQ;AACjE,QAAM,SAAS,aAAa,IAAI,MAAM,OAAO;AAC7C,MAAI,OAAO,WAAW,SAAU,QAAO,QAAQ,QAAQ,MAAM;AAC7D,MAAI,IAAI,SAAS,EAAG,QAAO,QAAQ,QAAQ,SAAS;AACpD,QAAM,MAAM,IAAI,QAAQ,UAAU,IAAI;AACtC,SAAO,aAAa,EAAE,SAAS,WAAW,QAAQ,SAAS,KAAK,UAAU,MAAM;AACpF;AAOO,SAAS,GAAG,MAA6B;AAC5C,QAAM,UAAU,UAAU,IAAI;AAC9B,MAAI,mBAAmB,QAAS,QAAO;AACvC,QAAM,EAAE,MAAM,SAAS,OAAO,SAAS,QAAQ,SAAS,QAAQ,IAAI;AACpE,MAAI,SAAS,EAAG,QAAO,aAAa,EAAE,UAAU,UAAU,QAAQ;AAClE,QAAM,SAAS,aAAa,IAAI,MAAM,OAAO;AAC7C,MAAI,OAAO,WAAW,SAAU,QAAO,QAAQ,QAAQ,MAAM;AAC7D,QAAM,MAAM,IAAI,QAAQ,UAAU,IAAI;AACtC,SAAO,aAAa,EAAE,UAAU,SAAS,WAAW,QAAQ,SAAS,KAAK,OAAO;AACrF;AAMA,IAAM,aAA+C;AAAA,EACjD,CAAC,QAAQ,UAAU,SAAS,UAAU,OAAO;AAAA,EAC7C,CAAC,QAAQ,SAAS,UAAU,UAAU,OAAO;AAAA,EAC7C,CAAC,SAAS,QAAQ,UAAU,UAAU,OAAO;AAAA,EAC7C,CAAC,QAAQ,UAAU,SAAS,OAAO;AAAA,EACnC,CAAC,QAAQ,UAAU,qBAAqB;AAAA,EACxC,CAAC,QAAQ,UAAU,sBAAsB;AAC7C;AAQA,IAAM,aAA0B,EAAE,OAAO,QAAW,SAAS,MAAM;AACnE,IAAM,aAA0B,EAAE,OAAO,SAAS,SAAS,MAAM;AAEjE,SAAS,YAAY,GAAgB,GAAyB;AAC1D,SAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE;AAClD;AAQO,SAAS,KAAK,MAA6B;AAC9C,QAAM,WAAW,eAAe,MAAM,CAAC;AACvC,MAAI,OAAO;AACX,MAAI;AACJ,MAAI,oBAAoB,SAAS;AAC7B,UAAM,SAAS,SAAS;AACxB,QAAI,WAAW,UAAa,CAAC,OAAO,WAAW,OAAO,UAAW,QAAO;AACxE,gBAAY,OAAO;AAAA,EACvB,MAAO,QAAO;AACd,QAAM,SAAS,QAAQ,MAAM,CAAC;AAC9B,QAAM,QAAQ,QAAQ,MAAM,CAAC;AAC7B,QAAM,eAAe,UAAU,KAAK,QAAQ,CAAC,CAAC,MAAM,UAAU,KAAK,QAAQ,CAAC,CAAC;AAC7E,QAAM,UAAU,QAAQ,WAAW,CAAC,GAA0B,WAAW,MAAM,cAAc,QAAQ,KAAK;AAC1G,aAAW,SAAS,WAAW,MAAM,CAAC,GAAG;AACrC,QAAI,CAAC,YAAY,QAAQ,OAAO,WAAW,MAAM,cAAc,QAAQ,KAAK,GAAG,OAAO,EAAG,QAAO,KAAK,UAAU,OAAO;AAAA,EAC1H;AACA,MAAI,QAAQ,QAAS,QAAO,KAAK,UAAU,OAAO;AAClD,MAAI,QAAQ,UAAU,OAAW,QAAO,QAAQ,QAAQ,QAAQ,KAAK;AACrE,QAAM,cAAc,IAAI;AACxB,QAAM,SAAS,KAAK,MAAM,SAAS,OAAO,CAAC,CAAC;AAC5C,MAAI,QAAQ;AACZ,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACpC,UAAM,WAAW,aAAa,cAAc,KAAK,MAAM,SAAS,OAAO,CAAC,CAAC,IAAI,UAAU,GAAG;AAC1F,QAAI,OAAO,aAAa,SAAU,QAAO,QAAQ,QAAQ,QAAQ;AACjE,aAAS,SAAS,QAAQ,CAAC,IAAI;AAAA,EACnC;AACA,SAAO,aAAa,KAAK;AAC7B;AAEA,SAAS,SAAS,OAAuC,OAAuB;AAC5E,QAAM,OAAO,MAAM,KAAK;AACxB,MAAI,SAAS,OAAW,OAAM,IAAI,MAAM,qDAAqD;AAC7F,SAAO,KAAK;AAChB;AAGA,SAAS,QAAQ,OAA4B,WAAmC,MAAc,cAC1F,QAAwC,OAAoD;AAC5F,aAAW,QAAQ,OAAO;AACtB,QAAI;AACJ,YAAQ,MAAM;AAAA,MACV,KAAK;AACD,kBAAU,cAAc,SAAY,EAAE,OAAO,WAAW,SAAS,MAAM,IAAI,QAAQ,IAAI,aAAa;AACpG;AAAA,MACJ,KAAK;AACD,kBAAU,eAAe,aAAa;AACtC;AAAA,MACJ,KAAK;AACD,kBAAU,aAAa,KAAK;AAC5B;AAAA,MACJ,KAAK;AACD,kBAAU,aAAa,MAAM;AAC7B;AAAA,MACJ,KAAK;AACD,iBAAS,IAAI,GAAG,IAAI,MAAM,UAAU,YAAY,QAAW,KAAK;AAC5D,cAAI,YAAY,OAAO,CAAC,EAAG,WAAU;AAAA,QACzC;AACA;AAAA,MACJ,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACD,kBAAU,OAAO,MAAM,QAAQ,KAAK;AACpC;AAAA,MACJ;AAAS,cAAM,IAAI,MAAM,aAAa,OAAO,IAAI,CAAC,wBAAwB;AAAA,IAC9E;AACA,QAAI,YAAY,OAAW,QAAO;AAAA,EACtC;AACA,SAAO;AACX;AAEA,SAAS,aAAa,OAAgE;AAClF,aAAW,QAAQ,OAAO;AACtB,UAAM,UAAU,UAAU,IAAI;AAC9B,QAAI,YAAY,OAAW,QAAO;AAAA,EACtC;AACA,SAAO;AACX;AAGA,SAAS,OAAO,MAAgB,QAAwC,OAAgE;AACpI,WAAS,IAAI,GAAG,IAAI,KAAK,IAAI,OAAO,QAAQ,MAAM,MAAM,GAAG,KAAK;AAC5D,UAAM,OAAO,UAAU,MAAM,CAAC,CAAC;AAC/B,QAAI,SAAS,OAAW,QAAO;AAC/B,QAAI,SAAS,yBAAyB,YAAY,OAAO,CAAC,EAAG,QAAO;AACpE,UAAM,QAAQ,UAAU,OAAO,CAAC,CAAC;AACjC,QAAI,UAAU,OAAW,QAAO;AAChC,QAAI,SAAS,0BAA0B,YAAY,OAAO,CAAC,EAAG,QAAO;AAAA,EACzE;AACA,SAAO;AACX;AAGA,SAAS,UAAU,MAAkD;AACjE,MAAI,MAAM,YAAY,KAAM,QAAO,EAAE,OAAO,KAAK,OAAO,SAAS,MAAM;AACvE,MAAI,MAAM,SAAS,SAAU,QAAO;AACpC,SAAO,EAAE,OAAO,QAAW,SAAS,KAAK;AAC7C;AAGA,SAAS,YAAY,OAAuC,OAAwB;AAChF,SAAO,KAAK,MAAM,SAAS,OAAO,KAAK,CAAC,IAAI,KAAK,MAAM,SAAS,OAAO,CAAC,CAAC;AAC7E;AAGA,SAAS,UAAU,SAA0B;AACzC,UAAQ,QAAQ,MAAM;AAAA,IAClB,KAAK;AAAU,aAAO,QAAQ,SAAS,EAAE;AAAA,IACzC,KAAK,SAAS;AACV,YAAM,QAAQ,QAAQ,QAAQ;AAC9B,aAAO,MAAM,OAAO,MAAM;AAAA,IAC9B;AAAA,IACA,KAAK;AAAQ,aAAO,QAAQ,KAAK,OAAO,QAAQ,KAAK;AAAA,IACrD,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACD,aAAO;AAAA,IACX;AAAS,YAAM,IAAI,MAAM,aAAa,OAAO,QAAQ,IAAI,CAAC,yBAAyB;AAAA,EACvF;AACJ;AAGA,SAAS,QAAQ,MAAoB,OAAsC;AACvE,QAAM,UAAU,KAAK,QAAQ,KAAK;AAClC,UAAQ,QAAQ,MAAM;AAAA,IAClB,KAAK;AAAU,aAAO,CAAC,QAAQ,MAAM;AAAA,IACrC,KAAK;AAAU,aAAO,CAAC,GAAG,QAAQ,SAAS,CAAC;AAAA,IAC5C,KAAK;AAAS,aAAO,CAAC,GAAG,QAAQ,QAAQ,EAAE,IAAI,CAAC;AAAA,IAChD,KAAK;AAAQ,aAAO,UAAU,QAAQ,MAAM,QAAQ,QAAQ,CAAC;AAAA,IAC7D,KAAK;AAAA,IACL,KAAK;AACD,aAAO,CAAC,MAAS;AAAA,IACrB;AAAS,YAAM,IAAI,MAAM,aAAa,OAAO,QAAQ,IAAI,CAAC,yBAAyB;AAAA,EACvF;AACJ;AAEA,SAAS,UAAU,MAAY,QAA2C;AACtE,MAAI,KAAK,OAAO,KAAK,UAAU,IAAW,QAAO,CAAC,MAAS;AAC3D,QAAM,QAA+B,CAAC;AACtC,WAASC,OAAM,KAAK,MAAMA,QAAO,KAAK,MAAMA,QAAO;AAC/C,aAASC,UAAS,KAAK,SAASA,WAAU,KAAK,SAASA,UAAU,OAAM,KAAK,OAAO,KAAK,IAAI,YAAYD,MAAKC,OAAM,CAAC,CAAC;AAAA,EAC1H;AACA,SAAO;AACX;;;ACtTO,SAAS,IAAI,MAA6B;AAC7C,SAAO,QAAQ,MAAM,IAAI;AAC7B;AAEO,SAAS,GAAG,MAA6B;AAC5C,SAAO,QAAQ,MAAM,KAAK;AAC9B;AAGA,SAAS,QAAQ,MAAoB,KAAuB;AACxD,MAAI;AACJ,QAAM,UAAU,aAAa,MAAM,WAAS;AACxC,aAAS,OAAO,WAAW,UAAa,WAAW,QAAS,WAAW,UAAa,UAAW;AAAA,EACnG,CAAC;AACD,MAAI,YAAY,OAAW,QAAO;AAClC,SAAO,WAAW,SAAY,QAAQ,QAAQ,SAAS,IAAI,cAAc,MAAM;AACnF;AAUA,SAAS,aAAa,MAAoB,MAAqD;AAC3F,QAAM,YAAY,KAAK;AACvB,WAAS,IAAI,GAAG,IAAI,KAAK,OAAO,KAAK;AACjC,UAAM,UAAU,KAAK,QAAQ,CAAC;AAC9B,YAAQ,QAAQ,MAAM;AAAA,MAClB,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACD,mBAAW,SAAS,UAAU,YAAY,OAAO,GAAG;AAChD,cAAI,MAAM,QAAS,QAAO,QAAQ,GAAG,KAAK;AAC1C,cAAI,MAAM,SAAS,SAAU,MAAK,MAAM,WAAW,CAAC;AAAA,mBAC3C,MAAM,SAAS,UAAW,MAAK,MAAM,OAAO;AAAA,QACzD;AACA;AAAA,MACJ,KAAK;AACD,aAAK,KAAK;AACV;AAAA,MACJ,KAAK,UAAU;AACX,cAAM,SAAS,QAAQ;AACvB,YAAI,WAAW,OAAW;AAC1B,YAAI,OAAO,QAAS,QAAO,QAAQ,GAAG,MAAM;AAC5C,cAAM,QAAQ,QAAQ,MAAM;AAC5B,YAAI,UAAU,OAAW,MAAK,KAAK;AACnC;AAAA,MACJ;AAAA,MACA;AAAS,cAAM,IAAI,MAAM,aAAa,OAAO,QAAQ,IAAI,CAAC,yBAAyB;AAAA,IACvF;AAAA,EACJ;AACA,SAAO;AACX;AAGO,SAAS,IAAI,MAA6B;AAC7C,QAAM,QAAQ,eAAe,MAAM,CAAC;AACpC,MAAI,iBAAiB,QAAS,QAAO;AACrC,MAAI,UAAU,OAAW,QAAO,cAAc,IAAI;AAClD,QAAM,QAAQ,QAAQ,KAAK;AAC3B,SAAO,UAAU,SAAY,QAAQ,QAAQ,SAAS,IAAI,cAAc,CAAC,KAAK;AAClF;AAGO,SAAS,KAAK,MAA6B;AAC9C,QAAM,UAAU,KAAK,QAAQ,CAAC;AAC9B,MAAI,QAAQ,OAAO,EAAG,QAAO,SAAS,IAAI;AAC1C,QAAM,QAAQ,KAAK,UAAU,SAAS,OAAO;AAC7C,MAAI,OAAO,YAAY,QAAQ,MAAM,UAAU,OAAQ,QAAO,WAAW,IAAI;AAC7E,SAAO,QAAQ,SAAS,KAAK;AACjC;AAGO,SAAS,QAAQ,MAA6B;AACjD,SAAO,QAAQ,MAAM,WAAS,UAAU,MAAS;AACrD;AAGO,SAAS,SAAS,MAA6B;AAClD,SAAO,QAAQ,MAAM,WAAS,OAAO,SAAS,QAAQ;AAC1D;AAQA,SAAS,QAAQ,MAAoB,MAAsD;AACvF,QAAM,UAAU,KAAK,SAAS,CAAC;AAC/B,MAAI,QAAQ,OAAO,EAAG,QAAO,SAAS,IAAI;AAC1C,QAAM,QAAQ,KAAK,UAAU,SAAS,OAAO;AAC7C,MAAI,OAAO,YAAY,SAAS,MAAM,UAAU,mBAAmB,MAAM,UAAU,UAAW,QAAO,QAAQ,GAAG,KAAK;AACrH,SAAO,cAAc,KAAK,KAAK,CAAC;AACpC;AAGO,SAAS,OAAO,MAA6B;AAChD,SAAO,QAAQ,MAAM,WAAS,OAAO,SAAS,MAAM;AACxD;AAGO,SAAS,KAAK,MAA6B;AAC9C,SAAO,QAAQ,MAAM,WAAS,OAAO,YAAY,QAAQ,MAAM,UAAU,MAAM;AACnF;AAMO,SAAS,cAAuB;AACnC,QAAM,IAAI,MAAM,2DAA2D;AAC/E;AAGO,SAAS,KAAc;AAC1B,SAAO,QAAQ,QAAQ,MAAM;AACjC;AASO,SAAS,UAAU,MAA6B;AACnD,QAAM,UAAU,KAAK,QAAQ,CAAC;AAC9B,MAAI,QAAQ,OAAO,EAAG,QAAO,SAAS,IAAI;AAC1C,QAAM,QAAQ,KAAK,UAAU,SAAS,OAAO;AAC7C,MAAI,OAAO,YAAY,KAAM,QAAO,QAAQ,QAAQ,MAAM;AAC1D,UAAQ,MAAM,OAAO;AAAA,IACjB,KAAK;AAAU,aAAO,QAAQ,GAAG,MAAM,WAAW,CAAC,CAAC;AAAA,IACpD,KAAK;AAAW,aAAO,QAAQ,GAAG,MAAM,WAAW,CAAC,CAAC;AAAA,IACrD,KAAK;AAAW,aAAO,QAAQ,GAAG,MAAM,WAAW,CAAC,CAAC;AAAA,IACrD,KAAK;AAAS,aAAO,QAAQ,GAAG,MAAM,WAAW,CAAC,CAAC;AAAA,IACnD,KAAK;AAAU,aAAO,QAAQ,GAAG,MAAM,WAAW,CAAC,CAAC;AAAA,IACpD,KAAK;AAAS,aAAO,QAAQ,GAAG,MAAM,WAAW,CAAC,CAAC;AAAA,IACnD,KAAK;AAAQ,aAAO,QAAQ,GAAG,MAAM,WAAW,CAAC,CAAC;AAAA,IAClD,KAAK;AAAW,aAAO,QAAQ,GAAG,MAAM,WAAW,CAAC,CAAC;AAAA,IACrD,KAAK;AAAa,aAAO,QAAQ,GAAG,MAAM,WAAW,EAAE,CAAC;AAAA,IACxD,KAAK;AAAa,aAAO,QAAQ,GAAG,MAAM,WAAW,EAAE,CAAC;AAAA,IACxD,KAAK;AAAa,aAAO,QAAQ,GAAG,MAAM,WAAW,EAAE,CAAC;AAAA,IACxD,KAAK;AAAW,aAAO,QAAQ,GAAG,MAAM,WAAW,EAAE,CAAC;AAAA,IACtD,KAAK;AAAU,aAAO,QAAQ,GAAG,MAAM,WAAW,EAAE,CAAC;AAAA,IACrD,KAAK;AAAA,IACL,KAAK;AACD,aAAO,QAAQ,GAAG,KAAK;AAAA,IAC3B;AAAS,aAAO,QAAQ,QAAQ,SAAS;AAAA,EAC7C;AACJ;AAMO,SAAS,IAAI,MAA6B;AAC7C,WAAS,IAAI,GAAG,IAAI,IAAI,KAAK,OAAO,KAAK,GAAG;AACxC,UAAM,OAAO,KAAK,QAAQ,CAAC;AAC3B,QAAI,QAAQ,IAAI,EAAG,QAAO,SAAS,IAAI;AACvC,UAAM,QAAQ,KAAK,UAAU,SAAS,IAAI;AAC1C,QAAI,QAAQ;AACZ,QAAI,UAAU,QAAW;AACrB,YAAMC,QAAO,QAAQ,KAAK;AAC1B,UAAIA,UAAS,OAAW,QAAO,QAAQ,QAAQ,MAAM,UAAU,MAAM,QAAQ,SAAS;AACtF,cAAQA;AAAA,IACZ;AACA,QAAI,MAAO,QAAO,KAAK,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,IAAI,QAAQ,GAAG,MAAM,WAAW,CAAC,CAAC;AAAA,EAC5F;AACA,SAAO,QAAQ,QAAQ,MAAM;AACjC;AAOO,SAAS,eAAe,MAA6B;AACxD,QAAM,aAAa,eAAe,MAAM,CAAC;AACzC,MAAI,sBAAsB,QAAS,QAAO;AAC1C,QAAM,QAAQ,KAAK,OAAO,KAAK,QAAQ,KAAK,CAAC;AAC7C,WAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAC5B,UAAM,KAAK,IAAI,IAAI;AACnB,UAAM,YAAY,eAAe,MAAM,EAAE;AACzC,QAAI,qBAAqB,QAAS,QAAO;AACzC,QAAI,cAAc,YAAY,WAAW,kBAAkB,MAAM,GAAG;AAChE,aAAO,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,KAAK,CAAC,IAAI,QAAQ,GAAG,MAAM,WAAW,CAAC,CAAC;AAAA,IACnF;AAAA,EACJ;AACA,QAAM,cAAc,KAAK,QAAQ,KAAK,MAAM;AAC5C,SAAO,aAAa,KAAK,QAAQ,KAAK,QAAQ,CAAC,IAAI,QAAQ,QAAQ,MAAM;AAC7E;AAGO,SAAS,IAAI,MAA6B;AAC7C,QAAMA,QAAO,EAAE,KAAK,OAAO,KAAK,MAAM;AACtC,QAAM,UAAU,aAAa,MAAM,WAAS;AACxC,IAAAA,MAAK,MAAM;AACX,QAAI,MAAO,CAAAA,MAAK,MAAM,CAACA,MAAK;AAAA,EAChC,CAAC;AACD,MAAI,YAAY,OAAW,QAAO;AAClC,SAAOA,MAAK,MAAM,cAAcA,MAAK,GAAG,IAAI,QAAQ,QAAQ,SAAS;AACzE;;;ACpNO,IAAM,qBAAN,cAAiC,YAAY;AAAA;AAAA,EAEvC;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA;AAAA;AAAA,EAGT,YAAY,SAAiB,UAAkB,QAAgB,QAAkF,CAAC,GAAG;AACjJ,UAAM,gBAAgB,OAAO,gCAAgC,OAAO,QAAQ,CAAC,KAAK,MAAM,EAAE;AAC1F,SAAK,OAAO;AACZ,SAAK,UAAU;AACf,SAAK,WAAW;AAChB,SAAK,SAAS;AACd,SAAK,kBAAkB,MAAM,oBAAoB;AACjD,SAAK,gBAAgB,MAAM,kBAAkB;AAAA,EACjD;AACJ;;;ACFA,SAAS,MAAM,MAAiB,UAAkBC,OAAc,YAAqB,QAAwB,CAAC,GAAU;AACpH,SAAO;AAAA,IACH;AAAA,IAAM;AAAA,IAAU,MAAAA;AAAA,IAAM;AAAA,IAAY,QAAQ;AAAA,IAAG,QAAQ;AAAA,IAAG,WAAW;AAAA,IAAW,OAAO;AAAA,IAAW,WAAW;AAAA,IAAW,WAAW;AAAA,IACjI,GAAG;AAAA,EACP;AACJ;AAEA,IAAM,YAAY,OAAO;AACzB,IAAM,YAAY,OAAO,uGACnB,OAAO;AAGb,IAAM,mBAAmB,IAAI,OAAO,eAAe,SAAS,OAAO,SAAS,IAAI,IAAI;AAMpF,IAAM,mBAAmB;AAGzB,IAAM,2BAA2B,IAAI,OAAO,YAAY,SAAS,WAAW,IAAI;AAEhF,IAAM,gBAAgB;AAEtB,IAAM,cAAc;AAEpB,IAAM,YAAY,CAAC,MAAM,MAAM,MAAM,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG;AAGrF,IAAM,kBAAkB;AAExB,SAAS,YAAY,SAAiBA,OAAc,IAAoC;AACpF,UAAQ,YAAY;AACpB,SAAO,QAAQ,KAAKA,KAAI;AAC5B;AAEA,SAAS,SAAS,OAA4D;AAC1E,MAAI,MAAM,WAAW,OAAW,OAAM,IAAI,MAAM,6DAA6D;AAC7G,SAAO,MAAM;AACjB;AAMA,SAAS,eAAe,SAAiB,IAAoB;AACzD,QAAM,QAAQ,QAAQ,WAAW,EAAE;AACnC,MAAI,EAAE,SAAS,KAAK,KAAK,UAAU,MAAQ,UAAU,IAAO,QAAO;AACnE,MAAI,IAAI,KAAK;AACb,SAAO,IAAI,QAAQ,QAAQ;AACvB,UAAM,IAAI,QAAQ,WAAW,CAAC;AAC9B,QAAI,EAAE,SAAS,CAAC,KAAK,aAAa,CAAC,KAAK,MAAM,MAAQ,MAAM,IAAO;AACnE;AAAA,EACJ;AACA,SAAO,IAAI;AACf;AAGO,SAAS,UAAUA,OAAsB;AAC5C,WAAS,IAAI,GAAG,IAAIA,MAAK,QAAQ,KAAK;AAClC,QAAI,CAAC,QAAQA,MAAK,WAAW,CAAC,CAAC,EAAG,QAAO;AAAA,EAC7C;AACA,SAAO;AACX;AAMO,SAAS,oBAAoB,GAAoB;AACpD,SAAO,MAAM,OAAO,MAAM,QAAQ,MAAM;AAC5C;AAGO,SAAS,SAAS,SAAiB,OAAwB;AAC9D,QAAM,SAAkB,CAAC;AACzB,MAAI;AACA,SAAK,SAAS,OAAO,MAAM;AAC3B,WAAO;AAAA,EACX,SAASC,QAAO;AACZ,UAAM,OAAO,mBAAmB,MAAM;AACtC,QAAI,EAAEA,kBAAiB,uBAAuB,SAAS,OAAW,OAAMA;AAGxE,UAAM,KAAK,KAAK,WAAW,UAAU,KAAK,IAAI;AAC9C,UAAM,IAAI,mBAAmB,SAAS,IAAI,IAAI,QAAQ,OAAO,EAAE,CAAC,oDAAoD;AAAA,EACxH;AACJ;AAMO,SAAS,mBAAmB,QAA6C;AAC5E,MAAI;AACJ,aAAW,KAAK,QAAQ;AACpB,QAAI,EAAE,SAAS,OAAQ;AACvB,QAAI,iBAAiB,EAAE,MAAM,KAAK,EAAG,QAAO;AAC5C,QAAI,SAAS,UAAa,UAAU,EAAE,IAAI,KAAK,EAAG,QAAO;AAAA,EAC7D;AACA,SAAO;AACX;AAEA,SAAS,KAAK,SAAiB,OAAe,QAAuB;AACjE,MAAI,IAAI;AACR,aAAS;AACL,QAAI,aAAa;AACjB,WAAO,IAAI,QAAQ,UAAU,aAAa,QAAQ,WAAW,CAAC,CAAC,GAAG;AAC9D,UAAI,CAAC,oBAAoB,QAAQ,OAAO,CAAC,CAAC,GAAG;AACzC,cAAM,IAAI,mBAAmB,SAAS,GAAG,qGAAqG;AAAA,MAClJ;AACA;AACA,mBAAa;AAAA,IACjB;AACA,QAAI,KAAK,QAAQ,QAAQ;AACrB,aAAO,KAAK,MAAM,OAAO,GAAG,IAAI,UAAU,CAAC;AAC3C;AAAA,IACJ;AAEA,UAAM,IAAI,QAAQ,OAAO,CAAC;AAC1B,QAAI,MAAM,KAAK;AACX,UAAID,QAAO;AACX,UAAI,IAAI,IAAI;AACZ,iBAAS;AACL,YAAI,KAAK,QAAQ,OAAQ,OAAM,IAAI,mBAAmB,SAAS,GAAG,yCAAyC;AAC3G,YAAI,QAAQ,OAAO,CAAC,MAAM,KAAK;AAC3B,cAAI,IAAI,IAAI,QAAQ,UAAU,QAAQ,OAAO,IAAI,CAAC,MAAM,KAAK;AACzD,YAAAA,SAAQ;AACR,iBAAK;AACL;AAAA,UACJ;AACA;AAAA,QACJ;AACA,QAAAA,SAAQ,QAAQ,OAAO,CAAC;AACxB;AAAA,MACJ;AACA,aAAO,KAAK,MAAM,QAAQ,GAAGA,OAAM,YAAY,EAAE,QAAQ,IAAI,IAAI,EAAE,CAAC,CAAC;AACrE,UAAI,IAAI;AACR;AAAA,IACJ;AAEA,QAAI,MAAM,KAAK;AAEX,YAAM,UAAU,YAAY,MAAM,GAAG,CAAC,EAAE,KAAK,OAAK,uBAAuB,SAAS,GAAG,CAAC,CAAC;AACvF,UAAI,YAAY,OAAW,OAAM,IAAI,mBAAmB,SAAS,GAAG,0CAA0C;AAC9G,aAAO,KAAK,MAAM,SAAS,GAAG,SAAS,YAAY,EAAE,OAAO,SAAS,QAAQ,QAAQ,OAAO,CAAC,CAAC;AAC9F,WAAK,QAAQ;AACb;AAAA,IACJ;AAEA,QAAI,MAAM,OAAO,MAAM,OAAO,MAAM,KAAK;AACrC,aAAO,KAAK,MAAM,MAAM,MAAM,oBAAoB,MAAM,MAAM,qBAAqB,SAAS,GAAG,GAAG,YAAY,EAAE,QAAQ,EAAE,CAAC,CAAC;AAC5H;AACA;AAAA,IACJ;AAEA,UAAM,iBAAiB,YAAY,0BAA0B,SAAS,CAAC;AACvE,QAAI,mBAAmB,MAAM;AACzB,YAAME,OAAM,UAAU,SAAS,cAAc,GAAG,OAAO;AACvD,aAAO,KAAK,MAAM,SAAS,GAAG,eAAe,CAAC,GAAG,YAAY;AAAA,QACzD,OAAO;AAAA,QAAS,WAAW,aAAaA,IAAG;AAAA,QAAG,QAAQ,eAAe,CAAC,EAAE;AAAA,MAC5E,CAAC,CAAC;AACF,WAAK,eAAe,CAAC,EAAE;AACvB;AAAA,IACJ;AAEA,UAAM,SAAS,WAAW,SAAS,CAAC;AACpC,QAAI,WAAW,QAAW;AAEtB,UAAI,EAAE,WAAW,SAAS,QAAQ,WAAW,IAAI;AACjD,UAAI,QAAQ,UAAU,UAAU,IAAI,aAAa,QAAQ,UAAU,QAAQ,OAAO,IAAI,UAAU,MAAM,KAAK;AACvG,kBAAU,QAAQ,KAAK,EAAE,SAAS,KAAK,CAAC;AACxC;AAAA,MACJ;AACA,aAAO,KAAK,MAAM,aAAa,GAAG,QAAQ,MAAM,GAAG,IAAI,UAAU,GAAG,YAAY,EAAE,WAAW,SAAS,QAAQ,WAAW,CAAC,CAAC;AAC3H,WAAK;AACL;AAAA,IACJ;AAEA,UAAM,iBAAiB,YAAY,kBAAkB,SAAS,CAAC;AAC/D,UAAM,SAAS,mBAAmB,OAAO,SAAY,YAAY,cAAc;AAC/E,QAAI,mBAAmB,QAAQ,WAAW,QAAW;AAEjD,UAAI,SAAS,eAAe,CAAC,EAAE;AAC/B,UAAI,YAAY;AAChB,UAAI,UAAU,UAAU,UAAU,IAAI,SAAS,QAAQ,UAAU,QAAQ,OAAO,IAAI,MAAM,MAAM,KAAK;AACjG,oBAAY,UAAU,KAAK,EAAE,SAAS,KAAK,CAAC;AAC5C;AAAA,MACJ;AACA,aAAO,KAAK,MAAM,aAAa,GAAG,QAAQ,MAAM,GAAG,IAAI,MAAM,GAAG,YAAY,EAAE,WAAW,OAAO,CAAC,CAAC;AAClG,WAAK;AACL;AAAA,IACJ;AAEA,QAAI,aAAa,QAAQ,WAAW,CAAC,CAAC,KAAK,MAAM,KAAK;AAClD,YAAMC,UAAS,YAAY,eAAe,SAAS,CAAC;AACpD,UAAIA,YAAW,KAAM,OAAM,IAAI,mBAAmB,SAAS,GAAG,uBAAuB;AACrF,YAAM,QAAQ,mBAAmBA,QAAO,CAAC,CAAC;AAE1C,UAAI,CAAC,OAAO,SAAS,KAAK,KAAK,QAAQ,gBAAiB,OAAM,IAAI,mBAAmB,SAAS,GAAG,0BAA0B;AAC3H,aAAO,KAAK,MAAM,UAAU,GAAGA,QAAO,CAAC,GAAG,YAAY,EAAE,QAAQ,OAAO,QAAQA,QAAO,CAAC,EAAE,OAAO,CAAC,CAAC;AAClG,WAAKA,QAAO,CAAC,EAAE;AACf;AAAA,IACJ;AAEA,UAAM,aAAa,eAAe,SAAS,CAAC;AAC5C,QAAI,aAAa,GAAG;AAChB,YAAM,OAAO,QAAQ,MAAM,GAAG,IAAI,UAAU;AAC5C,YAAM,MAAM,IAAI;AAChB,UAAI,MAAM,QAAQ,UAAU,QAAQ,OAAO,GAAG,MAAM,KAAK;AAErD,cAAM,OAAO,UAAU,IAAI;AAC3B,YAAI,QAAQ,EAAG,OAAM,IAAI,mBAAmB,SAAS,IAAI,MAAM,IAAI,QAAQ,OAAO,IAAI,IAAI,CAAC,oDAAoD;AAC/I,cAAMC,UAAS,iBAAiB,SAAS,GAAG;AAC5C,YAAIA,QAAO,YAAY,OAAW,OAAM,IAAI,mBAAmB,SAASA,QAAO,QAAQ,UAAUA,QAAO,QAAQ,MAAM;AACtH,eAAO,KAAK,MAAM,uBAAuB,GAAGA,QAAO,QAAQ,YAAY,EAAE,WAAW,MAAM,QAAQA,QAAO,QAAQ,EAAE,CAAC,CAAC;AACrH,YAAIA,QAAO;AACX;AAAA,MACJ;AACA,aAAO,KAAK,MAAM,QAAQ,GAAG,MAAM,YAAY,EAAE,QAAQ,WAAW,CAAC,CAAC;AACtE,UAAI;AACJ;AAAA,IACJ;AAEA,UAAM,KAAK,UAAU,KAAK,OAAK,QAAQ,WAAW,GAAG,CAAC,CAAC;AACvD,QAAI,OAAO,QAAW;AAClB,aAAO,KAAK,MAAM,YAAY,GAAG,IAAI,YAAY,EAAE,QAAQ,GAAG,OAAO,CAAC,CAAC;AACvE,WAAK,GAAG;AACR;AAAA,IACJ;AAEA,UAAM,IAAI,mBAAmB,SAAS,GAAG,IAAI,CAAC,oDAAoD;AAAA,EACtG;AACJ;AAWA,SAAS,iBAAiB,SAAiBC,OAAgC;AACvE,QAAM,UAAUA,QAAO,IAAI,QAAQ,UAAU,QAAQ,OAAOA,QAAO,CAAC,MAAM;AAC1E,MAAI,IAAIA,SAAQ,UAAU,IAAI;AAC9B,MAAID,UAAS;AACb,aAAS;AACL,QAAI,KAAK,QAAQ,OAAQ,QAAO,EAAE,SAAS,EAAE,UAAUC,OAAM,QAAQ,mDAAmD,EAAE;AAC1H,UAAM,IAAI,QAAQ,OAAO,CAAC;AAC1B,QAAI,MAAM,OAAO,IAAI,IAAI,QAAQ,QAAQ;AACrC,MAAAD,WAAU,QAAQ,OAAO,IAAI,CAAC;AAC9B,WAAK;AACL;AAAA,IACJ;AACA,QAAI,MAAM,OAAO,MAAM,OAAO,MAAM,IAAK,QAAO,EAAE,SAAS,EAAE,UAAU,GAAG,QAAQ,qDAAqD,EAAE;AACzI,QAAI,MAAM,IAAK;AACf,IAAAA,WAAU;AACV;AAAA,EACJ;AACA,MAAI,SAAS;AACT,QAAI,IAAI,KAAK,QAAQ,UAAU,QAAQ,OAAO,IAAI,CAAC,MAAM,IAAK,QAAO,EAAE,SAAS,EAAE,UAAU,GAAG,QAAQ,qDAAqD,EAAE;AAC9J;AAAA,EACJ;AACA,MAAIA,QAAO,WAAW,EAAG,QAAO,EAAE,SAAS,EAAE,UAAUC,OAAM,QAAQ,4CAA4C,EAAE;AACnH,SAAO,EAAE,QAAAD,SAAQ,OAAO,IAAI,EAAE;AAClC;AAuBO,SAAS,eAAe,SAAiB,IAAwC;AACpF,QAAM,QAAQ,YAAY,kBAAkB,SAAS,EAAE;AACvD,MAAI,UAAU,QAAQ,YAAY,KAAK,MAAM,OAAW,QAAO;AAC/D,QAAM,UAAU,MAAM,SAAS;AAC/B,MAAI,YAAY,OAAW,OAAM,IAAI,MAAM,8DAA8D;AACzG,QAAM,SAAyD,CAAC;AAChE,aAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,SAAS,KAAK,CAAC,GAAG;AACzD,UAAM,OAAO,QAAQ,IAAI;AACzB,WAAO,IAAI,IAAI,UAAU,UAAa,SAAS,SAAY,SAAY,EAAE,OAAO,OAAO,KAAK,CAAC,EAAE;AAAA,EACnG;AACA,SAAO,EAAE,OAAO,MAAM,OAAO,QAAQ,MAAM,CAAC,EAAE,QAAQ,OAAO;AACjE;AAGO,SAAS,cAAc,SAAiB,IAAkE;AAC7G,QAAM,QAAQ,YAAY,kBAAkB,SAAS,EAAE;AACvD,QAAM,YAAY,UAAU,OAAO,SAAY,YAAY,KAAK;AAChE,SAAO,UAAU,QAAQ,cAAc,SAAY,SAAY,EAAE,WAAW,QAAQ,MAAM,CAAC,EAAE,OAAO;AACxG;AAOO,SAAS,wBAAwB,SAAiB,IAA2E;AAChI,QAAM,OAAO,YAAY,aAAa,SAAS,EAAE;AACjD,MAAI,SAAS,KAAM,QAAO;AAC1B,QAAMC,QAAO,KAAK,KAAK,CAAC,EAAE;AAC1B,MAAIA,SAAQ,QAAQ,UAAU,QAAQ,OAAOA,KAAI,MAAM,IAAK,QAAO;AACnE,QAAMD,UAAS,iBAAiB,SAASC,KAAI;AAC7C,SAAOD,QAAO,YAAY,SAAY,EAAE,OAAO,KAAK,CAAC,GAAG,QAAQA,QAAO,QAAQ,QAAQA,QAAO,QAAQ,GAAG,IAAI;AACjH;AAMA,SAAS,WAAW,SAAiB,IAAkE;AACnG,QAAM,OAAO,YAAY,kBAAkB,SAAS,EAAE;AACtD,MAAI,SAAS,KAAM,QAAO;AAC1B,QAAME,SAAQ,YAAY,kBAAkB,SAAS,KAAK,KAAK,CAAC,EAAE,MAAM;AACxE,MAAIA,WAAU,QAAQ,SAASA,MAAK,EAAE,OAAO,MAAM,OAAW,QAAO;AACrE,QAAM,YAAY,YAAYA,MAAK;AACnC,MAAI,cAAc,OAAW,QAAO;AACpC,QAAM,SAAS,SAAS,IAAI;AAC5B,QAAM,QAAQ,OAAO,aAAa,KAAK,UAAU,QAAQ,OAAO;AAChE,QAAM,OAAO,OAAO,YAAY,KAAK,UAAU,QAAQ,MAAM;AAC7D,SAAO;AAAA,IACH,WAAW,UAAU,KAAK,EAAE,WAAW,MAAM,WAAW,MAAM,GAAG,GAAG,eAAe,KAAK,WAAW,MAAM,GAAG,EAAE,CAAC;AAAA,IAC/G,QAAQ,KAAK,CAAC,EAAE,SAASA,OAAM,CAAC,EAAE;AAAA,EACtC;AACJ;AAEA,SAAS,UAAU,QAA4C,MAAsB;AACjF,QAAM,QAAQ,OAAO,IAAI;AACzB,MAAI,UAAU,OAAW,OAAM,IAAI,MAAM,wBAAwB,IAAI,4BAA4B;AACjG,SAAO;AACX;AAEA,SAAS,aAAaJ,MAAqB;AACvC,SAAOA,KAAI,OAAO,CAAC,MAAM,MAAMA,KAAI,MAAM,GAAG,EAAE,EAAE,WAAW,MAAM,GAAG,IAAIA;AAC5E;AAEA,SAAS,YAAY,OAA+C;AAChE,QAAM,SAAS,SAAS,KAAK;AAC7B,QAAM,WAAW,OAAO,OAAO;AAC/B,QAAM,QAAQ,aAAa,SAAY,SAAY,aAAa,QAAQ;AAExE,QAAM,SAAS,OAAO,IAAI;AAC1B,MAAI,WAAW,QAAW;AACtB,UAAM,KAAK,SAAS,MAAM;AAC1B,UAAMK,MAAK,MAAM,UAAU,QAAQ,IAAI,CAAC;AACxC,QAAI,OAAO,UAAaA,QAAO,OAAW,QAAO;AACjD,UAAM,SAAS,OAAO,IAAI;AAC1B,QAAI,WAAW,OAAW,QAAO,UAAU,KAAK,OAAOA,IAAG,OAAO,GAAG,OAAOA,IAAG,UAAU,GAAG,QAAQ;AACnG,UAAM,KAAK,SAAS,MAAM;AAC1B,UAAMC,MAAK,MAAM,UAAU,QAAQ,IAAI,CAAC;AACxC,QAAI,OAAO,UAAaA,QAAO,OAAW,QAAO;AAEjD,UAAM,CAACC,OAAMC,MAAK,IAAI,GAAG,QAAQ,GAAG,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;AAC9D,UAAM,CAACC,MAAKC,OAAM,IAAIJ,IAAG,QAAQD,IAAG,QAAQ,CAACC,KAAID,GAAE,IAAI,CAACA,KAAIC,GAAE;AAC9D,WAAO,UAAU,UAAU,OAAOG,KAAI,OAAOF,MAAK,OAAOG,QAAO,OAAOF,OAAM,OAAOC,KAAI,UAAUF,MAAK,UAAUG,QAAO,UAAUF,OAAM,QAAQ;AAAA,EACpJ;AACA,QAAM,UAAU,OAAO,KAAK;AAC5B,MAAI,YAAY,QAAW;AACvB,UAAM,KAAK,SAAS,OAAO;AAC3B,UAAM,KAAK,SAAS,UAAU,QAAQ,KAAK,CAAC;AAC5C,QAAI,OAAO,UAAa,OAAO,OAAW,QAAO;AACjD,UAAM,CAACD,OAAMC,MAAK,IAAI,GAAG,QAAQ,GAAG,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;AAE9D,WAAO,UAAU,UAAU,OAAO,GAAGD,MAAK,OAAO,WAAW,GAAGC,OAAM,OAAO,MAAMD,MAAK,UAAU,MAAMC,OAAM,QAAQ;AAAA,EACzH;AACA,QAAM,KAAK,MAAM,UAAU,QAAQ,KAAK,CAAC;AACzC,QAAM,KAAK,MAAM,UAAU,QAAQ,KAAK,CAAC;AACzC,MAAI,OAAO,UAAa,OAAO,OAAW,QAAO;AACjD,QAAM,CAAC,KAAK,MAAM,IAAI,GAAG,QAAQ,GAAG,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;AAC9D,SAAO,UAAU,UAAU,OAAO,IAAI,OAAO,GAAG,OAAO,OAAO,cAAc,GAAG,IAAI,UAAU,MAAM,OAAO,UAAU,IAAI;AAC5H;AAEA,SAAS,SAASV,OAAgE;AAC9E,QAAM,WAAWA,MAAK,OAAO,CAAC,MAAM;AACpC,QAAM,QAAQ,YAAY,eAAe,WAAWA,MAAK,MAAM,CAAC,IAAIA,KAAI;AACxE,SAAO,UAAU,SAAY,SAAY,EAAE,OAAO,SAAS;AAC/D;AAEA,SAAS,MAAMA,OAAgE;AAC3E,QAAM,WAAWA,MAAK,OAAO,CAAC,MAAM;AACpC,QAAM,SAAS,WAAWA,MAAK,MAAM,CAAC,IAAIA;AAC1C,MAAI,OAAO,OAAO,CAAC,MAAM,IAAK,QAAO;AACrC,QAAM,IAAI,OAAO,MAAM;AACvB,MAAI,IAAI,SAAU,QAAO;AACzB,SAAO,EAAE,OAAO,IAAI,GAAG,SAAS;AACpC;;;ACraA,IAAM,OAAO;AACb,IAAM,QAAQ;AACd,IAAM,QAAQ;AACd,IAAM,iBAAiB;AAGvB,IAAM,aAAa,oBAAI,IAAI;AAAA,EACvB;AAAA,EAAK;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAK;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAK;AAAA,EAAM;AAAA,EAAM;AAAA,EAC3E;AAAA,EAAK;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAK;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EACtE;AAAA,EAAK;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAK;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAClD,CAAC;AAOD,IAAM,QAAQ,oBAAI,IAAkC;AAY7C,SAAS,WAAW,SAAiB,OAAyE;AACjH,QAAM,WAAW,QAAQ,OAAO;AAChC,MAAI,aAAa,OAAW,QAAO;AACnC,aAAW,EAAE,OAAO,MAAAa,MAAK,KAAK,OAAO;AACjC,QAAI,SAAS,WAAW,kBAAkB,KAAKA,KAAI,EAAG,QAAO;AAC7D,QAAI,SAAS,MAAM,KAAKA,KAAI,EAAG,QAAO,EAAE,OAAO,MAAM;AAAA,EACzD;AACA,SAAO,EAAE,OAAO,OAAU;AAC9B;AAEA,SAAS,QAAQ,SAAuC;AACpD,MAAI,MAAM,IAAI,OAAO,EAAG,QAAO,MAAM,IAAI,OAAO;AAChD,MAAI,MAAM,QAAQ,IAAK,OAAM,MAAM;AACnC,QAAM,cAAc,UAAU,OAAO;AACrC,QAAM,WAAW,gBAAgB,SAAY,SAAY,UAAU,WAAW;AAC9E,QAAM,IAAI,SAAS,QAAQ;AAC3B,SAAO;AACX;AAEA,SAAS,UAAU,aAAuE;AAEtF,MAAI,CAAC,gBAAgB,YAAY,IAAI,EAAG,QAAO;AAC/C,SAAO,EAAE,OAAO,IAAI,OAAO,YAAY,MAAM,GAAG,GAAG,SAAS,YAAY,QAAQ;AACpF;AAEA,SAAS,gBAAgBA,OAAuB;AAC5C,MAAI;AACA,SAAK,IAAI,OAAOA,OAAM,GAAG;AACzB,WAAO;AAAA,EACX,SAASC,QAAO;AACZ,QAAIA,kBAAiB,YAAa,QAAO;AACzC,UAAMA;AAAA,EACV;AACJ;AAGO,SAAS,UAAU,SAAiE;AACvF,MAAI,UAAU;AACd,MAAI,SAAS;AACb,QAAM,SAAkB,CAAC;AACzB,MAAI,WAAW;AACf,MAAI,eAAe;AACnB,WAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACrC,UAAM,IAAI,QAAQ,OAAO,CAAC;AAC1B,YAAQ,GAAG;AAAA,MACP,KAAK,MAAM;AACP,YAAI,EAAE,KAAK,QAAQ,OAAQ,QAAO;AAClC,cAAM,UAAU,QAAQ,OAAO,CAAC;AAChC,YAAI,YAAY,KAAK;AACjB,oBAAU,IAAI,KAAK;AACnB,oBAAU;AACV,yBAAe;AAAA,QACnB,WAAW,YAAY,KAAK;AACxB,oBAAU,IAAI,IAAI;AAClB,oBAAU;AACV,yBAAe;AAAA,QACnB,WAAW,YAAY,KAAK;AACxB,oBAAU,IAAI,KAAK;AACnB,oBAAU;AACV,yBAAe;AAAA,QACnB,WAAW,YAAY,KAAK;AACxB,oBAAU,WAAW,IAAI,SAAS,IAAI,WAAW,IAAI,SAAS,IAAI;AAClE,oBAAU;AACV,yBAAe;AAAA,QACnB,WAAW,YAAY,KAAK;AACxB,gBAAM,QAAQ,QAAQ,OAAO,IAAI,CAAC,MAAM,MAAM,QAAQ,QAAQ,KAAK,IAAI,CAAC,IAAI;AAC5E,cAAI,QAAQ,KAAK,CAAC,WAAW,IAAI,QAAQ,MAAM,IAAI,GAAG,KAAK,CAAC,EAAG,QAAO;AACtE,oBAAU,OAAO,QAAQ,MAAM,IAAI,GAAG,KAAK,CAAC;AAC5C,cAAI;AACJ,oBAAU;AACV,yBAAe;AAAA,QACnB,WAAW,WAAW,OAAO,WAAW,KAAK;AACzC,cAAI,OAAO,SAAS,YAAY,EAAG,QAAO;AAE1C,cAAI,QAAQ,WAAW,CAAC,IAAI,KAAK,YAAa,IAAI,IAAI,QAAQ,UAAU,aAAa,QAAQ,WAAW,IAAI,CAAC,CAAC,EAAI,QAAO;AACzH,oBAAU,KAAK,OAAO;AACtB,yBAAe;AAAA,QACnB,OAAO;AACH,cAAI,CAAC,eAAe,SAAS,OAAO,EAAG,QAAO;AAE9C,oBAAU,YAAY,MAAM,MAAM,KAAK,OAAO;AAC9C,yBAAe;AAAA,QACnB;AACA;AAAA,MACJ;AAAA,MACA,KAAK;AACD,kBAAU;AACV,uBAAe;AACf;AAAA,MACJ,KAAK,KAAK;AACN,cAAMC,QAAO,eAAe,SAAS,CAAC;AACtC,YAAIA,UAAS,OAAW,QAAO;AAC/B,kBAAUA,MAAK;AACf,oBAAYA,MAAK;AACjB,YAAIA,MAAK;AACT,uBAAe;AACf;AAAA,MACJ;AAAA,MACA,KAAK;AAED,YAAI,OAAO,SAAS,YAAY,EAAG,QAAO;AAC1C,YAAI,QAAQ,OAAO,IAAI,CAAC,MAAM,KAAK;AAC/B,gBAAM,QAAQ,QAAQ,OAAO,IAAI,CAAC;AAClC,cAAI,UAAU,OAAO,UAAU,KAAK;AAChC,sBAAU,KAAK,KAAK;AACpB,iBAAK;AACL,mBAAO,KAAK,WAAW;AAAA,UAC3B,WAAW,UAAU,QAAQ,QAAQ,OAAO,IAAI,CAAC,MAAM,OAAO,QAAQ,OAAO,IAAI,CAAC,MAAM,MAAM;AAC1F,sBAAU,MAAM,QAAQ,OAAO,IAAI,CAAC,CAAC;AACrC,iBAAK;AACL,mBAAO,KAAK,YAAY;AAAA,UAC5B,MAAO,QAAO;AAAA,QAClB,OAAO;AACH,oBAAU;AACV;AACA,iBAAO,KAAK,SAAS;AAAA,QACzB;AACA,uBAAe;AACf;AAAA,MACJ,KAAK,KAAK;AACN,cAAM,SAAS,OAAO,IAAI;AAC1B,YAAI,WAAW,OAAW,QAAO;AACjC,kBAAU;AAEV,uBAAe,WAAW;AAC1B;AAAA,MACJ;AAAA,MACA,KAAK;AAAA,MACL,KAAK;AACD,kBAAU;AACV,uBAAe;AACf;AAAA,MACJ,KAAK;AAED,kBAAU;AACV,uBAAe;AACf;AAAA,MACJ,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK,KAAK;AACN,YAAI,CAAC,gBAAgB,OAAO,SAAS,YAAY,EAAG,QAAO;AAC3D,kBAAU;AACV,cAAM,OAAO,UAAU,SAAS,CAAC;AACjC,YAAI,SAAS,OAAW,QAAO;AAC/B,kBAAU,KAAK;AACf,YAAI,KAAK;AACT,uBAAe;AACf;AAAA,MACJ;AAAA,MACA,KAAK,KAAK;AACN,YAAI,CAAC,gBAAgB,OAAO,SAAS,YAAY,EAAG,QAAO;AAC3D,cAAM,aAAa,QAAQ,QAAQ,KAAK,CAAC;AACzC,YAAI,aAAa,KAAK,CAACC,QAAO,QAAQ,MAAM,IAAI,GAAG,UAAU,CAAC,EAAG,QAAO;AACxE,kBAAU,QAAQ,MAAM,GAAG,aAAa,CAAC;AACzC,cAAM,OAAO,UAAU,SAAS,UAAU;AAC1C,YAAI,SAAS,OAAW,QAAO;AAC/B,kBAAU,KAAK;AACf,YAAI,KAAK;AACT,uBAAe;AACf;AAAA,MACJ;AAAA,MACA,KAAK;AAAA,MACL,KAAK;AACD,eAAO;AAAA,MACX;AACI,YAAI,YAAY,CAAC,EAAG,QAAO;AAC3B,kBAAUC,SAAQ,CAAC;AACnB,uBAAe;AACf;AAAA,IACR;AAAA,EACJ;AACA,SAAO,OAAO,WAAW,IAAI,EAAE,MAAM,QAAQ,QAAQ,IAAI;AAC7D;AAKA,SAAS,YAAY,GAAoB;AACrC,QAAM,OAAO,EAAE,WAAW,CAAC;AAC3B,SAAO,QAAQ,SAAU,QAAQ;AACrC;AAGA,SAASA,SAAQ,GAAmB;AAChC,SAAO,mBAAmB,SAAS,CAAC,IAAI,KAAK,CAAC,KAAK;AACvD;AAGA,SAAS,UAAU,SAAiB,IAAsD;AACtF,QAAM,OAAO,QAAQ,OAAO,KAAK,CAAC;AAClC,MAAI,SAAS,IAAK,QAAO;AACzB,MAAI,SAAS,IAAK,QAAO,EAAE,MAAM,KAAK,IAAI,KAAK,EAAE;AACjD,SAAO,EAAE,MAAM,IAAI,GAAG;AAC1B;AAGA,SAASD,QAAOE,SAAyB;AACrC,QAAM,QAAQA,QAAO,MAAM,GAAG;AAC9B,QAAM,MAAMC,OAAM,MAAM,CAAC,CAAW;AACpC,MAAI,MAAM,SAAS,KAAK,QAAQ,OAAW,QAAO;AAClD,MAAI,MAAM,WAAW,KAAM,MAAM,CAAC,EAAa,WAAW,EAAG,QAAO;AACpE,QAAM,OAAOA,OAAM,MAAM,CAAC,CAAW;AACrC,SAAO,SAAS,UAAa,OAAO;AACxC;AAEA,SAASA,OAAM,QAAoC;AAC/C,SAAO,OAAO,SAAS,KAAK,OAAO,UAAU,KAAK,WAAW,KAAK,MAAM,IAAI,OAAO,MAAM,IAAI;AACjG;AAGA,SAAS,eAAe,SAAiBC,OAA2E;AAChH,MAAI,IAAIA,QAAO;AACf,QAAM,UAAU,QAAQ,OAAO,CAAC,MAAM;AACtC,MAAI,QAAS;AACb,MAAIC,SAAQ;AACZ,MAAI,YAAY;AAChB,MAAI,UAAU;AACd,MAAI;AACJ,aAAS;AACL,QAAI,KAAK,QAAQ,OAAQ,QAAO;AAChC,UAAM,IAAI,QAAQ,OAAO,CAAC;AAC1B,QAAI,MAAM,KAAK;AACX,UAAI,cAAc,EAAG,QAAO;AAC5B;AAAA,IACJ;AACA,QAAI,MAAM,OAAO,YAAY,CAAC,EAAG,QAAO;AACxC,QAAI,MAAM,MAAM;AACZ,UAAI,IAAI,KAAK,QAAQ,OAAQ,QAAO;AACpC,YAAM,UAAU,QAAQ,OAAO,IAAI,CAAC;AACpC,WAAK;AACL,UAAI,YAAY,KAAK;AACjB,QAAAA,UAAS;AACT,kBAAU;AACV,mBAAW;AAAA,MACf,WAAW,YAAY,KAAK;AACxB,QAAAA,UAAS;AACT,kBAAU;AACV,mBAAW;AAAA,MACf,WAAW,YAAY,KAAK;AACxB,QAAAA,UAAS;AACT,kBAAU;AACV,mBAAW;AAAA,MACf,OAAO;AACH,YAAI,CAAC,eAAe,SAAS,OAAO,EAAG,QAAO;AAC9C,QAAAA,UAAS,KAAK,OAAO;AACrB,mBAAW;AAAA,MACf;AACA;AACA;AAAA,IACJ;AACA,QAAI,MAAM,KAAK;AACX,YAAM,OAAO,QAAQ,OAAO,IAAI,CAAC,MAAM;AACvC,UAAI,cAAc,KAAK,MAAM;AACzB,QAAAA,UAAS;AACT,mBAAW;AACX;AACA;AACA;AAAA,MACJ;AAEA,UAAI,aAAa,UAAa,IAAI,KAAK,QAAQ,OAAQ,QAAO;AAC9D,YAAM,OAAO,QAAQ,OAAO,IAAI,CAAC;AACjC,UAAI,SAAS,QAAQ,SAAS,OAAO,SAAS,OAAO,SAAS,OAAO,YAAY,IAAI,KAAK,OAAO,SAAU,QAAO;AAClH,MAAAA,UAAS,IAAI,aAAa,IAAI,CAAC;AAC/B,iBAAW;AACX,WAAK;AACL;AACA;AAAA,IACJ;AACA,IAAAA,UAAS,aAAa,CAAC;AACvB,eAAW;AACX;AACA;AAAA,EACJ;AACA,SAAO,EAAE,MAAM,IAAI,UAAU,MAAM,EAAE,GAAGA,MAAK,KAAK,SAAS,KAAK,EAAE;AACtE;AAEA,SAAS,aAAa,GAAmB;AACrC,SAAO,MAAM,OAAO,MAAM,QAAQ,MAAM,OAAO,MAAM,OAAO,MAAM,MAAM,KAAK,CAAC,KAAK;AACvF;;;ACtSO,IAAM,SAAN,MAAM,QAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EAET,YAAY,QAAiB,UAAmB,QAAgB;AAC5D,SAAK,SAAS;AACd,SAAK,WAAW;AAChB,SAAK,SAAS;AAAA,EAClB;AAAA,EAEA,OAAO,GAAG,OAAoC;AAC1C,QAAI,MAAM,SAAS,SAAU,QAAO,IAAI,QAAO,OAAO,MAAM,MAAM,SAAS,EAAE,MAAM;AACnF,QAAI,MAAM,SAAS,SAAS;AACxB,YAAM,QAAQ,MAAM,QAAQ;AAC5B,UAAI,MAAM,YAAY,EAAG,QAAO,IAAI,QAAO,OAAO,MAAM,MAAM,IAAI;AAClE,UAAI,MAAM,SAAS,EAAG,QAAO,IAAI,QAAO,OAAO,OAAO,MAAM,OAAO;AACnE,aAAO;AAAA,IACX;AACA,UAAM,OAAO,MAAM;AACnB,QAAI,KAAK,YAAY,EAAG,QAAO,IAAI,QAAO,OAAO,MAAM,KAAK,IAAI;AAChE,QAAI,KAAK,SAAS,EAAG,QAAO,IAAI,QAAO,OAAO,OAAO,KAAK,OAAO;AACjE,WAAO;AAAA,EACX;AAAA;AAAA,EAGA,aAA0B;AACtB,UAAM,QAAqB,CAAC;AAC5B,QAAI,KAAK,OAAO,SAAS,UAAU;AAC/B,YAAMC,UAAS,KAAK,OAAO,SAAS;AACpC,MAAAA,QAAO,QAAQ,CAAC,OAAO,UAAU;AAC7B,YAAI,UAAU,OAAW,OAAM,KAAK,EAAE,OAAO,MAAM,CAAC;AAAA,MACxD,CAAC;AACD,aAAO;AAAA,IACX;AACA,QAAI,KAAK,OAAO,SAAS,SAAS;AAC9B,YAAM,QAAQ,KAAK,OAAO,QAAQ;AAClC,eAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AAClC,cAAM,QAAQ,KAAK,WAAW,MAAM,GAAG,GAAG,CAAC,IAAI,MAAM,GAAG,GAAG,CAAC;AAC5D,YAAI,UAAU,OAAW,OAAM,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC;AAAA,MAC3D;AACA,aAAO;AAAA,IACX;AACA,UAAM,OAAO,KAAK,OAAO;AACzB,UAAM,QAAQ,KAAK,OAAO,QAAQ;AAClC,eAAW,WAAW,MAAM,WAAW,IAAI,GAAG;AAC1C,YAAM,QAAQ,MAAM,KAAK,OAAO;AAChC,UAAI,UAAU,OAAW,OAAM,IAAI,MAAM,aAAa,QAAQ,SAAS,CAAC,2BAA2B;AACnG,YAAM,KAAK,EAAE,OAAO,KAAK,WAAW,QAAQ,MAAM,KAAK,OAAO,QAAQ,SAAS,KAAK,SAAS,MAAM,CAAC;AAAA,IACxG;AACA,WAAO;AAAA,EACX;AAAA;AAAA,EAGA,WAAW,SAAsC;AAC7C,UAAM,SAAS,IAAI,IAAI,KAAK,WAAW,EAAE,IAAI,OAAK,EAAE,KAAK,CAAC;AAC1D,QAAI,OAAO,SAAS,KAAK,OAAQ,QAAO;AACxC,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AAClC,YAAM,QAAQ,UAAU,KAAK,SAAS,IAAI,IAAI;AAC9C,UAAI,CAAC,OAAO,IAAI,KAAK,EAAG,QAAO;AAAA,IACnC;AACA,WAAO;AAAA,EACX;AAAA;AAAA,EAGA,OAAO,OAAwB;AAC3B,QAAI,KAAK,OAAO,SAAS,SAAU,QAAO,QAAQ,SAAS,KAAK,OAAO,SAAS,EAAE,KAAK,CAAC;AACxF,QAAI,KAAK,OAAO,SAAS,SAAS;AAC9B,YAAM,QAAQ,KAAK,OAAO,QAAQ;AAClC,aAAO,QAAQ,SAAS,KAAK,WAAW,MAAM,GAAG,OAAO,CAAC,IAAI,MAAM,GAAG,GAAG,KAAK,CAAC;AAAA,IACnF;AACA,UAAM,OAAO,KAAK,OAAO;AACzB,UAAMC,OAAM,KAAK,WAAW,KAAK,OAAO,QAAQ,KAAK;AACrD,UAAMD,UAAS,KAAK,WAAW,KAAK,UAAU,KAAK,UAAU;AAC7D,WAAO,KAAK,OAAO,UAAU,IAAI,KAAKC,MAAKD,SAAQC,MAAKD,OAAM,CAAC;AAAA,EACnE;AACJ;AAGO,SAAS,MAAM,OAAmB,IAAY,IAAY,IAAY,IAAwB;AACjG,QAAM,SAAS,IAAI,WAAW,KAAK,KAAK,GAAG,KAAK,KAAK,CAAC;AACtD,WAAS,IAAI,IAAI,KAAK,IAAI,KAAK;AAC3B,aAAS,IAAI,IAAI,KAAK,IAAI,IAAK,QAAO,IAAI,IAAI,IAAI,IAAI,IAAI,MAAM,GAAG,GAAG,CAAC,CAAC;AAAA,EAC5E;AACA,SAAO;AACX;AAEO,SAAS,QAAQ,MAA6B;AAEjD,QAAM,gBAAgB,KAAK,QAAQ,CAAC;AACpC,MAAI,QAAQ,aAAa,EAAG,QAAO,SAAS,IAAI;AAChD,QAAM,SAAS,KAAK,UAAU,SAAS,aAAa;AACpD,MAAI,QAAQ,YAAY,KAAM,QAAO,QAAQ,GAAG,MAAM;AAEtD,QAAM,cAAc,aAAa,KAAK,QAAQ,CAAC,CAAC;AAEhD,QAAM,cAAc,aAAa,KAAK,cAAc,CAAC,CAAC;AACtD,MAAI,YAAY,aAAa,YAAY,SAAS,QAAS,QAAO,KAAK,UAAU,OAAO;AACxF,MAAI,CAAC,YAAY,QAAS,QAAO,YAAY,UAAU,cAAc,QAAQ,QAAQ,SAAS;AAC9F,MAAI,CAAC,YAAY,QAAS,QAAO,YAAY,UAAU,cAAc,QAAQ,QAAQ,SAAS;AAE9F,QAAM,SAAS,OAAO,GAAG,WAAW;AACpC,MAAI,WAAW,OAAW,QAAO,QAAQ,QAAQ,SAAS;AAE1D,MAAI;AACJ,MAAIE;AACJ,MAAI,YAAY,SAAS,OAAQ,EAAC,OAAOA,OAAM,IAAI,OAAO,WAAW,CAAC,YAAY,KAAK,MAAM,YAAY,KAAK,OAAO,IAAI,CAAC,YAAY,KAAK,SAAS,YAAY,KAAK,IAAI;AAAA,WAChK,YAAY,SAAS,SAAS;AACnC,UAAMC,SAAQ,YAAY,QAAQ;AAClC,KAAC,OAAOD,OAAM,IAAI,OAAO,WAAW,CAACC,OAAM,MAAMA,OAAM,OAAO,IAAI,CAACA,OAAM,SAASA,OAAM,IAAI;AAAA,EAChG,OAAO;AACH,UAAM,SAAS,YAAY,SAAS,EAAE;AACtC,KAAC,OAAOD,OAAM,IAAI,OAAO,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,MAAM;AAAA,EAChE;AACA,MAAI,UAAU,OAAO,OAAQ,QAAO,QAAQ,QAAQ,SAAS;AAC7D,QAAM,UAAU,OAAO,MAAM,QAAQ,CAAC;AACtC,MAAI,QAAQ,YAAY,OAAW,QAAO,QAAQ;AAClD,QAAM,QAAQ,QAAQ;AACtB,MAAI,UAAU,OAAW,QAAO,KAAK,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,IAAI,QAAQ,QAAQ,MAAM;AACtF,MAAIA,YAAW,GAAG;AACd,UAAM,eAAe,OAAO,GAAG,WAAW;AAC1C,QAAI,iBAAiB,OAAW,OAAM,IAAI,MAAM,kDAAkD;AAClG,UAAM,OAAO,aAAa,OAAO,KAAK;AACtC,WAAO,YAAY,aAAa,KAAK,SAAS,YAAY,KAAK,WAAW,SAAY,KAAK,UAAU,OAAO,IAAI;AAAA,EACpH;AACA,MAAI,YAAY,SAAS,QAAQ;AAC7B,UAAM,OAAO,YAAY;AACzB,WAAO,YAAY,UAAU,OAAO,WAC9B,IAAI,KAAK,KAAK,OAAO,OAAO,KAAK,SAAS,KAAK,OAAO,OAAO,KAAK,OAAO,IACzE,IAAI,KAAK,KAAK,MAAM,KAAK,UAAU,OAAO,KAAK,MAAM,KAAK,UAAU,KAAK,CAAC;AAAA,EACpF;AACA,QAAM,QAAQ,YAAY,QAAQ;AAClC,QAAM,SAAS,OAAO,WAAW,MAAM,OAAO,OAAO,OAAO,GAAG,MAAM,UAAU,CAAC,IAAI,MAAM,OAAO,GAAG,MAAM,OAAO,GAAG,OAAO,KAAK;AAChI,SAAO,YAAY,aAAa,OAAO,IAAI,EAAE,SAAS,MAAS,IAAI,KAAK,UAAU,OAAO,IAAI,QAAQ,QAAQ,MAAM;AACvH;AASA,SAAS,OAAO,MAAoB,QAAgB,SAAgC;AAChF,QAAM,YAAY,KAAK;AACvB,QAAM,gBAAgB,KAAK,QAAQ,CAAC;AACpC,MAAI,QAAQ,aAAa,EAAG,QAAO,EAAE,SAAS,SAAS,IAAI,EAAE;AAC7D,QAAM,SAAS,UAAU,SAAS,aAAa;AAC/C,MAAI,QAAQ,YAAY,KAAM,QAAO,EAAE,SAAS,QAAQ,GAAG,MAAM,EAAE;AAEnE,MAAI,YAAY;AAChB,MAAI,KAAK,IAAI,OAAO,GAAG;AACnB,UAAM,OAAO,eAAe,MAAM,OAAO;AACzC,QAAI,gBAAgB,QAAS,QAAO,EAAE,SAAS,KAAK;AACpD,gBAAY,KAAK,MAAM,IAAI;AAC3B,QAAI,cAAc,KAAK,cAAc,MAAM,cAAc,KAAK,cAAc,KAAK,cAAc,EAAG,QAAO,EAAE,SAAS,QAAQ,QAAQ,SAAS,EAAE;AAAA,EACnJ;AACA,MAAI,aAAa;AACjB,MAAI,KAAK,IAAI,UAAU,CAAC,GAAG;AACvB,UAAM,OAAO,eAAe,MAAM,UAAU,CAAC;AAC7C,QAAI,gBAAgB,QAAS,QAAO,EAAE,SAAS,KAAK;AACpD,iBAAa,KAAK,MAAM,IAAI;AAC5B,QAAI,eAAe,KAAK,eAAe,MAAM,eAAe,KAAK,eAAe,GAAI,QAAO,EAAE,SAAS,QAAQ,QAAQ,SAAS,EAAE;AAAA,EACrI;AAEA,MAAI,eAAe,KAAK,eAAe,IAAI;AACvC,QAAI,cAAc,EAAG,QAAO,EAAE,SAAS,QAAQ,QAAQ,SAAS,EAAE;AAClE,UAAME,UAAS,aAAa,QAAQ,QAAQ,WAAW,eAAe,CAAC;AACvE,WAAOA,YAAW,SAAY,EAAE,SAAS,UAAU,OAAO,EAAE,IAAI,EAAE,OAAOA,QAAO,MAAM;AAAA,EAC1F;AACA,MAAI,WAAW,QAAW;AACtB,QAAI,aAAa,OAAO,WAAW;AACnC,QAAI,eAAe,GAAI,cAAa,WAAW,WAAW;AAC1D,QAAI,cAAc,GAAG;AAEjB,YAAM,QAAQ,WAAW,OAAO,OAAK,CAAC,EAAE,MAAM,OAAO,EAAE,IAAI,QAAM,EAAE,OAAO,EAAE,OAAO,MAAM,UAAU,OAAO,EAAE,KAAK,EAAE,EAAE;AACrH,YAAM,UAAU,WAAW,UAAU,OAAO,MAAM,GAAG,KAAK;AAC1D,aAAO,YAAY,SAAY,EAAE,SAAS,UAAU,OAAO,EAAE,IAAI,EAAE,OAAO,QAAQ,MAAM;AAAA,IAC5F;AACA,YAAQ,WAAW;AAAA,MACf,KAAK;AAAG,eAAO,EAAE,OAAO,WAAW,YAAY,MAAM,EAAE;AAAA,MACvD,KAAK;AAAG,eAAO,EAAE,OAAO,cAAc,YAAY,MAAM,EAAE;AAAA,MAC1D;AAAS,eAAO,EAAE,OAAO,QAAQ,YAAY,QAAQ,SAAS,EAAE;AAAA,IACpE;AAAA,EACJ;AAEA,MAAI,cAAc,EAAG,QAAO,EAAE,OAAO,OAAO,WAAW,eAAe,EAAE,EAAE;AAC1E,SAAO,CAAC;AACZ;AAUA,SAAS,aAAa,QAAgB,QAA2B,WAAmB,WAA+D;AAC/I,MAAI,cAAc,KAAK,cAAc,KAAK,WAAW,UAAa,OAAO,WAAW,CAAC,UAAU,MAAM,EAAG,QAAO;AAC/G,QAAM,aAAa,OAAO,WAAW;AACrC,MAAI,WAAW,WAAW,OAAO,OAAQ,QAAO;AAChD,aAAW,EAAE,MAAM,KAAK,YAAY;AAChC,QAAI,MAAM,SAAS,OAAO,QAAQ,CAAC,UAAU,KAAK,EAAG,QAAO;AAAA,EAChE;AACA,WAAS,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK;AACxC,UAAM,QAAQ,cAAc,UAAU,YAAY,IAAI,CAAC,EAAE,OAAO,UAAU,YAAY,CAAC,EAAE,KAAK;AAC9F,QAAI,YAAY,QAAQ,IAAI,QAAQ,EAAG,QAAO;AAAA,EAClD;AAGA,MAAI;AACJ,aAAW,EAAE,MAAM,KAAK,YAAY;AAChC,UAAM,QAAQ,cAAc,OAAO,MAAM;AACzC,QAAI,UAAU,GAAG;AACb,cAAQ;AACR;AAAA,IACJ;AACA,QAAI,cAAc,MAAM,QAAQ,MAAM,UAAU,UAAa,cAAc,OAAO,KAAK,IAAI,GAAI,SAAQ;AACvG,QAAI,cAAc,KAAK,QAAQ,MAAM,UAAU,UAAa,cAAc,OAAO,KAAK,IAAI,GAAI,SAAQ;AAAA,EAC1G;AACA,MAAI,UAAU,UAAc,cAAc,KAAK,cAAc,OAAO,MAAM,MAAM,EAAI,QAAO,EAAE,OAAO,OAAU;AAC9G,QAAM,QAAQ,cAAc,OAAO,MAAM,MAAM,IAAI,YAAY,cAAc,IAAI,YAAY,CAAC;AAC9F,MAAI;AACJ,aAAW,EAAE,OAAO,MAAM,KAAK,YAAY;AACvC,QAAI,cAAc,OAAO,KAAK,MAAM,EAAG;AACvC,YAAQ;AACR,QAAI,MAAO;AAAA,EACf;AACA,SAAO,EAAE,MAAM;AACnB;AAEA,SAAS,UAAU,OAAuB;AACtC,MAAI,MAAM,SAAS,YAAY,MAAM,SAAS,UAAW,QAAO;AAChE,SAAO,MAAM,SAAS,UAAU,6BAA6B,MAAM,IAAI;AAC3E;AAEA,SAAS,6BAA6BC,OAAuB;AACzD,WAAS,IAAI,GAAG,IAAIA,MAAK,QAAQ,KAAK;AAClC,UAAM,IAAIA,MAAK,WAAW,CAAC;AAC3B,QAAI,CAAC,qBAAqB,CAAC,KAAK,MAAM,GAAM,QAAO;AAAA,EACvD;AACA,SAAO;AACX;AAEA,SAAS,cAAc,WAAkB,QAAwB;AAC7D,SAAO,UAAU,SAAS,OAAO,QAAQ,UAAU,SAAS,WAAW,cAAc,WAAW,MAAM,MAAM;AAChH;AAEA,SAAS,WAAW,YAAkC,QAAmC;AACrF,aAAW,EAAE,OAAO,MAAM,KAAK,YAAY;AACvC,QAAI,cAAc,OAAO,MAAM,EAAG,QAAO;AAAA,EAC7C;AACA,SAAO;AACX;AAEA,SAAS,cAAc,YAAkC,QAAmC;AACxF,MAAI,OAAO,SAAS,OAAQ,QAAO,WAAW,YAAY,MAAM;AAChE,aAAW,EAAE,OAAO,MAAM,KAAK,YAAY;AACvC,QAAI,MAAM,SAAS,UAAU,gBAAgB,OAAO,MAAM,MAAM,IAAI,EAAG,QAAO;AAAA,EAClF;AACA,SAAO;AACX;AAOA,SAAS,QAAQ,YAAkC,QAAe,MAAkC;AAChG,MAAI;AACJ,MAAI;AACJ,aAAW,EAAE,OAAO,MAAM,KAAK,YAAY;AACvC,QAAI,MAAM,SAAS,QAAS;AAC5B,UAAM,QAAQ,cAAc,OAAO,MAAM;AACzC,QAAI,UAAU,EAAG,QAAO;AACxB,QAAI,SAAS,KAAK,QAAQ,IAAI,QAAQ,EAAG;AACzC,QAAI,cAAc,WAAc,SAAS,KAAK,cAAc,OAAO,SAAS,IAAI,IAAI,cAAc,OAAO,SAAS,IAAI,IAAI;AACtH,aAAO;AACP,kBAAY;AAAA,IAChB;AAAA,EACJ;AACA,SAAO;AACX;AAGO,SAAS,gBAAgB,SAAiBA,OAAuB;AACpE,SAAO,WAAW,SAAS,GAAGA,OAAM,CAAC;AACzC;AAEA,SAAS,WAAW,SAAiB,MAAcA,OAAc,IAAqB;AAClF,MAAI,IAAI;AACR,MAAI,IAAI;AACR,SAAO,IAAI,QAAQ,QAAQ;AACvB,QAAI,IAAI,QAAQ,WAAW,CAAC;AAC5B,QAAI,MAAM,IAAM;AACZ,aAAO,IAAI,QAAQ,UAAU,QAAQ,WAAW,CAAC,MAAM,GAAM;AAC7D,UAAI,MAAM,QAAQ,OAAQ,QAAO;AACjC,eAAS,QAAQ,GAAG,SAASA,MAAK,QAAQ,SAAS;AAC/C,YAAI,WAAW,SAAS,GAAGA,OAAM,KAAK,EAAG,QAAO;AAAA,MACpD;AACA,aAAO;AAAA,IACX;AACA,QAAI,KAAKA,MAAK,OAAQ,QAAO;AAC7B,QAAI,MAAM,IAAM;AACZ;AACA;AACA;AAAA,IACJ;AACA,UAAM,OAAO,QAAQ,WAAW,IAAI,CAAC;AACrC,QAAI,MAAM,OAAQ,IAAI,IAAI,QAAQ,WAAW,SAAS,MAAQ,SAAS,MAAQ,SAAS,MAAO;AAC3F,UAAI;AACJ;AAAA,IACJ;AACA,QAAI,eAAe,CAAC,MAAM,eAAeA,MAAK,WAAW,CAAC,CAAC,EAAG,QAAO;AACrE;AACA;AAAA,EACJ;AACA,SAAO,MAAMA,MAAK;AACtB;AAWO,SAAS,cAAc,MAA6B;AACvD,QAAM,SAAS,KAAK,cAAc,CAAC;AACnC,QAAM,SAAS,KAAK,MAAM,MAAM;AAChC,SAAO,OAAO,YAAY,OAAO,cAAc,IAAI;AACvD;AAEA,SAAS,KAAK,MAAoB,QAA0B;AACxD,MAAI,OAAO,QAAS,QAAO;AAC3B,MAAI,OAAO;AACX,MAAI,UAAU;AACd,MAAI,OAAO,SAAS,OAAQ,EAAC,MAAM,OAAO,IAAI,CAAC,OAAO,KAAK,MAAM,OAAO,KAAK,OAAO;AAAA,WAC3E,OAAO,SAAS,SAAU,QAAO,OAAO,SAAS,EAAE;AAAA,WACnD,OAAO,SAAS,QAAS,EAAC,MAAM,OAAO,IAAI,CAAC,OAAO,QAAQ,EAAE,MAAM,OAAO,QAAQ,EAAE,OAAO;AAEpG,MAAIJ,OAAM;AACV,MAAI,KAAK,IAAI,CAAC,GAAG;AACb,UAAM,QAAQ,eAAe,MAAM,CAAC;AACpC,QAAI,iBAAiB,QAAS,QAAO;AACrC,IAAAA,OAAM;AAAA,EACV;AACA,MAAID,UAAS;AACb,MAAI,KAAK,QAAQ,GAAG;AAChB,QAAI,SAAS,KAAK,UAAU,EAAG,EAACC,MAAKD,OAAM,IAAI,CAAC,GAAGC,IAAG;AAAA,EAC1D,WAAW,KAAK,IAAI,CAAC,GAAG;AACpB,UAAM,QAAQ,eAAe,MAAM,CAAC;AACpC,QAAI,iBAAiB,QAAS,QAAO;AACrC,IAAAD,UAAS;AAAA,EACb;AACA,EAAAC,OAAM,KAAK,MAAMA,IAAG;AACpB,EAAAD,UAAS,KAAK,MAAMA,OAAM;AAC1B,MAAIC,OAAM,KAAKD,UAAS,EAAG,QAAO,QAAQ,QAAQ,SAAS;AAC3D,MAAI,KAAK,QAAQ,KAAK,OAAO,eAAe,OAAO,KAAK,UAAU,EAAG,QAAO,QAAQ,QAAQ,OAAO;AACnG,MAAIC,OAAM,QAAQD,UAAS,QAAS,QAAO,QAAQ,QAAQ,OAAO;AAClE,MAAKC,SAAQ,KAAK,OAAO,KAAOD,YAAW,KAAK,UAAU,GAAI;AAE1D,UAAM,CAAC,IAAI,EAAE,IAAIC,SAAQ,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAACA,OAAM,GAAGA,OAAM,CAAC;AAC9D,UAAM,CAAC,IAAI,EAAE,IAAID,YAAW,IAAI,CAAC,GAAG,UAAU,CAAC,IAAI,CAACA,UAAS,GAAGA,UAAS,CAAC;AAC1E,YAAQ,OAAO,MAAM;AAAA,MACjB,KAAK,QAAQ;AACT,cAAM,OAAO,OAAO;AACpB,eAAO,OAAO,UAAU,IAAI,KAAK,KAAK,OAAO,IAAI,KAAK,UAAU,IAAI,KAAK,OAAO,IAAI,KAAK,UAAU,EAAE,CAAC;AAAA,MAC1G;AAAA,MACA,KAAK;AAAU,eAAO,QAAQ,QAAQ,MAAM,KAAK,UAAU,QAAQ,MAAM,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC;AAAA,MAC3F,KAAK;AAAS,eAAO,QAAQ,QAAQ,MAAM,OAAO,QAAQ,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC;AAAA,MAC5E,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACD;AAAA,MACJ;AAAS,cAAM,IAAI,MAAM,aAAa,OAAO,OAAO,IAAI,CAAC,yBAAyB;AAAA,IACtF;AAAA,EACJ;AACA,QAAM,IAAI,KAAK,IAAIC,MAAK,CAAC,IAAI;AAC7B,QAAM,IAAI,KAAK,IAAID,SAAQ,CAAC,IAAI;AAChC,UAAQ,OAAO,MAAM;AAAA,IACjB,KAAK;AAAQ,aAAO,OAAO,UAAU,IAAI,KAAK,OAAO,KAAK,OAAO,GAAG,OAAO,KAAK,UAAU,GAAG,OAAO,KAAK,OAAO,GAAG,OAAO,KAAK,UAAU,CAAC,CAAC;AAAA,IAC3I,KAAK;AAAU,aAAO,QAAQ,SAAS,OAAO,SAAS,EAAE,CAAC,CAAC;AAAA,IAC3D,KAAK;AAAS,aAAO,QAAQ,SAAS,OAAO,QAAQ,EAAE,GAAG,GAAG,CAAC,CAAC;AAAA,IAC/D,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACD,aAAO;AAAA,IACX;AAAS,YAAM,IAAI,MAAM,aAAa,OAAO,OAAO,IAAI,CAAC,yBAAyB;AAAA,EACtF;AACJ;AAGO,SAAS,OAAO,MAA6B;AAChD,QAAM,gBAAgB,KAAK,QAAQ,CAAC;AACpC,MAAI,QAAQ,aAAa,EAAG,QAAO,SAAS,IAAI;AAChD,QAAM,SAAS,KAAK,UAAU,SAAS,aAAa;AACpD,MAAI,QAAQ,YAAY,KAAM,QAAO,QAAQ,GAAG,MAAM;AACtD,QAAM,cAAc,aAAa,KAAK,QAAQ,CAAC,CAAC;AAChD,MAAI,CAAC,YAAY,QAAS,QAAO,YAAY,UAAU,cAAc,QAAQ,QAAQ,SAAS;AAC9F,QAAM,SAAS,OAAO,GAAG,WAAW;AACpC,MAAI,WAAW,OAAW,QAAO,QAAQ,QAAQ,SAAS;AAC1D,QAAM,UAAU,OAAO,MAAM,QAAQ,CAAC;AACtC,MAAI,QAAQ,YAAY,OAAW,QAAO,QAAQ;AAClD,SAAO,QAAQ,UAAU,SAAY,QAAQ,QAAQ,MAAM,IAAI,QAAQ,GAAG,MAAM,WAAW,QAAQ,QAAQ,CAAC,CAAC;AACjH;AAGO,SAAS,OAAO,MAA6B;AAChD,QAAM,QAAQ,eAAe,MAAM,CAAC;AACpC,MAAI,iBAAiB,QAAS,QAAO;AACrC,QAAM,KAAK,KAAK,MAAM,KAAK;AAC3B,MAAI,KAAK,KAAK,KAAK,KAAK,QAAQ,EAAG,QAAO,QAAQ,QAAQ,SAAS;AACnE,SAAO,KAAK,IAAI,EAAE,IAAI,KAAK,QAAQ,EAAE,IAAI,QAAQ;AACrD;AAEO,SAAS,YAAY,MAA6B;AACrD,SAAO,MAAM,MAAM,IAAI;AAC3B;AAEO,SAAS,eAAe,MAA6B;AACxD,SAAO,MAAM,MAAM,KAAK;AAC5B;AAOA,SAAS,MAAM,MAAoB,OAAyB;AACxD,MAAI,CAAC,KAAK,IAAI,CAAC,GAAG;AACd,UAAM,OAAO,KAAK,UAAU;AAC5B,QAAI,SAAS,OAAW,QAAO,QAAQ,QAAQ,SAAS;AACxD,WAAO,QAAQ,GAAG,MAAM,YAAY,QAAQ,KAAK,MAAM,KAAK,UAAU,CAAC,CAAC;AAAA,EAC5E;AACA,QAAM,YAAY,KAAK,QAAQ,CAAC;AAChC,MAAI,UAAU,SAAS,OAAQ,QAAO,UAAU,UAAU,YAAY,QAAQ,QAAQ,SAAS;AAC/F,QAAM,OAAO,UAAU;AACvB,QAAMM,SAAQ,QAAQ,KAAK,OAAO,KAAK;AACvC,QAAM,SAAS,QAAQ,IAAI,WAAWA,QAAO,CAAC,IAAI,IAAI,WAAW,GAAGA,MAAK;AACzE,WAAS,IAAI,GAAG,IAAIA,QAAO,KAAK;AAC5B,UAAMC,UAAS,MAAM,YAAY,QAAQ,KAAK,OAAO,KAAK,WAAW,IAAI,CAAC;AAC1E,QAAI,MAAO,QAAO,IAAI,GAAG,GAAGA,OAAM;AAAA,QAC7B,QAAO,IAAI,GAAG,GAAGA,OAAM;AAAA,EAChC;AACA,SAAO,QAAQ,QAAQ,MAAM;AACjC;AAEO,SAAS,aAAa,MAA6B;AACtD,SAAO,OAAO,MAAM,IAAI;AAC5B;AAEO,SAAS,gBAAgB,MAA6B;AACzD,SAAO,OAAO,MAAM,KAAK;AAC7B;AAGA,SAAS,OAAO,MAAoB,QAA0B;AAC1D,QAAM,UAAU,KAAK,SAAS,CAAC;AAC/B,MAAI,QAAQ,QAAS,QAAO;AAC5B,MAAID,SAAQ;AACZ,MAAI,QAAQ,SAAS,OAAQ,CAAAA,SAAQ,SAAS,QAAQ,KAAK,OAAO,QAAQ,KAAK;AAAA,WACtE,QAAQ,SAAS,SAAU,CAAAA,SAAQ,SAAS,QAAQ,SAAS,EAAE,SAAS;AAAA,WACxE,QAAQ,SAAS,QAAS,CAAAA,SAAQ,SAAS,QAAQ,QAAQ,EAAE,OAAO,QAAQ,QAAQ,EAAE;AAC/F,SAAO,QAAQ,GAAG,MAAM,WAAWA,MAAK,CAAC;AAC7C;AAOO,SAAS,OAAO,MAA6B;AAChD,QAAM,YAAY,KAAK,QAAQ,CAAC;AAChC,MAAI,UAAU,SAAS,OAAQ,QAAO,UAAU,UAAU,YAAY,QAAQ,QAAQ,SAAS;AAC/F,QAAM,OAAO,UAAU;AACvB,QAAM,YAAY,eAAe,MAAM,CAAC;AACxC,MAAI,qBAAqB,QAAS,QAAO;AACzC,QAAM,eAAe,eAAe,MAAM,CAAC;AAC3C,MAAI,wBAAwB,QAAS,QAAO;AAC5C,MAAI,SAAS,KAAK;AAClB,MAAI,QAAQ,KAAK;AACjB,MAAI,KAAK,IAAI,CAAC,GAAG;AACb,UAAM,QAAQ,eAAe,MAAM,CAAC;AACpC,QAAI,iBAAiB,QAAS,QAAO;AACrC,aAAS;AAAA,EACb;AACA,MAAI,KAAK,IAAI,CAAC,GAAG;AACb,UAAM,QAAQ,eAAe,MAAM,CAAC;AACpC,QAAI,iBAAiB,QAAS,QAAO;AACrC,YAAQ;AAAA,EACZ;AACA,WAAS,KAAK,MAAM,MAAM;AAC1B,UAAQ,KAAK,MAAM,KAAK;AACxB,MAAI,SAAS,KAAK,QAAQ,EAAG,QAAO,QAAQ,QAAQ,OAAO;AAC3D,QAAM,MAAM,KAAK,OAAO,KAAK,MAAM,SAAS;AAC5C,QAAME,QAAO,KAAK,UAAU,KAAK,MAAM,YAAY;AACnD,QAAM,SAAS,MAAM,SAAS;AAC9B,QAAMC,SAAQD,QAAO,QAAQ;AAC7B,MAAI,MAAM,KAAKA,QAAO,KAAK,UAAU,YAAYC,UAAS,YAAa,QAAO,QAAQ,QAAQ,OAAO;AACrG,SAAO,UAAU,UAAU,IAAI,KAAK,KAAKD,OAAM,QAAQC,MAAK,CAAC;AACjE;AASO,SAAS,SAAS,MAA6B;AAClD,QAAM,QAAQ,eAAe,MAAM,CAAC;AACpC,MAAI,iBAAiB,QAAS,QAAO;AAErC,MAAI,OAAO;AACX,MAAI,KAAK,QAAQ,GAAG;AAChB,QAAI,CAAC,KAAK,IAAI,CAAC,EAAG,QAAO;AAAA,SACpB;AACD,YAAM,QAAQ,eAAe,MAAM,CAAC;AACpC,UAAI,iBAAiB,QAAS,QAAO;AACrC,UAAI,UAAU,OAAW,QAAO;AAAA,WAC3B;AACD,cAAM,QAAQ,QAAQ,KAAK;AAC3B,YAAI,UAAU,OAAW,QAAO,QAAQ,QAAQ,SAAS;AACzD,eAAO;AAAA,MACX;AAAA,IACJ;AAAA,EACJ;AACA,QAAMJ,QAAO,KAAK,UAAU,OAAO,KAAK;AACxC,SAAO,OAAO,WAAW,MAAMA,KAAI,IAAI,kBAAkB,MAAMA,KAAI;AACvE;AAGA,SAAS,WAAW,MAAoBA,OAAuB;AAC3D,QAAM,QAAQ,KAAK,UAAU;AAC7B,QAAMK,SAAQ,kBAAkB,MAAML,KAAI;AAC1C,MAAIK,WAAU,OAAW,QAAOA;AAEhC,MAAI,eAAeL,KAAI,MAAM,OAAW,QAAO,QAAQ,QAAQ,OAAO;AAEtE,QAAMM,QAAO,cAAcN,OAAM,CAAC;AAClC,MAAIM,UAAS,OAAW,QAAO,QAAQ,QAAQ,OAAO;AACtD,QAAM,EAAE,WAAW,OAAO,IAAIA;AAE9B,QAAM,SAAS,MAAM,QAAQ,UAAU,SAAS;AAChD,MAAI,WAAW,OAAW,QAAO,QAAQ,QAAQ,OAAO;AACxD,MAAI,WAAWN,MAAK,SAAS,KAAKA,MAAK,OAAO,MAAM,MAAM,KAAK;AAE3D,QAAI,UAAU,UAAU,OAAQ,QAAO,OAAO,MAAM,IAAI,YAAY,UAAU,MAAM,UAAU,OAAO,CAAC;AAEtG,WAAO,QAAQ,QAAQ,OAAO;AAAA,EAClC;AAEA,MAAI,WAAWA,MAAK,OAAQ,QAAO,QAAQ,QAAQ,OAAO;AAC1D,SAAO,QAAQ,OAAO,UAAU,MAAM,MAAM;AAChD;AAOA,SAAS,eAAeA,OAAqC;AACzD,WAAS,OAAOA,MAAK,QAAQ,IAAI,GAAG,QAAQ,GAAG,OAAOA,MAAK,QAAQ,MAAM,OAAO,CAAC,GAAG;AAChF,UAAM,OAAOA,MAAK,MAAM,GAAG,IAAI,IAAIA,MAAK,MAAM,OAAO,CAAC;AACtD,UAAM,QAAQ,eAAe,MAAM,CAAC;AACpC,QAAI,UAAU,OAAW;AAEzB,UAAM,YAAY,MAAM,OAAO,OAAO;AACtC,QAAI,cAAc,UAAa,OAAO,UAAU,QAAQ,UAAU,MAAM,OAAQ;AAChF,QAAI,MAAM,WAAW,KAAK,WAAW,MAAM,WAAW,KAAK,SAAS,KAAK,KAAK,OAAO,KAAK,SAAS,CAAC,MAAM,KAAM;AAChH,UAAMM,QAAO,cAAc,MAAM,CAAC;AAClC,QAAIA,UAAS,UAAaA,MAAK,UAAU,UAAU,OAAQ,QAAOA,MAAK;AAAA,EAC3E;AACA,SAAO;AACX;AAEA,IAAM,iBAAiB;AAOvB,SAAS,kBAAkB,MAAoBN,OAAmC;AAC9E,QAAM,QAAQ,KAAK,UAAU;AAC7B,QAAM,aAAa,wBAAwBA,OAAM,CAAC;AAClD,MAAI,eAAe,UAAa,WAAW,WAAWA,MAAK,QAAQ;AAC/D,UAAM,cAAc,MAAM,YAAY,WAAW,OAAO,WAAW,MAAM;AACzE,WAAO,YAAY,WAAW,YAAY,QAAQ,UAAU,WAAW,QAAQ,QAAQ,OAAO,IAAI;AAAA,EACtG;AACA,MAAI,eAAe,KAAKA,KAAI,EAAG,QAAO,KAAK,UAAU,OAAO;AAC5D,MAAI,MAAM,cAAcA,KAAI,EAAG,QAAO,KAAK,UAAU,OAAO;AAC5D,SAAO;AACX;AAEA,IAAM,OAAO,OAAO;AACpB,IAAM,cAAc,OAAO,UAAU,IAAI,WAAW,IAAI,WAAW,IAAI;AAMvE,IAAM,gBAAgB,IAAI;AAAA,EACtB,OAAO,sEAAsE,WAAW,+BAA+B,WAAW,iBAAiB,WAAW;AAAQ;AAG1K,IAAM,oBAAoB,IAAI,OAAO,OAAO,2BAA2B,IAAI,8BAA8B,IAAI,OAAO;AAQpH,SAAS,kBAAkB,MAAoBA,OAAuB;AAClE,QAAM,UAAUA,MAAK,SAAS,GAAG;AACjC,QAAM,QAAQ,cAAc,KAAK,UAAUA,MAAK,MAAM,GAAG,EAAE,IAAIA,KAAI;AACnE,MAAI,UAAU,KAAM,QAAO,kBAAkB,MAAMA,KAAI,KAAK,QAAQ,QAAQ,OAAO;AACnF,QAAM,SAAS,MAAM;AACrB,MAAI,WAAW,OAAW,OAAM,IAAI,MAAM,6DAA6D;AACvG,QAAMO,OAAM,OAAO,OAAO;AAC1B,QAAM,QAAQA,SAAQ,SAAY,SAAYA,KAAI,WAAW,GAAG,IAAIA,KAAI,MAAM,GAAG,EAAE,EAAE,WAAW,MAAM,GAAG,IAAIA;AAE7G,QAAM,SAAS,KAAK,UAAU,MAAM,QAAQ,KAAK;AACjD,MAAI,WAAW,OAAW,QAAO,QAAQ,QAAQ,OAAO;AACxD,QAAMC,UAAS,OAAO,QAAQ,MAAM;AACpC,QAAM,QAAQ,CAAC,SAASC,SAAQ,OAAO,OAAO,CAAC,CAAC,CAAC;AACjD,MAAI,OAAO,QAAQ,MAAM,OAAW,OAAM,KAAK,SAAS,OAAO,QAAQ,CAAC,CAAC;AACzE,MAAI,OAAO,OAAO,MAAM,OAAW,OAAM,KAAK,SAAS,OAAO,OAAO,CAAC,CAAC;AAEvE,MAAID,WAAW,YAAY,MAAM,SAAS,KAAK,CAAC,OAAO,UAAU,OAAO,CAAC,CAAC,GAAK,QAAO,QAAQ,QAAQ,OAAO;AAE7G,MAAIE,OAAM,IAAI,YAAY,GAAG,CAAC;AAC9B,MAAI,MAAM,KAAK,UAAU,GAAG;AACxB,UAAM,OAAO,KAAK,UAAU;AAC5B,QAAI,SAAS,OAAW,QAAO,QAAQ,QAAQ,SAAS;AACxD,IAAAA,OAAM;AAAA,EACV;AACA,QAAM,QAAyB,CAAC;AAChC,aAAW,QAAQ,OAAO;AACtB,UAAM,OAAO,UAAU,MAAMA,IAAG;AAChC,QAAI,SAAS,OAAW,QAAO,QAAQ,QAAQ,OAAO;AACtD,UAAM,KAAK,IAAI;AAAA,EACnB;AACA,MAAI,SAAS,UAAU,OAAO,CAAC;AAC/B,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACnC,UAAM,OAAO,UAAU,QAAQ,UAAU,OAAO,CAAC,CAAC;AAClD,QAAI,SAAS,OAAW,QAAO,QAAQ,QAAQ,OAAO;AACtD,aAAS;AAAA,EACb;AACA,MAAI,QAAS,QAAO,OAAO,MAAM,IAAI,YAAY,OAAO,MAAM,OAAO,GAAG,OAAO,SAAS,OAAO,CAAC,CAAC;AACjG,QAAM,CAAC,MAAM,IAAI,IAAI,OAAO,SAAS,SAAY,CAAC,GAAG,WAAW,CAAC,IAAI,CAAC,OAAO,KAAK,KAAK,OAAO,KAAK,IAAI;AACvG,QAAM,CAAC,SAAS,OAAO,IAAI,OAAO,YAAY,SAAY,CAAC,GAAG,cAAc,CAAC,IAAI,CAAC,OAAO,QAAQ,KAAK,OAAO,QAAQ,IAAI;AACzH,QAAM,YAAY,UAAU,UAAU,OAAO,MAAM,SAAS,MAAM,SAAS,MAAM,MAAM,MAAM,IAAI;AACjG,SAAO,QAAQ,OAAO,UAAU,MAAM,MAAM;AAChD;AAEA,SAASD,SAAQT,OAAkC;AAC/C,MAAIA,UAAS,OAAW,OAAM,IAAI,MAAM,uDAAuD;AAC/F,SAAOA;AACX;AAyBA,SAAS,WAAWW,OAA8B;AAC9C,SAAOA,MAAK,KAAK,aAAa,QAAQA,MAAK,QAAQ,aAAa;AACpE;AAEA,SAAS,OAAOA,OAA8B;AAC1C,SAAOA,MAAK,QAAQ,UAAaA,MAAK,WAAW;AACrD;AAEA,SAAS,SAASX,OAA6B;AAC3C,QAAM,QAAQ,kBAAkB,KAAKA,KAAI;AACzC,QAAM,SAAS,OAAO;AACtB,MAAI,WAAW,OAAW,OAAM,IAAI,MAAM,4DAA4D;AACtG,SAAO;AAAA,IACH,KAAK,OAAO,GAAG,MAAM,SAAY,SAAY,SAAS,OAAO,KAAK,KAAK,EAAE;AAAA;AAAA,IACzE,QAAQ,OAAO,GAAG,MAAM,SAAY,SAAY,SAAS,OAAO,QAAQ,KAAK,EAAE;AAAA;AAAA,EACnF;AACJ;AAMA,SAAS,SAASY,UAAgC;AAC9C,MAAIA,SAAQ,WAAW,EAAG,QAAO,EAAE,UAAU,MAAM,QAAQ,EAAE;AAC7D,QAAM,WAAWA,SAAQ,WAAW,GAAG;AACvC,MAAI,SAAS,WAAWA,SAAQ,MAAM,GAAG,EAAE,IAAIA;AAC/C,QAAM,WAAW,OAAO,WAAW,GAAG;AACtC,MAAI,YAAY,OAAO,WAAW,GAAG,EAAG,UAAS,OAAO,MAAM,CAAC;AAC/D,WAAS,OAAO,QAAQ,OAAO,EAAE;AACjC,QAAMV,UAAS,OAAO,WAAW,IAAI,IAAI,OAAO,SAAS,IAAI,MAAgB,OAAO,MAAM;AAC1F,SAAO,EAAE,UAAU,QAAQ,WAAW,CAACA,UAASA,QAAO;AAC3D;AAGA,SAAS,UAAU,UAAyBQ,MAAaT,QAAmC;AACxF,MAAI,SAAS,SAAU,QAAO,KAAK,IAAI,SAAS,MAAM,IAAIA,UAASS,OAAM,SAAS,SAAST,UAASA,SAAQ;AAC5G,SAAO,SAAS,UAAU,KAAK,SAAS,UAAUA,SAAQ,SAAS,SAAS,IAAI;AACpF;AAEA,SAAS,UAAUU,OAAqBD,MAA6C;AACjF,MAAI;AACJ,MAAI;AACJ,MAAIC,MAAK,QAAQ,QAAW;AACxB,UAAM,IAAI,UAAUA,MAAK,KAAKD,KAAI,KAAK,QAAQ;AAC/C,QAAI,MAAM,OAAW,QAAO;AAC5B,eAAW,EAAE,KAAK,GAAG,MAAM,EAAE;AAAA,EACjC;AACA,MAAIC,MAAK,WAAW,QAAW;AAC3B,UAAM,IAAI,UAAUA,MAAK,QAAQD,KAAI,QAAQ,WAAW;AACxD,QAAI,MAAM,OAAW,QAAO;AAC5B,kBAAc,EAAE,KAAK,GAAG,MAAM,EAAE;AAAA,EACpC;AACA,SAAO,EAAE,MAAM,UAAU,SAAS,YAAY;AAClD;AAOA,SAAS,UAAU,YAA2B,aAAuD;AACjG,MAAI,QAAQ;AACZ,MAAI,SAAS;AACb,QAAM,aAAa,MAAM,SAAS,UAAa,MAAM,YAAY;AACjE,QAAM,cAAc,OAAO,SAAS,UAAa,OAAO,YAAY;AACpE,MAAI,cAAc,OAAO,SAAS,UAAa,OAAO,YAAY,OAAW,UAAS,EAAE,MAAM,MAAM,MAAM,SAAS,OAAO,QAAQ;AAAA,WACzH,eAAe,MAAM,SAAS,UAAa,MAAM,YAAY,OAAW,SAAQ,EAAE,MAAM,MAAM,MAAM,SAAS,OAAO,QAAQ;AACrI,MAAK,MAAM,SAAS,YAAgB,OAAO,SAAS,WAAe,MAAM,YAAY,YAAgB,OAAO,YAAY,QAAY,QAAO;AAC3I,SAAO,EAAE,MAAM,KAAK,MAAM,MAAM,OAAO,IAAI,GAAG,SAAS,KAAK,MAAM,SAAS,OAAO,OAAO,EAAE;AAC/F;AAEA,SAAS,KAAK,GAAqB,GAAuC;AACtE,SAAO,MAAM,UAAa,MAAM,SAAY,EAAE,KAAK,KAAK,IAAI,EAAE,KAAK,EAAE,GAAG,GAAG,MAAM,KAAK,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI;AAClH;AAIO,SAAS,QAAQ,MAA6B;AACjD,SAAO,aAAa,MAAM,IAAI;AAClC;AAEO,SAAS,QAAQ,MAA6B;AACjD,SAAO,aAAa,MAAM,KAAK;AACnC;AAOA,SAAS,aAAa,MAAoB,UAA4B;AAClE,QAAM,SAAS,eAAe,MAAM,CAAC;AACrC,MAAI,kBAAkB,QAAS,QAAO;AACtC,QAAML,SAAQ,aAAa,KAAK,cAAc,CAAC,CAAC;AAChD,MAAIA,OAAM,aAAaA,OAAM,SAAS,QAAS,QAAO,KAAK,UAAU,OAAO;AAC5E,MAAI,CAACA,OAAM,QAAS,QAAOA,OAAM,UAAUA,SAAQ,QAAQ,QAAQ,SAAS;AAC5E,QAAM,QAAQ,eAAe,MAAM,CAAC;AACpC,MAAI,iBAAiB,QAAS,QAAO;AACrC,QAAM,KAAK,KAAK,MAAM,KAAK;AAC3B,MAAI,KAAK,EAAG,QAAO,QAAQ,QAAQ,SAAS;AAC5C,MAAI;AACJ,MAAI;AACJ,MAAIA,OAAM,SAAS,OAAQ,EAAC,QAAQ,SAAS,IAAI,CAACA,OAAM,KAAK,MAAMA,OAAM,KAAK,OAAO;AAAA,WAC5EA,OAAM,SAAS,QAAS,EAAC,QAAQ,SAAS,IAAI,CAACA,OAAM,QAAQ,EAAE,MAAMA,OAAM,QAAQ,EAAE,OAAO;AAAA,MAChG,EAAC,QAAQ,SAAS,IAAI,CAACA,OAAM,SAAS,EAAE,QAAQ,CAAC;AACtD,MAAI,MAAM,WAAW,YAAY,QAAS,QAAO,QAAQ,QAAQ,OAAO;AACxE,MAAI,OAAO;AACX,MAAI,KAAK,QAAQ,GAAG;AAChB,UAAM,YAAY,eAAe,MAAM,CAAC;AACxC,QAAI,qBAAqB,QAAS,QAAO;AACzC,WAAO;AAAA,EACX;AACA,QAAM,OAAO,gBAAgBA,QAAO,UAAU,CAAC;AAC/C,MAAIA,OAAM,aAAa,KAAK,WAAW,KAAK,MAAM,OAAW,QAAO,KAAK,UAAU,OAAO;AAC1F,QAAM,UAAU,aAAa,KAAK,WAAW,MAAM,QAAQ,SAAS,IAAI,IAAI,CAAC;AAC7E,MAAI,QAAQ,YAAY,OAAW,QAAO,QAAQ;AAClD,MAAI,QAAQ,UAAU,OAAW,QAAO,QAAQ,QAAQ,MAAM;AAC9D,QAAM,SAAS,gBAAgBA,QAAO,UAAU,KAAK,CAAC,EAAE,OAAO,QAAQ,KAAK;AAC5E,MAAIA,OAAM,aAAa,OAAO,SAAS,YAAY,OAAO,WAAW,OAAW,QAAO,KAAK,UAAU,OAAO;AAC7G,SAAO,QAAQ,GAAG,KAAK,UAAU,SAAS,MAAM,KAAK,MAAM,WAAW,CAAC,CAAC;AAC5E;AAGA,SAAS,gBAAgBA,QAAgB,UAAmB,IAAoB;AAC5E,MAAIA,OAAM,SAAS,QAAQ;AACvB,UAAM,OAAOA,OAAM;AACnB,UAAM,OAAO,WACP,IAAI,KAAK,KAAK,MAAM,KAAK,UAAU,IAAI,KAAK,MAAM,KAAK,UAAU,EAAE,IACnE,IAAI,KAAK,KAAK,OAAO,IAAI,KAAK,SAAS,KAAK,OAAO,IAAI,KAAK,OAAO;AACzE,WAAO,IAAI,OAAOA,OAAM,UAAU,IAAI,GAAG,UAAU,WAAW,KAAK,OAAO,KAAK,OAAO;AAAA,EAC1F;AACA,MAAIA,OAAM,SAAS,UAAU;AACzB,WAAO,WAAW,IAAI,OAAOA,QAAO,MAAMA,OAAM,SAAS,EAAE,MAAM,IAAI,IAAI,OAAO,QAAQ,QAAQA,OAAM,SAAS,EAAE,EAAE,CAAC,GAAG,OAAO,CAAC;AAAA,EACnI;AACA,QAAM,QAAQA,OAAM,QAAQ;AAC5B,QAAM,SAAS,WAAW,MAAM,OAAO,GAAG,MAAM,OAAO,GAAG,IAAI,EAAE,IAAI,MAAM,OAAO,IAAI,IAAI,GAAG,MAAM,UAAU,CAAC;AAC7G,SAAO,IAAI,OAAO,OAAO,WAAW,QAAQ,QAAQ,OAAO,GAAG,GAAG,CAAC,CAAC,IAAI,QAAQ,QAAQ,MAAM,GAAG,UAAU,WAAW,MAAM,OAAO,MAAM,OAAO;AACnJ;AAGO,SAAS,cAAc,MAA6B;AACvD,QAAM,SAAS,eAAe,MAAM,CAAC;AACrC,MAAI,kBAAkB,QAAS,QAAO;AACtC,QAAM,QAAQ,aAAa,KAAK,QAAQ,CAAC,CAAC;AAC1C,MAAI,CAAC,MAAM,QAAS,QAAO,MAAM,UAAU,QAAQ,QAAQ,QAAQ,SAAS;AAC5E,QAAM,SAAS,OAAO,GAAG,KAAK;AAC9B,MAAI,WAAW,OAAW,QAAO,QAAQ,QAAQ,SAAS;AAC1D,MAAI,OAAO;AACX,MAAI,KAAK,QAAQ,GAAG;AAChB,UAAM,QAAQ,eAAe,MAAM,CAAC;AACpC,QAAI,iBAAiB,QAAS,QAAO;AACrC,WAAO;AAAA,EACX;AACA,QAAM,UAAU,aAAa,KAAK,WAAW,QAAQ,QAAQ,KAAK,KAAK,IAAI,CAAC;AAC5E,MAAI,QAAQ,YAAY,OAAW,QAAO,QAAQ;AAClD,SAAO,QAAQ,UAAU,SAAY,QAAQ,QAAQ,MAAM,IAAI,QAAQ,GAAG,MAAM,WAAW,QAAQ,QAAQ,CAAC,CAAC;AACjH;AAMA,SAAS,aAAa,WAAsB,QAAgB,QAA2B,MAA6B;AAChH,QAAM,SAAS,UAAU,MAAM,WAAW,CAAC;AAC3C,MAAI,OAAO,SAAS,UAAU,OAAO,KAAK,SAAS,IAAK,QAAO,EAAE,SAAS,UAAU,OAAO,EAAE;AAC7F,QAAM,aAAa,OAAO,WAAW;AACrC,MAAI,SAAS,EAAG,QAAO,YAAY,WAAW,YAAY,MAAM;AAChE,MAAI,WAAW,WAAW,OAAO,UAAU,WAAW,KAAK,OAAK,EAAE,MAAM,OAAO,EAAG,QAAO,EAAE,SAAS,UAAU,OAAO,EAAE;AACvH,QAAM,OAAO,WAAW,WAAW,IAAI,OAAO,OAAO,UAAU,YAAY,CAAC,EAAE,MAAM;AACpF,MAAI,WAAW,KAAK,OAAK,EAAE,MAAM,SAAS,QAAQ,CAAC,UAAU,EAAE,KAAK,CAAC,EAAG,QAAO,EAAE,SAAS,UAAU,OAAO,EAAE;AAC7G,WAAS,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK;AACxC,UAAM,QAAQ,cAAc,UAAU,YAAY,IAAI,CAAC,EAAE,OAAO,UAAU,YAAY,CAAC,EAAE,KAAK;AAC9F,QAAI,OAAO,IAAI,QAAQ,IAAI,QAAQ,EAAG,QAAO,EAAE,SAAS,UAAU,OAAO,EAAE;AAAA,EAC/E;AACA,MAAI,OAAO,SAAS,KAAM,QAAO,CAAC;AAClC,MAAI,CAAC,UAAU,MAAM,EAAG,QAAO,EAAE,SAAS,UAAU,OAAO,EAAE;AAC7D,MAAI;AACJ,aAAW,EAAE,OAAO,IAAI,MAAM,KAAK,YAAY;AAC3C,UAAM,QAAQ,cAAc,OAAO,MAAM;AACzC,QAAI,OAAO,IAAI,QAAQ,IAAI,QAAQ,EAAG;AACtC,YAAQ;AACR,QAAI,OAAO,KAAK,UAAU,EAAG;AAAA,EACjC;AAGA,MAAI,OAAO,KAAK,UAAU,UAAa,QAAQ,KACxC,cAAc,UAAU,YAAY,KAAK,EAAE,OAAO,MAAM,MAAM,KAC9D,cAAc,UAAU,YAAY,QAAQ,CAAC,EAAE,OAAO,UAAU,YAAY,KAAK,EAAE,KAAK,MAAM,GAAG;AACpG,WAAO,EAAE,SAAS,UAAU,OAAO,EAAE;AAAA,EACzC;AACA,SAAO,EAAE,MAAM;AACnB;AAEA,SAAS,SAASL,OAAuB;AACrC,WAAS,IAAI,GAAG,IAAIA,MAAK,QAAQ,KAAK;AAClC,QAAI,CAAC,QAAQA,MAAK,WAAW,CAAC,CAAC,EAAG,QAAO;AAAA,EAC7C;AACA,SAAO;AACX;AAMA,SAAS,YAAY,WAAsB,YAAkC,QAA8B;AACvG,MAAI,OAAO,SAAS,UAAU,CAAC,SAAS,OAAO,IAAI,EAAG,QAAO,EAAE,SAAS,UAAU,OAAO,EAAE;AAC3F,MAAI,YAAY;AAChB,MAAI,kBAAkB;AACtB,aAAW,EAAE,OAAO,IAAI,MAAM,KAAK,YAAY;AAC3C,QAAI,MAAM,SAAS;AACf,kBAAY;AACZ,0BAAoB,MAAM,UAAU;AACpC;AAAA,IACJ;AACA,QAAI,MAAM,SAAS,OAAO,KAAM;AAChC,QAAI,MAAM,SAAS,UAAU,CAAC,SAAS,MAAM,IAAI,EAAG,QAAO,EAAE,SAAS,UAAU,OAAO,EAAE;AACzF,UAAM,UAAU,OAAO,SAAS,SAAS,gBAAgB,OAAO,MAAM,MAAM,IAAI,IAAI,cAAc,OAAO,MAAM;AAC/G,QAAI,QAAS,QAAO,YAAY,EAAE,SAAS,UAAU,OAAO,EAAE,IAAI,EAAE,OAAO,GAAG;AAAA,EAClF;AACA,SAAO,kBAAkB,EAAE,SAAS,UAAU,OAAO,EAAE,IAAI,CAAC;AAChE;;;ACr6BA,IAAM,QAAQ,MAAM,OAAO;AAG3B,IAAM,SAAS;AAQR,SAAS,OAAO,MAAc,OAAe,MAAmBa,QAAe,SAAyB;AAC3G,MAAI,IAAI,IAAI,IAAI;AAChB,QAAMC,SAAQ,iBAAiB,KAAK;AACpC,WAAS,IAAI,GAAG,IAAIA,OAAM,QAAQ,IAAK,KAAI,IAAI,IAAI,OAAOA,OAAM,WAAW,CAAC,CAAC,CAAC;AAC9E,MAAI,IAAI,IAAI,OAAO,MAAM,MAAM,CAAC;AAChC,MAAI,IAAI,IAAI,OAAO,QAAQ,IAAI,OAAO,KAAK,GAAG,CAAC,CAAC;AAChD,MAAI,IAAI,IAAI,OAAO,QAAQ,IAAI,OAAO,KAAK,MAAM,CAAC,CAAC;AACnD,MAAI,IAAI,IAAI,OAAO,QAAQ,IAAI,OAAOD,MAAK,CAAC,CAAC;AAC7C,SAAO,IAAI,IAAI,OAAO,QAAQ,IAAI,OAAO,CAAC;AAC9C;AAGO,SAAS,OAAO,MAAsB;AACzC,SAAO,OAAO,QAAQ,GAAG,KAAK,IAAI,KAAK;AAC3C;AAOO,SAAS,QAAQ,MAAc,QAAgB,KAAqB;AACvE,QAAME,SAAQ,OAAO,QAAQ,IAAI,OAAO,GAAG,IAAI,OAAO,MAAM,CAAC,IAAI;AACjE,MAAI,UAAU;AACd,MAAI,SAAS,UAAUA;AACvB,OAAK,SAAS,QAAQA,QAAO;AACzB,UAAM,aAAc,CAACA,SAAS,QAAQA;AACtC,YAAQ,SAAS,QAAQ,WAAW;AAChC,gBAAU,IAAI,OAAO;AACrB,eAAS,UAAUA;AAAA,IACvB;AAAA,EACJ;AACA,SAAO,OAAO,OAAO,MAAM,KAAK,UAAU,IAAI;AAClD;AAGA,SAAS,IAAI,OAAuB;AAChC,MAAI,IAAK,QAAQ,SAAU;AAC3B,OAAM,IAAK,KAAK,OAAQ,sBAAuB;AAC/C,OAAM,IAAK,KAAK,OAAQ,sBAAuB;AAC/C,SAAO,IAAK,KAAK;AACrB;;;ACtCA,IAAM,mBAAmB;AAGlB,SAASC,KAAI,MAA6B;AAC7C,QAAMC,UAAS,eAAe,MAAM,CAAC;AACrC,SAAOA,mBAAkB,UAAUA,UAAS,QAAQ,GAAG,MAAM,WAAW,KAAK,IAAIA,OAAM,CAAC,CAAC;AAC7F;AAGO,SAAS,IAAI,MAA6B;AAC7C,QAAMA,UAAS,eAAe,MAAM,CAAC;AACrC,SAAOA,mBAAkB,UAAUA,UAAS,QAAQ,GAAG,MAAM,WAAW,KAAK,MAAMA,OAAM,CAAC,CAAC;AAC/F;AASO,SAAS,IAAI,MAA6B;AAC7C,QAAMA,UAAS,eAAe,MAAM,CAAC;AACrC,MAAIA,mBAAkB,QAAS,QAAOA;AACtC,QAAM,UAAU,eAAe,MAAM,CAAC;AACtC,MAAI,mBAAmB,QAAS,QAAO;AACvC,MAAI,YAAY,EAAG,QAAO,QAAQ,QAAQ,SAAS;AACnD,MAAI,KAAK,IAAIA,UAAS,OAAO,KAAK,iBAAkB,QAAO,QAAQ,QAAQ,OAAO;AAElF,QAAM,YAAYA,UAAS;AAC3B,MAAI,cAAc,KAAM,YAAY,MAAQ,UAAU,EAAI,QAAO,aAAa,SAAS;AACvF,SAAO,aAAa,gBAAgB,WAAW,OAAO,CAAC;AAC3D;AAUA,SAAS,gBAAgB,WAAmB,SAAyB;AAEjE,QAAM,OAAO,UAAU,IAAI,KAAK;AAChC,QAAM,IAAI,OAAO;AACjB,QAAM,IAAI,OAAO;AACjB,QAAMC,OAAM,IAAI;AAChB,QAAMC,SAAQ,KAAKD,OAAM;AACzB,QAAM,MAAMC,SAAQ,IAAID,OAAM,aAAaA,IAAG,IAAI,aAAaA,IAAG,IAAIA;AACtE,QAAM,QAAQ,gBAAgBC,SAAQ,MAAM,IAAI;AAChD,QAAM,SAAS,KAAK,IAAI,KAAK,IAAI,QAAQ,eAAeD,IAAG,IAAIA,OACzD,QAAQ,IAAI,aAAaA,IAAG,IAAI,aAAaA,IAAG;AACtD,SAAO,QAAQ,WAAW,IAAI,IAAI;AACtC;AAGO,SAAS,QAAQ,MAA6B;AACjD,QAAM,UAAoB,CAAC;AAC3B,QAAMC,SAAQ,eAAe,MAAM,OAAO;AAC1C,SAAOA,WAAU,SAAY,QAAQ,QAAQA,MAAK,IAAI,UAAU,OAAO;AAC3E;AAGO,SAAS,UAAU,SAAqC;AAC3D,MAAI,QAAQ,WAAW,EAAG,QAAO,QAAQ,GAAG,MAAM,WAAW,CAAC,CAAC;AAC/D,MAAI,SAAS;AACb,aAAW,KAAK,QAAS,WAAU;AACnC,SAAO,aAAa,MAAM;AAC9B;AAGO,SAAS,OAAO,MAA6B;AAChD,QAAM,UAAoB,CAAC;AAC3B,QAAMA,SAAQ,eAAe,MAAM,OAAO;AAC1C,SAAOA,WAAU,SAAY,QAAQ,QAAQA,MAAK,IAAI,SAAS,OAAO;AAC1E;AAGO,SAAS,SAAS,SAA4B;AACjD,MAAI,QAAQ,WAAW,EAAG,QAAO,QAAQ,QAAQ,OAAO;AACxD,cAAY,OAAO;AACnB,QAAM,SAAS,KAAK,MAAM,QAAQ,SAAS,CAAC;AAC5C,QAAMC,SAAQ,QAAQ,MAAM;AAC5B,SAAO,aAAa,QAAQ,SAAS,MAAM,IAAIA,UAAU,QAAQ,SAAS,CAAC,IAAeA,UAAS,CAAC;AACxG;AAEO,SAAS,MAAM,MAA6B;AAC/C,SAAO,OAAO,MAAM,IAAI;AAC5B;AAEO,SAAS,MAAM,MAA6B;AAC/C,SAAO,OAAO,MAAM,KAAK;AAC7B;AAMA,SAAS,OAAO,MAAoB,SAA2B;AAC3D,QAAM,UAAoB,CAAC;AAC3B,QAAM,QAAQ,KAAK,QAAQ,CAAC;AAC5B,MAAI,MAAM,SAAS;AACf,eAAW,SAAS,KAAK,UAAU,YAAY,KAAK,GAAG;AACnD,UAAI,MAAM,QAAS,QAAO,QAAQ,GAAG,KAAK;AAC1C,UAAI,MAAM,SAAS,SAAU,SAAQ,KAAK,MAAM,MAAM;AAAA,IAC1D;AAAA,EACJ,OAAO;AACH,UAAM,SAAS,eAAe,MAAM,CAAC;AACrC,QAAI,kBAAkB,QAAS,QAAO;AACtC,YAAQ,KAAK,MAAM;AAAA,EACvB;AACA,QAAM,IAAI,eAAe,MAAM,CAAC;AAChC,MAAI,aAAa,QAAS,QAAO;AACjC,SAAO,MAAM,SAAS,GAAG,OAAO;AACpC;AAQO,SAAS,MAAM,SAAmB,UAAkB,SAA2B;AAClF,MAAI,IAAI,gBAAgB,QAAQ;AAChC,MAAI,IAAI,KAAK,IAAI,QAAQ,OAAQ,QAAO,QAAQ,QAAQ,OAAO;AAC/D,MAAI,UAAU,KAAK,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC;AACzC,cAAY,OAAO;AACnB,QAAM,KAAK,IAAI;AACf,QAAM,SAAS,QAAQ,UAAU,QAAQ,SAAS,IAAI,KAAK,EAAE;AAC7D,SAAO,QAAQ,GAAG,MAAM,WAAW,MAAM,CAAC;AAC9C;AAGO,SAAS,MAAM,MAA6B;AAC/C,QAAMH,UAAS,eAAe,MAAM,CAAC;AACrC,MAAIA,mBAAkB,QAAS,QAAOA;AACtC,MAAI,SAAS;AACb,MAAI,KAAK,IAAI,CAAC,GAAG;AACb,UAAM,QAAQ,eAAe,MAAM,CAAC;AACpC,QAAI,iBAAiB,QAAS,QAAO;AACrC,aAAS;AAAA,EACb;AACA,SAAO,aAAa,QAAQA,SAAQ,KAAK,MAAM,MAAM,GAAG,YAAY,CAAC;AACzE;AAGO,SAASI,OAAM,MAA6B;AAC/C,QAAMJ,UAAS,eAAe,MAAM,CAAC;AACrC,MAAIA,mBAAkB,QAAS,QAAOA;AACtC,QAAM,WAAW,eAAe,MAAM,CAAC;AACvC,MAAI,oBAAoB,QAAS,QAAO;AACxC,MAAIA,YAAW,KAAK,aAAa,EAAG,QAAO,QAAQ,QAAQ,OAAO;AAClE,MAAIA,YAAW,KAAK,WAAW,EAAG,QAAO,QAAQ,QAAQ,SAAS;AAClE,QAAM,SAAS,MAAQA,SAAQ,QAAQ;AACvC,SAAO,WAAW,SAAY,QAAQ,QAAQ,OAAO,IAAI,aAAa,MAAM;AAChF;AAGO,SAAS,KAAK,MAA6B;AAC9C,QAAMA,UAAS,eAAe,MAAM,CAAC;AACrC,MAAIA,mBAAkB,QAAS,QAAOA;AACtC,SAAOA,UAAS,IAAI,QAAQ,QAAQ,OAAO,IAAI,QAAQ,GAAG,MAAM,WAAW,KAAK,KAAKA,OAAM,CAAC,CAAC;AACjG;AAOO,SAAS,OAAO,MAA6B;AAChD,QAAMA,UAAS,eAAe,MAAM,CAAC;AACrC,MAAIA,mBAAkB,QAAS,QAAOA;AACtC,QAAM,YAAY,KAAK,QAAQ,CAAC;AAChC,MAAI,CAAC,UAAU,QAAS,QAAO,UAAU,UAAU,YAAY,QAAQ,QAAQ,SAAS;AACxF,MAAI,QAAQ;AACZ,MAAI,KAAK,IAAI,CAAC,GAAG;AACb,UAAM,QAAQ,eAAe,MAAM,CAAC;AACpC,QAAI,iBAAiB,QAAS,QAAO;AACrC,YAAQ;AAAA,EACZ;AACA,MAAI,QAAQ;AACZ,MAAI,QAAQ;AACZ,aAAW,SAAS,KAAK,UAAU,YAAY,SAAS,GAAG;AACvD,QAAI,MAAM,QAAS,QAAO,QAAQ,GAAG,KAAK;AAC1C,QAAI,MAAM,SAAS,SAAU;AAC7B,QAAI,MAAM,WAAWA,QAAQ,SAAQ;AAAA,aAC5B,UAAU,IAAI,MAAM,SAASA,UAAS,MAAM,SAASA,QAAQ;AAAA,EAC1E;AACA,SAAO,QAAQ,QAAQ,GAAG,MAAM,WAAW,QAAQ,CAAC,CAAC,IAAI,QAAQ,QAAQ,MAAM;AACnF;AAEO,SAAS,OAAO,MAA6B;AAChD,SAAO,OAAO,MAAM,MAAM,IAAI;AAClC;AAEO,SAAS,OAAO,MAA6B;AAChD,SAAO,OAAO,MAAM,OAAO,IAAI;AACnC;AAEO,SAAS,KAAK,MAA6B;AAC9C,SAAO,OAAO,MAAM,MAAM,KAAK;AACnC;AAEO,SAAS,KAAK,MAA6B;AAC9C,SAAO,OAAO,MAAM,OAAO,KAAK;AACpC;AAMA,SAAS,OAAO,MAAoB,QAAiB,MAAwB;AACzE,QAAM,UAAoB,CAAC;AAC3B,QAAME,SAAQ,eAAe,MAAM,OAAO;AAC1C,SAAOA,WAAU,SAAY,QAAQ,QAAQA,MAAK,IAAI,SAAS,SAAS,QAAQ,IAAI;AACxF;AAGO,SAAS,SAAS,SAA4B,QAAiB,MAAwB;AAC1F,QAAM,UAAU,SAAS,QAAQ,SAAS,IAAI,QAAQ;AACtD,MAAI,UAAU,EAAG,QAAO,QAAQ,QAAQ,SAAS;AACjD,MAAI,QAAQ;AACZ,aAAW,KAAK,QAAS,UAAS;AAClC,QAAM,OAAO,QAAQ,QAAQ;AAC7B,MAAI,UAAU;AACd,aAAW,KAAK,QAAS,aAAY,IAAI,SAAS,IAAI;AACtD,QAAM,WAAW,UAAU;AAC3B,SAAO,aAAa,OAAO,KAAK,KAAK,QAAQ,IAAI,QAAQ;AAC7D;AAEO,SAAS,aAAa,MAA6B;AACtD,QAAMF,UAAS,eAAe,MAAM,CAAC;AACrC,SAAOA,mBAAkB,UAAUA,UAAS,QAAQ,GAAG,MAAM,WAAW,KAAK,KAAKA,OAAM,CAAC,CAAC;AAC9F;AAGO,SAASK,KAAI,MAA6B;AAC7C,QAAML,UAAS,eAAe,MAAM,CAAC;AACrC,SAAOA,mBAAkB,UAAUA,UAAS,aAAsBK,KAAIL,OAAM,CAAC;AACjF;AAGO,SAASM,IAAG,MAA6B;AAC5C,QAAMN,UAAS,eAAe,MAAM,CAAC;AACrC,MAAIA,mBAAkB,QAAS,QAAOA;AACtC,SAAOA,WAAU,IAAI,QAAQ,QAAQ,OAAO,IAAI,QAAQ,GAAG,MAAM,WAAoBO,KAAIP,OAAM,CAAC,CAAC;AACrG;AAGO,SAASQ,OAAM,MAA6B;AAC/C,QAAMR,UAAS,eAAe,MAAM,CAAC;AACrC,MAAIA,mBAAkB,QAAS,QAAOA;AACtC,SAAOA,WAAU,IAAI,QAAQ,QAAQ,OAAO,IAAI,QAAQ,GAAG,MAAM,WAAoBQ,OAAMR,OAAM,CAAC,CAAC;AACvG;AAEO,SAASS,MAAc;AAC1B,SAAO,QAAQ,GAAG,MAAM,WAAW,KAAK,EAAE,CAAC;AAC/C;AAOO,SAAS,OAAO,MAA6B;AAChD,QAAMT,UAAS,aAAa,MAAM,CAAC;AACnC,MAAIA,mBAAkB,QAAS,QAAOA;AACtC,QAAM,WAAW,aAAa,MAAM,CAAC;AACrC,MAAI,oBAAoB,QAAS,QAAO;AACxC,MAAIA,YAAW,KAAK,aAAa,EAAG,QAAO,QAAQ,GAAG,MAAM,WAAW,CAAC,CAAC;AACzE,MAAI,KAAK,KAAKA,OAAM,MAAM,KAAK,KAAK,QAAQ,EAAG,QAAO,QAAQ,QAAQ,OAAO;AAC7E,MAAI,aAAa,KAAK,MAAM,QAAQ,EAAG,QAAO,KAAK,UAAU,OAAO;AACpE,SAAO,aAAa,sBAAsBA,UAAS,QAAQ,IAAI,QAAQ;AAC3E;AAEA,SAAS,aAAa,MAAoB,OAAiC;AACvE,QAAM,QAAQ,eAAe,MAAM,KAAK;AACxC,MAAI,iBAAiB,QAAS,QAAO;AACrC,MAAI,OAAO,SAAS,UAAW,QAAO,QAAQ,QAAQ,SAAS;AAC/D,SAAO,eAAe,MAAM,KAAK;AACrC;AAEO,SAAS,YAAY,MAA6B;AACrD,SAAO,oBAAoB,MAAM,IAAI;AACzC;AAEO,SAAS,UAAU,MAA6B;AACnD,SAAO,oBAAoB,MAAM,KAAK;AAC1C;AAEA,SAAS,oBAAoB,MAAoB,cAAgC;AAC7E,QAAMA,UAAS,eAAe,MAAM,CAAC;AACrC,MAAIA,mBAAkB,QAAS,QAAOA;AACtC,MAAI,eAAe;AACnB,MAAI,KAAK,IAAI,CAAC,GAAG;AACb,UAAM,QAAQ,eAAe,MAAM,CAAC;AACpC,QAAI,iBAAiB,QAAS,QAAO;AACrC,mBAAe;AAAA,EACnB;AACA,MAAI,OAAO;AACX,MAAI,KAAK,IAAI,CAAC,GAAG;AACb,UAAM,QAAQ,eAAe,MAAM,CAAC;AACpC,QAAI,iBAAiB,QAAS,QAAO;AACrC,WAAO;AAAA,EACX;AACA,MAAI,iBAAiB,KAAKA,YAAW,EAAG,QAAO,QAAQ,GAAG,MAAM,WAAW,CAAC,CAAC;AAC7E,iBAAe,KAAK,IAAI,YAAY;AACpC,QAAM,WAAWA,UAAS;AAC1B,MAAI,aAAa,EAAG,QAAO,QAAQ,QAAQ,OAAO;AAGlD,QAAMU,WAAU,gBAAgB,QAAQ;AACxC,MAAI,aAAaA,YAAW,mBAAmB,UAAUA,QAAO,EAAG,QAAO,KAAK,UAAU,OAAO;AAChG,QAAM,UAAUV,UAAS,KAAK,SAAS,IAAI,CAAC,eAAe;AAC3D,SAAO,cAAc,UAAU,KAAK,KAAK,QAAQ,IAAI,KAAK,MAAM,QAAQ,KAAK,YAAY;AAC7F;AAGA,IAAM,eAAe;AAGd,SAAS,KAAK,MAA6B;AAC9C,QAAM,OAAO,QAAQ,IAAI;AACzB,SAAO,SAAS,SAAY,QAAQ,QAAQ,eAAe,IAAI,QAAQ,GAAG,MAAM,WAAW,OAAO,IAAI,CAAC,CAAC;AAC5G;AASO,SAAS,YAAY,MAA6B;AACrD,QAAM,SAASW,SAAQ,MAAM,CAAC;AAC9B,MAAI,kBAAkB,QAAS,QAAO;AACtC,QAAM,MAAMA,SAAQ,MAAM,CAAC;AAC3B,MAAI,eAAe,QAAS,QAAO;AACnC,MAAI,CAAC,QAAQ,MAAM,KAAK,CAAC,QAAQ,GAAG,EAAG,QAAO,KAAK,UAAU,OAAO;AACpE,MAAI,SAAS,IAAK,QAAO,QAAQ,QAAQ,OAAO;AAChD,QAAM,OAAO,QAAQ,IAAI;AACzB,MAAI,SAAS,OAAW,QAAO,QAAQ,QAAQ,eAAe;AAC9D,SAAO,QAAQ,GAAG,MAAM,WAAW,QAAQ,MAAM,QAAQ,GAAG,CAAC,CAAC;AAClE;AAEA,SAAS,QAAQC,QAAwB;AACrC,SAAOA,WAAU,KAAK,MAAMA,MAAK,KAAK,KAAK,IAAIA,MAAK,KAAK;AAC7D;AAGA,SAASD,SAAQ,MAAoB,OAAiC;AAClE,QAAM,QAAQ,eAAe,MAAM,KAAK;AACxC,MAAI,iBAAiB,QAAS,QAAO;AACrC,MAAI,OAAO,SAAS,UAAW,QAAO,QAAQ,QAAQ,SAAS;AAC/D,SAAO,gBAAgB,KAAK,UAAU,SAAS,KAAK,CAAC;AACzD;AAGA,SAAS,QAAQ,MAAwC;AACrD,QAAM,OAAO,KAAK,UAAU;AAC5B,SAAO,SAAS,SAAY,SAAY,KAAK,UAAU,MAAM,KAAK,MAAM,KAAK,KAAK;AACtF;;;ACzWA,SAAS,SAAS,SAAoC;AAClD,MAAI,YAAY,OAAW,QAAO;AAClC,aAAW,QAAQ,QAAQ,MAAM,GAAG;AAChC,QAAI,KAAK,aAAa,WAAc,KAAK,SAAS,cAAc,KAAK,SAAS,aAAc,QAAO;AAAA,EACvG;AACA,SAAO;AACX;AASO,SAAS,SAAS,MAA6B;AAClD,QAAME,UAAS,kBAAkB,MAAM,CAAC;AACxC,MAAIA,mBAAkB,QAAS,QAAOA;AAEtC,QAAM,KAAKA,WAAU,OAAOA,WAAU,MAAMA,UAAS,MAAMA;AAC3D,MAAI,KAAK,KAAK,KAAK,GAAI,QAAO,QAAQ,QAAQ,SAAS;AACvD,QAAM,SAAkB,CAAC;AACzB,WAAS,IAAI,GAAG,IAAI,KAAK,OAAO,KAAK;AACjC,UAAM,UAAU,QAAQ,KAAK,QAAQ,CAAC,GAAG,OAAO,MAAM,OAAO,MAAM;AACnE,QAAI,YAAY,OAAW,QAAO;AAAA,EACtC;AACA,SAAO,OAAO,IAAI,QAAQ,MAAS;AACvC;AAeO,SAAS,UAAU,MAA6B;AACnD,QAAM,KAAK,kBAAkB,MAAM,CAAC;AACpC,MAAI,cAAc,QAAS,QAAO;AAClC,MAAI,SAAS;AACb,MAAI,KAAK,IAAI,CAAC,GAAG;AACb,UAAM,QAAQ,kBAAkB,MAAM,CAAC;AACvC,QAAI,iBAAiB,QAAS,QAAO;AACrC,aAAS;AAAA,EACb;AACA,MAAI,KAAK,KAAK,KAAK,MAAM,SAAS,KAAK,SAAS,EAAG,QAAO,QAAQ,QAAQ,SAAS;AAEnF,MAAI,OAAO,MAAM,KAAK,GAAI,QAAO,KAAK,UAAU,OAAO;AACvD,QAAM,aAAa,UAAU;AAC7B,QAAM,iBAAiB,WAAW,KAAK,WAAW,KAAK,WAAW,KAAK,WAAW;AAClF,QAAM,SAAkB,CAAC;AACzB,MAAI,MAAM,IAAI;AACV,aAAS,IAAI,GAAG,IAAI,KAAK,OAAO,KAAK;AACjC,YAAMC,WAAU,QAAQ,KAAK,QAAQ,CAAC,GAAG,OAAO,YAAY,gBAAgB,MAAM;AAClF,UAAIA,aAAY,OAAW,QAAOA;AAAA,IACtC;AACA,WAAO,OAAO,IAAI,QAAQ,MAAS;AAAA,EACvC;AAGA,MAAI,KAAK,UAAU,EAAG,QAAO,QAAQ,QAAQ,SAAS;AACtD,QAAM,UAAU,QAAQ,KAAK,QAAQ,CAAC,GAAG,MAAM,YAAY,gBAAgB,MAAM;AACjF,MAAI,YAAY,OAAW,QAAO;AAClC,QAAMC,SAAQ,OAAO,KAAK,OAAK,EAAE,OAAO;AACxC,MAAIA,WAAU,OAAW,QAAO,QAAQ,GAAGA,MAAK;AAChD,QAAM,IAAI,eAAe,MAAM,CAAC;AAChC,MAAI,aAAa,QAAS,QAAO;AACjC,SAAO,OAAO,IAAI,QAAQ,CAAC;AAC/B;AAOA,SAAS,kBAAkB,MAAoB,OAAiC;AAC5E,QAAMF,UAAS,eAAe,MAAM,KAAK;AACzC,MAAIA,mBAAkB,QAAS,QAAOA;AACtC,QAAM,YAAY,KAAK,MAAMA,OAAM;AACnC,MAAI,YAAY,eAAe,YAAY,WAAY,QAAO,QAAQ,QAAQ,SAAS;AACvF,SAAO,cAAc,IAAI,IAAI;AACjC;AASA,SAAS,QAAQ,SAAkB,QAAiB,YAAqB,gBAAyB,QAAsC;AACpI,QAAM,MAAM,CAAC,UAAuB;AAChC,QAAI,EAAE,MAAM,WAAW,gBAAiB,QAAO,KAAK,KAAK;AAAA,EAC7D;AACA,UAAQ,QAAQ,MAAM;AAAA,IAClB,KAAK,QAAQ;AACT,YAAM,QAAQ,QAAQ,QAAQ;AAC9B,iBAAW,WAAW,MAAM,WAAW,QAAQ,IAAI,GAAG;AAClD,YAAI,cAAc,SAAS,MAAM,UAAU,OAAO,CAAC,EAAG;AACtD,cAAM,QAAQ,MAAM,KAAK,OAAO;AAChC,YAAI,UAAU,OAAW,OAAM,IAAI,MAAM,aAAa,QAAQ,SAAS,CAAC,2BAA2B;AACnG,YAAI,KAAK;AAAA,MACb;AACA,aAAO;AAAA,IACX;AAAA,IACA,KAAK;AACD,iBAAW,SAAS,QAAQ,SAAS,EAAG,KAAI,UAAU,OAAW,KAAI,KAAK;AAC1E,aAAO;AAAA,IACX,KAAK;AACD,UAAI,CAAC,OAAQ;AACb,iBAAW,SAAS,QAAQ,QAAQ,EAAE,SAAS,EAAG,KAAI,KAAK;AAC3D,aAAO;AAAA,IACX,KAAK,UAAU;AAIX,YAAM,QAAQ,QAAQ;AACtB,UAAI,UAAU,UAAU,UAAa,CAAC,MAAM,SAAS;AACjD,YAAI,KAAK;AACT,eAAO;AAAA,MACX;AACA;AAAA,IACJ;AAAA,IACA,KAAK;AAAA,IACL,KAAK;AACD;AAAA,IACJ;AAAS,YAAM,IAAI,MAAM,aAAa,OAAO,QAAQ,IAAI,CAAC,yBAAyB;AAAA,EACvF;AACA,SAAO,QAAQ,UAAU,UAAU,QAAQ,QAAQ,SAAS;AAChE;AAOA,SAAS,OAAO,IAAY,QAA0B,GAAgC;AAClF,MAAI,OAAO,EAAG,QAAO,QAAQ,GAAG,MAAM,WAAW,OAAO,OAAO,OAAK,EAAE,SAAS,QAAQ,EAAE,MAAM,CAAC;AAChG,MAAI,OAAO,EAAG,QAAO,QAAQ,GAAG,MAAM,WAAW,OAAO,MAAM,CAAC;AAC/D,QAAM,UAAoB,CAAC;AAC3B,aAAW,SAAS,QAAQ;AACxB,QAAI,MAAM,QAAS,QAAO,QAAQ,GAAG,KAAK;AAC1C,QAAI,MAAM,SAAS,SAAU,SAAQ,KAAK,MAAM,MAAM;AAAA,EAC1D;AACA,UAAQ,IAAI;AAAA,IACR,KAAK;AAAG,aAAO,UAAU,OAAO;AAAA,IAChC,KAAK;AAAG,aAAO,MAAM,OAAO;AAAA,IAC5B,KAAK;AAAG,aAAO,MAAM,OAAO;AAAA,IAC5B,KAAK;AAAG,aAAO,UAAU,OAAO;AAAA,IAChC,KAAK;AAAG,aAAO,SAAS,SAAS,MAAM,IAAI;AAAA,IAC3C,KAAK;AAAG,aAAO,SAAS,SAAS,OAAO,IAAI;AAAA,IAC5C,KAAK;AAAG,aAAO,MAAM,OAAO;AAAA,IAC5B,KAAK;AAAI,aAAO,SAAS,SAAS,MAAM,KAAK;AAAA,IAC7C,KAAK;AAAI,aAAO,SAAS,SAAS,OAAO,KAAK;AAAA,IAC9C,KAAK;AAAI,aAAO,SAAS,OAAO;AAAA,IAChC,KAAK;AAAI,aAAO,MAAM,SAAS,IAAI,CAAC,GAAG,IAAI;AAAA,IAC3C,KAAK;AAAI,aAAO,MAAM,SAAS,IAAI,CAAC,GAAG,KAAK;AAAA,IAC5C;AAAS,YAAM,IAAI,MAAM,aAAa,OAAO,EAAE,CAAC,yBAAyB;AAAA,EAC7E;AACJ;AAEA,SAAS,IAAI,GAA+B;AACxC,MAAI,MAAM,OAAW,OAAM,IAAI,MAAM,qDAAqD;AAC1F,SAAO;AACX;;;AC9KO,IAAM,YAAY;AAEzB,SAAS,WAAWG,OAAuB;AACvC,SAAO,QAAQ,GAAG,MAAM,SAASA,KAAI,CAAC;AAC1C;AAEO,SAAS,KAAK,MAA6B;AAC9C,SAAO,KAAK,MAAM,IAAI;AAC1B;AAEO,SAAS,MAAM,MAA6B;AAC/C,SAAO,KAAK,MAAM,KAAK;AAC3B;AAGA,SAAS,KAAK,MAAoB,WAA6B;AAC3D,QAAMA,QAAO,aAAa,MAAM,CAAC;AACjC,MAAIA,iBAAgB,QAAS,QAAOA;AACpC,MAAIC,SAAQ;AACZ,MAAI,KAAK,QAAQ,GAAG;AAChB,IAAAA,SAAQ;AACR,QAAI,KAAK,IAAI,CAAC,GAAG;AACb,YAAM,QAAQ,eAAe,MAAM,CAAC;AACpC,UAAI,iBAAiB,QAAS,QAAO;AACrC,MAAAA,SAAQ;AAAA,IACZ;AAAA,EACJ;AACA,EAAAA,SAAQ,KAAK,MAAMA,MAAK;AACxB,MAAIA,SAAQ,EAAG,QAAO,QAAQ,QAAQ,SAAS;AAC/C,QAAM,SAAS,KAAK,IAAIA,QAAOD,MAAK,MAAM;AAC1C,SAAO,WAAW,YAAYA,MAAK,MAAM,GAAG,MAAM,IAAIA,MAAK,MAAMA,MAAK,SAAS,MAAM,CAAC;AAC1F;AAGO,SAAS,IAAI,MAA6B;AAC7C,QAAMA,QAAO,aAAa,MAAM,CAAC;AACjC,MAAIA,iBAAgB,QAAS,QAAOA;AACpC,QAAM,aAAa,eAAe,MAAM,CAAC;AACzC,MAAI,sBAAsB,QAAS,QAAO;AAC1C,QAAM,aAAa,eAAe,MAAM,CAAC;AACzC,MAAI,sBAAsB,QAAS,QAAO;AAC1C,QAAM,QAAQ,KAAK,MAAM,UAAU;AACnC,QAAMC,SAAQ,KAAK,MAAM,UAAU;AACnC,MAAI,QAAQ,KAAKA,SAAQ,EAAG,QAAO,QAAQ,QAAQ,SAAS;AAC5D,MAAI,QAAQD,MAAK,OAAQ,QAAO,WAAW,EAAE;AAC7C,QAAM,OAAO,QAAQ;AACrB,QAAM,SAAS,KAAK,IAAIC,QAAOD,MAAK,SAAS,IAAI;AACjD,SAAO,WAAWA,MAAK,MAAM,MAAM,OAAO,MAAM,CAAC;AACrD;AAEO,SAAS,IAAI,MAA6B;AAC7C,QAAMA,QAAO,aAAa,MAAM,CAAC;AACjC,SAAOA,iBAAgB,UAAUA,QAAO,QAAQ,GAAG,MAAM,WAAWA,MAAK,MAAM,CAAC;AACpF;AAGO,SAAS,KAAK,MAA6B;AAC9C,QAAMA,QAAO,aAAa,MAAM,CAAC;AACjC,SAAOA,iBAAgB,UAAUA,QAAO,WAAWA,MAAK,MAAM,GAAG,EAAE,OAAO,CAAAE,UAAQA,MAAK,SAAS,CAAC,EAAE,KAAK,GAAG,CAAC;AAChH;AAOO,SAAS,OAAO,MAA6B;AAChD,QAAM,YAAY,KAAK;AACvB,MAAI,SAAS;AACb,WAAS,IAAI,GAAG,IAAI,KAAK,OAAO,KAAK;AACjC,UAAM,UAAU,KAAK,cAAc,CAAC;AACpC,YAAQ,QAAQ,MAAM;AAAA,MAClB,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACD,mBAAW,SAAS,UAAU,YAAY,OAAO,GAAG;AAChD,cAAI,MAAM,QAAS,QAAO,QAAQ,GAAG,KAAK;AAC1C,oBAAU,UAAU,OAAO,KAAK;AAAA,QACpC;AACA;AAAA,MACJ,KAAK;AACD;AAAA,MACJ,KAAK;AACD,YAAI,QAAQ,QAAQ,YAAY,KAAM,QAAO;AAC7C,kBAAU,UAAU,OAAO,QAAQ,MAAM;AACzC;AAAA,MACJ;AAAS,cAAM,IAAI,MAAM,aAAa,OAAO,QAAQ,IAAI,CAAC,yBAAyB;AAAA,IACvF;AACA,QAAI,OAAO,SAAS,UAAW,QAAO,QAAQ,QAAQ,SAAS;AAAA,EACnE;AACA,SAAO,WAAW,MAAM;AAC5B;AAUO,SAAS,aAAa,MAA6B;AACtD,QAAM,QAAQ,eAAe,MAAM,CAAC;AACpC,MAAI,iBAAiB,QAAS,QAAO;AACrC,QAAM,OAAO,aAAa,MAAM,CAAC;AACjC,MAAI,gBAAgB,QAAS,QAAO;AACpC,MAAI,SAAS,aAAa;AAC1B,MAAI,KAAK,SAAS,GAAG;AACjB,UAAMC,QAAO,aAAa,kBAAkB,IAAI,EAAE;AAClD,QAAIA,UAAS,OAAW,QAAO,KAAK,UAAU,OAAO;AACrD,aAASA;AAAA,EACb;AACA,QAAM,UAAU,KAAK,UAAU;AAC/B,MAAI;AACJ,MAAI,UAAU,OAAW,SAAQ,MAAM,WAAW,CAAC;AAAA,WAC1C,MAAM,SAAS,QAAQ;AAC5B,UAAMC,UAAS,YAAY,MAAM,MAAM,OAAO;AAC9C,YAAQA,YAAW,SAAY,QAAQ,MAAM,WAAWA,OAAM;AAAA,EAClE,MAAO,SAAQ;AACf,MAAI,MAAM,SAAS,YAAY,KAAK,WAAW,EAAG,QAAO,WAAW,EAAE;AACtE,MAAI,MAAM,SAAS,YAAY,OAAO,uBAAuB;AACzD,UAAMC,WAAU,cAAc,MAAM,QAAQ,gBAAgB,MAAM,SAAS,IAAI,IAAI,IAAI,OAAO;AAC9F,WAAOA,aAAY,SAAY,QAAQ,QAAQ,SAAS,IAAI,WAAWA,QAAO;AAAA,EAClF;AACA,QAAM,YAAY,OAAO,OAAO,OAAO,OAAO;AAC9C,SAAO,UAAU,aAAa,QAAQ,QAAQ,SAAS,IAAI,WAAW,UAAU,IAAI;AACxF;AAQO,SAAS,SAAS,MAA6B;AAClD,QAAM,YAAY,KAAK;AACvB,QAAM,aAAuB,CAAC;AAC9B,QAAM,QAAQ,KAAK,SAAS,CAAC;AAC7B,MAAI,MAAM,SAAS,UAAU;AACzB,eAAW,QAAQ,QAAQ,KAAK,GAAG;AAC/B,UAAI,MAAM,YAAY,KAAM,QAAO,QAAQ,GAAG,IAAI;AAClD,iBAAW,KAAK,UAAU,OAAO,IAAI,CAAC;AAAA,IAC1C;AAAA,EACJ,OAAO;AACH,QAAI,QAAQ,KAAK,EAAG,QAAO,SAAS,IAAI;AACxC,UAAM,QAAQ,UAAU,SAAS,KAAK;AACtC,QAAI,OAAO,YAAY,KAAM,QAAO,QAAQ,GAAG,KAAK;AACpD,eAAW,KAAK,UAAU,OAAO,KAAK,CAAC;AAAA,EAC3C;AACA,QAAM,cAAc,eAAe,MAAM,CAAC;AAC1C,MAAI,uBAAuB,QAAS,QAAO;AAC3C,MAAI,cAAc;AAClB,MAAI,gBAAgB,QAAW;AAC3B,UAAM,QAAQ,QAAQ,WAAW;AACjC,QAAI,UAAU,OAAW,QAAO,QAAQ,QAAQ,SAAS;AACzD,kBAAc;AAAA,EAClB;AACA,MAAI,SAAS;AACb,MAAI,QAAQ;AACZ,WAAS,IAAI,GAAG,IAAI,KAAK,OAAO,KAAK;AACjC,eAAW,QAAQ,QAAQ,KAAK,QAAQ,CAAC,CAAC,GAAG;AACzC,UAAI,MAAM,YAAY,KAAM,QAAO,QAAQ,GAAG,IAAI;AAClD,YAAML,QAAO,UAAU,OAAO,IAAI;AAClC,UAAI,eAAeA,MAAK,WAAW,EAAG;AACtC,UAAI,QAAQ,EAAG,WAAU,YAAY,QAAQ,KAAK,WAAW,MAAM;AACnE,gBAAUA;AACV;AACA,UAAI,OAAO,SAAS,UAAW,QAAO,QAAQ,QAAQ,SAAS;AAAA,IACnE;AAAA,EACJ;AACA,SAAO,WAAW,MAAM;AAC5B;AAGA,UAAU,QAAQ,SAAgD;AAC9D,UAAQ,QAAQ,MAAM;AAAA,IAClB,KAAK,QAAQ;AACT,YAAM,OAAO,QAAQ;AACrB,YAAM,QAAQ,QAAQ,QAAQ;AAC9B,eAASM,OAAM,KAAK,MAAMA,QAAO,KAAK,MAAMA,QAAO;AAC/C,iBAASC,UAAS,KAAK,SAASA,WAAU,KAAK,SAASA,UAAU,OAAM,MAAM,KAAK,IAAI,YAAYD,MAAKC,OAAM,CAAC;AAAA,MACnH;AACA;AAAA,IACJ;AAAA,IACA,KAAK;AACD,aAAO,QAAQ,SAAS;AACxB;AAAA,IACJ,KAAK,UAAU;AAEX,YAAM,OAAO,QAAQ;AACrB,iBAAW,SAAS,QAAQ,SAAS,GAAG;AACpC,iBAASD,OAAM,KAAK,MAAMA,QAAO,KAAK,MAAMA,QAAO;AAC/C,mBAASC,UAAS,KAAK,SAASA,WAAU,KAAK,SAASA,UAAU,OAAM,MAAM,KAAK,IAAI,YAAYD,MAAKC,OAAM,CAAC;AAAA,QACnH;AAAA,MACJ;AACA;AAAA,IACJ;AAAA,IACA,KAAK;AACD,aAAO,QAAQ,QAAQ,EAAE,IAAI;AAC7B;AAAA,IACJ,KAAK;AACD,YAAM;AACN;AAAA,IACJ,KAAK;AACD,YAAM,QAAQ;AACd;AAAA,IACJ;AAAS,YAAM,IAAI,MAAM,aAAa,OAAO,QAAQ,IAAI,CAAC,yBAAyB;AAAA,EACvF;AACJ;AAGO,SAAS,YAAY,MAA6B;AACrD,MAAI,SAAS;AACb,WAAS,IAAI,GAAG,IAAI,KAAK,OAAO,KAAK;AACjC,QAAI,CAAC,KAAK,IAAI,CAAC,EAAG;AAClB,UAAMP,QAAO,aAAa,MAAM,CAAC;AACjC,QAAIA,iBAAgB,QAAS,QAAOA;AACpC,cAAUA;AACV,QAAI,OAAO,SAAS,UAAW,QAAO,QAAQ,QAAQ,SAAS;AAAA,EACnE;AACA,SAAO,WAAW,MAAM;AAC5B;AAOO,SAAS,WAAW,MAA6B;AACpD,QAAMA,QAAO,aAAa,MAAM,CAAC;AACjC,MAAIA,iBAAgB,QAAS,QAAOA;AACpC,QAAM,MAAM,aAAa,MAAM,CAAC;AAChC,MAAI,eAAe,QAAS,QAAO;AACnC,QAAM,cAAc,aAAa,MAAM,CAAC;AACxC,MAAI,uBAAuB,QAAS,QAAO;AAC3C,MAAI,KAAK,IAAI,CAAC,GAAG;AACb,UAAM,QAAQ,eAAe,MAAM,CAAC;AACpC,QAAI,iBAAiB,QAAS,QAAO;AACrC,UAAM,WAAW,KAAK,MAAM,KAAK;AACjC,QAAI,WAAW,EAAG,QAAO,QAAQ,QAAQ,SAAS;AAClD,QAAI,IAAI,WAAW,EAAG,QAAO,WAAWA,KAAI;AAC5C,QAAI,KAAK;AACT,aAAS,IAAI,GAAG,IAAI,UAAU,KAAK;AAC/B,WAAKA,MAAK,QAAQ,KAAK,KAAK,CAAC;AAC7B,UAAI,KAAK,EAAG,QAAO,WAAWA,KAAI;AAAA,IACtC;AACA,WAAO,WAAWA,MAAK,MAAM,GAAG,EAAE,IAAI,cAAcA,MAAK,MAAM,KAAK,IAAI,MAAM,CAAC;AAAA,EACnF;AACA,SAAO,WAAW,IAAI,WAAW,IAAIA,QAAOA,MAAK,MAAM,GAAG,EAAE,KAAK,WAAW,CAAC;AACjF;AAGO,SAAS,QAAQ,MAA6B;AACjD,QAAMA,QAAO,aAAa,MAAM,CAAC;AACjC,MAAIA,iBAAgB,QAAS,QAAOA;AACpC,QAAM,aAAa,eAAe,MAAM,CAAC;AACzC,MAAI,sBAAsB,QAAS,QAAO;AAC1C,QAAM,aAAa,eAAe,MAAM,CAAC;AACzC,MAAI,sBAAsB,QAAS,QAAO;AAC1C,QAAM,cAAc,aAAa,MAAM,CAAC;AACxC,MAAI,uBAAuB,QAAS,QAAO;AAC3C,QAAM,QAAQ,KAAK,MAAM,UAAU;AACnC,QAAMC,SAAQ,KAAK,MAAM,UAAU;AACnC,MAAI,QAAQ,KAAKA,SAAQ,EAAG,QAAO,QAAQ,QAAQ,SAAS;AAC5D,QAAM,OAAO,KAAK,IAAI,QAAQ,GAAGD,MAAK,MAAM;AAC5C,QAAM,SAAS,KAAK,IAAIC,QAAOD,MAAK,SAAS,IAAI;AACjD,QAAM,SAASA,MAAK,MAAM,GAAG,IAAI,IAAI,cAAcA,MAAK,MAAM,OAAO,MAAM;AAC3E,SAAO,OAAO,SAAS,YAAY,QAAQ,QAAQ,SAAS,IAAI,WAAW,MAAM;AACrF;AAOO,SAAS,KAAK,MAA6B;AAC9C,QAAM,SAAS,aAAa,MAAM,CAAC;AACnC,MAAI,kBAAkB,QAAS,QAAO;AACtC,QAAM,SAAS,aAAa,MAAM,CAAC;AACnC,MAAI,kBAAkB,QAAS,QAAO;AACtC,MAAI,QAAQ;AACZ,MAAI,KAAK,IAAI,CAAC,GAAG;AACb,UAAM,QAAQ,eAAe,MAAM,CAAC;AACpC,QAAI,iBAAiB,QAAS,QAAO;AACrC,YAAQ;AAAA,EACZ;AACA,UAAQ,KAAK,MAAM,KAAK;AACxB,MAAI,QAAQ,KAAK,QAAQ,OAAO,OAAQ,QAAO,QAAQ,QAAQ,SAAS;AACxE,MAAI,OAAO,WAAW,EAAG,QAAO,QAAQ,GAAG,MAAM,WAAW,KAAK,CAAC;AAClE,QAAM,KAAK,OAAO,QAAQ,QAAQ,QAAQ,CAAC;AAC3C,SAAO,KAAK,IAAI,QAAQ,QAAQ,SAAS,IAAI,QAAQ,GAAG,MAAM,WAAW,KAAK,CAAC,CAAC;AACpF;AAGO,SAAS,KAAK,MAA6B;AAC9C,QAAMA,QAAO,aAAa,MAAM,CAAC;AACjC,MAAIA,iBAAgB,QAAS,QAAOA;AACpC,QAAM,QAAQ,eAAe,MAAM,CAAC;AACpC,MAAI,iBAAiB,QAAS,QAAO;AACrC,QAAM,QAAQ,KAAK,MAAM,KAAK;AAC9B,MAAI,QAAQ,KAAKA,MAAK,SAAS,QAAQ,UAAW,QAAO,QAAQ,QAAQ,SAAS;AAClF,SAAO,WAAWA,MAAK,OAAOA,MAAK,WAAW,IAAI,IAAI,KAAK,CAAC;AAChE;AAGO,SAASQ,OAAM,MAA6B;AAC/C,QAAM,QAAQ,aAAa,MAAM,CAAC;AAClC,MAAI,iBAAiB,QAAS,QAAO;AACrC,QAAM,SAAS,aAAa,MAAM,CAAC;AACnC,MAAI,kBAAkB,QAAS,QAAO;AACtC,SAAO,QAAQ,GAAG,MAAM,YAAY,UAAU,MAAM,CAAC;AACzD;AAQO,SAASC,aAAY,MAA6B;AACrD,QAAMT,QAAO,aAAa,MAAM,CAAC;AACjC,MAAIA,iBAAgB,QAAS,QAAOA;AACpC,QAAM,OAAO,KAAK,UAAU,QAAQ;AACpC,MAAI,mBAAmB,KAAK,uBAAuB,OAAO,CAAC;AAC3D,MAAI,iBAAiB,KAAK,qBAAqB,SAAS,IAAI,KAAK,qBAAqB,OAAO,CAAC,IAAI;AAClG,MAAI,KAAK,IAAI,CAAC,GAAG;AACb,UAAM,QAAQ,aAAa,MAAM,CAAC;AAClC,QAAI,iBAAiB,QAAS,QAAO;AACrC,QAAI,MAAM,WAAW,EAAG,QAAO,QAAQ,QAAQ,SAAS;AACxD,uBAAmB,MAAM,OAAO,CAAC;AAAA,EACrC;AACA,MAAI,KAAK,IAAI,CAAC,GAAG;AACb,UAAM,QAAQ,aAAa,MAAM,CAAC;AAClC,QAAI,iBAAiB,QAAS,QAAO;AACrC,QAAI,MAAM,WAAW,EAAG,QAAO,QAAQ,QAAQ,SAAS;AACxD,qBAAiB,MAAM,OAAO,CAAC;AAAA,EACnC;AACA,MAAI,qBAAqB,eAAgB,QAAO,QAAQ,QAAQ,SAAS;AAEzE,MAAI,SAAS;AACb,MAAI,WAAW;AACf,MAAI,cAAc;AAClB,WAAS,IAAI,GAAG,IAAIA,MAAK,QAAQ,KAAK;AAClC,UAAM,IAAIA,MAAK,OAAO,CAAC;AACvB,UAAM,OAAOA,MAAK,WAAW,CAAC;AAC9B,QAAI,aAAa,IAAI,EAAG;AACxB,QAAI,WAAW,KAAK,MAAM,IAAK,QAAO,QAAQ,QAAQ,SAAS;AAC/D,QAAI,MAAM,IAAK;AAAA,aACN,MAAM,kBAAkB;AAC7B,UAAI,YAAa,QAAO,QAAQ,QAAQ,SAAS;AACjD,oBAAc;AACd,gBAAU;AAAA,IACd,WAAW,MAAM,gBAAgB;AAC7B,UAAI,YAAa,QAAO,QAAQ,QAAQ,SAAS;AAAA,IACrD,WAAW,aAAa,IAAI,MAAO,MAAM,OAAO,MAAM,QAAQ,OAAO,WAAW,EAAI,WAAU;AAAA,QACzF,QAAO,QAAQ,QAAQ,SAAS;AAAA,EACzC;AACA,MAAI,OAAO,WAAW,EAAG,QAAO,aAAa,IAAI,QAAQ,GAAG,MAAM,WAAW,CAAC,CAAC,IAAI,QAAQ,QAAQ,SAAS;AAE5G,MAAI,CAAC,QAAQ,KAAK,MAAM,EAAG,QAAO,QAAQ,QAAQ,SAAS;AAC3D,SAAO,aAAa,OAAO,MAAM,IAAI,WAAW,IAAI,QAAQ,CAAC;AACjE;AAOO,SAAS,QAAQ,MAA6B;AACjD,QAAM,QAAQ,eAAe,MAAM,CAAC;AACpC,MAAI,iBAAiB,QAAS,QAAO;AACrC,MAAI,UAAU,OAAW,QAAO,QAAQ,GAAG,MAAM,WAAW,CAAC,CAAC;AAC9D,MAAI,MAAM,SAAS,SAAU,QAAO,QAAQ,GAAG,KAAK;AACpD,MAAI,MAAM,SAAS,QAAQ;AACvB,UAAM,SAAS,YAAY,MAAM,MAAM,KAAK,UAAU,OAAO;AAC7D,QAAI,WAAW,OAAW,QAAO,QAAQ,GAAG,MAAM,WAAW,MAAM,CAAC;AAAA,EACxE;AACA,SAAO,QAAQ,QAAQ,SAAS;AACpC;AAKO,SAAS,MAAM,MAA6B;AAC/C,QAAMA,QAAO,aAAa,MAAM,CAAC;AACjC,MAAIA,iBAAgB,QAAS,QAAOA;AACpC,MAAI,SAAS;AACb,WAAS,IAAI,GAAG,IAAIA,MAAK,QAAQ,KAAK;AAClC,UAAM,IAAIA,MAAK,OAAO,CAAC;AACvB,QAAI,CAAC,sBAAsB,CAAC,EAAG,QAAO,KAAK,UAAU,OAAO;AAC5D,cAAU,cAAc,CAAC;AAAA,EAC7B;AACA,SAAO,WAAW,MAAM;AAC5B;AAEO,SAAS,MAAM,MAA6B;AAC/C,QAAMA,QAAO,aAAa,MAAM,CAAC;AACjC,MAAIA,iBAAgB,QAAS,QAAOA;AACpC,WAAS,IAAI,GAAG,IAAIA,MAAK,QAAQ,KAAK;AAClC,UAAM,IAAIA,MAAK,OAAO,CAAC;AACvB,QAAI,CAAC,sBAAsB,CAAC,KAAK,MAAM,YAAO,MAAM,SAAK,QAAO,KAAK,UAAU,OAAO;AAAA,EAC1F;AACA,MAAI,CAAC,sBAAsBA,KAAI,EAAG,QAAO,KAAK,UAAU,OAAO;AAC/D,MAAI,SAAS;AACb,WAAS,IAAI,GAAG,IAAIA,MAAK,QAAQ,KAAK;AAClC,UAAM,IAAIA,MAAK,OAAO,CAAC;AACvB,QAAI,MAAM,UAAK;AACX,YAAM,OAAOA,MAAK,OAAO,IAAI,CAAC;AAC9B,gBAAU,SAAS,YAAO,SAAS,YAAO,SAAS,WAAM,WAAM;AAAA,IACnE,MAAO,WAAU,cAAc,CAAC;AAAA,EACpC;AACA,SAAO,WAAW,MAAM;AAC5B;AAGA,SAAS,sBAAsBA,OAAuB;AAClD,aAAWE,SAAQF,MAAK,MAAM,GAAG,GAAG;AAChC,QAAIE,MAAK,SAAS,QAAG,KAAK,SAAS,KAAKA,KAAI,EAAG,QAAO;AAAA,EAC1D;AACA,SAAO;AACX;AAEA,SAAS,cAAc,GAAmB;AACtC,QAAM,OAAO,EAAE,WAAW,CAAC;AAC3B,MAAI,QAAQ,MAAQ,QAAQ,GAAM,QAAO,OAAO,aAAa,OAAO,EAAE;AACtE,UAAQ,GAAG;AAAA,IACP,KAAK;AAAK,aAAO;AAAA,IACjB,KAAK;AAAK,aAAO;AAAA,IACjB,KAAK;AAAA,IACL,KAAK;AACD,aAAO;AAAA,IACX,KAAK;AAAK,aAAO;AAAA,IACjB,KAAK;AAAK,aAAO;AAAA,IACjB;AAAS,aAAO;AAAA,EACpB;AACJ;AAEO,SAAS,OAAO,MAA6B;AAChD,QAAMF,QAAO,aAAa,MAAM,CAAC;AACjC,MAAIA,iBAAgB,QAAS,QAAOA;AACpC,WAAS,IAAI,GAAG,IAAIA,MAAK,QAAQ,KAAK;AAClC,QAAI,CAAC,sBAAsBA,MAAK,OAAO,CAAC,CAAC,EAAG,QAAO,KAAK,UAAU,OAAO;AAAA,EAC7E;AAEA,aAAWE,SAAQF,MAAK,MAAM,GAAG,GAAG;AAChC,QAAIE,MAAK,SAAS,KAAK,QAAQ,KAAKA,KAAI,EAAG,QAAO,KAAK,UAAU,OAAO;AAAA,EAC5E;AACA,MAAI,SAAS;AACb,MAAI,UAAU;AACd,WAAS,IAAI,GAAG,IAAIF,MAAK,QAAQ,KAAK;AAClC,UAAM,IAAIA,MAAK,OAAO,CAAC;AACvB,UAAM,UAAU,cAAc,CAAC;AAC/B,cAAU,UAAU,cAAc,OAAO,IAAI;AAC7C,cAAU,CAAC,mBAAmB,CAAC;AAAA,EACnC;AACA,SAAO,WAAW,MAAM;AAC5B;AAEA,SAAS,mBAAmB,GAAoB;AAC5C,SAAO,cAAc,EAAE,WAAW,CAAC,CAAC,KAAK,2EAAgB,SAAS,CAAC;AACvE;AAMO,SAAS,WAAW,MAA6B;AACpD,QAAM,SAAS,aAAa,MAAM,CAAC;AACnC,MAAI,kBAAkB,QAAS,QAAO;AACtC,QAAM,SAAS,aAAa,MAAM,CAAC;AACnC,MAAI,kBAAkB,QAAS,QAAO;AACtC,MAAI,QAAQ;AACZ,MAAI,KAAK,IAAI,CAAC,GAAG;AACb,UAAM,QAAQ,eAAe,MAAM,CAAC;AACpC,QAAI,iBAAiB,QAAS,QAAO;AACrC,YAAQ;AAAA,EACZ;AACA,UAAQ,KAAK,MAAM,KAAK;AACxB,MAAI,CAAC,oBAAoB,MAAM,KAAK,CAAC,oBAAoB,MAAM,EAAG,QAAO,KAAK,UAAU,OAAO;AAC/F,MAAI,QAAQ,KAAK,QAAQ,OAAO,OAAQ,QAAO,QAAQ,QAAQ,SAAS;AACxE,MAAI,OAAO,WAAW,EAAG,QAAO,QAAQ,GAAG,MAAM,WAAW,KAAK,CAAC;AAElE,QAAM,SAAiD,CAAC;AACxD,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACpC,UAAM,IAAI,OAAO,OAAO,CAAC;AACzB,UAAMU,QAAO,OAAO,OAAO,IAAI,CAAC;AAChC,QAAI,MAAM,QAAQA,UAAS,OAAOA,UAAS,OAAOA,UAAS,MAAM;AAC7D,aAAO,KAAK,EAAE,WAAWA,OAAM,MAAM,MAAM,CAAC;AAC5C;AAAA,IACJ,MAAO,QAAO,KAAK,EAAE,WAAW,GAAG,MAAM,MAAM,OAAO,MAAM,IAAI,CAAC;AAAA,EACrE;AAIA,MAAI,OAAkB,MAAM,KAAK,EAAE,QAAQ,OAAO,SAAS,EAAE,GAAG,MAAM,IAAI;AAC1E,MAAI,UAAqB,MAAM,KAAK,EAAE,QAAQ,OAAO,SAAS,EAAE,GAAG,MAAM,KAAK;AAC9E,WAAS,IAAI,OAAO,SAAS,GAAG,KAAK,GAAG,KAAK;AACzC,UAAM,EAAE,WAAW,KAAK,IAAI,OAAO,CAAC;AACpC,UAAM,OAAO,QAAQ,cAAc;AACnC,YAAQ,OAAO,MAAM,IAAI,QAAQ,KAAK,OAAO,MAAM,MAAM;AACzD,aAAS,IAAI,OAAO,SAAS,GAAG,KAAK,QAAQ,GAAG,KAAK;AACjD,cAAQ,CAAC,IAAI,OACP,KAAK,CAAC,MAAM,QAAQ,QAAQ,IAAI,CAAC,MAAM,OACvC,KAAK,IAAI,CAAC,MAAM,SAAS,QAAQ,mBAAmB,SAAS,MAAM,mBAAmB,OAAO,OAAO,CAAC,CAAC;AAAA,IAChH;AACA,KAAC,SAAS,IAAI,IAAI,CAAC,MAAM,OAAO;AAAA,EACpC;AACA,WAAS,IAAI,QAAQ,GAAG,IAAI,OAAO,QAAQ,KAAK;AAC5C,QAAI,KAAK,CAAC,MAAM,KAAM,QAAO,QAAQ,GAAG,MAAM,WAAW,IAAI,CAAC,CAAC;AAAA,EACnE;AACA,SAAO,QAAQ,QAAQ,SAAS;AACpC;AAEA,SAAS,oBAAoBV,OAAuB;AAChD,WAAS,IAAI,GAAG,IAAIA,MAAK,QAAQ,KAAK;AAClC,QAAI,CAAC,QAAQA,MAAK,WAAW,CAAC,CAAC,KAAK,CAAC,6CAAW,SAASA,MAAK,OAAO,CAAC,CAAC,EAAG,QAAO;AAAA,EACrF;AACA,SAAO;AACX;AAEA,SAAS,mBAAmB,GAAmB;AAC3C,QAAM,OAAO,EAAE,WAAW,CAAC;AAC3B,MAAI,QAAQ,MAAQ,QAAQ,IAAM,QAAO,OAAO,aAAa,OAAO,EAAE;AACtE,UAAQ,GAAG;AAAA,IACP,KAAK;AAAK,aAAO;AAAA,IACjB,KAAK;AAAA,IACL,KAAK;AACD,aAAO;AAAA,IACX;AAAS,aAAO;AAAA,EACpB;AACJ;AAGA,SAAS,sBAAsB,GAAoB;AAC/C,SAAO,QAAQ,EAAE,WAAW,CAAC,CAAC,KAAK,+EAAiB,SAAS,CAAC;AAClE;AAEA,SAAS,cAAc,GAAmB;AACtC,QAAM,OAAO,EAAE,WAAW,CAAC;AAC3B,MAAI,QAAQ,MAAQ,QAAQ,IAAM,QAAO,OAAO,aAAa,OAAO,EAAE;AACtE,UAAQ,GAAG;AAAA,IACP,KAAK;AAAK,aAAO;AAAA,IACjB,KAAK;AAAK,aAAO;AAAA,IACjB,KAAK;AAAA,IACL,KAAK;AACD,aAAO;AAAA,IACX,KAAK;AAAA,IACL,KAAK;AACD,aAAO;AAAA,IACX;AAAS,aAAO;AAAA,EACpB;AACJ;;;ACziBA,IAAM,qBAAqB;AAQpB,SAASW,KAAI,MAA6B;AAC7C,QAAMC,UAAS,eAAe,MAAM,CAAC;AACrC,MAAIA,mBAAkB,QAAS,QAAOA;AACtC,MAAIC,QAAO;AACX,MAAI,KAAK,IAAI,CAAC,GAAG;AACb,UAAM,QAAQ,eAAe,MAAM,CAAC;AACpC,QAAI,iBAAiB,QAAS,QAAO;AACrC,IAAAA,QAAO;AAAA,EACX;AACA,MAAID,WAAU,KAAKC,SAAQ,EAAG,QAAO,QAAQ,QAAQ,OAAO;AAC5D,MAAIA,UAAS,EAAG,QAAO,QAAQ,QAAQ,SAAS;AAChD,SAAO,aAAaA,UAAS,KAAcC,OAAMF,OAAM,IAAaD,KAAIC,OAAM,IAAaD,KAAIE,KAAI,CAAC;AACxG;AAKO,SAAS,IAAI,MAA6B;AAC7C,SAAO,MAAM,MAAM,OAAK,QAAQ,CAAC,EAAE,KAAK,OAAO,KAAK;AACxD;AAGO,SAAS,IAAI,MAA6B;AAC7C,SAAO,MAAM,MAAM,OAAK,QAAQ,CAAC,EAAE,OAAO,OAAO,KAAK;AAC1D;AAGO,SAAS,IAAI,MAA6B;AAC7C,SAAO,MAAM,MAAM,SAAS,KAAK;AACrC;AAGO,SAAS,IAAI,MAA6B;AAC7C,SAAO,MAAM,MAAM,OAAK,IAAI,QAAQ,CAAC,GAAG,IAAI;AAChD;AAGO,SAAS,IAAI,MAA6B;AAC7C,SAAO,MAAM,MAAM,OAAK,IAAI,QAAQ,CAAC,EAAE,KAAK,OAAO,IAAI;AAC3D;AAGO,SAAS,IAAI,MAA6B;AAC7C,SAAO,MAAM,MAAM,OAAK,IAAI,QAAQ,CAAC,EAAE,OAAO,OAAO,KAAK;AAC9D;AAGA,SAAS,MAAM,MAAoB,IAA2B,YAA8B;AACxF,QAAMD,UAAS,eAAe,MAAM,CAAC;AACrC,MAAIA,mBAAkB,QAAS,QAAOA;AACtC,MAAI,KAAK,IAAIA,OAAM,KAAK,mBAAoB,QAAO,QAAQ,QAAQ,OAAO;AAC1E,MAAI,cAAcA,YAAW,EAAG,QAAO,QAAQ,QAAQ,SAAS;AAChE,SAAO,aAAa,GAAGA,OAAM,CAAC;AAClC;AAGA,SAAS,QAAQ,YAA4B;AACzC,QAAM,EAAE,MAAM,OAAO,IAAI,QAAQ,UAAU;AAC3C,SAAO,KAAK,UAAU,MAAM,EAAE;AAClC;AASA,IAAM,aAAa,KAAK,KAAK;AAG7B,IAAM,YAAY,MAAM,KAAK;AAS7B,SAAS,QAAQ,YAAkE;AAC/E,QAAM,IAAI,gBAAgB,aAAa,UAAU;AAKjD,QAAM,IAAI,IAAI;AACd,QAAM,QAAQ,kBAAkB,GAAG,YAAY,CAAC,CAAC;AACjD,QAAM,IAAI,aAAa,IAAI,aAAa,IAAI,OAAO,EAAE,IAAI,UAAU;AACnE,QAAM,KAAK,EAAE,MAAM,CAAC;AACpB,QAAM,OAAO,EAAE,MAAM,OAAO,IAAI,IAAI,CAAC;AACrC,QAAM,SAAS,OAAO,IAAI,KAAK;AAE/B,UAAQ,IAAI,GAAG;AAAA,IACX,KAAK;AAAG,aAAO,EAAE,MAAM,OAAO;AAAA,IAC9B,KAAK;AAAG,aAAO,EAAE,MAAM,QAAQ,QAAQ,KAAK,OAAO,EAAE;AAAA,IACrD,KAAK;AAAG,aAAO,EAAE,MAAM,KAAK,OAAO,GAAG,QAAQ,OAAO,OAAO,EAAE;AAAA,IAC9D;AAAS,aAAO,EAAE,MAAM,OAAO,OAAO,GAAG,QAAQ,KAAK;AAAA,EAC1D;AACJ;AAGA,IAAM,cAAc;AAMpB,SAAS,OAAO,IAAkB,KAA4B;AAC1D,MAAI,QAAQ,aAAa;AACzB,WAAS,IAAI,aAAa,KAAK,GAAG,KAAK;AACnC,UAAM,cAAc,MAAO,IAAI,KAAM,IAAI,IAAI,MAAM,IAAI,IAAI,MAAM,IAAI;AACrE,YAAQ,aAAa,IAAI,MAAM,MAAM,MAAM,EAAE,EAAE,gBAAgB,WAAW,CAAC;AAAA,EAC/E;AACA,SAAO;AACX;AAOA,IAAM,eAAN,MAAM,cAAa;AAAA,EACN;AAAA,EACA;AAAA,EAET,YAAY,MAAc,KAAa;AACnC,SAAK,OAAO;AACZ,SAAK,MAAM;AAAA,EACf;AAAA,EAEA,OAAgB,MAAM,IAAI,cAAa,GAAG,CAAC;AAAA;AAAA,EAG3C,IAAI,QAAgB;AAChB,WAAO,KAAK,OAAO,KAAK;AAAA,EAC5B;AAAA;AAAA,EAGA,OAAO,IAAI,GAAW,GAAyB;AAC3C,UAAM,IAAI,IAAI;AACd,UAAM,KAAK,IAAI;AACf,WAAO,IAAI,cAAa,GAAI,KAAK,IAAI,OAAQ,IAAI,GAAG;AAAA,EACxD;AAAA;AAAA,EAGA,OAAO,UAAU,GAAW,GAAyB;AACjD,UAAM,IAAI,IAAI;AACd,WAAO,IAAI,cAAa,GAAG,KAAK,IAAI,EAAE;AAAA,EAC1C;AAAA,EAEA,SAAuB;AACnB,WAAO,IAAI,cAAa,CAAC,KAAK,MAAM,CAAC,KAAK,GAAG;AAAA,EACjD;AAAA,EAEA,KAAK,GAA+B;AAChC,UAAM,IAAI,cAAa,IAAI,KAAK,MAAM,EAAE,IAAI;AAC5C,UAAM,IAAI,cAAa,IAAI,KAAK,KAAK,EAAE,GAAG;AAC1C,UAAM,IAAI,cAAa,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI;AACvD,WAAO,cAAa,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG;AAAA,EACvD;AAAA,EAEA,MAAM,GAA+B;AACjC,WAAO,KAAK,KAAK,EAAE,OAAO,CAAC;AAAA,EAC/B;AAAA,EAEA,MAAM,GAA+B;AACjC,UAAM,KAAK,KAAK,OAAO,EAAE;AACzB,QAAI,KAAK,kBAAkB,KAAK,MAAM,EAAE,MAAM,CAAC,EAAE;AACjD,UAAM,KAAK,OAAO,EAAE,MAAM,KAAK,MAAM,EAAE;AACvC,WAAO,cAAa,UAAU,IAAI,EAAE;AAAA,EACxC;AAAA,EAEA,YAAY,GAAyB;AACjC,UAAM,KAAK,KAAK,OAAO;AACvB,QAAI,KAAK,kBAAkB,KAAK,MAAM,GAAG,CAAC,EAAE;AAC5C,UAAM,KAAK,MAAM;AACjB,WAAO,cAAa,UAAU,IAAI,EAAE;AAAA,EACxC;AAAA,EAEA,gBAAgB,GAAyB;AACrC,UAAM,KAAK,KAAK,OAAO;AACvB,UAAM,KAAK,KAAK;AAChB,UAAM,KAAK,kBAAkB,IAAI,GAAG,CAAC,EAAE;AACvC,UAAM,KAAK,cAAa,IAAI,KAAK,MAAM,CAAC,EAAE;AAC1C,QAAI,IAAI,GAAG;AACX,SAAK;AACL,SAAK,KAAK;AACV,UAAM,MAAM,GAAG,OAAO,KAAK;AAC3B,WAAO,cAAa,UAAU,IAAI,EAAE;AAAA,EACxC;AAAA,EAEA,UAAU,GAA+B;AACrC,UAAM,KAAK,KAAK,OAAO,EAAE;AACzB,QAAI,IAAI,KAAK,MAAM,EAAE,YAAY,EAAE,CAAC;AACpC,UAAM,KAAK,EAAE,OAAO,EAAE;AACtB,QAAI,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;AAC7B,UAAM,KAAK,EAAE,OAAO,EAAE;AACtB,WAAO,cAAa,UAAU,IAAI,EAAE,EAAE,KAAK,IAAI,cAAa,IAAI,CAAC,CAAC;AAAA,EACtE;AACJ;AAKO,SAAS,KAAK,MAA6B;AAC9C,SAAO,WAAW,MAAM,OAAK,IAAaG,MAAK,CAAC,GAAG,IAAI;AAC3D;AAGO,SAAS,KAAK,MAA6B;AAC9C,SAAO,WAAW,MAAM,OAAK,IAAaC,MAAK,CAAC,GAAG,IAAI;AAC3D;AAGO,SAAS,KAAK,MAA6B;AAC9C,SAAO,WAAW,MAAM,OAAK,IAAaC,MAAK,CAAC,GAAG,KAAK;AAC5D;AAGA,SAAS,WAAW,MAAoB,IAA2B,YAA8B;AAC7F,QAAML,UAAS,eAAe,MAAM,CAAC;AACrC,MAAIA,mBAAkB,QAAS,QAAOA;AACtC,MAAI,cAAcA,YAAW,EAAG,QAAO,QAAQ,QAAQ,SAAS;AAChE,SAAO,aAAa,GAAGA,OAAM,CAAC;AAClC;AAIA,IAAM,YAAY,MAAe;AAG1B,SAASM,MAAK,MAA6B;AAC9C,SAAO,QAAQ,MAAM,OAAK,KAAK,IAAI,CAAC,KAAK,GAAYA,KAAI;AAC7D;AAGO,SAASC,MAAK,MAA6B;AAC9C,SAAO,QAAQ,MAAM,OAAK,KAAK,IAAI,CAAC,KAAK,GAAYA,KAAI;AAC7D;AAGO,SAASC,MAAK,MAA6B;AAC9C,SAAO,QAAQ,MAAM,WAAoBA,KAAI;AACjD;AAGO,SAAS,KAAK,MAA6B;AAC9C,SAAO,QAAQ,MAAM,WAAW,OAAK,KAAK,KAAK,IAAaA,MAAK,CAAC,CAAC;AACvE;AAGO,SAASC,OAAM,MAA6B;AAC/C,QAAM,IAAI,eAAe,MAAM,CAAC;AAChC,MAAI,aAAa,QAAS,QAAO;AACjC,QAAM,IAAI,eAAe,MAAM,CAAC;AAChC,MAAI,aAAa,QAAS,QAAO;AACjC,MAAI,MAAM,KAAK,MAAM,EAAG,QAAO,QAAQ,QAAQ,SAAS;AACxD,SAAO,aAAsBA,OAAM,GAAG,CAAC,CAAC;AAC5C;AAKO,SAASL,MAAK,MAA6B;AAC9C,SAAO,QAAQ,MAAM,WAAoBA,KAAI;AACjD;AAGO,SAASC,MAAK,MAA6B;AAC9C,SAAO,QAAQ,MAAM,WAAoBA,KAAI;AACjD;AAGO,SAASF,MAAK,MAA6B;AAC9C,SAAO,QAAQ,MAAM,WAAoBA,KAAI;AACjD;AAGO,SAASO,OAAM,MAA6B;AAC/C,SAAO,QAAQ,MAAM,WAAoBA,MAAK;AAClD;AAGO,SAASC,OAAM,MAA6B;AAC/C,SAAO,QAAQ,MAAM,OAAK,KAAK,GAAYA,MAAK;AACpD;AAGO,SAASC,OAAM,MAA6B;AAC/C,SAAO,QAAQ,MAAM,OAAK,KAAK,IAAI,CAAC,IAAI,GAAYA,MAAK;AAC7D;AAMO,SAAS,MAAM,MAA6B;AAC/C,SAAO,QAAQ,MAAM,OAAK,KAAK,IAAI,CAAC,IAAI,GAAG,OAAK,MAAeb,MAAK,IAAI,MAAM,IAAI,EAAE,CAAC;AACzF;AAKO,SAAS,QAAQ,MAA6B;AACjD,SAAO,QAAQ,MAAM,WAAW,OAAK,IAAI,MAAM,KAAK,EAAE;AAC1D;AAGO,SAAS,QAAQ,MAA6B;AACjD,SAAO,QAAQ,MAAM,WAAW,OAAK,IAAI,KAAK,KAAK,GAAG;AAC1D;AAGA,SAAS,QAAQ,MAAoB,UAAkC,IAAoC;AACvG,QAAMC,UAAS,eAAe,MAAM,CAAC;AACrC,MAAIA,mBAAkB,QAAS,QAAOA;AACtC,SAAO,SAASA,OAAM,IAAI,aAAa,GAAGA,OAAM,CAAC,IAAI,QAAQ,QAAQ,OAAO;AAChF;;;AC9TA,IAAM,OAAO;AAKb,IAAM,SAAS,MAAsB;AAErC,IAAM,cAAc,CAAC,UAAkC,UAAU,IAAI,UAAU;AAE/E,IAAM,eAAe,CAAC,UAAkC,UAAU,IAAI,UAAU;AAGhF,IAAM,cAAc,CAAC,UAAkC,UAAU,IAAI,UAAU;AAG/E,IAAM,qBAAqB,CAAC,UAAkC,UAAU,IAAI,UAAU;AAEtF,IAAM,YAAY,CAAC,UAAkC,QAAQ,MAAM,IAAI,eAAe;AAGtF,IAAM,gBAAgB,CAAC,OAAea,WACjC,SAAS,KAAK,QAAQ,MAAM,KAAOA,SAAQ,MAAM,KAAK,UAAUA,SAAQ,IAAK,eAAe;AAEjG,IAAM,gBAAgB,CAAC,UAAkC,UAAU,IAAI,aAAa;AAEpF,IAAM,iBAAiB,CAAC,UAAkC,UAAU,IAAI,aAAa;AAErF,IAAM,mBAAmB,CAAC,UAAkC,SAAS,IAAI,aAAa;AAGtF,IAAM,mBAAmB,CAAC,UAAkC,UAAU,IAAI,aAAa;AAGvF,IAAM,4BAA4B,CAAC,UAAkC,UAAU,KAAK,QAAQ,MAAM,IAAI,aAAa;AAEnH,IAAM,wBAAwB,CAAC,UAAkC,QAAQ,MAAM,IAAI,aAAa;AAGhG,IAAM,gBAAgB,CAAC,UAAkC,UAAU,KAAK,UAAU,IAAI,aAAa;AAGnG,IAAM,iBAAiB,CAAC,UAAkC,UAAU,IAAI,aAAa,UAAU,IAAI,eAAe;AAGlH,IAAM,mBAAmB,CAAC,UAAkC,UAAU,KAAK,UAAU,IAAI,aAAa,UAAU,IAAI,eAAe;AAEnI,IAAM,qBAAqB,CAAC,UAAkC,SAAS,IAAI,aAAa;AAExF,IAAM,sBAAsB,CAAC,UAAkC,SAAS,IAAI,aAAa;AAEzF,IAAM,uBAAuB,MAAsB;AAGnD,SAAS,QAAQ,MAA6B;AAC1C,SAAY,QAAQ,MAAM,cAAc;AAC5C;AAGA,SAAS,UAAU,MAA6B;AAC5C,SAAY,QAAQ,MAAM,YAAY;AAC1C;AAMA,SAAS,UAAgC;AACrC,SAAO;AAAA,IACH,IAAI,mBAAmB,OAAO,GAAG,MAAM,2BAA2B,uBAA4B,KAAK,EAAE,QAAQ,OAAO,CAAC;AAAA,IACrH,IAAI,mBAAmB,WAAW,GAAG,MAAM,2BAA2B,2DAAgE,SAAS,EAAE,QAAQ,OAAO,CAAC;AAAA,IACjK,IAAI,mBAAmB,OAAO,GAAG,MAAM,2BAA2B,mDAAwD,KAAK,EAAE,QAAQ,OAAO,CAAC;AAAA,IACjJ,IAAI,mBAAmB,OAAO,GAAG,MAAM,2BAA2B,kDAAuD,KAAK,EAAE,QAAQ,OAAO,CAAC;AAAA,IAChJ,IAAI,mBAAmB,SAAS,GAAG,MAAM,yBAAyB,yDAA8D,OAAO,EAAE,QAAQ,OAAO,CAAC;AAAA,IACzJ,IAAI,mBAAmB,UAAU,GAAG,MAAM,yBAAyB,wDAA6D,QAAQ,EAAE,QAAQ,OAAO,CAAC;AAAA,IAC1J,IAAI,mBAAmB,SAAS,GAAG,GAAG,gCAAgC,4DAAqE,OAAO,EAAE,QAAQ,iBAAiB,CAAC;AAAA,IAC9K,IAAI,mBAAmB,UAAU,GAAG,MAAM,8CAA8C,gEAAyE,QAAQ,EAAE,QAAQ,2BAA2B,SAAS,MAAM,YAAY,EAAE,CAAC;AAAA,IAC5O,IAAI,mBAAmB,WAAW,GAAG,GAAG,mBAAmB,uCAAgD,SAAS,EAAE,QAAQ,cAAc,CAAC;AAAA,IAC7I,IAAI,mBAAmB,YAAY,GAAG,KAAK,mCAAmC,2CAAoD,UAAU,EAAE,QAAQ,uBAAuB,SAAS,KAAK,CAAC;AAAA,IAC5L,IAAI,mBAAmB,aAAa,GAAG,GAAG,oCAAoC,gEAAyE,WAAW,EAAE,QAAQ,iBAAiB,CAAC;AAAA,IAC9L,IAAI,mBAAmB,cAAc,GAAG,MAAM,kDAAkD,oEAA6E,YAAY,EAAE,QAAQ,2BAA2B,SAAS,MAAM,YAAY,EAAE,CAAC;AAAA,IAC5P,IAAI,mBAAmB,UAAU,GAAG,MAAM,8CAA8C,+EAAwF,QAAQ,EAAE,QAAQ,2BAA2B,SAAS,MAAM,YAAY,EAAE,CAAC;AAAA,IAC3P,IAAI,mBAAmB,UAAU,GAAG,MAAM,8CAA8C,4EAAqF,QAAQ,EAAE,QAAQ,2BAA2B,SAAS,MAAM,YAAY,EAAE,CAAC;AAAA,IACxP,IAAI,mBAAmB,cAAc,GAAG,GAAG,SAAS,kEAA2E,YAAY,EAAE,QAAQ,cAAc,CAAC;AAAA,IACpK,IAAI,mBAAmB,MAAM,GAAG,GAAG,iDAAiD,wEAA6E,YAAY,EAAE,QAAQ,oBAAoB,kBAAkB,KAAK,CAAC;AAAA,IACnO,IAAI,mBAAmB,SAAS,GAAG,GAAG,sBAAsB,yEAA8EC,MAAK;AAAA,IAC/I,IAAI,mBAAmB,WAAW,GAAG,GAAG,yBAAyB,gHAAqH,SAAS,EAAE,QAAQ,mBAAmB,CAAC;AAAA,IAC7N,IAAI,mBAAmB,WAAW,GAAG,GAAG,SAAS,iFAAsF,OAAO;AAAA,IAC9I,IAAI,mBAAmB,OAAO,GAAG,MAAM,6BAA6B,kDAAwD,KAAK,EAAE,QAAQ,OAAO,CAAC;AAAA,IACnJ,IAAI,mBAAmB,MAAM,GAAG,MAAM,6BAA6B,yCAA+C,IAAI,EAAE,QAAQ,OAAO,CAAC;AAAA,IACxI,IAAI,mBAAmB,OAAO,GAAG,GAAG,WAAW,uCAA6C,GAAG;AAAA,IAC/F,IAAI,mBAAmB,QAAQ,GAAG,GAAG,sBAAsB,8DAAoE,MAAM,EAAE,QAAQ,mBAAmB,CAAC;AAAA,IACnK,IAAI,mBAAmB,WAAW,GAAG,GAAG,SAAS,kDAAwD,OAAO;AAAA,IAChH,IAAI,mBAAmB,YAAY,GAAG,GAAG,SAAS,sCAA4C,QAAQ;AAAA,IACtG,IAAI,mBAAmB,WAAW,GAAG,GAAG,sBAAsB,uCAAuC,OAAO;AAAA,IAC5G,IAAI,mBAAmB,aAAa,GAAG,GAAG,sBAAsB,sCAAsC,SAAS;AAAA,IAC/G,IAAI,mBAAmB,OAAO,GAAG,GAAG,UAAU,2CAAgDC,IAAG;AAAA,IACjG,IAAI,mBAAmB,OAAO,GAAG,GAAG,UAAU,gDAAqD,GAAG;AAAA,IACtG,IAAI,mBAAmB,gBAAgB,GAAG,GAAG,kCAAkC,qDAA0D,WAAW;AAAA,IACpJ,IAAI,mBAAmB,cAAc,GAAG,GAAG,kCAAkC,uDAA4D,SAAS;AAAA,IAClJ,IAAI,mBAAmB,UAAU,GAAG,GAAG,oBAAoB,iFAAsF,QAAQ,EAAE,QAAQ,qBAAqB,CAAC;AAAA,IACzL,IAAI;AAAA,MAAmB;AAAA,MAAY;AAAA,MAAG;AAAA,MAAG;AAAA,MACrC;AAAA,MACM;AAAA,MAAU;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,UACJ,GAAG;AAAA,YACC,EAAE,OAAO,KAAK,MAAM,uBAAuB;AAAA,YAC3C,EAAE,OAAO,KAAK,MAAM,oBAAoB;AAAA,YACxC,EAAE,OAAO,KAAK,MAAM,iBAAiB;AAAA,YACrC,EAAE,OAAO,KAAK,MAAM,iBAAiB;AAAA,YACrC,EAAE,OAAO,KAAK,MAAM,sBAAsB;AAAA,UAC9C;AAAA,QACJ;AAAA,MACJ;AAAA,IAAC;AAAA,IACD,IAAI,mBAAmB,WAAW,GAAG,GAAG,8BAA8B,4EAAkF,OAAO;AAAA,IAC/J,IAAI,mBAAmB,OAAO,GAAG,GAAG,mBAAmB,sEAA2E,GAAG;AAAA,IACrI,IAAI,mBAAmB,QAAQ,GAAG,GAAG,oBAAoB,mDAAyD,YAAY;AAAA,IAC9H,IAAI,mBAAmB,SAAS,GAAG,GAAG,IAAI,6DAAoE,KAAK;AAAA,IACnH,IAAI,mBAAmB,QAAQ,GAAG,GAAG,iBAAiB,uCAA6C,YAAY;AAAA,IAC/G,IAAI,mBAAmB,SAAS,GAAG,GAAG,iBAAiB,wCAA8C,aAAa;AAAA,IAClH,IAAI,mBAAmB,OAAO,GAAG,GAAG,iBAAiB,mDAAyD,WAAW;AAAA,IACzH,IAAI,mBAAmB,WAAW,GAAG,GAAG,sBAAsB,wGAA8G,SAAS,EAAE,QAAQ,qBAAqB,CAAC;AAAA,IACrN,IAAI,mBAAmB,SAAS,GAAG,GAAG,sBAAsB,gHAAsH,OAAO,EAAE,QAAQ,qBAAqB,CAAC;AAAA,IACzN,IAAI,mBAAmB,QAAQ,GAAG,GAAG,qBAAqB,sDAA2D,IAAI;AAAA,IACzH,IAAI,mBAAmB,SAAS,GAAG,GAAG,qBAAqB,uDAA4D,KAAK;AAAA,IAC5H,IAAI,mBAAmB,OAAO,GAAG,GAAG,8BAA8B,qGAA0G,GAAG;AAAA,IAC/K,IAAI,mBAAmB,OAAO,GAAG,GAAG,QAAQ,sDAA2D,GAAG;AAAA,IAC1G,IAAI,mBAAmB,QAAQ,GAAG,GAAG,QAAQ,kEAAuE,IAAI;AAAA,IACxH,IAAI,mBAAmB,QAAQ,GAAG,GAAG,sBAAsB,6CAAkD,YAAY;AAAA,IACzH,IAAI,mBAAmB,UAAU,GAAG,KAAK,uBAAuB,uDAA4D,QAAQ,EAAE,QAAQ,OAAO,CAAC;AAAA,IACtJ,IAAI;AAAA,MAAmB;AAAA,MAAW;AAAA,MAAG;AAAA,MAAG;AAAA,MACpC;AAAA,MACO;AAAA,MAAS;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,UACJ,GAAG;AAAA,YACC,EAAE,OAAO,QAAQ,MAAM,2BAA2B;AAAA,YAClD,EAAE,OAAO,SAAS,MAAM,sBAAsB;AAAA,UAClD;AAAA,QACJ;AAAA,MACJ;AAAA,IAAC;AAAA,IACD,IAAI;AAAA,MAAmB;AAAA,MAAW;AAAA,MAAG;AAAA,MAAG;AAAA,MACpC;AAAA,MACO;AAAA,MAAS;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,UACJ,GAAG;AAAA,YACC,EAAE,OAAO,QAAQ,MAAM,2BAA2B;AAAA,YAClD,EAAE,OAAO,SAAS,MAAM,sBAAsB;AAAA,UAClD;AAAA,QACJ;AAAA,MACJ;AAAA,IAAC;AAAA,IACD,IAAI;AAAA,MAAmB;AAAA,MAAS;AAAA,MAAG;AAAA,MAAG;AAAA,MAClC;AAAA,MACO;AAAA,MAAe;AAAA,QACtB,QAAQ;AAAA,QACR,QAAQ;AAAA,UACJ,GAAG;AAAA,YACC,EAAE,OAAO,KAAK,MAAM,gBAAgB;AAAA,YACpC,EAAE,OAAO,KAAK,MAAM,kBAAkB;AAAA,YACtC,EAAE,OAAO,MAAM,MAAM,oBAAoB;AAAA,UAC7C;AAAA,QACJ;AAAA,MACJ;AAAA,IAAC;AAAA,IACD,IAAI,mBAAmB,SAAS,GAAG,GAAG,gCAAgC,uFAA8F,eAAe,EAAE,QAAQ,eAAe,kBAAkB,KAAK,CAAC;AAAA,IACpO,IAAI,mBAAmB,WAAW,GAAG,MAAM,2BAA2B,6BAAkC,SAAS,EAAE,QAAQ,OAAO,CAAC;AAAA,IACnI,IAAI,mBAAmB,UAAU,GAAG,MAAM,2BAA2B,4CAAiD,QAAQ,EAAE,QAAQ,OAAO,CAAC;AAAA,IAChJ,IAAI,mBAAmB,SAAS,GAAG,GAAG,YAAY,iDAAsD,OAAO,EAAE,QAAQ,YAAY,CAAC;AAAA,IACtI,IAAI,mBAAmB,SAAS,GAAG,GAAG,YAAY,kDAAuD,OAAO,EAAE,QAAQ,YAAY,CAAC;AAAA,IACvI,IAAI,mBAAmB,UAAU,GAAG,GAAG,SAAS,kCAAwC,MAAM;AAAA,IAC9F,IAAI,mBAAmB,QAAQ,GAAG,GAAG,SAAS,kDAAwD,IAAI;AAAA,IAC1G,IAAI,mBAAmB,OAAO,GAAG,KAAK,sCAAsC,oHAA0H,KAAK,EAAE,QAAQ,WAAW,SAAS,MAAM,kBAAkB,KAAK,CAAC;AAAA,IACvQ,IAAI,mBAAmB,UAAU,GAAG,KAAK,oEAAoE,uHAA6H,gBAAgB,EAAE,QAAQ,eAAe,kBAAkB,KAAK,CAAC;AAAA,IAC3S,IAAI,mBAAmB,MAAM,GAAG,GAAG,IAAI,iCAAuC,EAAE;AAAA,IAChF,IAAI,mBAAmB,cAAc,GAAG,GAAG,aAAa,oDAA0D,SAAS;AAAA,IAC3H,IAAI,mBAAmB,UAAU,GAAG,GAAG,2DAA2D,2EAAkF,QAAQ,EAAE,QAAQ,eAAe,CAAC;AAAA,IACtN,IAAI,mBAAmB,UAAU,GAAG,MAAM,oCAAoC,0CAAiD,QAAQ,EAAE,QAAQ,oBAAoB,kBAAkB,KAAK,CAAC;AAAA,IAC7L,IAAI,mBAAmB,OAAO,GAAG,GAAG,eAAe,0CAAiD,aAAa,EAAE,QAAQ,cAAc,CAAC;AAAA,IAC1I,IAAI,mBAAmB,UAAU,GAAG,GAAG,eAAe,6CAAoD,gBAAgB,EAAE,QAAQ,cAAc,CAAC;AAAA,IACnJ,IAAI,mBAAmB,SAAS,GAAG,GAAG,wBAAwB,uDAA4D,KAAK;AAAA,IAC/H,IAAI,mBAAmB,SAAS,GAAG,GAAG,iBAAiB,qDAA0DC,MAAK;AAAA,IACtH,IAAI,mBAAmB,QAAQ,GAAG,GAAG,UAAU,mCAAwC,IAAI;AAAA,IAC3F,IAAI,mBAAmB,WAAW,GAAG,GAAG,gCAAgC,kDAAwD,OAAO;AAAA,IACvI,IAAI,mBAAmB,QAAQ,GAAG,GAAG,wBAAwB,iDAAuD,YAAY;AAAA,IAChI,IAAI,mBAAmB,eAAe,GAAG,GAAG,oCAAoC,2DAAiE,aAAa,EAAE,QAAQ,qBAAqB,CAAC;AAAA,IAC9L,IAAI,mBAAmB,WAAW,GAAG,GAAG,gCAAgC,yFAA+F,SAAS,EAAE,QAAQ,qBAAqB,CAAC;AAAA,IAChN,IAAI,mBAAmB,YAAY,GAAG,KAAK,gDAAgD,4FAAiG,UAAU,EAAE,QAAQ,YAAY,CAAC;AAAA,IAC7N,IAAI,mBAAmB,eAAe,GAAG,MAAM,uBAAuB,gDAAqD,WAAW;AAAA,IACtI,IAAI,mBAAmB,cAAc,GAAG,GAAG,4CAA4C,uDAA4D,UAAU;AAAA,IAC7J,IAAI,mBAAmB,WAAW,GAAG,GAAG,4CAA4C,oCAAyC,OAAO;AAAA,IACpI,IAAI,mBAAmB,SAAS,GAAG,GAAG,QAAQ,+BAAoC,KAAK;AAAA,IACvF,IAAI,mBAAmB,UAAU,GAAG,GAAG,QAAQ,8CAAmD,MAAM;AAAA,IACxG,IAAI,mBAAmB,UAAU,GAAG,GAAG,uCAAuC,+EAAoF,UAAU;AAAA,IAC5K,IAAI,mBAAmB,SAAS,GAAG,GAAG,QAAQ,+BAAoC,KAAK;AAAA,IACvF,IAAI,mBAAmB,QAAQ,GAAG,GAAG,uCAAuC,wDAA6D,IAAI;AAAA,IAC7I,IAAI,mBAAmB,OAAO,GAAG,GAAG,gCAAgC,gDAA0D,GAAG;AAAA,IACjI,IAAI,mBAAmB,MAAM,GAAG,GAAG,iCAAiC,+CAAyD,EAAE;AAAA,IAC/H,IAAI,mBAAmB,MAAM,GAAG,GAAG,iCAAiC,8CAAwD,EAAE;AAAA,IAC9H,IAAI,mBAAmB,WAAW,GAAG,GAAG,wBAAwB,sDAA2D,QAAQ,EAAE,QAAQ,cAAc,eAAe,EAAE,OAAO,GAAG,MAAM,EAAE,EAAE,CAAC;AAAA,IACjM,IAAI,mBAAmB,WAAW,GAAG,MAAM,2BAA2B,mDAAwD,QAAQ,EAAE,QAAQ,OAAO,CAAC;AAAA,IACxJ,IAAI,mBAAmB,WAAW,GAAG,MAAM,2BAA2B,iEAAsE,QAAQ,EAAE,QAAQ,OAAO,CAAC;AAAA,IACtK,IAAI,mBAAmB,SAAS,GAAG,MAAM,2BAA2B,yCAA8C,MAAM,EAAE,QAAQ,OAAO,CAAC;AAAA,IAC1I,IAAI,mBAAmB,SAAS,GAAG,MAAM,2BAA2B,uDAA4D,MAAM,EAAE,QAAQ,OAAO,CAAC;AAAA,IACxJ,IAAI,mBAAmB,OAAO,GAAG,MAAM,6BAA6B,4DAAkE,KAAK,EAAE,QAAQ,OAAO,CAAC;AAAA,IAC7J,IAAI;AAAA,MAAmB;AAAA,MAAY;AAAA,MAAG;AAAA,MAAM;AAAA,MACxC;AAAA,MACS;AAAA,MAAU;AAAA,QACnB,QAAQ;AAAA,QACR,eAAe,EAAE,OAAO,GAAG,MAAM,OAAO,EAAE;AAAA,QAC1C,QAAQ;AAAA,UACJ,GAAG;AAAA,YACC,EAAE,OAAO,KAAK,MAAM,cAAc;AAAA,YAClC,EAAE,OAAO,KAAK,MAAM,YAAY;AAAA,YAChC,EAAE,OAAO,KAAK,MAAM,aAAa;AAAA,YACjC,EAAE,OAAO,KAAK,MAAM,UAAU;AAAA,YAC9B,EAAE,OAAO,KAAK,MAAM,UAAU;AAAA,YAC9B,EAAE,OAAO,KAAK,MAAM,cAAc;AAAA,YAClC,EAAE,OAAO,KAAK,MAAM,cAAc;AAAA,YAClC,EAAE,OAAO,KAAK,MAAM,cAAc;AAAA,YAClC,EAAE,OAAO,KAAK,MAAM,UAAU;AAAA,YAC9B,EAAE,OAAO,MAAM,MAAM,aAAa;AAAA,YAClC,EAAE,OAAO,MAAM,MAAM,aAAa;AAAA,YAClC,EAAE,OAAO,OAAO,MAAM,gBAAgB;AAAA,YACtC,EAAE,OAAO,OAAO,MAAM,cAAc;AAAA,YACpC,EAAE,OAAO,OAAO,MAAM,eAAe;AAAA,YACrC,EAAE,OAAO,OAAO,MAAM,YAAY;AAAA,YAClC,EAAE,OAAO,OAAO,MAAM,YAAY;AAAA,YAClC,EAAE,OAAO,OAAO,MAAM,gBAAgB;AAAA,YACtC,EAAE,OAAO,OAAO,MAAM,gBAAgB;AAAA,YACtC,EAAE,OAAO,OAAO,MAAM,gBAAgB;AAAA,YACtC,EAAE,OAAO,OAAO,MAAM,YAAY;AAAA,YAClC,EAAE,OAAO,OAAO,MAAM,cAAc;AAAA,YACpC,EAAE,OAAO,OAAO,MAAM,cAAc;AAAA,UACxC;AAAA,QACJ;AAAA,MACJ;AAAA,IAAC;AAAA,IACD,IAAI;AAAA,MAAmB;AAAA,MAAa;AAAA,MAAG;AAAA,MAAM;AAAA,MACzC;AAAA,MACS;AAAA,MAAW;AAAA,QACpB,QAAQ;AAAA,QACR,eAAe,EAAE,OAAO,GAAG,MAAM,OAAO,EAAE;AAAA,QAC1C,QAAQ;AAAA,UACJ,GAAG;AAAA,YACC,EAAE,OAAO,KAAK,MAAM,cAAc;AAAA,YAClC,EAAE,OAAO,KAAK,MAAM,YAAY;AAAA,YAChC,EAAE,OAAO,KAAK,MAAM,aAAa;AAAA,YACjC,EAAE,OAAO,KAAK,MAAM,UAAU;AAAA,YAC9B,EAAE,OAAO,KAAK,MAAM,UAAU;AAAA,YAC9B,EAAE,OAAO,KAAK,MAAM,cAAc;AAAA,YAClC,EAAE,OAAO,KAAK,MAAM,cAAc;AAAA,YAClC,EAAE,OAAO,KAAK,MAAM,cAAc;AAAA,YAClC,EAAE,OAAO,KAAK,MAAM,UAAU;AAAA,YAC9B,EAAE,OAAO,MAAM,MAAM,aAAa;AAAA,YAClC,EAAE,OAAO,MAAM,MAAM,aAAa;AAAA,YAClC,EAAE,OAAO,MAAM,MAAM,cAAc;AAAA,YACnC,EAAE,OAAO,MAAM,MAAM,aAAa;AAAA,YAClC,EAAE,OAAO,MAAM,MAAM,aAAa;AAAA,UACtC;AAAA,UACA,GAAG;AAAA,YACC,EAAE,OAAO,KAAK,MAAM,qDAAqD;AAAA,YACzE,EAAE,OAAO,KAAK,MAAM,kEAAkE;AAAA,YACtF,EAAE,OAAO,KAAK,MAAM,mEAAmE;AAAA,YACvF,EAAE,OAAO,KAAK,MAAM,gFAAgF;AAAA,YACpG,EAAE,OAAO,KAAK,MAAM,qBAAqB;AAAA,YACzC,EAAE,OAAO,KAAK,MAAM,yBAAyB;AAAA,YAC7C,EAAE,OAAO,KAAK,MAAM,0BAA0B;AAAA,YAC9C,EAAE,OAAO,KAAK,MAAM,0CAA0C;AAAA,UAClE;AAAA,QACJ;AAAA,MACJ;AAAA,IAAC;AAAA,IACD,IAAI,mBAAmB,QAAQ,GAAG,GAAG,SAAS,8CAAqD,cAAc,EAAE,QAAQ,cAAc,CAAC;AAAA,IAC1I,IAAI,mBAAmB,WAAW,GAAG,GAAG,SAAS,iDAAwD,iBAAiB,EAAE,QAAQ,cAAc,CAAC;AAAA,IACnJ,IAAI,mBAAmB,QAAQ,GAAG,GAAG,UAAU,6CAAkD,YAAY;AAAA,IAC7G,IAAI,mBAAmB,OAAO,GAAG,GAAG,UAAU,oDAAyDC,IAAG;AAAA,IAC1G,IAAI,mBAAmB,MAAM,GAAG,GAAG,UAAU,8CAAmDC,GAAE;AAAA,IAClG,IAAI,mBAAmB,SAAS,GAAG,GAAG,UAAU,8CAAmDC,MAAK;AAAA,IACxG,IAAI,mBAAmB,MAAM,GAAG,GAAG,IAAI,4BAAiCC,GAAE;AAAA,IAC1E,IAAI,mBAAmB,QAAQ,GAAG,GAAG,wBAAwB,mDAAyD,IAAI;AAAA,IAC1H,IAAI,mBAAmB,QAAQ,GAAG,GAAG,iBAAiB,wCAA8C,YAAY;AAAA,IAChH,IAAI,mBAAmB,UAAU,GAAG,GAAG,iBAAiB,yCAA+C,cAAc;AAAA,IACrH,IAAI,mBAAmB,UAAU,GAAG,GAAG,iBAAiB,yCAA+C,cAAc;AAAA,IACrH,IAAI,mBAAmB,QAAQ,GAAG,GAAG,sBAAsB,yCAA8C,IAAI;AAAA,IAC7G,IAAI,mBAAmB,SAAS,GAAG,GAAG,gBAAgB,mEAAwEC,MAAK;AAAA,IACnI,IAAI,mBAAmB,eAAe,GAAG,GAAG,gDAAgD,wDAA6DC,YAAW;AAAA,IACpK,IAAI,mBAAmB,QAAQ,GAAG,GAAG,uBAAuB,gGAA0G,MAAM,EAAE,QAAQ,qBAAqB,CAAC;AAAA,IAC5M,IAAI,mBAAmB,SAAS,GAAG,GAAG,QAAQ,yEAA+E,OAAO;AAAA,IACpI,IAAI,mBAAmB,OAAO,GAAG,GAAG,IAAI,2DAAiE,GAAG;AAAA,IAC5G,IAAI,mBAAmB,QAAQ,GAAG,GAAG,IAAI,sEAA2E,IAAI;AAAA,IACxH,IAAI,mBAAmB,eAAe,GAAG,GAAG,eAAe,6FAAkG,aAAa,EAAE,QAAQ,qBAAqB,CAAC;AAAA,IAC1M,IAAI,mBAAmB,UAAU,GAAG,GAAG,4CAA4C,sDAA6D,QAAQ,EAAE,QAAQ,eAAe,kBAAkB,KAAK,CAAC;AAAA,IACzM,IAAI,mBAAmB,YAAY,GAAG,GAAG,kBAAkB,kDAAyD,UAAU,EAAE,kBAAkB,KAAK,CAAC;AAAA,IACxJ,IAAI,mBAAmB,UAAU,GAAG,GAAG,8BAA8B,yDAAgE,QAAQ,EAAE,QAAQ,iBAAiB,CAAC;AAAA,IACzK,IAAI,mBAAmB,UAAU,GAAG,GAAG,mCAAmC,uDAA8D,MAAM;AAAA,IAC9I,IAAI,mBAAmB,QAAQ,GAAG,GAAG,+CAA+C,2CAAkD,IAAI;AAAA,IAC1I,IAAI,mBAAmB,UAAU,GAAG,MAAM,wCAAwC,iGAAwG,MAAM;AAAA,IAChM,IAAI,mBAAmB,YAAY,GAAG,GAAG,oCAAoC,uDAA8D,QAAQ;AAAA,IACnJ,IAAI,mBAAmB,aAAa,GAAG,GAAG,SAAS,sCAA6C,SAAS;AAAA,IACzG,IAAI,mBAAmB,OAAO,GAAG,KAAK,oFAAoF,wEAA8E,aAAa,EAAE,kBAAkB,KAAK,CAAC;AAAA,IAC/O,IAAI,mBAAmB,cAAc,GAAG,MAAM,yBAAyB,sEAA6E,UAAU;AAAA,IAC9J,IAAI,mBAAmB,OAAO,GAAG,GAAG,kBAAkB,8DAA2EC,IAAG;AAAA,IACpI,IAAI,mBAAmB,OAAO,GAAG,GAAG,UAAU,iCAA8C,GAAG;AAAA,IAC/F,IAAI,mBAAmB,OAAO,GAAG,GAAG,UAAU,mCAAgD,GAAG;AAAA,IACjG,IAAI,mBAAmB,OAAO,GAAG,GAAG,UAAU,oCAAiD,GAAG;AAAA,IAClG,IAAI,mBAAmB,OAAO,GAAG,GAAG,UAAU,sCAAmD,GAAG;AAAA,IACpG,IAAI,mBAAmB,OAAO,GAAG,GAAG,UAAU,qCAAkD,GAAG;AAAA,IACnG,IAAI,mBAAmB,OAAO,GAAG,GAAG,UAAU,mCAAgD,GAAG;AAAA,IACjG,IAAI,mBAAmB,QAAQ,GAAG,GAAG,UAAU,oCAAiDC,KAAI;AAAA,IACpG,IAAI,mBAAmB,QAAQ,GAAG,GAAG,UAAU,sCAAmDC,KAAI;AAAA,IACtG,IAAI,mBAAmB,QAAQ,GAAG,GAAG,UAAU,uCAAoDC,KAAI;AAAA,IACvG,IAAI,mBAAmB,SAAS,GAAG,GAAG,gBAAgB,qDAAkEC,MAAK;AAAA,IAC7H,IAAI,mBAAmB,QAAQ,GAAG,GAAG,UAAU,yCAAsD,IAAI;AAAA,IACzG,IAAI,mBAAmB,QAAQ,GAAG,GAAG,UAAU,4CAAyDC,KAAI;AAAA,IAC5G,IAAI,mBAAmB,QAAQ,GAAG,GAAG,UAAU,8CAA2DC,KAAI;AAAA,IAC9G,IAAI,mBAAmB,QAAQ,GAAG,GAAG,UAAU,+CAA4DC,KAAI;AAAA,IAC/G,IAAI,mBAAmB,QAAQ,GAAG,GAAG,UAAU,iDAA8D,IAAI;AAAA,IACjH,IAAI,mBAAmB,QAAQ,GAAG,GAAG,UAAU,gDAA6D,IAAI;AAAA,IAChH,IAAI,mBAAmB,QAAQ,GAAG,GAAG,UAAU,8CAA2D,IAAI;AAAA,IAC9G,IAAI,mBAAmB,SAAS,GAAG,GAAG,UAAU,oDAAiEC,MAAK;AAAA,IACtH,IAAI,mBAAmB,SAAS,GAAG,GAAG,UAAU,sDAAmEC,MAAK;AAAA,IACxH,IAAI,mBAAmB,SAAS,GAAG,GAAG,UAAU,uDAAoEC,MAAK;AAAA,IACzH,IAAI,mBAAmB,SAAS,GAAG,GAAG,UAAU,oDAAiE,KAAK;AAAA,IACtH,IAAI,mBAAmB,WAAW,GAAG,GAAG,SAAS,gCAA6C,OAAO;AAAA,IACrG,IAAI,mBAAmB,WAAW,GAAG,GAAG,SAAS,gCAA6C,OAAO;AAAA,IACrG,IAAI;AAAA,MAAmB;AAAA,MAAW;AAAA,MAAG;AAAA,MAAG;AAAA,MACpC;AAAA,MACO;AAAA,MAAS;AAAA,QAChB,QAAQ;AAAA,QACR,kBAAkB;AAAA,QAClB,QAAQ;AAAA,UACJ,GAAG;AAAA,YACC,EAAE,OAAO,KAAK,MAAM,kBAAkB;AAAA,YACtC,EAAE,OAAO,MAAM,MAAM,wCAAwC;AAAA,YAC7D,EAAE,OAAO,KAAK,MAAM,sCAAsC;AAAA,YAC1D,EAAE,OAAO,KAAK,MAAM,+BAA+B;AAAA,YACnD,EAAE,OAAO,KAAK,MAAM,kBAAkB;AAAA,UAC1C;AAAA,UACA,GAAG;AAAA,YACC,EAAE,OAAO,KAAK,MAAM,2BAA2B;AAAA,YAC/C,EAAE,OAAO,MAAM,MAAM,4BAA4B;AAAA,YACjD,EAAE,OAAO,KAAK,MAAM,6CAA6C;AAAA,YACjE,EAAE,OAAO,MAAM,MAAM,+CAA+C;AAAA,UACxE;AAAA,QACJ;AAAA,MACJ;AAAA,IAAC;AAAA,EACL;AACJ;AAEA,IAAI;AAEJ,SAAS,QAAiD;AACtD,aAAW,IAAI,IAAI,QAAQ,EAAE,IAAI,OAAK,CAAC,cAAc,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC;AACjE,SAAO;AACX;AAGO,SAAS,aAAa,MAA8C;AACvE,SAAO,MAAM,EAAE,IAAI,cAAc,IAAI,CAAC;AAC1C;AAGO,SAAS,eAA8C;AAC1D,SAAO,CAAC,GAAG,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,CAAC,GAAG,MAAM,eAAe,EAAE,MAAM,EAAE,IAAI,CAAC;AAClF;;;ACxXO,IAAM,mBAAN,MAAM,kBAAiB;AAAA;AAAA,EAEjB;AAAA;AAAA,EAGA;AAAA;AAAA,EAGA;AAAA,EAET,OAAO;AAAA,EAEC,YAAY,MAAc,MAAc,aAAqB;AACjE,SAAK,OAAO;AACZ,SAAK,YAAY;AACjB,SAAK,cAAc;AAAA,EACvB;AAAA;AAAA,EAGA,WAAW,MAAmC;AAC1C,sBAAiB,SAAS,aAAa,EAAE,IAAI,OAAK,IAAI,kBAAiB,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,CAAC;AAC1G,WAAO,kBAAiB;AAAA,EAC5B;AAAA;AAAA,EAGA,IAAI,YAAoB;AACpB,WAAO,GAAG,KAAK,IAAI,IAAI,KAAK,SAAS;AAAA,EACzC;AAAA;AAAA,EAGA,OAAO,KAAK,MAA4C;AACpD,UAAM,QAAQ,aAAa,IAAI;AAC/B,WAAO,UAAU,SAAY,SAAY,kBAAiB,IAAI,KAAK,OAAK,EAAE,SAAS,MAAM,IAAI;AAAA,EACjG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,SAAS,OAAyC;AAC9C,UAAM,SAAS,aAAa,KAAK,IAAI,GAAG,OAAO,KAAK;AAEpD,WAAO,UAAU,CAAC;AAAA,EACtB;AACJ;;;ACnCO,SAAS,iBAAiB,SAAiB,QAAkC;AAChF,MAAIC,QAAO;AACX,MAAI,KAAK;AACT,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACpC,UAAMC,SAAQ,OAAO,CAAC;AAGtB,QAAIA,OAAM,SAAS,SAASA,OAAM,SAAS,QAAS,CAAAD,SAAQ,QAAQ,MAAM,IAAIC,OAAM,QAAQ,EAAE,WAAW,QAAQ,IAAI;AACrH,IAAAD,SAAQ,UAAU,SAASC,QAAO,OAAO,IAAI,CAAC,CAAC;AAC/C,SAAKA,OAAM,WAAWA,OAAM;AAAA,EAChC;AACA,SAAOD;AACX;AAQO,SAAS,kBAAkB,QAAgB,KAC9C,WAA2D;AAC3D,QAAM,SAAS,SAAS,QAAQ,CAAC;AACjC,MAAIA,QAAO;AACX,MAAI,UAAU;AACd,MAAI,KAAK;AACT,aAAWC,UAAS,QAAQ;AACxB,QAAIA,OAAM,SAAS,WAAWA,OAAM,cAAc,UAAa,cAAc,QAAW;AACpF,YAAM,YAAYA,OAAM;AACxB,YAAM,UAAU,UAAU,SAAS;AACnC,UAAI,YAAY,UAAW;AAC3B,gBAAU;AACV,MAAAD,SAAQ,OAAO,MAAM,IAAIC,OAAM,QAAQ;AAEvC,UAAI,YAAY,OAAW,CAAAD,SAAQ,GAAG,eAAe,OAAO,CAAC;AAC7D,MAAAA,SAAQ;AACR,WAAKC,OAAM,WAAWA,OAAM;AAC5B;AAAA,IACJ;AACA,QAAIA,OAAM,SAAS,eAAeA,OAAM,cAAc,OAAW;AACjE,UAAM,YAAYA,OAAM;AACxB,UAAM,SAAS,IAAI,SAAS;AAC5B,QAAI,QAAQ,OAAO,SAAS,MAAM,KAAM;AACxC,cAAU;AACV,QAAI,WAAW,QAAW;AAItB,UAAI,OAAOA,OAAM;AACjB,aAAO,OAAO,MAAM,oBAAoB,OAAO,OAAO,OAAO,CAAC,CAAC,EAAG;AAClE,MAAAD,SAAQ,OAAO,MAAM,IAAI,IAAI;AAG7B,YAAM,QAAQ,UAAU;AACxB,UAAI,UAAU,UAAa,CAAC,UAAU,aAAa,cAAc,UAAa,UAAU,KAAK,MAAM,QAAY,CAAAA,SAAQ,GAAG,eAAe,KAAK,CAAC;AAC/I,MAAAA,SAAQ;AAAA,IACZ,OAAO;AACH,MAAAA,SAAQ,OAAO,MAAM,IAAIC,OAAM,QAAQ,IAAI,OAAO,MAAM;AAAA,IAC5D;AACA,SAAKA,OAAM,WAAWA,OAAM;AAAA,EAChC;AACA,SAAO,UAAUD,QAAO,OAAO,MAAM,EAAE,IAAI;AAC/C;AAOO,SAAS,4BAA4B,QACxC,OAAmH;AACnH,QAAM,SAAS,SAAS,QAAQ,CAAC;AACjC,MAAIA,QAAO;AACX,MAAI,UAAU;AACd,MAAI,KAAK;AACT,aAAWC,UAAS,QAAQ;AACxB,QAAIA,OAAM,SAAS,yBAAyBA,OAAM,cAAc,OAAW;AAC3E,UAAM,UAAU,MAAMA,OAAM,WAAWA,OAAM,IAAI;AACjD,QAAI,YAAY,OAAW;AAC3B,QAAI,QAAQ,UAAUA,OAAM,aAAa,QAAQ,WAAWA,OAAM,KAAM;AACxE,cAAU;AACV,IAAAD,SAAQ,OAAO,MAAM,IAAIC,OAAM,QAAQ,IAAI,wBAAwB,QAAQ,OAAO,QAAQ,MAAM;AAChG,SAAKA,OAAM,WAAWA,OAAM;AAAA,EAChC;AACA,SAAO,UAAUD,QAAO,OAAO,MAAM,EAAE,IAAI;AAC/C;AAEA,SAAS,UAAU,SAAiBC,QAAc,MAAiC;AAC/E,UAAQA,OAAM,MAAM;AAAA,IAChB,KAAK;AAGD,aAAO,YAAYA,OAAM,QAAQ,QAAQ,WAAW,sBAAsB;AAAA,IAC9E,KAAK;AACD,aAAO,IAAIA,OAAM,KAAK,WAAW,KAAK,IAAI,CAAC;AAAA,IAC/C,KAAK,SAAS;AACV,YAAMC,SAAQD,OAAM;AACpB,UAAIC,WAAU,OAAW,OAAM,IAAI,MAAM,iDAAiD;AAC1F,aAAOD,OAAM,cAAc,SAAYC,SAAQ,GAAG,eAAeD,OAAM,SAAS,CAAC,IAAIC,MAAK;AAAA,IAC9F;AAAA,IACA,KAAK;AACD,UAAID,OAAM,cAAc,OAAW,OAAM,IAAI,MAAM,kDAAkD;AACrG,aAAOA,OAAM,UAAU,MAAM;AAAA,IACjC,KAAK;AACD,UAAIA,OAAM,cAAc,OAAW,OAAM,IAAI,MAAM,yDAAyD;AAC5G,aAAO,wBAAwBA,OAAM,WAAWA,OAAM,IAAI;AAAA,IAC9D,KAAK,QAAQ;AACT,YAAM,OAAO,SAAS,UAAa,KAAK,SAAS,qBAAqB,CAAC,KAAK;AAC5E,UAAI,KAAM,QAAO,aAAaA,OAAM,IAAI,GAAG,QAAQA,OAAM;AACzD,UAAI,iBAAiBA,OAAM,MAAM,MAAM,EAAG,QAAO;AACjD,UAAI,iBAAiBA,OAAM,MAAM,OAAO,EAAG,QAAO;AAClD,aAAOA,OAAM;AAAA,IACjB;AAAA,IACA,KAAK;AACD,aAAO;AAAA,IACX,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACD,aAAO,QAAQ,MAAMA,OAAM,UAAUA,OAAM,WAAWA,OAAM,MAAM;AAAA,IACtE;AACI,YAAM,IAAI,MAAM,aAAa,OAAOA,OAAM,IAAI,CAAC,uBAAuB;AAAA,EAC9E;AACJ;AASO,SAAS,wBAAwBE,QAAeC,SAAwB;AAC3E,MAAIJ,QAAO,GAAGG,MAAK;AACnB,WAAS,IAAI,GAAG,IAAIC,QAAO,QAAQ,KAAK;AACpC,UAAM,IAAIA,QAAO,OAAO,CAAC;AACzB,QAAI,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,IAAK,CAAAJ,SAAQ;AAC3E,IAAAA,SAAQ;AAAA,EACZ;AACA,SAAO,GAAGA,KAAI;AAClB;;;ACpIO,IAAM,sBAAsB;AAO5B,IAAM,cAAc;AAG3B,IAAM,iBAAiB;AAGvB,IAAM,eAAe;AAed,SAAS,uBAAuB,SAA2D;AAC9F,MAAI,QAAQ,WAAW,KAAK,QAAQ,OAAO,CAAC,MAAM,IAAK,OAAM,IAAI,mBAAmB,SAAS,GAAG,4BAA4B;AAC5H,QAAM,SAAS,IAAI,OAAO,SAAS,SAAS,SAAS,CAAC,CAAC;AACvD,SAAO,EAAE,MAAM,OAAO,MAAM,GAAG,QAAQ,OAAO,OAAO;AACzD;AAEA,IAAM,SAAN,MAAa;AAAA,EACA;AAAA,EACA;AAAA,EACT,MAAM;AAAA;AAAA,EAEG,QAAoB,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,EAK9B,aAAkF,CAAC;AAAA;AAAA,EAEnF,WAAW;AAAA;AAAA,EAEX,aAAa;AAAA,EAEb,YAAY,SAAiB,QAA0B;AACnD,SAAK,WAAW;AAChB,SAAK,SAAS;AAAA,EAClB;AAAA,EAEA,QAAc;AACV,QAAI,KAAK,MAAM,EAAE,SAAS,MAAO,OAAM,IAAI,mBAAmB,KAAK,UAAU,GAAG,uBAAuB;AAEvG,UAAM,OAAO,mBAAmB,KAAK,MAAM;AAC3C,QAAI,SAAS,OAAW,OAAM,KAAK,WAAW,KAAK,WAAW,UAAU,KAAK,IAAI,CAAC;AAClF,UAAM,OAAO,KAAK,iBAAiB;AACnC,QAAI,KAAK,MAAM,EAAE,SAAS,MAAO,OAAM,KAAK,YAAY;AACxD,SAAK,SAAS,MAAM,KAAK,MAAM,CAAC;AAChC,SAAK,wBAAwB;AAC7B,WAAO;AAAA,EACX;AAAA,EAEA,QAAe;AACX,WAAO,UAAU,KAAK,QAAQ,KAAK,GAAG;AAAA,EAC1C;AAAA,EAEA,QAAe;AACX,WAAO,UAAU,KAAK,QAAQ,KAAK,KAAK;AAAA,EAC5C;AAAA,EAEA,iBAAiB,KAAwB;AACrC,WAAO,KAAK,MAAM,EAAE,SAAS,cAAc,IAAI,SAAS,KAAK,MAAM,EAAE,IAAI;AAAA,EAC7E;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAW,MAAqB;AAC5B,QAAI,CAAC,OAAO,KAAK,IAAI,EAAG,QAAO;AAC/B,QAAIK,SAAQ;AACZ,aAAS,IAAI,GAAG,UAAU,KAAK,QAAQ,CAAC,EAAE,WAAW,KAAK,UAAU,KAAK;AACrE,YAAM,IAAI,UAAU,KAAK,QAAQ,CAAC;AAClC,YAAM,QAAQ,UAAU,KAAK,QAAQ,IAAI,CAAC;AAC1C,UAAI,EAAE,SAAS,UAAU,OAAO,EAAE,IAAI,KAAK,MAAM,SAAS,qBAAqB,CAAC,MAAM,WAAY,CAAAA;AAAA,IACtG;AACA,WAAOA;AAAA,EACX;AAAA,EAEA,cAAkC;AAC9B,UAAM,OAAO,KAAK,MAAM;AACxB,QAAI,KAAK,SAAS,MAAO,QAAO,IAAI,mBAAmB,KAAK,UAAU,KAAK,UAAU,6BAA6B;AAElH,QAAI,KAAK,SAAS,QAAQ;AACtB,YAAM,OAAO,UAAU,KAAK,IAAI;AAChC,UAAI,QAAQ,KAAK,KAAK,SAAS,KAAK,IAAI,MAAM,OAAW,QAAO,KAAK,WAAW,KAAK,WAAW,IAAI;AAAA,IACxG;AACA,WAAO,IAAI,mBAAmB,KAAK,UAAU,KAAK,UAAU,IAAI,KAAK,IAAI,yBAAyB;AAAA,EACtG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,mBAAyB;AACrB,UAAM,WAAmB,CAAC,KAAK,YAAY,CAAC;AAC5C,UAAMC,aAAqB,CAAC;AAC5B,UAAM,QAAQ,MAAY;AACtB,YAAM,KAAKC,KAAID,UAAS;AACxB,YAAME,SAAQD,KAAI,QAAQ;AAC1B,YAAME,QAAOF,KAAI,QAAQ;AACzB,eAAS,KAAK,KAAK,SAAS,IAAI,WAAW,GAAG,MAAME,OAAMD,MAAK,GAAG,EAAE,CAAC;AAAA,IACzE;AACA,eAAS;AACL,UAAI,KAAK,MAAM,EAAE,SAAS,WAAY;AACtC,YAAM,QAAQ,WAAW,KAAK,MAAM,EAAE,IAAI;AAC1C,UAAI,SAAS,EAAG;AAChB,aAAOF,WAAU,SAAS,KAAK,WAAW,UAAUA,YAAWA,WAAU,SAAS,CAAC,EAAE,IAAI,KAAK,MAAO,OAAM;AAC3G,MAAAA,WAAU,KAAK,KAAK,MAAM,CAAC;AAC3B,eAAS,KAAK,KAAK,YAAY,CAAC;AAAA,IACpC;AACA,WAAOA,WAAU,SAAS,EAAG,OAAM;AACnC,WAAO,UAAU,UAAU,CAAC;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,cAAoB;AAChB,UAAM,QAAiB,CAAC;AACxB,WAAO,KAAK,cAAc,KAAK,GAAG,GAAG;AACjC,YAAM,OAAO,KAAK,MAAM;AACxB,YAAM,KAAK,IAAI;AACf,WAAK,OAAO,IAAI;AAAA,IACpB;AACA,QAAI,OAAO,KAAK,mBAAmB;AACnC,WAAO,KAAK,cAAc,GAAG,EAAG,QAAO,KAAK,SAAS,IAAI,YAAY,IAAI,GAAG,KAAK,MAAM,CAAC;AACxF,aAAS,IAAI,MAAM,SAAS,GAAG,KAAK,GAAG,KAAK;AACxC,YAAM,OAAO,UAAU,OAAO,CAAC;AAC/B,aAAO,KAAK,SAAS,IAAI,UAAU,KAAK,SAAS,MAAM,MAAM,KAAK,IAAI,GAAG,IAAI;AAC7E,WAAK;AAAA,IACT;AACA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,qBAA2B;AACvB,QAAI,OAAO,KAAK,cAAc;AAC9B,YAAQ,KAAK,SAAS,UAAU,KAAK,SAAS,eAAe,KAAK,SAAS,mBAAmB,KAAK,MAAM,EAAE,cACpG,KAAK,uBAAuB,KAAK,GAAG,GAAG;AAC1C,YAAM,KAAK,KAAK,MAAM;AACtB,YAAME,SAAQ,KAAK,cAAc;AAEjC,UAAI,UAAU,IAAI,KAAK,UAAUA,MAAK,GAAG;AACrC,cAAM,IAAI;AAAA,UAAmB,KAAK;AAAA,UAAU,GAAG;AAAA,UAAU;AAAA,UACrD,EAAE,iBAAiB,KAAK;AAAA,QAAC;AAAA,MACjC;AACA,aAAO,KAAK,SAAS,IAAI,iBAAiB,MAAMA,MAAK,GAAG,EAAE;AAAA,IAC9D;AACA,WAAO;AAAA,EACX;AAAA;AAAA,EAGA,uBAAuB,OAAwB;AAC3C,UAAM,IAAI,UAAU,KAAK,QAAQ,KAAK;AACtC,QAAI,EAAE,SAAS,YAAa,QAAO;AACnC,QAAI,EAAE,SAAS,OAAQ,QAAO;AAC9B,UAAM,QAAQ,UAAU,KAAK,QAAQ,QAAQ,CAAC;AAC9C,QAAI,MAAM,SAAS,qBAAqB,CAAC,MAAM,WAAY,QAAO;AAClE,WAAO,CAAC,iBAAiB,EAAE,MAAM,MAAM,KAAK,CAAC,iBAAiB,EAAE,MAAM,OAAO;AAAA,EACjF;AAAA,EAEA,gBAAsB;AAClB,UAAM,IAAI,KAAK,MAAM;AACrB,YAAQ,EAAE,MAAM;AAAA,MACZ,KAAK;AACD,aAAK,MAAM;AACX,eAAO,IAAI,WAAW,EAAE,MAAM;AAAA,MAClC,KAAK;AACD,aAAK,MAAM;AACX,eAAO,IAAI,SAAS,EAAE,IAAI;AAAA,MAC9B,KAAK;AACD,aAAK,MAAM;AACX,YAAI,EAAE,UAAU,OAAW,OAAM,IAAI,MAAM,iDAAiD;AAC5F,eAAO,IAAI,UAAU,EAAE,KAAK;AAAA,MAChC,KAAK;AACD,aAAK,MAAM;AACX,YAAI,EAAE,cAAc,OAAW,OAAM,IAAI,MAAM,kDAAkD;AACjG,eAAO,IAAI,cAAc,EAAE,SAAS;AAAA,MACxC,KAAK;AACD,aAAK,MAAM;AACX,YAAI,EAAE,cAAc,OAAW,OAAM,IAAI,MAAM,yDAAyD;AACxG,eAAO,IAAI,wBAAwB,EAAE,WAAW,EAAE,IAAI;AAAA,MAC1D,KAAK,mBAAmB;AACpB,aAAK,OAAO,KAAK,MAAM,CAAC;AACxB,cAAM,QAAQ,KAAK,iBAAiB;AACpC,YAAI,KAAK,MAAM,EAAE,SAAS,mBAAoB,OAAM,KAAK,YAAY;AACrE,aAAK;AACL,eAAO,KAAK,SAAS,IAAI,gBAAgB,KAAK,GAAG,KAAK,MAAM,CAAC;AAAA,MACjE;AAAA,MACA,KAAK,QAAQ;AACT,aAAK,MAAM;AACX,YAAI,KAAK,MAAM,EAAE,SAAS,qBAAqB,CAAC,KAAK,MAAM,EAAE,WAAY,QAAO,KAAK,WAAW,CAAC;AACjG,YAAI,iBAAiB,EAAE,MAAM,MAAM,EAAG,QAAO,IAAI,YAAY,IAAI;AACjE,YAAI,iBAAiB,EAAE,MAAM,OAAO,EAAG,QAAO,IAAI,YAAY,KAAK;AACnE,cAAM,OAAO,KAAK,SAAS,IAAI,SAAS,EAAE,MAAM,EAAE,UAAU,KAAK,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC;AACrF,YAAI,KAAK,YAAY,UAAa,UAAU,EAAE,IAAI,KAAK,EAAG,MAAK,WAAW,KAAK,EAAE,MAAM,QAAQ,KAAK,MAAM,WAAW,EAAE,CAAC;AACxH,eAAO;AAAA,MACX;AAAA,MACA,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACD,cAAM,KAAK,YAAY;AAAA,MAC3B;AACI,cAAM,IAAI,MAAM,aAAa,OAAO,EAAE,IAAoB,CAAC,uBAAuB;AAAA,IAC1F;AAAA,EACJ;AAAA,EAEA,WAAW,MAAmB;AAE1B,UAAM,OAAO,UAAU,KAAK,IAAI;AAChC,QAAI,QAAQ,EAAG,OAAM,KAAK,WAAW,KAAK,WAAW,IAAI;AACzD,UAAM,aAAa,aAAa,KAAK,IAAI;AACzC,SAAK,eAAe,IAAI;AACxB,UAAM,OAAO,YAAY,SAAS,QAAQ,KAAK,UAAU,IAAI,IAAI,KAAK,gBAAgB,MAAM,UAAU;AACtG,SAAK;AACL,SAAK;AACL,WAAO,KAAK,SAAS,MAAM,IAAI;AAAA,EACnC;AAAA;AAAA,EAGA,OAAO,IAAiB;AACpB,QAAI,EAAE,KAAK,WAAW,YAAa,OAAM,KAAK,SAAS,GAAG,QAAQ;AAAA,EACtE;AAAA;AAAA,EAGA,eAAe,MAAmB;AAC9B,QAAI,KAAK,aAAa,IAAI,qBAAqB;AAC3C,YAAM,IAAI;AAAA,QAAmB,KAAK;AAAA,QAAU,KAAK;AAAA,QAC7C,kCAAkC,OAAO,mBAAmB,CAAC;AAAA,QAAmD,EAAE,eAAe,KAAK;AAAA,MAAC;AAAA,IAC/I;AACA,SAAK;AACL,SAAK,OAAO,IAAI;AAAA,EACpB;AAAA;AAAA,EAGA,SAAyB,MAAS,IAAc;AAC5C,QAAI,KAAK,QAAQ,YAAa,OAAM,KAAK,SAAS,GAAG,QAAQ;AAC7D,WAAO;AAAA,EACX;AAAA,EAEA,SAAS,UAAsC;AAC3C,WAAO,IAAI;AAAA,MAAmB,KAAK;AAAA,MAAU;AAAA,MACzC,mCAAmC,OAAO,WAAW,CAAC;AAAA,MACtD,EAAE,eAAe,KAAK;AAAA,IAAC;AAAA,EAC/B;AAAA,EAEA,gBAAgB,MAAa,YAA0D;AACnF,SAAK,MAAM;AACX,UAAM,OAAe,CAAC;AACtB,QAAI,KAAK,MAAM,EAAE,SAAS,oBAAoB;AAC1C,WAAK,MAAM;AAAA,IACf,OAAO;AACH,iBAAS;AACL,aAAK,KAAK,KAAK,MAAM,EAAE,SAAS,WAAW,KAAK,MAAM,EAAE,SAAS,qBAAqB,YAAY,WAAW,KAAK,iBAAiB,CAAC;AACpI,YAAI,KAAK,MAAM,EAAE,SAAS,SAAS;AAC/B,eAAK,MAAM;AACX;AAAA,QACJ;AACA,YAAI,KAAK,MAAM,EAAE,SAAS,oBAAoB;AAC1C,eAAK,MAAM;AACX;AAAA,QACJ;AACA,cAAM,KAAK,YAAY;AAAA,MAC3B;AAAA,IACJ;AAEA,QAAI,eAAe,OAAW,QAAO,IAAI,aAAa,KAAK,MAAM,MAAM,MAAS;AAEhF,QAAI,KAAK,SAAS,WAAW,kBAAkB;AAC3C,YAAM,IAAI,mBAAmB,KAAK,UAAU,KAAK,UAAU,GAAG,WAAW,IAAI,mBAAmB,OAAO,WAAW,gBAAgB,CAAC,eAAe;AAAA,IACtJ;AACA,QAAI,KAAK,SAAS,WAAW,kBAAkB;AAC3C,YAAM,IAAI,mBAAmB,KAAK,UAAU,KAAK,UAAU,GAAG,WAAW,IAAI,kBAAkB,OAAO,WAAW,gBAAgB,CAAC,eAAe;AAAA,IACrJ;AACA,QAAI,WAAW,YAAY,KAAK,SAAS,WAAW,cAAc,MAAM,GAAG;AACvE,YAAM,IAAI,mBAAmB,KAAK,UAAU,KAAK,UAAU,GAAG,WAAW,IAAI,gCAAgC;AAAA,IACjH;AACA,UAAM,OAAO,WAAW;AACxB,QAAI,SAAS,QAAW;AACpB,eAAS,IAAI,KAAK,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,QAAQ,KAAK;AAC7D,YAAI,gBAAgB,UAAU,MAAM,CAAC,CAAC,GAAG;AACrC,gBAAM,IAAI,mBAAmB,KAAK,UAAU,KAAK,UAAU,GAAG,WAAW,IAAI,2CAA2C,OAAO,IAAI,CAAC,CAAC,GAAG;AAAA,QAC5I;AAAA,MACJ;AAAA,IACJ;AACA,WAAO,IAAI,aAAa,WAAW,MAAM,MAAM,YAAY,KAAK,WAAW,IAAI,CAAC;AAAA,EACpF;AAAA;AAAA,EAGA,SAAS,MAAsC;AAC3C,aAAS,IAAI,KAAK,MAAM,SAAS,GAAG,KAAK,GAAG,KAAK;AAC7C,YAAM,UAAU,UAAU,KAAK,OAAO,CAAC,EAAE,MAAM,KAAK,OAAK,iBAAiB,EAAE,MAAM,IAAI,CAAC;AACvF,UAAI,YAAY,OAAW,QAAO;AAAA,IACtC;AACA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,UAAU,MAAsB;AAC5B,SAAK,MAAM;AACX,UAAM,QAAkB,EAAE,OAAO,CAAC,GAAG,OAAO,oBAAI,IAAI,EAAE;AACtD,SAAK,MAAM,KAAK,KAAK;AACrB,UAAM,OAAe,CAAC;AACtB,QAAI;AACJ,QAAI,KAAK,MAAM,EAAE,SAAS,mBAAoB,OAAM,IAAI,mBAAmB,KAAK,UAAU,KAAK,UAAU,mCAAmC;AAC5I,eAAS;AACL,YAAM,QAAQ,KAAK,MAAM;AACzB,YAAM,WAAW,KAAK,MAAM,EAAE,SAAS,WAAW,KAAK,MAAM,EAAE,SAAS,qBAAqB,YAAY,WAAW,KAAK,iBAAiB;AAC1I,YAAM,QAAQ,KAAK;AACnB,WAAK,KAAK,QAAQ;AAClB,UAAI,KAAK,MAAM,EAAE,SAAS,oBAAoB;AAC1C,aAAK,MAAM;AACX;AAAA,MACJ;AACA,UAAI,KAAK,MAAM,EAAE,SAAS,QAAS,OAAM,KAAK,YAAY;AAC1D,WAAK,MAAM;AACX,UAAI,QAAQ,MAAM,GAAG;AAEjB,YAAI,MAAM,MAAM,SAAS,cAAc;AACnC,gBAAM,IAAI,mBAAmB,KAAK,UAAU,MAAM,UAAU,uBAAuB,OAAO,YAAY,CAAC,SAAS;AAAA,QACpH;AACA,cAAM,OAAO,KAAK,SAAS,UAAU,KAAK;AAC1C,cAAM,MAAM,cAAc,IAAI;AAC9B,YAAI,MAAM,MAAM,IAAI,GAAG,EAAG,OAAM,IAAI,mBAAmB,KAAK,UAAU,MAAM,UAAU,IAAI,IAAI,8BAA8B;AAC5H,cAAM,MAAM,IAAI,GAAG;AACnB,gBAAQ,IAAI,WAAW,IAAI;AAAA,MAC/B,OAAO;AACH,YAAI,UAAU,OAAW,OAAM,IAAI,MAAM,yCAAyC;AAClF,cAAM,QAAQ;AACd,cAAM,MAAM,KAAK,KAAK;AACtB,gBAAQ;AAAA,MACZ;AAAA,IACJ;AACA,SAAK,MAAM,IAAI;AACf,QAAI,KAAK,SAAS,EAAG,OAAM,IAAI,mBAAmB,KAAK,UAAU,KAAK,UAAU,mCAAmC;AACnH,QAAI,KAAK,SAAS,MAAM,EAAG,OAAM,IAAI,mBAAmB,KAAK,UAAU,KAAK,UAAU,kEAAkE;AACxJ,UAAM,cAAc,UAAU,MAAM,KAAK,SAAS,CAAC;AACnD,QAAI,YAAY,SAAS,UAAW,OAAM,IAAI,mBAAmB,KAAK,UAAU,KAAK,UAAU,+BAA+B;AAC9H,WAAO,IAAI,QAAQ,MAAM,OAAO,WAAW;AAAA,EAC/C;AAAA;AAAA,EAGA,SAAS,UAAgB,OAAsB;AAC3C,QAAI,SAAS,SAAS,QAAQ;AAC1B,YAAME,WAAU,SAAS,SAAS,cAAc,IAAI,MAAM,IAAI,sDACxD,SAAS,SAAS,YAAY,GAAG,iBAAiB,MAAM,IAAI,CAAC,2BACzD;AACV,YAAM,IAAI,mBAAmB,KAAK,UAAU,MAAM,UAAUA,QAAO;AAAA,IACvE;AACA,UAAM,UAAU,eAAe,SAAS,IAAI;AAC5C,QAAI,YAAY,OAAW,OAAM,IAAI,mBAAmB,KAAK,UAAU,MAAM,UAAU,OAAO;AAE9F,SAAK,aAAa,KAAK,WAAW,OAAO,OAAK,EAAE,SAAS,QAAQ;AACjE,WAAO,SAAS;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,0BAAgC;AAC5B,eAAW,EAAE,MAAM,OAAO,KAAK,KAAK,YAAY;AAC5C,UAAI,OAAO,KAAK,WAAS,MAAM,MAAM,IAAI,cAAc,KAAK,IAAI,CAAC,CAAC,EAAG;AACrE,YAAM,KAAK,WAAW,KAAK,WAAW,UAAU,KAAK,IAAI,CAAC;AAAA,IAC9D;AAAA,EACJ;AAAA,EAEA,WAAW,IAAgC;AACvC,WAAO,IAAI,mBAAmB,KAAK,UAAU,IAAI,IAAI,KAAK,SAAS,OAAO,EAAE,CAAC,oDAAoD;AAAA,EACrI;AACJ;AAEA,SAAS,OAAOC,OAAuB;AACnC,SAAO,iBAAiBA,OAAM,MAAM,KAAK,iBAAiBA,OAAM,aAAa;AACjF;AAGA,SAAS,UAAU,MAAqB;AACpC,SAAO,KAAK,SAAS,eAAgB,KAAK,SAAS,UAAU,KAAK,YAAY;AAClF;AAMA,SAAS,WAAW,IAAoB;AACpC,UAAQ,IAAI;AAAA,IACR,KAAK;AAAA,IAAK,KAAK;AAAA,IAAM,KAAK;AAAA,IAAK,KAAK;AAAA,IAAK,KAAK;AAAA,IAAM,KAAK;AAAM,aAAO;AAAA,IACtE,KAAK;AAAK,aAAO;AAAA,IACjB,KAAK;AAAA,IAAK,KAAK;AAAK,aAAO;AAAA,IAC3B,KAAK;AAAA,IAAK,KAAK;AAAK,aAAO;AAAA,IAC3B,KAAK;AAAK,aAAO;AAAA,IACjB;AAAS,aAAO;AAAA,EACpB;AACJ;AAOA,SAAS,gBAAgB,UAAyB;AAC9C,UAAQ,SAAS,MAAM;AAAA,IACnB,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACD,aAAO;AAAA,IACX,KAAK;AACD,aAAO,gBAAgB,SAAS,KAAK;AAAA,IACzC,KAAK;AACD,aAAO,SAAS,aAAa,UAAa,CAAC,SAAS,SAAS;AAAA,IACjE,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACD,aAAO;AAAA,IACX;AACI,YAAM,IAAI,MAAM,aAAa,OAAO,QAAQ,CAAC,sBAAsB;AAAA,EAC3E;AACJ;AAMA,SAAS,eAAe,MAAkC;AACtD,MAAI,KAAK,SAAS,eAAgB,QAAO,yBAAyB,OAAO,cAAc,CAAC;AACxF,QAAM,QAAQ,KAAK,WAAW,CAAC;AAC/B,MAAI,QAAQ,SAAS,KAAK,KAAK,UAAU;AACzC,WAAS,IAAI,GAAG,IAAI,KAAK,UAAU,OAAO,KAAK;AAC3C,UAAM,IAAI,KAAK,WAAW,CAAC;AAC3B,YAAQ,SAAS,CAAC,KAAK,aAAa,CAAC,KAAK,MAAM;AAAA,EACpD;AACA,SAAO,QAAQ,SAAY,IAAI,IAAI;AACvC;AAEA,SAASJ,KAAO,OAAe;AAC3B,QAAM,MAAM,MAAM,IAAI;AACtB,MAAI,QAAQ,OAAW,OAAM,IAAI,MAAM,6CAA6C;AACpF,SAAO;AACX;;;AC9eO,SAAS,eAAe,WAAsB,MAAc,SAAwC;AACvG,MAAI,KAAK,UAAU,eAAe,UAAU,OAAO,UAAU,OAAO;AACpE,MAAI,KAAK,UAAU,eAAe,UAAU,OAAO,UAAU,OAAO;AACpE,MAAI,KAAK,UAAU,kBAAkB,UAAU,UAAU,UAAU,UAAU;AAC7E,MAAI,KAAK,UAAU,kBAAkB,UAAU,UAAU,UAAU,UAAU;AAE7E,MAAI,UAAU,UAAU,UAAW,EAAC,IAAI,EAAE,IAAI,CAAC,UAAU,MAAM,UAAU,IAAI;AAC7E,MAAI,UAAU,UAAU,OAAQ,EAAC,IAAI,EAAE,IAAI,CAAC,UAAU,SAAS,UAAU,OAAO;AAChF,MAAI,CAAC,OAAO,IAAI,QAAQ,KAAK,CAAC,OAAO,IAAI,QAAQ,KAAK,CAAC,OAAO,IAAI,WAAW,KAAK,CAAC,OAAO,IAAI,WAAW,EAAG,QAAO;AAEnH,MAAI,aAAa,UAAU;AAC3B,MAAI,aAAa,UAAU;AAC3B,MAAI,aAAa,UAAU;AAC3B,MAAI,aAAa,UAAU;AAE3B,MAAI,KAAK,GAAI,EAAC,IAAI,YAAY,IAAI,UAAU,IAAI,CAAC,IAAI,YAAY,IAAI,UAAU;AAC/E,MAAI,KAAK,GAAI,EAAC,IAAI,YAAY,IAAI,UAAU,IAAI,CAAC,IAAI,YAAY,IAAI,UAAU;AAC/E,SAAO,UAAU,KAAK;AAAA,IAClB,MAAM;AAAA,IAAI,MAAM;AAAA,IAAI,SAAS;AAAA,IAAI,SAAS;AAAA,IAC1C,cAAc;AAAA,IAAY,cAAc;AAAA,IAAY,iBAAiB;AAAA,IAAY,iBAAiB;AAAA,EACtG,CAAC;AACL;AAEA,SAAS,OAAO,UAAkB,MAAuB;AACrD,SAAO,YAAY,KAAK,WAAW;AACvC;;;ACtBO,SAAS,aAAa,SAAkC;AAC3D,QAAM,QAAkB,CAAC;AACzB,OAAK,SAAS,CAAC,GAAG,KAAK;AACvB,SAAO,qBAAqB,KAAK;AACrC;AAGO,SAAS,qBAAqB,OAAoC;AACrE,QAAM,OAAiB,CAAC;AACxB,aAAWK,SAAQ,MAAO,KAAI,CAAC,KAAK,KAAK,OAAK,iBAAiB,GAAGA,KAAI,CAAC,EAAG,MAAK,KAAKA,KAAI;AACxF,SAAO;AACX;AAEA,SAAS,KAAK,MAAY,YAA+B,OAAuB;AAC5E,UAAQ,KAAK,MAAM;AAAA,IACf,KAAK;AACD,UAAI,KAAK,YAAY,UAAa,UAAU,KAAK,IAAI,IAAI,KAAK,CAAC,WAAW,KAAK,OAAK,iBAAiB,GAAG,KAAK,IAAI,CAAC,EAAG,OAAM,KAAK,KAAK,IAAI;AACzI;AAAA,IACJ,KAAK;AACD,iBAAW,WAAW,KAAK,SAAU,MAAK,QAAQ,OAAO,YAAY,KAAK;AAC1E,WAAK,KAAK,aAAa,YAAY,KAAK;AACxC;AAAA,IACJ,KAAK,YAAY;AACb,YAAM,OAAO,KAAK;AAClB,YAAM,OAAO,KAAK,GAAG,EAAE;AACvB,UAAI,iBAAiB,KAAK,MAAM,QAAQ,KAAK,SAAS,QAAW;AAC7D,cAAM,QAAQ,CAAC,GAAG,UAAU;AAC5B,iBAAS,IAAI,GAAG,IAAI,KAAK,SAAS,GAAG,KAAK;AACtC,gBAAM,WAAW,KAAK,CAAC;AACvB,cAAI,SAAS,SAAS,OAAQ,OAAM,KAAK,SAAS,IAAI;AAAA,cACjD,MAAK,UAAU,YAAY,KAAK;AAAA,QACzC;AACA,aAAK,MAAM,OAAO,KAAK;AACvB;AAAA,MACJ;AACA,iBAAW,YAAY,KAAM,MAAK,UAAU,YAAY,KAAK;AAC7D;AAAA,IACJ;AAAA,IACA,KAAK;AACD,WAAK,KAAK,MAAM,YAAY,KAAK;AACjC,WAAK,KAAK,OAAO,YAAY,KAAK;AAClC;AAAA,IACJ,KAAK;AAED,iBAAW,WAAW,KAAK,SAAS,EAAG,MAAK,SAAS,YAAY,KAAK;AACtE;AAAA,IACJ,KAAK;AACD,WAAK,KAAK,OAAO,YAAY,KAAK;AAClC;AAAA,IACJ,KAAK;AAAA,IACL,KAAK;AACD,WAAK,KAAK,SAAS,YAAY,KAAK;AACpC;AAAA,IACJ,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACD;AAAA,IACJ;AACI,YAAM,IAAI,MAAM,aAAa,OAAO,IAAI,CAAC,sBAAsB;AAAA,EACvE;AACJ;;;ACzDO,IAAM,QAAN,MAAM,OAAM;AAAA;AAAA,EAEN;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA;AAAA;AAAA,EAEA;AAAA,EAED,YAAY,UAA6B,SAA6B,QAA0B;AACpG,SAAK,WAAW;AAChB,SAAK,UAAU;AACf,SAAK,SAAS;AAAA,EAClB;AAAA;AAAA,EAGA,IAAI,YAAqB;AACrB,WAAO,KAAK,YAAY;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,sBAAyC;AACzC,QAAI,KAAK,WAAW,OAAW,QAAO,CAAC;AACvC,WAAO,qBAAqB,CAAC,GAAG,KAAK,OAAO,MAAM,CAAC,EAAE,OAAO,OAAK,EAAE,aAAa,MAAS,EAAE,IAAI,OAAK,EAAE,IAAI,CAAC;AAAA,EAC/G;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,eAAkC;AAClC,WAAO,KAAK,WAAW,SAAY,CAAC,IAAI,aAAa,KAAK,MAAM;AAAA,EACpE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,QAAQ,MAAc,SAAwB;AAC1C,WAAO,SAAS,KAAK,YAAY,IAAI,OAAO,OAAM,QAAQ,MAAM,OAAK,eAAe,GAAG,MAAM,OAAO,CAAC;AAAA,EACzG;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,QAAQ,OAAc,KAAsD,WAA0D;AACzI,UAAM,UAAU,MAAM;AACtB,QAAI,YAAY,OAAW,QAAO;AAClC,UAAM,YAAY,kBAAkB,SAAS,KAAK,SAAS;AAC3D,WAAO,cAAc,UAAU,QAAQ,OAAM,YAAY,SAAS;AAAA,EACtE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,cAAcC,OAAiC;AAClD,UAAMC,SAAQ,kBAAkBD,KAAI;AACpC,WAAOC,WAAU,SAAY,SAAY,IAAI,OAAM,MAAM,UAAUA,MAAK,GAAG,QAAW,MAAS;AAAA,EACnG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,UAAU,UAAwB;AACrC,QAAI,SAAS,WAAW;AACpB,YAAM,IAAI,WAAW,QAAQ,SAAS,KAAK,yIAAyI;AAAA,IACxL;AACA,QAAI,SAAS,YAAY,SAAS,UAAU,mBAAmB,SAAS,UAAU,WAAW;AACzF,YAAM,IAAI,WAAW,GAAG,SAAS,KAAK,qCAAqC;AAAA,IAC/E;AACA,WAAO,IAAI,OAAM,UAAU,QAAW,MAAS;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,YAAY,SAAwB;AACvC,UAAM,EAAE,MAAM,OAAO,IAAI,uBAAuB,OAAO;AACvD,WAAO,IAAI,OAAM,QAAW,iBAAiB,SAAS,MAAM,GAAG,IAAI;AAAA,EACvE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAO,MAAM,OAAe,SAAqC;AAC7D,QAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,QAAI,MAAM,WAAW,GAAG,EAAG,QAAO,OAAM,YAAY,KAAK;AACzD,UAAM,WAAW,cAAc,OAAO,OAAO;AAC7C,QAAI,SAAS,SAAS,QAAQ;AAC1B,YAAM,UAAU,OAAM,cAAc,KAAK;AACzC,UAAI,YAAY,OAAW,QAAO;AAAA,IACtC;AACA,WAAO,IAAI,OAAM,UAAU,QAAW,MAAS;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAO,cAAc,OAAkC;AACnD,QAAI,MAAM,SAAS,KAAM,MAAM,CAAC,MAAM,OAAO,MAAM,CAAC,MAAM,IAAM,QAAO;AACvE,QAAI;AACA,aAAO,OAAM,YAAY,IAAI,KAAK,EAAE;AAAA,IACxC,SAAS,GAAG;AACR,UAAI,aAAa,sBAAsB,CAAC,EAAE,mBAAmB,CAAC,EAAE,cAAe,QAAO;AACtF,YAAM;AAAA,IACV;AAAA,EACJ;AAAA;AAAA,EAGA,OAAO,gBAAgB,OAAwB;AAC3C,QAAI;AACA,aAAO,OAAM,cAAc,KAAK,MAAM;AAAA,IAC1C,SAAS,GAAG;AACR,UAAI,aAAa,mBAAoB,QAAO;AAC5C,YAAM;AAAA,IACV;AAAA,EACJ;AAAA;AAAA,EAGA,OAAO,OAAmC;AACtC,WAAO,UAAU,UAAa,MAAM,KAAK,KAAK,UAAU,MAAM,QAAQ,KAAK,KAAK,YAAY,MAAM;AAAA,EACtG;AAAA;AAAA,EAGA,OAAO,KAAK,GAAsB,GAA+B;AAC7D,QAAI,MAAM,UAAa,MAAM,OAAW,QAAO,MAAM;AACrD,WAAO,EAAE,OAAO,CAAC;AAAA,EACrB;AAAA;AAAA,EAGA,WAAmB;AACf,QAAI,KAAK,YAAY,OAAW,QAAO,KAAK;AAC5C,QAAI,KAAK,aAAa,OAAW,OAAM,IAAI,MAAM,gDAAgD;AACjG,WAAO,KAAK,SAAS,SAAS,WAAW,gBAAgB,KAAK,SAAS,MAAM,IAAI,KAAK,SAAS,SAAS;AAAA,EAC5G;AACJ;;;ACrKA,IAAM,WAAW;AAGV,IAAM,kBAAN,cAA8B,MAAM;AAAA,EACvC,YAAY,SAAiB;AACzB,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EAChB;AACJ;AAGO,SAAS,UAAUC,OAA2B;AACjD,MAAI,KAAK;AACT,QAAM,OAAO,CAAC,SAAwB;AAClC,UAAM,IAAI,gBAAgB,GAAG,IAAI,gBAAgB,OAAO,EAAE,CAAC,GAAG;AAAA,EAClE;AACA,QAAM,OAAO,MAAY;AACrB,WAAO,KAAKA,MAAK,QAAQ;AACrB,YAAM,IAAIA,MAAK,WAAW,EAAE;AAC5B,UAAI,MAAM,MAAQ,MAAM,KAAQ,MAAM,MAAQ,MAAM,GAAM;AAC1D;AAAA,IACJ;AAAA,EACJ;AACA,QAAMC,WAAU,CAACC,UAAuB;AACpC,QAAI,CAACF,MAAK,WAAWE,OAAM,EAAE,EAAG,MAAK,yBAAyB;AAC9D,UAAMA,MAAK;AAAA,EACf;AACA,QAAM,SAAS,MAAc;AACzB;AACA,QAAI,MAAM;AACV,eAAS;AACL,UAAI,MAAMF,MAAK,OAAQ,MAAK,wBAAwB;AACpD,YAAM,IAAIA,MAAK,WAAW,EAAE;AAC5B,UAAI,MAAM,IAAM;AACZ;AACA,eAAO;AAAA,MACX;AACA,UAAI,IAAI,GAAM,MAAK,iCAAiC;AACpD,UAAI,MAAM,IAAM;AACZ,eAAOA,MAAK,EAAE;AACd;AACA;AAAA,MACJ;AACA,YAAM,IAAIA,MAAK,KAAK,CAAC;AACrB,YAAM;AACN,cAAQ,GAAG;AAAA,QACP,KAAK;AAAK,iBAAO;AAAK;AAAA,QACtB,KAAK;AAAM,iBAAO;AAAM;AAAA,QACxB,KAAK;AAAK,iBAAO;AAAK;AAAA,QACtB,KAAK;AAAK,iBAAO;AAAM;AAAA,QACvB,KAAK;AAAK,iBAAO;AAAM;AAAA,QACvB,KAAK;AAAK,iBAAO;AAAM;AAAA,QACvB,KAAK;AAAK,iBAAO;AAAM;AAAA,QACvB,KAAK;AAAK,iBAAO;AAAM;AAAA,QACvB,KAAK,KAAK;AACN,gBAAM,SAASA,MAAK,MAAM,IAAI,KAAK,CAAC;AACpC,cAAI,CAAC,oBAAoB,KAAK,MAAM,EAAG,MAAK,uBAAuB;AACnE,iBAAO,OAAO,aAAa,SAAS,QAAQ,EAAE,CAAC;AAC/C,gBAAM;AACN;AAAA,QACJ;AAAA,QACA,KAAK;AAAA,QACL;AAAS,eAAK,mBAAmB;AAAA,MACrC;AAAA,IACJ;AAAA,EACJ;AACA,QAAM,QAAQ,CAAC,UAA+B;AAC1C,SAAK;AACL,UAAM,QAAQ;AACd,UAAM,IAAIA,MAAK,EAAE;AACjB,YAAQ,GAAG;AAAA,MACP,KAAK,KAAK;AACN,YAAI,SAAS,SAAU,MAAK,wBAAwB;AACpD;AACA,cAAM,aAAiD,CAAC;AACxD,aAAK;AACL,YAAIA,MAAK,EAAE,MAAM,KAAK;AAClB;AACA,iBAAO,EAAE,MAAM,UAAU,YAAY,KAAKA,MAAK,MAAM,OAAO,EAAE,EAAE;AAAA,QACpE;AACA,mBAAS;AACL,eAAK;AACL,cAAIA,MAAK,EAAE,MAAM,IAAK,MAAK,0BAA0B;AACrD,gBAAM,OAAO,OAAO;AACpB,eAAK;AACL,cAAIA,MAAK,EAAE,MAAM,IAAK,MAAK,cAAgB;AAC3C;AACA,qBAAW,KAAK,CAAC,MAAM,MAAM,QAAQ,CAAC,CAAC,CAAC;AACxC,eAAK;AACL,cAAIA,MAAK,EAAE,MAAM,KAAK;AAClB;AACA;AAAA,UACJ;AACA,cAAIA,MAAK,EAAE,MAAM,KAAK;AAClB;AACA,mBAAO,EAAE,MAAM,UAAU,YAAY,KAAKA,MAAK,MAAM,OAAO,EAAE,EAAE;AAAA,UACpE;AACA,eAAK,qBAAyB;AAAA,QAClC;AAAA,MACJ;AAAA,MACA,KAAK,KAAK;AACN,YAAI,SAAS,SAAU,MAAK,wBAAwB;AACpD;AACA,cAAMG,SAAuB,CAAC;AAC9B,aAAK;AACL,YAAIH,MAAK,EAAE,MAAM,KAAK;AAClB;AACA,iBAAO,EAAE,MAAM,SAAS,OAAAG,QAAO,KAAKH,MAAK,MAAM,OAAO,EAAE,EAAE;AAAA,QAC9D;AACA,mBAAS;AACL,UAAAG,OAAM,KAAK,MAAM,QAAQ,CAAC,CAAC;AAC3B,eAAK;AACL,cAAIH,MAAK,EAAE,MAAM,KAAK;AAClB;AACA;AAAA,UACJ;AACA,cAAIA,MAAK,EAAE,MAAM,KAAK;AAClB;AACA,mBAAO,EAAE,MAAM,SAAS,OAAAG,QAAO,KAAKH,MAAK,MAAM,OAAO,EAAE,EAAE;AAAA,UAC9D;AACA,eAAK,qBAAyB;AAAA,QAClC;AAAA,MACJ;AAAA,MACA,KAAK;AACD,eAAO,EAAE,MAAM,UAAU,OAAO,OAAO,EAAE;AAAA,MAC7C,KAAK;AACD,QAAAC,SAAQ,MAAM;AACd,eAAO,EAAE,MAAM,OAAO;AAAA,MAC1B,KAAK;AACD,QAAAA,SAAQ,OAAO;AACf,eAAO,EAAE,MAAM,QAAQ;AAAA,MAC3B,KAAK;AACD,QAAAA,SAAQ,MAAM;AACd,eAAO,EAAE,MAAM,OAAO;AAAA,MAC1B,KAAK;AACD,eAAO,KAAK,mBAAmB;AAAA,MACnC,SAAS;AACL,cAAM,QAAQ,yDAAyD,KAAKD,MAAK,MAAM,EAAE,CAAC;AAC1F,YAAI,UAAU,KAAM,QAAO,KAAK,yBAAyB;AACzD,cAAM,MAAM,CAAC,EAAE;AACf,eAAO,EAAE,MAAM,UAAU,KAAK,MAAM,CAAC,EAAE;AAAA,MAC3C;AAAA,IACJ;AAAA,EACJ;AACA,QAAM,OAAO,MAAM,CAAC;AACpB,OAAK;AACL,MAAI,KAAKA,MAAK,OAAQ,MAAK,2BAA2B;AACtD,SAAO;AACX;AAGO,SAAS,UAAU,SAA0C;AAChE,MAAI,QAAQ,SAAS,YAAY,CAAC,cAAc,KAAK,QAAQ,GAAG,EAAG,QAAO;AAC1E,QAAM,IAAI,OAAO,QAAQ,GAAG;AAC5B,SAAO,KAAK,eAAe,KAAK,aAAa,IAAI;AACrD;AAGO,SAAS,WAAW,SAA0C;AACjE,MAAI,QAAQ,SAAS,SAAU,QAAO;AACtC,QAAM,IAAI,OAAO,QAAQ,GAAG;AAC5B,SAAO,OAAO,SAAS,CAAC,IAAI,IAAI;AACpC;AAGO,SAAS,SAAS,SAA8B;AACnD,UAAQ,QAAQ,MAAM;AAAA,IAClB,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACD,aAAO,QAAQ;AAAA,IACnB,KAAK;AACD,aAAO,QAAQ;AAAA,IACnB,KAAK;AACD,aAAO;AAAA,IACX,KAAK;AACD,aAAO;AAAA,IACX,KAAK;AACD,aAAO;AAAA,IACX;AACI,YAAM,IAAI,MAAM,aAAa,OAAO,OAAuB,CAAC,yBAAyB;AAAA,EAC7F;AACJ;AAGA,IAAM,eAAe,oBAAI,IAAI,CAAC,KAAK,KAAK,KAAM,KAAK,KAAK,KAAK,MAAM,GAAG,CAAC;AAGvE,SAAS,YAAYA,OAAsB;AACvC,MAAI,MAAM;AACV,WAAS,IAAI,GAAG,IAAIA,MAAK,QAAQ,KAAK;AAClC,UAAM,KAAKA,MAAK,OAAO,CAAC;AACxB,UAAM,IAAIA,MAAK,WAAW,CAAC;AAC3B,QAAI,KAAK,MAAQ,IAAI,OAAQ,CAAC,aAAa,IAAI,EAAE,GAAG;AAChD,aAAO;AACP;AAAA,IACJ;AACA,YAAQ,IAAI;AAAA,MACR,KAAK;AAAM,eAAO;AAAQ;AAAA,MAC1B,KAAK;AAAM,eAAO;AAAO;AAAA,MACzB,KAAK;AAAM,eAAO;AAAO;AAAA,MACzB,KAAK;AAAM,eAAO;AAAO;AAAA,MACzB,KAAK;AAAM,eAAO;AAAO;AAAA,MACzB,KAAK;AAAM,eAAO;AAAO;AAAA,MACzB;AAAS,eAAO,MAAM,IAAI,GAAG,CAAC,CAAC;AAAA,IACnC;AAAA,EACJ;AACA,SAAO,GAAG,GAAG;AACjB;AAGO,IAAM,aAAN,MAAiB;AAAA,EACpB,OAAO;AAAA;AAAA,EAEE,WAAsB,CAAC;AAAA,EAEhC,YAAkB;AACd,UAAM,OAAO,KAAK,SAAS,SAAS;AACpC,QAAI,OAAO,EAAG;AACd,QAAI,KAAK,SAAS,IAAI,MAAM,KAAM,MAAK,QAAQ;AAC/C,SAAK,SAAS,IAAI,IAAI;AAAA,EAC1B;AAAA,EAEA,MAAM,MAAgC;AAClC,SAAK,UAAU;AACf,QAAI,SAAS,OAAW,MAAK,QAAQ,GAAG,YAAY,IAAI,CAAC;AAAA,EAC7D;AAAA,EAEA,YAAY,MAAqB;AAC7B,SAAK,MAAM,IAAI;AACf,SAAK,QAAQ;AACb,SAAK,SAAS,KAAK,KAAK;AAAA,EAC5B;AAAA,EAEA,YAAkB;AACd,SAAK,SAAS,IAAI;AAClB,SAAK,QAAQ;AAAA,EACjB;AAAA,EAEA,WAAW,MAAqB;AAC5B,SAAK,MAAM,IAAI;AACf,SAAK,QAAQ;AACb,SAAK,SAAS,KAAK,KAAK;AAAA,EAC5B;AAAA,EAEA,WAAiB;AACb,SAAK,SAAS,IAAI;AAClB,SAAK,QAAQ;AAAA,EACjB;AAAA,EAEA,OAAO,MAA0B,OAAqB;AAClD,SAAK,MAAM,IAAI;AACf,SAAK,QAAQ,YAAY,KAAK;AAAA,EAClC;AAAA,EAEA,OAAO,MAA0B,OAAqB;AAClD,QAAI,CAAC,OAAO,SAAS,KAAK,EAAG,OAAM,IAAI,WAAW,GAAG,OAAO,KAAK,CAAC,6BAA6B;AAC/F,SAAK,MAAM,IAAI;AACf,SAAK,QAAQ,gBAAgB,KAAK;AAAA,EACtC;AAAA,EAEA,QAAQ,MAA0B,OAAsB;AACpD,SAAK,MAAM,IAAI;AACf,SAAK,QAAQ,QAAQ,SAAS;AAAA,EAClC;AAAA,EAEA,WAAmB;AACf,WAAO,KAAK;AAAA,EAChB;AACJ;;;AClRO,SAAS,UAAU,UAAiB,QAAsB,SAA0B;AACvF,UAAQ,SAAS,MAAM;AAAA,IACnB,KAAK,UAAU;AACX,YAAMI,UAAS,SAAS;AACxB,UAAI,OAAO,UAAUA,WAAU,KAAKA,UAAS,gBAAgB,EAAG,QAAO,aAAaA,SAAQ,OAAO;AACnG,UAAI,OAAO,UAAW,QAAO,GAAG,YAAYA,UAAS,KAAK,OAAO,CAAC;AAClE,aAAO,YAAYA,SAAQ,OAAO;AAAA,IACtC;AAAA,IACA,KAAK;AAAA,IACL,KAAK;AACD,aAAO,SAAS,SAAS;AAAA,IAC7B,KAAK,QAAQ;AACT,YAAMC,QAAO,SAAS;AAEtB,UAAIA,MAAK,WAAW,KAAKA,MAAK,WAAW,GAAG,KAAKA,MAAK,WAAW,GAAG,KAAK,cAAcA,OAAM,OAAO,EAAE,SAAS,UAAU,MAAM,gBAAgBA,KAAI,GAAG;AAClJ,eAAO,IAAIA,KAAI;AAAA,MACnB;AACA,aAAOA;AAAA,IACX;AAAA,IACA;AACI,YAAM,IAAI,MAAM,aAAa,OAAO,SAAS,IAAI,CAAC,uBAAuB;AAAA,EACjF;AACJ;AAEA,SAAS,aAAa,QAAgB,SAA0B;AAC5D,QAAMC,SAAQ,KAAK,MAAM,MAAM;AAC/B,QAAM,UAAU,WAAWA;AAC3B,QAAM,aAAa,QAAQ,KAAK,gBAAgB,SAAS,GAAG;AAC5D,QAAMC,QAAO,aAAa,MAAM,aAAa,kBAAkB,SAAS;AACxE,MAAID,WAAU,KAAK,QAAS,QAAOC,MAAK,OAAO,MAAM,WAAW,MAAM,GAAG,OAAO,EAAE;AAClF,QAAM,OAAO,aAAa,MAAM,SAAS,OAAO,CAAC,EAAE,OAAO,MAAM,WAAWD,MAAK,GAAG,OAAO,EAAE;AAC5F,SAAO,UAAU,GAAG,IAAI,IAAIC,MAAK,OAAO,MAAM,WAAW,MAAM,GAAG,OAAO,EAAE,IAAI,KAAK;AACxF;;;ACmDO,IAAM,oBAAN,MAAwB;AAAA;AAAA,EAElB;AAAA;AAAA,EAGA;AAAA;AAAA,EAGT,YAAYC,QAAeC,SAAgB;AACvC,SAAK,QAAQD;AACb,SAAK,SAASC;AAAA,EAClB;AAAA;AAAA,EAGA,OAAO,OAAmC;AACtC,WAAO,iBAAiB,KAAK,OAAO,MAAM,KAAK,KAAK,iBAAiB,KAAK,QAAQ,MAAM,MAAM;AAAA,EAClG;AAAA;AAAA,EAGA,IAAI,MAAc;AACd,WAAO,KAAK,UAAU,CAAC,cAAc,KAAK,KAAK,GAAG,cAAc,KAAK,MAAM,CAAC,CAAC;AAAA,EACjF;AACJ;AAiDA,IAAMC,aAAY,CAAC,MAAM,MAAM,MAAM,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG;AACrF,IAAM,iBAAiB,CAAC,KAAK,KAAK,KAAK,KAAK,GAAG;AAC/C,IAAMC,eAAc;AAGpB,IAAM,oBAAoB;AAE1B,IAAM,sBAAsB;AAC5B,IAAM,WAAW;AAiCV,SAAS,gBAAgBC,OAAc,OAAe,cACzD,WAA4F;AAC5F,MAAI,CAAC,UAAUA,OAAM,KAAK,EAAG,QAAO;AACpC,QAAM,SAAS,KAAKA,KAAI;AACxB,QAAM,QAAQ,OAAO,UAAU,OAAK,EAAE,QAAQ,SAAS,SAAS,EAAE,GAAG;AACrE,QAAM,KAAK,SAAS,IAAI,UAAU,QAAQ,KAAK,IAAI;AACnD,QAAM,YAAY,OAAO,UAAa,GAAG,SAAS,aAAa,GAAG,cAAc,KAAK;AAGrF,MAAI,cAAc,UAAa,eAAeA,OAAM,OAAO,SAAS,GAAG;AACnE,WAAO,gBAAgB,QAAQ,KAAK,KAAK,cAAc,SAAY,eAAeA,OAAM,OAAO,WAAW,SAAS,IAAI;AAAA,EAC3H;AAGA,QAAM,WAAW,gBAAgBA,OAAM,QAAQ,KAAK;AACpD,MAAI,aAAa,OAAW,QAAO,cAAcA,OAAM,OAAO,QAAQ,SAAS,OAAO,SAAS,MAAM;AAErG,MAAI,cAAc,OAAW,QAAO;AACpC,SAAO,SAAS,IAAI,aAAaA,OAAM,OAAO,QAAQ,OAAO,YAAY,IAAI;AACjF;AAQO,SAAS,cAAcA,OAAc,OAAyC;AACjF,MAAI,CAAC,UAAUA,OAAM,KAAK,EAAG,QAAO;AACpC,aAAW,SAAS,SAASA,OAAM,KAAKA,KAAI,GAAG,KAAK,EAAE,WAAW,GAAG;AAChE,QAAI,MAAM,aAAa,OAAW;AAClC,UAAM,WAAW,iBAAiB,KAAK,MAAM,QAAQ;AACrD,QAAI,aAAa,OAAW,QAAO;AACnC,WAAO,EAAE,UAAU,UAAU,eAAe,MAAM,QAAQ,iBAAiB,aAAa,UAAU,MAAM,MAAM,EAAE;AAAA,EACpH;AACA,SAAO;AACX;AAOO,SAAS,eAAeA,OAAc,OAAsC;AAC/E,MAAI,CAAC,UAAUA,OAAM,KAAK,EAAG,QAAO;AACpC,QAAM,SAAS,KAAKA,KAAI;AACxB,MAAI,OAAO,KAAK,OAAK,EAAE,QAAQ,SAAS,QAAQ,EAAE,GAAG,KAAK,OAAO,KAAK,OAAK,EAAE,gBAAgB,EAAE,QAAQ,KAAK,EAAG,QAAO;AACtH,QAAM,SAAS,OAAO,cAAc,OAAK,EAAE,OAAO,KAAK;AACvD,MAAI,CAAC,gBAAgB,QAAQ,SAAS,CAAC,KAAK,CAAC,iBAAiB,QAAQ,KAAK,EAAG,QAAO;AACrF,SAAO,EAAE,OAAO,OAAO,QAAQ,EAAE;AACrC;AAyBO,SAAS,cAAc,OAAkB,OAAwB;AACpE,MAAI,UAAU,OAAW,QAAO,MAAM,SAAS;AAC/C,MAAI,MAAM,WAAW,EAAG,OAAM,IAAI,WAAW,0BAA0B;AACvE,SAAO,GAAG,eAAe,KAAK,CAAC,IAAI,MAAM,SAAS,CAAC;AACvD;AAOO,SAASC,yBAAwBC,QAAeC,SAAwB;AAC3E,MAAID,OAAM,WAAW,EAAG,OAAM,IAAI,WAAW,0BAA0B;AACvE,MAAIC,QAAO,WAAW,EAAG,OAAM,IAAI,WAAW,2BAA2B;AACzE,SAAO,wBAAyBD,QAAOC,OAAM;AACjD;AAQO,SAAS,aAAa,OAAkC;AAC3D,UAAQ,MAAM,MAAM;AAAA,IAChB,KAAK;AACD,aAAO,IAAI,MAAM,KAAK,WAAW,KAAK,IAAI,CAAC;AAAA,IAC/C,KAAK;AACD,aAAO,YAAY,MAAM,QAAQ,QAAQ,WAAW,sBAAsB;AAAA,IAC9E,KAAK;AACD,aAAO,MAAM,UAAU,SAAS;AAAA,IACpC,KAAK;AACD,aAAO;AAAA,IACX;AACI,aAAOC,iBAAgB,MAAM,IAAI;AAAA,EACzC;AACJ;AAkCO,SAAS,WAAWF,QAAe,YAAwC,MAAgCC,SAAwB;AACtI,MAAI,OAAO,eAAe,UAAU;AAChC,QAAI,OAAO,IAAI,EAAG,OAAM,IAAI,UAAU,iCAAiC;AACvE,UAAM,WAAW,aAAa,IAAI;AAClC,QAAI,aAAa,OAAW,OAAM,IAAI,WAAW,QAAQ;AACzD,WAAO,WAAW,QAAQ,KAAKF,yBAAwBC,QAAO,UAAU,CAAC,KAAKD,yBAAwBC,QAAOC,OAAM,CAAC;AAAA,EACxH;AACA,MAAI,CAAC,OAAO,IAAI,EAAG,OAAM,IAAI,UAAU,0CAA0C;AACjF,MAAI,WAAW,WAAW,KAAK,WAAW,WAAW,KAAK,OAAQ,OAAM,IAAI,WAAW,uCAAuC;AAC9H,MAAI,WAAW,WAAW,EAAG,QAAO,WAAWD,QAAO,UAAU,YAAY,CAAC,GAAG,UAAU,MAAM,CAAC,GAAGC,OAAM;AAC1G,QAAM,QAAQ,WAAW,IAAI,CAAC,WAAW,MAAM;AAC3C,UAAM,WAAW,aAAa,UAAU,MAAM,CAAC,CAAC;AAChD,QAAI,aAAa,OAAW,OAAM,IAAI,WAAW,QAAQ;AACzD,WAAO,IAAIF,yBAAwBC,QAAO,SAAS,CAAC,IAAI,QAAQ;AAAA,EACpE,CAAC;AACD,SAAO,cAAc,MAAM,KAAK,GAAG,CAAC,KAAKD,yBAAwBC,QAAOC,OAAM,CAAC;AACnF;AAwBO,SAAS,YAAY,MAAgC,YAAyE;AACjI,MAAI,CAAC,OAAO,IAAI,GAAG;AACf,QAAI,OAAO,UAAU,EAAG,OAAM,IAAI,UAAU,qCAAqC;AACjF,WAAO,eAAe,UAAa,WAAW,SAAS,KAAK,QAAQ,CAAC,KAAK,WAAW,cAAc,YAAY,IAAI,MAAM;AAAA,EAC7H;AACA,MAAI,CAAC,OAAO,UAAU,EAAG,OAAM,IAAI,UAAU,mDAAmD;AAChG,MAAI,KAAK,WAAW,WAAW,OAAQ,QAAO;AAC9C,MAAI,KAAK,WAAW,EAAG,QAAO,YAAY,UAAU,MAAM,CAAC,GAAG,WAAW,CAAC,CAAC;AAC3E,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AAClC,UAAM,QAAQ,WAAW,CAAC;AAC1B,UAAM,MAAM,UAAU,MAAM,CAAC;AAC7B,QAAI,UAAU,UAAa,MAAM,SAAS,IAAI,QAAQ,IAAI,QAAS,QAAO;AAC1E,QAAI,cAAc,OAAO,KAAK,kBAAkB,MAAM,EAAG,QAAO;AAAA,EACpE;AACA,SAAO;AACX;AAmBO,SAAS,eAAeE,OAAc,gBAAwB,cAAkD;AACnH,MAAI,CAAC,OAAO,UAAU,cAAc,KAAK,iBAAiB,KAAK,iBAAiBA,MAAK,QAAQ;AACzF,UAAM,IAAI,WAAW,8CAA8C;AAAA,EACvE;AACA,MAAI,CAAC,OAAO,UAAU,YAAY,KAAK,eAAe,kBAAkB,eAAeA,MAAK,QAAQ;AAChG,UAAM,IAAI,WAAW,yDAAyD;AAAA,EAClF;AACA,MAAIA,MAAK,WAAW,KAAKA,MAAK,OAAO,CAAC,MAAM,IAAK,QAAO;AAIxD,QAAM,QAAQ,mBAAmB;AACjC,QAAM,UAAyB,CAAC;AAChC,aAAWC,UAAS,KAAKD,KAAI,GAAG;AAC5B,UAAM,UAAUC,OAAM,SAAS,gBAAgB,kBAAkBA,OAAM;AACvE,QAAI,CAAC,WAAWA,OAAM,SAAS,aAAaA,OAAM,gBAAgBA,OAAM,YAAa;AAErF,UAAM,YAAY,eAAeD,OAAMC,OAAM,KAAK;AAClD,QAAI,cAAc,UAAa,UAAU,QAAQ,UAAU,WAAWA,OAAM,IAAK;AACjF,eAAW,UAAU,UAAU,SAAS,GAAG;AACvC,UAAI,OAAO,QAAQ,gBAAgB,iBAAiB,OAAO,IAAK;AAChE,cAAQ,KAAK,MAAM;AACnB,UAAI,MAAO;AAAA,IACf;AACA,QAAI,SAAS,QAAQ,SAAS,EAAG;AAAA,EACrC;AACA,QAAM,QAAQ,QAAQ,CAAC;AACvB,MAAI,UAAU,OAAW,QAAO;AAEhC,QAAM,OAAO,SAAS,KAAK;AAC3B,MAAI,YAAY;AAChB,MAAI,KAAK;AAGT,QAAM,QAAQ,UAAU,MAAM,OAAO,CAAC,EAAE,KAAK;AAC7C,aAAW,UAAU,SAAS;AAC1B,eAAW,EAAE,MAAAC,OAAM,QAAAJ,QAAO,KAAK,OAAO,OAAO;AACzC,mBAAaE,MAAK,MAAM,IAAIE,MAAK,KAAK;AACtC,UAAIJ,UAAS,KAAK,SAAS,KAAK,IAAK,cAAa;AAClD,YAAMK,WAAUD,MAAK,MAAM,QAAQ,QAAQ,EAAE;AAC7C,mBAAaJ,UAAS,iBAAiBK,QAAO,IAAIA;AAClD,WAAKD,MAAK,QAAQA,MAAK,MAAM;AAAA,IACjC;AAAA,EACJ;AACA,QAAM,MAAM,UAAU;AACtB,eAAaF,MAAK,MAAM,EAAE;AAC1B,SAAO,EAAE,MAAM,WAAW,gBAAgB,OAAO,cAAc,IAAI;AACvE;AAgBO,SAAS,kBAAkBA,OAAc,WAAgD;AAC5F,QAAM,OAAOA,MAAK,OAAO,CAAC;AAC1B,MAAI,SAAS,OAAO,SAAS,OAAO,SAAS,IAAK,QAAO,CAAC;AAE1D,QAAM,aAAiC,CAAC;AACxC,aAAWC,UAAS,KAAKD,KAAI,GAAG;AAC5B,QAAIC,OAAM,SAAS,aAAaA,OAAM,aAAc;AACpD,UAAM,SAASA,OAAM,MAAMA,OAAM;AACjC,QAAIA,OAAM,aAAa;AACnB,YAAM,aAAa,wBAAwBD,OAAMC,OAAM,KAAK;AAC5D,UAAI,eAAe,UAAa,WAAW,WAAW,QAAQ;AAC1D,mBAAW,KAAK,EAAE,OAAOA,OAAM,OAAO,QAAQ,OAAO,QAAW,cAAc,IAAI,kBAAkB,WAAW,OAAO,WAAW,MAAM,EAAE,CAAC;AAAA,MAC9I;AACA;AAAA,IACJ;AACA,UAAMG,QAAO,qBAAqBJ,OAAMC,OAAM,OAAO,MAAM;AAC3D,QAAIG,UAAS,OAAW;AACxB,UAAM,YAAYA,MAAK,UAAU;AACjC,QAAI,cAAc,UAAa,CAAC,iBAAiB,WAAW,SAAS,EAAG;AACxE,UAAM,OAAOA,MAAK,UAAU;AAC5B,UAAM,QAAQ,IAAI,UAAU,IAAI,YAAY,KAAK,MAAM,KAAK,OAAO,GAAG,IAAI,YAAY,KAAK,MAAM,KAAK,OAAO,CAAC;AAC9G,eAAW,KAAK,EAAE,OAAOH,OAAM,OAAO,QAAQG,MAAK,QAAQ,OAAO,cAAc,OAAU,CAAC;AAAA,EAC/F;AACA,SAAO;AACX;AAEA,SAASL,iBAAgB,MAAoB;AACzC,QAAM,IAAI,MAAM,aAAa,OAAO,IAAI,CAAC,uBAAuB;AACpE;AAEA,SAAS,OAAU,OAAgD;AAC/D,SAAO,MAAM,QAAQ,KAAK;AAC9B;AAEA,SAAS,UAAUC,OAAc,OAAwB;AACrD,MAAI,CAAC,OAAO,UAAU,KAAK,KAAK,QAAQ,KAAK,QAAQA,MAAK,OAAQ,OAAM,IAAI,WAAW,sCAAsC;AAC7H,SAAOA,MAAK,SAAS,KAAKA,MAAK,OAAO,CAAC,MAAM,OAAO,SAAS;AACjE;AAMA,SAAS,eAAeA,OAAc,OAAeC,QAAuB;AACxE,QAAMI,QAAO,YAAYL,OAAM,KAAKC,OAAM,OAAOA,OAAM,GAAG;AAC1D,MAAII,QAAO,KAAK,SAASA,MAAM,QAAO;AACtC,MAAI,QAAQ;AACZ,WAAS,IAAIA,OAAM,IAAI,OAAO,KAAK;AAC/B,UAAM,IAAIL,MAAK,OAAO,CAAC;AACvB,QAAI,MAAM,KAAK;AACX;AACA;AAAA,IACJ;AACA,QAAI,MAAM,IAAK;AAAA,aACN,MAAM,OAAO,EAAE,UAAU,EAAG,QAAO;AAAA,EAChD;AACA,SAAO;AACX;AAGA,SAAS,YAAYA,OAAc,GAAW,MAAc,KAAqB;AAC7E,QAAM,QAAQA,MAAK,QAAQ,GAAG,IAAI;AAClC,SAAO,SAAS,KAAK,QAAQ,MAAM,QAAQ;AAC/C;AAGA,SAAS,aAAaA,OAAc,OAAe,QAA0B,OAAe,cAA+D;AACvJ,QAAMC,SAAQ,UAAU,QAAQ,KAAK;AACrC,MAAIA,OAAM,SAAS,aAAaA,OAAM,aAAc,QAAO;AAC3D,QAAM,SAASD,MAAK,MAAMC,OAAM,OAAO,KAAK;AAC5C,MAAI,CAACK,aAAY,KAAK,MAAM,KAAK,CAAC,gBAAgB,QAAQ,KAAK,EAAG,QAAO;AAGzE,MAAI,QAAQL,OAAM,KAAK;AACnB,UAAM,YAAY,cAAcD,OAAMC,OAAM,KAAK;AACjD,QAAI,cAAc,UAAaA,OAAM,QAAQ,UAAU,WAAWA,OAAM,IAAK,QAAO;AAAA,EACxF;AAEA,QAAM,aAAoC,CAAC;AAC3C,aAAW,KAAK,iBAAiB,KAAK;AAClC,QAAI,uBAAuB,EAAE,MAAM,GAAG,MAAM,EAAG,YAAW,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,YAAY,YAAY,GAAG,EAAE,IAAI,KAAK,aAAa,EAAE,YAAY,CAAC;AAAA,EAC3J;AACA,aAAW,KAAK,cAAc;AAC1B,QAAI,uBAAuB,GAAG,GAAG,MAAM,EAAG,YAAW,KAAK,EAAE,MAAM,GAAG,MAAM,eAAe,YAAY,GAAG,aAAa,OAAU,CAAC;AAAA,EACrI;AACA,SAAO,WAAW,WAAW,IACvB,SACA,EAAE,OAAOA,OAAM,OAAO,QAAQA,OAAM,MAAMA,OAAM,OAAO,YAAY,WAAW,SAAS,CAAC,GAAG,MAAM,kBAAkB,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;AAC9I;AAQA,SAAS,eAAeD,OAAc,OAAeC,QAAc,WAA2F;AAC1J,QAAMI,QAAO,YAAYL,OAAM,KAAKC,OAAM,OAAOA,OAAM,GAAG;AAC1D,MAAII,QAAO,KAAK,SAASA,MAAM,QAAO;AACtC,QAAMR,SAAQG,MAAK,MAAMC,OAAM,OAAOI,KAAI;AAC1C,MAAI,CAACC,aAAY,KAAKT,MAAK,EAAG,QAAO;AACrC,QAAM,UAAU,UAAUA,MAAK;AAC/B,MAAI,YAAY,UAAa,QAAQ,WAAW,EAAG,QAAO;AAE1D,MAAI,QAAQ;AACZ,MAAI,MAAM;AACV,WAAS,IAAIQ,QAAO,GAAG,IAAIJ,OAAM,KAAK,KAAK;AACvC,UAAM,IAAID,MAAK,OAAO,CAAC;AACvB,QAAI,MAAM,KAAK;AAEX,UAAI,IAAI,SAAS,IAAI,KAAK,MAAO,QAAO;AACxC,UAAI,IAAI,MAAO,UAASA,MAAK,OAAO,IAAI,CAAC;AACzC;AACA;AAAA,IACJ;AACA,QAAI,MAAM,KAAK;AACX,YAAM;AACN;AAAA,IACJ;AAGA,QAAI,MAAM,OAAQ,IAAI,UAAU,MAAM,OAAO,MAAM,KAAO,QAAO;AACjE,QAAI,IAAI,MAAO,UAAS;AAAA,EAC5B;AACA,MAAI,OAAO,KAAK,MAAM,MAAO,QAAO;AACpC,QAAM,aAAa,QACd,OAAO,CAAAF,YAAU,uBAAuBA,SAAQ,GAAG,KAAK,CAAC,EACzD,IAAI,CAACA,aAAiC,EAAE,MAAMA,SAAQ,MAAM,qBAAqB,YAAY,aAAaA,OAAM,GAAG,aAAa,OAAU,EAAE;AACjJ,QAAM,QAAQO,QAAO;AACrB,SAAO,WAAW,WAAW,IAAI,SAAY,EAAE,OAAO,SAAS,OAAO,IAAI,MAAM,SAAS,OAAO,WAAW;AAC/G;AAGA,SAAS,aAAaP,SAAwB;AAC1C,MAAI,UAAU;AACd,aAAW,KAAKA,SAAQ;AACpB,QAAI,eAAe,SAAS,CAAC,EAAG,YAAW;AAC3C,eAAW;AAAA,EACf;AACA,SAAO;AACX;AAQA,SAAS,gBAAgBE,OAAc,QAA0B,OAAgF;AAC7I,QAAM,OAAO,SAASA,OAAM,QAAQ,KAAK,EAAE,GAAG,EAAE;AAChD,MAAI,MAAM,aAAa,OAAW,QAAO;AACzC,QAAM,WAAW,iBAAiB,KAAK,KAAK,QAAQ;AACpD,MAAI,aAAa,OAAW,QAAO;AACnC,QAAM,SAAS,SAAS,SAAS,KAAK,MAAM;AAC5C,SAAO,OAAO,WAAW,IAAI,SAAY,EAAE,OAAO,KAAK,eAAe,OAAO;AACjF;AASA,SAAS,cAAcA,OAAc,OAAe,QAA0B,eAAuB,QAAiE;AAClK,MAAI,OAAO,KAAK,OAAK,EAAE,QAAQ,SAAS,QAAQ,EAAE,GAAG,EAAG,QAAO;AAC/D,MAAI,QAAQA,MAAK,UAAUA,MAAK,OAAO,KAAK,MAAM,OAAOA,MAAK,OAAO,KAAK,MAAM,IAAK,QAAO;AAE5F,MAAI,QAAQ;AACZ,SAAO,QAAQ,SAAS,aAAaA,MAAK,WAAW,KAAK,CAAC,EAAG;AAC9D,QAAM,QAAQA,MAAK,MAAM,OAAO,KAAK;AACrC,QAAMO,UAAS,SAAS,KAAK;AAC7B,MAAI;AACJ,MAAIA,YAAW,QAAW;AACtB,aAAS,OAAO,OAAO,OAAK,SAAS,EAAE,KAAK,MAAMA,OAAM;AAAA,EAC5D,OAAO;AACH,UAAMC,WAAU,OAAO,KAAK,OAAK,iBAAiB,EAAE,OAAO,mBAAmB,KAAK,CAAC,CAAC;AACrF,aAASA,aAAY,SAAY,SAAS,CAACA,QAAO;AAAA,EACtD;AACA,MAAI,OAAO,WAAW,EAAG,QAAO;AAChC,QAAM,aAAa,OAAO,IAAI,CAAC,OAA4B,EAAE,MAAM,EAAE,MAAM,MAAM,iBAAiB,YAAY,EAAE,OAAO,aAAa,OAAU,EAAE;AAChJ,SAAO,EAAE,OAAO,QAAQ,QAAQ,OAAO,WAAW;AACtD;AAGA,SAAS,mBAAmBR,OAAsB;AAC9C,MAAI,QAAQ;AACZ,MAAI,MAAMA,MAAK;AACf,SAAO,QAAQ,OAAO,aAAaA,MAAK,WAAW,KAAK,CAAC,EAAG;AAC5D,SAAO,MAAM,SAAS,aAAaA,MAAK,WAAW,MAAM,CAAC,CAAC,EAAG;AAC9D,SAAOA,MAAK,MAAM,OAAO,GAAG;AAChC;AAOA,SAAS,SAAS,OAAmC;AACjD,QAAM,QAAQ,oBAAoB,KAAK,KAAK;AAC5C,QAAM,SAAS,OAAO;AACtB,MAAI,WAAW,OAAW,QAAO;AACjC,QAAM,EAAE,MAAM,QAAAO,SAAQ,KAAK,IAAI;AAC/B,MAAI,SAAS,UAAaA,YAAW,UAAa,SAAS,OAAW,OAAM,IAAI,MAAM,0DAA0D;AAChJ,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AAClC,QAAI,CAAC,aAAa,KAAK,WAAW,CAAC,CAAC,EAAG,QAAO;AAAA,EAClD;AACA,QAAM,QAAQ,mBAAmBA,OAAM;AACvC,SAAO,SAAS,MAAM,CAAC,QAAQ;AACnC;AAGA,SAAS,SAASP,OAAc,QAA0B,OAAwB;AAC9E,QAAM,SAAkB,CAAC;AACzB,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACpC,UAAMC,SAAQ,UAAU,QAAQ,CAAC;AACjC,QAAIA,OAAM,MAAM,MAAO;AACvB,YAAQA,OAAM,MAAM;AAAA,MAChB,KAAK,QAAQ;AACT,cAAM,WAAW,IAAI,IAAI,UAAU,QAAQ,IAAI,CAAC,IAAI;AACpD,cAAM,OAAO,aAAa,SAAY,KAAKD,MAAK,MAAM,SAAS,OAAO,SAAS,GAAG;AAClF,cAAM,SAAS,aAAa,UAAa,SAAS,SAAS,aAAa,SAAS,QAAQC,OAAM,SAASK,aAAY,KAAK,IAAI,IAAI,OAAO;AACxI,eAAO,KAAK,EAAE,UAAU,QAAQ,QAAQ,GAAG,eAAeL,OAAM,IAAI,CAAC;AACrE;AAAA,MACJ;AAAA,MACA,KAAK;AACD,eAAO,IAAI;AACX;AAAA,MACJ,KAAK,SAAS;AACV,cAAM,QAAQ,OAAO,IAAI;AACzB,YAAI,UAAU,OAAW,QAAO,KAAK,EAAE,UAAU,MAAM,UAAU,QAAQ,MAAM,SAAS,GAAG,eAAeA,OAAM,IAAI,CAAC;AACrH;AAAA,MACJ;AAAA,MACA,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACD;AAAA,MACJ;AACI,eAAO,iBAAiBA,OAAM,IAAI;AAAA,IAC1C;AAAA,EACJ;AACA,SAAO;AACX;AAEA,SAAS,iBAAiB,MAAoB;AAC1C,QAAM,IAAI,MAAM,aAAa,OAAO,IAAI,CAAC,uBAAuB;AACpE;AAEA,SAAS,aAAa,UAA4B,OAAmC;AACjF,QAAM,QAAQ,SAAS,UAAU,MAAM,IAAI;AAC3C,QAAM,OAAO,UAAU,OAAO,MAAM,SAAS,CAAC;AAC9C,MAAI,QAAQ,MAAM,UAAU,UAAU,OAAO,KAAK,MAAM,MAAO,QAAO,UAAU,OAAO,KAAK;AAC5F,MAAI,SAAS,OAAO;AAChB,UAAM,aAAa,aAAa,SAAS,IAAI;AAC7C,QAAI,YAAY,YAAY,KAAM,QAAO,UAAU,OAAO,WAAW,cAAc,QAAQ,WAAW,cAAc,CAAC;AACrH,WAAO,UAAU,OAAO,MAAM,SAAS,CAAC;AAAA,EAC5C;AACA,SAAO;AACX;AAGA,SAAS,UAAU,WAA0C;AACzD,QAAM,MAAM,UAAU,QAAQ,UAAU;AACxC,QAAMQ,SAAQ,CAAC,SAAiD,UAAU,OAAO,IAAI;AACrF,QAAM,WAAW,CAAC,SAAqC;AACnD,UAAMP,QAAOO,OAAM,IAAI;AACvB,QAAIP,UAAS,OAAW,OAAM,IAAI,MAAM,+CAA+C,IAAI,GAAG;AAC9F,WAAOA;AAAA,EACX;AACA,MAAIO,OAAM,KAAK,MAAM,QAAW;AAC5B,WAAO,CAAC,EAAE,OAAO,UAAU,OAAO,KAAK,OAAO,MAAM,OAAO,CAAC,EAAE,MAAM,SAAS,KAAK,GAAG,QAAQ,KAAK,GAAG,EAAE,MAAM,SAAS,KAAK,GAAG,QAAQ,KAAK,CAAC,EAAE,CAAC;AAAA,EACnJ;AACA,MAAIA,OAAM,KAAK,MAAM,QAAW;AAC5B,WAAO,CAAC,EAAE,OAAO,UAAU,OAAO,KAAK,OAAO,MAAM,OAAO,CAAC,EAAE,MAAM,SAAS,KAAK,GAAG,QAAQ,MAAM,GAAG,EAAE,MAAM,SAAS,KAAK,GAAG,QAAQ,MAAM,CAAC,EAAE,CAAC;AAAA,EACrJ;AACA,QAAM,KAAK,SAAS,IAAI;AACxB,QAAM,KAAK,SAAS,IAAI;AACxB,QAAM,UAAyB,CAAC,EAAE,OAAO,UAAU,OAAO,KAAK,GAAG,QAAQ,GAAG,MAAM,QAAQ,OAAO,OAAO,OAAO,CAAC,EAAE,MAAM,IAAI,QAAQ,KAAK,GAAG,EAAE,MAAM,IAAI,QAAQ,MAAM,CAAC,EAAE,CAAC;AAC3K,QAAM,KAAKA,OAAM,IAAI;AACrB,MAAI,OAAO,QAAW;AAClB,UAAM,KAAK,SAAS,IAAI;AACxB,YAAQ,KAAK,EAAE,OAAO,GAAG,OAAO,KAAK,GAAG,QAAQ,GAAG,MAAM,QAAQ,OAAO,OAAO,OAAO,CAAC,EAAE,MAAM,IAAI,QAAQ,KAAK,GAAG,EAAE,MAAM,IAAI,QAAQ,MAAM,CAAC,EAAE,CAAC;AAAA,EACrJ;AACA,SAAO;AACX;AAOA,SAAS,SAAS,QAAwD;AACtE,QAAM,gBAAgB,UAAU,OAAO,OAAO,CAAC,EAAE,KAAK,MAAM,WAAW,GAAG;AAC1E,MAAI,OAAO,MAAO,QAAO,gBAAgB,EAAE,QAAQ,OAAO,KAAK,MAAM,IAAI,EAAE,QAAQ,MAAM,KAAK,KAAK;AACnG,QAAM,iBAAiB,UAAU,OAAO,OAAO,CAAC,EAAE,KAAK,MAAM,WAAW,GAAG;AAC3E,MAAI,CAAC,iBAAiB,CAAC,eAAgB,QAAO,EAAE,QAAQ,MAAM,KAAK,KAAK;AACxE,MAAI,iBAAiB,eAAgB,QAAO,EAAE,QAAQ,OAAO,KAAK,KAAK;AACvE,MAAI,CAAC,cAAe,QAAO,EAAE,QAAQ,MAAM,KAAK,MAAM;AACtD,SAAO,EAAE,QAAQ,OAAO,KAAK,MAAM;AACvC;AAQA,SAAS,qBAAqBT,OAAc,OAAe,QAAkD;AACzG,QAAMU,SAAQ,cAAcV,OAAM,KAAK;AACvC,MAAIU,WAAU,UAAaA,OAAM,WAAW,OAAQ,QAAOA;AAC3D,QAAM,OAAOV,MAAK,YAAY,KAAK,QAAQ,SAAS,CAAC;AACrD,QAAM,OAAO,QAAQ,QAAQ,OAAO,IAAI;AACxC,QAAM,QAAQ,YAAYA,OAAM,KAAK,MAAM,QAAQ,MAAM;AACzD,MAAI,SAAS,SAAS,CAAC,kBAAkB,KAAKA,MAAK,MAAM,QAAQ,GAAG,QAAQ,MAAM,CAAC,EAAG,QAAO;AAC7F,QAAM,QAAQ,cAAcA,MAAK,MAAM,GAAG,KAAK,GAAG,KAAK;AACvD,SAAO,UAAU,UAAa,MAAM,WAAW,QAAQ,QAAQ,QAAQ;AAC3E;AAGA,SAAS,gBAAgB,QAA0B,OAAwB;AACvE,MAAI,UAAU,EAAG,QAAO;AACxB,QAAM,WAAW,UAAU,QAAQ,QAAQ,CAAC;AAC5C,SAAO,SAAS,SAAS,UAAU,SAAS,SAAS,WAAY,SAAS,SAAS,cAAc,SAAS,SAAS;AACvH;AAGA,SAAS,iBAAiB,QAA0B,OAAwB;AACxE,QAAM,OAAO,OAAO,KAAK,OAAK,EAAE,SAAS,KAAK;AAC9C,SAAO,SAAS,UAAa,KAAK,SAAS,WAAW,KAAK,SAAS,WAAW,KAAK,SAAS;AACjG;AAEA,SAAS,UAAU,MAAiB,OAAe,KAAaA,OAAc,eAAe,OAAO,cAAc,OAAc;AAC5H,SAAO,EAAE,MAAM,OAAO,KAAK,MAAAA,OAAM,cAAc,YAAY;AAC/D;AAOA,SAAS,KAAKA,OAAuB;AACjC,QAAM,SAAkB,CAAC;AACzB,MAAI,IAAI;AACR,SAAO,IAAIA,MAAK,QAAQ;AACpB,UAAM,IAAIA,MAAK,OAAO,CAAC;AACvB,QAAI,aAAaA,MAAK,WAAW,CAAC,CAAC,GAAG;AAClC;AACA;AAAA,IACJ;AACA,UAAM,QAAQ;AACd,QAAI,MAAM,KAAK;AACX;AACA,UAAI,SAAS;AACb,aAAO,IAAIA,MAAK,QAAQ;AACpB,YAAIA,MAAK,OAAO,CAAC,MAAM,KAAK;AACxB,cAAI,IAAI,IAAIA,MAAK,UAAUA,MAAK,OAAO,IAAI,CAAC,MAAM,KAAK;AACnD,iBAAK;AACL;AAAA,UACJ;AACA;AACA,mBAAS;AACT;AAAA,QACJ;AACA;AAAA,MACJ;AACA,aAAO,KAAK,UAAU,QAAQ,OAAO,GAAGA,MAAK,MAAM,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;AACtE;AAAA,IACJ;AACA,QAAI,MAAM,OAAO,MAAM,OAAO,MAAM,KAAK;AACrC,aAAO,KAAK,UAAU,MAAM,MAAM,SAAS,MAAM,MAAM,UAAU,SAAS,GAAG,IAAI,GAAG,CAAC,CAAC;AACtF;AACA;AAAA,IACJ;AACA,UAAM,KAAKW,WAAU,KAAK,OAAK,aAAaX,OAAM,GAAG,CAAC,CAAC;AACvD,QAAI,OAAO,QAAW;AAClB,aAAO,KAAK,UAAU,YAAY,GAAG,IAAI,GAAG,QAAQ,EAAE,CAAC;AACvD,WAAK,GAAG;AACR;AAAA,IACJ;AAGA,QAAI,MAAM,KAAK;AACX;AACA,aAAO,IAAIA,MAAK,WAAW,qBAAqBA,MAAK,WAAW,CAAC,CAAC,KAAK,OAAO,SAASA,MAAK,OAAO,CAAC,CAAC,GAAI;AACzG,aAAO,KAAK,UAAU,WAAW,OAAO,GAAGA,MAAK,MAAM,OAAO,CAAC,CAAC,CAAC;AAChE;AAAA,IACJ;AAIA,QAAI,eAAe;AACnB,QAAI,WAAW;AACf,WAAO,IAAIA,MAAK,UAAU,CAAC,cAAc;AACrC,YAAM,IAAIA,MAAK,OAAO,CAAC;AACvB,UAAI,MAAM,KAAK;AACX;AACA,uBAAe;AACf,eAAO,IAAIA,MAAK,QAAQ;AACpB,cAAIA,MAAK,OAAO,CAAC,MAAM,OAAO,EAAE,IAAI,IAAIA,MAAK,UAAUA,MAAK,OAAO,IAAI,CAAC,MAAM,MAAM;AAChF;AACA,2BAAe;AACf;AAAA,UACJ;AACA,eAAKA,MAAK,OAAO,CAAC,MAAM,MAAM,IAAI;AAAA,QACtC;AACA;AAAA,MACJ;AACA,UAAI,MAAM,KAAK;AACX,mBAAW;AACX,YAAI,QAAQ;AACZ,uBAAe;AACf,eAAO,IAAIA,MAAK,QAAQ;AACpB,cAAIA,MAAK,OAAO,CAAC,MAAM,OAAO,IAAI,IAAIA,MAAK,QAAQ;AAC/C,iBAAK;AACL;AAAA,UACJ;AACA,cAAIA,MAAK,OAAO,CAAC,MAAM,IAAK;AAAA,mBACnBA,MAAK,OAAO,CAAC,MAAM,OAAO,EAAE,UAAU,GAAG;AAC9C;AACA,2BAAe;AACf;AAAA,UACJ;AACA;AAAA,QACJ;AACA;AAAA,MACJ;AACA,UAAI,aAAaA,MAAK,WAAW,CAAC,CAAC,KAAK,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAOW,WAAU,KAAK,OAAK,EAAE,OAAO,CAAC,MAAM,CAAC,EAAG;AACpI;AAAA,IACJ;AACA,QAAI,MAAM,MAAO;AACjB,WAAO,KAAK,UAAU,WAAW,OAAO,GAAGX,MAAK,MAAM,OAAO,CAAC,GAAG,cAAc,QAAQ,CAAC;AAAA,EAC5F;AACA,SAAO;AACX;;;ACn4BA,IAAM,MAAa,EAAE,MAAM,GAAG,SAAS,EAAE;AAEzC,IAAM,kBAAkB,oBAAI,IAAI,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,MAAM,KAAK,KAAK,MAAM,IAAI,CAAC;AAGxF,SAAS,WAAW,MAAY,SAA+D;AAClG,UAAQ,KAAK,MAAM;AAAA,IACf,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACD,aAAO;AAAA,IACX,KAAK,aAAa;AACd,YAAM,YAAY,KAAK;AACvB,UAAI,UAAU,WAAW,UAAU,YAAY,CAAC,QAAQ,SAAS,EAAG,QAAO;AAC3E,YAAM,OAAO,UAAU;AACvB,aAAO,KAAK,OAAO,KAAK,WAAW,WAAW,YAAY,EAAE,MAAM,KAAK,MAAM,SAAS,KAAK,QAAQ,IAAI;AAAA,IAC3G;AAAA,IACA,KAAK;AACD,aAAO,WAAW,KAAK,OAAO,OAAO;AAAA,IACzC,KAAK;AAAA,IACL,KAAK;AACD,aAAO,WAAW,KAAK,SAAS,OAAO;AAAA,IAC3C,KAAK,UAAU;AAEX,YAAM,QAAQ,KAAK;AACnB,UAAI,QAA2B,WAAW,KAAK,UAAU,OAAO;AAChE,UAAI,UAAU,OAAW,QAAO;AAChC,iBAAWY,WAAU,OAAO;AACxB,YAAI,CAAC,gBAAgB,IAAIA,QAAO,QAAQ,EAAG,QAAO;AAClD,cAAMC,SAAQ,WAAWD,QAAO,OAAO,OAAO;AAC9C,YAAIC,WAAU,OAAW,QAAO;AAChC,cAAM,OAAe,MAAM,SAAS,IAAIA,OAAM,OAAOA,OAAM,SAAS,IAAI,MAAM,OAAO,KAAK,IAAI,MAAM,MAAMA,OAAM,IAAI;AACpH,cAAM,UAAkB,MAAM,YAAY,IAAIA,OAAM,UAAUA,OAAM,YAAY,IAAI,MAAM,UAAU,KAAK,IAAI,MAAM,SAASA,OAAM,OAAO;AACzI,YAAI,OAAO,UAAU,WAAW,UAAW,QAAO;AAClD,gBAAQ,EAAE,MAAM,QAAQ;AAAA,MAC5B;AACA,aAAO;AAAA,IACX;AAAA,IACA,KAAK,YAAY;AACb,YAAM,aAAa,KAAK;AACxB,UAAI,eAAe,OAAW,QAAO;AACrC,YAAM,QAAQ,KAAK,UAAU,CAAC;AAC9B,UAAI,iBAAiB,KAAK,MAAM,WAAW,KAAK,KAAK,UAAU,WAAW,KAAK,UAAU,QAAW;AAChG,cAAM,QAAQ,WAAW,OAAO,OAAO;AACvC,eAAO,UAAU,SAAY,SAAY,EAAE,MAAM,MAAM,SAAS,SAAS,MAAM,KAAK;AAAA,MACxF;AACA,UAAI,WAAW,oBAAoB,iBAAiB,KAAK,MAAM,UAAU,EAAG,QAAO;AACnF,aAAO,KAAK,UAAU,MAAM,OAAK,MAAM,WAAW,GAAG,OAAO,CAAC,CAAC,IAAI,MAAM;AAAA,IAC5E;AAAA,IACA,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACD,aAAO;AAAA,IACX;AACI,YAAM,IAAI,MAAM,aAAa,OAAO,IAAI,CAAC,sBAAsB;AAAA,EACvE;AACJ;AAEA,SAAS,MAAM,OAAmC;AAC9C,SAAO,UAAU,UAAa,MAAM,SAAS,KAAK,MAAM,YAAY;AACxE;;;ACvEO,IAAM,iBAAN,MAAM,gBAAe;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAET,YAAYC,OAAiB,OAAeC,QAAe,UAAmB;AAC1E,SAAK,OAAOD;AACZ,SAAK,QAAQ;AACb,SAAK,QAAQC;AACb,SAAK,WAAW;AAAA,EACpB;AAAA,EAEA,IAAI,OAAe;AACf,WAAO,KAAK,SAAS,SAAS,WAAW;AAAA,EAC7C;AAAA,EAEA,IAAI,OAAe;AACf,WAAO,KAAK,OAAO;AAAA,EACvB;AAAA,EAEA,IAAI,OAAe;AACf,WAAO,KAAK,QAAQ,KAAK,QAAQ;AAAA,EACrC;AAAA;AAAA,EAGA,IAAI,UAA0B;AAC1B,WAAO,IAAI,gBAAe,KAAK,MAAM,KAAK,OAAO,KAAK,OAAO,CAAC,KAAK,QAAQ;AAAA,EAC/E;AAAA,EAEA,OAAO,OAAgC;AACnC,WAAO,KAAK,SAAS,MAAM,QAAQ,KAAK,UAAU,MAAM,SAAS,KAAK,UAAU,MAAM,SAAS,KAAK,aAAa,MAAM;AAAA,EAC3H;AAAA,EAEA,WAAmB;AACf,UAAM,OAAO,KAAK,SAAS,SAAS,QAAQ;AAC5C,UAAM,KAAK,KAAK,SAAS,SAAS,OAAO,KAAK,QAAQ,CAAC,IAAI,YAAY,WAAW,KAAK,KAAK;AAC5F,WAAO,GAAG,KAAK,WAAW,cAAc,UAAU,IAAI,OAAO,KAAK,KAAK,CAAC,IAAI,IAAI,GAAG,KAAK,UAAU,IAAI,KAAK,GAAG,OAAO,EAAE;AAAA,EAC3H;AAAA;AAAA,EAGA,WAAiB;AACb,UAAM,OAAO,KAAK,SAAS,SAAS,QAAQ;AAC5C,QAAI,CAAC,OAAO,UAAU,KAAK,KAAK,KAAK,KAAK,QAAQ,KAAK,KAAK,SAAS,KAAK,KAAM,OAAM,IAAI,WAAW,KAAK,IAAI,YAAY,OAAO,KAAK,IAAI,CAAC,GAAG;AAC9I,QAAI,CAAC,OAAO,UAAU,KAAK,KAAK,KAAK,KAAK,QAAQ,KAAK,KAAK,QAAQ,KAAK,OAAO,KAAK,OAAO;AACxF,YAAM,IAAI,WAAW,qBAAqB,OAAO,KAAK,OAAO,KAAK,KAAK,CAAC,QAAQ;AAAA,IACpF;AAAA,EACJ;AAAA;AAAA,EAGA,KAAK,SAA+C;AAChD,UAAM,IAAI,KAAK,SAAS,SAAS,QAAQ,MAAM,QAAQ;AACvD,QAAIC;AACJ,QAAI,KAAK,UAAU;AACf,UAAI,IAAI,KAAK,MAAO,QAAO;AAC3B,MAAAA,SAAQ,IAAI,KAAK;AACjB,UAAIA,SAAQ,KAAK,KAAM,QAAO;AAAA,IAClC,OAAO;AACH,UAAI,IAAI,KAAK,MAAO,QAAO;AAC3B,UAAI,KAAK,KAAK,KAAM,QAAO;AAC3B,MAAAA,SAAQ,IAAI,KAAK;AAAA,IACrB;AACA,WAAO,KAAK,SAAS,SAAS,IAAI,YAAYA,QAAO,QAAQ,MAAM,IAAI,IAAI,YAAY,QAAQ,KAAKA,MAAK;AAAA,EAC7G;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,IAAI,WAAsB,OAA+C;AACrE,QAAI,CAAC,MAAM,QAAQ,SAAS,EAAG,QAAO;AACtC,UAAM,OAAO,KAAK,SAAS;AAC3B,QAAI,QAAQ,UAAU,UAAU,UAAW,QAAO;AAClD,QAAI,CAAC,QAAQ,UAAU,UAAU,OAAQ,QAAO;AAChD,UAAM,KAAK,OAAO,UAAU,OAAO,UAAU;AAC7C,UAAM,KAAK,OAAO,UAAU,OAAO,UAAU;AAE7C,QAAI,UAAU,UAAU,UAAU,OAAO,KAAK,OAAO,KAAK,KAAM,QAAO;AAEvE,QAAI;AACJ,QAAI;AACJ,QAAI,KAAK,UAAU;AACf,UAAI,MAAM,KAAK,OAAO;AAClB,aAAK,KAAK,KAAK;AACf,aAAK,KAAK,KAAK;AAAA,MACnB,WAAW,MAAM,KAAK,OAAO;AACzB,aAAK;AACL,aAAK,KAAK,KAAK;AAAA,MACnB,OAAO;AACH,eAAO;AAAA,MACX;AACA,UAAI,KAAK,KAAK,KAAM,QAAO;AAC3B,UAAI,KAAK,KAAK,KAAM,MAAK,KAAK;AAAA,IAClC,OAAO;AACH,UAAI,KAAK,KAAK,MAAO,QAAO;AAC5B,UAAI,MAAM,KAAK,SAAS,MAAM,KAAK,KAAM,QAAO;AAChD,WAAK,KAAK,KAAK,QAAQ,KAAK,KAAK,KAAK,OAAO,KAAK,KAAK,QAAQ,KAAK;AACpE,WAAK,KAAK,KAAK,OAAO,KAAK,KAAK,QAAQ,KAAK,QAAQ;AAAA,IACzD;AACA,WAAO,OAAO,UAAU,KAAK,EAAE,MAAM,IAAI,MAAM,GAAG,CAAC,IAAI,UAAU,KAAK,EAAE,SAAS,IAAI,SAAS,GAAG,CAAC;AAAA,EACtG;AAAA;AAAA,EAGA,QAAQ,WAAsB,OAAiC;AAC3D,WAAO,MAAM,QAAQ,SAAS,MAAM,KAAK,SAAS,SAAS,UAAU,KAAK,OAAO,UAAU,KAAK,YAAY,KAAK;AAAA,EACrH;AACJ;;;ACzHO,IAAM,YAAN,MAAgB;AAAA,EACV;AAAA,EAEA;AAAA,EAET,YAAY,OAAc,SAAsB;AAC5C,SAAK,QAAQ;AACb,SAAK,UAAU;AAAA,EACnB;AAAA;AAAA,EAGA,IAAI,MAAc;AACd,WAAO,GAAG,OAAO,KAAK,MAAM,EAAE,CAAC,IAAI,OAAO,KAAK,QAAQ,GAAG,CAAC;AAAA,EAC/D;AACJ;AAGO,IAAM,eAAN,MAAkD;AAAA,EAC5C,SAAS,oBAAI,IAAuB;AAAA,EAE7C,YAAY,QAA6B,CAAC,GAAG;AACzC,eAAW,QAAQ,MAAO,MAAK,IAAI,IAAI;AAAA,EAC3C;AAAA;AAAA,EAGA,IAAI,MAA0B;AAC1B,UAAM,MAAM,KAAK;AACjB,QAAI,KAAK,OAAO,IAAI,GAAG,EAAG,QAAO;AACjC,SAAK,OAAO,IAAI,KAAK,IAAI;AACzB,WAAO;AAAA,EACX;AAAA,EAEA,OAAO,OAAkC;AACrC,eAAW,QAAQ,MAAO,MAAK,IAAI,IAAI;AAAA,EAC3C;AAAA,EAEA,IAAI,MAA0B;AAC1B,WAAO,KAAK,OAAO,IAAI,KAAK,GAAG;AAAA,EACnC;AAAA,EAEA,OAAO,MAA0B;AAC7B,WAAO,KAAK,OAAO,OAAO,KAAK,GAAG;AAAA,EACtC;AAAA,EAEA,IAAI,OAAe;AACf,WAAO,KAAK,OAAO;AAAA,EACvB;AAAA,EAEA,CAAC,OAAO,QAAQ,IAAyB;AACrC,WAAO,KAAK,OAAO,OAAO;AAAA,EAC9B;AACJ;AAGO,IAAM,eAAN,MAA0D;AAAA,EACpD,SAAS,oBAAI,IAA4B;AAAA,EAElD,IAAI,MAAgC;AAChC,WAAO,KAAK,OAAO,IAAI,KAAK,GAAG,IAAI,CAAC;AAAA,EACxC;AAAA,EAEA,IAAI,MAA0B;AAC1B,WAAO,KAAK,OAAO,IAAI,KAAK,GAAG;AAAA,EACnC;AAAA,EAEA,IAAI,MAAiB,OAAgB;AACjC,UAAM,MAAM,KAAK;AACjB,UAAM,OAAO,KAAK,OAAO,IAAI,GAAG;AAChC,QAAI,SAAS,OAAW,MAAK,OAAO,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;AAAA,QACrD,MAAK,CAAC,IAAI;AAAA,EACnB;AAAA,EAEA,OAAO,MAA0B;AAC7B,WAAO,KAAK,OAAO,OAAO,KAAK,GAAG;AAAA,EACtC;AAAA,EAEA,IAAI,OAAe;AACf,WAAO,KAAK,OAAO;AAAA,EACvB;AAAA,EAEA,CAAC,OAAO,QAAQ,IAA8B;AAC1C,WAAO,KAAK,OAAO,OAAO;AAAA,EAC9B;AACJ;;;ACvEO,IAAM,mBAAN,MAAuB;AAAA;AAAA,EAEjB;AAAA;AAAA,EAGA;AAAA,EAET,YAAY,OAAe,MAA4B;AACnD,SAAK,QAAQ;AACb,SAAK,OAAO;AAAA,EAChB;AAAA;AAAA,EAGA,IAAI,WAAoB;AACpB,WAAO;AAAA,EACX;AAAA;AAAA,EAGA,IAAI,cAAuB;AACvB,WAAO,KAAK,SAAS;AAAA,EACzB;AAAA;AAAA,EAGA,OAAO,OAAkC;AACrC,WAAO,KAAK,UAAU,MAAM,SAAS,KAAK,SAAS,MAAM;AAAA,EAC7D;AACJ;AAMO,IAAM,cAAN,MAAM,aAAY;AAAA;AAAA,EAEZ;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA;AAAA;AAAA,EAGT,YAAY,cAAsC,cAAsC,MACpF,UAA6B,CAAC,GAAG,uBAAuB,OAAO;AAC/D,SAAK,eAAe;AACpB,SAAK,eAAe;AACpB,SAAK,OAAO;AACZ,SAAK,UAAU;AACf,SAAK,uBAAuB;AAAA,EAChC;AAAA;AAAA,EAGA,OAAgB,OAAO,IAAI,aAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAAA;AAAA,EAGjD,0BAAuC;AACnC,WAAO,KAAK,uBAAuB,OAAO,IAAI,aAAY,KAAK,cAAc,KAAK,cAAc,KAAK,MAAM,KAAK,SAAS,IAAI;AAAA,EACjI;AAAA;AAAA,EAGA,OAAO,MAAM,SAA6C;AACtD,UAAM,OAAO,CAAC,GAAG,OAAO;AACxB,UAAM,eAAe,kBAAkB,KAAK,QAAQ,OAAK,EAAE,YAAY,CAAC;AACxE,UAAM,eAAe,kBAAkB,KAAK,QAAQ,OAAK,EAAE,YAAY,CAAC;AACxE,UAAM,OAAO,gBAAgB,KAAK,QAAQ,OAAK,EAAE,IAAI,CAAC;AACtD,UAAM,UAAU,gBAAgB,KAAK,QAAQ,OAAK,EAAE,OAAO,CAAC;AAC5D,UAAM,YAAY,KAAK,KAAK,OAAK,EAAE,oBAAoB;AACvD,WAAO,aAAa,WAAW,KAAK,aAAa,WAAW,KAAK,KAAK,WAAW,KAAK,QAAQ,WAAW,KAAK,CAAC,YACzG,aAAY,OACZ,IAAI,aAAY,cAAc,cAAc,MAAM,SAAS,SAAS;AAAA,EAC9E;AACJ;AAGO,SAAS,kBAAkB,WAAiD;AAC/E,QAAM,OAAO,oBAAI,IAAY;AAC7B,aAAW,WAAW,UAAW,MAAK,IAAI,QAAQ,GAAG;AACrD,SAAO,CAAC,GAAG,IAAI,EAAE,SAAS,CAAC,GAAG,MAAM,IAAI,CAAC,EAAE,IAAI,SAAO,YAAY,QAAQ,GAAG,CAAC;AAClF;AAGO,SAAS,gBAAgB,SAAqC;AACjE,SAAO,CAAC,GAAG,IAAI,IAAI,OAAO,CAAC,EAAE,SAAS,CAAC,GAAG,MAAM,IAAI,CAAC;AACzD;AAwBO,IAAM,eAAN,MAAmB;AAAA;AAAA,EAEb;AAAA;AAAA,EAGA;AAAA,EAET,YAAY,QAA4B,SAAiB;AACrD,SAAK,SAAS;AACd,SAAK,UAAU;AAAA,EACnB;AAAA;AAAA,EAGA,OAAO,OAA8B;AACjC,WAAO,KAAK,WAAW,MAAM,UAAU,KAAK,YAAY,MAAM;AAAA,EAClE;AACJ;AAGO,IAAM,oBAAN,cAAgC,MAAM;AAAA;AAAA,EAEhC;AAAA,EAET,YAAY,SAAuB;AAC/B,UAAM,QAAQ,OAAO;AACrB,SAAK,UAAU;AACf,SAAK,OAAO;AAAA,EAChB;AACJ;AAQO,IAAM,mBAAN,cAA+B,MAAM;AAAA;AAAA,EAE/B;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAGT,YAAYC,QAAe,YAA+B,MAAwB,UAAkB,SAA2B,WAC3H,QAAqB;AACrB,UAAM,SAASA,QAAO,YAAY,MAAM,UAAU,SAAS,SAAS,CAAC;AACrE,SAAK,OAAO;AACZ,SAAK,QAAQA;AACb,SAAK,aAAa;AAClB,SAAK,OAAO;AACZ,SAAK,YAAY,WAAW,KAAK,IAAI;AACrC,UAAM,QAAQ,KAAK,CAAC;AACpB,QAAI,UAAU,OAAW,OAAM,IAAI,MAAM,mDAAmD;AAC5F,SAAK,MAAM;AACX,SAAK,WAAW;AAChB,SAAK,YAAY;AACjB,SAAK,SAAS;AACd,SAAK,UAAU;AAAA,EACnB;AACJ;AAEA,SAAS,SAASA,QAAe,YAA+B,MAAwB,UAAkB,SAA2B,WAA2B;AAC5J,QAAM,MAAM,KAAK,IAAI,OAAO,EAAE,KAAK,IAAI;AACvC,QAAM,SAAS,QAAQ,IAAI,OAAO,EAAE,KAAK,IAAI;AAC7C,QAAM,OAAO,KAAK,WAAW,QAAQ,UAAU,KAAK,MAAM,CAAC,GAAG,MAAM,QAAQ,CAAC,GAAG,OAAO,CAAC,MAAM,IAAI;AAClG,QAAM,OAAO,OACP,SAAS,GAAG,YAAY,OAAO,QAAQ,CAAC,QAAQ,OAAO,SAAS,CAAC,KACjE,SAAS,GAAG,WAAW,OAAO,QAAQ,CAAC,QAAQ,MAAM,WAAW,OAAO,SAAS,CAAC,WAAW,KAAK,WAAW,IAAI,YAAY,YAAY;AAC9I,QAAM,UAAU,WAAW,WAAW,IAAI,mBAAmB,OAAO,WAAW,CAAC,CAAC,CAAC,MAAM,mBAAmB,WAAW,IAAI,OAAK,IAAI,CAAC,GAAG,EAAE,KAAK,IAAI,CAAC;AACnJ,SAAO,oBAAoBA,MAAK,iBAAiB,OAAO,IAAI,IAAI;AACpE;AAGA,SAAS,QAAQ,KAAoB;AACjC,UAAQ,IAAI,MAAM;AAAA,IACd,KAAK;AAAQ,aAAO,IAAI,IAAI,KAAK,WAAW,KAAK,IAAI,CAAC;AAAA,IACtD,KAAK;AAAU,aAAO,gBAAgB,IAAI,MAAM;AAAA,IAChD,KAAK;AAAA,IACL,KAAK;AACD,aAAO,IAAI,UAAU,SAAS;AAAA,IAClC;AAAS,YAAM,IAAI,MAAM,aAAa,OAAO,IAAI,IAAI,CAAC,uBAAuB;AAAA,EACjF;AACJ;;;AC1NO,IAAM,oBAAN,MAAwB;AAAA;AAAA,EAElB;AAAA;AAAA,EAGA;AAAA;AAAA,EAGA;AAAA;AAAA,EAGA;AAAA;AAAA,EAGA;AAAA;AAAA,EAGA;AAAA;AAAA,EAGA;AAAA,EAET,YACI,SACA,OACA,cACA,WACA,MACA,MACA,SACF;AACE,SAAK,UAAU;AACf,SAAK,QAAQ;AACb,SAAK,eAAe;AACpB,SAAK,YAAY;AACjB,SAAK,OAAO;AACZ,SAAK,OAAO;AACZ,SAAK,UAAU;AAAA,EACnB;AACJ;AAMO,IAAM,0BAAN,MAA8B;AAAA;AAAA,EAExB;AAAA;AAAA,EAGA;AAAA;AAAA,EAGA;AAAA;AAAA,EAGA;AAAA;AAAA,EAGA;AAAA;AAAA,EAGA;AAAA;AAAA,EAGA;AAAA,EAET,YACI,OACA,MACA,cACA,WACA,MACA,MACA,SACF;AACE,SAAK,QAAQ;AACb,SAAK,OAAO;AACZ,SAAK,eAAe;AACpB,SAAK,YAAY;AACjB,SAAK,OAAO;AACZ,SAAK,OAAO;AACZ,SAAK,UAAU;AAAA,EACnB;AAAA;AAAA,EAGA,IAAI,QAAoB;AACpB,WAAO,IAAI,WAAW,KAAK,cAAc,KAAK,WAAW,KAAK,MAAM,KAAK,MAAM,KAAK,OAAO;AAAA,EAC/F;AACJ;AAGO,IAAM,2BAAN,MAA+B;AAAA;AAAA,EAEzB;AAAA;AAAA,EAGA;AAAA;AAAA,EAGA;AAAA;AAAA,EAGA;AAAA,EAET,YACI,OACA,MACA,OACA,OAA6B,aAC/B;AACE,SAAK,QAAQ;AACb,SAAK,OAAO;AACZ,SAAK,QAAQ;AACb,SAAK,OAAO;AAAA,EAChB;AAAA;AAAA,EAGA,IAAI,WAAoB;AACpB,WAAO;AAAA,EACX;AACJ;AAGO,IAAM,qBAAN,MAAyB;AAAA;AAAA,EAEnB;AAAA;AAAA,EAGA;AAAA;AAAA,EAGA;AAAA,EAET,YAAY,MAAc,SAA4B,aAAgC,CAAC,GAAG;AACtF,SAAK,OAAO;AACZ,SAAK,UAAU;AACf,SAAK,aAAa;AAAA,EACtB;AAAA;AAAA,EAGA,IAAI,MAA0B;AAC1B,WAAO,KAAK,WAAW,WAAW,IAAI,KAAK,WAAW,CAAC,IAAI;AAAA,EAC/D;AACJ;AAGO,IAAM,qBAAN,cAAiC,MAAM;AAAA;AAAA,EAEjC;AAAA,EAET,YAAY,SAAiB,SAAyD;AAClF,UAAM,SAAS,SAAS,UAAU,SAAY,SAAY,EAAE,OAAO,QAAQ,MAAM,CAAC;AAClF,SAAK,OAAO;AACZ,SAAK,kBAAkB,SAAS;AAAA,EACpC;AACJ;;;ACrGO,IAAM,cAAN,MAAkB;AAAA;AAAA,EAEZ;AAAA;AAAA,EAGA;AAAA;AAAA,EAGA;AAAA;AAAA,EAGA;AAAA;AAAA,EAGA;AAAA,EAET,YACI,MACA,SACA,WACA,MACA,aAAgC,CAAC,GACnC;AACE,SAAK,OAAO;AACZ,SAAK,UAAU;AACf,SAAK,YAAY;AACjB,SAAK,WAAW;AAChB,SAAK,aAAa;AAAA,EACtB;AAAA;AAAA,EAGA,IAAI,MAA0B;AAC1B,WAAO,KAAK,WAAW,WAAW,IAAI,KAAK,WAAW,CAAC,IAAI;AAAA,EAC/D;AACJ;AAGO,IAAM,aAAN,MAAiB;AAAA;AAAA,EAEpB;AAAA;AAAA,EAEA,WAA+B,CAAC;AAAA,EAChC,WAAW;AAAA,EAEF;AAAA,EAEA;AAAA;AAAA,EAGA;AAAA;AAAA,EAGA;AAAA,EAEA;AAAA,EAET,YACI,MACA,SACA,aACA,KACA,OACF;AACE,SAAK,OAAO;AACZ,SAAK,UAAU;AACf,SAAK,cAAc;AACnB,SAAK,MAAM;AACX,SAAK,QAAQ;AAAA,EACjB;AACJ;AAGO,IAAM,OAAN,MAAW;AAAA,EACd;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA,eAAe;AAAA;AAAA,EAEf;AAAA,EAES;AAAA,EAET,YAAY,SAAsB;AAC9B,SAAK,UAAU;AAAA,EACnB;AAAA;AAAA,EAGA,IAAI,cAAuB;AACvB,WAAO,KAAK,iBAAiB,UAAa,KAAK,cAAc,UAAa,KAAK,SAAS,UAAa,KAAK,SAAS,UAAa,KAAK,YAAY;AAAA,EACrJ;AAAA,EAEA,IAAI,UAAmB;AACnB,WAAO,KAAK,UAAU,UAAa,CAAC,KAAK,eAAe,KAAK,gBAAgB;AAAA,EACjF;AAAA;AAAA,EAGA,KAAK,WAAmC;AACpC,WAAO,IAAI;AAAA,MAAW,KAAK,gBAAgB,UAAU;AAAA,MAAc,KAAK,aAAa,UAAU;AAAA,MAAW,KAAK,QAAQ,UAAU;AAAA,MAC7H,KAAK,QAAQ,UAAU;AAAA,MAAM,KAAK,WAAW,UAAU;AAAA,IAAO;AAAA,EACtE;AAAA;AAAA,EAGA,aAAa,OAAmB;AAC5B,SAAK,eAAe,MAAM;AAC1B,SAAK,YAAY,MAAM;AACvB,SAAK,OAAO,MAAM;AAClB,SAAK,OAAO,MAAM;AAClB,SAAK,UAAU,MAAM;AAAA,EACzB;AAAA;AAAA,EAGA,KAAK,QAA0B,OAAmB,WAAgC;AAC9E,UAAM,MAAM,IAAI,UAAU,QAAW,QAAW,KAAK,cAAc,KAAK,WAAW,KAAK,MAAM,KAAK,MAAM,KAAK,OAAO;AACrH,QAAI,OAAO,iBAAiB,OAAW,MAAK,eAAe,IAAI,MAAM,cAAc,UAAU,YAAY;AACzG,QAAI,OAAO,cAAc,OAAW,MAAK,YAAY,IAAI,MAAM,WAAW,UAAU,SAAS;AAC7F,QAAI,OAAO,SAAU,MAAK,OAAO,IAAI,MAAM,MAAM,UAAU,IAAI;AAC/D,QAAI,OAAO,SAAS,OAAW,MAAK,OAAO,IAAI,MAAM,MAAM,UAAU,IAAI;AACzE,QAAI,OAAO,YAAa,MAAK,UAAU,IAAI,MAAM,SAAS,UAAU,OAAO;AAC3E,WAAO,CAAC,IAAI,WAAW,IAAI;AAAA,EAC/B;AACJ;AA6CO,IAAM,YAAN,MAAgB;AAAA,EACV;AAAA,EACA;AAAA,EACT,YAAY;AAAA;AAAA,EAGH;AAAA;AAAA,EAGA;AAAA;AAAA,EAGT,YAAY,OAAc,QAAqB,MAAqC,MAAqC;AACrH,SAAK,QAAQ;AACb,SAAK,SAAS;AACd,SAAK,QAAQ;AACb,SAAK,QAAQ;AAAA,EACjB;AAAA;AAAA,EAGA,IAAI,WAAoB;AACpB,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA,EAGA,OAAoB;AAChB,QAAI,KAAK,UAAW,OAAM,IAAI,MAAM,6BAA6B;AAEjE,UAAM,SAAS,KAAK,MAAM,YAAY,MAAM,KAAK,MAAM,KAAK,KAAK,CAAC;AAClE,SAAK,YAAY;AACjB,WAAO;AAAA,EACX;AAAA;AAAA,EAGA,OAAoB;AAChB,QAAI,CAAC,KAAK,UAAW,OAAM,IAAI,MAAM,oCAAoC;AACzE,UAAM,SAAS,KAAK,MAAM,YAAY,MAAM,KAAK,MAAM,KAAK,KAAK,CAAC;AAClE,SAAK,YAAY;AACjB,WAAO;AAAA,EACX;AACJ;AAOO,IAAM,aAAN,MAAiB;AAAA,EACX;AAAA;AAAA,EAGA;AAAA;AAAA,EAGT,YAAY,QAAmB,OAA6B;AACxD,SAAK,SAAS;AACd,SAAK,SAAS;AAAA,EAClB;AAAA;AAAA,EAGA,IAAI,WAAmB;AACnB,WAAO,KAAK,OAAO;AAAA,EACvB;AAAA;AAAA,EAGA,IAAI,cAAsB;AACtB,WAAO,KAAK,OAAO;AAAA,EACvB;AAAA;AAAA,EAGA,QAAQC,MAAaC,SAAmC;AACpD,WAAO,KAAK,GAAGD,MAAKC,OAAM,EAAE;AAAA,EAChC;AAAA;AAAA,EAGA,aAAaD,MAAaC,SAA4B;AAClD,WAAO,KAAK,GAAGD,MAAKC,OAAM,EAAE;AAAA,EAChC;AAAA;AAAA,EAGA,GAAGD,MAAaC,SAA2B;AACvC,QAAI,CAAC,OAAO,UAAUD,IAAG,KAAKA,OAAM,KAAKA,QAAO,KAAK,SAAU,OAAM,IAAI,WAAW,iBAAiB,OAAO,KAAK,QAAQ,CAAC,UAAU;AACpI,QAAI,CAAC,OAAO,UAAUC,OAAM,KAAKA,UAAS,KAAKA,WAAU,KAAK,YAAa,OAAM,IAAI,WAAW,iBAAiB,OAAO,KAAK,WAAW,CAAC,aAAa;AACtJ,WAAO,QAAQ,KAAK,OAAOD,OAAM,KAAK,cAAcC,OAAM,GAAG,qBAAqB;AAAA,EACtF;AACJ;AAMO,IAAM,YAAN,MAAgB;AAAA;AAAA,EAEV;AAAA;AAAA,EAGA;AAAA;AAAA,EAGA;AAAA;AAAA,EAGA;AAAA;AAAA,EAGT,YACI,SACA,OACAC,OACA,MACF;AACE,SAAK,UAAU;AACf,SAAK,QAAQ;AACb,SAAK,OAAOA;AACZ,SAAK,OAAO;AAAA,EAChB;AAAA;AAAA,EAGA,IAAI,YAAqB;AACrB,WAAO,KAAK,YAAY;AAAA,EAC5B;AACJ;AAGA,IAAM,oBAAoB,oBAAI,IAAI,CAAC,OAAO,UAAU,YAAY,QAAQ,aAAa,CAAC;AAGtF,IAAM,aAAa;AAGnB,IAAM,iBAAiB;AAGvB,IAAM,kBAAkB,aAAa,MAAM,MAAM;AAEjD,IAAM,mBAAmB;AACzB,IAAM,mBAAmB;AAEzB,IAAI,cAAc;AAWlB,IAAM,eAAN,MAAyC;AAAA,EAC5B;AAAA,EAEA;AAAA,EAEA;AAAA,EAEA;AAAA,EAEA;AAAA,EAEA;AAAA,EAEA;AAAA,EAET,YACI,OACA,QACA,UACA,QACA,OACA,OACA,MACF;AACE,SAAK,QAAQ;AACb,SAAK,SAAS;AACd,SAAK,WAAW;AAChB,SAAK,SAAS;AACd,SAAK,QAAQ;AACb,SAAK,QAAQ;AACb,SAAK,OAAO;AAAA,EAChB;AAAA;AAAA,EAGA,KAAK,SAAyC;AAC1C,UAAM,MAAM,QAAQ;AACpB,UAAM,QAAQ,KAAK,OAAO,IAAI,GAAG,IAAI,KAAK,OAAO,IAAI,GAAG,IAAI,KAAK,SAAS,OAAO,KAAK,KAAK,MAAM,SAAS,OAAO;AACjH,QAAI,UAAU,UAAa,MAAM,YAAY,MAAM,UAAU,YAAY,MAAM,UAAU,oBAAoB,KAAK,MAAM,QAAQ,UAAU;AACtI,WAAK,MAAM,MAAM,MAAM;AAAA,IAC3B;AACA,QAAI,OAAO,cAAc,KAAM,MAAK,MAAM,aAAa;AACvD,WAAO;AAAA,EACX;AAAA,EAEA,WAAW,MAAmC;AAC1C,WAAO,CAAC,GAAG,KAAK,MAAM,QAAQ,IAAI,CAAC,EAAE,OAAO,OAAK,KAAK,KAAK,CAAC,MAAM,MAAS,EAAE,SAAS,CAAC,GAAG,MAAM,EAAE,UAAU,CAAC,CAAC;AAAA,EAClH;AAAA;AAAA,EAGA,YAAYC,QAAeF,SAAyB;AAChD,UAAMG,QAAO,KAAK,MAAM,YAAYD,QAAOF,OAAM;AACjD,QAAIG,MAAK,WAAWA,MAAK,QAAQ,UAAU,mBAAmB,KAAK,MAAM,QAAQ,SAAU,MAAK,MAAM,MAAM;AAC5G,QAAI,KAAK,MAAM,mBAAmBD,QAAOF,OAAM,EAAG,MAAK,MAAM,aAAa;AAC1E,WAAOG;AAAA,EACX;AAAA,EAEA,cAAc,MAAuB;AACjC,WAAO,KAAK,MAAM,SAAS,OAAO,IAAI,cAAc,IAAI,CAAC;AAAA,EAC7D;AAAA,EAEA,UAAU,SAAwC;AAC9C,WAAO,KAAK,MAAM,eAAe,OAAO;AAAA,EAC5C;AAAA,EAEA,QAAQ,WAAuD;AAC3D,WAAO,KAAK,MAAM,YAAY,SAAS,IAAI,OAAO,KAAK,MAAM,QAAQ,WAAW,aAAa,CAAC;AAAA,EAClG;AAAA,EAEA,YAAY,OAAe,MAAiD;AACxE,WAAO,KAAK,KAAK,OAAO,IAAI;AAAA,EAChC;AAAA,EAEA,IAAI,QAA8B;AAC9B,WAAO,KAAK,MAAM,SAAS;AAAA,EAC/B;AAAA,EAEA,IAAI,MAA+B;AAC/B,WAAO,KAAK,MAAM;AAAA,EACtB;AAAA,EAEA,KAAK,MAAmBC,QAAmC;AACvD,WAAO,KAAK,MAAM,KAAK,MAAMA,MAAK;AAAA,EACtC;AAAA;AAAA,EAGA,MAAM,QAA8B;AAChC,SAAK,KAAK,MAAM;AAChB,UAAM,OAAO,KAAK,MAAM,OAAO,MAAM;AACrC,QAAI;AACJ,QAAI,KAAK,OAAO,IAAI,OAAO,GAAG,EAAG,SAAQ,KAAK,OAAO,IAAI,OAAO,GAAG;AAAA,aAC1D,SAAS,OAAW,SAAQ,KAAK;AAC1C,QAAI,UAAU,UAAa,SAAS,UAAa,KAAK,aAAc,QAAO,QAAQ,QAAQ,OAAO;AAClG,UAAM,QAAQ,IAAI,WAAW,MAAM,MAAM,MAAM,OAAO;AACtD,aAAS,IAAI,GAAG,IAAI,MAAM,MAAM,KAAK;AACjC,eAAS,IAAI,GAAG,IAAI,MAAM,SAAS,IAAK,OAAM,IAAI,GAAG,GAAG,MAAM,GAAG,GAAG,CAAC,KAAK,MAAM,WAAW,CAAC,CAAC;AAAA,IACjG;AACA,WAAO,QAAQ,aAAa,KAAK;AAAA,EACrC;AACJ;AAOO,IAAM,QAAN,MAAM,OAAM;AAAA;AAAA,EAEf,OAAgB,WAAW;AAAA;AAAA,EAG3B,OAAgB,cAAc;AAAA;AAAA,EAG9B,OAAgB,cAAc;AAAA;AAAA,EAG9B,OAAgB,oBAAoB;AAAA;AAAA,EAGpC,OAAgB,iBAAiB;AAAA;AAAA,EAGjC,OAAgB,qBAAqB;AAAA;AAAA,EAG5B,KAAK;AAAA;AAAA,EAGL;AAAA;AAAA,EAGA;AAAA,EAET;AAAA,EAES,SAAS,oBAAI,IAAkB;AAAA;AAAA,EAG/B,kBAAkB,oBAAI,IAAyB;AAAA;AAAA,EAG/C,kBAAkB,oBAAI,IAAoB;AAAA;AAAA,EAG1C,oBAAoB,oBAAI,IAAyB;AAAA;AAAA,EAGjD,wBAAwB,oBAAI,IAA0B;AAAA;AAAA,EAGtD,wBAAwB,IAAI,aAAqB;AAAA;AAAA,EAG1D,cAAc,oBAAI,IAAwB;AAAA;AAAA,EAG1C,iBAAiB,oBAAI,IAAwB;AAAA;AAAA,EAG7C,gBAAgB,oBAAI,IAA8B;AAAA;AAAA,EAGzC,oBAAoB,oBAAI,IAAY;AAAA;AAAA,EAG7C;AAAA;AAAA,EAGS,gBAAgB,oBAAI,IAAY;AAAA;AAAA,EAGhC,iBAAiB,oBAAI,IAAY;AAAA;AAAA,EAGjC,gBAAgB,oBAAI,IAAyB;AAAA,EAEtD;AAAA;AAAA,EAGA,sBAAsB;AAAA;AAAA,EAGtB,YAAY,UAAoB,MAAc;AAC1C,SAAK,QAAQ,OAAM,UAAU,IAAI;AACjC,SAAK,WAAW;AAChB,SAAK,UAAU,SAAS;AAAA,EAC5B;AAAA;AAAA;AAAA,EAKA,YAAY,UAA+B;AACvC,eAAW,OAAO,SAAS,SAAS;AAChC,eAASJ,UAAS,IAAI,OAAOA,WAAU,IAAI,MAAMA,UAAU,MAAK,eAAe,IAAIA,SAAQ,KAAK,QAAQ,IAAI,KAAK,CAAC;AAAA,IACtH;AACA,eAAW,OAAO,SAAS,cAAc;AACrC,eAASA,UAAS,IAAI,OAAOA,WAAU,IAAI,MAAMA,UAAU,MAAK,cAAc,IAAIA,SAAQ,IAAI,iBAAiB,IAAI,OAAO,IAAI,IAAI,CAAC;AAAA,IACvI;AACA,eAAW,OAAO,SAAS,MAAM;AAC7B,eAASD,OAAM,IAAI,OAAOA,QAAO,IAAI,MAAMA,OAAO,MAAK,YAAY,IAAIA,MAAK,KAAK,QAAQ,IAAI,KAAK,CAAC;AAAA,IACvG;AACA,eAAW,QAAQ,SAAS,OAAO;AAC/B,UAAI,KAAK,iBAAiB,UAAa,KAAK,cAAc,UAAa,KAAK,SAAS,UAAa,KAAK,SAAS,UAAa,KAAK,YAAY,OAAW;AACzJ,YAAM,OAAO,IAAI,KAAK,KAAK,OAAO;AAClC,WAAK,eAAe,KAAK,cAAc,SAAS,KAAK,OAAO;AAC5D,WAAK,YAAY,KAAK;AACtB,WAAK,OAAO,KAAK;AACjB,WAAK,OAAO,KAAK;AACjB,WAAK,UAAU,KAAK;AACpB,WAAK,OAAO,IAAI,KAAK,QAAQ,KAAK,IAAI;AAAA,IAC1C;AAAA,EACJ;AAAA;AAAA,EAGA,YAAY,UAA+B;AACvC,SAAK,WAAW,SAAS,MAAM,OAAO,OAAK,EAAE,UAAU,MAAS,EAAE,IAAI,OAAK,CAAC,EAAE,SAAS,EAAE,KAAK,CAAU,CAAC;AACzG,SAAK,SAAS,cAAc;AAAA,EAChC;AAAA,EAEA,QAAQ,OAA+B;AACnC,WAAO,MAAM,iBAAiB,SAAY,QAAQ,MAAM,UAAU,EAAE,cAAc,MAAM,aAAa,SAAS,KAAK,OAAO,EAAE,CAAC;AAAA,EACjI;AAAA;AAAA,EAGA,kBAEE;AACE,UAAM,QAAQ,CAAC,GAAG,KAAK,OAAO,OAAO,CAAC,EACjC,OAAO,OAAK,EAAE,UAAU,UAAa,EAAE,WAAW,EAClD,SAAS,CAAC,GAAG,MAAM,EAAE,QAAQ,UAAU,EAAE,OAAO,CAAC,EACjD,IAAI,OAAK,IAAI,kBAAkB,EAAE,SAAS,EAAE,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC;AAC/G,WAAO,EAAE,OAAO,SAAS,KAAK,KAAK,cAAc,GAAG,MAAM,KAAK,KAAK,WAAW,GAAG,cAAc,KAAK,WAAW,EAAE;AAAA,EACtH;AAAA;AAAA,EAGA,IAAI,UAAuB;AACvB,WAAO,CAAC,GAAG,KAAK,OAAO,OAAO,CAAC,EAAE,OAAO,OAAK,EAAE,UAAU,MAAS,EAAE,IAAI,OAAK,IAAI,UAAU,MAAM,EAAE,OAAO,CAAC;AAAA,EAC/G;AAAA;AAAA,EAGA,IAAI,iBAAgC;AAChC,WAAO,CAAC,GAAG,KAAK,OAAO,OAAO,CAAC,EAAE,OAAO,OAAK,EAAE,UAAU,MAAS,EAAE,IAAI,OAAK,EAAE,OAAO,EAAE,SAAS,CAAC,GAAG,MAAM,EAAE,UAAU,CAAC,CAAC;AAAA,EAC7H;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAAS,SAAsBM,SAAoC;AAC/D,QAAI,CAAC,OAAO,SAASA,OAAM,EAAG,QAAO;AACrC,UAAM,EAAE,MAAAJ,OAAM,WAAW,IAAI,KAAK,gBAAgB,OAAO,EAAE,OAAO,MAAM,WAAWI,OAAM,GAAG,KAAK,OAAO;AACxG,WAAO,aAAa,SAAYJ;AAAA,EACpC;AAAA;AAAA,EAGA,IAAI,iBAAgC;AAChC,WAAO,CAAC,GAAG,KAAK,OAAO,OAAO,CAAC,EAAE,OAAO,OAAK,EAAE,UAAU,MAAS,EAAE,IAAI,OAAK,EAAE,OAAO;AAAA,EAC1F;AAAA;AAAA,EAGA,SAAS,SAAyC;AAC9C,WAAO,KAAK,OAAO,IAAI,QAAQ,GAAG,GAAG;AAAA,EACzC;AAAA;AAAA,EAGA,SAAS,SAAyC;AAC9C,WAAO,KAAK,OAAO,IAAI,QAAQ,GAAG,GAAG;AAAA,EACzC;AAAA;AAAA,EAGA,aAAa,SAA8B;AACvC,UAAM,QAAQ,KAAK,OAAO,IAAI,QAAQ,GAAG,GAAG;AAC5C,QAAI,UAAU,OAAW,QAAO;AAChC,WAAO,MAAM,WAAW,UAAU,QAAQ,MAAM,UAAU,0BAA2B,GAAG,KAAK,gBAAgB,OAAO,GAAG,KAAK,OAAO;AAAA,EACvI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,WAAW,SAAsB,OAA6B;AAC1D,UAAM,aAAa,UAAU,SAAY,SAAY,aAAa,KAAK;AACvE,UAAM,QAAQ,KAAK,OAAO,IAAI,QAAQ,GAAG,GAAG;AAC5C,QAAI,UAAU,QAAW;AACrB,aAAO,EAAE,MAAM,IAAI,WAAW,iBAAiB,KAAK,aAAa,OAAO,GAAG,MAAS,GAAG,UAAU,OAAO,YAAY,OAAO,QAAQ,OAAU;AAAA,IACjJ;AACA,UAAM,SAAS,KAAK,gBAAgB,OAAO;AAC3C,UAAM,EAAE,MAAAA,OAAM,YAAY,OAAO,IAAI,eAAe,SAAY,OAAO,OAAO,OAAO,KAAK,OAAO,IAAI,OAAO,SAAS,OAAO,KAAK,SAAS,UAAU;AACpJ,WAAO,EAAE,MAAM,aAAa,KAAKA,OAAM,WAAW,iBAAiB,KAAK,aAAa,OAAO,GAAG,MAAM,IAAI,GAAG,UAAU,MAAM,SAAS,UAAU,YAAY,OAAO;AAAA,EACtK;AAAA;AAAA,EAGA,MAAM,SAAsB,OAA4B;AACpD,WAAO,KAAK,UAAU,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,UAAU,OAA4B,SAAS,OAAoB;AAC/D,UAAM,UAA8C,CAAC;AACrD,UAAMK,WAA4D,CAAC;AACnE,eAAW,CAAC,SAASL,KAAI,KAAK,OAAO;AACjC,YAAME,QAAO,KAAK,WAAW,SAASF,OAAM,MAAM;AAClD,cAAQ,KAAK,CAAC,SAASE,MAAK,KAAK,CAAC;AAClC,UAAIA,MAAK,YAAY,OAAW,CAAAG,SAAQ,KAAK,EAAE,SAAS,QAAQH,MAAK,QAAQ,CAAC;AAAA,IAClF;AACA,WAAO,KAAK,YAAY,SAASG,QAAO;AAAA,EAC5C;AAAA;AAAA,EAGA,UAAU,OAA+B,WAAwB,OAA4B;AACzF,UAAM,UAAU,KAAK,WAAW,WAAW,OAAO,KAAK,EAAE;AACzD,QAAI,SAAS,cAAc,KAAM,QAAO,KAAK,UAAU,MAAM,IAAI,UAAQ,CAAC,MAAM,KAAK,CAAU,GAAG,KAAK;AACvG,UAAM,UAA8C,CAAC;AACrD,eAAW,QAAQ,MAAO,SAAQ,KAAK,CAAC,MAAM,QAAQ,QAAQ,KAAK,MAAM,UAAU,KAAK,KAAK,SAAS,UAAU,MAAM,CAAC,CAAC;AACxH,WAAO,KAAK,YAAY,SAAS,CAAC,CAAC;AAAA,EACvC;AAAA;AAAA,EAGA,WAAW,SAAsBL,OAAc,QAAkF;AAC7H,QAAIA,MAAK,WAAW,KAAKA,MAAK,WAAW,GAAG,GAAG;AAC3C,UAAI;AACJ,UAAI;AACA,gBAAQ,MAAM,MAAMA,OAAM,KAAK,OAAO;AAAA,MAC1C,SAAS,GAAG;AACR,YAAI,CAAC,UAAU,EAAE,aAAa,oBAAqB,OAAM;AACzD,gBAAQ,MAAM,UAAU,MAAM,SAASA,KAAI,CAAC;AAAA,MAChD;AACA,aAAO,EAAE,OAAO,UAAU,SAAY,SAAY,KAAK,eAAe,KAAK,UAAU,KAAK,CAAC,GAAG,SAAS,OAAU;AAAA,IACrH;AAEA,UAAM,SAAS,wBAAwBA,OAAM,KAAK,OAAO;AACzD,QAAI,QAAQ,OAAO;AACnB,QAAI;AACJ,QAAI;AACA,eAAS,MAAM,SAAS,SAAS,MAAM,cAAcA,KAAI,IAAI;AAAA,IACjE,SAAS,GAAG;AACR,UAAI,CAAC,UAAU,EAAE,aAAa,oBAAqB,OAAM;AACzD,eAAS;AAAA,IACb;AACA,QAAI,WAAW,OAAW,QAAO,EAAE,OAAO,KAAK,eAAe,KAAK,UAAU,MAAM,CAAC,GAAG,SAAS,OAAU;AAE1G,QAAI,CAAC,UAAU,MAAM,SAAS,YAAY,KAAK,gBAAgB,OAAO,EAAE,aAAa,cAAcA,OAAM,KAAK,OAAO,GAAG;AACpH,cAAQ,MAAM,WAAW,MAAM,SAAS,GAAG;AAAA,IAC/C;AACA,WAAO,EAAE,OAAO,MAAM,UAAU,KAAK,GAAG,SAAS,OAAO,QAAQ;AAAA,EACpE;AAAA;AAAA,EAGA,YAAY,SAA6CK,UAAiF;AACtI,UAAM,OAAO,oBAAI,IAAY;AAC7B,eAAW,EAAE,SAAS,OAAO,KAAKA,UAAS;AACvC,UAAI,CAAC,KAAK,gBAAgB,OAAO,EAAE,UAAW;AAC9C,WAAK,SAAS,OAAO,EAAE,eAAe;AACtC,WAAK,IAAI,QAAQ,GAAG;AAAA,IACxB;AAEA,eAAW,CAAC,SAAS,KAAK,KAAK,SAAS;AACpC,YAAM,SAAS,OAAO;AACtB,UAAI,WAAW,UAAa,CAAC,KAAK,gBAAgB,OAAO,EAAE,UAAW;AACtE,YAAM,WAAW,KAAK,eAAe,MAAM;AAC3C,UAAI,aAAa,OAAW;AAC5B,WAAK,SAAS,OAAO,EAAE,eAAe;AACtC,WAAK,IAAI,QAAQ,GAAG;AAAA,IACxB;AAEA,aAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACrC,YAAM,CAAC,SAAS,KAAK,IAAI,QAAQ,QAAQ,CAAC,GAAG,UAAU;AACvD,UAAI,UAAU,OAAW;AACzB,YAAM,UAAU,KAAK,SAAS,gBAAgB,KAAK;AACnD,UAAI,YAAY,MAAO,SAAQ,CAAC,IAAI,CAAC,SAAS,OAAO;AAAA,IACzD;AACA,UAAM,SAAS,KAAK,WAAW,OAAO;AACtC,QAAI,KAAK,SAAS,EAAG,QAAO;AAC5B,eAAWP,QAAO,OAAO,KAAM,MAAK,IAAIA,IAAG;AAC3C,WAAO,IAAI,YAAY,OAAO,cAAc,OAAO,cAAc,gBAAgB,IAAI,CAAC;AAAA,EAC1F;AAAA;AAAA,EAGA,SAAS,SAA4B;AACjC,QAAI,OAAO,KAAK,OAAO,IAAI,QAAQ,GAAG;AACtC,QAAI,SAAS,QAAW;AACpB,aAAO,IAAI,KAAK,OAAO;AACvB,WAAK,OAAO,IAAI,QAAQ,KAAK,IAAI;AAAA,IACrC;AACA,WAAO;AAAA,EACX;AAAA;AAAA,EAGA,SAAS,SAAsB,OAAuC;AAClE,WAAO,KAAK,WAAW,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC;AAAA,EAC7C;AAAA;AAAA,EAGA,WAAW,SAA6C;AACpD,UAAM,UAAU,oBAAI,IAAY;AAChC,UAAM,OAAO,oBAAI,IAAY;AAC7B,eAAW,CAAC,SAAS,KAAK,KAAK,SAAS;AACpC,UAAI,OAAO,KAAK,OAAO,IAAI,QAAQ,GAAG;AACtC,UAAI,MAAM,KAAK,MAAM,OAAO,KAAK,EAAG;AACpC,YAAM,MAAM,MAAM,OAAO;AACzB,UAAI,QAAQ,OAAW,MAAK,YAAY,SAAS,GAAG;AACpD,UAAI,UAAU,QAAW;AACrB,gBAAQ,MAAM,iCAAiC,EAAE,QAAQ;AAAA,MAC7D,OAAO;AACH,iBAAS,KAAK,SAAS,OAAO;AAC9B,aAAK,QAAQ;AACb,YAAI,MAAM,WAAW,OAAW,MAAK,UAAU,SAAS,MAAM,MAAM;AAAA,MACxE;AACA,cAAQ,IAAI,QAAQ,GAAG;AACvB,WAAK,IAAI,QAAQ,GAAG;AAAA,IACxB;AACA,QAAI,QAAQ,SAAS,EAAG,QAAO,YAAY;AAC3C,SAAK,YAAY;AACjB,WAAO,KAAK,aAAa,IAAI,aAAa,CAAC,GAAG,OAAO,EAAE,IAAI,SAAO,IAAI,UAAU,MAAM,YAAY,QAAQ,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI;AAAA,EAC3H;AAAA,EAEA,UAAU,aAA0B,SAAqB;AACrD,UAAM,QAAgB,CAAC;AACvB,UAAM,SAAsB,CAAC;AAC7B,eAAW,aAAa,QAAQ,WAAW,GAAG;AAC1C,UAAI,CAAC,KAAK,QAAQ,SAAS,GAAG;AAC1B,eAAO,KAAK,SAAS;AACrB;AAAA,MACJ;AACA,YAAM,OAAO,UAAU;AACvB,UAAI,KAAK,cAAc;AACnB,cAAM,SAAS,IAAI,YAAY,KAAK,MAAM,KAAK,OAAO,EAAE;AACxD,YAAI,MAAM,KAAK,gBAAgB,IAAI,MAAM;AACzC,YAAI,QAAQ,QAAW;AACnB,gBAAM,oBAAI,IAAI;AACd,eAAK,gBAAgB,IAAI,QAAQ,GAAG;AAAA,QACxC;AACA,YAAI,IAAI,YAAY,GAAG;AAAA,MAC3B,OAAO;AACH,cAAM,KAAK,IAAI;AAAA,MACnB;AAAA,IACJ;AACA,QAAI,MAAM,SAAS,EAAG,MAAK,gBAAgB,IAAI,YAAY,KAAK,KAAK;AACrE,QAAI,OAAO,SAAS,GAAG;AACnB,WAAK,kBAAkB,IAAI,YAAY,KAAK,MAAM;AAClD,WAAK,gBAAgB,aAAa,MAAM;AAAA,IAC5C;AACA,SAAK,sBAAsB,aAAa,OAAO;AAC/C,QAAI,WAAW,OAAO,EAAG,MAAK,cAAc,IAAI,YAAY,GAAG;AAC/D,QAAI,CAAC,GAAG,QAAQ,MAAM,CAAC,EAAE,KAAK,UAAQ,KAAK,aAAa,UAAa,kBAAkB,IAAI,KAAK,IAAI,CAAC,EAAG,MAAK,kBAAkB,IAAI,YAAY,GAAG;AAClJ,QAAI,YAAY,OAAO,EAAG,MAAK,eAAe,IAAI,YAAY,GAAG;AAAA,EACrE;AAAA,EAEA,YAAY,aAA0B,SAAqB;AACvD,eAAW,aAAa,QAAQ,WAAW,GAAG;AAC1C,YAAM,OAAO,UAAU;AACvB,UAAI,KAAK,QAAQ,SAAS,KAAK,KAAK,cAAc;AAC9C,cAAM,SAAS,IAAI,YAAY,KAAK,MAAM,KAAK,OAAO,EAAE;AACxD,cAAM,MAAM,KAAK,gBAAgB,IAAI,MAAM;AAC3C,YAAI,KAAK,OAAO,YAAY,GAAG,MAAM,QAAQ,IAAI,SAAS,EAAG,MAAK,gBAAgB,OAAO,MAAM;AAAA,MACnG;AAAA,IACJ;AACA,SAAK,gBAAgB,OAAO,YAAY,GAAG;AAC3C,SAAK,kBAAkB,WAAW;AAClC,SAAK,wBAAwB,aAAa,OAAO;AACjD,SAAK,cAAc,OAAO,YAAY,GAAG;AACzC,SAAK,kBAAkB,OAAO,YAAY,GAAG;AAC7C,SAAK,eAAe,OAAO,YAAY,GAAG;AAAA,EAC9C;AAAA;AAAA,EAGA,gBAAgB,aAA0B,QAAoC;AAC1E,UAAM,YAAY,IAAI,UAAU,MAAM,WAAW;AACjD,UAAM,SAAS,oBAAI,IAAmB;AACtC,eAAW,aAAa,QAAQ;AAC5B,iBAAW,UAAU,KAAK,SAAS,SAAS,GAAG;AAC3C,YAAI,OAAO,OAAO,IAAI,MAAM;AAC5B,YAAI,SAAS,QAAW;AACpB,iBAAO,CAAC;AACR,iBAAO,IAAI,QAAQ,IAAI;AAAA,QAC3B;AACA,aAAK,KAAK,UAAU,IAAI;AAAA,MAC5B;AAAA,IACJ;AACA,eAAW,CAAC,QAAQQ,MAAK,KAAK,QAAQ;AAClC,YAAM,QAAgB,CAAC;AACvB,iBAAW,QAAQA,QAAO;AACtB,YAAI,CAAC,KAAK,cAAc;AACpB,gBAAM,KAAK,IAAI;AACf;AAAA,QACJ;AACA,cAAM,UAAU,IAAI,YAAY,KAAK,MAAM,KAAK,OAAO,EAAE;AACzD,YAAI,MAAM,OAAO,sBAAsB,IAAI,OAAO;AAClD,YAAI,QAAQ,QAAW;AACnB,gBAAM,IAAI,aAAa;AACvB,iBAAO,sBAAsB,IAAI,SAAS,GAAG;AAAA,QACjD;AACA,YAAI,IAAI,SAAS;AAAA,MACrB;AACA,UAAI,MAAM,SAAS,EAAG,QAAO,sBAAsB,IAAI,WAAW,KAAK;AAAA,IAC3E;AAAA,EACJ;AAAA;AAAA,EAGA,kBAAkB,aAAgC;AAC9C,UAAM,SAAS,KAAK,kBAAkB,IAAI,YAAY,GAAG;AACzD,QAAI,WAAW,OAAW;AAC1B,SAAK,kBAAkB,OAAO,YAAY,GAAG;AAC7C,UAAM,YAAY,IAAI,UAAU,MAAM,WAAW;AACjD,eAAW,aAAa,QAAQ;AAC5B,iBAAW,UAAU,KAAK,SAAS,SAAS,GAAG;AAC3C,eAAO,sBAAsB,OAAO,SAAS;AAC7C,cAAM,OAAO,UAAU;AACvB,YAAI,CAAC,KAAK,aAAc;AACxB,cAAM,UAAU,IAAI,YAAY,KAAK,MAAM,KAAK,OAAO,EAAE;AACzD,cAAM,MAAM,OAAO,sBAAsB,IAAI,OAAO;AACpD,YAAI,KAAK,OAAO,SAAS,MAAM,QAAQ,IAAI,SAAS,EAAG,QAAO,sBAAsB,OAAO,OAAO;AAAA,MACtG;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA,EAGA,SAAS,WAAwC;AAC7C,QAAI,UAAU,SAAU,QAAO,KAAK,SAAS,KAAK,QAAQ,UAAU,WAAW,sBAAuB,GAAG,QAAQ,UAAU,eAAe,qBAAsB,CAAC,KAAK,CAAC;AACvK,UAAM,SAAS,KAAK,SAAS,KAAK,QAAQ,UAAU,WAAW,aAAa,CAAC;AAC7E,WAAO,WAAW,SAAY,CAAC,IAAI,CAAC,MAAM;AAAA,EAC9C;AAAA;AAAA,EAGA,CAAC,YAAY,SAA8C;AACvD,UAAM,MAAM,KAAK,gBAAgB,IAAI,QAAQ,GAAG;AAChD,QAAI,QAAQ,OAAW,YAAW,aAAa,IAAK,OAAM,YAAY,QAAQ,SAAS;AACvF,eAAW,CAAC,aAAa,KAAK,KAAK,KAAK,iBAAiB;AACrD,UAAI,MAAM,KAAK,UAAQ,KAAK,SAAS,OAAO,CAAC,EAAG,OAAM,YAAY,QAAQ,WAAW;AAAA,IACzF;AAAA,EACJ;AAAA;AAAA,EAGA,CAAC,QAAQ,MAAoC;AACzC,QAAI,KAAK,aAAa,KAAK,OAAO,MAAM;AACpC,eAASR,OAAM,KAAK,MAAMA,QAAO,KAAK,MAAMA,QAAO;AAC/C,iBAASC,UAAS,KAAK,SAASA,WAAU,KAAK,SAASA,WAAU;AAC9D,gBAAM,UAAU,IAAI,YAAYD,MAAKC,OAAM;AAC3C,cAAI,KAAK,OAAO,IAAI,QAAQ,GAAG,EAAG,OAAM;AAAA,QAC5C;AAAA,MACJ;AAAA,IACJ,OAAO;AACH,iBAAW,QAAQ,KAAK,OAAO,OAAO,GAAG;AACrC,YAAI,KAAK,SAAS,KAAK,OAAO,EAAG,OAAM,KAAK;AAAA,MAChD;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA,EAGA,OAAO,SAAwC;AAC3C,WAAO,KAAK,OAAO,IAAI,QAAQ,GAAG;AAAA,EACtC;AAAA;AAAA,EAGA,eAAe,SAAwC;AACnD,UAAM,OAAO,KAAK,OAAO,IAAI,QAAQ,GAAG;AACxC,QAAI,SAAS,OAAW,QAAO;AAC/B,QAAI,KAAK,UAAU,OAAW,QAAO,KAAK,MAAM;AAChD,WAAO,KAAK,gBAAgB,SAAY,SAAY,KAAK,OAAO,IAAI,KAAK,YAAY,GAAG,GAAG,OAAO;AAAA,EACtG;AAAA;AAAA;AAAA,EAKA,WAAmC;AAC/B,UAAM,SAAS,oBAAI,IAAuB;AAC1C,eAAW,QAAQ,KAAK,OAAO,OAAO,EAAG,QAAO,IAAI,KAAK,QAAQ,KAAK,QAAQ,IAAI,CAAC;AACnF,WAAO;AAAA,EACX;AAAA,EAEA,SAAS,SAAiC;AACtC,UAAM,OAAO,KAAK,OAAO,IAAI,QAAQ,GAAG;AACxC,WAAO,SAAS,SAAY,UAAU,QAAQ,QAAQ,IAAI;AAAA,EAC9D;AAAA;AAAA,EAGA,cAAc,SAAiC;AAC3C,UAAM,QAAQ,KAAK,WAAW,OAAO;AACrC,WAAO,KAAK,SAAS,OAAO,EAAE,SAAS,WAAW,KAAK;AAAA,EAC3D;AAAA;AAAA,EAGA,OAAO,QAAoD;AACvD,WAAO,CAAC,GAAG,MAAM,EAAE,IAAI,QAAM,EAAE,SAAS,EAAE,SAAS,OAAO,QAAQ,EAAE,OAAO,KAAK,WAAW,EAAE,OAAO,CAAC,EAAE,EAAE;AAAA,EAC7G;AAAA;AAAA,EAGA,iBAA0C;AACtC,UAAM,QAAQ,oBAAI,IAAwB;AAC1C,eAAW,QAAQ,KAAK,OAAO,OAAO,EAAG,OAAM,IAAI,KAAK,QAAQ,KAAK,KAAK,cAAc,KAAK,OAAO,CAAC;AACrG,WAAO;AAAA,EACX;AAAA;AAAA,EAGA,KAAK,QAAwC,cAAqC,aAA4D;AAC1I,UAAM,eAA8B,CAAC;AACrC,UAAM,OAAO,oBAAI,IAAY;AAC7B,UAAM,UAAU,CAAC,SAAsB,QAAyB;AAC5D,YAAMQ,OAAM,KAAK,SAAS,OAAO;AACjC,YAAM,eAAe,CAAC,MAAM,UAAU,IAAI,OAAOA,KAAI,KAAK;AAC1D,UAAI,aAAc,cAAa,KAAK,OAAO;AAC3C,YAAM,QAAQ,gBAAgB,WAAc,YAAY,IAAI,QAAQ,GAAG,KAAK,mBAAmB,OAAO,KAAK,cAAc,OAAO,CAAC;AACjI,UAAI,gBAAgB,CAAC,IAAI,WAAWA,IAAG,KAAK,CAAC,MAAO,MAAK,IAAI,QAAQ,GAAG;AAAA,IAC5E;AACA,eAAW,CAAC,KAAK,GAAG,KAAK,OAAQ,SAAQ,YAAY,QAAQ,GAAG,GAAG,GAAG;AACtE,eAAW,QAAQ,KAAK,OAAO,OAAO,GAAG;AACrC,UAAI,CAAC,OAAO,IAAI,KAAK,QAAQ,GAAG,EAAG,SAAQ,KAAK,SAAS,UAAU,KAAK;AAAA,IAC5E;AACA,iBAAa,KAAK,CAAC,GAAG,MAAM,EAAE,UAAU,CAAC,CAAC;AAC1C,UAAM,aAAa,kBAAkB,YAAY;AACjD,WAAO,aAAa,WAAW,KAAK,KAAK,SAAS,KAAK,WAAW,WAAW,IACvE,YAAY,OACZ,IAAI,YAAY,cAAc,YAAY,gBAAgB,IAAI,CAAC;AAAA,EACzE;AAAA;AAAA,EAGA,sBAA4B;AACxB,SAAK,gBAAgB,MAAM;AAC3B,SAAK,gBAAgB,MAAM;AAC3B,eAAW,eAAe,KAAK,kBAAkB,KAAK,EAAG,MAAK,kBAAkB,YAAY,QAAQ,WAAW,CAAC;AAChH,SAAK,cAAc,MAAM;AACzB,SAAK,cAAc,MAAM;AACzB,SAAK,kBAAkB,MAAM;AAC7B,SAAK,eAAe,MAAM;AAC1B,eAAW,QAAQ,KAAK,OAAO,OAAO,GAAG;AACrC,YAAM,SAAS,KAAK,OAAO;AAC3B,UAAI,WAAW,OAAW,MAAK,UAAU,KAAK,SAAS,MAAM;AAAA,IACjE;AAAA,EACJ;AAAA;AAAA;AAAA,EAKA,cAAc,SAAkC;AAC5C,UAAMC,YAAW,KAAK,WAAW,OAAO;AACxC,WAAO,IAAI,WAAWA,UAAS,cAAcA,UAAS,WAAWA,UAAS,MAAMA,UAAS,MAAM,KAAK,WAAW,OAAO,CAAC;AAAA,EAC3H;AAAA;AAAA,EAGA,WAAW,SAAkC;AACzC,UAAM,OAAO,KAAK,OAAO,IAAI,QAAQ,GAAG;AACxC,WAAO,SAAS,SAAY,KAAK,WAAW,OAAO,IAAI,KAAK,KAAK,KAAK,WAAW,OAAO,CAAC;AAAA,EAC7F;AAAA;AAAA,EAGA,gBAAgB,SAAoC;AAChD,WAAO,KAAK,OAAO,IAAI,QAAQ,GAAG,GAAG,gBAAgB,KAAK,YAAY,IAAI,QAAQ,GAAG,GAAG,gBACjF,KAAK,eAAe,IAAI,QAAQ,MAAM,GAAG,gBAAgB,aAAa;AAAA,EACjF;AAAA;AAAA,EAGA,aAAa,SAA2C;AAEpD,WAAO,KAAK,OAAO,IAAI,QAAQ,GAAG,GAAG,aAAa,KAAK,YAAY,IAAI,QAAQ,GAAG,GAAG,aAC9E,KAAK,eAAe,IAAI,QAAQ,MAAM,GAAG,aAAa;AAAA,EACjE;AAAA;AAAA,EAGA,QAAQ,SAAgC;AACpC,WAAO,KAAK,OAAO,IAAI,QAAQ,GAAG,GAAG,QAAQ,KAAK,YAAY,IAAI,QAAQ,GAAG,GAAG,QAAQ,KAAK,eAAe,IAAI,QAAQ,MAAM,GAAG,QAAQ,SAAS;AAAA,EACtJ;AAAA;AAAA,EAGA,QAAQ,SAAgC;AACpC,WAAO,KAAK,OAAO,IAAI,QAAQ,GAAG,GAAG,QAAQ,KAAK,YAAY,IAAI,QAAQ,GAAG,GAAG,QAAQ,KAAK,eAAe,IAAI,QAAQ,MAAM,GAAG,QAAQ,SAAS;AAAA,EACtJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,WAAW,SAAmC;AAC1C,UAAM,QAAQ,KAAK,UAAU,OAAO;AACpC,WAAO,IAAI,YAAY;AAAA,MACnB,KAAK,QAAQ,MAAM,IAAIC,MAAK,KAAK,UAAU,IAAI,YAAY,QAAQ,MAAM,GAAG,QAAQ,MAAM,CAAC,EAAE,QAAQ,MAAM,GAAG,IAAI,MAAM;AAAA,MACxH,QAAQ,MAAM,OAAO,UAAU,QAAQ,MAAM,WAAW,IAAI,KAAK,UAAU,IAAI,YAAY,QAAQ,MAAM,GAAG,QAAQ,MAAM,CAAC,EAAE,MAAM,MAAM;AAAA,MACzI,MAAM,QAAQ,SAAS,IAAIA,MAAK,KAAK,UAAU,IAAI,YAAY,QAAQ,KAAK,QAAQ,SAAS,CAAC,CAAC,EAAE,OAAO,MAAM,IAAI,IAAI,MAAM;AAAA,MAC5H,OAAO,MAAM,MAAM,UAAU,QAAQ,SAAS,cAAc,IAAI,KAAK,UAAU,IAAI,YAAY,QAAQ,KAAK,QAAQ,SAAS,CAAC,CAAC,EAAE,OAAO,MAAM;AAAA,IAClJ,CAAC;AAAA,EACL;AAAA;AAAA,EAGA,UAAU,SAAmC;AACzC,WAAO,KAAK,OAAO,IAAI,QAAQ,GAAG,GAAG,WAAW,KAAK,YAAY,IAAI,QAAQ,GAAG,GAAG,WAC5E,KAAK,eAAe,IAAI,QAAQ,MAAM,GAAG,WAAW,YAAY;AAAA,EAC3E;AAAA;AAAA,EAGA,mBAAmBX,MAAuC;AACtD,WAAO,KAAK,YAAY,IAAI,SAASA,IAAG,CAAC,GAAG;AAAA,EAChD;AAAA;AAAA,EAGA,sBAAsBC,SAA0C;AAC5D,WAAO,KAAK,eAAe,IAAI,YAAYA,OAAM,CAAC,GAAG;AAAA,EACzD;AAAA;AAAA,EAGA,gBAAgBD,MAA8C;AAC1D,WAAO,KAAK,YAAY,IAAI,SAASA,IAAG,CAAC,GAAG;AAAA,EAChD;AAAA;AAAA,EAGA,mBAAmBC,SAAiD;AAChE,WAAO,KAAK,eAAe,IAAI,YAAYA,OAAM,CAAC,GAAG;AAAA,EACzD;AAAA;AAAA,EAGA,kBAAkB,WAAkC,QAA+C;AAC/F,WAAO,KAAK,aAAa,WAAW,IAAI,iBAAiB,EAAE,cAAc,UAAU,aAAa,QAAQ,CAAC,GAAG,QAAW,QAAW,MAAS,EAAE;AAAA,EACjJ;AAAA;AAAA,EAGA,gBAAgB,OAAkB,QAA+C;AAC7E,WAAO,KAAK,gBAAgB,OAAO,IAAI,iBAAiB,EAAE,cAAc,UAAU,aAAa,QAAQ,CAAC,CAAC,EAAE;AAAA,EAC/G;AAAA;AAAA,EAGA,eAAe,WAAkC,WAA6C;AAC1F,WAAO,KAAK,aAAa,WAAW,IAAI,iBAAiB,EAAE,WAAW,eAAe,SAAS,EAAE,CAAC,GAAG,QAAW,QAAW,MAAS,EAAE;AAAA,EACzI;AAAA;AAAA,EAGA,aAAa,OAAkB,WAA6C;AACxE,WAAO,KAAK,gBAAgB,OAAO,IAAI,iBAAiB,EAAE,WAAW,eAAe,SAAS,EAAE,CAAC,CAAC,EAAE;AAAA,EACvG;AAAA;AAAA,EAGA,cAAc,QAA6B,QAAuC;AAC9E,WAAO,KAAK,iBAAiB,OAAM,gBAAgB,QAAQ,MAAM,GAAG,MAAM,EAAE;AAAA,EAChF;AAAA;AAAA,EAGA,OAAO,gBAAgB,QAA6B,QAAuC;AACvF,UAAM,OAAO,CAAC,GAAG,MAAM;AACvB,QAAI,KAAK,WAAW,EAAG,OAAM,IAAI,WAAW,6CAA6C;AACzF,QAAI,OAAO,QAAS,OAAM,IAAI,WAAW,2CAA2C;AACpF,QAAI,OAAO,cAAc,OAAW,gBAAe,OAAO,SAAS;AACnE,WAAO;AAAA,EACX;AAAA;AAAA,EAGA,iBAAiB,QAA8B,QAA8C;AACzF,UAAM,QAAQ,OAAO,IAAI,WAAS,KAAK,gBAAgB,OAAO,MAAM,CAAC;AACrE,WAAO,EAAE,QAAQ,YAAY,MAAM,MAAM,IAAI,OAAK,EAAE,MAAM,CAAC,GAAG,MAAM;AAAA,EACxE;AAAA;AAAA,EAGA,gBAAgB,SAA0C;AACtD,UAAM,UAAyB,CAAC;AAChC,aAAS,IAAI,QAAQ,MAAM,SAAS,GAAG,KAAK,GAAG,IAAK,SAAQ,KAAK,KAAK,eAAe,QAAQ,QAAQ,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC;AACzH,WAAO,YAAY,MAAM,OAAO;AAAA,EACpC;AAAA;AAAA,EAGA,WAAW,SAAkC;AACzC,YAAQ,KAAK,YAAY,IAAI,QAAQ,GAAG,KAAK,WAAW,OAAO,MAAM,KAAK,eAAe,IAAI,QAAQ,MAAM,KAAK,WAAW,OAAO,KAAK,iBAAiB,CAAC;AAAA,EAC7J;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,gBAAgB,OAAkB,QAA6C;AAC3E,QAAI,MAAM;AACV,QAAI,IAAI,YAAY,OAAW,OAAM,IAAI,YAAY,IAAI,QAAQ,GAAG,KAAK,CAAC;AAC1E,UAAM,OAAO,KAAK,mBAAmB,OAAO,GAAG;AAC/C,QAAI,CAAC,IAAI,YAAa,QAAO;AAC7B,UAAM,QAA6B,CAAC,IAAI;AACxC,eAAW,EAAE,OAAO,QAAQ,QAAQ,KAAK,QAAQ,IAAI,SAAS,iBAAiB,EAAE,OAAO,KAAK,GAAG;AAC5F,YAAM,KAAK,KAAK,mBAAmB,QAAQ,IAAI,iBAAiB,EAAE,QAAQ,CAAC,CAAC,CAAC;AAAA,IACjF;AACA,WAAO,SAAS,KAAK;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,mBAAmB,OAAkB,QAA6C;AAC9E,UAAM,aAAa,IAAI,IAAI,KAAK,WAAW;AAC3C,UAAM,gBAAgB,IAAI,IAAI,KAAK,cAAc;AACjD,UAAM,eAAe,MAAM;AAC3B,UAAM,YAAY,MAAM;AACxB,QAAI,CAAC,gBAAgB,CAAC,UAAW,QAAO,KAAK,aAAa,MAAM,MAAM,GAAG,QAAQ,OAAO,QAAW,MAAS;AAE5G,UAAM,UAAU,KAAK,oBAAoB,OAAO,MAAM;AAEtD,UAAM,cAAc,oBAAI,IAAwB;AAChD,eAAW,WAAW,QAAS,KAAI,CAAC,YAAY,IAAI,QAAQ,GAAG,EAAG,aAAY,IAAI,QAAQ,KAAK,KAAK,WAAW,OAAO,CAAC;AACvH,QAAI,cAAc;AACd,UAAI,WAAW;AACX,mBAAWD,QAAO,KAAK,YAAY,KAAK,EAAG,SAAQ,KAAK,aAAaA,MAAK,gBAAgB,QAAQ,KAAK,YAAY,IAAIA,IAAG,GAAG,eAAgB,GAAG,MAAM,CAAC;AAAA,MAC3J;AACA,eAASC,UAAS,MAAM,MAAM,QAAQA,WAAU,MAAM,KAAK,QAAQA,WAAU;AAEzE,cAAM,QAAQ,KAAK,eAAe,IAAIA,OAAM,KAAK,WAAW;AAC5D,cAAM,OAAO,OAAO,QAAQ,MAAM,KAAK,iBAAiB,GAAG,YAAY,aAAa,SAAS,IAAI,aAAa,OAAO,OAAOA,YAAW,MAAM,MAAM,QAAQA,YAAW,MAAM,KAAK,MAAM,CAAC;AACxL,gBAAQ,KAAK,gBAAgBA,SAAQ,MAAM,KAAK,QAAQ,MAAM,iBAAiB,CAAC;AAAA,MACpF;AAAA,IACJ,OAAO;AAEH,YAAM,eAAe,CAAC,GAAG,KAAK,eAAe,OAAO,CAAC;AACrD,YAAM,YAAY,OAAO,iBAAiB,UAAa,aAAa,KAAK,OAAK,EAAE,iBAAiB,MAAS;AAC1G,YAAM,UAAU,OAAO,cAAc,UAAa,aAAa,KAAK,OAAK,EAAE,cAAc,MAAS;AAClG,YAAM,SAAS,OAAO,SAAS,UAAa,aAAa,KAAK,OAAK,EAAE,SAAS,MAAS;AACvF,eAASD,OAAM,MAAM,MAAM,KAAKA,QAAO,MAAM,KAAK,KAAKA,QAAO;AAC1D,cAAM,QAAQ,KAAK,YAAY,IAAIA,IAAG,KAAK,WAAW;AACtD,cAAM,OAAO,OAAO,QAAQ,MAAM,KAAK,iBAAiB,GAAG,IAAI,aAAaA,SAAQ,MAAM,MAAM,KAAKA,SAAQ,MAAM,KAAK,KAAK,OAAO,KAAK,CAAC;AAC1I,cAAMU,YAAW,MAAM,KAAK,QAAQ,MAAM,iBAAiB;AAC3D,gBAAQ,KAAK,aAAaV,MAAK,IAAI;AAAA,UAC/B,YAAY,KAAK,eAAeU,UAAS;AAAA,UACzC,UAAU,KAAK,YAAYA,UAAS;AAAA,UACpCA,UAAS;AAAA,UACT,SAAS,KAAK,OAAOA,UAAS;AAAA,UAC9BA,UAAS;AAAA,QAAO,CAAC;AAAA,MACzB;AAAA,IACJ;AACA,WAAO,KAAK,aAAa,SAAS,QAAQ,OAAO,aAAa,EAAE,MAAM,YAAY,SAAS,cAAc,CAAC;AAAA,EAC9G;AAAA;AAAA,EAGA,oBAAoB,OAAkB,QAAyC;AAC3E,UAAM,UAAyB,CAAC;AAChC,UAAM,UAAU,OAAO,cAAc,OAAO,UAAU;AACtD,QAAI,MAAM,gBAAgB;AACtB,iBAAW,QAAQ,KAAK,OAAO,OAAO,EAAG,KAAI,KAAK,QAAQ,UAAU,MAAM,MAAM,UAAU,KAAK,QAAQ,UAAU,MAAM,KAAK,OAAQ,SAAQ,KAAK,KAAK,OAAO;AAC7J,UAAI,MAAM,YAAa,QAAO;AAC9B,iBAAW,CAACV,MAAK,KAAK,KAAK,KAAK,aAAa;AACzC,YAAI,CAAC,OAAO,QAAQ,KAAK,EAAG;AAC5B,iBAASC,UAAS,MAAM,MAAM,QAAQA,WAAU,MAAM,KAAK,QAAQA,UAAU,SAAQ,KAAK,IAAI,YAAYD,MAAKC,OAAM,CAAC;AAAA,MAC1H;AAAA,IACJ,OAAO;AACH,iBAAW,QAAQ,KAAK,OAAO,OAAO,EAAG,KAAI,KAAK,QAAQ,OAAO,MAAM,MAAM,OAAO,KAAK,QAAQ,OAAO,MAAM,KAAK,IAAK,SAAQ,KAAK,KAAK,OAAO;AACjJ,iBAAW,CAACA,SAAQ,KAAK,KAAK,KAAK,gBAAgB;AAC/C,YAAI,EAAE,OAAO,YAAY,MAAM,SAAS,WAAc,EAAE,YAAY,UAAa,MAAM,YAAY,QAAY;AAC/G,iBAASD,OAAM,MAAM,MAAM,KAAKA,QAAO,MAAM,KAAK,KAAKA,OAAO,SAAQ,KAAK,IAAI,YAAYA,MAAKC,OAAM,CAAC;AAAA,MAC3G;AACA,UAAI,YAAY,UAAa,CAAC,SAAS,QAAQ,MAAM,QAAQ,cAAc,GAAG;AAC1E,iBAASD,OAAM,MAAM,MAAM,KAAKA,QAAO,MAAM,KAAK,KAAKA,OAAO,SAAQ,KAAK,IAAI,YAAYA,MAAK,MAAM,MAAM,MAAM,CAAC;AAAA,MACvH;AAAA,IACJ;AACA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,aAAa,WAAkC,QAA0B,OACrE,aACA,YAAgI;AAChI,UAAM,SAAS,oBAAI,IAA4B;AAC/C,UAAM,OAAO,IAAI,IAAY,eAAe,SAAY,CAAC,IAAI,KAAK,oBAAoB,WAAW,MAAM,WAAW,OAAO,CAAC;AAC1H,eAAW,WAAW,WAAW;AAC7B,UAAI,OAAO,IAAI,QAAQ,GAAG,EAAG;AAC7B,aAAO,IAAI,QAAQ,KAAK,EAAE,SAAS,OAAO,KAAK,SAAS,OAAO,EAAE,SAAS,CAAC;AAC3E,YAAM,QAAQ,aAAa,IAAI,QAAQ,GAAG,KAAK,KAAK,WAAW,OAAO;AACtE,YAAM,OAAO,OAAO,QAAQ,OAAO,UAAU,SAAY,aAAa,QAAQ,aAAa,GAAG,OAAO,OAAO,CAAC;AAC7G,UAAI,OAAO,KAAK,OAAO,IAAI,QAAQ,GAAG;AACtC,YAAM,WAAW,SAAS;AAC1B,eAAS,IAAI,KAAK,OAAO;AACzB,YAAM,UAAU,KAAK,KAAK,QAAQ,MAAM,KAAK,WAAW,OAAO,CAAC;AAChE,UAAI,KAAK,WAAW,KAAK,UAAU,OAAW,MAAK,OAAO,OAAO,QAAQ,GAAG;AAAA,eACnE,CAAC,SAAU,MAAK,OAAO,IAAI,QAAQ,KAAK,IAAI;AACrD,UAAI,WAAY,YAAY,eAAe,OAAY,MAAK,IAAI,QAAQ,GAAG;AAC3E,iBAAWA,QAAO,WAAW,SAAS,MAAM,SAAS,KAAK,OAAO,EAAG,MAAK,IAAIA,IAAG;AAAA,IACpF;AAEA,UAAM,SAAS,eAAe,UAAa,KAAK,cAAc,WAAW,MAAM,WAAW,OAAO;AACjG,UAAM,cAAc,KAAK,SAAS,KAAK,CAAC,SAAS,YAAY,OAAO,IAAI,YAAY,CAAC,GAAG,CAAC,GAAG,gBAAgB,IAAI,GAAG,CAAC,GAAG,MAAM;AAC7H,WAAO;AAAA,MACH,QAAQ;AAAA,MACR,QAAQ,CAAC,GAAG,OAAO,OAAO,CAAC;AAAA,MAC3B,YAAY,YAAY,QAAQ,IAAI,IAAI,KAAK,WAAW;AAAA,MACxD,eAAe,YAAY,WAAW,IAAI,IAAI,KAAK,cAAc;AAAA,IACrE;AAAA,EACJ;AAAA;AAAA,EAGA,oBAAoB,MAAuC,SAAoD;AAC3G,UAAM,cAAc,IAAI,IAAI,CAAC,GAAG,KAAK,KAAK,GAAG,GAAG,KAAK,YAAY,KAAK,CAAC,EAAE,OAAO,OAAK,CAAC,UAAU,KAAK,IAAI,CAAC,GAAG,KAAK,YAAY,IAAI,CAAC,CAAC,CAAC,CAAC;AACtI,UAAM,iBAAiB,IAAI,IAAI,CAAC,GAAG,QAAQ,KAAK,GAAG,GAAG,KAAK,eAAe,KAAK,CAAC,EAAE,OAAO,OAAK,CAAC,UAAU,QAAQ,IAAI,CAAC,GAAG,KAAK,eAAe,IAAI,CAAC,CAAC,CAAC,CAAC;AACrJ,QAAI,YAAY,SAAS,KAAK,eAAe,SAAS,EAAG,QAAO,CAAC;AACjE,WAAO,CAAC,GAAG,KAAK,OAAO,OAAO,CAAC,EAAE,OAAO,OAAK,YAAY,IAAI,EAAE,QAAQ,GAAG,KAAK,eAAe,IAAI,EAAE,QAAQ,MAAM,CAAC,EAAE,IAAI,OAAK,EAAE,QAAQ,GAAG;AAAA,EAC/I;AAAA;AAAA,EAGA,eAAe,SAAyC;AACpD,UAAM,UAAU,KAAK;AACrB,UAAM,aAAa,KAAK;AACxB,SAAK,cAAc,IAAI,IAAI,QAAQ,UAAU;AAC7C,SAAK,iBAAiB,IAAI,IAAI,QAAQ,aAAa;AACnD,UAAM,OAAO,IAAI,IAAI,KAAK,oBAAoB,SAAS,UAAU,CAAC;AAClE,UAAM,SAAS,KAAK,cAAc,SAAS,UAAU;AACrD,UAAM,SAAS,KAAK,QAAQ,QAAQ,MAAM;AAC1C,eAAWA,QAAO,OAAO,KAAM,MAAK,IAAIA,IAAG;AAC3C,WAAO,KAAK,SAAS,KAAK,CAAC,SACrB,YAAY,OACZ,IAAI,YAAY,OAAO,cAAc,OAAO,cAAc,gBAAgB,IAAI,GAAG,CAAC,GAAG,MAAM;AAAA,EACrG;AAAA;AAAA,EAGA,cAAc,MAAuC,SAAmD;AACpG,WAAO,aAAa,MAAM,KAAK,WAAW,KAAK,aAAa,SAAS,KAAK,cAAc;AAAA,EAC5F;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,kBAAkB,MAAsB,gBAA+B;AACnE,UAAM,OAAO,KAAK,SAAS;AAC3B,UAAM,SAAS,OAAO,KAAK,cAAc,KAAK;AAC9C,UAAM,UAAU,oBAAI,IAAwB;AAC5C,eAAW,CAAC,OAAO,KAAK,KAAK,QAAQ;AACjC,YAAM,KAAK,KAAK,KAAK,OAAO,IAAI,YAAY,OAAO,CAAC,IAAI,IAAI,YAAY,GAAG,KAAK,CAAC;AACjF,UAAI,OAAO,OAAW,SAAQ,IAAI,OAAO,GAAG,MAAM,GAAG,QAAQ,KAAK;AAAA,IACtE;AACA,UAAM,QAAQ,KAAK,QAAQ,IAAI,OAAO,IAAI,KAAK,QAAQ,CAAC,IAAI;AAC5D,QAAI,KAAK,YAAY,kBAAkB,UAAU,QAAW;AACxD,YAAM,QAAQ,MAAM,UAAU,EAAE,SAAS,OAAU,CAAC;AACpD,UAAI,CAAC,MAAM,SAAS;AAChB,iBAAS,IAAI,GAAG,IAAI,KAAK,OAAO,IAAK,SAAQ,IAAI,KAAK,QAAQ,GAAG,KAAK;AAAA,MAC1E;AAAA,IACJ;AACA,QAAI,KAAM,MAAK,cAAc;AAAA,QACxB,MAAK,iBAAiB;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,eAAe,OAAgC;AAC3C,UAAM,QAAQ,oBAAI,IAAwB;AAC1C,UAAM,MAAM,CAAC,WAA6B;AACtC,UAAI,CAAC,MAAM,IAAI,OAAO,GAAG,EAAG,OAAM,IAAI,OAAO,KAAK,MAAM;AAAA,IAC5D;AAEA,UAAMU,YAAW,oBAAI,IAAoB;AACzC,eAAW,QAAQ,KAAK,OAAO,OAAO,GAAG;AACrC,UAAI,CAAC,KAAK,eAAe,CAAC,MAAM,SAAS,KAAK,OAAO,EAAG;AACxD,UAAI,KAAK,WAAW,KAAK,OAAO,CAAC;AACjC,YAAM,QAAQ,IAAI,KAAK,YAAY,IAAI,KAAK,QAAQ,GAAG,KAAK,WAAW,OAAO,GAAG,KAAK,KAAK,eAAe,IAAI,KAAK,QAAQ,MAAM,KAAK,WAAW,OAAO,GAAG;AAC3J,MAAAA,UAAS,IAAI,QAAQA,UAAS,IAAI,KAAK,KAAK,KAAK,CAAC;AAAA,IACtD;AACA,UAAM,OAAO,YAAY,KAAK,aAAa,MAAM,MAAM,KAAK,MAAM,KAAK,GAAG;AAC1E,UAAM,UAAU,YAAY,KAAK,gBAAgB,MAAM,MAAM,QAAQ,MAAM,KAAK,MAAM;AACtF,eAAWV,QAAO,KAAK,OAAO,GAAG;AAC7B,iBAAWC,WAAU,QAAQ,OAAO,GAAG;AACnC,YAAID,KAAI,QAAQC,QAAO,SAASS,UAAS,IAAI,GAAGV,KAAI,MAAM,GAAG,IAAIC,QAAO,MAAM,GAAG,EAAE,KAAK,GAAI,KAAID,KAAI,MAAM,KAAKC,QAAO,MAAM,KAAK,iBAAiB,CAAC,CAAC;AAAA,MACxJ;AAAA,IACJ;AACA,WAAO,CAAC,GAAG,MAAM,OAAO,CAAC;AAAA,EAC7B;AAAA;AAAA,EAGA,aAAa,OAAkC;AAC3C,UAAM,EAAE,OAAO,KAAK,IAAI;AACxB,WAAO;AAAA,MACH,KAAK,KAAK,cAAc,MAAM,MAAM,MAAM,GAAG,MAAM,KAAK,MAAM,QAAQ,KAAK,MAAM;AAAA,MACjF,QAAQ,KAAK,cAAc,MAAM,KAAK,KAAK,KAAK,MAAM,GAAG,MAAM,QAAQ,KAAK,MAAM;AAAA,MAClF,MAAM,KAAK,cAAc,OAAO,MAAM,SAAS,GAAG,MAAM,QAAQ,MAAM,KAAK,KAAK,GAAG;AAAA,MACnF,OAAO,KAAK,cAAc,OAAO,KAAK,QAAQ,KAAK,SAAS,GAAG,MAAM,KAAK,KAAK,GAAG;AAAA,IACtF;AAAA,EACJ;AAAA;AAAA,EAGA,cAAc,YAAqB,QAAgB,OAAe,OAAe,MAA4B;AACzG,UAAM,QAAQ,oBAAI,IAAwB;AAC1C,UAAM,UAAU,CAAC,SAA2B;AACxC,UAAI,CAAC,MAAM,IAAI,KAAK,GAAG,EAAG,OAAM,IAAI,KAAK,KAAK,IAAI;AAAA,IACtD;AACA,UAAMW,SAAQ,aAAa,WAAW;AACtC,UAAM,YAAY,UAAU;AAC5B,UAAM,WAAW,QAAQA;AACzB,UAAMC,UAAS,aAAa,KAAK,iBAAiB,KAAK;AACvD,UAAM,SAAS,YAAYA,SAAQ,OAAO,IAAI;AAC9C,UAAM,UAAU,CAAC,aAA0B,iBAA0C,aAC/EF,MAAK,YAAY,YAAY,SAAS,WAAW,MAAM,WAAW,aAAa,MAAM,WAAW,IAAI,IACpGA,MAAK,YAAY,YAAY,QAAQ,WAAW,MAAM,WAAW,aAAa,OAAO,WAAW,IAAI;AAC1G,UAAM,QAAQ,CAAC,MAAc,aACzB,OAAO,KAAK,QAAQC,SAAQ,YAAY,OAAO,KAAK,UAAU,aAAa,IAAI,YAAY,MAAM,QAAQ,IAAI,IAAI,YAAY,UAAU,IAAI,CAAC;AAChJ,UAAM,WAAW,CAAC,MAAc,UAAmC,aAC7D,KAAK,YAAY,IAAI,IAAI,GAAG,WAAW,MAAM,WAAW,YAAY,OACpE,MAAM,WAAW,KAAK,eAAe,IAAI,IAAI,GAAG,WAAW,YAAY;AAE7E,UAAMR,QAAO,oBAAI,IAAY;AAC7B,eAAW,QAAQ,KAAK,OAAO,OAAO,GAAG;AACrC,UAAI,KAAK,YAAY,OAAW;AAChC,YAAM,OAAO,aAAa,KAAK,QAAQ,MAAM,KAAK,QAAQ;AAC1D,YAAM,WAAW,aAAa,KAAK,QAAQ,SAAS,KAAK,QAAQ;AACjE,UAAK,SAAS,UAAU,SAAS,SAAU,WAAW,SAAS,WAAW,QAAQA,MAAK,IAAI,QAAQ,EAAG;AACtG,MAAAA,MAAK,IAAI,QAAQ;AACjB,cAAQ,QAAQ,MAAM,QAAQ,QAAQ,GAAG,MAAM,OAAO,QAAQ,CAAC,CAAC;AAChE,YAAMI,SAAQ,QAAQ,OAAO,KAAKK,QAAO,IAAI,QAAQ,KAAK,WAAW,OAAO,GAAG,GAAG,mBAAoB;AACtG,MAAAL,OAAM;AAAA,IACV;AAEA,eAAW,EAAE,OAAO,OAAO,OAAO,KAAK,OAAO,OAAO,GAAG;AACpD,UAAI,SAAS,EAAG,SAAQ,QAAQ,SAAS,QAAQ,KAAK,GAAG,SAAS,OAAO,KAAK,CAAC,CAAC;AAAA,IACpF;AACA,WAAO,CAAC,GAAG,MAAM,OAAO,CAAC;AAAA,EAC7B;AAAA;AAAA;AAAA,EAKA,CAAC,qBAAqB,SAA4C;AAC9D,eAAW,aAAa,KAAK,YAAY,OAAO,EAAG,OAAM,IAAI,UAAU,MAAM,SAAS;AACtF,UAAM,MAAM,KAAK,sBAAsB,IAAI,QAAQ,GAAG;AACtD,QAAI,QAAQ,OAAW,QAAO;AAC9B,eAAW,CAAC,WAAW,KAAK,KAAK,KAAK,uBAAuB;AACzD,UAAI,MAAM,KAAK,UAAQ,KAAK,SAAS,OAAO,CAAC,EAAG,OAAM;AAAA,IAC1D;AAAA,EACJ;AAAA;AAAA,EAGA,WAAW,WAAkD;AACzD,WAAO,KAAK,YAAY,SAAS,IAAI,OAAO,KAAK,SAAS,KAAK,QAAQ,WAAW,aAAa,CAAC;AAAA,EACpG;AAAA;AAAA,EAGA,aAAa,SAAuB,MAAgC;AAChE,UAAM,UAAU,OAAM,oBAAoB,KAAK,UAAU,SAAS,MAAM,IAAI;AAC5E,QAAI;AACJ,eAAW,CAAC,OAAO,MAAM,KAAK,SAAS;AACnC,UAAI,UAAU,KAAM,QAAO;AAAA,UACtB,MAAK,SAAS,QAAQ,OAAO,MAAM;AAAA,IAC5C;AACA,WAAO,QAAQ,YAAY;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,oBAAoB,UAAoB,SAAuB,WAAkB,eAAqD;AAEzI,UAAM,SAAS,SAAS,YAAY;AACpC,eAAW,SAAS,SAAS,OAAQ,OAAM,UAAU;AACrD,UAAM,OAAO,IAAI,IAAwB,SAAS,OAAO,IAAI,OAAK,CAAC,GAAG,MAAM,YAAY,gBAAgB,oBAAI,IAAY,CAAC,CAAC,CAAC;AAC3H,UAAM,UAAU,IAAI,IAA0B,SAAS,OAAO,IAAI,OAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAC/E,UAAM,MAAM,CAAC,SAAwC;AACjD,iBAAW,CAAC,OAAO,MAAM,KAAK,KAAM,SAAQ,QAAQ,IAAI,KAAK,GAAG,mBAAoB,EAAE,KAAK,MAAM;AAAA,IACrG;AACA,QAAI,OAAM,iBAAiB,UAAU,SAAS,MAAM,IAAI,CAAC;AACzD,QAAI,SAAS;AACb,eAAS;AACL,YAAM,UAAuB,CAAC;AAC9B,iBAAW,SAAS,SAAS,QAAQ;AACjC,cAAM,QAAQ,MAAM,cAAc;AAClC,YAAI,MAAM,WAAW,EAAG;AACxB,cAAM,YAAY,QAAQ,KAAK,IAAI,KAAK,GAAG,gBAAiB;AAC5D,mBAAW,WAAW,MAAO,WAAU,IAAI,QAAQ,GAAG;AACtD,gBAAQ,QAAQ,IAAI,KAAK,GAAG,mBAAoB,EAAE,KAAK,IAAI,YAAY,OAAO,CAAC,GAAG,gBAAgB,MAAM,IAAI,OAAK,EAAE,GAAG,CAAC,CAAC,CAAC;AACzH,mBAAW,WAAW,MAAO,SAAQ,KAAK,IAAI,UAAU,OAAO,OAAO,CAAC;AAAA,MAC3E;AACA,UAAI,QAAQ,WAAW,EAAG;AAC1B,YAAM,UAAU,IAAI,aAAa;AACjC,iBAAW,QAAQ,QAAS,SAAQ,OAAO,KAAK,MAAM,qBAAqB,KAAK,OAAO,CAAC;AACxF,UAAK,QAAQ,SAAS,KAAK,CAAC,SAAS,OAAO,KAAK,OAAK,EAAE,mBAAmB,KAAM,WAAW,WAAY;AACxG,UAAI,OAAM,iBAAiB,UAAU,SAAS,MAAM,IAAI,CAAC;AACzD;AAAA,IACJ;AACA,cAAU,sBAAsB;AAChC,UAAM,SAAS,oBAAI,IAAwB;AAC3C,eAAW,CAAC,OAAO,IAAI,KAAK,SAAS;AACjC,UAAI,UAAU,aAAa,KAAK,SAAS,EAAG,QAAO,IAAI,OAAO,YAAY,MAAM,IAAI,CAAC;AAAA,IACzF;AACA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,iBAAiB,UAAoB,SAAuB,MAA+B,cAAgD;AAE9I,UAAM,QAAQ,IAAI,aAAa,OAAO;AACtC,QAAI,cAAc;AACd,iBAAW,SAAS,SAAS,OAAQ,YAAW,OAAO,MAAM,kBAAmB,OAAM,IAAI,IAAI,UAAU,OAAO,YAAY,QAAQ,GAAG,CAAC,CAAC;AAAA,IAC5I;AACA,UAAM,QAAqB,CAAC,GAAG,KAAK;AACpC,aAAS,OAAO,GAAG,OAAO,MAAM,QAAQ,QAAQ;AAC5C,YAAM,OAAO,QAAQ,MAAM,IAAI,GAAG,eAAe;AACjD,iBAAW,aAAa,KAAK,MAAM,qBAAqB,KAAK,OAAO,GAAG;AACnE,YAAI,MAAM,IAAI,SAAS,EAAG,OAAM,KAAK,SAAS;AAAA,MAClD;AAAA,IACJ;AAEA,UAAM,SAAS,IAAI,IAA2C,SAAS,OAAO,IAAI,OAAK,CAAC,GAAG,oBAAI,IAAI,CAAC,CAAC,CAAC;AACtG,UAAM,SAAS,IAAI,IAAgD,SAAS,OAAO,IAAI,OAAK,CAAC,GAAG,oBAAI,IAAI,CAAC,CAAC,CAAC;AAC3G,UAAM,eAAe,IAAI,IAA0B,SAAS,OAAO,IAAI,OAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACpF,UAAM,WAAW,CAAC,UAAiD,QAAQ,OAAO,IAAI,KAAK,GAAG,yBAA0B;AACxH,UAAM,WAAW,CAAC,UAAsD,QAAQ,OAAO,IAAI,KAAK,GAAG,kBAAmB;AACtH,UAAM,iBAAiB,CAAC,UAAgC,QAAQ,aAAa,IAAI,KAAK,GAAG,8BAA+B;AACxH,UAAM,WAAW,IAAI,aAAa;AAClC,eAAW,UAAU,OAAO;AACxB,YAAM,OAAO,OAAO,MAAM,OAAO,IAAI,OAAO,QAAQ,GAAG;AACvD,YAAM,QAAQ,MAAM;AACpB,UAAI,OAAO,WAAW,OAAW,UAAS,IAAI,MAAM;AAAA,eAE3C,UAAU,UAAa,MAAM,gBAAgB,OAAW,UAAS,OAAO,KAAK,EAAE,IAAI,OAAO,QAAQ,KAAK,OAAO,QAAQ;AAAA,IACnI;AAGA,UAAMM,SAAQ,IAAI,aAA0B;AAC5C,UAAM,UAAU,IAAI,aAAqB;AACzC,eAAW,WAAW,SAAU,SAAQ,IAAI,SAAS,CAAC;AACtD,eAAW,aAAa,UAAU;AAC9B,YAAM,UAAuB,CAAC;AAC9B,YAAM,OAAO,IAAI,aAAa;AAC9B,iBAAW,aAAa,UAAU,MAAM,qBAAqB,UAAU,OAAO,GAAG;AAC7E,YAAI,CAAC,KAAK,IAAI,SAAS,KAAK,CAAC,SAAS,IAAI,SAAS,EAAG;AACtD,gBAAQ,KAAK,SAAS;AACtB,gBAAQ,IAAI,WAAW,QAAQ,QAAQ,IAAI,SAAS,GAAG,iBAAiB,IAAI,CAAC;AAAA,MACjF;AACA,MAAAA,OAAM,IAAI,WAAW,OAAO;AAAA,IAChC;AAIA,UAAM,aAAa,IAAI,aAAa;AACpC,UAAM,QAAmB,EAAE,KAAK,QAAW,YAAY,MAAM;AAC7D,UAAM,UAAU,oBAAI,IAA2D;AAG/E,UAAM,UAAU,CAAC,WAAyC;AACtD,YAAM,EAAE,OAAO,QAAQ,IAAI;AAC3B,YAAM,cAAc,SAAS,KAAK;AAClC,UAAI,YAAY,IAAI,QAAQ,GAAG,EAAG,QAAO,YAAY,IAAI,QAAQ,GAAG;AACpE,UAAI,WAAW,IAAI,MAAM,EAAG,QAAO,MAAM,UAAU,QAAQ;AAC3D,iBAAW,IAAI,MAAM;AACrB,YAAM,EAAE,QAAQ,UAAU,IAAI,QAAQ,QAAQ,IAAI,KAAK,GAAG,kBAAmB;AAC7E,YAAM,SAAS,QAAQ,MAAM,OAAO,IAAI,QAAQ,GAAG,GAAG,oBAAqB;AAC3E,YAAM,OAAO,QAAQ,OAAO,OAAO,QAAQ,oBAAqB;AAChE,YAAM,QAAQ,UAAU;AACxB,gBAAU,OAAO;AAEjB,YAAM,WAAW,MAAM;AACvB,YAAM,kBAAkB,MAAM;AAC9B,YAAM,MAAM;AACZ,YAAM,aAAa;AACnB,UAAI;AACJ,YAAM,UAAU,MAAM,OAAO,MAAM,MAAM;AACzC,YAAM,cAAc,SAAS,KAAK;AAClC,UAAI,YAAY,QAAW;AACvB,gBAAQ;AACR,oBAAY,IAAI,QAAQ,KAAK,MAAS;AAAA,MAC1C,OAAO;AAGH,cAAM,WAAW,UAAU,eAAe,IAAI;AAC9C,cAAM,QAAQ,QAAQ,QAAQ,IAAI,UAAU,QAAQ,QAAQ,IAAI;AAChE,cAAM,SAAS,UAAU,SAAY,UAAU,SAAS,QAAQ,IAAI;AACpE,cAAM,MAAM,MAAM;AAClB,YAAI,QAAQ,QAAW;AACnB,kBAAQ,MAAM,UAAU,GAAG;AAC3B,sBAAY,IAAI,QAAQ,KAAK,MAAS;AAAA,QAC1C,WAAW,MAAM,YAAuB;AACpC,kBAAQ,MAAM;AACd,sBAAY,IAAI,QAAQ,KAAK,MAAS;AAAA,QAC1C,OAAO;AACH,sBAAY,IAAI,QAAQ,KAAK,KAAK;AAClC,kBAAQ,UAAU,SAAY,UAAU,MAAM,WAAW,CAAC,IACpD,aAAa,QAAQ,KAAK,IAAI,MAAM,UAAU,SAAS,IACvD,MAAM,GAAG,GAAG,CAAC,KAAK,MAAM,WAAW,CAAC;AAAA,QAC9C;AAAA,MACJ;AAEA,UAAI,MAAM,WAAW;AACjB,cAAM,QAAQ,WAAW,MAAM,OAAK,MAAM,WAAW,EAAE,SAAS,MAAM,MAAS;AAC/E,YAAI,UAAU,WAAc,MAAM,OAAO,KAAK,MAAM,UAAU,IAAI;AAC9D,gBAAM,WAAW,IAAI,WAAW,MAAM,MAAM,MAAM,OAAO;AACzD,mBAAS,IAAI,GAAG,IAAI,MAAM,MAAM,KAAK;AACjC,qBAAS,IAAI,GAAG,IAAI,MAAM,SAAS,IAAK,UAAS,IAAI,GAAG,GAAG,MAAM,OAAO;AAAA,UAC5E;AACA,sBAAY,IAAI,QAAQ,KAAK,QAAQ;AACrC,cAAI,aAAa,QAAQ,QAAQ,EAAG,SAAQ,MAAM,UAAU,SAAS;AAAA,QACzE;AAAA,MACJ;AACA,YAAM,MAAM;AACZ,YAAM,aAAa;AACnB,gBAAU,OAAO;AACjB,iBAAW,OAAO,MAAM;AACxB,kBAAY,IAAI,QAAQ,KAAK,KAAK;AAClC,qBAAe,KAAK,EAAE,KAAK,OAAO;AAClC,aAAO;AAAA,IACX;AAEA,eAAW,SAAS,SAAS,QAAQ;AACjC,YAAM,SAAS,IAAI;AAAA,QACf;AAAA,QAAO,SAAS,KAAK;AAAA,QACrB,aAAW;AACP,gBAAM,OAAO,IAAI,UAAU,OAAO,OAAO;AACzC,iBAAO,SAAS,IAAI,IAAI,IAAI,QAAQ,IAAI,IAAI;AAAA,QAChD;AAAA,QACA,SAAS,KAAK;AAAA,QAAG;AAAA,QACjB,UAAQ;AACJ,gBAAM,QAAQ,SAAS,KAAK,IAAI;AAChC,iBAAO,UAAU,SAAY,SAAY,QAAQ,IAAI,KAAK,GAAG;AAAA,QACjE;AAAA,QACA,CAAC,OAAO,SAAS,SAAS,KAAK,OAAO,IAAI,GAAG,IAAI,OAAK,QAAQ,QAAQ,IAAI,CAAC,GAAG,kBAAmB,EAAE,MAAM;AAAA,MAAC;AAC9G,cAAQ,IAAI,OAAO,EAAE,QAAQ,WAAW,IAAI,UAAU,QAAQ,MAAM,OAAO,EAAE,CAAC;AAAA,IAClF;AACA,UAAM,QAAqB,CAAC;AAC5B,eAAW,CAAC,MAAMF,MAAK,KAAK,QAAS,KAAIA,WAAU,EAAG,OAAM,KAAK,IAAI;AACrE,aAAS,OAAO,GAAG,OAAO,MAAM,QAAQ,QAAQ;AAC5C,YAAM,SAAS,QAAQ,MAAM,IAAI,GAAG,cAAc;AAClD,UAAI,CAAC,SAAS,OAAO,KAAK,EAAE,IAAI,OAAO,QAAQ,GAAG,EAAG,SAAQ,MAAM;AACnE,iBAAW,aAAa,QAAQE,OAAM,IAAI,MAAM,GAAG,gBAAiB,GAAG;AACnE,cAAMC,QAAO,QAAQ,QAAQ,IAAI,SAAS,GAAG,iBAAiB,IAAI;AAClE,gBAAQ,IAAI,WAAWA,KAAI;AAC3B,YAAIA,UAAS,EAAG,OAAM,KAAK,SAAS;AAAA,MACxC;AAAA,IACJ;AACA,eAAW,CAAC,QAAQH,MAAK,KAAK,SAAS;AACnC,UAAIA,SAAQ,GAAG;AACX,cAAM,cAAc,SAAS,OAAO,KAAK;AACzC,YAAI,CAAC,YAAY,IAAI,OAAO,QAAQ,GAAG,EAAG,gBAAe,OAAO,KAAK,EAAE,KAAK,OAAO,OAAO;AAC1F,oBAAY,IAAI,OAAO,QAAQ,KAAK,MAAM,UAAU,QAAQ,CAAC;AAAA,MACjE;AAAA,IACJ;AAGA,UAAM,SAAS,oBAAI,IAAwB;AAC3C,eAAW,SAAS,SAAS,QAAQ;AACjC,YAAM,SAAS,MAAM,SAAS,SAAS,KAAK,GAAG,SAAS,KAAK,GAAG,eAAe,KAAK,GAAG,QAAQ,KAAK,IAAI,KAAK,GAAG,gBAAiB,CAAC;AAClI,UAAI,WAAW,OAAW,QAAO,IAAI,OAAO,MAAM;AAAA,IACtD;AACA,WAAO;AAAA,EACX;AAAA;AAAA,EAGA,SAAS,QAAwC,QAA6C,cAA6B,MAA4C;AACnK,QAAI,OAAO,SAAS,KAAK,OAAO,SAAS,KAAK,aAAa,WAAW,KAAK,KAAK,SAAS,EAAG,QAAO;AACnG,eAAW,CAAC,KAAK,KAAK,KAAK,QAAQ;AAC/B,YAAM,SAAS,KAAK,OAAO,IAAI,GAAG;AAClC,UAAI,WAAW,QAAW;AACtB,eAAO,QAAQ;AACf,YAAI,UAAU,OAAW,QAAO,eAAe;AAAA,MACnD;AAAA,IACJ;AACA,UAAM,eAA8B,CAAC;AACrC,eAAW,CAAC,KAAK,KAAK,KAAK,QAAQ;AAC/B,YAAM,OAAO,KAAK,OAAO,IAAI,GAAG;AAChC,YAAM,MAAM,MAAM;AAClB,UAAI,SAAS,QAAW;AACpB,aAAK,QAAQ;AACb,YAAI,KAAK,QAAS,MAAK,OAAO,OAAO,GAAG;AAAA,MAC5C;AACA,UAAI,CAAC,MAAM,UAAU,KAAK,KAAK,GAAG;AAC9B,cAAM,UAAU,YAAY,QAAQ,GAAG;AACvC,qBAAa,KAAK,OAAO;AACzB,aAAK,IAAI,QAAQ,GAAG;AAAA,MACxB;AAAA,IACJ;AACA,iBAAa,KAAK,CAAC,GAAG,MAAM,EAAE,UAAU,CAAC,CAAC;AAC1C,iBAAa,KAAK,CAAC,GAAG,MAAM,EAAE,UAAU,CAAC,CAAC;AAC1C,WAAO,IAAI,YAAY,cAAc,cAAc,gBAAgB,IAAI,CAAC;AAAA,EAC5E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,MAAY,QAAyC;AACxD,QAAI,cAAc,KAAK,mBAAmB,IAAI,KAAK,KAAK,eAAe,IAAI,KAAK,KAAK,aAAa,IAAI,KAAK,KAAK,cAAc,IAAI;AAClI,QAAI,UAAU,KAAK,oBAAoB,IAAI;AAC3C,eAAW,aAAa,KAAK,WAAW,GAAG;AAEvC,UAAI;AACJ,UAAI,UAAU,UAAU;AACpB,kBAAU,OAAO,YAAY,QAAQ,UAAU,WAAW,sBAAuB,GAAG,QAAQ,UAAU,eAAe,qBAAsB,CAAC,KAAK,CAAC;AAAA,MACtJ,OAAO;AACH,cAAMI,OAAM,OAAO,QAAQ,UAAU,SAAS;AAC9C,kBAAUA,SAAQ,SAAY,CAAC,IAAI,CAACA,IAAG;AAAA,MAC3C;AACA,iBAAW,UAAU,SAAS;AAC1B,YAAI,EAAE,kBAAkB,cAAe;AACvC,mBAAW,WAAW,OAAO,MAAM,QAAQ,UAAU,IAAI,GAAG;AACxD,gBAAM,QAAQ,OAAO,KAAK,OAAO;AACjC,cAAI,OAAO,YAAY,KAAM;AAC7B,cAAI,MAAM,UAAU,SAAU,QAAO;AACrC,cAAI,MAAM,UAAU,gBAAiB,eAAc;AACnD,cAAI,MAAM,UAAW,WAAU;AAAA,QACnC;AAAA,MACJ;AAAA,IACJ;AACA,WAAO,cAAc,MAAM,UAAU,eAAe,IAAI,UAAU,MAAM,UAAU;AAAA,EACtF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,gBAA+B;AAC3B,UAAM,UAAyB,CAAC;AAChC,UAAM,MAAM,CAAC,MAAY,UAAmC;AACxD,UAAI,MAAM,UAAU,KAAK,OAAO,KAAK,EAAG;AACxC,WAAK,QAAQ;AACb,cAAQ,KAAK,KAAK,OAAO;AAAA,IAC7B;AACA,UAAM,UAAU,oBAAI,IAAmD;AACvE,UAAM,UAAU,CAAC,GAAG,KAAK,OAAO,OAAO,CAAC,EAAE,OAAO,OAAK,EAAE,UAAU,MAAS,EAAE,SAAS,CAAC,GAAG,MAAM,EAAE,QAAQ,UAAU,EAAE,OAAO,CAAC;AAC9H,eAAW,UAAU,SAAS;AAC1B,UAAI,OAAO,OAAO,WAAW,QAAW;AACpC,eAAO,QAAQ;AACf,eAAO,eAAe;AACtB;AAAA,MACJ;AACA,YAAM,QAAQ,QAAQ,OAAO,OAAO,oBAAqB;AACzD,YAAM,SAAS,OAAO;AAEtB,UAAI,UAAU,CAAC,KAAK,SAAS,KAAK,MAAM,QAAQ,MAAM,MAAM,MAAM,OAAO;AACzE,eAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,CAAC,SAAS,KAAK;AAC7C,iBAAS,IAAI,GAAG,IAAI,MAAM,WAAW,CAAC,SAAS,KAAK;AAChD,cAAI,MAAM,KAAK,MAAM,EAAG;AACxB,gBAAM,MAAM,IAAI,YAAY,OAAO,MAAM,GAAG,OAAO,SAAS,CAAC,EAAE;AAC/D,oBAAU,QAAQ,IAAI,GAAG,KAAK,KAAK,OAAO,IAAI,GAAG,GAAG,UAAU;AAAA,QAClE;AAAA,MACJ;AAEA,UAAI,OAAO,iBAAiB,QAAS,SAAQ,KAAK,OAAO,OAAO;AAChE,aAAO,eAAe;AACtB,UAAI,QAAQ,UAAU,MAAM,UAAU,SAAS,IAAI,MAAM,GAAG,GAAG,CAAC,KAAK,MAAM,WAAW,CAAC,CAAC;AACxF,UAAI,QAAS;AACb,eAAS,IAAI,GAAG,IAAI,MAAM,MAAM,KAAK;AACjC,iBAAS,IAAI,GAAG,IAAI,MAAM,SAAS,KAAK;AACpC,cAAI,MAAM,KAAK,MAAM,EAAG;AACxB,kBAAQ,IAAI,IAAI,YAAY,OAAO,MAAM,GAAG,OAAO,SAAS,CAAC,EAAE,KAAK,EAAE,QAAQ,QAAQ,OAAO,MAAM,GAAG,GAAG,CAAC,KAAK,MAAM,WAAW,CAAC,EAAE,CAAC;AAAA,QACxI;AAAA,MACJ;AAAA,IACJ;AACA,eAAW,QAAQ,CAAC,GAAG,KAAK,OAAO,OAAO,CAAC,EAAE,OAAO,OAAK,EAAE,gBAAgB,UAAa,CAAC,QAAQ,IAAI,EAAE,QAAQ,GAAG,CAAC,GAAG;AAClH,WAAK,cAAc;AACnB,UAAI,KAAK,UAAU,OAAW,KAAI,MAAM,MAAS;AACjD,UAAI,KAAK,QAAS,MAAK,OAAO,OAAO,KAAK,QAAQ,GAAG;AAAA,IACzD;AACA,eAAW,CAAC,KAAK,EAAE,QAAQ,MAAM,CAAC,KAAK,SAAS;AAC5C,YAAM,OAAO,KAAK,SAAS,YAAY,QAAQ,GAAG,CAAC;AACnD,WAAK,cAAc;AACnB,UAAI,MAAM,KAAK;AAAA,IACnB;AACA,YAAQ,KAAK,CAAC,GAAG,MAAM,EAAE,UAAU,CAAC,CAAC;AACrC,WAAO;AAAA,EACX;AAAA;AAAA,EAGA,YAAY,SAA+C;AACvD,WAAO,KAAK,OAAO,IAAI,QAAQ,GAAG,GAAG;AAAA,EACzC;AAAA;AAAA;AAAA,EAKA,IAAI,SAAkC;AAClC,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA,EAGA,IAAI,sBAA+B;AAC/B,WAAO,KAAK,kBAAkB,OAAO;AAAA,EACzC;AAAA;AAAA,EAGA,iBAAiB,OAAkC;AAC/C,WAAO,KAAK,aAAa,OAAO,oBAAI,IAAI,CAAC;AAAA,EAC7C;AAAA,EAEA,aAAa,MAAqB;AAC9B,WAAO,KAAK,YAAY,UAAa,CAAC,GAAG,KAAK,MAAM,CAAC,EAAE,KAAK,UAAQ,KAAK,aAAa,UAAa,KAAK,SAAS,KAAK;AAAA,EAC1H;AAAA;AAAA,EAGA,IAAI,eAA4B;AAC5B,WAAO,CAAC,GAAG,KAAK,aAAa,EAAE,IAAI,SAAO,IAAI,UAAU,MAAM,YAAY,QAAQ,GAAG,CAAC,CAAC;AAAA,EAC3F;AAAA,EAEA,eAAe,MAAqB;AAChC,WAAO,KAAK,SAAS,UAAU,UAAa,WAAW,IAAI;AAAA,EAC/D;AAAA;AAAA,EAGA,IAAI,gBAA6B;AAC7B,WAAO,CAAC,GAAG,KAAK,cAAc,EAAE,IAAI,SAAO,IAAI,UAAU,MAAM,YAAY,QAAQ,GAAG,CAAC,CAAC;AAAA,EAC5F;AAAA;AAAA,EAGA,YAAe,WAAuB;AAClC,WAAO,KAAK,SAAS,YAAY,SAAS;AAAA,EAC9C;AAAA;AAAA,EAGA,cAAoB;AAChB,SAAK,SAAS,YAAY;AAAA,EAC9B;AAAA;AAAA,EAGA,KAAK,MAAmBX,QAAmC;AACvD,UAAM,OAAO,KAAK,SAAS;AAC3B,WAAO,SAAS,SAAY,SAAY,OAAO,MAAM,KAAK,OAAO,MAAMA,QAAO,OAAO,KAAK,SAAS,OAAO,CAAC;AAAA,EAC/G;AAAA,EAEA,cAAc,MAAqB;AAC/B,WAAO,KAAK,SAAS,SAAS,UAAa,YAAY,IAAI;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,SAASH,OAAc,OAA8C;AACjE,UAAM,SAAS,CAAC,GAAG,KAAK,SAAS,OAAO,OAAO,CAAC,EAAE,SAAS,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AACtF,WAAO;AAAA,MAAgBA;AAAA,MAAM;AAAA,MAAO,OAAO,IAAI,OAAK,EAAE,IAAI;AAAA,MACtD,UAAQ,KAAK,SAAS,OAAO,IAAI,cAAc,IAAI,CAAC,GAAG;AAAA,IAAO;AAAA,EACtE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,WAAWA,OAA2C;AAClD,WAAO,kBAAkBA,OAAM,KAAK,KAAK,EAAE,OAAO,OAAK,EAAE,iBAAiB,UAAa,KAAK,YAAY,EAAE,YAAY,CAAC;AAAA,EAC3H;AAAA,EAEA,YAAYD,SAAoC;AAC5C,WAAO,KAAK,SAAS,OAAO,IAAI,cAAcA,QAAO,KAAK,CAAC,GAAG,YAAY,IAAI,cAAcA,QAAO,MAAM,CAAC,MAAM;AAAA,EACpH;AAAA;AAAA;AAAA,EAKA,IAAI,eAA8B;AAC9B,WAAO,CAAC,GAAG,KAAK,SAAS,OAAO,OAAO,CAAC,EAAE,SAAS,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK,EACzE,IAAI,OAAK,IAAI,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,QAAW,EAAE,UAAU,EAAE,GAAG,CAAC;AAAA,EAC7F;AAAA;AAAA,EAGA,mBAAmB,MAAc,SAA4B,MAAyB,CAAC,GAAgB;AACnG,UAAM,MAAM,OAAM,mBAAmB,MAAM,OAAO;AAClD,QAAI,QAAQ,OAAW,OAAM,IAAI,WAAW,GAAG;AAC/C,UAAM,YAAY,OAAM,WAAW,MAAM,SAAS,GAAG;AACrD,QAAI,cAAc,OAAW,OAAM,IAAI,WAAW,SAAS;AAC3D,UAAM,SAAS,KAAK,SAAS;AAC7B,UAAM,OAAO,OAAO,IAAI,cAAc,IAAI,CAAC;AAC3C,QAAI,SAAS,QAAW;AAEpB,UAAI,YAAY,KAAK,SAAS,OAAO,KAAK,YAAY,KAAK,KAAK,cAAc,SAAS,GAAG,CAAC,EAAG,QAAO,YAAY;AACjH,aAAO,OAAO,cAAc,IAAI,CAAC;AACjC,WAAK,QAAQ,MAAM,SAAS,KAAK,KAAK,KAAK;AAAA,IAC/C,OAAO;AACH,WAAK,QAAQ,MAAM,SAAS,GAAG;AAAA,IACnC;AAEA,SAAK,YAAY;AACjB,WAAO,KAAK,oBAAoB,IAAI;AAAA,EACxC;AAAA;AAAA,EAGA,QAAQ,MAAc,SAA4B,KAAwB,OAAsB;AAC5F,UAAM,SAAS,KAAK,SAAS;AAC7B,UAAM,QAAQ,oBAAI,IAAoB;AACtC,YAAQ,QAAQ,CAACA,SAAQ,MAAM,MAAM,IAAI,cAAcA,OAAM,GAAG,CAAC,CAAC;AAClE,UAAM,OAAO,OAAO,SAAS,IAAI,IAAI,KAAK,IAAI,GAAG,CAAC,GAAG,OAAO,OAAO,CAAC,EAAE,IAAI,OAAK,EAAE,KAAK,CAAC,IAAI;AAC3F,WAAO,IAAI,cAAc,IAAI,GAAG,IAAI,WAAW,MAAM,CAAC,GAAG,OAAO,GAAG,OAAO,cAAc,SAAS,GAAG,GAAG,SAAS,IAAI,CAAC;AAAA,EACzH;AAAA;AAAA,EAGA,OAAO,mBAAmB,MAAc,SAAgD;AACpF,QAAI,CAAC,YAAY,IAAI,EAAG,QAAO,IAAI,IAAI;AACvC,QAAI,QAAQ,WAAW,EAAG,QAAO;AACjC,UAAM,OAAO,oBAAI,IAAY;AAC7B,eAAWA,WAAU,SAAS;AAC1B,UAAIA,QAAO,WAAW,EAAG,QAAO;AAChC,YAAM,MAAM,cAAcA,OAAM;AAChC,UAAI,KAAK,IAAI,GAAG,EAAG,QAAO,eAAeA,OAAM;AAC/C,WAAK,IAAI,GAAG;AAAA,IAChB;AACA,WAAO;AAAA,EACX;AAAA;AAAA,EAGA,OAAO,WAAW,MAAc,SAA4B,KAA4C;AACpG,UAAM,OAAO,oBAAI,IAAY;AAC7B,eAAWA,WAAU,KAAK;AACtB,UAAI,CAAC,QAAQ,KAAK,OAAK,iBAAiB,GAAGA,OAAM,CAAC,EAAG,QAAO,YAAYA,OAAM,mCAAmC,IAAI;AACrH,YAAM,IAAI,cAAcA,OAAM;AAC9B,UAAI,KAAK,IAAI,CAAC,EAAG,QAAO,mBAAmBA,OAAM,SAAS,IAAI;AAC9D,WAAK,IAAI,CAAC;AAAA,IACd;AACA,WAAO;AAAA,EACX;AAAA;AAAA,EAGA,IAAI,oBAA0C;AAC1C,WAAO,CAAC,GAAG,KAAK,SAAS,OAAO,OAAO,CAAC,EAAE,SAAS,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,OAAK,IAAI,mBAAmB,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,CAAC;AAAA,EAC7I;AAAA;AAAA,EAGA,gBAAgB,MAAc,MAA6D;AACvF,UAAME,SAAQ,KAAK,SAAS,OAAO,IAAI,cAAc,IAAI,CAAC;AAC1D,QAAIA,WAAU,OAAW,OAAM,IAAI,MAAM,0BAA0B,IAAI,gBAAgB;AACvF,UAAM,QAAQA,OAAM,QAAQ;AAC5B,UAAM,UAAmC,MAAM,KAAK,EAAE,QAAQ,MAAM,GAAG,MAAM,CAAC,CAAC;AAC/E,QAAIS,SAAQ;AACZ,eAAWZ,QAAO,MAAM;AACpB,UAAIA,KAAI,WAAW,MAAO,OAAM,IAAI,WAAW,OAAO,OAAOY,MAAK,CAAC,4CAA4C,OAAO,KAAK,CAAC,gBAAgBT,OAAM,IAAI,IAAI;AAC1J,eAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAC5B,cAAM,QAAQH,KAAI,CAAC;AACnB,YAAI,OAAO,YAAY,SAAS,MAAM,UAAU,mBAAmB,MAAM,UAAU,WAAW;AAC1F,gBAAM,IAAI,WAAW,GAAG,MAAM,KAAK,uCAAuC;AAAA,QAC9E;AACA,gBAAQ,QAAQ,CAAC,GAAG,UAAU,EAAE,KAAK,KAAK;AAAA,MAC9C;AACA,MAAAY;AAAA,IACJ;AAEA,SAAK,YAAY;AACjB,QAAIT,OAAM,IAAI,SAAS,GAAG;AACtB,YAAM,QAAQA,OAAM,IAAI,IAAI,OAAK,QAAQ,QAAQ,QAAQA,OAAM,YAAY,IAAI,cAAc,CAAC,CAAC,GAAG,sBAAuB,CAAC,GAAG,cAAc,CAAC;AAC5I,YAAM,SAAS,YAAY,KAAK;AAChC,UAAI,WAAW,QAAW;AAEtB,QAAAA,OAAM,OAAO;AACb,QAAAA,OAAM,WAAW;AACjB,cAAM,UAAU,KAAK,oBAAoBA,OAAM,IAAI;AACnD,cAAM,IAAI;AAAA,UAAiBA,OAAM;AAAA,UAAMA,OAAM;AAAA,UAAK,MAAM,IAAI,OAAK,QAAQ,EAAE,OAAO,KAAK,GAAG,OAAO,CAAC;AAAA,UAAG,OAAO;AAAA,UACxG,MAAM,IAAI,OAAK,QAAQ,EAAE,OAAO,MAAM,GAAG,OAAO,CAAC;AAAA,UAAG,OAAO;AAAA,UAAQ;AAAA,QAAO;AAAA,MAClF;AAAA,IACJ;AAEA,IAAAA,OAAM,OAAO;AACb,IAAAA,OAAM,WAAW,QAAQ,IAAI,OAAK,EAAE,KAAK,OAAK,GAAG,cAAc,IAAI,CAAC;AACpE,IAAAA,OAAM,WAAWS;AACjB,WAAO,KAAK,oBAAoBT,OAAM,IAAI;AAAA,EAC9C;AAAA;AAAA,EAGA,oBAAoB,MAA2B;AAC3C,UAAM,UAAU,IAAI,aAAa;AACjC,eAAW,SAAS,KAAK,SAAS,QAAQ;AACtC,YAAM,QAAQ,MAAM,cAAc,IAAI,cAAc,IAAI,CAAC;AACzD,UAAI,UAAU,OAAW,YAAW,OAAO,MAAO,SAAQ,IAAI,IAAI,UAAU,OAAO,YAAY,QAAQ,GAAG,CAAC,CAAC;AAAA,IAChH;AAEA,QAAI,QAAQ,SAAS,KAAK,CAAC,KAAK,SAAS,OAAO,KAAK,OAAK,EAAE,mBAAmB,EAAG,QAAO,YAAY;AACrG,WAAO,KAAK,aAAa,SAAS,oBAAI,IAAI,CAAC;AAAA,EAC/C;AAAA;AAAA,EAGA,YAAY,MAAcF,SAAyB;AAC/C,UAAME,SAAQ,KAAK,SAAS,OAAO,IAAI,cAAc,IAAI,CAAC;AAC1D,QAAIA,WAAU,OAAW,QAAO,QAAQ,QAAQ,QAAQ;AACxD,QAAIA,OAAM,SAAS,OAAW,QAAO,QAAQ,QAAQ,eAAe;AACpE,UAAM,QAAQA,OAAM,YAAY,IAAI,cAAcF,OAAM,CAAC;AACzD,WAAO,UAAU,SAAY,QAAQ,QAAQ,OAAO,IAAI,QAAQ,SAAS,QAAQE,OAAM,KAAK,KAAK,GAAG,UAAU,CAAC;AAAA,EACnH;AAAA;AAAA,EAGA,mBAAmB,MAAcF,SAAyB;AACtD,UAAME,SAAQ,KAAK,SAAS,OAAO,IAAI,cAAc,IAAI,CAAC;AAC1D,QAAIA,QAAO,SAAS,OAAW,QAAO;AACtC,UAAM,QAAQA,OAAM,YAAY,IAAI,cAAcF,OAAM,CAAC;AACzD,WAAO,UAAU,UAAaE,OAAM,SAAS,KAAK,MAAM;AAAA,EAC5D;AAAA,EAEA,oBAAoB,MAAqB;AACrC,eAAW,aAAa,KAAK,qBAAqB,GAAG;AACjD,UAAI,KAAK,mBAAmB,UAAU,OAAO,UAAU,MAAM,EAAG,QAAO;AAAA,IAC3E;AACA,WAAO;AAAA,EACX;AAAA,EAEA,mBAAmB,MAAqB;AACpC,eAAW,aAAa,KAAK,qBAAqB,GAAG;AACjD,YAAMA,SAAQ,KAAK,SAAS,OAAO,IAAI,cAAc,UAAU,KAAK,CAAC;AACrE,UAAIA,WAAU,UAAaA,OAAM,SAAS,OAAW,QAAO;AAAA,IAChE;AACA,WAAO;AAAA,EACX;AAAA,EAEA,sBAAsB,aAA0B,SAAqB;AACjE,eAAWA,UAAS,WAAW,OAAO,GAAG;AACrC,UAAI,MAAM,KAAK,cAAc,IAAIA,MAAK;AACtC,UAAI,QAAQ,QAAW;AACnB,cAAM,oBAAI,IAAI;AACd,aAAK,cAAc,IAAIA,QAAO,GAAG;AAAA,MACrC;AACA,UAAI,IAAI,YAAY,GAAG;AAAA,IAC3B;AAAA,EACJ;AAAA,EAEA,wBAAwB,aAA0B,SAAqB;AACnE,eAAWA,UAAS,WAAW,OAAO,GAAG;AACrC,YAAM,MAAM,KAAK,cAAc,IAAIA,MAAK;AACxC,UAAI,KAAK,OAAO,YAAY,GAAG,MAAM,QAAQ,IAAI,SAAS,EAAG,MAAK,cAAc,OAAOA,MAAK;AAAA,IAChG;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,OAAe;AACf,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA,EAGA,QAAQ,MAAoB;AACxB,SAAK,QAAQ;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,YAAY,MAAkC;AACjD,QAAI,KAAK,WAAW,EAAG,QAAO;AAC9B,QAAI,KAAK,SAAS,OAAM,kBAAmB,QAAO,6BAA6B,OAAO,OAAM,iBAAiB,CAAC;AAC9G,QAAI,eAAe,KAAK,IAAI,EAAG,QAAO;AACtC,QAAI,KAAK,WAAW,GAAG,KAAK,KAAK,SAAS,GAAG,EAAG,QAAO;AACvD,QAAI,iBAAiB,MAAM,SAAS,EAAG,QAAO;AAC9C,WAAO;AAAA,EACX;AAAA;AAAA,EAGA,OAAO,YAAY,MAAuB;AACtC,WAAO,OAAM,YAAY,IAAI,MAAM;AAAA,EACvC;AAAA;AAAA,EAGA,OAAO,UAAU,MAAsB;AACnC,UAAM,SAAS,OAAM,YAAY,IAAI;AACrC,QAAI,WAAW,OAAW,OAAM,IAAI,WAAW,MAAM;AACrD,WAAO;AAAA,EACX;AAAA;AAAA,EAGA,OAAO,MAA2B;AAC9B,WAAO,KAAK,YAAY,IAAI,EAAE;AAAA,EAClC;AAAA;AAAA,EAGA,YAAY,WAAwC;AAChD,WAAO,OAAM,MAAM,WAAW,KAAK,KAAK;AAAA,EAC5C;AAAA;AAAA,EAGA,OAAO,MAAM,WAA+B,MAAuB;AAC/D,WAAO,cAAc,UAAa,iBAAiB,WAAW,IAAI;AAAA,EACtE;AAAA;AAAA,EAGA,QAAQ,WAA+B;AACnC,WAAO,CAAC,UAAU,YAAY,KAAK,YAAY,UAAU,SAAS;AAAA,EACtE;AAAA;AAAA,EAGA,UAAU,OAAqB;AAC3B,QAAI,MAAM,WAAW,UAAa,MAAM,SAAS,SAAS,GAAG,MAAM,KAAM,QAAO;AAChF,UAAM,QAAQ,CAAC,cAA+B,KAAK,YAAY,SAAS,KAAK,cAAc,KAAK;AAChG,WAAO,MAAM;AAAA,MAAQ;AAAA,MACjB,OAAK,EAAE,KAAK;AAAA,QACR,WAAW,EAAE,cAAc,UAAa,MAAM,EAAE,SAAS,IAAI,KAAK,QAAQ,EAAE;AAAA,QAC5E,eAAe,EAAE,kBAAkB,UAAa,MAAM,EAAE,aAAa,IAAI,KAAK,QAAQ,EAAE;AAAA,MAC5F,CAAC;AAAA,MACD,OAAM,MAAM,CAAC,IAAI,KAAK,QAAQ;AAAA,IAAE;AAAA,EACxC;AAAA;AAAA,EAGA,eAAe,OAAqB;AAChC,UAAM,UAAU,MAAM;AACtB,QAAI,MAAM,WAAW,UAAa,SAAS,SAAS,GAAG,MAAM,KAAM,QAAO;AAC1E,UAAM,YAAY,4BAA4B,SAAS,CAACA,QAAOF,YAAW;AACtE,YAAM,WAAW,KAAK,SAAS,OAAO,IAAI,cAAcE,MAAK,CAAC;AAC9D,YAAM,QAAQ,UAAU,YAAY,IAAI,cAAcF,OAAM,CAAC;AAC7D,aAAO,aAAa,UAAa,UAAU,SAAY,SAAY,EAAE,OAAO,SAAS,MAAM,QAAQ,QAAQ,SAAS,QAAQ,KAAK,GAAG,UAAU,EAAE;AAAA,IACpJ,CAAC;AACD,WAAO,cAAc,UAAU,QAAQ,MAAM,YAAY,SAAS;AAAA,EACtE;AAAA;AAAA,EAGA,YAAY,MAA2B;AACnC,WAAM,UAAU,IAAI;AACpB,WAAO,KAAK,SAAS,YAAY,MAAM,IAAI;AAAA,EAC/C;AAAA;AAAA,EAGA,WAAW,QAAkC;AACzC,WAAO,KAAK,SAAS,WAAW,MAAM,MAAM;AAAA,EAChD;AAAA;AAAA,EAGA,iBAA2D;AACvD,UAAM,OAAiD,CAAC;AACxD,eAAW,QAAQ,KAAK,OAAO,OAAO,GAAG;AACrC,UAAI,KAAK,OAAO,WAAW,OAAW,MAAK,KAAK,EAAE,SAAS,KAAK,SAAS,OAAO,KAAK,MAAM,CAAC;AAAA,IAChG;AACA,WAAO;AAAA,EACX;AAAA;AAAA,EAGA,oBAAmC;AAC/B,UAAM,OAAsB,CAAC;AAC7B,eAAW,QAAQ,KAAK,OAAO,OAAO,GAAG;AACrC,YAAM,SAAS,KAAK,OAAO;AAC3B,UAAI,WAAW,UAAa,CAAC,GAAG,OAAO,WAAW,CAAC,EAAE,KAAK,OAAK,EAAE,cAAc,MAAS,EAAG,MAAK,KAAK,KAAK,OAAO;AAAA,IACrH;AACA,WAAO;AAAA,EACX;AAAA;AAAA,EAGA,aAAa,SAAsB,OAAoB;AACnD,SAAK,SAAS,OAAO,EAAE,QAAQ;AAAA,EACnC;AAAA;AAAA,EAGA,sBAA4B;AACxB,eAAW,eAAe,KAAK,kBAAkB,KAAK,EAAG,MAAK,kBAAkB,YAAY,QAAQ,WAAW,CAAC;AAAA,EACpH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,eAAe,SAAyC;AACpD,UAAM,UAAU,CAAC,SAAyC;AACtD,cAAQ,KAAK,MAAM;AAAA,QACf,KAAK,aAAa;AAEd,cAAI,KAAK,UAAU,SAAU,QAAO;AACpC,gBAAM,QAAQ,KAAK,WAAW,KAAK,UAAU,SAAS;AACtD,cAAI,UAAU,OAAW,QAAO;AAChC,gBAAM,QAAQ,MAAM,gBAAgB,IAAI,YAAY,KAAK,UAAU,MAAM,KAAK,UAAU,OAAO,CAAC;AAChG,iBAAO,MAAM,wBAAwB,SAAY;AAAA,QACrD;AAAA,QACA,KAAK;AACD,iBAAO,QAAQ,KAAK,KAAK;AAAA,QAC7B,KAAK;AACD,iBAAO,QAAQ,KAAK,OAAO;AAAA,QAC/B,KAAK,UAAU;AACX,gBAAM,QAAQ,KAAK;AACnB,cAAIc,QAAO,QAAQ,KAAK,QAAQ;AAChC,qBAAW,KAAK,MAAO,CAAAA,QAAO,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,OAAOA,OAAM,QAAQ,EAAE,KAAK,CAAC;AACxF,iBAAOA;AAAA,QACX;AAAA,QACA,KAAK;AACD,cAAI,KAAK,SAAS,UAAU,KAAK,SAAS,QAAS,QAAO,aAAa;AACvE,cAAI,KAAK,SAAS,MAAO,QAAO,aAAa;AAC7C,qBAAW,YAAY,KAAK,WAAW;AACnC,kBAAM,SAAS,QAAQ,QAAQ;AAC/B,gBAAI,WAAW,OAAW,QAAO;AAAA,UACrC;AACA,iBAAO;AAAA,QACX,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AACD,iBAAO;AAAA,QACX;AACI,iBAAO,YAAY,IAAI;AAAA,MAC/B;AAAA,IACJ;AACA,WAAO,OAAO,OAAO,IAAI,QAAQ,OAAO,IAAI;AAAA,EAChD;AAAA;AAAA;AAAA,EAKA,eAAed,SAA8C;AACzD,WAAO,KAAK,cAAc,IAAI,YAAYA,OAAM,CAAC;AAAA,EACrD;AAAA;AAAA,EAGA,eAAe,SAAoB,OAAwC;AACvE,UAAMgB,WAAU,OAAM,iBAAiB,KAAK;AAC5C,WAAO,KAAK,iBAAiB,SAASA,aAAY,SAAY,SAAY,IAAI,iBAAiBA,UAAS,WAAW,CAAC,EAAE;AAAA,EAC1H;AAAA;AAAA,EAGA,wBAAwB,SAAoB,OAA4B;AACpE,WAAO,KAAK,iBAAiB,SAAS,IAAI,iBAAiB,QAAQ,OAAM,iBAAiB,KAAK,GAAG,SAAS,GAAG,gBAAgB,CAAC,EAAE;AAAA,EACrI;AAAA;AAAA,EAGA,OAAO,iBAAiB,OAA+C;AACnE,QAAI,UAAU,UAAc,QAAQ,KAAK,SAAS,OAAM,eAAiB,QAAO;AAChF,UAAM,IAAI,WAAW,+CAA+C,OAAO,OAAM,cAAc,CAAC,0DAA0D;AAAA,EAC9J;AAAA;AAAA,EAGA,iBAAiB,SAAoB,OAAqG;AACtI,UAAM,SAAS,IAAI,IAAI,KAAK,aAAa;AACzC,aAAShB,UAAS,QAAQ,MAAM,QAAQA,WAAU,QAAQ,KAAK,QAAQA,WAAU;AAC7E,UAAI,UAAU,OAAW,MAAK,cAAc,OAAOA,OAAM;AAAA,UACpD,MAAK,cAAc,IAAIA,SAAQ,KAAK;AAAA,IAC7C;AACA,WAAO,EAAE,QAAQ,IAAI,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,oBAAoB,MAAM,CAAC,GAAG,OAAO;AAAA,EAC3F;AAAA;AAAA,EAGA,oBAAoB,QAA4D;AAC5E,UAAMQ,OAAM,KAAK;AACjB,SAAK,gBAAgB,IAAI,IAAI,MAAM;AACnC,UAAM,UAAU,KAAK,oBAAoBA,IAAG;AAC5C,WAAO,QAAQ,WAAW,IAAI,YAAY,OAAO,IAAI,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,OAAO;AAAA,EACxF;AAAA;AAAA,EAGA,kBAAiD;AAC7C,WAAO,IAAI,IAAI,KAAK,aAAa;AAAA,EACrC;AAAA;AAAA,EAGA,oBAAoB,QAAyD;AACzE,WAAO,gBAAgB,CAAC,GAAG,OAAO,KAAK,GAAG,GAAG,KAAK,cAAc,KAAK,CAAC,EAAE,OAAO,OAAK;AAChF,YAAM,MAAM,OAAO,IAAI,CAAC;AACxB,YAAMA,OAAM,KAAK,cAAc,IAAI,CAAC;AACpC,aAAO,EAAE,QAAQ,UAAaA,SAAQ,UAAa,IAAI,OAAOA,IAAG;AAAA,IACrE,CAAC,CAAC;AAAA,EACN;AAAA;AAAA,EAGA,mBAAmB,MAAsB,gBAA+B;AACpE,QAAI,KAAK,SAAS,UAAW;AAC7B,UAAM,UAAU,oBAAI,IAA8B;AAClD,eAAW,CAACR,SAAQ,KAAK,KAAK,KAAK,eAAe;AAC9C,YAAMiB,SAAQ,KAAK,KAAK,IAAI,YAAY,GAAGjB,OAAM,CAAC;AAClD,UAAIiB,WAAU,OAAW,SAAQ,IAAIA,OAAM,QAAQ,KAAK;AAAA,IAC5D;AACA,UAAMH,QAAO,KAAK,QAAQ,IAAI,KAAK,cAAc,IAAI,KAAK,QAAQ,CAAC,IAAI;AACvE,QAAI,KAAK,YAAY,kBAAkBA,UAAS,QAAW;AACvD,YAAM,QAAQ,IAAI,iBAAiBA,MAAK,OAAO,WAAW;AAC1D,eAAS,IAAI,GAAG,IAAI,KAAK,OAAO,IAAK,SAAQ,IAAI,KAAK,QAAQ,GAAG,KAAK;AAAA,IAC1E;AACA,SAAK,gBAAgB;AAAA,EACzB;AAAA;AAAA,EAGA,aAAyC;AACrC,UAAM,OAAmC,CAAC;AAC1C,eAAWd,WAAU,CAAC,GAAG,KAAK,cAAc,KAAK,CAAC,EAAE,SAAS,CAAC,GAAG,MAAM,IAAI,CAAC,GAAG;AAC3E,YAAM,QAAQ,QAAQ,KAAK,cAAc,IAAIA,OAAM,GAAG,SAAS;AAC/D,YAAM,OAAO,KAAK,GAAG,EAAE;AACvB,UAAI,SAAS,UAAa,KAAK,SAASA,UAAS,KAAK,KAAK,UAAU,MAAM,SAAS,KAAK,SAAS,MAAM,MAAM;AAC1G,aAAK,KAAK,SAAS,CAAC,IAAI,IAAI,yBAAyB,KAAK,OAAOA,SAAQ,KAAK,OAAO,KAAK,IAAI;AAAA,MAClG,OAAO;AACH,aAAK,KAAK,IAAI,yBAAyBA,SAAQA,SAAQ,MAAM,OAAO,MAAM,IAAI,CAAC;AAAA,MACnF;AAAA,IACJ;AACA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,gBAAgB,SAA0C;AACtD,UAAM,OAAO,KAAK,OAAO,IAAI,QAAQ,GAAG;AACxC,UAAM,QAAQ,MAAM;AACpB,QAAI,SAAS,UAAa,UAAU,OAAW,QAAO;AAEtD,UAAM,QAAQ,MAAM,YAAY,KAAK,QAAQ,MAAM;AACnD,QAAI,OAAO,SAAS,SAAU,QAAO;AACrC,UAAMK,UAAS,MAAM;AACrB,UAAM,SAAS,KAAK,gBAAgB,OAAO;AAC3C,QAAI,CAAC,OAAO,uBAAuB;AAC/B,YAAM,EAAE,MAAAJ,OAAM,WAAW,IAAI,OAAO,OAAO,OAAO,KAAK,OAAO;AAC9D,aAAO,aAAa,SAAYA,MAAK;AAAA,IACzC;AACA,UAAM,SAAS,eAAe;AAC9B,QAAI,oBAAoBI,SAAQ,MAAM,MAAM,KAAM,QAAO,QAAQ,cAAcA,SAAQ,QAAQ,KAAK,OAAO,GAAG,qBAAqB,EAAE;AACrI,aAAS,aAAa,GAAG,cAAc,QAAQ,cAAc;AACzD,UAAI,oBAAoBA,SAAQ,UAAU,MAAM,MAAO,QAAO;AAAA,IAClE;AACA,WAAO;AAAA,EACX;AAAA;AAAA,EAGA,iBAAiB,OAAiC;AAC9C,WAAO,CAAC,GAAG,KAAK,QAAQ,IAAI,KAAK,MAAM,MAAM,KAAK,MAAM,MAAM,QAAQ,MAAM,KAAK,KAAK,MAAM,KAAK,MAAM,CAAC,CAAC,EACpG,OAAO,aAAW,KAAK,OAAO,IAAI,QAAQ,GAAG,GAAG,UAAU,MAAS;AAAA,EAC5E;AAAA;AAAA;AAAA,EAKA,WAAWN,MAAaY,SAAQ,GAAgB;AAC5C,WAAO,KAAK,YAAY,IAAI,eAAe,QAAQZ,MAAKY,QAAO,IAAI,CAAC,EAAE;AAAA,EAC1E;AAAA;AAAA,EAGA,WAAWZ,MAAaY,SAAQ,GAAgB;AAC5C,WAAO,KAAK,YAAY,IAAI,eAAe,QAAQZ,MAAKY,QAAO,KAAK,CAAC,EAAE;AAAA,EAC3E;AAAA;AAAA,EAGA,cAAcX,SAAgBW,SAAQ,GAAgB;AAClD,WAAO,KAAK,YAAY,IAAI,eAAe,WAAWX,SAAQW,QAAO,IAAI,CAAC,EAAE;AAAA,EAChF;AAAA;AAAA,EAGA,cAAcX,SAAgBW,SAAQ,GAAgB;AAClD,WAAO,KAAK,YAAY,IAAI,eAAe,WAAWX,SAAQW,QAAO,KAAK,CAAC,EAAE;AAAA,EACjF;AAAA;AAAA,EAGA,gBAAgB,MAAgD;AAC5D,SAAK,SAAS;AACd,QAAI,CAAC,KAAK,SAAU,QAAO;AAC3B,eAAW,QAAQ,KAAK,OAAO,OAAO,GAAG;AAErC,UAAI,KAAK,UAAU,OAAW;AAC9B,YAAMM,SAAQ,KAAK,KAAK,KAAK,OAAO;AAEpC,UAAIA,WAAU,UAAa,CAAC,KAAK,SAAS,KAAK,SAASA,MAAK,GAAG;AAC5D,eAAO,IAAI,aAAa,0BAA0B,GAAG,WAAW,KAAK,SAAS,CAAC,CAAC,eAAe,KAAK,QAAQ,SAAS,CAAC,wCAAwC;AAAA,MAClK;AAAA,IACJ;AACA,WAAO;AAAA,EACX;AAAA;AAAA,EAGA,gBAAgB,MAAsBA,QAA8B;AAChE,UAAM,OAAO,KAAK,SAAS;AAC3B,eAAW,UAAUA,QAAO;AACxB,WAAK,OAAO,OAAO,QAAQ,MAAM,OAAO,QAAQ,YAAY,KAAK,QAAQ,EAAG;AAC5E,eAAS,IAAI,GAAG,IAAI,KAAK,OAAO,KAAK;AACjC,cAAM,KAAK,OAAO,IAAI,YAAY,KAAK,QAAQ,GAAG,OAAO,QAAQ,MAAM,IAAI,IAAI,YAAY,OAAO,QAAQ,KAAK,KAAK,QAAQ,CAAC;AAC7H,cAAM,OAAO,IAAI,KAAK,EAAE;AACxB,aAAK,aAAa,MAAM;AACxB,aAAK,UAAU;AACf,YAAI,KAAK,YAAa,MAAK,OAAO,IAAI,GAAG,KAAK,IAAI;AAAA,MACtD;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA,EAGA,YAAY,MAAsB,iBAAiB,MAAyB;AACxE,UAAM,UAAU,KAAK,gBAAgB,IAAI;AACzC,QAAI,YAAY,OAAW,OAAM,IAAI,kBAAkB,OAAO;AAC9D,SAAK,YAAY;AAEjB,UAAM,SAAS,KAAK,SAAS;AAC7B,UAAM,cAAc,KAAK,eAAe;AACxC,UAAM,aAAa,IAAI,IAAI,KAAK,WAAW;AAC3C,UAAM,gBAAgB,IAAI,IAAI,KAAK,cAAc;AACjD,UAAM,eAAe,KAAK,gBAAgB;AAC1C,UAAM,UAA4B,CAAC;AACnC,UAAM,YAAsD,CAAC;AAC7D,UAAMA,SAAgB,CAAC;AACvB,UAAM,QAAQ,oBAAI,IAAY;AAC9B,eAAW,QAAQ,KAAK,OAAO,OAAO,GAAG;AAErC,UAAI,KAAK,UAAU,UAAa,KAAK,gBAAgB,UAAa,CAAC,KAAK,YAAa;AACrF,YAAM,KAAK,KAAK,KAAK,KAAK,OAAO;AACjC,UAAI,OAAO,QAAW;AAClB,gBAAQ,KAAK,EAAE,SAAS,KAAK,SAAS,OAAO,QAAQ,OAAO,IAAI,KAAK,QAAQ,GAAG,GAAG,kBAAmB,EAAE,CAAC;AACzG;AAAA,MACJ;AACA,UAAI,QAAQ,KAAK;AACjB,YAAM,SAAS,OAAO;AAEtB,UAAI,WAAW,UAAa,CAAC,GAAG,OAAO,KAAK,OAAO,KAAK,cAAc,MAAM,EAAG,OAAM,IAAI,GAAG,GAAG;AAC/F,UAAI,UAAU,UAAa,WAAW,QAAW;AAC7C,cAAM,SAAS,MAAM,QAAQ,OAAO,OAAK,KAAK,IAAI,GAAG,IAAI,CAAC;AAC1D,YAAI,WAAW,OAAO;AAClB,oBAAU,KAAK,EAAE,SAAS,KAAK,SAAS,MAAM,CAAC;AAC/C,gBAAM,IAAI,GAAG,GAAG;AAAA,QACpB,WAAW,CAAC,GAAG,OAAO,WAAW,CAAC,EAAE,KAAK,OAAK,KAAK,QAAQ,GAAG,IAAI,KAAK,KAAK,SAAS,MAAM,GAAG,IAAI,CAAC,GAAG;AAElG,gBAAM,IAAI,GAAG,GAAG;AAAA,QACpB;AACA,gBAAQ;AAAA,MACZ;AACA,YAAM,YAAY,IAAI,KAAK,EAAE;AAC7B,gBAAU,QAAQ;AAClB,gBAAU,QAAQ,UAAU,SAAY,SAAY,KAAK;AACzD,UAAI,KAAK,UAAU,OAAW,OAAM,IAAI,GAAG,GAAG;AAC9C,gBAAU,aAAa,IAAI;AAC3B,MAAAA,OAAM,KAAK,SAAS;AAAA,IACxB;AAEA,UAAM,YAAY,KAAK,kBAAkB,IAAI;AAC7C,UAAM,kBAAkB,oBAAI,IAAmC;AAC/D,eAAW,KAAK,UAAU,UAAW,KAAI,CAAC,gBAAgB,IAAI,EAAE,KAAK,EAAG,iBAAgB,IAAI,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAEvH,SAAK,OAAO,MAAM;AAClB,eAAW,QAAQA,OAAO,MAAK,OAAO,IAAI,KAAK,QAAQ,KAAK,IAAI;AAChE,QAAI,KAAK,YAAY,kBAAkB,KAAK,QAAQ,EAAG,MAAK,gBAAgB,MAAMA,MAAK;AACvF,SAAK,kBAAkB,MAAM,cAAc;AAC3C,SAAK,mBAAmB,MAAM,cAAc;AAC5C,SAAK,oBAAoB;AACzB,eAAW,KAAK,UAAU,UAAW,GAAE,MAAM,YAAY,EAAE,SAAS,EAAE,KAAK;AAC3E,UAAM,UAAU,IAAI,aAAa,CAAC,GAAG,KAAK,EAAE,IAAI,SAAO,IAAI,UAAU,MAAM,YAAY,QAAQ,GAAG,CAAC,CAAC,CAAC;AACrG,YAAQ,OAAO,UAAU,KAAK;AAE9B,UAAM,eAAe,QAAQ,SAAS,KAAK,CAAC,KAAK,SAAS,OAAO,KAAK,OAAK,EAAE,mBAAmB,IAAI,CAAC,IAAI,KAAK,aAAa,SAAS,oBAAI,IAAI,CAAC,EAAE;AAE/I,eAAW,CAAC,OAAO,QAAQ,KAAK,gBAAiB,MAAK,SAAS,QAAQ,OAAO,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC;AAEtG,UAAM,SAAS,YAAY,MAAM,CAAC,KAAK,KAAK,QAAQ,cAAc,WAAW,GAAG,IAAI,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,oBAAoB,YAAY,CAAC,CAAC,CAAC,EAC/I,wBAAwB;AAC7B,WAAO;AAAA,MACH;AAAA,MAAQ;AAAA,MAAS;AAAA,MAAW;AAAA,MAAY;AAAA,MAAe;AAAA,MACvD,oBAAoB,UAAU,UAAU,IAAI,QAAM,EAAE,OAAO,EAAE,OAAO,SAAS,EAAE,SAAS,OAAO,EAAE,OAAO,EAAE;AAAA,IAC9G;AAAA,EACJ;AAAA;AAAA,EAGA,kBAAkB,MAAiI;AAC/I,UAAM,YAAmF,CAAC;AAC1F,UAAM,QAAQ,IAAI,aAAa;AAC/B,UAAM,OAAO,CAAC,MAA0B,EAAE,cAAc,UAAa,KAAK,YAAY,EAAE,SAAS;AACjG,eAAW,SAAS,KAAK,SAAS,QAAQ;AACtC,UAAI,UAAU,KAAM;AACpB,iBAAW,EAAE,SAAS,MAAM,KAAK,MAAM,eAAe,GAAG;AACrD,YAAI,MAAM,SAAS,SAAS,GAAG,MAAM,KAAM;AAC3C,cAAM,SAAS,MAAM,QAAQ,OAAO,OAAM,KAAK,CAAC,IAAI,KAAK,IAAI,GAAG,IAAI,IAAI,CAAE;AAC1E,YAAI,WAAW,OAAO;AAClB,oBAAU,KAAK,EAAE,OAAO,OAAO,SAAS,OAAO,QAAQ,QAAQ,MAAM,CAAC;AACtE,gBAAM,IAAI,IAAI,UAAU,OAAO,OAAO,CAAC;AAAA,QAC3C,WAAW,CAAC,GAAG,QAAQ,MAAM,QAAQ,WAAW,EAAE,WAAW,CAAC,EAAE,KAAK,OAAM,KAAK,CAAC,KAAK,KAAK,QAAQ,GAAG,IAAI,KAAM,KAAK,SAAS,MAAM,GAAG,IAAI,CAAC,GAAG;AAC3I,gBAAM,IAAI,IAAI,UAAU,OAAO,OAAO,CAAC;AAAA,QAC3C;AAAA,MACJ;AAAA,IACJ;AACA,WAAO,EAAE,WAAW,MAAM;AAAA,EAC9B;AAAA;AAAA,EAGA,YAAY,SAAsB,OAAoB;AAClD,UAAM,OAAO,QAAQ,KAAK,OAAO,IAAI,QAAQ,GAAG,GAAG,oBAAoB;AACvE,UAAM,MAAM,KAAK,OAAO;AACxB,QAAI,QAAQ,OAAW,MAAK,YAAY,SAAS,GAAG;AACpD,SAAK,QAAQ;AACb,QAAI,MAAM,WAAW,OAAW,MAAK,UAAU,SAAS,MAAM,MAAM;AAAA,EACxE;AAAA;AAAA,EAGA,kBAAkB,WAAmD;AACjE,QAAI,UAAU,WAAW,EAAG,QAAO,YAAY;AAC/C,UAAM,SAAS,oBAAI,IAAmC;AACtD,eAAW,KAAK,UAAW,KAAI,CAAC,OAAO,IAAI,EAAE,KAAK,EAAG,QAAO,IAAI,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAC3F,eAAW,KAAK,UAAW,GAAE,MAAM,YAAY,EAAE,SAAS,EAAE,KAAK;AACjE,UAAM,SAAS,KAAK,aAAa,IAAI,aAAa,UAAU,IAAI,OAAK,IAAI,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,GAAG,oBAAI,IAAI,CAAC;AACnH,eAAW,CAAC,OAAO,QAAQ,KAAK,OAAQ,MAAK,SAAS,QAAQ,OAAO,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC;AAC7F,WAAO;AAAA,EACX;AAAA;AAAA;AAAA,EAKA,GAAG,MAA4B;AAC3B,UAAM,UAAU,KAAK,MAAM,IAAI;AAC/B,QAAI,YAAY,OAAW,OAAM,IAAI,kBAAkB,OAAO;AAE9D,WAAO,KAAK,YAAY,MAAM,KAAK,MAAM,IAAI,CAAC;AAAA,EAClD;AAAA;AAAA,EAGA,MAAM,MAA2C;AAE7C,WAAO,KAAK,MAAM,IAAI,KAAK,KAAK,SAAS,KAAK,MAAM;AAAA,EACxD;AAAA;AAAA,EAGA,OAAO,WAAoD;AACvD,WAAO,CAAC,GAAG,SAAS,EAAE,IAAI,cAAY,EAAE,SAAS,OAAO,KAAK,SAAS,OAAO,EAAE,SAAS,EAAE;AAAA,EAC9F;AAAA;AAAA,EAGA,QAAQ,QAA+C;AACnD,UAAM,OAAO,CAAC,GAAG,MAAM;AACvB,UAAM,OAAO,oBAAI,IAAY;AAC7B,eAAW,EAAE,SAAS,MAAM,KAAK,MAAM;AACnC,UAAI,OAAO,KAAK,OAAO,IAAI,QAAQ,GAAG;AACtC,YAAM,WAAW,SAAS;AAC1B,eAAS,IAAI,KAAK,OAAO;AACzB,UAAI,MAAM,WAAW,IAAI,EAAG;AAC5B,UAAI,CAAC,SAAS,KAAK,SAAS,MAAM,OAAO,GAAG;AACxC,cAAM,YAAY,KAAK,WAAW,OAAO,EAAE;AAC3C,mBAAWlB,QAAO,WAAW,SAAS,KAAK,WAAW,WAAW,MAAM,WAAW,SAAS,EAAG,MAAK,IAAIA,IAAG;AAAA,MAC9G;AACA,WAAK,eAAe,MAAM;AAC1B,WAAK,YAAY,MAAM;AACvB,WAAK,OAAO,MAAM;AAClB,WAAK,OAAO,MAAM;AAClB,WAAK,UAAU,MAAM;AACrB,WAAK,IAAI,QAAQ,GAAG;AACpB,UAAI,CAAC,SAAU,MAAK,OAAO,IAAI,QAAQ,KAAK,IAAI;AAAA,eACvC,KAAK,WAAW,KAAK,UAAU,OAAW,MAAK,OAAO,OAAO,QAAQ,GAAG;AAAA,IACrF;AACA,UAAM,SAAS,KAAK,WAAW,KAAK,IAAI,OAAK,CAAC,EAAE,SAAS,EAAE,MAAM,KAAK,CAAU,CAAC;AAEjF,eAAW,EAAE,QAAQ,KAAK,MAAM;AAC5B,YAAM,OAAO,KAAK,OAAO,IAAI,QAAQ,GAAG;AACxC,UAAI,MAAM,YAAY,QAAQ,KAAK,UAAU,OAAW,MAAK,OAAO,OAAO,QAAQ,GAAG;AAAA,IAC1F;AACA,QAAI,KAAK,SAAS,EAAG,QAAO;AAC5B,eAAWA,QAAO,OAAO,KAAM,MAAK,IAAIA,IAAG;AAC3C,WAAO,IAAI,YAAY,OAAO,cAAc,OAAO,cAAc,gBAAgB,IAAI,CAAC;AAAA,EAC1F;AAAA;AAAA,EAGA,cAAc,MAAsB,SAAyC;AACzE,UAAM,SAAS,KAAK,SAAS;AAC7B,UAAM,cAAc,KAAK,eAAe;AACxC,UAAM,eAAe,KAAK,gBAAgB;AAC1C,UAAM,eAAe,CAAC,GAAG,KAAK,YAAY,KAAK,SAAS,KAAK,EAAE,OAAO,YAAY;AAClF,SAAK,cAAc,IAAI,IAAI,QAAQ,UAAU;AAC7C,SAAK,iBAAiB,IAAI,IAAI,QAAQ,aAAa;AACnD,SAAK,gBAAgB,IAAI,IAAI,QAAQ,YAAY;AACjD,UAAM,SAA2B,CAAC;AAClC,eAAW,EAAE,SAAS,MAAM,KAAK,QAAQ,UAAW,QAAO,KAAK,EAAE,SAAS,OAAO,KAAK,SAAS,OAAO,EAAE,SAAS,UAAU,KAAK,EAAE,CAAC;AACpI,eAAW,KAAK,QAAQ,QAAS,QAAO,KAAK,EAAE,SAAS,EAAE,SAAS,OAAO,EAAE,MAAM,SAAS,CAAC;AAC5F,iBAAa,KAAK,GAAG,KAAK,QAAQ,MAAM,EAAE,YAAY;AACtD,iBAAa,KAAK,GAAG,KAAK,kBAAkB,QAAQ,kBAAkB,EAAE,YAAY;AACpF,WAAO,YAAY,MAAM,CAAC,KAAK,KAAK,QAAQ,cAAc,WAAW,GAAG,IAAI,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,oBAAoB,YAAY,CAAC,CAAC,CAAC,EACvI,wBAAwB;AAAA,EACjC;AAAA;AAAA;AAAA,EAKA,KAAK,OAA6B;AAC9B,UAAM,OAAO,IAAI,KAAK,MAAM,MAAM,KAAK,MAAM,MAAM,QAAQ,MAAM,KAAK,KAAK,MAAM,KAAK,MAAM;AAC5F,QAAI;AACJ,eAAW,WAAW,KAAK,QAAQ,IAAI,GAAG;AACtC,YAAM,QAAQ,KAAK,SAAS,OAAO;AACnC,UAAI,OAAO,YAAY,QAAQ,MAAM,UAAU,oBAAoB,YAAY,UAAa,QAAQ,UAAU,OAAO,IAAI,GAAI,WAAU;AAAA,IAC3I;AACA,QAAI,YAAY,QAAW;AACvB,aAAO,IAAI,UAAU,IAAI;AAAA,QAAa;AAAA,QAClC,GAAG,QAAQ,SAAS,CAAC;AAAA,MAAqH,GAAG,QAAW,QAAW,MAAS;AAAA,IACpL;AACA,UAAM,SAAsB,CAAC;AAC7B,QAAIE,QAAO;AACX,QAAI,OAAO,UAAU,cAAc;AACnC,aAASF,OAAM,MAAM,MAAM,KAAKA,QAAO,MAAM,KAAK,KAAKA,QAAO;AAC1D,cAAQ;AACR,eAASC,UAAS,MAAM,MAAM,QAAQA,WAAU,MAAM,KAAK,QAAQA,WAAU;AACzE,cAAM,UAAU,IAAI,YAAYD,MAAKC,OAAM;AAC3C,eAAO,KAAK,KAAK,cAAc,SAAS,KAAK,KAAK,KAAK,cAAc,OAAO,CAAC;AAC7E,YAAIA,UAAS,MAAM,MAAM,OAAQ,CAAAC,SAAQ;AACzC,cAAM,QAAQ,KAAK,SAAS,OAAO;AACnC,cAAMiB,OAAM,OAAO,SAAS,KAAK;AACjC,cAAM,UAAU,KAAK,WAAW,OAAO;AAEvC,QAAAjB,SAAQ,YAAY,QAAQ,aAAaiB,OAAM,QAAQ,IAAI;AAC3D,gBAAQ,SAAS,OAAOA,MAAK,KAAK,gBAAgB,OAAO,CAAC;AAAA,MAC9D;AACA,MAAAjB,SAAQ;AACR,cAAQ;AAAA,IACZ;AACA,YAAQ;AACR,WAAO,IAAI,UAAU,QAAW,IAAI,WAAW,OAAO,MAAM,GAAGA,OAAM,IAAI;AAAA,EAC7E;AAAA;AAAA,EAGA,cAAc,SAAsB,OAAyC;AACzE,UAAM,SAAS,KAAK,YAAY,OAAO;AACvC,QAAI,WAAW,OAAW,QAAO;AACjC,UAAM,UAAU,KAAK,cAAc,OAAO;AAC1C,UAAMkB,UAAS,MAAM,SAAS,MAAM;AACpC,UAAM,QAAQ,KAAK,SAAS,OAAO;AACnC,QAAIA,WAAU,UAAU,UAAc,MAAM,YAAY,MAAM,UAAU,mBAAmB,MAAM,UAAU,aAAc,MAAM,UAAW,QAAO;AACjJ,WAAO,QAAQ,UAAU,MAAM,UAAU,KAAK,CAAC;AAAA,EACnD;AAAA;AAAA,EAGA,QAAQ,MAAM,OAAmB,QAAgD;AAC7E,UAAM,OAAO,OAAO,MAAM,MAAM,OAAO,MAAM;AAC7C,UAAM,UAAU,OAAO,SAAS,MAAM,OAAO,MAAM;AACnD,aAAS,IAAI,GAAG,IAAI,MAAM,UAAU,KAAK;AACrC,eAAS,IAAI,GAAG,IAAI,MAAM,aAAa,KAAK;AACxC,cAAM,QAAQ,MAAM,GAAG,GAAG,CAAC;AAC3B,cAAM,EAAE,SAAS,IAAI,YAAY,OAAO,MAAM,GAAG,OAAO,SAAS,CAAC,GAAG,OAAO,MAAM,UAAU,MAAM,OAAO,QAAQ,MAAM,OAAO,CAAC,EAAE;AAAA,MACrI;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA,EAGA,SAAS,QAAqB,MAAc,SAA2C;AACnF,UAAM,OAAO,KAAK,SAAS;AAC3B,QAAI,KAAK,MAAM,QAAQ,MAAM,OAAO,EAAG,QAAO;AAC9C,WAAO,IAAI,aAAa,wBAAwB,cAAc,OAAO,IAAI,CAAC,SAAM,OAAO,OAAO,CAAC,OAAO,OAAO,SAAS,CAAC,qCAAqC,KAAK,SAAS,SAAS,CAAC,IAAI;AAAA,EAC5L;AAAA;AAAA,EAGA,SAAS,QAAuD;AAC5D,UAAM,OAAO,KAAK,SAAS;AAC3B,eAAW,SAAS,QAAQ;AAExB,UAAI,KAAK,IAAI,KAAK,MAAM,QAAW;AAC/B,eAAO,IAAI,aAAa,wBAAwB,GAAG,MAAM,SAAS,CAAC,gCAAgC,KAAK,SAAS,SAAS,CAAC,IAAI;AAAA,MACnI;AAAA,IACJ;AACA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA,EAKA,SAAS,QAAmB,QAAmB,WAA0B,WAAW,OAAiB;AACjG,UAAM,WAAW,cAAc,UAAU,cAAc;AACvD,UAAM,UAAU,cAAc,UAAU,cAAc;AACtD,UAAM,SAA2B,CAAC;AAClC,QAAI,aAAa;AAEjB,QAAI,WAAW,SAAS,OAAO,KAAK,KAAK,WAAW,SAAS,OAAO,IAAI,KAAK,CAAC,WAAW,OAAO,MAAM,GAAG;AACrG,mBAAa,UACP,IAAI,UAAU,WAAW,IAAI,YAAY,OAAO,KAAK,MAAM,GAAG,WAAW,MAAM,MAAM,IAAI,IAAI,YAAY,WAAW,MAAM,KAAK,OAAO,KAAK,SAAS,CAAC,GAAG,WAAW,IAAI,IACvK,IAAI,UAAU,WAAW,OAAO,WAAW,IAAI,YAAY,OAAO,MAAM,MAAM,GAAG,WAAW,KAAK,MAAM,IAAI,IAAI,YAAY,WAAW,KAAK,KAAK,OAAO,MAAM,SAAS,CAAC,CAAC;AAAA,IAClL;AAEA,UAAM,WAAW,KAAK,SAAS,CAAC,UAAU,CAAC;AAC3C,QAAI,aAAa,OAAW,QAAO,EAAE,SAAS,UAAU,QAAQ,QAAQ,OAAU;AAClF,UAAM,WAAW,WACX,WAAW,MAAM,WAAW,OAAO,MAAM,UAAU,WAAW,KAAK,WAAW,OAAO,KAAK,WACtF,UAAU,WAAW,MAAM,QAAQ,OAAO,KAAK,MAAM,IAAI,WAAW,KAAK,QAAQ,OAAO,MAAM,MAAM,KACxG,WAAW,MAAM,QAAQ,OAAO,MAAM,OAAO,WAAW,KAAK,QAAQ,OAAO,KAAK,QAC7E,UAAU,WAAW,MAAM,WAAW,OAAO,KAAK,SAAS,IAAI,WAAW,KAAK,WAAW,OAAO,MAAM,SAAS;AAC1H,QAAI,CAAC,UAAU;AACX,aAAO;AAAA,QACH,SAAS,IAAI,aAAa,yBAAyB,UAAU,SAAS,SAAS,OAAO,SAAS,CAAC,+BAA+B,WAAW,SAAS,CAAC,YAAY;AAAA,QAChK;AAAA,QAAQ,QAAQ;AAAA,MACpB;AAAA,IACJ;AAEA,UAAM,SAAS,WAAW,OAAO,WAAW,OAAO;AACnD,UAAMR,SAAQ,WAAW,WAAW,WAAW,WAAW;AAE1D,UAAM,YAAY,WAAW,OAAO,cAAc,OAAO;AACzD,UAAM,SAAS,OAAO,MAAM,OAAO,OAAO,IAAI;AAC9C,UAAM,OAAe,CAAC;AACtB,eAAW,QAAQ,KAAK,OAAO,OAAO,GAAG;AACrC,UAAI,KAAK,UAAU,UAAa,OAAO,SAAS,KAAK,OAAO,GAAG;AAC3D,aAAK,KAAK,IAAI;AACd,YAAI,KAAK,WAAW,EAAG;AAAA,MAC3B;AAAA,IACJ;AAEA,UAAM,aAAa,CAAC,UAAU,KAAK,WAAW,KAAK,KAAK,CAAC,GAAG,OAAO,UAAU,SAAS;AAEtF,QAAI,aAAa,CAAC,UAAU,CAAC;AAC7B,aAAS,IAAI,GAAG,IAAI,OAAO,YAAY,YAAY,KAAK;AACpD,eAAS,IAAI,GAAG,IAAI,OAAO,eAAe,YAAY,KAAK;AACvD,qBAAa,KAAK,SAAS,IAAI,YAAY,OAAO,MAAM,MAAM,GAAG,OAAO,MAAM,SAAS,CAAC,CAAC,EAAE,SAAS,OAAO,UAAU,SAAS;AAAA,MAClI;AAAA,IACJ;AACA,eAAW,QAAQ,KAAK,aAAa,QAAQ,YAAY,UAAU,SAAS,GAAG;AAC3E,YAAM,WAAW,CAAC,MAA2B,WACvC,IAAI,YAAY,OAAO,MAAM,MAAM,GAAG,OAAO,MAAM,SAAS,IAAI,IAChE,IAAI,YAAY,OAAO,MAAM,MAAM,MAAM,OAAO,MAAM,SAAS,CAAC;AAEtE,YAAM,QAAQ,MAAM,KAAK,EAAE,OAAO,GAAG,CAAC,GAAG,MAAM,KAAK,cAAc,SAAS,CAAC,CAAC,CAAC;AAC9E,YAAM,EAAE,MAAM,QAAQ,IAAI,KAAK,UAAU,OAAO,UAAU,UAAU,WAAW,QAAQ,YAAY,UAAU;AAC7G,UAAI,YAAY,OAAW,QAAO,EAAE,SAAS,QAAQ,CAAC,GAAG,QAAQ,OAAU;AAC3E,eAAS,IAAI,GAAG,IAAIA,QAAO,KAAK;AAC5B,cAAM,IAAI,UAAU,SAAS,IAAI,KAAK;AACtC,cAAM,KAAK,WACL,IAAI,YAAY,OAAO,MAAM,MAAM,GAAG,OAAO,MAAM,SAAS,IAAI,IAChE,IAAI,YAAY,OAAO,MAAM,MAAM,MAAM,OAAO,MAAM,SAAS,CAAC;AACtE,cAAM,KAAM,IAAI,SAAU,UAAU;AACpC,eAAO,KAAK,EAAE,SAAS,IAAI,OAAO,QAAQ,MAAM,CAAC,GAAG,eAAe,EAAE,UAAU,KAAK,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC;AAAA,MACpG;AAAA,IACJ;AACA,WAAO,EAAE,SAAS,QAAW,QAAQ,QAAQ,YAAY,KAAK,UAAU,QAAQ,UAAU,SAAS,QAAQA,MAAK,IAAI,OAAU;AAAA,EAClI;AAAA;AAAA,EAGA,UAAU,QAAmB,UAAmB,SAAkB,QAAgBA,QAA2B;AACzG,UAAM,QAAQ,WAAW,KAAK,cAAc,KAAK;AACjD,UAAM,QAAQ,WAAW,OAAO,MAAM,MAAM,OAAO,MAAM;AACzD,UAAM,SAAiD,CAAC;AACxD,aAAS,IAAI,GAAG,IAAIA,QAAO,KAAK;AAC5B,YAAM,IAAI,UAAU,SAAS,IAAI,KAAK;AACtC,YAAM,KAAM,IAAI,SAAU,UAAU;AACpC,aAAO,KAAK,EAAE,OAAO,QAAQ,GAAG,OAAO,MAAM,IAAI,QAAQ,CAAC,KAAK,WAAW,MAAM,CAAC;AAAA,IACrF;AACA,WAAO,EAAE,SAAS,CAAC,UAAU,OAAO;AAAA,EACxC;AAAA;AAAA,EAGA,iBAAiB,MAA2B;AACxC,UAAM,SAAS,QAAQ,KAAK,QAAQ,mBAAoB;AACxD,UAAM,YAAY,kBAAkB,KAAK,OAAO,IAAI,OAAK,EAAE,OAAO,CAAC;AACnE,UAAM,SAAS,KAAK,OAAO,SAAS;AACpC,UAAM,aAAa,IAAI,IAAI,KAAK,WAAW;AAC3C,UAAM,gBAAgB,IAAI,IAAI,KAAK,cAAc;AACjD,UAAM,YAAY,IAAI,IAAI,KAAK,WAAW;AAC1C,UAAM,eAAe,IAAI,IAAI,KAAK,cAAc;AAChD,eAAW,EAAE,OAAO,MAAM,KAAK,OAAO,OAAQ,SAAQ,OAAO,UAAU,eAAe,WAAW,OAAO,KAAK;AAC7G,UAAM,SAAS,KAAK,mBAAmB,WAAW,cAAc,KAAK,QAAQ,IAAI;AACjF,UAAM,QAAQ,KAAK,OAAO,SAAS;AACnC,WAAO,IAAI;AAAA,MAAU;AAAA,MAAM;AAAA,MACvB,OAAK,EAAE,mBAAmB,YAAY,eAAe,QAAQ,KAAK;AAAA,MAClE,OAAK,EAAE,mBAAmB,WAAW,cAAc,OAAO,KAAK;AAAA,IAAC;AAAA,EACxE;AAAA;AAAA,EAGA,mBAAmB,MAAuC,SAA0C,OAAiC,aAAmC;AACpK,UAAM,UAAU,KAAK;AACrB,UAAM,aAAa,KAAK;AACxB,SAAK,cAAc,IAAI,IAAI,IAAI;AAC/B,SAAK,iBAAiB,IAAI,IAAI,OAAO;AACrC,UAAM,WAAW,IAAI,IAAI,KAAK,oBAAoB,SAAS,UAAU,CAAC;AACtE,UAAM,SAAS,KAAK,cAAc,SAAS,UAAU;AACrD,UAAM,SAAS,KAAK,QAAQ,cAAc,KAAK,OAAO,KAAK,IAAI,KAAK;AACpE,QAAI,SAAS,SAAS,KAAK,CAAC,OAAQ,QAAO;AAC3C,eAAWZ,QAAO,OAAO,KAAM,UAAS,IAAIA,IAAG;AAC/C,WAAO,IAAI,YAAY,OAAO,cAAc,OAAO,cAAc,gBAAgB,QAAQ,GAAG,CAAC,GAAG,MAAM;AAAA,EAC1G;AAAA;AAAA,EAGA,aAAa,QAAmB,QAAmB,UAAmB,WAA8B;AAChG,UAAM,QAAQ,WAAW,OAAO,cAAc,OAAO;AACrD,UAAM,YAAY,WAAW,OAAO,MAAM,SAAS,OAAO,MAAM;AAChE,UAAM,aAAa,KAAK,IAAI,WAAW,OAAO,MAAM,MAAM,OAAO,MAAM,QAAQ,WAAW,OAAO,MAAM,MAAM,OAAO,MAAM,MAAM;AAChI,UAAM,YAAY,KAAK,IAAI,WAAW,OAAO,KAAK,MAAM,OAAO,KAAK,QAAQ,WAAW,OAAO,KAAK,MAAM,OAAO,KAAK,MAAM;AAC3H,UAAM,QAAQ,WAAW,KAAK,cAAc,KAAK;AACjD,UAAMa,UAAS,WAAW,KAAK,iBAAiB,KAAK;AAErD,QAAI,CAAC,aAAa,CAAC,GAAG,MAAM,KAAK,CAAC,EAAE,KAAK,OAAK,KAAK,cAAc,KAAK,SAAS,EAAG,QAAO,MAAM,KAAK,EAAE,QAAQ,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC;AAClI,UAAM,SAAS,oBAAI,IAAY;AAC/B,QAAI,CAAC,WAAW;AACZ,iBAAW,KAAKA,QAAO,KAAK,EAAG,KAAI,KAAK,aAAa,IAAI,YAAY,MAAO,QAAO,IAAI,IAAI,SAAS;AAAA,IACxG;AACA,eAAW,QAAQ,KAAK,OAAO,OAAO,GAAG;AACrC,YAAM,SAAS,WAAW,KAAK,QAAQ,SAAS,KAAK,QAAQ;AAC7D,YAAM,UAAU,WAAW,KAAK,QAAQ,MAAM,KAAK,QAAQ;AAC3D,UAAI,UAAU,aAAa,SAAS,YAAY,SAAS,WAAW,cAAc,WAAW,UAAW,QAAO,IAAI,SAAS,SAAS;AAAA,IACzI;AACA,WAAO,gBAAgB,MAAM;AAAA,EACjC;AAAA;AAAA,EAGA,UAAU,OAA6B,UAAsC,UAAmB,WAAoB,QAAiB,YACjI,YAAgI;AAChI,UAAM,OAAO,CAAC,IAAY,GAAW,OAAuC;AACxE,YAAM,OAAO,SAAS,CAAC;AACvB,aAAO,QAAQ,MAAM,CAAC,GAAG,eAAe,EAAE,OAAO,QAAQ,GAAG,MAAM,KAAK,KAAK,GAAG,SAAS,KAAK,MAAM;AAAA,IACvG;AACA,UAAM,SAAS,CAAC,aAAyE,EAAE,MAAM,MAAM,QAAQ;AAC/G,QAAI,SAAU,QAAO,EAAE,MAAM,MAAM,SAAS,OAAU;AAEtD,QAAI,UAAU;AACd,QAAI,QAAQ;AACZ,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACnC,YAAM,OAAO,QAAQ,MAAM,CAAC,GAAG,eAAe;AAC9C,YAAM,WAAW,KAAK,OAAO;AAC7B,UAAI,aAAa,OAAW;AAC5B,UAAI,SAAS,SAAS,UAAU;AAC5B;AACA,cAAM,SAAS,QAAQ,KAAK,cAAc,yBAAyB;AACnE,YAAI,OAAO,QAAQ;AACf,cAAI,CAAC,OAAO,cAAc,MAAM,SAAS,GAAG;AACxC,mBAAO,OAAO,YAAY,SAAS,CAAC,GAAG,OAAO,aACxC,6DACA,8CAA8C,CAAC;AAAA,UACzD;AACA;AAAA,QACJ;AAAA,MACJ,WAAW,SAAS,SAAS,UAAU,KAAK,mBAAmB,SAAS,IAAI,GAAG;AAC3E,eAAO,OAAO,YAAY,SAAS,CAAC,GAAG,IAAI,SAAS,IAAI,0CAA0C,CAAC;AAAA,MACvG;AAAA,IACJ;AAEA,QAAI,YAAY,EAAG,QAAO,EAAE,MAAM,MAAM,SAAS,OAAU;AAC3D,UAAMQ,YAAW,CAAC,MAAsB,QAAQ,QAAQ,MAAM,CAAC,GAAG,eAAe,EAAE,OAAO,UAAU,UAAU,EAAE;AAChH,QAAI,MAAM,WAAW,GAAG;AACpB,YAAMf,UAASe,UAAS,CAAC;AACzB,UAAI,UAAU,EAAG,QAAO,EAAE,MAAM,OAAKC,QAAOhB,UAAS,CAAC,GAAG,SAAS,OAAU;AAG5E,UAAI,UAAU,WAAY,QAAO,EAAE,MAAM,MAAM,SAAS,OAAU;AAClE,UAAI,aAAa,WAAY,QAAO,EAAE,MAAM,OAAKgB,QAAO,UAAUhB,SAAQ,GAAG,CAAC,CAAC,GAAG,SAAS,OAAU;AACrG,aAAO,OAAO,YAAY,SAAS,CAAC,GAAG,4GAA4G,CAAC;AAAA,IACxJ;AACA,QAAI,cAAc,YAAY,KAAK,UAAU,GAAG;AAE5C,YAAM,KAAK,MAAM,UAAU,OAAK,EAAE,UAAU,MAAS;AACrD,YAAMA,UAASe,UAAS,EAAE;AAC1B,YAAM,SAAS,MAAM;AACrB,aAAO,EAAE,MAAM,CAAC,GAAG,MAAO,MAAM,KAAKC,QAAO,UAAUhB,SAAQ,GAAG,KAAK,MAAM,IAAI,MAAM,CAAC,CAAC,IAAI,QAAY,SAAS,OAAU;AAAA,IAC/H;AACA,QAAI,YAAY,MAAM,QAAQ;AAC1B,aAAO,OAAO,YAAY,SAAS,MAAM,UAAU,OAAK,EAAE,OAAO,UAAU,SAAS,QAAQ,CAAC,GAAG,oFAAoF,CAAC;AAAA,IACzL;AAGA,UAAM,KAAK,MAAM,IAAI,CAAC,GAAG,MAAMe,UAAS,CAAC,CAAC;AAC1C,UAAM,SAAS,GAAG,SAAS,KAAK;AAChC,UAAM,QAAQE,SAAQ,EAAE;AACxB,QAAI,MAAM;AACV,QAAI,MAAM;AACV,aAAS,IAAI,GAAG,IAAI,GAAG,QAAQ,KAAK;AAChC,cAAQ,IAAI,UAAU,QAAQ,GAAG,CAAC,GAAG,UAAU,IAAI;AACnD,cAAQ,IAAI,UAAU,IAAI;AAAA,IAC9B;AACA,UAAM,QAAQ,MAAM;AAEpB,UAAM,OAAO,WAAW,KAAK;AAC7B,UAAM,QAAQ,WAAW,QAAQ,SAAS,GAAG,SAAS,MAAM;AAC5D,UAAM,SAAS,WAAW,QAAQ,SAAS,KAAK,MAAM;AACtD,WAAO,EAAE,MAAM,OAAKD,QAAO,KAAK,IAAI,UAAU,OAAO,MAAM,IAAI,GAAG,MAAM,IAAI,UAAU,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,GAAG,SAAS,OAAU;AAAA,EACtI;AAAA;AAAA,EAGA,mBAAmBpB,OAAuB;AACtC,aAAS,IAAI,GAAG,IAAIA,MAAK,QAAQ,IAAK,KAAI,QAAQA,MAAK,WAAW,CAAC,CAAC,EAAG,QAAO;AAE9E,QAAI,mBAAmB,KAAKA,KAAI,EAAG,QAAO;AAC1C,UAAM,MAAM,QAAQ,eAAeA,KAAI,CAAC;AACxC,SAAK,sBAAsB,iBAAiB,KAAK,OAAO;AACxD,WAAO,mBAAmB,EAAE,IAAI,GAAG,KAAK,KAAK,kBAAkB,IAAI,GAAG;AAAA,EAC1E;AACJ;AAIA,SAAS,QAAQ,GAAoB;AACjC,SAAO,IAAI,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO;AACjG;AAEA,SAAS,QAAQ,OAAkB,WAAkC;AACjE,SAAO,MAAM,WAAW;AAAA,IACpB,cAAc,MAAM,iBAAiB,UAAa,MAAM,aAAa,OAAO,UAAU,YAAY,IAAI,SAAY,MAAM;AAAA,IACxH,WAAW,MAAM,cAAc,UAAa,MAAM,cAAc,UAAU,YAAY,SAAY,MAAM;AAAA,IACxG,MAAM,MAAM,SAAS,UAAa,MAAM,KAAK,OAAO,UAAU,IAAI,IAAI,SAAY,MAAM;AAAA,IACxF,MAAM,MAAM,SAAS,UAAa,MAAM,KAAK,OAAO,UAAU,IAAI,IAAI,SAAY,MAAM;AAAA,IACxF,SAAS,MAAM,YAAY,UAAa,MAAM,QAAQ,OAAO,UAAU,OAAO,IAAI,SAAY,MAAM;AAAA,EACxG,CAAC;AACL;AAEA,SAAS,iBAAiB,WAAgC,MAAsE;AAC5H,MAAI,cAAc,UAAW,QAAO;AACpC,UAAQ,MAAM;AAAA,IACV,KAAK;AAAU,aAAO;AAAA,IACtB,KAAK;AAAA,IACL,KAAK;AACD,aAAO;AAAA,IACX,KAAK;AAAA,IACL,KAAK;AACD,aAAO;AAAA,IACX;AAAS,YAAM,IAAI,MAAM,aAAa,OAAO,IAAI,CAAC,uBAAuB;AAAA,EAC7E;AACJ;AAGA,SAAS,aAAa,QAAc,OAA4B;AAC5D,SAAO,OAAO,gBAAgB,OAAO,UAAU,UAAa,OAAO,MAAM,SAAS,MAAM,QAAQ,OAAO,MAAM,YAAY,MAAM;AACnI;AAGA,SAASS,MAAK,aAAyB,cAAsC;AACzE,SAAO,YAAY,SAAS,eAAe;AAC/C;AAEA,IAAM,uBAAuD,CAAC,WAAW,QAAQ,UAAU,OAAO;AAElG,SAAS,eAAe,WAAqD;AACzE,MAAI,CAAC,qBAAqB,SAAS,SAAS,EAAG,OAAM,IAAI,WAAW,qBAAqB,SAAS,GAAG;AACrG,SAAO;AACX;AAEA,SAAS,SAASX,MAAqB;AACnC,MAAI,CAAC,OAAO,UAAUA,IAAG,KAAKA,OAAM,KAAKA,QAAO,SAAU,OAAM,IAAI,WAAW,iBAAiB,OAAO,WAAW,CAAC,CAAC,GAAG;AACvH,SAAOA;AACX;AAEA,SAAS,YAAYC,SAAwB;AACzC,MAAI,CAAC,OAAO,UAAUA,OAAM,KAAKA,UAAS,KAAKA,WAAU,YAAa,OAAM,IAAI,WAAW,oBAAoB,OAAO,cAAc,CAAC,CAAC,GAAG;AACzI,SAAOA;AACX;AAGA,SAAS,SAAS,OAAwD;AACtE,QAAM,OAAO,oBAAI,IAAY;AAC7B,QAAM,QAAQ,QAAQ,MAAM,CAAC,GAAG,gBAAgB;AAChD,SAAO;AAAA,IACH,QAAQ,YAAY,MAAM,MAAM,IAAI,OAAK,EAAE,MAAM,CAAC;AAAA,IAClD,QAAQ,MAAM,QAAQ,OAAK,EAAE,MAAM,EAAE,OAAO,OAAK;AAC7C,UAAI,KAAK,IAAI,EAAE,QAAQ,GAAG,EAAG,QAAO;AACpC,WAAK,IAAI,EAAE,QAAQ,GAAG;AACtB,aAAO;AAAA,IACX,CAAC;AAAA,IACD,YAAY,MAAM;AAAA,IAClB,eAAe,MAAM;AAAA,EACzB;AACJ;AAGA,SAAS,gBAAgB,OAAmB,QAAsC;AAC9E,SAAO,IAAI;AAAA,IACP,OAAO,iBAAiB,SAAY,MAAM,eAAe;AAAA,IACzD,OAAO,cAAc,SAAY,MAAM,YAAY;AAAA,IACnD,OAAO,YAAY,MAAM,SAAS,SAAY,OAAO,YAAY,MAAM,IAAI,IAAI,MAAM;AAAA,IACrF,OAAO,SAAS,SAAY,MAAM,OAAO;AAAA,IACzC,OAAO,eAAe,MAAM,YAAY,SAAY,QAAQ,OAAO,SAAS,iBAAiB,EAAE,QAAQ,MAAM,SAAS,aAAa,MAAM,IAAI,MAAM;AAAA,EAAO;AAClK;AAEA,SAAS,QAAQ,QAAiC,OAAe,OAAyB;AACtF,MAAI,MAAM,QAAS,QAAO,OAAO,KAAK;AAAA,MACjC,QAAO,IAAI,OAAO,KAAK;AAChC;AAEA,SAAS,UAAU,GAA2B,GAAoC;AAC9E,UAAQ,KAAK,WAAW,OAAO,OAAO,KAAK,WAAW,KAAK;AAC/D;AAEA,SAAS,aAAa,GAAoC,GAA6C;AACnG,MAAI,EAAE,SAAS,EAAE,KAAM,QAAO;AAC9B,aAAW,CAAC,KAAK,KAAK,KAAK,GAAG;AAC1B,UAAM,QAAQ,EAAE,IAAI,GAAG;AACvB,QAAI,UAAU,UAAa,CAAC,MAAM,OAAO,KAAK,EAAG,QAAO;AAAA,EAC5D;AACA,SAAO;AACX;AAGA,SAAS,WAAW,SAAsB,QAAqB,OAA8B;AACzF,QAAM,OAAiB,CAAC;AACxB,MAAI,CAAC,OAAO,IAAI,OAAO,MAAM,GAAG,KAAK,QAAQ,MAAM,EAAG,MAAK,KAAK,QAAQ,MAAM,CAAC;AAC/E,MAAI,CAAC,OAAO,OAAO,OAAO,MAAM,MAAM,KAAK,QAAQ,MAAM,WAAW,EAAG,MAAK,KAAK,QAAQ,MAAM,CAAC;AAChG,SAAO;AACX;AAGA,SAAS,KAAK,QAAoE;AAC9E,QAAM,OAA6D,CAAC;AACpE,aAAW,SAAS,CAAC,GAAG,OAAO,KAAK,CAAC,EAAE,SAAS,CAAC,GAAG,MAAM,IAAI,CAAC,GAAG;AAC9D,UAAM,QAAQ,QAAQ,OAAO,IAAI,KAAK,GAAG,SAAS;AAClD,UAAM,OAAO,KAAK,GAAG,EAAE;AACvB,QAAI,SAAS,UAAa,KAAK,SAAS,QAAQ,KAAK,KAAK,MAAM,OAAO,KAAK,EAAG,MAAK,OAAO;AAAA,QACtF,MAAK,KAAK,EAAE,OAAO,OAAO,MAAM,OAAO,MAAM,CAAC;AAAA,EACvD;AACA,SAAO,KAAK,IAAI,OAAK,IAAI,wBAAwB,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,EAAE,MAAM,WAAW,EAAE,MAAM,MAAM,EAAE,MAAM,MAAM,EAAE,MAAM,OAAO,CAAC;AAC3J;AAGA,SAAS,YAAY,QAAyC,OAAe,MAAiE;AAC1I,QAAM,SAAS,oBAAI,IAAkD;AACrE,MAAI,UAAU;AACd,aAAW,CAAC,OAAO,KAAK,KAAK,QAAQ;AACjC,QAAI,QAAQ,SAAS,QAAQ,KAAM;AACnC,UAAMO,SAAQ,OAAO,IAAI,MAAM,GAAG;AAClC,QAAIA,WAAU,OAAW,QAAO,IAAI,MAAM,KAAK,EAAE,OAAO,OAAO,EAAE,CAAC;AAAA,QAC7D,CAAAA,OAAM;AACX;AAAA,EACJ;AACA,QAAM,aAAa,OAAO,QAAQ,IAAI;AACtC,MAAI,aAAa,GAAG;AAChB,UAAMA,SAAQ,OAAO,IAAI,WAAW,MAAM,GAAG;AAC7C,QAAIA,WAAU,OAAW,QAAO,IAAI,WAAW,MAAM,KAAK,EAAE,OAAO,WAAW,OAAO,OAAO,WAAW,CAAC;AAAA,QACnG,CAAAA,OAAM,SAAS;AAAA,EACxB;AACA,SAAO;AACX;AAEA,SAAS,aAAa,OAAuB;AACzC,MAAI,CAAC,OAAO,SAAS,KAAK,KAAK,QAAQ,EAAG,OAAM,IAAI,WAAW,gEAAgE;AAE/H,SAAO,KAAK,IAAI,YAAe,KAAK,MAAM,QAAQ,IAAI,CAAC;AAC3D;AAEA,SAAS,WAAW,MAAqB;AACrC,SAAO,CAAC,GAAG,KAAK,MAAM,CAAC,EAAE,KAAK,UAAQ,KAAK,aAAa,UAAa,KAAK,SAAS,OAAO;AAC9F;AAEA,SAAS,YAAY,MAAqB;AACtC,SAAO,CAAC,GAAG,KAAK,MAAM,CAAC,EAAE,KAAK,UAAQ,KAAK,aAAa,WAAc,KAAK,SAAS,UAAU,KAAK,SAAS,cAAc;AAC9H;AAEA,SAAS,YAAY,GAAsB,GAA+B;AACtE,SAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,CAAC,GAAG,MAAM,MAAM,EAAE,CAAC,CAAC;AAChE;AAGA,SAAS,cAAc,SAA4B,KAAkC;AACjF,SAAO,IAAI,IAAI,OAAK,QAAQ,QAAQ,KAAK,CAAAP,YAAU,iBAAiBA,SAAQ,CAAC,CAAC,GAAG,cAAc,CAAC;AACpG;AAMA,SAAS,YAAY,OAAmG;AACpH,QAAM,UAAU,MAAM,SAAS;AAC/B,QAAM,OAAO,oBAAI,IAAoB;AACrC,QAAM,OAAO,QAAQ,MAAM,CAAC,GAAG,cAAc,EAAE;AAC/C,WAASD,OAAM,GAAGA,OAAM,MAAMA,QAAO;AACjC,QAAI,WAAW;AACf,QAAI,QAAQ;AACZ,eAAWwB,SAAQ,OAAO;AACtB,YAAM,MAAMA,MAAKxB,IAAG;AACpB,UAAI,QAAQ,UAAa,IAAI,SAAS;AAClC,gBAAQ;AACR;AAAA,MACJ;AACA,YAAMyB,SAAQ,mBAAmB,GAAG;AACpC,YAAMnB,UAAS,WAAWmB,OAAM,SAAS,WAAW,gBAAgBA,OAAM,MAAM,IAAIA,OAAM;AAC1F,kBAAY,GAAGA,OAAM,IAAI,IAAI,gBAAgBnB,OAAM,CAAC,IAAI,OAAOmB,OAAM,MAAM,UAAU,EAAE,CAAC,IAAIA,OAAM,QAAQ,EAAE;AAAA,IAChH;AACA,QAAI,CAAC,MAAO;AACZ,UAAM,QAAQ,KAAK,IAAI,QAAQ;AAC/B,QAAI,UAAU,OAAW,QAAO,EAAE,OAAO,QAAQzB,KAAI;AACrD,SAAK,IAAI,UAAUA,IAAG;AAAA,EAC1B;AACA,SAAO;AACX;AAGA,SAAS,mBAAmB,OAA6E;AACrG,UAAQ,MAAM,MAAM;AAAA,IAChB,KAAK;AAAQ,aAAO,EAAE,MAAM,QAAQ,QAAQ,GAAG,MAAM,gBAAgB,MAAM,IAAI,EAAE;AAAA,IACjF,KAAK;AAAU,aAAO,EAAE,MAAM,UAAU,QAAQ,MAAM,QAAQ,MAAM,OAAU;AAAA,IAC9E,KAAK;AAAA,IACL,KAAK;AACD,aAAO,EAAE,MAAM,WAAW,QAAQ,MAAM,UAAU,IAAI,GAAG,MAAM,OAAU;AAAA,IAC7E;AAAS,YAAM,IAAI,MAAM,aAAa,OAAO,MAAM,IAAI,CAAC,uBAAuB;AAAA,EACnF;AACJ;AAGA,SAAS,WAAW,SAAyB;AACzC,QAAM,QAAQ,oBAAI,IAAY;AAC9B,aAAW,aAAa,QAAQ,qBAAqB,EAAG,OAAM,IAAI,cAAc,UAAU,KAAK,CAAC;AAChG,aAAW,QAAQ,UAAU,OAAO,EAAG,OAAM,IAAI,cAAc,IAAI,CAAC;AACpE,SAAO,CAAC,GAAG,KAAK;AACpB;AAGA,SAAS,UAAU,MAAsB;AACrC,UAAQ,KAAK,MAAM;AAAA,IACf,KAAK;AAAQ,aAAO,KAAK,YAAY,SAAY,CAAC,KAAK,IAAI,IAAI,CAAC;AAAA,IAChE,KAAK;AAAgB,aAAO,CAAC,GAAG,UAAU,KAAK,IAAI,GAAG,GAAG,UAAU,KAAK,KAAK,CAAC;AAAA,IAC9E,KAAK;AAAe,aAAO,UAAU,KAAK,KAAK;AAAA,IAC/C,KAAK;AAAS,aAAO,UAAU,KAAK,OAAO;AAAA,IAC3C,KAAK;AAAW,aAAO,UAAU,KAAK,OAAO;AAAA,IAC7C,KAAK;AAAU,aAAO,CAAC,GAAG,KAAK,SAAS,CAAC,EAAE,QAAQ,SAAS;AAAA,IAC5D,KAAK;AAAY,aAAO,KAAK,UAAU,QAAQ,SAAS;AAAA,IACxD,KAAK;AAAO,aAAO,CAAC,GAAG,KAAK,SAAS,QAAQ,OAAK,UAAU,EAAE,KAAK,CAAC,GAAG,GAAG,UAAU,KAAK,WAAW,CAAC;AAAA,IACrG,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACD,aAAO,CAAC;AAAA,IACZ;AAAS,YAAM,IAAI,MAAM,aAAa,OAAQ,KAA2B,IAAI,CAAC,sBAAsB;AAAA,EACxG;AACJ;AAEA,SAAS,YAAY,MAAuB;AACxC,SAAO,iBAAiB,KAAK,IAAI,KAC1B,YAAY,SAAS,IAAI,MAAM,UAC/B,CAAC,iBAAiB,KAAK,IAAI,KAC3B,CAAC,iBAAiB,MAAM,MAAM,KAC9B,CAAC,iBAAiB,MAAM,OAAO;AAC1C;AAGA,SAAS,OAAO,MAAqB;AACjC,UAAQ,KAAK,MAAM;AAAA,IACf,KAAK;AAAU,aAAO;AAAA,IACtB,KAAK;AAAa,aAAO,KAAK,UAAU,UAAU;AAAA,IAClD,KAAK;AAAe,aAAO,OAAO,KAAK,KAAK;AAAA,IAC5C,KAAK;AAAS,aAAO,OAAO,KAAK,OAAO;AAAA,IACxC,KAAK;AAAW,aAAO,KAAK,QAAQ,SAAS;AAAA,IAC7C,KAAK;AAAU,aAAO,KAAK,MAAM,MAAM,OAAK,EAAE,aAAa,OAAO,EAAE,aAAa,OAAO,EAAE,aAAa,OAAO,EAAE,aAAa,GAAG,KAAK,CAAC,GAAG,KAAK,SAAS,CAAC,EAAE,MAAM,MAAM;AAAA,IACtK,KAAK;AACD,UAAI,KAAK,aAAa,OAAW,QAAO;AACxC,UAAI,KAAK,SAAS,UAAU,KAAK,SAAS,WAAW,KAAK,SAAS,MAAO,QAAO;AACjF,cAAQ,KAAK,SAAS,SAAS,KAAK,SAAS,SAAS,KAAK,SAAS,UAAU,KAAK,UAAU,MAAM,OAAK,EAAE,SAAS,eAAe,EAAE,SAAS,QAAQ;AAAA,IACzJ,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACD,aAAO;AAAA,IACX;AACI,aAAO,YAAY,IAAI;AAAA,EAC/B;AACJ;AAGA,SAAS,kBAAkB,MAAqB;AAC5C,UAAQ,KAAK,MAAM;AAAA,IACf,KAAK;AAAW,aAAO;AAAA,IACvB,KAAK;AAAe,aAAO,kBAAkB,KAAK,KAAK;AAAA,IACvD,KAAK;AAAS,aAAO,kBAAkB,KAAK,OAAO;AAAA,IACnD,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACD,aAAO;AAAA,IACX;AACI,aAAO,YAAY,IAAI;AAAA,EAC/B;AACJ;AAGA,SAAS,OAAO,UAAkB,UAAgB,WAAiBe,OAAgCW,QAA2D;AAC1J,MAAI,aAAa,OAAO,aAAa,KAAK;AACtC,UAAMC,WAAUZ,SAAQW;AACxB,WAAOC,aAAY,UAAa,CAACA,SAAQ,YAAYA,WAAU;AAAA,EACnE;AACA,MAAI,kBAAkB,QAAQ,KAAK,kBAAkB,SAAS,GAAG;AAC7D,UAAM,QAAQ,kBAAkB,QAAQ,IAAID,SAAQX;AACpD,WAAO,UAAU,SAAY,kBAAkB;AAAA,EACnD;AACA,MAAI,aAAa,OAAOA,OAAM,WAAW,QAAQW,QAAO,WAAW,KAAM,QAAO;AAChF,SAAOX,SAAQW;AACnB;AAEA,SAAS,WAAWxB,OAAsB;AACtC,SAAO,iBAAiBA,MAAK,OAAO,CAAC,CAAC,IAAIA,MAAK,MAAM,CAAC;AAC1D;AAGA,SAAS,cAAc,SAAwB;AAC3C,SAAO,CAAC,GAAG,QAAQ,MAAM,CAAC,EAAE,KAAK,UAAQ,KAAK,aAAa,WAAc,KAAK,SAAS,SAAS,KAAK,SAAS,aAAa,KAAK,UAAU,WAAW,CAAC;AAC1J;AAMA,SAAS,SAAS,OAA0BiB,MAAa,QAA8B;AACnF,MAAI,OAAO;AACX,MAAI,OAAO,SAAS,SAAU,SAAQ,WAAWA,IAAG;AACpD,MAAI,CAAC,OAAO,UAAW,SAAQ,8BAA8B,cAAc,OAAO,IAAI,CAAC;AACvF,SAAO,GAAG,IAAI,IAAI,WAAWA,IAAG,CAAC;AACrC;AAOO,SAAS,cAAc,MAAsB;AAChD,MAAI,MAAM;AACV,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AAClC,UAAM,IAAI,KAAK,OAAO,CAAC;AACvB,UAAM,IAAI,KAAK,WAAW,CAAC;AAC3B,QAAI,eAAe,KAAK,CAAC,KAAK,IAAI,OAAQ,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,KAAK;AAClH,aAAO;AAAA,IACX,WAAW,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,KAAK;AACtE,aAAO,KAAK,EAAE,SAAS,EAAE,EAAE,YAAY,EAAE,SAAS,GAAG,GAAG,CAAC;AAEzD,YAAM,OAAO,KAAK,OAAO,IAAI,CAAC;AAC9B,UAAI,IAAI,IAAI,KAAK,WAAW,eAAe,KAAK,IAAI,KAAK,SAAS,KAAM,QAAO;AAAA,IACnF,OAAO;AACH,aAAO,KAAK,CAAC;AAAA,IACjB;AAAA,EACJ;AACA,SAAO;AACX;AAGA,SAAS,YAAY,OAAuB;AACxC,SAAO,aAAa,KAAK,KAAK,IAAI,IAAI,MAAM,WAAW,KAAK,IAAI,CAAC,MAAM;AAC3E;AAEA,SAAS,WAAW,OAAuB;AACvC,SAAO,MAAM,WAAW,KAAK,OAAO,EAAE,WAAW,KAAK,MAAM,EAAE,WAAW,KAAK,MAAM;AACxF;AAEA,SAAS,YAAY,IAAiB,MAA4B;AAC9D,SAAO,IAAI,aAAa,2BAA2B,GAAG,GAAG,SAAS,CAAC,UAAU,IAAI,6DAA6D;AAClJ;AAEA,SAASG,QAAOhB,SAAuB;AACnC,SAAO,MAAM,UAAU,OAAO,SAASA,OAAM,IAAI,MAAM,WAAWA,OAAM,IAAI,MAAM,UAAU,OAAO,CAAC;AACxG;AAGA,SAASiB,SAAQ,QAAmC;AAChD,MAAIK,OAAM;AACV,aAAW,KAAK,OAAQ,CAAAA,QAAO;AAC/B,SAAOA,OAAM,OAAO;AACxB;AAKA,IAAM,cAAc;AAGpB,SAAS,WAAWtB,SAAwB;AACxC,SAAO,OAAO,SAASA,OAAM,KAAKA,YAAW,IAAI,OAAO,kBAAkBA,SAAQ,cAAc,CAAC,CAAC,IAAIA;AAC1G;AASA,SAAS,cAAcA,SAAyB;AAC5C,SAAOA,YAAW,KAAM,KAAK,IAAIA,OAAM,KAAK,SAAS,KAAK,IAAIA,OAAM,IAAI;AAC5E;AAGA,SAAS,aAAaA,SAAqC;AACvD,MAAI,CAAC,cAAcA,OAAM,EAAG,QAAO;AACnC,MAAIA,YAAW,EAAG,QAAO,EAAE,OAAO,IAAI,UAAU,EAAE;AAClD,QAAMJ,QAAO,kBAAkBI,SAAQ,cAAc,CAAC;AACtD,QAAM,IAAIJ,MAAK,QAAQ,GAAG;AAC1B,QAAM,WAAWA,MAAK,MAAM,GAAG,CAAC,EAAE,QAAQ,KAAK,EAAE;AACjD,SAAO,EAAE,OAAO,OAAO,QAAQ,GAAG,UAAU,OAAOA,MAAK,MAAM,IAAI,CAAC,CAAC,KAAK,cAAc,GAAG;AAC9F;AAGA,SAAS,UAAU,OAAe,MAAcU,QAAuB;AACnE,MAAIA,WAAU,EAAG,QAAO;AACxB,QAAM,IAAI,aAAa,KAAK;AAC5B,QAAM,IAAI,aAAa,IAAI;AAC3B,MAAI,MAAM,UAAa,MAAM,QAAW;AACpC,UAAM,WAAW,KAAK,IAAI,EAAE,UAAU,EAAE,QAAQ;AAChD,UAAM,QAAQ,EAAE,QAAQ,OAAO,OAAO,EAAE,WAAW,QAAQ,IAAI,OAAOA,MAAK,IAAI,EAAE,QAAQ,OAAO,OAAO,EAAE,WAAW,QAAQ;AAC5H,UAAMiB,WAAU,aAAa,EAAE,OAAO,SAAS,CAAC;AAChD,QAAIA,aAAY,OAAW,QAAO,OAAO,GAAG,OAAOA,SAAQ,KAAK,CAAC,IAAI,OAAOA,SAAQ,QAAQ,CAAC,EAAE;AAAA,EACnG;AACA,SAAO,WAAW,QAAQjB,SAAQ,IAAI;AAC1C;AAGA,SAAS,aAAaN,SAAsC;AACxD,MAAIA,QAAO,UAAU,GAAI,QAAO,EAAE,OAAO,IAAI,UAAU,EAAE;AACzD,QAAM,WAAWA,QAAO,QAAQ;AAChC,QAAM,YAAY,WAAW,CAACA,QAAO,QAAQA,QAAO;AACpD,QAAM,SAAS,UAAU,SAAS,EAAE;AAEpC,QAAM,UAAU,SAAS,IAAIA,QAAO;AACpC,MAAI,UAAU,OAAO,WAAW,GAAI,QAAO;AAC3C,QAAM,OAAO,SAAS;AACtB,MAAI,QAAQ,EAAG,QAAOA;AACtB,QAAM,UAAU,OAAO,OAAO,IAAI;AAClC,MAAI,OAAO,YAAY;AACvB,MAAK,YAAY,UAAW,MAAM,QAAS,SAAQ;AACnD,SAAO,EAAE,OAAO,WAAW,CAAC,OAAO,MAAM,UAAUA,QAAO,WAAW,KAAK;AAC9E;AAEA,IAAI;AAEJ,SAAS,qBAAkC;AACvC,qBAAmB,iBAAiB,QAAQ,SAAS;AACrD,SAAO;AACX;AAEA,SAAS,iBAAiB,SAA+B;AACrD,QAAM,OAAO,QAAQ;AACrB,SAAO,IAAI,IAAI,CAAC,GAAG,KAAK,UAAU,GAAG,KAAK,qBAAqB,GAAG,KAAK,YAAY,GAAG,wBAAwB,OAAO,CAAC,EACjH,OAAO,OAAK,EAAE,SAAS,CAAC,EAAE,IAAI,OAAO,CAAC;AAC/C;AAOA,SAAS,QAAQ,MAAsB;AACnC,SAAO,cAAc,KAAK,UAAU,KAAK,EAAE,QAAQ,uCAAuC,EAAE,CAAC;AACjG;;;ACrsGO,IAAM,gBAAN,MAAM,eAAc;AAAA;AAAA,EAEvB,OAAgB,iBAAiB;AAAA;AAAA,EAGjC,OAAgB,wBAAwB;AAAA;AAAA,EAG/B;AAAA;AAAA,EAGA;AAAA;AAAA,EAGA;AAAA;AAAA,EAGA;AAAA;AAAA,EAGA;AAAA;AAAA,EAGA;AAAA;AAAA,EAGA;AAAA;AAAA,EAGT,YACI,SACA,MACA,cACA,OACA,SAA8B,CAAC,GACjC;AACE,SAAK,UAAU;AACf,SAAK,OAAO;AACZ,SAAK,eAAe;AACpB,SAAK,QAAQ;AACb,SAAK,UAAU,OAAO,WAAW,CAAC;AAClC,SAAK,OAAO,OAAO,QAAQ,CAAC;AAC5B,SAAK,eAAe,OAAO,gBAAgB,CAAC;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,GAAG,SAAkB,MAAc,OAAoC,SAA8B,CAAC,GAAkB;AAC3H,UAAM,UAAU,IAAI;AACpB,UAAM,OAA4B,CAAC;AACnC,UAAM,OAAO,oBAAI,IAAY;AAC7B,eAAW,QAAQ,OAAO;AACtB,UAAI,KAAK,IAAI,KAAK,QAAQ,GAAG,EAAG,OAAM,IAAI,WAAW,YAAY,KAAK,QAAQ,SAAS,CAAC,iBAAiB;AACzG,WAAK,IAAI,KAAK,QAAQ,GAAG;AACzB,WAAK,KAAK,IAAI;AAAA,IAClB;AACA,SAAK,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,UAAU,EAAE,OAAO,CAAC;AAClD,WAAO,IAAI,eAAc,QAAQ,MAAM,MAAM,CAAC,GAAG,MAAM,MAAM;AAAA,EACjE;AAAA;AAAA,EAGA,IAAI,UAAkB;AAClB,WAAO,eAAc;AAAA,EACzB;AAAA;AAAA,EAGA,SAAiB;AACb,UAAM,OAAO,IAAI,WAAW;AAC5B,SAAK,YAAY;AACjB,SAAK,OAAO,WAAW,eAAc,cAAc;AACnD,SAAK,OAAO,WAAW,KAAK,OAAO;AACnC,SAAK,OAAO,QAAQ,KAAK,IAAI;AAC7B,mBAAc,YAAY,MAAM,KAAK,YAAY;AACjD,SAAK,UAAU,IAAI;AACnB,SAAK,UAAU;AACf,WAAO,KAAK,SAAS;AAAA,EACzB;AAAA;AAAA,EAGA,OAAO,YAAY,MAAkB,QAA6C;AAC9E,QAAI,OAAO,WAAW,EAAG;AACzB,SAAK,WAAW,cAAc;AAC9B,eAAWwB,UAAS,QAAQ;AACxB,WAAK,YAAY;AACjB,WAAK,OAAO,QAAQA,OAAM,IAAI;AAC9B,WAAK,WAAW,SAAS;AACzB,iBAAWC,WAAUD,OAAM,QAAS,MAAK,OAAO,QAAWC,OAAM;AACjE,WAAK,SAAS;AAEd,UAAID,OAAM,WAAW,WAAW,GAAG;AAC/B,aAAK,OAAO,OAAO,UAAUA,OAAM,YAAY,CAAC,CAAC;AAAA,MACrD,WAAWA,OAAM,WAAW,SAAS,GAAG;AACpC,aAAK,WAAW,KAAK;AACrB,mBAAWC,WAAUD,OAAM,WAAY,MAAK,OAAO,QAAWC,OAAM;AACpE,aAAK,SAAS;AAAA,MAClB;AACA,WAAK,UAAU;AAAA,IACnB;AACA,SAAK,SAAS;AAAA,EAClB;AAAA;AAAA,EAGA,UAAU,MAAwB;AAC9B,cAAU,MAAM,WAAW,KAAK,SAAS,SAAO,GAAG,YAAY,WAAW,IAAI,KAAK,CAAC,IAAI,YAAY,WAAW,IAAI,IAAI,CAAC,EAAE;AAC1H,cAAU,MAAM,QAAQ,KAAK,MAAM,SAAO,GAAG,OAAO,IAAI,QAAQ,CAAC,CAAC,IAAI,OAAO,IAAI,OAAO,CAAC,CAAC,EAAE;AAC5F,QAAI,KAAK,aAAa,SAAS,GAAG;AAC9B,WAAK,WAAW,cAAc;AAC9B,iBAAW,OAAO,KAAK,cAAc;AACjC,aAAK,YAAY;AACjB,aAAK,OAAO,MAAM,GAAG,YAAY,WAAW,IAAI,KAAK,CAAC,IAAI,YAAY,WAAW,IAAI,IAAI,CAAC,EAAE;AAC5F,aAAK,OAAO,SAAS,IAAI,KAAK;AAC9B,aAAK,OAAO,QAAQ,IAAI,IAAI;AAC5B,aAAK,UAAU;AAAA,MACnB;AACA,WAAK,SAAS;AAAA,IAClB;AACA,SAAK,WAAW,OAAO;AACvB,eAAW,QAAQ,KAAK,MAAO,WAAU,MAAM,IAAI;AACnD,SAAK,SAAS;AAAA,EAClB;AAAA;AAAA,EAGA,OAAO,SAAS,MAAiC;AAC7C,UAAM,OAAO,IAAI,WAAW;AAC5B,cAAU,MAAM,IAAI;AACpB,WAAO,KAAK,SAAS;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,SAASC,OAA6B;AACzC,UAAM,OAAO,cAAcA,OAAM,gBAAgB;AACjD,QAAI,KAAK,SAAS,SAAU,OAAM,IAAI,mBAAmB,oCAAoC;AAE7F,UAAM,UAAU,SAAS,MAAM,SAAS;AACxC,UAAMC,UAAS,YAAY,SAAY,SAAY,UAAU,OAAO;AACpE,QAAIA,YAAW,OAAW,OAAM,IAAI,mBAAmB,oCAAoC;AAC3F,QAAIA,UAAS,eAAc,yBAAyBA,UAAS,eAAc,gBAAgB;AACvF,YAAM,IAAI;AAAA,QACN,iCAAiC,OAAOA,OAAM,CAAC,gCAAgC,OAAO,eAAc,qBAAqB,CAAC,OAAO,OAAO,eAAc,cAAc,CAAC;AAAA,QACrK,EAAE,iBAAiBA,QAAO;AAAA,MAAC;AAAA,IACnC;AACA,WAAOC,MAAK,MAAMD,SAAQ,MAAS;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,oBAAoB,SAAsB,SAAgC;AAC7E,QAAI,QAAQ,SAAS,SAAU,OAAM,IAAI,mBAAmB,kDAAkD;AAC9G,WAAOC,MAAK,SAAS,eAAc,gBAAgB,OAAO;AAAA,EAC9D;AAAA;AAAA,EAGA,OAAO,WAAW,OAAoB,SAAuC;AACzE,QAAI,MAAM,SAAS,QAAS,OAAM,IAAI,mBAAmB,qCAAqC;AAC9F,UAAM,SAA+B,CAAC;AACtC,eAAW,WAAW,MAAM,OAAO;AAC/B,YAAMJ,SAAQ,UAAU,SAAS,OAAO;AACxC,UAAI,OAAO,KAAK,OAAK,iBAAiB,EAAE,MAAMA,OAAM,IAAI,CAAC,EAAG,OAAM,IAAI,mBAAmB,qBAAqBA,OAAM,IAAI,sBAAsB;AAC9I,aAAO,KAAKA,MAAK;AAAA,IACrB;AACA,WAAO;AAAA,EACX;AAAA;AAAA,EAGA,OAAO,eAAe,MAAuB;AACzC,QAAI,SAAS,GAAI,QAAO,QAAQ;AAChC,QAAI;AACA,aAAO,QAAQ,GAAG,IAAI;AAAA,IAC1B,SAAS,GAAG;AACR,YAAM,IAAI,mBAAmB,gBAAgB,IAAI,wBAAwB,EAAE,OAAO,EAAE,CAAC;AAAA,IACzF;AAAA,EACJ;AACJ;AAGO,SAAS,cAAcE,OAAc,MAA2B;AACnE,MAAI;AACA,WAAO,UAAUA,KAAI;AAAA,EACzB,SAAS,GAAG;AACR,QAAI,aAAa,gBAAiB,OAAM,IAAI,mBAAmB,OAAO,IAAI,iBAAiB,EAAE,OAAO,EAAE,CAAC;AACvG,UAAM;AAAA,EACV;AACJ;AAGO,SAAS,SAASG,SAA0C,MAAuC;AACtG,SAAOA,QAAO,WAAW,KAAK,CAAC,CAAC,CAAC,MAAM,MAAM,IAAI,IAAI,CAAC;AAC1D;AAGO,SAAS,gBAAgB,OAAc,SAAwC,MAAM,mBAAkC;AAC1H,QAAM,QAAQ,MAAM,gBAAgB;AACpC,SAAO,IAAI,cAAc,MAAM,QAAQ,MAAM,MAAM,MAAM,QAAQ,MAAM,OAAO,KAAK;AACvF;AAGA,SAAS,UAAU,MAAkB,MAA+B;AAChE,OAAK,YAAY;AACjB,OAAK,OAAO,MAAM,KAAK,QAAQ,SAAS,CAAC;AACzC,QAAM,QAAQ,KAAK;AACnB,MAAI,UAAU,QAAW;AACrB,QAAI,MAAM,YAAY,QAAW;AAC7B,WAAK,OAAO,WAAW,MAAM,OAAO;AAAA,IACxC,OAAO;AACH,YAAM,WAAW,MAAM;AACvB,UAAI,aAAa,OAAW,OAAM,IAAI,MAAM,4DAA4D;AACxG,cAAQ,SAAS,MAAM;AAAA,QACnB,KAAK;AAAU,eAAK,OAAO,UAAU,SAAS,MAAM;AAAG;AAAA,QACvD,KAAK;AAAQ,eAAK,OAAO,QAAQ,SAAS,IAAI;AAAG;AAAA,QACjD,KAAK;AAAW,eAAK,QAAQ,WAAW,SAAS,OAAO;AAAG;AAAA,QAC3D,KAAK;AAAS,eAAK,OAAO,SAAS,SAAS,KAAK;AAAG;AAAA,QACpD;AAAS,gBAAM,IAAI,MAAM,aAAa,OAAO,SAAS,IAAoB,CAAC,4BAA4B;AAAA,MAC3G;AAAA,IACJ;AAAA,EACJ;AACA,kBAAgB,MAAM,KAAK,cAAc,KAAK,WAAW,KAAK,MAAM,KAAK,MAAM,KAAK,OAAO;AAC3F,OAAK,UAAU;AACnB;AAEA,SAAS,UAAU,MAAkB,MAAcC,OAA0C,IAAoD;AAC7I,MAAIA,MAAK,WAAW,EAAG;AACvB,OAAK,WAAW,IAAI;AACpB,aAAW,OAAOA,OAAM;AACpB,SAAK,YAAY;AACjB,SAAK,OAAO,MAAM,GAAG,GAAG,CAAC;AACzB,oBAAgB,MAAM,IAAI,cAAc,IAAI,WAAW,IAAI,MAAM,IAAI,MAAM,IAAI,OAAO;AACtF,SAAK,UAAU;AAAA,EACnB;AACA,OAAK,SAAS;AAClB;AAOA,SAAS,gBACL,MAAkB,QAAkC,WAA4C,MAChG,MAA4B,SACxB;AACJ,MAAI,WAAW,OAAW,MAAK,OAAO,UAAU,OAAO,IAAI;AAC3D,MAAI,cAAc,OAAW,MAAK,OAAO,SAAS,SAAS;AAC3D,MAAI,SAAS,QAAW;AACpB,SAAK,YAAY,MAAM;AACvB,QAAI,CAAC,KAAK,OAAO,YAAa,MAAK,OAAO,SAAS,WAAW,KAAK,MAAM,CAAC;AAC1E,QAAI,KAAK,KAAM,MAAK,QAAQ,QAAQ,IAAI;AACxC,QAAI,KAAK,OAAQ,MAAK,QAAQ,UAAU,IAAI;AAC5C,QAAI,KAAK,UAAW,MAAK,QAAQ,aAAa,IAAI;AAClD,QAAI,KAAK,cAAe,MAAK,QAAQ,iBAAiB,IAAI;AAC1D,SAAK,UAAU;AAAA,EACnB;AACA,MAAI,SAAS,OAAW,MAAK,OAAO,QAAQ,KAAK,WAAW,SAAY,SAAS,WAAW,KAAK,MAAM,CAAC;AACxG,MAAI,YAAY,QAAW;AACvB,SAAK,YAAY,SAAS;AAC1B,cAAU,MAAM,OAAO,QAAQ,GAAG;AAClC,cAAU,MAAM,UAAU,QAAQ,MAAM;AACxC,cAAU,MAAM,QAAQ,QAAQ,IAAI;AACpC,cAAU,MAAM,SAAS,QAAQ,KAAK;AACtC,SAAK,UAAU;AAAA,EACnB;AACJ;AAEA,SAAS,UAAU,MAAkB,MAAc,MAAwB;AACvE,MAAI,KAAK,OAAQ;AACjB,OAAK,YAAY,IAAI;AACrB,OAAK,OAAO,SAAS,cAAc,KAAK,KAAK,CAAC;AAC9C,MAAI,CAAC,KAAK,OAAO,YAAa,MAAK,OAAO,SAAS,WAAW,KAAK,MAAM,CAAC;AAC1E,OAAK,UAAU;AACnB;AAEA,SAAS,WAAW,QAA4B;AAC5C,SAAO,IAAI,IAAI,OAAO,KAAK,CAAC,CAAC;AACjC;AAGA,SAASF,MAAK,MAAwCD,SAAgB,iBAAoD;AACtH,MAAI,UAAU;AACd,MAAI;AACJ,MAAI,SAA+B,CAAC;AACpC,QAAM,QAA6B,CAAC;AACpC,QAAM,OAAO,oBAAI,IAAY;AAC7B,MAAI,UAAqC,CAAC;AAC1C,MAAI,OAAkC,CAAC;AACvC,MAAI,SAAqC,CAAC;AAC1C,aAAW,CAAC,KAAK,KAAK,KAAK,KAAK,YAAY;AACxC,QAAI,QAAQ,aAAa,oBAAoB,OAAW;AACxD,QAAI,QAAQ,aAAa,oBAAoB,QAAW;AACpD,UAAI,MAAM,SAAS,SAAU,OAAM,IAAI,mBAAmB,8BAA8B;AACxF,gBAAU,MAAM;AAAA,IACpB,WAAW,QAAQ,UAAUA,WAAU,GAAG;AACtC,UAAI,MAAM,SAAS,SAAU,OAAM,IAAI,mBAAmB,2BAA2B;AACrF,aAAO,MAAM;AACb,YAAM,MAAM,MAAM,YAAY,IAAI;AAClC,UAAI,QAAQ,OAAW,OAAM,IAAI,mBAAmB,IAAI,IAAI,4BAA4B,GAAG,EAAE;AAAA,IACjG,WAAW,QAAQ,kBAAkBA,WAAU,KAAK,oBAAoB,QAAW;AAC/E,eAAS,cAAc,WAAW,OAAOA,OAAM;AAAA,IACnD,WAAW,QAAQ,aAAaA,WAAU,GAAG;AAEzC,gBAAUI,UAAS,OAAO,UAAUJ,SAAQ,CAAAD,UAAQ;AAChD,cAAM,IAAIA,UAAS,SAAY,SAAY,UAAU,SAASA,KAAI;AAClE,eAAO,GAAG,mBAAmB,OAAO,CAAC,EAAE,MAAM,QAAQ,EAAE,KAAK,MAAM,IAAI;AAAA,MAC1E,CAAC;AAAA,IACL,WAAW,QAAQ,UAAUC,WAAU,GAAG;AACtC,aAAOI,UAAS,OAAO,OAAOJ,SAAQ,CAAAD,UAAQ;AAC1C,cAAM,IAAIA,UAAS,SAAY,SAAY,UAAU,SAASA,KAAI;AAClE,eAAO,GAAG,gBAAgB,QAAQ,CAAC,EAAE,iBAAiB,CAAC,EAAE,MAAM,KAAK,EAAE,KAAK,GAAG,IAAI;AAAA,MACtF,CAAC;AAAA,IACL,WAAW,QAAQ,kBAAkBC,WAAU,GAAG;AAC9C,eAAS,WAAW,OAAOA,OAAM;AAAA,IACrC,WAAW,QAAQ,SAAS;AACxB,UAAI,MAAM,SAAS,QAAS,OAAM,IAAI,mBAAmB,6BAA6B;AACtF,iBAAW,WAAW,MAAM,OAAO;AAC/B,cAAM,OAAO,SAAS,SAASA,OAAM;AACrC,YAAI,KAAK,IAAI,KAAK,QAAQ,GAAG,EAAG,OAAM,IAAI,mBAAmB,YAAY,KAAK,QAAQ,SAAS,CAAC,iBAAiB;AACjH,aAAK,IAAI,KAAK,QAAQ,GAAG;AACzB,cAAM,KAAK,IAAI;AAAA,MACnB;AAAA,IACJ,OAAO;AACH,YAAM,IAAI,mBAAmB,oBAAoB,SAC3C,IAAI,GAAG,8BAA8B,OAAOA,OAAM,CAAC,qBACnD,IAAI,GAAG,kDAAkD;AAAA,IACnE;AAAA,EACJ;AACA,MAAI,YAAY,OAAW,OAAM,IAAI,mBAAmB,wCAAwC;AAChG,MAAIA,WAAU,KAAK,SAAS,QAAW;AACnC,UAAM,IAAI,mBAAmB,oBAAoB,SAAY,wCAAwC,mDAAmD;AAAA,EAC5J;AACA,gBAAc,eAAe,OAAO;AACpC,QAAM,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,UAAU,EAAE,OAAO,CAAC;AACnD,SAAO,IAAI,cAAc,SAAS,QAAQ,MAAM,aAAa,QAAQ,OAAO,EAAE,SAAS,MAAM,cAAc,OAAO,CAAC;AACvH;AAEA,SAASI,UACL,OAAoB,MAAc,SAAiBC,QAC1B;AACzB,MAAI,MAAM,SAAS,QAAS,OAAM,IAAI,mBAAmB,OAAO,IAAI,4BAA4B;AAChG,QAAMF,QAAkC,CAAC;AACzC,aAAW,WAAW,MAAM,OAAO;AAC/B,QAAI,QAAQ,SAAS,SAAU,OAAM,IAAI,mBAAmB,KAAK,IAAI,+BAA+B;AACpG,QAAI;AACJ,QAAI;AACJ,QAAI;AACJ,QAAI;AACJ,QAAI;AACJ,QAAI;AACJ,eAAW,CAAC,KAAK,KAAK,KAAK,QAAQ,YAAY;AAC3C,UAAI,QAAQ,MAAM;AACd,aAAK,MAAM,SAAS,WAAWE,OAAM,MAAM,KAAK,IAAI;AACpD,YAAI,OAAO,OAAW,OAAM,IAAI,mBAAmB,IAAI,SAAS,KAAK,CAAC,cAAc,IAAI,oBAAoB;AAAA,MAChH,WAAW,QAAQ,UAAU;AACzB,iBAAS,WAAW,KAAK;AAAA,MAC7B,WAAW,QAAQ,SAAS;AACxB,oBAAY,cAAc,OAAO,IAAI;AAAA,MACzC,WAAW,QAAQ,UAAU,WAAW,GAAG;AACvC,eAAO,SAAS,KAAK;AAAA,MACzB,WAAW,QAAQ,UAAU,WAAW,GAAG;AACvC,eAAO,SAAS,KAAK;AAAA,MACzB,WAAW,QAAQ,aAAa,WAAW,GAAG;AAC1C,kBAAU,YAAY,KAAK;AAAA,MAC/B,OAAO;AACH,cAAM,IAAI,mBAAmB,IAAI,GAAG,8BAA8B,OAAO,OAAO,CAAC,IAAI,IAAI,UAAU;AAAA,MACvG;AAAA,IACJ;AACA,QAAI,OAAO,OAAW,OAAM,IAAI,mBAAmB,KAAK,IAAI,mBAAmB,IAAI,GAAG;AACtF,UAAM,CAAC,OAAO,IAAI,IAAI;AACtB,QAAI,WAAW,UAAa,cAAc,UAAa,SAAS,UAAa,SAAS,UAAa,YAAY,QAAW;AACtH,YAAM,IAAI,mBAAmB,OAAO,IAAI,cAAc,OAAO,KAAK,CAAC,gBAAgB;AAAA,IACvF;AACA,QAAIF,MAAK,KAAK,OAAK,EAAE,SAAS,QAAQ,SAAS,EAAE,IAAI,EAAG,OAAM,IAAI,mBAAmB,KAAK,IAAI,sBAAsB;AACpH,IAAAA,MAAK,KAAK,IAAI,wBAAwB,OAAO,MAAM,QAAQ,WAAW,MAAM,MAAM,OAAO,CAAC;AAAA,EAC9F;AACA,EAAAA,MAAK,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AACrC,SAAOA;AACX;AAEA,SAAS,WAAW,OAAoB,SAA6C;AACjF,MAAI,MAAM,SAAS,QAAS,OAAM,IAAI,mBAAmB,qCAAqC;AAC9F,QAAMA,QAAmC,CAAC;AAC1C,aAAW,WAAW,MAAM,OAAO;AAC/B,QAAI,QAAQ,SAAS,SAAU,OAAM,IAAI,mBAAmB,sCAAsC;AAClG,QAAI;AACJ,QAAI;AAEJ,QAAI,OAAyC,UAAU,IAAI,cAAc;AACzE,eAAW,CAAC,KAAK,KAAK,KAAK,QAAQ,YAAY;AAC3C,UAAI,QAAQ,MAAM;AACd,cAAM,IAAI,MAAM,SAAS,WAAW,UAAU,SAAS,MAAM,KAAK,IAAI;AACtE,YAAI,GAAG,mBAAmB,KAAM,OAAM,IAAI,mBAAmB,IAAI,SAAS,KAAK,CAAC,qCAAqC;AACrH,aAAK,CAAC,EAAE,MAAM,QAAQ,EAAE,KAAK,MAAM;AAAA,MACvC,WAAW,QAAQ,SAAS;AACxB,cAAM,IAAI,WAAW,KAAK;AAC1B,YAAI,MAAM,UAAa,EAAE,IAAI,KAAK,KAAK,MAAM,iBAAiB;AAC1D,gBAAM,IAAI,mBAAmB,IAAI,SAAS,KAAK,CAAC,sDAAsD,OAAO,MAAM,cAAc,CAAC,cAAc;AAAA,QACpJ;AACA,gBAAQ;AAAA,MACZ,WAAW,QAAQ,YAAY,YAAY,GAAG;AAE1C,YAAI,MAAM,SAAS,OAAQ,QAAO;AAAA,iBACzB,MAAM,SAAS,QAAS,QAAO;AAAA,YACnC,OAAM,IAAI,mBAAmB,IAAI,SAAS,KAAK,CAAC,oDAAoD;AAAA,MAC7G,WAAW,QAAQ,UAAU,WAAW,GAAG;AACvC,YAAI,MAAM,SAAS,YAAa,MAAM,UAAU,eAAe,MAAM,UAAU,kBAAmB;AAC9F,gBAAM,IAAI,mBAAmB,IAAI,SAAS,KAAK,CAAC,mEAAmE;AAAA,QACvH;AACA,eAAO,MAAM;AAAA,MACjB,OAAO;AACH,cAAM,IAAI,mBAAmB,IAAI,GAAG,8BAA8B,OAAO,OAAO,CAAC,gBAAgB;AAAA,MACrG;AAAA,IACJ;AACA,QAAI,OAAO,OAAW,OAAM,IAAI,mBAAmB,gCAAgC;AACnF,UAAM,CAAC,OAAO,IAAI,IAAI;AACtB,QAAI,UAAU,OAAW,OAAM,IAAI,mBAAmB,uBAAuB,YAAY,WAAW,KAAK,CAAC,kBAAkB;AAC5H,QAAI,SAAS,OAAW,OAAM,IAAI,mBAAmB,uBAAuB,YAAY,WAAW,KAAK,CAAC,yBAAyB;AAClI,QAAIA,MAAK,KAAK,OAAK,EAAE,SAAS,QAAQ,SAAS,EAAE,IAAI,EAAG,OAAM,IAAI,mBAAmB,kCAAkC;AACvH,IAAAA,MAAK,KAAK,IAAI,yBAAyB,OAAO,MAAM,OAAO,IAAI,CAAC;AAAA,EACpE;AACA,EAAAA,MAAK,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AACrC,SAAOA;AACX;AAEA,SAAS,WAAW,OAAkC;AAClD,QAAM,UAAU,MAAM,SAAS,WAAW,aAAa,SAAS,MAAM,KAAK,IAAI;AAC/E,MAAI,SAAS,WAAW,OAAW,OAAM,IAAI,mBAAmB,IAAI,SAAS,KAAK,CAAC,8CAA8C;AACjI,SAAO,QAAQ;AACnB;AAMA,SAAS,WAAW,OAAgC;AAChD,MAAI,MAAM,SAAS,UAAU;AACzB,QAAI,MAAM,UAAU,YAAa,QAAO,WAAW;AACnD,UAAM,MAAM,WAAW,QAAQ,MAAM,KAAK;AAC1C,QAAI,QAAQ,OAAW,QAAO;AAAA,EAClC;AACA,QAAM,IAAI,mBAAmB,IAAI,SAAS,KAAK,CAAC,8GAA8G;AAClK;AAEA,SAAS,SAAS,OAA8B;AAC5C,MAAI,MAAM,SAAS,SAAU,OAAM,IAAI,mBAAmB,IAAI,SAAS,KAAK,CAAC,kBAAkB;AAC/F,MAAI,OAAO,SAAS;AACpB,aAAW,CAAC,KAAK,OAAO,KAAK,MAAM,YAAY;AAC3C,YAAQ,KAAK;AAAA,MACT,KAAK;AAAS,eAAO,KAAK,KAAK,EAAE,QAAQ,WAAW,OAAO,EAAE,CAAC;AAAG;AAAA,MACjE,KAAK;AAAQ,eAAO,KAAK,KAAK,EAAE,MAAM,aAAa,KAAK,OAAO,EAAE,CAAC;AAAG;AAAA,MACrE,KAAK;AAAU,eAAO,KAAK,KAAK,EAAE,QAAQ,aAAa,KAAK,OAAO,EAAE,CAAC;AAAG;AAAA,MACzE,KAAK;AAAa,eAAO,KAAK,KAAK,EAAE,WAAW,aAAa,KAAK,OAAO,EAAE,CAAC;AAAG;AAAA,MAC/E,KAAK;AAAiB,eAAO,KAAK,KAAK,EAAE,eAAe,aAAa,KAAK,OAAO,EAAE,CAAC;AAAG;AAAA,MACvF;AAAS,cAAM,IAAI,mBAAmB,IAAI,GAAG,0FAA0F;AAAA,IAC3I;AAAA,EACJ;AACA,SAAO;AACX;AAEA,SAAS,aAAa,MAAc,SAA+B;AAC/D,MAAI,QAAQ,SAAS,OAAQ,QAAO;AACpC,MAAI,QAAQ,SAAS,QAAS,QAAO;AACrC,QAAM,IAAI,mBAAmB,IAAI,SAAS,OAAO,CAAC,oCAAoC,IAAI,GAAG;AACjG;AAEA,SAAS,SAAS,OAA8B;AAC5C,MAAI,MAAM,SAAS,UAAU;AACzB,QAAI,MAAM,UAAU,OAAQ,QAAO,SAAS;AAC5C,UAAM,MAAM,WAAW,QAAQ,MAAM,KAAK;AAC1C,QAAI,QAAQ,OAAW,QAAO,SAAS,MAAM,GAAG;AAAA,EACpD;AACA,QAAM,IAAI,mBAAmB,IAAI,SAAS,KAAK,CAAC,+GAA+G;AACnK;AAEA,SAAS,YAAY,OAAiC;AAClD,MAAI,MAAM,SAAS,SAAU,OAAM,IAAI,mBAAmB,IAAI,SAAS,KAAK,CAAC,4BAA4B;AACzG,MAAI,UAAU,YAAY;AAC1B,aAAW,CAAC,KAAK,OAAO,KAAK,MAAM,YAAY;AAC3C,YAAQ,KAAK;AAAA,MACT,KAAK;AAAO,kBAAU,QAAQ,KAAK,EAAE,KAAK,SAAS,KAAK,OAAO,EAAE,CAAC;AAAG;AAAA,MACrE,KAAK;AAAU,kBAAU,QAAQ,KAAK,EAAE,QAAQ,SAAS,KAAK,OAAO,EAAE,CAAC;AAAG;AAAA,MAC3E,KAAK;AAAQ,kBAAU,QAAQ,KAAK,EAAE,MAAM,SAAS,KAAK,OAAO,EAAE,CAAC;AAAG;AAAA,MACvE,KAAK;AAAS,kBAAU,QAAQ,KAAK,EAAE,OAAO,SAAS,KAAK,OAAO,EAAE,CAAC;AAAG;AAAA,MACzE;AAAS,cAAM,IAAI,mBAAmB,IAAI,GAAG,wDAAwD;AAAA,IACzG;AAAA,EACJ;AACA,SAAO;AACX;AAEA,SAAS,SAAS,MAAc,OAAgC;AAC5D,MAAI,MAAM,SAAS,SAAU,OAAM,IAAI,mBAAmB,IAAI,SAAS,KAAK,CAAC,iCAAiC,IAAI,QAAQ;AAC1H,MAAI;AACJ,MAAI,SAAS,WAAW;AACxB,aAAW,CAAC,KAAK,OAAO,KAAK,MAAM,YAAY;AAC3C,QAAI,QAAQ,SAAS;AACjB,cAAQ,QAAQ,SAAS,WAAW,YAAY,QAAQ,KAAK,IAAI;AACjE,UAAI,UAAU,OAAW,OAAM,IAAI,mBAAmB,IAAI,SAAS,OAAO,CAAC,+CAA+C;AAAA,IAC9H,WAAW,QAAQ,SAAS;AACxB,eAAS,WAAW,OAAO;AAAA,IAC/B,OAAO;AACH,YAAM,IAAI,mBAAmB,IAAI,GAAG,2DAA2D;AAAA,IACnG;AAAA,EACJ;AACA,MAAI,UAAU,OAAW,OAAM,IAAI,mBAAmB,wBAAwB,IAAI,2BAA2B;AAC7G,SAAO,IAAI,WAAW,OAAO,MAAM;AACvC;AAGA,IAAM,YAAsD,EAAE,gBAAgB,eAAe;AAE7F,SAAS,cAAc,OAAgC;AACnD,SAAO,UAAU,KAAK,KAAK;AAC/B;AAEA,SAAS,YAAY,MAA2C;AAC5D,SAAO,iBAAiB,KAAK,OAAK,MAAM,UAAU,cAAc,CAAC,MAAM,IAAI;AAC/E;AAEA,SAAS,cAAc,OAAoB,cAA4C;AACnF,MAAI,MAAM,SAAS,UAAU;AACzB,YAAQ,MAAM,OAAO;AAAA,MACjB,KAAK;AACD,YAAI,aAAc,QAAO;AACzB;AAAA,MACJ,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACD,eAAO,MAAM;AAAA,MACjB;AACI;AAAA,IACR;AAAA,EACJ;AACA,QAAM,IAAI,mBAAmB,IAAI,SAAS,KAAK,CAAC,wBAAwB;AAC5E;AAEA,SAAS,UAAU,SAAsB,SAAqC;AAC1E,MAAI,QAAQ,SAAS,SAAU,OAAM,IAAI,mBAAmB,sCAAsC;AAClG,MAAI;AACJ,MAAI;AACJ,MAAI,MAAgB,CAAC;AACrB,aAAW,CAAC,WAAW,KAAK,KAAK,QAAQ,YAAY;AACjD,QAAI,cAAc,QAAQ;AACtB,UAAI,MAAM,SAAS,SAAU,OAAM,IAAI,mBAAmB,IAAI,SAAS,KAAK,CAAC,iCAAiC;AAC9G,aAAO,MAAM;AAAA,IACjB,WAAW,cAAc,WAAW;AAChC,UAAI,MAAM,SAAS,QAAS,OAAM,IAAI,mBAAmB,4CAA4C;AACrG,gBAAU,MAAM,MAAM,IAAI,OAAK;AAC3B,YAAI,EAAE,SAAS,SAAU,OAAM,IAAI,mBAAmB,IAAI,SAAS,CAAC,CAAC,yBAAyB;AAC9F,eAAO,EAAE;AAAA,MACb,CAAC;AAAA,IACL,WAAW,cAAc,SAAS,WAAW,KAAK,MAAM,SAAS,UAAU;AACvE,YAAM,CAAC,MAAM,KAAK;AAAA,IACtB,WAAW,cAAc,SAAS,WAAW,KAAK,MAAM,SAAS,SAAS;AACtE,YAAM,MAAM,MAAM,IAAI,OAAK;AACvB,YAAI,EAAE,SAAS,SAAU,OAAM,IAAI,mBAAmB,IAAI,SAAS,CAAC,CAAC,uCAAuC;AAC5G,eAAO,EAAE;AAAA,MACb,CAAC;AACD,UAAI,IAAI,SAAS,EAAG,OAAM,IAAI,mBAAmB,iDAAiD,SAAS,KAAK,CAAC,aAAa;AAAA,IAClI,WAAW,cAAc,SAAS,WAAW,GAAG;AAC5C,YAAM,IAAI,mBAAmB,IAAI,SAAS,KAAK,CAAC,uCAAuC;AAAA,IAC3F,OAAO;AACH,YAAM,IAAI,mBAAmB,IAAI,SAAS,8BAA8B,OAAO,OAAO,CAAC,8BAA8B;AAAA,IACzH;AAAA,EACJ;AACA,MAAI,SAAS,OAAW,OAAM,IAAI,mBAAmB,6BAA6B;AAClF,MAAI,YAAY,OAAW,OAAM,IAAI,mBAAmB,qBAAqB,IAAI,mBAAmB;AACpG,QAAM,MAAM,MAAM,mBAAmB,MAAM,OAAO;AAClD,MAAI,QAAQ,OAAW,OAAM,IAAI,mBAAmB,GAAG;AACvD,QAAM,YAAY,MAAM,WAAW,MAAM,SAAS,GAAG;AACrD,MAAI,cAAc,OAAW,OAAM,IAAI,mBAAmB,SAAS;AACnE,SAAO,IAAI,mBAAmB,MAAM,SAAS,GAAG;AACpD;AAEA,SAAS,SAAS,SAAsB,SAAoC;AACxE,MAAI,QAAQ,SAAS,SAAU,OAAM,IAAI,mBAAmB,8BAA8B;AAC1F,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,QAAM,SAAS,CAAC,SAAuB;AACnC,QAAI,UAAU,OAAW,OAAM,IAAI,mBAAmB,mCAAmC;AACzF,WAAO;AAAA,EACX;AACA,aAAW,CAAC,KAAK,KAAK,KAAK,QAAQ,YAAY;AAC3C,YAAQ,KAAK;AAAA,MACT,KAAK,MAAM;AACP,cAAM,KAAK,MAAM,SAAS,WAAW,YAAY,SAAS,MAAM,KAAK,IAAI;AACzE,YAAI,OAAO,OAAW,OAAM,IAAI,mBAAmB,IAAI,SAAS,KAAK,CAAC,0BAA0B;AAChG,kBAAU;AACV;AAAA,MACJ;AAAA,MACA,KAAK,UAAU;AACX,cAAM,IAAI,WAAW,KAAK;AAC1B,YAAI,MAAM,OAAW,OAAM,IAAI,mBAAmB,IAAI,SAAS,KAAK,CAAC,oBAAoB;AACzF,gBAAQ,OAAO,MAAM,UAAU,MAAM,WAAW,CAAC,CAAC,CAAC;AACnD;AAAA,MACJ;AAAA,MACA,KAAK;AACD,YAAI,MAAM,SAAS,SAAU,OAAM,IAAI,mBAAmB,IAAI,SAAS,KAAK,CAAC,gBAAgB;AAC7F,gBAAQ,OAAO,MAAM,UAAU,MAAM,SAAS,MAAM,KAAK,CAAC,CAAC;AAC3D;AAAA,MACJ,KAAK;AACD,YAAI,MAAM,SAAS,UAAU,MAAM,SAAS,QAAS,OAAM,IAAI,mBAAmB,IAAI,SAAS,KAAK,CAAC,qBAAqB;AAC1H,gBAAQ,OAAO,MAAM,UAAU,MAAM,YAAY,MAAM,SAAS,MAAM,CAAC,CAAC;AACxE;AAAA,MACJ,KAAK,SAAS;AACV,cAAMG,SAAQ,MAAM,SAAS,WAAW,gBAAgB,MAAM,KAAK,IAAI;AACvE,YAAIA,WAAU,OAAW,OAAM,IAAI,mBAAmB,IAAI,SAAS,KAAK,CAAC,0CAA0C;AACnH,gBAAQ,OAAO,MAAM,UAAU,MAAM,UAAUA,MAAK,CAAC,CAAC;AACtD;AAAA,MACJ;AAAA,MACA,KAAK,WAAW;AACZ,YAAI,MAAM,SAAS,SAAU,OAAM,IAAI,mBAAmB,IAAI,SAAS,KAAK,CAAC,qBAAqB;AAClG,YAAI;AACJ,YAAI;AACA,oBAAU,MAAM,YAAY,MAAM,KAAK;AAAA,QAC3C,SAAS,GAAG;AACR,cAAI,aAAa,mBAAoB,OAAM,IAAI,mBAAmB,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;AACzF,gBAAM;AAAA,QACV;AACA,gBAAQ,OAAO,OAAO;AACtB;AAAA,MACJ;AAAA,MACA,KAAK;AACD,iBAAS,WAAW,KAAK;AAEzB,YAAI,UAAU,KAAK,OAAO,UAAW,UAAS;AAC9C;AAAA,MACJ,KAAK;AACD,oBAAY,cAAc,OAAO,WAAW,CAAC;AAC7C;AAAA,MACJ;AACI,YAAI,QAAQ,UAAU,WAAW,EAAG,QAAO,SAAS,KAAK;AAAA,iBAChD,QAAQ,UAAU,WAAW,EAAG,QAAO,SAAS,KAAK;AAAA,iBACrD,QAAQ,aAAa,WAAW,EAAG,WAAU,YAAY,KAAK;AAAA,YAClE,OAAM,IAAI,mBAAmB,IAAI,GAAG,8BAA8B,OAAO,OAAO,CAAC,QAAQ;AAAA,IACtG;AAAA,EACJ;AACA,MAAI,YAAY,OAAW,OAAM,IAAI,mBAAmB,wBAAwB;AAChF,MAAI,UAAU,UAAa,WAAW,UAAa,cAAc,UAAa,SAAS,UAAa,SAAS,UAAa,YAAY,QAAW;AAC7I,UAAM,IAAI,mBAAmB,YAAY,QAAQ,SAAS,CAAC,iBAAiB;AAAA,EAChF;AACA,SAAO,IAAI,kBAAkB,SAAS,OAAO,QAAQ,WAAW,MAAM,MAAM,OAAO;AACvF;;;AC/pBO,IAAM,mBAAN,MAAM,kBAAiB;AAAA;AAAA,EAE1B,OAAgB,iBAAiB;AAAA;AAAA,EAGjC,OAAgB,wBAAwB;AAAA;AAAA,EAG/B;AAAA;AAAA,EAGA;AAAA;AAAA,EAGA;AAAA;AAAA,EAGA;AAAA;AAAA,EAGT,YACI,SACA,OACA,cACA,QACF;AACE,SAAK,UAAU;AACf,SAAK,QAAQ;AACb,SAAK,eAAe;AACpB,SAAK,SAAS;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,GAAG,SAAkB,OAAe,QAAmD;AAC1F,UAAM,OAAwB,CAAC;AAC/B,eAAW,SAAS,QAAQ;AACxB,UAAI,KAAK,KAAK,OAAK,iBAAiB,EAAE,MAAM,MAAM,IAAI,CAAC,EAAG,OAAM,IAAI,WAAW,yBAAyB,MAAM,IAAI,IAAI;AACtH,UAAI,MAAM,YAAY,QAAQ,MAAM;AAChC,cAAM,IAAI,WAAW,cAAc,MAAM,IAAI,0BAA0B,MAAM,OAAO,0BAA0B,QAAQ,IAAI,IAAI;AAAA,MAClI;AACA,UAAI,MAAM,aAAa,SAAS,GAAG;AAC/B,cAAM,IAAI,WAAW,cAAc,MAAM,IAAI,qFAAqF;AAAA,MACtI;AACA,WAAK,KAAK,KAAK;AAAA,IACnB;AACA,QAAI,KAAK,WAAW,EAAG,OAAM,IAAI,WAAW,sCAAsC;AAClF,UAAM,aAAa,KAAK,KAAK,OAAK,iBAAiB,EAAE,MAAM,KAAK,CAAC;AACjE,QAAI,eAAe,OAAW,OAAM,IAAI,WAAW,qBAAqB,KAAK,8BAA8B;AAC3G,WAAO,IAAI,kBAAiB,QAAQ,MAAM,WAAW,MAAM,CAAC,GAAG,IAAI;AAAA,EACvE;AAAA;AAAA,EAGA,IAAI,UAAkB;AAClB,WAAO,kBAAiB;AAAA,EAC5B;AAAA;AAAA,EAGA,SAAiB;AACb,UAAM,OAAO,IAAI,WAAW;AAC5B,SAAK,YAAY;AACjB,SAAK,OAAO,mBAAmB,kBAAiB,cAAc;AAC9D,SAAK,OAAO,WAAW,KAAK,OAAO;AACnC,SAAK,OAAO,SAAS,KAAK,KAAK;AAC/B,kBAAc,YAAY,MAAM,KAAK,YAAY;AACjD,SAAK,WAAW,QAAQ;AACxB,eAAW,SAAS,KAAK,QAAQ;AAC7B,WAAK,YAAY;AACjB,WAAK,OAAO,QAAQ,MAAM,IAAI;AAC9B,YAAM,UAAU,IAAI;AACpB,WAAK,UAAU;AAAA,IACnB;AACA,SAAK,SAAS;AACd,SAAK,UAAU;AACf,WAAO,KAAK,SAAS;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAO,SAASC,OAAgC;AAC5C,UAAM,OAAO,cAAcA,OAAM,mBAAmB;AACpD,QAAI,KAAK,SAAS,SAAU,OAAM,IAAI,mBAAmB,uCAAuC;AAChG,UAAM,UAAU,SAAS,MAAM,iBAAiB;AAChD,QAAI,YAAY,QAAW;AAEvB,YAAM,QAAQ,cAAc,SAASA,KAAI;AACzC,aAAO,IAAI;AAAA,QAAiB,MAAM;AAAA,QAAS,MAAM;AAAA,QAAM,MAAM;AAAA,QACzD,CAAC,IAAI,cAAc,MAAM,SAAS,MAAM,MAAM,CAAC,GAAG,MAAM,OAAO,KAAK,CAAC;AAAA,MAAC;AAAA,IAC9E;AACA,UAAMC,UAAS,UAAU,OAAO;AAChC,QAAIA,YAAW,OAAW,OAAM,IAAI,mBAAmB,kDAAkD;AACzG,QAAIA,UAAS,kBAAiB,yBAAyBA,UAAS,kBAAiB,gBAAgB;AAC7F,YAAM,IAAI;AAAA,QACN,oCAAoC,OAAOA,OAAM,CAAC,gCAAgC,OAAO,kBAAiB,qBAAqB,CAAC,OAAO,OAAO,kBAAiB,cAAc,CAAC;AAAA,QAC9K,EAAE,iBAAiBA,QAAO;AAAA,MAAC;AAAA,IACnC;AACA,QAAI;AACJ,QAAI;AACJ,QAAI,SAA+B,CAAC;AACpC,QAAI;AACJ,eAAW,CAAC,KAAK,KAAK,KAAK,KAAK,YAAY;AACxC,cAAQ,KAAK;AAAA,QACT,KAAK;AACD;AAAA,QACJ,KAAK;AACD,cAAI,MAAM,SAAS,SAAU,OAAM,IAAI,mBAAmB,8BAA8B;AACxF,oBAAU,MAAM;AAChB;AAAA,QACJ,KAAK;AACD,cAAI,MAAM,SAAS,SAAU,OAAM,IAAI,mBAAmB,kCAAkC;AAC5F,kBAAQ,MAAM;AACd;AAAA,QACJ,KAAK;AACD,mBAAS,cAAc,WAAW,OAAO,cAAc,cAAc;AACrE;AAAA,QACJ,KAAK;AACD,cAAI,MAAM,SAAS,QAAS,OAAM,IAAI,mBAAmB,8BAA8B;AACvF,0BAAgB;AAChB;AAAA,QACJ;AACI,gBAAM,IAAI,mBAAmB,IAAI,GAAG,8BAA8B,OAAOA,OAAM,CAAC,qBAAqB;AAAA,MAC7G;AAAA,IACJ;AACA,QAAI,YAAY,OAAW,OAAM,IAAI,mBAAmB,2CAA2C;AACnG,kBAAc,eAAe,OAAO;AACpC,QAAI,kBAAkB,OAAW,OAAM,IAAI,mBAAmB,0CAA0C;AACxG,UAAM,SAA0B,CAAC;AACjC,eAAW,WAAW,cAAc,OAAO;AACvC,YAAM,QAAQ,cAAc,oBAAoB,SAAS,OAAO;AAChE,UAAI,OAAO,KAAK,OAAK,iBAAiB,EAAE,MAAM,MAAM,IAAI,CAAC,EAAG,OAAM,IAAI,mBAAmB,kDAAkD,MAAM,IAAI,IAAI;AACzJ,aAAO,KAAK,KAAK;AAAA,IACrB;AACA,QAAI,OAAO,WAAW,EAAG,OAAM,IAAI,mBAAmB,0CAA0C;AAChG,QAAI,UAAU,OAAW,OAAM,IAAI,mBAAmB,+CAA+C;AACrG,UAAM,SAAS;AACf,UAAM,aAAa,OAAO,KAAK,OAAK,iBAAiB,EAAE,MAAM,MAAM,CAAC;AACpE,QAAI,eAAe,OAAW,OAAM,IAAI,mBAAmB,qBAAqB,KAAK,6CAA6C;AAClI,WAAO,IAAI,kBAAiB,SAAS,WAAW,MAAM,QAAQ,MAAM;AAAA,EACxE;AACJ;;;ACvJO,IAAM,kBAAN,MAAsB;AAAA;AAAA,EAEzB,WAAW,oBAAI,IAAoD;AAAA,EACnE,UAAU;AAAA;AAAA,EAGV,SAAe;AACX,SAAK,WAAW,oBAAI,IAAI;AAAA,EAC5B;AAAA;AAAA,EAGA,MAAM,UAAoC;AACtC,UAAMC,WAAU,oBAAI,IAAoD;AACxE,UAAM,UAAwC,CAAC;AAC/C,UAAM,SAAS,SAAS,OAAO,IAAI,WAAS;AACxC,YAAM,SAAS,KAAK,SAAS,IAAI,MAAM,IAAI;AAC3C,YAAMC,OAAM,oBAAI,IAA+B;AAC/C,YAAM,UAA+B,CAAC;AACtC,iBAAW,QAAQ,MAAM,OAAO;AAC5B,QAAAA,KAAI,IAAI,KAAK,QAAQ,KAAK,IAAI;AAC9B,cAAM,MAAM,QAAQ,IAAI,KAAK,QAAQ,GAAG;AACxC,YAAI,QAAQ,UAAa,CAAC,aAAa,KAAK,IAAI,EAAG,SAAQ,KAAK,IAAI;AAAA,MACxE;AACA,MAAAD,SAAQ,IAAI,MAAM,MAAMC,IAAG;AAC3B,UAAI,WAAW,QAAW;AACtB,gBAAQ,KAAK,IAAI;AACjB,eAAO;AAAA,MACX;AACA,YAAM,OAAiB,CAAC;AACxB,iBAAW,CAAC,KAAK,IAAI,KAAK,OAAQ,KAAI,CAACA,KAAI,IAAI,GAAG,EAAG,MAAK,KAAK,KAAK,QAAQ,SAAS,CAAC;AACtF,cAAQ,KAAK,IAAI;AACjB,aAAO,IAAI,cAAc,MAAM,SAAS,MAAM,MAAM,MAAM,cAAc,SAAS,KAAK;AAAA,IAC1F,CAAC;AACD,SAAK,WAAWD;AAChB,UAAM,UAAU,IAAI,iBAAiB,SAAS,SAAS,SAAS,OAAO,SAAS,cAAc,MAAM;AACpG,SAAK,WAAW;AAChB,WAAO,aAAa,OAAO,KAAK,OAAO,CAAC,eAAe,QAAQ,OAAO,CAAC,cAAc,KAAK,UAAU,OAAO,CAAC;AAAA,EAChH;AACJ;AAIA,SAAS,aAAa,GAAsB,GAA+B;AACvE,MAAI,EAAE,UAAU,EAAE,SAAS,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,cAAc,EAAE,aAAa,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,QAC1H,EAAE,YAAY,EAAE,SAAS;AAC5B,WAAO;AAAA,EACX;AACA,SAAO,SAAS,CAAC,MAAM,SAAS,CAAC;AACrC;AAGA,IAAM,YAAY,oBAAI,QAAmC;AACzD,SAAS,SAAS,MAAiC;AAC/C,MAAIE,QAAO,UAAU,IAAI,IAAI;AAC7B,MAAIA,UAAS,QAAW;AACpB,IAAAA,QAAO,cAAc,SAAS,IAAI;AAClC,cAAU,IAAI,MAAMA,KAAI;AAAA,EAC5B;AACA,SAAOA;AACX;;;ACnEO,IAAM,YAAN,MAAM,WAAU;AAAA;AAAA,EAEnB,OAAgB,QAAQ,IAAI,WAAU,UAAU,WAAW;AAAA;AAAA,EAGlD;AAAA;AAAA,EAGA;AAAA;AAAA,EAGT,YAAY,MAAc,SAAiB;AACvC,QAAI,CAAC,OAAO,UAAU,IAAI,KAAK,OAAO,KAAK,OAAO,UAAU;AACxD,YAAM,IAAI,WAAW,2CAA2C,OAAO,IAAI,CAAC,eAAe;AAAA,IAC/F;AACA,QAAI,CAAC,OAAO,UAAU,OAAO,KAAK,UAAU,KAAK,UAAU,aAAa;AACpE,YAAM,IAAI,WAAW,2CAA2C,OAAO,OAAO,CAAC,eAAe;AAAA,IAClG;AACA,SAAK,OAAO;AACZ,SAAK,UAAU;AAAA,EACnB;AAAA;AAAA,EAGA,IAAI,WAAwB;AACxB,WAAO,IAAI,YAAY,KAAK,OAAO,GAAG,KAAK,UAAU,CAAC;AAAA,EAC1D;AAAA;AAAA,EAGA,SAAS,SAA+B;AACpC,WAAO,QAAQ,MAAM,KAAK,QAAQ,QAAQ,SAAS,KAAK;AAAA,EAC5D;AAAA;AAAA,EAGA,MAAM,QAAqB,MAAc,SAA0B;AAC/D,WAAO,OAAO,MAAM,QAAQ,KAAK,QAAQ,OAAO,SAAS,WAAW,KAAK;AAAA,EAC7E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,OAAyC;AACzC,UAAM,OAAO,IAAI,YAAY,MAAM,iBAAiB,KAAK,OAAO,IAAI,MAAM,KAAK,KAAK,MAAM,cAAc,KAAK,UAAU,IAAI,MAAM,KAAK,MAAM;AAC5I,WAAO,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS,MAAM,KAAK,IAAI,IAAI,UAAU,MAAM,OAAO,IAAI,IAAI;AAAA,EAClG;AAAA;AAAA,EAGA,OAAO,OAA2B;AAC9B,WAAO,KAAK,SAAS,MAAM,QAAQ,KAAK,YAAY,MAAM;AAAA,EAC9D;AACJ;;;AC9CA,IAAM,aAA6C,CAAC,WAAW,QAAQ,UAAU,OAAO;AACxF,IAAM,iBAA2C,CAAC,QAAQ,SAAS,MAAM,MAAM;AAOxE,IAAe,YAAf,MAAe,WAAU;AAAA;AAAA,EAElB,cAAc;AAAA,EAExB;AAAA;AAAA,EAGA,OAAO,MAAM,SAAsB,OAA0B;AACzD,WAAO,WAAU,UAAU,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC;AAAA,EACjD;AAAA;AAAA,EAGA,OAAO,UAAU,OAAuC;AACpD,UAAM,OAAO,CAAC,GAAG,KAAK;AACtB,WAAO,IAAI,UAAU,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,WAAS,MAAM,UAAU,IAAI,CAAC;AAAA,EAC7E;AAAA;AAAA,EAGA,OAAO,WAAW,SAA2C;AACzD,UAAM,OAAO,CAAC,GAAG,OAAO;AACxB,WAAO,IAAI,UAAU,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,WAAS,MAAM,WAAW,IAAI,CAAC;AAAA,EAC9E;AAAA;AAAA,EAGA,OAAO,kBAAkB,WAAkC,QAA6C;AACpG,UAAM,OAAO,CAAC,GAAG,SAAS;AAC1B,WAAO,IAAI,UAAU,MAAM,WAAS,MAAM,kBAAkB,MAAM,MAAM,CAAC;AAAA,EAC7E;AAAA;AAAA,EAGA,OAAO,eAAe,WAAkC,WAA2C;AAC/F,UAAM,OAAO,CAAC,GAAG,SAAS;AAC1B,WAAO,IAAI,UAAU,MAAM,WAAS,MAAM,eAAe,MAAM,SAAS,CAAC;AAAA,EAC7E;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,gBAAgB,OAAkB,QAA6C;AAClF,WAAO,IAAI,eAAe,OAAO,IAAI,iBAAiB,EAAE,cAAc,UAAU,aAAa,QAAQ,CAAC,CAAC;AAAA,EAC3G;AAAA;AAAA,EAGA,OAAO,aAAa,OAAkB,WAA2C;AAC7E,QAAI,CAAC,WAAW,SAAS,SAAS,EAAG,OAAM,IAAI,WAAW,qBAAqB,SAAS,GAAG;AAC3F,WAAO,IAAI,eAAe,OAAO,IAAI,iBAAiB,EAAE,UAAU,CAAC,CAAC;AAAA,EACxE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,cAAc,QAA6B,QAAqC;AACnF,WAAO,IAAI,gBAAgB,MAAM,gBAAgB,QAAQ,MAAM,GAAG,MAAM;AAAA,EAC5E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,eAAe,SAAoB,OAAsC;AAC5E,UAAMC,WAAU,MAAM,iBAAiB,KAAK;AAC5C,WAAO,IAAI,gBAAgB,SAASA,aAAY,SAAY,SAAY,IAAI,iBAAiBA,UAAS,WAAW,CAAC;AAAA,EACtH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,wBAAwB,SAAoB,OAA0B;AACzE,UAAMA,WAAU,MAAM,iBAAiB,KAAK;AAC5C,QAAIA,aAAY,OAAW,OAAM,IAAI,MAAM,uCAAuC;AAClF,WAAO,IAAI,gBAAgB,SAAS,IAAI,iBAAiBA,UAAS,gBAAgB,CAAC;AAAA,EACvF;AAAA;AAAA,EAGA,OAAO,WAAWC,MAAaC,SAAQ,GAAc;AACjD,WAAO,IAAI,cAAc,IAAI,eAAe,QAAQD,MAAKC,QAAO,IAAI,CAAC;AAAA,EACzE;AAAA;AAAA,EAGA,OAAO,WAAWD,MAAaC,SAAQ,GAAc;AACjD,WAAO,IAAI,cAAc,IAAI,eAAe,QAAQD,MAAKC,QAAO,KAAK,CAAC;AAAA,EAC1E;AAAA;AAAA,EAGA,OAAO,cAAcC,SAAgBD,SAAQ,GAAc;AACvD,WAAO,IAAI,cAAc,IAAI,eAAe,WAAWC,SAAQD,QAAO,IAAI,CAAC;AAAA,EAC/E;AAAA;AAAA,EAGA,OAAO,cAAcC,SAAgBD,SAAQ,GAAc;AACvD,WAAO,IAAI,cAAc,IAAI,eAAe,WAAWC,SAAQD,QAAO,KAAK,CAAC;AAAA,EAChF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,OAAO,MAAM,OAAmB,IAA8D;AAC1F,QAAI,cAAc,aAAa;AAE3B,YAAME,QAAO,UAAU,MAAM,MAAM,IAAI,MAAM,UAAU,MAAM,WAAW;AACxE,aAAO,IAAI;AAAA,QAAW,WAAS,MAAM,SAAS,IAAI,MAAM,UAAU,MAAM,WAAW;AAAA,QAAG,MAAM,MAAM,MAAM,OAAO,EAAE;AAAA,QAC7GA,QAAO,CAAC,IAAI,UAAU,IAAI,IAAI,YAAY,GAAG,MAAM,MAAM,WAAW,GAAG,GAAG,SAAS,MAAM,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC;AAAA,MAAC;AAAA,IACxH;AACA,QAAI,cAAc,WAAW;AACzB,yBAAmB,OAAO,EAAE;AAC5B,aAAO,IAAI,WAAW,MAAM,QAAW,MAAM,CAAC,GAAG,MAAM,OAAO,EAAE,CAAC,EAAE,QAAQ,YAAU,CAAC,GAAG,MAAM,MAAM,OAAO,MAAM,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;AAAA,IAC/H;AACA,UAAM,SAAS,CAAC,GAAG,EAAE;AACrB,QAAI,OAAO,WAAW,EAAG,OAAM,IAAI,WAAW,kCAAkC;AAChF,eAAW,UAAU,OAAQ,oBAAmB,OAAO,MAAM;AAC7D,WAAO,IAAI,WAAW,MAAM,QAAW,MAAM;AACzC,YAAM,SAAS,oBAAI,IAA4B;AAC/C,iBAAW,UAAU,QAAQ;AACzB,mBAAW,UAAU,MAAM,OAAO,MAAM,GAAG;AACvC,qBAAW,UAAU,MAAM,MAAM,OAAO,MAAM,GAAG;AAE7C,mBAAO,IAAI,OAAO,QAAQ,KAAK,MAAM;AAAA,UACzC;AAAA,QACJ;AAAA,MACJ;AACA,aAAO,CAAC,GAAG,OAAO,OAAO,CAAC;AAAA,IAC9B,GAAG,MAAM;AAAA,EACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAO,UAAU,QAAwC,QAAgC;AACrF,UAAM,QAAQ,OAAO,CAAC;AACtB,QAAI,UAAU,UAAa,MAAM,WAAW,EAAG,OAAM,IAAI,WAAW,mBAAmB;AACvF,UAAM,QAAQ,MAAM;AACpB,QAAI,OAAO,KAAK,CAAAH,SAAOA,KAAI,WAAW,KAAK,EAAG,OAAM,IAAI,WAAW,wCAAwC;AAE3G,QAAI,CAAC,UAAU,MAAM,MAAM,QAAQ,OAAO,QAAQ,KAAK,GAAG;AACtD,aAAO,IAAI,YAAY,IAAI;AAAA,QAAa;AAAA,QACpC,cAAc,OAAO,OAAO,MAAM,CAAC,SAAM,OAAO,KAAK,CAAC,OAAO,OAAO,SAAS,CAAC,qCAAqC,UAAU,MAAM,SAAS,SAAS,CAAC;AAAA,MAAI,CAAC;AAAA,IACnK;AACA,UAAM,QAAqB,CAAC;AAC5B,WAAO,QAAQ,CAACA,MAAK,MAAM;AACvB,MAAAA,KAAI,QAAQ,CAAC,OAAO,MAAM,MAAM,KAAK,CAAC,IAAI,YAAY,OAAO,MAAM,GAAG,OAAO,SAAS,CAAC,GAAG,KAAK,CAAC,CAAC;AAAA,IACrG,CAAC;AACD,WAAO,WAAU,YAAY,KAAK;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,YAAY,QAA6B,SAA4C;AACxF,UAAM,QAAQ,CAAC,GAAG,MAAM;AACxB,QAAI,YAAY,OAAW,QAAO,IAAI,UAAU,MAAM,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,WAAS,MAAM,UAAU,OAAO,IAAI,CAAC;AAC5G,UAAMI,SAAQ,CAAC,GAAG,OAAO;AACzB,WAAO,IAAI;AAAA,MAAU,CAAC,GAAG,MAAM,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,GAAGA,OAAM,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;AAAA,MACpE,WAAS,YAAY,MAAM,CAAC,MAAM,UAAU,OAAO,IAAI,GAAG,MAAM,WAAWA,MAAK,CAAC,CAAC;AAAA,IAAC;AAAA,EAC3F;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,OAAO,KAAK,QAAmB,QAAmB,WAAqC;AACnF,QAAI,CAAC,eAAe,SAAS,SAAS,EAAG,OAAM,IAAI,WAAW,yBAAyB,SAAS,GAAG;AACnG,WAAO,IAAI,SAAS,QAAQ,QAAQ,WAAW,KAAK;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,SAAS,QAAmB,QAAmB,WAAqC;AACvF,QAAI,CAAC,eAAe,SAAS,SAAS,EAAG,OAAM,IAAI,WAAW,yBAAyB,SAAS,GAAG;AACnG,WAAO,IAAI,SAAS,QAAQ,QAAQ,WAAW,IAAI;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,OAAO,UAAU,SAA8B,WAAwB,OAA0B;AAC7F,UAAM,SAAS,CAAC,GAAG,OAAO;AAC1B,QAAI,OAAO,WAAW,EAAG,OAAM,IAAI,WAAW,iCAAiC;AAC/E,QAAI,CAAC,OAAO,KAAK,WAAS,MAAM,SAAS,SAAS,CAAC,EAAG,OAAM,IAAI,WAAW,GAAG,UAAU,SAAS,CAAC,kCAAkC;AACpI,UAAM,OAAO,oBAAI,IAAY;AAC7B,UAAM,QAAuB,CAAC;AAC9B,eAAW,SAAS,QAAQ;AACxB,iBAAW,QAAQ,MAAM,MAAM,GAAG;AAC9B,YAAI,KAAK,IAAI,KAAK,GAAG,EAAG;AACxB,aAAK,IAAI,KAAK,GAAG;AACjB,cAAM,KAAK,IAAI;AAAA,MACnB;AAAA,IACJ;AACA,WAAO,IAAI,UAAU,OAAO,WAAS,MAAM,UAAU,OAAO,WAAW,KAAK,GAAG,WAAW,QAAQ,SAAS,CAAC;AAAA,EAChH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,OAAO,MAAyB;AACnC,WAAO,IAAI,WAAW,MAAM,UAAU,IAAI,CAAC;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,YAAY,MAAe,SAAS,OAAkB;AACzD,WAAO,IAAI,gBAAgB,SAAS,SAAY,SAAY,MAAM,UAAU,IAAI,GAAG,MAAM;AAAA,EAC7F;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,cAAyB;AAC5B,WAAO,IAAI,gBAAgB;AAAA,EAC/B;AAAA;AAAA,EAGA,OAAO,UAAU,OAA0B;AACvC,QAAI,CAAC,OAAO,UAAU,KAAK,KAAK,QAAQ,EAAG,OAAM,IAAI,WAAW,GAAG,OAAO,KAAK,CAAC,+BAA+B;AAC/G,WAAO,IAAI,cAAc,KAAK;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,UAAU,OAA2B;AACxC,QAAI,UAAU,WAAc,CAAC,OAAO,UAAU,KAAK,KAAK,QAAQ,GAAI,OAAM,IAAI,WAAW,GAAG,OAAO,KAAK,CAAC,+BAA+B;AACxI,WAAO,IAAI,cAAc,KAAK;AAAA,EAClC;AAAA;AAAA,EAGA,MAAM,QAAyC;AAC3C,WAAO;AAAA,EACX;AAAA;AAAA,EAMA,IAAI,SAA+B;AAC/B,WAAO,CAAC;AAAA,EACZ;AAAA;AAAA,EAGA,OAAO,SAAS,OAA2C;AACvD,QAAI,MAAM,OAAO;AACjB,QAAIC,QAAO,OAAO;AAClB,QAAI,SAAS;AACb,QAAIC,SAAQ;AACZ,eAAW,QAAQ,OAAO;AACtB,YAAM,KAAK,IAAI,KAAK,KAAK,GAAG;AAC5B,MAAAD,QAAO,KAAK,IAAIA,OAAM,KAAK,MAAM;AACjC,eAAS,KAAK,IAAI,QAAQ,KAAK,GAAG;AAClC,MAAAC,SAAQ,KAAK,IAAIA,QAAO,KAAK,MAAM;AAAA,IACvC;AACA,WAAO,SAAS,IAAI,CAAC,IAAI,CAAC,IAAI,UAAU,IAAI,YAAY,KAAKD,KAAI,GAAG,IAAI,YAAY,QAAQC,MAAK,CAAC,CAAC;AAAA,EACvG;AACJ;AAEA,SAAS,mBAAmB,OAAmB,QAAyB;AACpE,MAAI,OAAO,WAAW,MAAM,aAAa,KAAK,OAAO,cAAc,MAAM,gBAAgB,GAAG;AACxF,UAAM,IAAI,WAAW,KAAK,OAAO,OAAO,QAAQ,CAAC,SAAM,OAAO,OAAO,WAAW,CAAC,wCAAwC,OAAO,MAAM,QAAQ,CAAC,SAAM,OAAO,MAAM,WAAW,CAAC,SAAS;AAAA,EAC3L;AACJ;AAGA,UAAU,MAAM,OAAmB,QAA2C;AAC1E,WAASN,OAAM,OAAO,MAAM,KAAKA,QAAO,OAAO,KAAK,KAAKA,QAAO,MAAM,UAAU;AAC5E,aAASE,UAAS,OAAO,MAAM,QAAQA,WAAU,OAAO,KAAK,QAAQA,WAAU,MAAM,YAAa,OAAM,IAAI,YAAYF,MAAKE,OAAM;AAAA,EACvI;AACJ;AAGA,SAAS,WAAW,QAA8B,MAAyC;AACvF,QAAM,KAAK,OAAO,UAAU,WAAS,MAAM,SAAS,IAAI,CAAC;AACzD,SAAO,MAAM,IAAI,SAAS,CAAC,UAAU,QAAQ,EAAE,GAAG,GAAG,OAAO,OAAO,CAAC,GAAG,MAAM,MAAM,EAAE,CAAC;AAC1F;AAGA,IAAM,YAAN,cAAwB,UAAU;AAAA,EACrB;AAAA,EACA;AAAA,EACT;AAAA,EAEA,YAAY,SAAiC,OAAsC,QAA+B;AAC9G,UAAM;AACN,SAAK,WAAW;AAChB,SAAK,SAAS;AACd,SAAK,UAAU;AAAA,EACnB;AAAA;AAAA,EAGA,IAAa,SAA+B;AACxC,SAAK,YAAY,UAAU,SAAS,KAAK,QAAQ;AACjD,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,MAAM,OAAyB;AAC3B,UAAM,WAAW,oBAAI,IAAyB;AAC9C,eAAW,WAAW,KAAK,SAAU,KAAI,CAAC,SAAS,IAAI,QAAQ,GAAG,EAAG,UAAS,IAAI,QAAQ,KAAK,OAAO;AACtG,UAAM,YAAY,CAAC,GAAG,SAAS,OAAO,CAAC;AACvC,UAAM,SAAS,MAAM,OAAO,SAAS;AACrC,UAAM,SAAS,KAAK,OAAO,KAAK;AAChC,UAAM,QAAQ,MAAM,OAAO,SAAS;AACpC,WAAO,IAAI,UAAU,OAAO,QAAQ,OAAK,EAAE,QAAQ,MAAM,GAAG,OAAK,EAAE,QAAQ,KAAK,CAAC;AAAA,EACrF;AACJ;AAGA,IAAM,aAAN,cAAyB,UAAU;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EAET,YAAY,SAAqD,QAAwC,QAA8B;AACnI,UAAM;AACN,SAAK,WAAW;AAChB,SAAK,UAAU;AACf,SAAK,UAAU;AAAA,EACnB;AAAA,EAES,MAAM,OAAwC;AACnD,WAAO,KAAK,SAAS,KAAK;AAAA,EAC9B;AAAA,EAEA,IAAa,SAA+B;AACxC,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,MAAM,OAAyB;AAC3B,UAAM,SAAS,MAAM,OAAO,KAAK,QAAQ,CAAC;AAC1C,WAAO,IAAI,UAAU,OAAO,IAAI,OAAK,EAAE,OAAO,GAAG,OAAK,EAAE,QAAQ,MAAM,CAAC,EAAE,MAAM,KAAK;AAAA,EACxF;AACJ;AAGA,IAAM,WAAN,cAAuB,UAAU;AAAA,EACpB;AAAA,EAEA;AAAA,EAEA;AAAA,EAEA;AAAA,EAET,YAAY,QAAmB,QAAmB,WAA0B,UAAmB;AAC3F,UAAM;AACN,SAAK,SAAS;AACd,SAAK,SAAS;AACd,SAAK,YAAY;AACjB,SAAK,WAAW;AAAA,EACpB;AAAA,EAES,MAAM,OAAwC;AACnD,WAAO,MAAM,SAAS,KAAK,QAAQ,KAAK,QAAQ,KAAK,WAAW,KAAK,QAAQ,EAAE;AAAA,EACnF;AAAA;AAAA,EAGA,IAAa,SAA+B;AACxC,UAAM,EAAE,QAAQ,OAAO,IAAI;AAC3B,WAAO,CAAC,IAAI;AAAA,MACR,IAAI,YAAY,KAAK,IAAI,OAAO,MAAM,KAAK,OAAO,MAAM,GAAG,GAAG,KAAK,IAAI,OAAO,MAAM,QAAQ,OAAO,MAAM,MAAM,CAAC;AAAA,MAChH,IAAI,YAAY,KAAK,IAAI,OAAO,KAAK,KAAK,OAAO,KAAK,GAAG,GAAG,KAAK,IAAI,OAAO,KAAK,QAAQ,OAAO,KAAK,MAAM,CAAC;AAAA,IAAC,CAAC;AAAA,EACtH;AAAA,EAEA,MAAM,OAAyB;AAC3B,UAAM,OAAO,MAAM,SAAS,KAAK,QAAQ,KAAK,QAAQ,KAAK,WAAW,KAAK,QAAQ;AACnF,QAAI,KAAK,YAAY,OAAW,OAAM,IAAI,kBAAkB,KAAK,OAAO;AAExE,QAAI,KAAK,WAAW,OAAW,QAAO,MAAM,iBAAiB,IAAI;AACjE,UAAMK,WAAU,MAAM,OAAO,KAAK,MAAM;AACxC,WAAO,IAAI,UAAUA,SAAQ,IAAI,OAAK,EAAE,OAAO,GAAG,OAAK,EAAE,QAAQA,QAAO,CAAC,EAAE,MAAM,KAAK;AAAA,EAC1F;AACJ;AAGA,IAAM,iBAAN,cAA6B,UAAU;AAAA,EAC1B;AAAA,EAEA;AAAA,EAET,YAAY,OAAkB,QAA0B;AACpD,UAAM;AACN,SAAK,QAAQ;AACb,SAAK,SAAS;AAAA,EAClB;AAAA,EAEA,IAAa,SAA+B;AACxC,WAAO,CAAC,KAAK,KAAK;AAAA,EACtB;AAAA,EAEA,MAAM,OAAyB;AAC3B,UAAM,UAAU,MAAM,gBAAgB,KAAK,OAAO,KAAK,MAAM;AAC7D,WAAO,IAAI,UAAU,OAAO,QAAQ,QAAQ,OAAK,EAAE,eAAe,OAAO,GAAG,OAAK,EAAE,gBAAgB,KAAK,OAAO,KAAK,MAAM,EAAE,MAAM;AAAA,EACtI;AACJ;AAGA,IAAM,kBAAN,cAA8B,UAAU;AAAA,EAC3B;AAAA,EAEA;AAAA,EAET,YAAY,QAA8B,QAA0B;AAChE,UAAM;AACN,SAAK,SAAS;AACd,SAAK,UAAU;AAAA,EACnB;AAAA,EAEA,IAAa,SAA+B;AACxC,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,MAAM,OAAyB;AAC3B,UAAM,UAAU,MAAM,iBAAiB,KAAK,SAAS,KAAK,MAAM;AAChE,WAAO,IAAI,UAAU,OAAO,QAAQ,QAAQ,OAAK,EAAE,gBAAgB,OAAO,GAAG,OAAK,EAAE,iBAAiB,KAAK,SAAS,KAAK,MAAM,EAAE,MAAM;AAAA,EAC1I;AACJ;AAGA,IAAM,kBAAN,cAA8B,UAAU;AAAA,EAC3B;AAAA,EAEA;AAAA,EAET,YAAY,SAAoB,OAAqC;AACjE,UAAM;AACN,SAAK,UAAU;AACf,SAAK,QAAQ;AAAA,EACjB;AAAA,EAEA,IAAa,SAA+B;AACxC,WAAO,CAAC,KAAK,OAAO;AAAA,EACxB;AAAA,EAEA,MAAM,OAAyB;AAC3B,UAAM,EAAE,QAAQ,OAAO,IAAI,MAAM,iBAAiB,KAAK,SAAS,KAAK,KAAK;AAC1E,UAAM,QAAQ,MAAM,gBAAgB;AACpC,WAAO,IAAI,UAAU,OAAO,QAAQ,OAAK,EAAE,oBAAoB,MAAM,GAAG,OAAK,EAAE,oBAAoB,KAAK,CAAC;AAAA,EAC7G;AACJ;AAGA,IAAM,aAAN,cAAyB,UAAU;AAAA,EACtB;AAAA,EAET,YAAY,MAAc;AACtB,UAAM;AACN,SAAK,OAAO;AAAA,EAChB;AAAA,EAES,MAAM,OAAwC;AACnD,WAAO,MAAM,SAAS,UAAU,KAAK,MAAM,KAAK;AAAA,EACpD;AAAA,EAEA,MAAM,OAAyB;AAC3B,UAAM,UAAU,MAAM,YAAY,KAAK,IAAI;AAC3C,WAAO,IAAI,UAAU,OAAO,QAAQ,QAAQ,OAAK,EAAE,WAAW,OAAO,GAAG,OAAK,EAAE,YAAY,KAAK,IAAI,EAAE,MAAM;AAAA,EAChH;AACJ;AAWO,IAAe,eAAf,cAAoC,UAAU;AAAA,EAKxC,MAAM,OAAwC;AACnD,WAAO,KAAK,QAAQ,MAAM,UAAU,KAAK;AAAA,EAC7C;AAAA,EAEA,MAAM,OAAyB;AAC3B,UAAM,OAAO,KAAK,QAAQ,MAAM,UAAU,KAAK;AAC/C,WAAO,IAAI,UAAU,KAAK,OAAO,KAAK,QAAQ,MAAM,KAAK,KAAK,GAAG,MAAM,KAAK,KAAK,CAAC;AAAA,EACtF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAiB,QAAQ,UAAoBC,OAAa,OAAe,UAA8B,SAAiB,QAAuC;AAC3J,WAAO;AAAA,MACH,OAAOA;AAAA,MACP;AAAA,MACA,MAAM,MAAM;AACR,iBAAS,iBAAiB,OAAO;AACjC,eAAO,SAAS,QAAQA,OAAM,OAAO,CAAC,CAAC;AAAA,MAC3C;AAAA,MACA,MAAM,MAAM;AACR,iBAAS,eAAe,QAAQ;AAChC,eAAO,SAAS,SAASA,OAAM,KAAK;AAAA,MACxC;AAAA,IACJ;AAAA,EACJ;AAAA,EAEA,OAAiB,WAAW,OAAeP,QAAuB;AAC9D,QAAI,QAAQA,SAAQ,EAAG,OAAM,IAAI,WAAW,GAAG,OAAO,KAAK,CAAC,yCAAyC,OAAOA,SAAQ,CAAC,CAAC,GAAG;AACzH,WAAO;AAAA,EACX;AACJ;AAEA,IAAM,kBAAN,cAA8B,aAAa;AAAA,EAC9B;AAAA,EAEA;AAAA,EAET,YAAY,MAA0B,QAAiB;AACnD,UAAM;AACN,SAAK,OAAO;AACZ,SAAK,SAAS;AAAA,EAClB;AAAA,EAEA,QAAQ,UAA8C;AAClD,WAAO,KAAK,SAAS,SAAY,SAAY,SAAS,UAAU,KAAK,MAAM,MAAS;AAAA,EACxF;AAAA,EAEA,QAAQ,UAAoB,OAAgC;AACxD,UAAM,QAAQ,SAAS,QAAQ,KAAK,KAAK,KAAK,SAAS,IAAI;AAC3D,UAAM,WAAW,KAAK,SAAS,SAAY,SAAS,gBAAgB,IAAI;AACxE,UAAM,UAAU,SAAS,eAAe,QAAQ;AAChD,UAAM,OAAO,KAAK,QAAQ,SAAS,UAAU,QAAQ,UAAU,iBAAiB,CAAC;AACjF,UAAM,EAAE,OAAO,UAAU,OAAO,IAAI,SAAS,YAAY,OAAO,IAAI;AACpE,WAAO,aAAa,QAAQ,UAAU,UAAU,OAAO,UAAU,SAAS,MAAM;AAAA,EACpF;AACJ;AAEA,IAAM,kBAAN,cAA8B,aAAa;AAAA,EACvC,QAAQ,UAAoB,OAAwC;AAChE,WAAO,SAAS,OAAO,WAAW,IAC5B,IAAI,aAAa,aAAa,IAAI,MAAM,IAAI,oEAAoE,IAChH;AAAA,EACV;AAAA,EAEA,QAAQ,UAAoB,OAAgC;AACxD,UAAM,QAAQ,SAAS,QAAQ,KAAK;AACpC,UAAM,QAAQ,SAAS,UAAU;AACjC,UAAM,YAA8B,CAAC;AACrC,UAAM,SAAS,SAAS,QAAQ,OAAO,MAAM,SAAS;AACtD,WAAO;AAAA,MACH;AAAA,MACA;AAAA,MACA,MAAM,MAAM,SAAS,QAAQ,OAAO,OAAO,WAAW,KAAK;AAAA,MAC3D,MAAM,MAAM;AACR,kBAAU,SAAS;AACnB,eAAO,SAAS,QAAQ,OAAO,MAAM,SAAS;AAAA,MAClD;AAAA,IACJ;AAAA,EACJ;AACJ;AAEA,IAAM,gBAAN,cAA4B,aAAa;AAAA,EAC5B;AAAA,EAET,YAAY,OAAe;AACvB,UAAM;AACN,SAAK,QAAQ;AAAA,EACjB;AAAA,EAEA,UAAoC;AAChC,WAAO;AAAA,EACX;AAAA,EAEA,QAAQ,UAAoB,OAAgC;AACxD,UAAM,KAAK,aAAa,WAAW,KAAK,OAAO,SAAS,OAAO,MAAM;AACrE,UAAM,OAAO,SAAS,QAAQ,KAAK;AACnC,QAAI,SAAS,GAAI,QAAO,EAAE,OAAO,QAAQ,YAAY,MAAM,MAAM,MAAM,YAAY,MAAM,MAAM,MAAM,YAAY,KAAK;AACtH,UAAM,YAA8B,CAAC;AACrC,UAAM,SAAS,SAAS,KAAK,OAAO,IAAI,SAAS;AACjD,WAAO;AAAA,MACH;AAAA,MACA;AAAA,MACA,MAAM,MAAM,SAAS,SAAS,OAAO,MAAM,SAAS;AAAA,MACpD,MAAM,MAAM;AACR,kBAAU,SAAS;AACnB,eAAO,SAAS,KAAK,OAAO,IAAI,SAAS;AAAA,MAC7C;AAAA,IACJ;AAAA,EACJ;AACJ;AAEA,IAAM,gBAAN,cAA4B,aAAa;AAAA,EAC5B;AAAA,EAET,YAAY,OAA2B;AACnC,UAAM;AACN,SAAK,QAAQ;AAAA,EACjB;AAAA,EAEA,UAAoC;AAChC,WAAO;AAAA,EACX;AAAA,EAEA,QAAQ,UAAoB,OAAgC;AACxD,UAAM,KAAK,KAAK,UAAU,SAAY,SAAS,QAAQ,KAAK,IAAI,IAAI,aAAa,WAAW,KAAK,OAAO,SAAS,OAAO,SAAS,CAAC;AAClI,UAAM,UAAU,SAAS,eAAe,MAAS;AACjD,UAAM,EAAE,OAAO,MAAM,OAAO,IAAI,SAAS,KAAK,OAAO,IAAI,SAAS,SAAS,MAAM,IAAI,CAAC;AACtF,WAAO,aAAa,QAAQ,UAAU,MAAM,IAAI,QAAW,SAAS,MAAM;AAAA,EAC9E;AACJ;AAGA,IAAM,cAAN,cAA0B,UAAU;AAAA,EACvB;AAAA,EAET,YAAY,SAAuB;AAC/B,UAAM;AACN,SAAK,UAAU;AAAA,EACnB;AAAA,EAES,QAAkC;AACvC,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,QAAmB;AACf,UAAM,IAAI,kBAAkB,KAAK,OAAO;AAAA,EAC5C;AACJ;AAOA,IAAM,gBAAN,cAA4B,UAAU;AAAA,EACzB;AAAA,EAET,YAAY,MAAsB;AAC9B,UAAM;AACN,SAAK,OAAO;AAAA,EAChB;AAAA,EAES,MAAM,OAAwC;AACnD,WAAO,MAAM,gBAAgB,KAAK,IAAI;AAAA,EAC1C;AAAA;AAAA,EAGA,IAAa,SAA+B;AACxC,UAAM,EAAE,MAAAQ,OAAM,OAAO,OAAAR,OAAM,IAAI,KAAK;AACpC,WAAO,CAACQ,UAAS,SAAS,UAAU,UAAU,OAAO,QAAQR,SAAQ,CAAC,IAAI,UAAU,aAAa,OAAO,QAAQA,SAAQ,CAAC,CAAC;AAAA,EAC9H;AAAA,EAEA,MAAM,OAAyB;AAC3B,UAAM,UAAU,MAAM,YAAY,KAAK,IAAI;AAC3C,WAAO,IAAI,UAAU,OAAO,QAAQ,QAAQ,OAAK,EAAE,cAAc,KAAK,MAAM,OAAO,GAAG,OAAK,EAAE,YAAY,KAAK,IAAI,EAAE,MAAM;AAAA,EAC9H;AACJ;;;ACrrBA,IAAMS,cAA6C,CAAC,WAAW,QAAQ,UAAU,OAAO;AACxF,IAAM,aAAuC,CAAC,QAAQ,SAAS,MAAM,MAAM;AAC3E,IAAM,cAAc,oBAAI,IAAI,CAAC,gBAAgB,aAAa,cAAc,QAAQ,UAAU,aAAa,iBAAiB,QAAQ,SAAS,CAAC;AAC1I,IAAM,QAAQ,oBAAI,IAAI,CAAC,OAAO,UAAU,QAAQ,SAAS,oBAAoB,gBAAgB,CAAC;AAOvF,SAAS,cAAc,MAAyB;AACnD,SAAO,OAAO,MAAM,IAAI,CAAC;AAC7B;AAGO,SAAS,qBAAqB,MAAgC;AACjE,SAAO,SAAS,MAAM,IAAI,CAAC;AAC/B;AAGO,SAAS,eAAe,MAAuC;AAClE,SAAO,MAAM,MAAM,IAAI,GAAG,UAAU,EAAE,IAAI,CAAAC,SAAO,MAAMA,MAAK,OAAO,EAAE,IAAIC,QAAO,CAAC;AACrF;AAMO,SAAS,gBAAgB,MAAwD;AACpF,SAAO,KAAK,UAAU,CAAC,GAAG,IAAI,EAAE,IAAI,CAAAD,SAAOA,KAAI,IAAI,WAAS,UAAU,SAAY,OAAO,aAAa,KAAK,CAAC,CAAC,CAAC;AAClH;AAGO,SAASE,iBAAgB,QAA4B;AACxD,SAAO,KAAK,UAAU;AAAA,IAClB,cAAc,OAAO,aAAa;AAAA,IAClC,WAAW,OAAO;AAAA,IAClB,MAAM,SAAS,OAAO,IAAI;AAAA,IAC1B,MAAM,SAAS,OAAO,IAAI;AAAA,IAC1B,SAAS,YAAY,OAAO,OAAO;AAAA,EACvC,CAAC;AACL;AAOO,SAAS,iBAAiBC,QAAiC;AAC9D,SAAO,KAAK,UAAU;AAAA,IAClB,OAAOA,OAAM;AAAA,IACb,YAAYA,OAAM;AAAA,IAClB,MAAMA,OAAM,KAAK,IAAI,SAAS;AAAA,IAC9B,UAAUA,OAAM;AAAA,IAChB,SAASA,OAAM,QAAQ,IAAI,SAAS;AAAA,IACpC,WAAWA,OAAM;AAAA,IACjB,QAAQ,WAAWA,OAAM,MAAM;AAAA,EACnC,CAAC;AACL;AAEA,SAAS,MAAM,MAA2B;AAEtC,MAAI;AACA,WAAO,UAAU,IAAI;AAAA,EACzB,SAASA,QAAO;AACZ,QAAIA,kBAAiB,gBAAiB,OAAM,IAAI,YAAY,aAAaA,OAAM,OAAO,EAAE;AACxF,UAAMA;AAAA,EACV;AACJ;AAEA,SAAS,OAAO,SAAiC;AAC7C,QAAM,OAAO,OAAO,SAAS,SAAS;AACtC,QAAM,OAAO,KAAK,WAAW,WAAW,IAAI,KAAK,WAAW,CAAC,IAAI;AACjE,MAAI,SAAS,OAAW,OAAM,IAAI,YAAY,gCAAgC,KAAK,GAAG,GAAG;AACzF,QAAM,CAAC,MAAM,QAAQ,IAAI;AACzB,UAAQ,MAAM;AAAA,IACV,KAAK;AACD,aAAO,UAAU,UAAU,QAAQ,QAAQ,CAAC;AAAA,IAChD,KAAK;AACD,aAAO,UAAU,WAAW,UAAU,QAAQ,CAAC;AAAA,IACnD,KAAK,mBAAmB;AACpB,YAAM,OAAO,OAAO,UAAU,IAAI;AAClC,YAAM,OAAO,OAAO,MAAM,QAAQ;AAClC,YAAM,SAAS,KAAK,SAAS,SAAS,SAAY,aAAa,MAAM,KAAK,MAAM,QAAQ,CAAC;AACzF,YAAM,KAAK,OAAO,MAAM,IAAI;AAC5B,aAAO,GAAG,SAAS,UACb,UAAU,kBAAkB,GAAG,MAAM,IAAI,SAAS,GAAG,MAAM,IAC3D,UAAU,gBAAgB,QAAQ,EAAE,GAAG,MAAM;AAAA,IACvD;AAAA,IACA,KAAK,gBAAgB;AACjB,YAAM,OAAO,OAAO,UAAU,IAAI;AAClC,YAAM,YAAY,MAAMJ,aAAY,KAAK,OAAO,MAAM,WAAW,GAAG,WAAW,GAAG,cAAc;AAChG,YAAM,KAAK,OAAO,MAAM,IAAI;AAC5B,aAAO,GAAG,SAAS,UACb,UAAU,eAAe,GAAG,MAAM,IAAI,SAAS,GAAG,SAAS,IAC3D,UAAU,aAAa,QAAQ,EAAE,GAAG,SAAS;AAAA,IACvD;AAAA,IACA,KAAK,iBAAiB;AAClB,YAAM,OAAO,OAAO,UAAU,IAAI;AAClC,aAAO,UAAU,cAAc,MAAM,OAAO,MAAM,QAAQ,GAAG,QAAQ,EAAE,IAAI,OAAO,GAAG,SAAS,OAAO,MAAM,QAAQ,CAAC,CAAC;AAAA,IACzH;AAAA,IACA,KAAK;AACD,aAAO,UAAU,WAAW,GAAG,cAAc,QAAQ,CAAC;AAAA,IAC1D,KAAK;AACD,aAAO,UAAU,WAAW,GAAG,cAAc,QAAQ,CAAC;AAAA,IAC1D,KAAK;AACD,aAAO,UAAU,cAAc,GAAG,cAAc,QAAQ,CAAC;AAAA,IAC7D,KAAK;AACD,aAAO,UAAU,cAAc,GAAG,cAAc,QAAQ,CAAC;AAAA,IAC7D,KAAK,kBAAkB;AACnB,YAAM,OAAO,OAAO,UAAU,IAAI;AAClC,YAAM,QAAQ,OAAO,MAAM,OAAO;AAClC,aAAO,UAAU,eAAe,QAAQ,OAAO,MAAM,SAAS,CAAC,GAAG,MAAM,SAAS,SAAS,SAAY,OAAO,OAAO,OAAO,CAAC;AAAA,IAChI;AAAA,IACA,KAAK,2BAA2B;AAC5B,YAAM,OAAO,OAAO,UAAU,IAAI;AAClC,aAAO,UAAU,wBAAwB,QAAQ,OAAO,MAAM,SAAS,CAAC,GAAG,OAAO,OAAO,MAAM,OAAO,GAAG,OAAO,CAAC;AAAA,IACrH;AAAA,IACA,KAAK;AAAA,IACL,KAAK,YAAY;AACb,YAAM,OAAO,OAAO,UAAU,IAAI;AAClC,YAAM,SAAS,QAAQ,OAAO,MAAM,QAAQ,CAAC;AAC7C,YAAM,SAAS,QAAQ,OAAO,MAAM,QAAQ,CAAC;AAC7C,YAAM,YAAY,MAAM,YAAY,KAAK,OAAO,MAAM,WAAW,GAAG,WAAW,GAAG,kBAAkB;AACpG,aAAO,SAAS,SAAS,UAAU,KAAK,QAAQ,QAAQ,SAAS,IAAI,UAAU,SAAS,QAAQ,QAAQ,SAAS;AAAA,IACrH;AAAA,IACA,KAAK,SAAS;AACV,YAAM,OAAO,OAAO,UAAU,IAAI;AAClC,YAAM,QAAQ,QAAQ,OAAO,MAAM,OAAO,CAAC;AAC3C,YAAM,KAAK,OAAO,MAAM,IAAI;AAC5B,UAAI,GAAG,SAAS,QAAS,QAAO,UAAU,MAAM,OAAO,GAAG,MAAM,IAAI,OAAO,CAAC;AAC5E,YAAM,SAAS,KAAK,IAAI,IAAI;AAC5B,aAAO,UAAU,MAAM,OAAO,OAAO,SAAS,GAAG,IAAI,UAAU,MAAM,MAAM,IAAI,YAAY,MAAM,MAAM,CAAC;AAAA,IAC5G;AAAA,IACA,KAAK,aAAa;AACd,YAAM,OAAO,OAAO,UAAU,IAAI;AAClC,aAAO,UAAU;AAAA,QAAU,MAAM,OAAO,MAAM,QAAQ,GAAG,QAAQ,EAAE,IAAI,CAAAC,SAAO,MAAMA,MAAK,OAAO,EAAE,IAAI,OAAK,KAAK,GAAG,SAAS,CAAC,CAAC;AAAA,QAC1H,UAAU,OAAO,MAAM,IAAI,CAAC;AAAA,MAAC;AAAA,IACrC;AAAA,IACA,KAAK,eAAe;AAChB,YAAM,OAAO,OAAO,UAAU,IAAI;AAClC,YAAM,UAAU,SAAS,MAAM,SAAS;AACxC,aAAO,UAAU,YAAY,QAAQ,OAAO,MAAM,OAAO,CAAC,GAAG,YAAY,SAAY,SAAY,UAAU,OAAO,CAAC;AAAA,IACvH;AAAA,IACA,KAAK,aAAa;AACd,YAAM,OAAO,OAAO,UAAU,IAAI;AAClC,aAAO,UAAU,UAAU,MAAM,OAAO,MAAM,SAAS,GAAG,SAAS,EAAE,IAAI,OAAO,GAAG,UAAU,OAAO,MAAM,IAAI,CAAC,GAAG,KAAK,OAAO,MAAM,OAAO,GAAG,OAAO,CAAC;AAAA,IAC1J;AAAA,IACA,KAAK;AACD,aAAO,UAAU,OAAO,KAAK,UAAU,QAAQ,CAAC;AAAA,IACpD,KAAK,eAAe;AAChB,YAAM,OAAO,OAAO,UAAU,IAAI;AAClC,YAAM,YAAY,SAAS,MAAM,MAAM;AACvC,YAAM,SAAS,SAAS,MAAM,QAAQ;AACtC,aAAO,UAAU;AAAA,QAAY,cAAc,UAAa,UAAU,SAAS,SAAS,SAAY,KAAK,WAAW,MAAM;AAAA,QAClH,WAAW,SAAY,QAAQ,KAAK,QAAQ,QAAQ;AAAA,MAAC;AAAA,IAC7D;AAAA,IACA,KAAK;AACD,aAAO,UAAU,YAAY;AAAA,IACjC,KAAK;AACD,aAAO,UAAU,UAAU,MAAM,UAAU,WAAW,CAAC;AAAA,IAC3D,KAAK;AACD,aAAO,UAAU,UAAU,SAAS,SAAS,WAAW,MAAM,UAAU,WAAW,IAAI,MAAS;AAAA,IACpG;AACI,YAAM,IAAI,YAAY,IAAI,IAAI,qBAAqB;AAAA,EAC3D;AACJ;AAEA,SAAS,SAAS,SAAwC;AACtD,QAAM,QAAQ,OAAO,SAAS,sBAAsB;AACpD,aAAW,CAAC,GAAG,KAAK,MAAM,YAAY;AAClC,QAAI,CAAC,YAAY,IAAI,GAAG,EAAG,OAAM,IAAI,YAAY,IAAI,GAAG,uCAAuC;AAAA,EACnG;AACA,QAAMI,QAAO,CAAC,QAAyC,SAAS,OAAO,GAAG;AAC1E,QAAM,eAAeA,MAAK,cAAc;AACxC,QAAM,YAAYA,MAAK,WAAW;AAClC,QAAM,aAAaA,MAAK,YAAY;AACpC,QAAM,OAAOA,MAAK,MAAM;AACxB,QAAM,UAAUA,MAAK,SAAS;AAC9B,QAAM,WAAW,CAAC,QAAqC;AACnD,UAAM,QAAQA,MAAK,GAAG;AACtB,WAAO,UAAU,SAAY,SAAY,KAAK,OAAO,GAAG;AAAA,EAC5D;AACA,SAAO,IAAI,iBAAiB;AAAA,IACxB,cAAc,iBAAiB,SAAY,SAAY,aAAa,MAAM,KAAK,cAAc,cAAc,CAAC;AAAA,IAC5G,WAAW,cAAc,SAAY,SAAY,MAAML,aAAY,KAAK,WAAW,WAAW,GAAG,cAAc;AAAA,IAC/G,YAAY,eAAe,SAAY,SAAY,SAAS,UAAU;AAAA,IACtE,MAAM,SAAS,MAAM;AAAA,IACrB,QAAQ,SAAS,QAAQ;AAAA,IACzB,WAAW,SAAS,WAAW;AAAA,IAC/B,eAAe,SAAS,eAAe;AAAA,IACvC,MAAM,SAAS,SAAY,SAAY,OAAO,IAAI;AAAA,IAClD,SAAS,YAAY,SAAY,SAAY,eAAe,OAAO;AAAA,EACvE,CAAC;AACL;AAEA,SAAS,eAAe,SAAoC;AACxD,MAAI,QAAQ,SAAS,YAAY,QAAQ,UAAU,OAAQ,QAAO,aAAa;AAC/E,QAAM,QAAQ,OAAO,SAAS,iBAAiB;AAC/C,QAAM,UAAU,SAAS,OAAO,SAAS;AACzC,MAAI,MAAM,WAAW,WAAW,KAAK,YAAY,OAAW,QAAO,aAAa,QAAQ,OAAO,OAAO,CAAC;AACvG,QAAMM,UAAS,SAAS,OAAO,QAAQ;AACvC,MAAI,MAAM,WAAW,WAAW,KAAKA,YAAW,OAAW,QAAO,aAAa,OAAO,OAAOA,OAAM,CAAC;AACpG,aAAW,CAAC,GAAG,KAAK,MAAM,YAAY;AAClC,QAAI,CAAC,MAAM,IAAI,GAAG,EAAG,OAAM,IAAI,YAAY,IAAI,GAAG,kCAAkC;AAAA,EACxF;AACA,QAAMC,QAAO,CAAC,QAAwC;AAClD,UAAM,OAAO,SAAS,OAAO,GAAG;AAChC,WAAO,SAAS,SAAY,SAAY,OAAO,IAAI;AAAA,EACvD;AACA,SAAO,IAAI,aAAa;AAAA,IACpB,KAAKA,MAAK,KAAK;AAAA,IAAG,QAAQA,MAAK,QAAQ;AAAA,IAAG,MAAMA,MAAK,MAAM;AAAA,IAAG,OAAOA,MAAK,OAAO;AAAA,IACjF,kBAAkBA,MAAK,kBAAkB;AAAA,IAAG,gBAAgBA,MAAK,gBAAgB;AAAA,EACrF,CAAC;AACL;AAIA,SAAS,QAAQ,SAAkC;AAC/C,QAAM,QAAQ,OAAO,SAAS,SAAS;AACvC,QAAM,SAAS,QAAQ,OAAO,OAAO,QAAQ,CAAC;AAC9C,QAAM,OAAO,MAAM,OAAO,OAAO,OAAO,GAAG,WAAW;AACtD,MAAI,KAAK,WAAW,OAAO,SAAU,OAAM,IAAI,YAAY,uBAAuB,OAAO,SAAS,CAAC,UAAU,OAAO,OAAO,QAAQ,CAAC,gBAAgB,OAAO,KAAK,MAAM,CAAC,GAAG;AAC1K,QAAM,QAAQ,KAAK,QAAQ,CAAAN,SAAO;AAC9B,UAAM,UAAU,MAAMA,MAAK,oBAAoB;AAC/C,QAAI,QAAQ,WAAW,OAAO,YAAa,OAAM,IAAI,YAAY,gCAAgC,OAAO,SAAS,CAAC,UAAU,OAAO,OAAO,WAAW,CAAC,iBAAiB,OAAO,QAAQ,MAAM,CAAC,GAAG;AAChM,WAAO,QAAQ,IAAIO,QAAO;AAAA,EAC9B,CAAC;AACD,SAAO,IAAI,WAAW,QAAQ,KAAK;AACvC;AAEA,SAASA,SAAQ,SAAiC;AAC9C,QAAM,OAAO,OAAO,SAAS,mBAAmB;AAChD,aAAW,CAAC,GAAG,KAAK,KAAK,YAAY;AACjC,QAAI,CAAC,CAAC,SAAS,gBAAgB,aAAa,QAAQ,QAAQ,SAAS,EAAE,SAAS,GAAG,EAAG,OAAM,IAAI,YAAY,IAAI,GAAG,gCAAgC;AAAA,EACvJ;AACA,QAAM,QAAQ,SAAS,MAAM,OAAO;AACpC,QAAM,eAAe,SAAS,MAAM,cAAc;AAClD,QAAM,YAAY,SAAS,MAAM,WAAW;AAC5C,QAAM,OAAO,SAAS,MAAM,MAAM;AAClC,QAAM,OAAO,SAAS,MAAM,MAAM;AAClC,QAAM,UAAU,SAAS,MAAM,SAAS;AACxC,SAAO,IAAI;AAAA,IACP,UAAU,SAAY,SAAY,QAAQ,KAAK;AAAA,IAC/C;AAAA,IACA,iBAAiB,SAAY,SAAY,aAAa,MAAM,KAAK,cAAc,cAAc,CAAC;AAAA,IAC9F,cAAc,SAAY,SAAY,MAAMR,aAAY,KAAK,WAAW,WAAW,GAAG,cAAc;AAAA,IACpG,SAAS,SAAY,SAAY,OAAO,IAAI;AAAA,IAC5C,SAAS,SAAY,SAAY,OAAO,IAAI;AAAA,IAC5C,YAAY,SAAY,SAAY,UAAU,OAAO;AAAA,EAAC;AAC9D;AAEA,SAAS,OAAO,SAAgC;AAC5C,QAAM,OAAO,OAAO,SAAS,QAAQ;AACrC,SAAO,IAAI,SAAS;AAAA,IAChB,QAAQ,SAAS,OAAO,MAAM,QAAQ,CAAC;AAAA,IACvC,MAAM,KAAK,OAAO,MAAM,MAAM,GAAG,MAAM;AAAA,IACvC,QAAQ,KAAK,OAAO,MAAM,QAAQ,GAAG,QAAQ;AAAA,IAC7C,WAAW,KAAK,OAAO,MAAM,WAAW,GAAG,WAAW;AAAA,IACtD,eAAe,KAAK,OAAO,MAAM,eAAe,GAAG,eAAe;AAAA,EACtE,CAAC;AACL;AAEA,SAAS,UAAU,SAAmC;AAClD,QAAM,QAAQ,OAAO,SAAS,aAAa;AAC3C,SAAO,IAAI,YAAY;AAAA,IACnB,KAAK,OAAO,OAAO,OAAO,KAAK,CAAC;AAAA,IAChC,QAAQ,OAAO,OAAO,OAAO,QAAQ,CAAC;AAAA,IACtC,MAAM,OAAO,OAAO,OAAO,MAAM,CAAC;AAAA,IAClC,OAAO,OAAO,OAAO,OAAO,OAAO,CAAC;AAAA,EACxC,CAAC;AACL;AAEA,SAAS,OAAO,SAAkC;AAC9C,MAAI,QAAQ,SAAS,YAAY,QAAQ,UAAU,OAAQ,QAAO,WAAW;AAC7E,QAAM,OAAO,OAAO,SAAS,QAAQ;AACrC,QAAM,QAAyB,MAAM,kBAAkB,KAAK,OAAO,MAAM,OAAO,GAAG,OAAO,GAAG,cAAc;AAC3G,QAAM,SAAS,SAAS,MAAM,QAAQ;AACtC,SAAO,IAAI,WAAW,OAAO,WAAW,SAAY,WAAW,YAAY,SAAS,MAAM,CAAC;AAC/F;AAEA,SAAS,SAAS,SAAkC;AAChD,QAAMS,WAAU,KAAK,SAAS,UAAU;AACxC,MAAIA,aAAY,YAAa,QAAO,WAAW;AAC/C,QAAM,SAAS,WAAW,QAAQA,QAAO;AACzC,MAAI,WAAW,OAAW,OAAM,IAAI,YAAY,IAAIA,QAAO,wCAAwC;AACnG,SAAO;AACX;AAEA,SAAS,OAAO,SAAgC;AAC5C,SAAO,QAAQ,SAAS,YAAY,QAAQ,UAAU,SAAS,SAAS,OAAO,SAAS,MAAM,SAAS,OAAO,CAAC;AACnH;AAEA,SAAS,QAAQ,SAAmC;AAEhD,SAAO,OAAO,SAAS,aAAa,EAAE,WAAW,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,YAAY,MAAM,EAAE,GAAG,KAAK,OAAO,EAAE,CAAC,CAAU;AAC3H;AAEA,SAAS,UAAU,SAAqC;AACpD,SAAO,OAAO,SAAS,SAAS,EAAE,WAAW,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,YAAY,MAAM,EAAE,GAAG,MAAM,SAAS,SAAS,SAAY,QAAQ,KAAK,CAAC,CAAU;AAC1J;AAEA,SAAS,QAAQ,SAA6B;AAC1C,QAAM,QAAQ,OAAO,SAAS,UAAU;AACxC,QAAM,UAAU,SAAS,OAAO,SAAS;AACzC,MAAI,YAAY,UAAa,MAAM,WAAW,WAAW,EAAG,QAAO,MAAM,YAAY,KAAK,SAAS,SAAS,CAAC;AAC7G,QAAM,WAAW,SAAS,OAAO,UAAU;AAC3C,MAAI,aAAa,UAAa,MAAM,WAAW,WAAW,GAAG;AACzD,UAAM,QAAQP,SAAQ,QAAQ;AAC9B,QAAI,UAAU,OAAW,OAAM,IAAI,YAAY,0BAA0B;AACzE,WAAO,MAAM,UAAU,KAAK;AAAA,EAChC;AACA,QAAM,IAAI,YAAY,GAAG,MAAM,GAAG,yDAAyD;AAC/F;AAEA,SAASA,SAAQ,SAAyC;AACtD,UAAQ,QAAQ,MAAM;AAAA,IAClB,KAAK;AACD,aAAO;AAAA,IACX,KAAK;AACD,aAAO,MAAM,SAAS,QAAQ,KAAK;AAAA,IACvC,KAAK;AACD,aAAO,MAAM,YAAY,IAAI;AAAA,IACjC,KAAK;AACD,aAAO,MAAM,YAAY,KAAK;AAAA,IAClC,KAAK;AACD,aAAO,MAAM,WAAW,OAAO,SAAS,UAAU,CAAC;AAAA,IACvD,KAAK,UAAU;AACX,YAAMO,WAAU,SAAS,SAAS,OAAO;AACzC,YAAM,UAAU,SAAS,SAAS,SAAS;AAC3C,YAAM,OAAOA,aAAY,SAAY,SAAY,KAAKA,UAAS,gBAAgB;AAC/E,UAAI,SAAS,UAAa,YAAY,UAAa,QAAQ,WAAW,WAAW,KAAK,QAAQ,SAAS,QAAQ;AAE3G,YAAI,SAAS,UAAW,QAAO,MAAM;AACrC,YAAI,SAAS,SAAU,QAAO,MAAM;AAAA,MACxC;AACA,YAAML,SAAQ,SAAS,YAAY,SAAS,kBAAkB,OAAO,SAAS,SAAY,SAAY,kBAAkB,IAAI;AAC5H,UAAIA,WAAU,UAAa,QAAQ,WAAW,WAAW,EAAG,QAAO,MAAM,UAAUA,MAAK;AACxF,YAAM,IAAI,YAAY,GAAG,QAAQ,GAAG,eAAe;AAAA,IACvD;AAAA,IACA,KAAK;AACD,YAAM,IAAI,YAAY,GAAG,QAAQ,GAAG,eAAe;AAAA,IACvD;AACI,YAAM,IAAI,YAAY,4BAA4B;AAAA,EAC1D;AACJ;AAGA,SAAS,aAAa,OAAuB;AACzC,SAAO,MAAM,YAAY,EAAE,OAAO,MAAM,OAAO,SAAS,KAAK,IAAI,UAAU,KAAK;AACpF;AAEA,SAAS,UAAU,OAAuB;AACtC,UAAQ,MAAM,MAAM;AAAA,IAChB,KAAK;AACD,aAAO,MAAM;AAAA,IACjB,KAAK;AACD,aAAO,MAAM;AAAA,IACjB,KAAK;AACD,aAAO,MAAM;AAAA,IACjB,KAAK;AACD,aAAO,EAAE,OAAO,MAAM,MAAM;AAAA,IAChC;AACI,YAAM,IAAI,MAAM,6BAA6B;AAAA,EACrD;AACJ;AAEA,SAAS,WAAW,QAA8B;AAC9C,SAAO;AAAA,IACH,cAAc,OAAO,aAAa,IAAI,OAAK,EAAE,SAAS,CAAC;AAAA,IACvD,cAAc,OAAO,aAAa,IAAI,OAAK,EAAE,SAAS,CAAC;AAAA,IACvD,MAAM,OAAO;AAAA,IACb,SAAS,OAAO;AAAA,IAChB,sBAAsB,OAAO;AAAA,EACjC;AACJ;AAEA,SAAS,SAAS,MAAyB;AACvC,SAAO,EAAE,QAAQ,KAAK,OAAO,SAAS,GAAG,MAAM,KAAK,MAAM,QAAQ,KAAK,QAAQ,WAAW,KAAK,WAAW,eAAe,KAAK,cAAc;AAChJ;AAEA,SAAS,SAAS,MAAwB;AACtC,SAAO,KAAK,WAAW,SAAY,SAAS,KAAK,OAAO,SAAS;AACrE;AAEA,SAAS,SAAS,MAA2B;AACzC,SAAO,KAAK,SAAS,SAAS,EAAE,OAAO,KAAK,OAAO,QAAQ,KAAK,OAAO,SAAS,EAAE;AACtF;AAEA,SAAS,YAAY,SAA+B;AAChD,SAAO,EAAE,KAAK,SAAS,QAAQ,GAAG,GAAG,QAAQ,SAAS,QAAQ,MAAM,GAAG,MAAM,SAAS,QAAQ,IAAI,GAAG,OAAO,SAAS,QAAQ,KAAK,EAAE;AACxI;AAEA,SAAS,cAAc,SAAwC;AAC3D,QAAM,OAAO,MAAM,SAAS,mBAAmB;AAC/C,QAAM,CAACM,QAAOC,MAAK,IAAI;AACvB,MAAID,WAAU,UAAa,KAAK,SAAS,EAAG,OAAM,IAAI,YAAY,GAAG,IAAI,OAAO,CAAC,yBAAyB;AAC1G,SAAO,CAAC,MAAMA,QAAO,SAAS,GAAGC,WAAU,SAAY,IAAI,MAAMA,QAAO,SAAS,CAAC;AACtF;AAEA,SAAS,IAAI,SAA8B;AACvC,SAAO,QAAQ,SAAS,YAAY,QAAQ,SAAS,UAAU,QAAQ,MAAM,KAAK,UAAU,OAAO;AACvG;AAEA,SAAS,MAAwB,OAAqBF,UAAiB,MAAiB;AACpF,QAAM,QAAQ,MAAM,KAAK,UAAQ,SAASA,QAAO;AACjD,MAAI,UAAU,OAAW,OAAM,IAAI,WAAW,IAAIA,QAAO,YAAY,IAAI,GAAG;AAC5E,SAAO;AACX;AAEA,SAAS,UAAU,SAAmC;AAClD,SAAO,YAAY,MAAM,KAAK,SAAS,QAAQ,CAAC;AACpD;AAEA,SAAS,QAAQ,SAAiC;AAC9C,SAAO,UAAU,MAAM,KAAK,SAAS,SAAS,CAAC;AACnD;AAEA,SAAS,OAAO,SAAsB,MAA0B;AAC5D,MAAI,QAAQ,SAAS,SAAU,OAAM,IAAI,YAAY,GAAG,IAAI,oBAAoB;AAChF,SAAO;AACX;AAGA,SAAS,SAAS,SAAqB,MAAuC;AAC1E,QAAM,QAAQ,QAAQ,WAAW,OAAO,CAAC,CAAC,GAAG,MAAM,QAAQ,IAAI;AAC/D,MAAI,MAAM,SAAS,EAAG,OAAM,IAAI,YAAY,IAAI,IAAI,yBAAyB,QAAQ,GAAG,GAAG;AAC3F,SAAO,MAAM,CAAC,IAAI,CAAC;AACvB;AAEA,SAAS,OAAO,SAAqB,MAA2B;AAC5D,QAAM,QAAQ,SAAS,SAAS,IAAI;AACpC,MAAI,UAAU,OAAW,OAAM,IAAI,YAAY,IAAI,IAAI,qBAAqB,QAAQ,GAAG,GAAG;AAC1F,SAAO;AACX;AAEA,SAAS,MAAM,SAAsB,MAAsC;AACvE,MAAI,QAAQ,SAAS,QAAS,OAAM,IAAI,YAAY,GAAG,IAAI,iBAAiB;AAC5E,SAAO,QAAQ;AACnB;AAEA,SAAS,KAAK,SAAsB,MAAsB;AACtD,MAAI,QAAQ,SAAS,SAAU,OAAM,IAAI,YAAY,GAAG,IAAI,eAAe;AAC3E,SAAO,QAAQ;AACnB;AAEA,SAAS,KAAK,SAAsB,MAAuB;AACvD,MAAI,QAAQ,SAAS,OAAQ,QAAO;AACpC,MAAI,QAAQ,SAAS,QAAS,QAAO;AACrC,QAAM,IAAI,YAAY,GAAG,IAAI,wBAAwB;AACzD;AAEA,SAAS,OAAO,SAAsB,MAAsB;AACxD,MAAI,QAAQ,SAAS,SAAU,OAAM,IAAI,YAAY,GAAG,IAAI,mBAAmB;AAC/E,QAAMG,QAAO,OAAO,QAAQ,GAAG;AAE/B,MAAI,CAAC,OAAO,SAASA,KAAI,EAAG,OAAM,IAAI,YAAY,GAAG,QAAQ,GAAG,+BAA+B;AAC/F,SAAOA;AACX;AAEA,SAAS,MAAM,SAAsB,MAAsB;AACvD,QAAMA,QAAO,OAAO,SAAS,IAAI;AACjC,MAAI,CAAC,OAAO,cAAcA,KAAI,EAAG,OAAM,IAAI,YAAY,GAAG,IAAI,yBAAyB;AACvF,SAAOA;AACX;;;ACvcA,IAAM,WAAW,MAAM,OAAO;AAG9B,IAAM,aAAa;AASZ,IAAM,WAAN,MAAM,UAAS;AAAA,EACT,UAAmB,CAAC;AAAA;AAAA,EAG7B;AAAA;AAAA,EAGA,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA,EAMZ;AAAA,EAEA;AAAA;AAAA,EAGA,kBAAkB;AAAA;AAAA,EAGlB,oBAAoB;AAAA,EAEpB;AAAA,EACA;AAAA,EACA,WAAW;AAAA;AAAA,EAGF;AAAA,EAET;AAAA;AAAA,EAGS,SAAS,oBAAI,IAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQ9C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,YAAY,SAAkB,aAA+B,CAAC,MAAM,WAAW,GAAG,OAAkB,UAAU,OAAO;AACjH,SAAK,UAAU;AACf,SAAK,QAAQ;AACb,eAAW,QAAQ,YAAY;AAC3B,YAAM,UAAU,IAAI;AACpB,UAAI,KAAK,KAAK,IAAI,MAAM,OAAW,OAAM,IAAI,WAAW,oCAAoC,IAAI,IAAI;AACpG,WAAK,QAAQ,KAAK,IAAI,MAAM,MAAM,IAAI,CAAC;AAAA,IAC3C;AACA,UAAM,QAAQ,KAAK,QAAQ,CAAC;AAC5B,QAAI,UAAU,OAAW,OAAM,IAAI,WAAW,sCAAsC;AACpF,SAAK,SAAS;AACd,SAAK,cAAc,KAAK,QAAQ;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,OAAO,KAAK,UAA4C,OAAkB,UAAU,OAAiB;AACjG,UAAM,SAAS,oBAAoB,gBAAgB,CAAC,QAAQ,IAAI,SAAS;AACzE,eAAW,SAAS,QAAQ;AAExB,YAAM,OAAO,MAAM,MAAM,OAAO,UAAQ,KAAK,UAAU,UAAa,CAAC,KAAK,SAAS,KAAK,OAAO,CAAC,EAC3F,IAAI,UAAQ,KAAK,OAAO,EAAE,SAAS,CAAC,GAAG,MAAM,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC;AACnE,UAAI,SAAS,OAAW,OAAM,IAAI,WAAW,UAAS,UAAU,MAAM,MAAM,MAAM,IAAI,CAAC;AAAA,IAC3F;AACA,QAAI,oBAAoB,eAAe;AACnC,YAAMC,YAAW,IAAI,UAAS,cAAc,eAAe,SAAS,OAAO,GAAG,CAAC,SAAS,IAAI,GAAG,IAAI;AACnG,YAAM,QAAQA,UAAS;AAEvB,iBAAWC,UAAS,SAAS,aAAc,OAAM,QAAQA,OAAM,MAAMA,OAAM,SAASA,OAAM,UAAU;AACpG,YAAM,YAAY,QAAQ;AAC1B,YAAM,YAAY,QAAQ;AAC1B,MAAAD,UAAS,OAAO;AAChB,aAAOA;AAAA,IACX;AACA,UAAM,WAAW,IAAI,UAAS,cAAc,eAAe,SAAS,OAAO,GAAG,SAAS,OAAO,IAAI,OAAK,EAAE,IAAI,GAAG,IAAI;AACpH,eAAWC,UAAS,SAAS,aAAc,UAAS,OAAO,QAAQA,OAAM,MAAMA,OAAM,SAASA,OAAM,UAAU;AAC9G,aAAS,OAAO,QAAQ,CAAC,OAAO,MAAM,SAAS,SAAS,CAAC,EAAE,YAAY,KAAK,CAAC;AAC7E,aAAS,OAAO,QAAQ,CAAC,OAAO,MAAM,SAAS,SAAS,CAAC,EAAE,YAAY,KAAK,CAAC;AAC7E,UAAM,QAAQ,SAAS,KAAK,SAAS,KAAK;AAC1C,QAAI,UAAU,OAAW,OAAM,IAAI,MAAM,wDAAwD;AACjG,aAAS,SAAS;AAClB,aAAS,OAAO;AAChB,WAAO;AAAA,EACX;AAAA;AAAA,EAGA,IAAI,OAAkB;AAClB,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,MAAiC;AACpC,UAAM,QAAQ,KAAK;AACnB,QAAI,KAAK,OAAO,KAAK,KAAK,EAAG,QAAO,KAAK,UAAU,OAAO,MAAM,YAAY,IAAI;AAChF,eAAW,SAAS,KAAK,SAAS;AAE9B,YAAM,OAAO,MAAM,eAAe,KAAK,aAAW,CAAC,KAAK,SAAS,OAAO,CAAC;AACzE,UAAI,SAAS,OAAW,OAAM,IAAI,WAAW,UAAS,UAAU,MAAM,MAAM,MAAM,IAAI,CAAC;AAAA,IAC3F;AACA,SAAK,QAAQ;AACb,UAAM,UAAU,IAAI,aAAa,KAAK,QAAQ,QAAQ,WAAS,MAAM,OAAO,CAAC;AAC7E,WAAO,KAAK,UAAU,OAAO,MAAO,QAAQ,SAAS,IAAI,YAAY,OAAO,MAAM,iBAAiB,OAAO,CAAE;AAAA,EAChH;AAAA,EAEA,OAAO,UAAU,OAAe,SAAsB,MAAyB;AAC3E,WAAO,GAAG,eAAe,KAAK,CAAC,IAAI,QAAQ,SAAS,CAAC,mCAAmC,OAAO,KAAK,IAAI,CAAC,YAAY,OAAO,KAAK,OAAO,CAAC,oBAAoB,KAAK,SAAS,SAAS,CAAC;AAAA,EACzL;AAAA,EAEA,IAAI,SAAgB;AAChB,WAAO,KAAK,SAAS,CAAC;AAAA,EAC1B;AAAA,EAEA,SAAS,OAAsB;AAC3B,UAAM,QAAQ,KAAK,QAAQ,KAAK;AAChC,QAAI,UAAU,OAAW,OAAM,IAAI,MAAM,0CAA0C,OAAO,KAAK,CAAC,GAAG;AACnG,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,gBAAgB,OAA8B;AAC1C,WAAO,gBAAgB,KAAK,OAAO,KAAK,CAAC;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aAA+B;AAC3B,WAAO,IAAI,iBAAiB,KAAK,QAAQ,MAAM,KAAK,OAAO,MAAM,KAAK,OAAO,mBAAmB,KAAK,QAAQ,IAAI,OAAK,gBAAgB,GAAG,CAAC,CAAC,CAAC,CAAC;AAAA,EACjJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,QAAe;AACf,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,IAAI,MAAM,OAAc;AACpB,QAAI,CAAC,KAAK,QAAQ,SAAS,KAAK,EAAG,OAAM,IAAI,WAAW,0CAA0C;AAClG,SAAK,SAAS;AAAA,EAClB;AAAA;AAAA,EAGA,IAAI,SAA2B;AAC3B,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA,EAGA,KAAK,MAAiC;AAClC,WAAO,KAAK,QAAQ,KAAK,WAAS,iBAAiB,MAAM,MAAM,IAAI,CAAC;AAAA,EACxE;AAAA;AAAA,EAGA,IAAI,eAA8B;AAC9B,WAAO,KAAK,OAAO;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,mBAAmB,MAAuE;AACtF,UAAMA,SAAQ,KAAK,OAAO,IAAI,cAAc,IAAI,CAAC;AACjD,QAAIA,WAAU,OAAW,OAAM,IAAI,MAAM,0BAA0B,IAAI,gBAAgB;AACvF,WAAOA,OAAM;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,GAAG,OAAe,MAA+B;AAC7C,UAAM,SAAS,KAAK,OAAO,KAAK;AAChC,QAAI,gBAAgB,cAAc;AAC9B,YAAM,UAAU,KAAK,QAAQ,MAAM,MAAM;AACzC,UAAI,YAAY,OAAW,OAAM,IAAI,kBAAkB,OAAO;AAC9D,UAAIC;AACJ,YAAM,SAAS,KAAK,WAAW,MAAM;AACjC,cAAM,SAAS,KAAK,QAAQ,MAAM,MAAM;AACxC,QAAAA,QAAO;AACP,eAAO,EAAE,OAAO,OAAO,OAAO,QAAQ,OAAO,OAAO;AAAA,MACxD,CAAC;AACD,UAAIA,UAAS,OAAW,OAAM,IAAI,MAAM,oDAAoD;AAC5F,YAAM,EAAE,OAAOC,OAAM,MAAM,KAAK,IAAID;AACpC,aAAO,IAAI,aAAaC,OAAM,QAAQ,MAAM,KAAK,UAAUA,OAAM,IAAI,GAAG,MAAM,KAAK,UAAUA,OAAM,IAAI,GAAG,CAAC,CAAC;AAAA,IAChH;AACA,QAAI;AACJ,UAAMA,QAAO,KAAK,UAAU,QAAQ,MAAM;AACtC,aAAO,OAAO,GAAG,IAAI;AACrB,aAAO,KAAK;AAAA,IAChB,CAAC;AACD,UAAM,OAAO;AACb,QAAI,SAAS,OAAW,OAAM,IAAI,MAAM,0CAA0C;AAClF,WAAO,IAAI,aAAa,QAAQA,OAAM,MAAM,KAAK,UAAU,QAAQ,MAAM,KAAK,KAAK,CAAC,GAAG,MAAM,KAAK,UAAU,QAAQ,MAAM,KAAK,KAAK,CAAC,GAAG,KAAK,MAAM;AAAA,EACvJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAM,OAAgE;AAClE,QAAI,MAAM,WAAW,EAAG,OAAM,IAAI,WAAW,oCAAoC;AACjF,UAAM,UAAU,MAAM,IAAI,CAAC,CAAC,OAAO,IAAI,MAAM;AACzC,UAAI,gBAAgB,aAAc,OAAM,IAAI,WAAW,mEAAmE;AAC1H,aAAO,KAAK,OAAO,KAAK;AAAA,IAC5B,CAAC;AACD,UAAM,QAAQ,CAAC,CAAC,EAAE,IAAI,GAAG,MAAM;AAC3B,YAAM,UAAU,UAAU,SAAS,CAAC,EAAE,MAAM,IAAI;AAChD,UAAI,YAAY,OAAW,OAAM,IAAI,kBAAkB,OAAO;AAAA,IAClE,CAAC;AACD,UAAM,QAAQ,UAAU,SAAS,CAAC;AAClC,UAAM,QAAmC,CAAC;AAC1C,UAAM,cAAc,KAAK;AACzB,UAAM,UAAU,MAAsB,KAAK,YAAY,MAAM,KAAK,WAAW,MAAM;AAC/E,eAAS,IAAI,MAAM,SAAS,GAAG,KAAK,GAAG,KAAK;AACxC,cAAM,OAAO,UAAU,OAAO,CAAC;AAC/B,aAAK,QAAQ,KAAK,OAAO,KAAK,KAAK,CAAC;AAAA,MACxC;AACA,aAAO,EAAE,OAAO,OAAO,QAAQ,YAAY,KAAK;AAAA,IACpD,CAAC,CAAC;AACF,QAAI;AACJ,QAAI;AACA,eAAS,KAAK,YAAY,MAAM,KAAK,WAAW,MAAM;AAClD,cAAM,QAAQ,CAAC,CAAC,EAAE,IAAI,GAAG,MAAM;AAC3B,gBAAM,SAAS,UAAU,SAAS,CAAC;AACnC,gBAAM,OAAO,OAAO,GAAG,IAAI;AAC3B,gBAAM,KAAK,IAAI;AACf,eAAK,QAAQ,QAAQ,KAAK,MAAM;AAAA,QACpC,CAAC;AACD,eAAO,EAAE,OAAO,OAAO,QAAQ,YAAY,KAAK;AAAA,MACpD,CAAC,CAAC;AAAA,IACN,SAAS,GAAG;AAGR,cAAQ;AACR,UAAI,KAAK,aAAa,YAAa,MAAK,QAAQ,KAAK,OAAO,WAAW;AACvE,YAAM;AAAA,IACV;AACA,WAAO,IAAI;AAAA,MAAa;AAAA,MAAO;AAAA,MAAQ;AAAA,MACnC,MAAM,KAAK,YAAY,MAAM,KAAK,WAAW,MAAM;AAC/C,mBAAW,QAAQ,MAAO,MAAK,QAAQ,KAAK,OAAO,KAAK,KAAK,CAAC;AAC9D,eAAO,EAAE,OAAO,OAAO,QAAQ,YAAY,KAAK;AAAA,MACpD,CAAC,CAAC;AAAA;AAAA;AAAA,MAGF,UAAU,SAAS,MAAM,OAAO,CAAC,GAAG,MAAM,QAAQ,CAAC,MAAM,KAAK,EAAE,QAAQ,CAAC,CAAC,EAAE,IAAI,MAAM,KAAK,MAAM,EAAE,QAAQ,OAAK,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;AAAA,IAAC;AAAA,EAC3I;AAAA;AAAA,EAGA,MAAM,OAAe,MAA2C;AAC5D,WAAO,KAAK,OAAO,KAAK,EAAE,MAAM,IAAI;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,mBAAmB,MAAc,SAA4B,MAAkC,CAAC,GAAmB;AAC/G,UAAM,aAAa,OAAO,QAAQ,WAAW,CAAC,GAAG,IAAI;AACrD,UAAM,QAAQ,KAAK;AACnB,WAAO,KAAK,UAAU,OAAO,MAAM,MAAM,mBAAmB,MAAM,SAAS,UAAU,CAAC;AAAA,EAC1F;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,gBAAgB,MAAc,MAAgE;AAC1F,UAAM,QAAQ,KAAK;AACnB,WAAO,KAAK,UAAU,OAAO,MAAM,MAAM,gBAAgB,MAAM,IAAI,CAAC;AAAA,EACxE;AAAA,EAEA,OAAO,OAAsB;AACzB,UAAM,QAAQ,KAAK,KAAK,KAAK;AAC7B,QAAI,UAAU,OAAW,OAAM,IAAI,WAAW,sCAAsC,KAAK,IAAI;AAC7F,WAAO;AAAA,EACX;AAAA;AAAA,EAGA,UAAU,OAAc,WAA8C;AAClE,WAAO,KAAK,WAAW,OAAO,EAAE,OAAO,QAAQ,UAAU,EAAE,EAAE;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAW,WAAwE;AAC/E,UAAM,QAAQ,KAAK;AACnB,UAAM,gBAAgB,KAAK;AAC3B,UAAM,YAAY,oBAAI,IAA0B;AAChD,SAAK,aAAa;AAClB,SAAK,YAAY;AACjB,QAAI;AACJ,QAAI;AACJ,QAAI;AACA,YAAM,SAAS,UAAU;AACzB,cAAQ,OAAO;AACf,YAAMC,OAAM,UAAU,IAAI,KAAK;AAC/B,UAAIA,SAAQ,OAAW,WAAU,IAAI,OAAO,CAAC,OAAO,MAAM,CAAC;AAAA,UACtD,CAAAA,KAAI,KAAK,OAAO,MAAM;AAAA,IAC/B,UAAE;AACE,iBAAW,KAAK;AAChB,WAAK,aAAa;AAClB,WAAK,YAAY,iBAAiB;AAAA,IACtC;AACA,QAAI,UAAU,QAAW;AACrB,iBAAW,CAAC,OAAOC,QAAO,KAAK,WAAW;AACtC,cAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,YAAI,SAAS,OAAW,OAAM,IAAI,OAAO,CAAC,GAAGA,QAAO,CAAC;AAAA,YAChD,MAAK,KAAK,GAAGA,QAAO;AAAA,MAC7B;AAAA,IACJ;AACA,UAAM,UAAmD,CAAC;AAC1D,eAAW,KAAK,KAAK,SAAS;AAC1B,YAAM,OAAO,UAAU,IAAI,CAAC;AAC5B,UAAI,SAAS,OAAW;AACxB,YAAM,SAAS,YAAY,MAAM,IAAI;AACrC,UAAI,MAAM,SAAS,WAAW,YAAY,KAAM,SAAQ,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC;AAAA,IACrF;AACA,WAAO,IAAI,eAAe,SAAS,QAAQ;AAAA,EAC/C;AAAA;AAAA,EAGA,QAAQ,OAAc,QAA2B;AAC7C,QAAI,KAAK,eAAe,UAAa,WAAW,YAAY,KAAM;AAClE,UAAM,OAAO,KAAK,WAAW,IAAI,KAAK;AACtC,QAAI,SAAS,OAAW,MAAK,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC;AAAA,QACtD,MAAK,KAAK,MAAM;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,IAAI,QAA8B;AAC9B,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,SAAkC;AAClC,WAAO,KAAK,OAAO;AAAA,EACvB;AAAA;AAAA,EAGA,IAAI,sBAA+B;AAC/B,WAAO,KAAK,QAAQ,KAAK,WAAS,MAAM,mBAAmB;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,SAASC,QAA6C;AAClD,QAAIA,WAAU,OAAW,UAASA,MAAK;AACvC,UAAM,QAAQ,KAAK;AACnB,QAAI,QAAQA,QAAO,KAAK,MAAM,EAAG,QAAO,KAAK,UAAU,OAAO,MAAM,YAAY,IAAI;AACpF,SAAK,SAASA,WAAU,SAAY,SAAY,EAAE,MAAMA,OAAM,MAAM,OAAOA,OAAM,OAAO,KAAKA,OAAM,IAAI;AACvG,UAAM,UAAU,IAAI,aAAa,KAAK,QAAQ,QAAQ,WAAS,MAAM,YAAY,CAAC;AAClF,WAAO,KAAK,UAAU,OAAO,MAAO,QAAQ,SAAS,IAAI,YAAY,OAAO,MAAM,iBAAiB,OAAO,CAAE;AAAA,EAChH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,sBAAsC;AAClC,UAAM,QAAQ,KAAK;AACnB,WAAO,KAAK,UAAU,OAAO,MAAO,KAAK,sBAAsB,MAAM,iBAAiB,IAAI,aAAa,CAAC,IAAI,YAAY,IAAK;AAAA,EACjI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,IAAI,OAA2B;AAC3B,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,UAAkB;AAClB,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,QAAQ,MAA0B,UAAkB,KAAK,UAA0B;AAC/E,QAAI,SAAS,WAAc,OAAO,MAAM,OAAO,SAAU,OAAM,IAAI,WAAW,GAAG,OAAO,IAAI,CAAC,+CAA+C;AAC5I,QAAI,CAAC,OAAO,cAAc,OAAO,KAAK,UAAU,EAAG,OAAM,IAAI,WAAW,GAAG,OAAO,OAAO,CAAC,6BAA6B;AACvH,UAAM,QAAQ,KAAK;AACnB,QAAI,SAAS,KAAK,SAAS,YAAY,KAAK,SAAU,QAAO,KAAK,UAAU,OAAO,MAAM,YAAY,IAAI;AACzG,SAAK,QAAQ;AACb,SAAK,WAAW;AAChB,UAAM,UAAU,IAAI,aAAa,KAAK,QAAQ,QAAQ,WAAS,MAAM,aAAa,CAAC;AACnF,WAAO,KAAK,UAAU,OAAO,MAAO,QAAQ,SAAS,IAAI,YAAY,OAAO,MAAM,iBAAiB,OAAO,CAAE;AAAA,EAChH;AAAA;AAAA,EAGA,YAAe,WAAuB;AAClC,QAAI,KAAK,sBAAsB,EAAG,MAAK,oBAAoB;AAC3D,QAAI;AACA,aAAO,UAAU;AAAA,IACrB,UAAE;AACE,WAAK;AAAA,IACT;AAAA,EACJ;AAAA;AAAA,EAGA,cAAoB;AAChB,QAAI,KAAK,kBAAkB,GAAG;AAC1B,UAAI,KAAK,kBAAmB;AAC5B,WAAK,oBAAoB;AAAA,IAC7B;AACA,SAAK;AAAA,EACT;AAAA;AAAA,EAGA,gBAAsB;AAClB,SAAK,WAAW;AAAA,EACpB;AAAA;AAAA;AAAA,EAKA,QAAQ,OAAsB;AAC1B,WAAO,KAAK,QAAQ,QAAQ,KAAK;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,KAAK,OAAe,MAAmC;AACnD,UAAM,OAAO,KAAK,KAAK,KAAK;AAC5B,UAAM,KAAK,KAAK,KAAK,IAAI;AACzB,QAAI,SAAS,UAAa,OAAO,OAAW,QAAO;AACnD,UAAM,IAAI,KAAK,QAAQ,QAAQ,IAAI;AACnC,UAAM,IAAI,KAAK,QAAQ,QAAQ,EAAE;AACjC,WAAO,KAAK,QAAQ,MAAM,KAAK,IAAI,GAAG,CAAC,GAAG,KAAK,IAAI,GAAG,CAAC,IAAI,CAAC;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,YAAY,OAAc,MAA2B;AACjD,UAAM,UAAU,MAAM;AACtB,QAAI,YAAY,KAAM,QAAO,EAAE,QAAQ,YAAY,MAAM,SAAS,WAAW,CAAC,EAAE;AAChF,UAAM,UAAU,KAAK,UAAU,MAAM,KAAK;AAC1C,QAAI,YAAY,OAAW,OAAM,IAAI,kBAAkB,OAAO;AAC9D,UAAM,YAA8B,CAAC;AACrC,UAAM,SAAS,KAAK,SAAS,OAAO,WAAS;AACzC,YAAM,YAAY,CAAC,cAA+B,MAAM,MAAM,WAAW,OAAO,IAAI,OAAO;AAE3F,WAAK,SAAS,OAAK,EAAE,KAAK;AAAA,QACtB,WAAW,EAAE,cAAc,UAAa,MAAM,MAAM,EAAE,WAAW,OAAO,IAAI,OAAO,EAAE;AAAA,QACrF,eAAe,EAAE,kBAAkB,UAAa,MAAM,MAAM,EAAE,eAAe,OAAO,IAAI,OAAO,EAAE;AAAA,MACrG,CAAC,GAAG,WAAW,WAAW,KAAK;AAC/B,YAAM,QAAQ,IAAI;AAAA,IACtB,CAAC;AACD,WAAO,EAAE,QAAQ,SAAS,UAAU;AAAA,EACxC;AAAA;AAAA,EAGA,WAAW,OAAc,QAAkC;AACvD,QAAI,MAAM,SAAS,OAAO,QAAS,QAAO,YAAY;AACtD,WAAO,KAAK,SAAS,OAAO,MAAM;AAC9B,iBAAW,EAAE,OAAO,OAAO,SAAS,MAAM,KAAK,OAAO,UAAW,OAAM,aAAa,SAAS,KAAK;AAClG,YAAM,QAAQ,OAAO,OAAO;AAAA,IAChC,CAAC;AAAA,EACL;AAAA;AAAA,EAGA,UAAU,MAAc,OAAoD;AACxE,UAAM,QAAQ,KAAK,KAAK,IAAI;AAC5B,WAAO,UAAU,UAAa,UAAU,QAClC,IAAI,aAAa,kBAAkB,6CAA6C,MAAM,IAAI,IAAI,IAC9F;AAAA,EACV;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,gBAAwB;AACpB,WAAO,KAAK,UAAU,KAAK,gBAAgB,CAAC;AAAA,EAChD;AAAA;AAAA,EAGA,kBAA0B;AACtB,aAAS,IAAI,KAAK,cAAc,KAAK,KAAK;AACtC,UAAI,KAAK,KAAK,KAAK,UAAU,CAAC,CAAC,MAAM,OAAW,QAAO;AAAA,IAC3D;AAAA,EACJ;AAAA;AAAA,EAGA,UAAUC,SAAwB;AAC9B,WAAO,QAAQ,OAAOA,OAAM,CAAC;AAAA,EACjC;AAAA;AAAA,EAGA,SAAe;AACX,SAAK,cAAc;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,eAAe,UAAsC;AACjD,UAAM,SAAS,KAAK;AACpB,SAAK,cAAc,YAAY,KAAK,cAAc;AAClD,WAAO;AAAA,EACX;AAAA;AAAA,EAGA,iBAAiB,QAAsB;AACnC,SAAK,cAAc;AAAA,EACvB;AAAA;AAAA,EAGA,SAAS,MAAsB;AAC3B,UAAM,OAAO,KAAK,QAAQ,YAAY,EAAE;AACxC,aAAS,IAAI,KAAK,KAAK;AACnB,YAAM,SAAS,KAAK,OAAO,CAAC,CAAC;AAC7B,YAAM,YAAY,KAAK,MAAM,GAAG,KAAK,IAAI,KAAK,QAAQ,MAAM,oBAAoB,OAAO,MAAM,CAAC,IAAI;AAClG,UAAI,KAAK,KAAK,SAAS,MAAM,OAAW,QAAO;AAAA,IACnD;AAAA,EACJ;AAAA;AAAA,EAGA,YAAY,OAAe,MAAqD;AAC5E,UAAM,QAAQ,IAAI,MAAM,MAAM,IAAI;AAClC,UAAM,SAAS,KAAK,SAAS,OAAO,MAAM;AACtC,WAAK,QAAQ,OAAO,OAAO,GAAG,KAAK;AAAA,IACvC,CAAC;AACD,WAAO,EAAE,OAAO,OAAO;AAAA,EAC3B;AAAA;AAAA,EAGA,QAAQ,OAAc,OAAe,WAAsC,OAA6B;AACpG,WAAO,KAAK,SAAS,OAAO,MAAM;AAC9B,WAAK,QAAQ,OAAO,OAAO,GAAG,KAAK;AACnC,iBAAW,EAAE,OAAO,OAAO,SAAS,MAAM,KAAK,UAAW,OAAM,aAAa,SAAS,KAAK;AAC3F,UAAI,MAAO,MAAK,SAAS;AAAA,IAC7B,CAAC;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,QAAQ,OAAc,UAAmB,WAA0C;AAC/E,UAAM,QAAQ,KAAK,QAAQ,QAAQ,KAAK;AACxC,UAAM,SAAS,KAAK,QAAQ,IAAI,OAAK,EAAE,IAAI;AAC3C,WAAO,KAAK,SAAS,OAAO,WAAS;AACjC,WAAK,QAAQ,OAAO,OAAO,CAAC;AAC5B,UAAI,UAAU;AACV,cAAM,OAAO,MAAM;AACnB,aAAK;AAAA,UACD,OAAM,EAAE,WAAW,QAAQ,GAAG,QAAQ,IAAI,IAAI,EAAE,cAAc,UAAa,MAAM,MAAM,EAAE,WAAW,IAAI,IAAI,SAAY;AAAA,UACxH,OAAM,MAAM,MAAM,GAAG,IAAI,IAAI,SAAY;AAAA,UAAI;AAAA,UAAW;AAAA,QAAK;AAAA,MACrE;AACA,UAAI,KAAK,WAAW,MAAO,MAAK,SAAS,KAAK,SAAS,KAAK,IAAI,OAAO,KAAK,QAAQ,SAAS,CAAC,CAAC;AAAA,IACnG,CAAC;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,KAAK,OAAc,OAAe,WAA0C;AACxE,UAAM,SAAS,KAAK,QAAQ,IAAI,OAAK,EAAE,IAAI;AAC3C,WAAO,KAAK,SAAS,OAAO,WAAS;AACjC,WAAK,QAAQ,OAAO,KAAK,QAAQ,QAAQ,KAAK,GAAG,CAAC;AAClD,WAAK,QAAQ,OAAO,OAAO,GAAG,KAAK;AACnC,YAAM,QAAQ,KAAK,QAAQ,IAAI,OAAK,EAAE,IAAI;AAC1C,WAAK,SAAS,OAAM,EAAE,WAAW,MAAM,GAAG,QAAQ,OAAO,MAAM,IAAI,IAAI,GAAI,OAAK,GAAG,WAAW,KAAK;AAAA,IACvG,CAAC;AAAA,EACL;AAAA;AAAA,EAGA,SAAS,OAAc,OAAe,WAAmD;AACrF,WAAO,KAAK,SAAS,OAAO,MAAM;AAC9B,WAAK,QAAQ,OAAO,KAAK,QAAQ,QAAQ,KAAK,GAAG,CAAC;AAClD,WAAK,QAAQ,OAAO,OAAO,GAAG,KAAK;AACnC,iBAAW,EAAE,OAAO,OAAO,SAAS,MAAM,KAAK,UAAW,OAAM,aAAa,SAAS,KAAK;AAAA,IAC/F,CAAC;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,KAAK,QAAe,OAAe,MAAqD;AACpF,UAAM,OAAO,IAAI,MAAM,MAAM,IAAI;AACjC,UAAM,WAAW,gBAAgB,QAAQ,CAAC,CAAC;AAC3C,UAAM,aAAa,OAAO;AAC1B,UAAM,SAAS,KAAK,SAAS,MAAM,WAAS;AACxC,WAAK,QAAQ,OAAO,OAAO,GAAG,IAAI;AAClC,WAAK,YAAY,QAAQ;AACzB,iBAAW,QAAQ,SAAS,OAAO;AAC/B,cAAM,QAAQ,KAAK;AACnB,YAAI,UAAU,OAAW;AACzB,cAAM,cAAc,MAAM;AAAA,UAAQ;AAAA,UAC9B,OAAM,EAAE,WACF,MAAM,MAAM,EAAE,WAAW,UAAU,KAAK,MAAM,MAAM,EAAE,eAAe,UAAU,IAAI,SAAY,IAC/F,EAAE,cAAc,UAAa,MAAM,MAAM,EAAE,WAAW,UAAU,IAAI,EAAE,KAAK,EAAE,WAAW,KAAK,CAAC,IAAI;AAAA,UACxG,OAAM,MAAM,MAAM,GAAG,UAAU,IAAI,OAAO;AAAA,QAAE;AAChD,aAAK,aAAa,KAAK,SAAS,WAAW;AAC3C,cAAM,IAAI,IAAI,UAAU,MAAM,KAAK,OAAO,CAAC;AAAA,MAC/C;AAAA,IACJ,CAAC;AACD,WAAO,EAAE,OAAO,MAAM,OAAO;AAAA,EACjC;AAAA;AAAA,EAGA,SAAS,OAAc,OAA4B;AAC/C,WAAO,KAAK,SAAS,OAAO,MAAM;AAC9B,WAAK,QAAQ,OAAO,OAAO,GAAG,KAAK;AAAA,IACvC,CAAC;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,SAAS,WAAkB,QAAoD;AAE3E,cAAU,YAAY;AACtB,UAAM,SAAS,IAAI,IAAI,KAAK,QAAQ,IAAI,OAAK,CAAC,GAAG,EAAE,SAAS,CAAC,CAAU,CAAC;AACxE,eAAW,SAAS,KAAK,QAAS,OAAM,oBAAoB;AAC5D,UAAM,QAAQ,IAAI,aAAa;AAC/B,WAAO,KAAK;AACZ,SAAK,YAAY;AACjB,eAAW,SAAS,KAAK,QAAS,OAAM,oBAAoB;AAE5D,eAAW,SAAS,KAAK,QAAS,OAAM,OAAO,MAAM,kBAAkB,EAAE,IAAI,OAAK,IAAI,UAAU,OAAO,CAAC,CAAC,CAAC;AAC1G,UAAM,OAAO,KAAK,QAAQ,SAAS,SAAS,IAAI,YAAY,KAAK;AACjE,UAAM,eAAe,MAAM,SAAS,KAAK,CAAC,KAAK,QAAQ,KAAK,OAAK,EAAE,mBAAmB,IAChF,oBAAI,IAAwB,IAC5B,MAAM,oBAAoB,MAAM,OAAO,MAAM,oBAAI,IAAI,CAAC;AAC5D,QAAIH,OAAM,YAAY;AACtB,eAAW,SAAS,KAAK,SAAS;AAC9B,YAAM,SAAS,MAAM,KAAK,OAAO,IAAI,KAAK,KAAK,oBAAI,IAAI,GAAG,aAAa,IAAI,KAAK,GAAG,gBAAgB,CAAC,CAAC;AACrG,UAAI,UAAU,UAAW,CAAAA,OAAM;AAAA,UAC1B,MAAK,QAAQ,OAAO,MAAM;AAAA,IACnC;AACA,WAAOA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,SAAS,KAAsD,WAAsD,WAA6B,OAA2B;AACzK,eAAW,SAAS,KAAK,SAAS;AAC9B,iBAAW,EAAE,SAAS,MAAM,KAAK,MAAM,eAAe,GAAG;AAErD,YAAI,MAAM,SAAS,SAAS,GAAG,MAAM,KAAM;AAC3C,cAAM,SAAS,MAAM,QAAQ,OAAO,KAAK,SAAS;AAClD,YAAI,WAAW,MAAO;AACtB,kBAAU,KAAK,EAAE,OAAO,SAAS,MAAM,CAAC;AACxC,cAAM,aAAa,SAAS,MAAM;AAClC,cAAM,IAAI,IAAI,UAAU,OAAO,OAAO,CAAC;AAAA,MAC3C;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,WAAW,WAAiC;AACxC,UAAM,QAAQ,KAAK,QAAQ,IAAI,OAAK,EAAE,IAAI;AAC1C,UAAM,QAAQ,KAAK,WAAW,KAAK;AACnC,WAAO,UAAU,SAAY,YAAY,SAAS,WAAW,UAAU,OAAO,MAAM,CAAC,CAAC,GAAG,UAAU,OAAO,MAAM,CAAC,CAAC,CAAC;AAAA,EACvH;AAAA;AAAA,EAGA,gBAAgB,OAAqB;AACjC,UAAM,SAAS,MAAM;AACrB,WAAO,WAAW,UAAa,CAAC,GAAG,OAAO,WAAW,CAAC,EAAE,KAAK,OAAK,EAAE,QAAQ,IACtE,MAAM,QAAQ,OAAO,OAAM,EAAE,WAAW,KAAK,WAAW,CAAC,IAAI,GAAI,OAAK,CAAC,IACvE;AAAA,EACV;AAAA;AAAA,EAGA,MAAM,WAAsB,OAAuB;AAC/C,QAAI,CAAC,UAAU,YAAY,UAAU,cAAc,UAAa,UAAU,kBAAkB,OAAW,QAAO;AAC9G,WAAO,KAAK,KAAK,UAAU,WAAW,UAAU,aAAa,GAAG,SAAS,KAAK,MAAM;AAAA,EACxF;AACJ;AAEA,SAAS,SAASE,QAAuB;AACrC,QAAM,EAAE,MAAM,OAAO,IAAI,IAAIA;AAC7B,QAAM,QAAQ,OAAO,UAAU,IAAI,KAAK,OAAO,UAAU,KAAK,KAAK,OAAO,UAAU,GAAG,KAAK,QAAQ,KAAK,QAAQ,QAC1G,SAAS,KAAK,SAAS,MAAM,OAAO,KAAK,OAAO,YAAY,MAAM,KAAK;AAC9E,MAAI,CAAC,MAAO,OAAM,IAAI,WAAW,GAAG,OAAO,IAAI,CAAC,IAAI,OAAO,KAAK,CAAC,IAAI,OAAO,GAAG,CAAC,yBAAyB;AACzG,MAAI,eAAe,MAAM,OAAO,GAAG,MAAM,QAAW;AAChD,UAAM,IAAI,WAAW,wEAAyE;AAAA,EAClG;AACJ;AAEA,SAAS,QAAQ,GAAyB,GAAkC;AACxE,MAAI,MAAM,UAAa,MAAM,OAAW,QAAO,MAAM;AACrD,SAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE;AACnE;AAOA,SAAS,MAAM,WAAsB,QAA2B,OAA0B,WAA8B;AACpH,QAAM,QAAQ,KAAK,WAAW,MAAM;AACpC,MAAI,UAAU,OAAW,QAAO;AAChC,QAAM,CAAC,GAAG,CAAC,IAAI;AACf,MAAI,QAAQ,UAAU,QAAQ,CAAC;AAC/B,MAAI,OAAO,UAAU,QAAQ,CAAC;AAC9B,MAAI,YAAY,OAAO,KAAK,IAAI,YAAY,OAAO,IAAI,EAAG,QAAO;AACjE,MAAI,MAAM,MAAM,OAAO,SAAS,EAAG,SAAQ,UAAU,QAAQ,IAAI,CAAC;AAAA,MAC7D,QAAO,UAAU,QAAQ,IAAI,CAAC;AACnC,SAAO,SAAS,WAAW,OAAO,IAAI;AAC1C;AAMA,SAAS,QAAQ,WAAsB,QAA2B,aAA4C;AAC1G,QAAM,QAAQ,KAAK,WAAW,MAAM;AACpC,MAAI,UAAU,OAAW,QAAO;AAChC,QAAM,CAAC,GAAG,CAAC,IAAI;AACf,QAAM,MAAM,UAAU,QAAQ,CAAC;AAC/B,QAAM,MAAM,UAAU,QAAQ,CAAC;AAC/B,MAAI,MAAM,EAAG,QAAO,MAAM,MAAM,KAAK,WAAW,IAAI,SAAY;AAChE,MAAI,CAAC,MAAM,MAAM,KAAK,WAAW,KAAK,CAAC,MAAM,MAAM,KAAK,WAAW,EAAG,QAAO;AAC7E,QAAM,QAAQ,MAAM,MAAM,KAAK,WAAW,IAAI,UAAU,QAAQ,IAAI,CAAC,IAAI;AACzE,QAAM,OAAO,MAAM,MAAM,KAAK,WAAW,IAAI,UAAU,QAAQ,IAAI,CAAC,IAAI;AACxE,SAAO,SAAS,WAAW,OAAO,IAAI;AAC1C;AAGA,SAAS,KAAK,WAAsB,OAAiE;AACjG,MAAI,CAAC,UAAU,YAAY,UAAU,cAAc,UAAa,UAAU,kBAAkB,OAAW,QAAO;AAC9G,QAAM,IAAI,YAAY,OAAO,UAAU,SAAS;AAChD,QAAM,IAAI,YAAY,OAAO,UAAU,aAAa;AACpD,SAAO,IAAI,KAAK,IAAI,IAAI,SAAY,CAAC,KAAK,IAAI,GAAG,CAAC,GAAG,KAAK,IAAI,GAAG,CAAC,CAAC;AACvE;AAGA,SAAS,SAAS,WAAsB,OAAe,MAAyB;AAC5E,SAAO,MAAM,MAAM,OAAO,IAAI,IACxB,UAAU,KAAK,EAAE,WAAW,OAAO,eAAe,OAAU,CAAC,IAC7D,UAAU,KAAK,EAAE,WAAW,OAAO,eAAe,KAAK,CAAC;AAClE;AAEA,SAAS,YAAY,OAA0B,MAAsB;AACjE,SAAO,MAAM,UAAU,OAAK,iBAAiB,GAAG,IAAI,CAAC;AACzD;AAOO,IAAM,iBAAN,MAAqB;AAAA,EACf;AAAA;AAAA,EAGT,YAAY,SAA6E,eAAwB;AAC7G,SAAK,WAAW;AAChB,SAAK,gBAAgB;AAAA,EACzB;AAAA;AAAA,EAGS;AAAA;AAAA,EAGT,IAAI,SAAkB;AAClB,WAAO,KAAK,SAAS,IAAI,OAAK,EAAE,KAAK;AAAA,EACzC;AAAA;AAAA,EAGA,IAAI,OAA2B;AAC3B,WAAO,KAAK,SAAS,KAAK,OAAK,EAAE,UAAU,KAAK,GAAG,UAAU,YAAY;AAAA,EAC7E;AACJ;AAMO,IAAM,eAAN,MAAmB;AAAA,EACb;AAAA,EACA;AAAA,EACT,YAAY;AAAA;AAAA,EAGH;AAAA;AAAA,EAGA;AAAA;AAAA,EAGA;AAAA;AAAA,EAGT,YACI,OACA,QACA,MACA,MACA,QACF;AACE,SAAK,QAAQ;AACb,SAAK,SAAS;AACd,SAAK,QAAQ;AACb,SAAK,QAAQ;AACb,SAAK,SAAS,CAAC,GAAG,MAAM;AAAA,EAC5B;AAAA;AAAA,EAGA,IAAI,WAAoB;AACpB,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA,EAGA,OAAuB;AACnB,QAAI,KAAK,UAAW,OAAM,IAAI,MAAM,6BAA6B;AACjE,UAAM,SAAS,KAAK,MAAM;AAC1B,SAAK,YAAY;AACjB,WAAO;AAAA,EACX;AAAA;AAAA,EAGA,OAAuB;AACnB,QAAI,CAAC,KAAK,UAAW,OAAM,IAAI,MAAM,oCAAoC;AACzE,UAAM,SAAS,KAAK,MAAM;AAC1B,SAAK,YAAY;AACjB,WAAO;AAAA,EACX;AACJ;",
|
|
6
|
+
"names": ["text", "text", "upper", "lower", "text", "part", "rounded", "text", "row", "column", "text", "part", "text", "row", "column", "text", "left", "right", "part", "text", "number", "number", "rounded", "power", "text", "number", "place", "roundUp", "text", "count", "lower", "rounded", "significant", "digit", "roundHalfAwayFromZero", "number", "time", "read", "written", "place", "text", "number", "text", "error", "table", "column", "left", "right", "place", "binary", "text", "error", "number", "row", "column", "error", "column", "place", "error", "number", "text", "read", "significant", "digit", "datePart", "timePart", "space", "defined", "group", "whole", "time", "sum", "product", "hex", "reduced", "power", "rounded", "series", "error", "sum", "half", "sum", "known", "exp", "power", "angle", "exp", "log", "log10", "atan", "atan2", "asin", "acos", "sinh", "cosh", "tanh", "asinh", "acosh", "atanh", "exact", "log2", "power", "count", "exp", "log", "left", "right", "text", "base", "decimalDigit", "letter", "left", "right", "column", "defined", "number", "error", "text", "count", "flag", "across", "error", "head", "sum", "product", "error", "least", "greatest", "read", "round", "number", "count", "aggregate", "number", "column", "text", "word", "written", "error", "part", "number", "count", "power", "two", "known", "scale", "sum", "ln2", "atanhSeries", "count", "whole", "one", "pv", "fv", "sum", "log", "one", "two", "power", "part", "power", "raise", "row", "column", "read", "text", "error", "raw", "number", "column", "open", "place", "r1", "r2", "left", "right", "top", "bottom", "text", "error", "read", "bounds", "literal", "inside", "count", "open", "items", "column", "row", "across", "array", "binary", "text", "count", "number", "left", "right", "table", "read", "raw", "inside", "defined", "own", "part", "written", "place", "upper", "count", "abs", "number", "sum", "error", "upper", "power", "exp", "ln", "log", "log10", "pi", "nearest", "boundOf", "bound", "number", "failure", "error", "text", "count", "word", "read", "number", "general", "row", "column", "exact", "numberValue", "next", "log", "number", "base", "log10", "tanh", "sinh", "cosh", "asin", "acos", "atan", "atan2", "asinh", "acosh", "atanh", "count", "round", "abs", "power", "exp", "ln", "log10", "pi", "exact", "numberValue", "log", "asin", "acos", "atan", "atan2", "sinh", "cosh", "tanh", "asinh", "acosh", "atanh", "text", "token", "error", "table", "column", "place", "operators", "pop", "right", "left", "refusal", "text", "text", "text", "error", "text", "literal", "word", "items", "number", "text", "whole", "time", "table", "column", "operators", "namePattern", "text", "structuredReferenceText", "table", "column", "unreachableKind", "text", "token", "part", "written", "read", "open", "namePattern", "number", "literal", "group", "whole", "operators", "binary", "right", "axis", "count", "moved", "table", "row", "column", "text", "table", "read", "place", "number", "implied", "group", "now", "recorded", "edge", "count", "across", "edges", "left", "one", "checked", "moved", "raw", "inside", "numberAt", "series", "average", "part", "exact", "right", "product", "sum", "rounded", "table", "column", "text", "number", "read", "object", "runs", "readAxis", "parse", "error", "text", "number", "written", "now", "text", "checked", "row", "count", "column", "fits", "exact", "left", "right", "settled", "made", "axis", "alignments", "row", "valueOf", "writeCellFormat", "error", "part", "inside", "edge", "stateOf", "written", "place", "count", "read", "workbook", "table", "done", "made", "own", "changes", "today", "number"]
|
|
7
|
+
}
|