@cbortech/cbor 0.24.0 → 0.25.1
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/README.ja.md +127 -49
- package/README.md +128 -49
- package/dist/ast/CborAppSeqResult.d.ts +20 -0
- package/dist/ast/CborArray.d.ts +3 -3
- package/dist/ast/CborBignum.d.ts +5 -5
- package/dist/ast/CborByteString.d.ts +2 -2
- package/dist/ast/CborEllipsis.d.ts +2 -2
- package/dist/ast/CborEmbeddedCBOR.d.ts +3 -3
- package/dist/ast/CborFloat.d.ts +8 -2
- package/dist/ast/CborIndefiniteByteString.d.ts +3 -3
- package/dist/ast/CborIndefiniteTextString.d.ts +3 -3
- package/dist/ast/CborItem.d.ts +22 -10
- package/dist/ast/CborMap.d.ts +3 -3
- package/dist/ast/CborNint.d.ts +2 -2
- package/dist/ast/CborSimple.d.ts +2 -2
- package/dist/ast/CborTag.d.ts +3 -3
- package/dist/ast/CborTextString.d.ts +2 -2
- package/dist/ast/CborUint.d.ts +2 -2
- package/dist/ast/CborUnresolvedAppExt.d.ts +2 -2
- package/dist/ast/index.cjs +1 -1
- package/dist/ast/index.js +2 -2
- package/dist/cbor.d.ts +44 -26
- package/dist/cdn/parser.d.ts +7 -0
- package/dist/{edn → cdn}/serialize-utils.d.ts +20 -7
- package/dist/cdn/serializer.d.ts +7 -0
- package/dist/cdn/test-vectors/runner.d.ts +22 -0
- package/dist/{edn → cdn}/tokenizer.d.ts +28 -25
- package/dist/extensions/b32.d.ts +5 -0
- package/dist/extensions/cri.d.ts +7 -7
- package/dist/extensions/dt.d.ts +10 -19
- package/dist/extensions/float.d.ts +7 -0
- package/dist/extensions/ip.d.ts +8 -8
- package/dist/extensions/same.d.ts +7 -0
- package/dist/extensions/types.d.ts +30 -8
- package/dist/index.cjs +5 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.js +244 -77
- package/dist/index.js.map +1 -1
- package/dist/mapEntries-BccT62HT.cjs +36 -0
- package/dist/mapEntries-BccT62HT.cjs.map +1 -0
- package/dist/{mapEntries-D5MWtXqq.js → mapEntries-ZR8QJ0Yj.js} +1157 -853
- package/dist/mapEntries-ZR8QJ0Yj.js.map +1 -0
- package/dist/simple.d.ts +2 -2
- package/dist/tag.d.ts +1 -1
- package/dist/types.d.ts +141 -30
- package/dist/utils/hexfloat.d.ts +2 -2
- package/dist/utils/strip-comments.d.ts +12 -0
- package/package.json +13 -11
- package/dist/edn/parser.d.ts +0 -7
- package/dist/edn/serializer.d.ts +0 -7
- package/dist/mapEntries-D5MWtXqq.js.map +0 -1
- package/dist/mapEntries-bihZ3yks.cjs +0 -31
- package/dist/mapEntries-bihZ3yks.cjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mapEntries-ZR8QJ0Yj.js","names":[],"sources":["../src/tag.ts","../src/types.ts","../src/simple.ts","../src/cdn/serialize-utils.ts","../src/ast/CborItem.ts","../src/utils/float16.ts","../src/cbor/encode.ts","../src/ast/CborUint.ts","../src/ast/CborNint.ts","../src/utils/hexfloat.ts","../src/ast/CborFloat.ts","../src/ast/CborTag.ts","../src/cdn/tokenizer.ts","../src/ast/CborByteString.ts","../src/ast/CborIndefiniteByteString.ts","../src/ast/CborIndefiniteTextString.ts","../src/ast/CborArray.ts","../src/ast/CborMap.ts","../src/ast/CborSimple.ts","../src/ast/CborEmbeddedCBOR.ts","../src/ast/CborUnresolvedAppExt.ts","../src/ast/CborAppSeqResult.ts","../src/ast/CborEllipsis.ts","../src/ast/CborBignum.ts","../src/cdn/parser.ts","../src/ast/CborTextString.ts","../src/extensions/dt.ts","../src/utils/ip.ts","../src/extensions/ip.ts","../src/extensions/bignum.ts","../src/extensions/cri.ts","../src/cbor/decoder.ts","../src/extensions/cbordata.ts","../src/extensions/builtins.ts","../src/js/fromJS.ts","../src/mapEntries.ts"],"sourcesContent":["export const CBOR_TAG: unique symbol = Symbol.for('cbor.tag');\n\n// ─── Internal wrappers ────────────────────────────────────────────────────────\n\nexport class Null {\n valueOf(): null {\n return null;\n }\n toJSON(): null {\n return null;\n }\n}\n\nexport class Undefined {\n valueOf(): undefined {\n return undefined;\n }\n toJSON(): undefined {\n return undefined;\n }\n}\n\n// ─── Public helpers ───────────────────────────────────────────────────────────\n\n/** @internal */\nexport function getCborTag(value: unknown): bigint | undefined {\n if (!_canHaveTag(value)) return undefined;\n const sym = (value as Record<symbol, unknown>)[CBOR_TAG];\n return typeof sym === 'bigint' ? sym : undefined;\n}\n\n/** @internal */\nexport function setCborTag(value: unknown, tag: bigint): object {\n let obj: object;\n switch (typeof value) {\n case 'number':\n obj = new Number(value);\n break;\n case 'string':\n obj = new String(value);\n break;\n case 'boolean':\n obj = new Boolean(value);\n break;\n case 'bigint':\n obj = Object(value);\n break;\n case 'undefined':\n obj = new Undefined();\n break;\n case 'object':\n if (value === null) {\n obj = new Null();\n break;\n }\n obj = value as object;\n break;\n default:\n throw new TypeError(\n `setCborTag: cannot tag value of type ${typeof value}`\n );\n }\n (obj as Record<symbol, bigint>)[CBOR_TAG] = tag;\n return obj;\n}\n\n/** @internal */\nexport function removeCborTag(value: unknown): unknown {\n if (value instanceof Number) return value.valueOf();\n if (value instanceof String) return value.valueOf();\n if (value instanceof Boolean) return value.valueOf();\n if (Object.prototype.toString.call(value) === '[object BigInt]')\n return (value as { valueOf(): bigint }).valueOf();\n if (value instanceof Null) return null;\n if (value instanceof Undefined) return undefined;\n if (typeof value === 'object' && value !== null) {\n delete (value as Record<symbol, unknown>)[CBOR_TAG];\n return value;\n }\n return value;\n}\n\n/** @internal */\nexport function getCborTaggedValue(value: unknown): unknown {\n if (value instanceof Number) return value.valueOf();\n if (value instanceof String) return value.valueOf();\n if (value instanceof Boolean) return value.valueOf();\n if (Object.prototype.toString.call(value) === '[object BigInt]')\n return (value as { valueOf(): bigint }).valueOf();\n if (value instanceof Null) return null;\n if (value instanceof Undefined) return undefined;\n return value;\n}\n\n// ─── Internal helper ──────────────────────────────────────────────────────────\n\n/** Return true if value can carry the [CBOR_TAG] symbol (i.e. is a non-null object). */\nfunction _canHaveTag(value: unknown): value is object {\n // All boxed primitives (Number, String, Boolean, BigInt objects) also have\n // typeof === 'object', so a single check covers all cases.\n return typeof value === 'object' && value !== null;\n}\n\n// ─── Tag namespace ────────────────────────────────────────────────────────────\n\n/**\n * Namespace for CBOR tag annotation utilities.\n *\n * @example\n * const v = CBOR.fromCDN('42(\"hello\")').toJS();\n * Tag.get(v); // 42n\n * Tag.getValue(v); // \"hello\"\n *\n * const tagged = Tag.set([1, 2, 3], 100n);\n * Tag.remove(tagged); // [1, 2, 3]\n */\nexport class Tag {\n private constructor() {}\n\n /** Unique symbol used to attach a CBOR tag number to a JS value. */\n static readonly symbol: typeof CBOR_TAG = CBOR_TAG;\n\n /** Wrapper class for tagged `null` values. */\n static readonly Null = Null;\n\n /** Wrapper class for tagged `undefined` values. */\n static readonly Undefined = Undefined;\n\n /** Return the CBOR tag number attached to `value`, or `undefined` if none. */\n static get(value: unknown): bigint | undefined {\n return getCborTag(value);\n }\n\n /** Attach a CBOR tag number to `value` and return the annotated value. */\n static set(value: unknown, tag: bigint): object {\n return setCborTag(value, tag);\n }\n\n /** Remove the `[Tag.symbol]` annotation from `value` and return the plain value. */\n static remove(value: unknown): unknown {\n return removeCborTag(value);\n }\n\n /** Return the underlying plain JS value held inside a tagged wrapper. */\n static getValue(value: unknown): unknown {\n return getCborTaggedValue(value);\n }\n}\n","/**\n * Shared option types and plugin interfaces.\n */\n\n// ─── Omit sentinel ───────────────────────────────────────────────────────────\n\n/**\n * Sentinel returned from a replacer or reviver to omit the key/element from\n * the output. Use this instead of returning `undefined` when `undefinedOmits`\n * is `false` (the default) and you need to drop a specific entry.\n *\n * Accessible as `CBOR.OMIT` on the main class.\n */\nexport const CBOR_OMIT: unique symbol = Symbol('cbor.omit');\n\n// ─── Extension plugin ─────────────────────────────────────────────────────────\n// Defined in extensions/types.ts and re-exported here for convenience.\nexport type { CborExtension } from './extensions/types';\nimport type { CborExtension } from './extensions/types';\n\n// ─── Options ──────────────────────────────────────────────────────────────────\n\nexport interface ToHexDumpOptions {\n /**\n * Indentation per nesting level.\n * - `number`: number of spaces (e.g. `3` → `\" \"`)\n * - `string`: literal indent string (e.g. `'\\t'`)\n * @default 3\n */\n indent?: number | string;\n /** Comment marker used in the hex dump. Default: `'--'` */\n commentStyle?: '--' | '#';\n}\n\nexport interface ToJSOptions {\n /**\n * How to represent CBOR integer values (major type 0 / 1) in JavaScript.\n * - `'auto'`: `number` when the value is within the safe integer range\n * (±`Number.MAX_SAFE_INTEGER`), `bigint` otherwise.\n * - `'number'`: always `number` (precision may be lost for large values).\n * - `'bigint'`: always `bigint`.\n * @default 'auto'\n */\n integerAs?: 'auto' | 'number' | 'bigint';\n\n /**\n * How to represent CBOR map values when converting to JavaScript.\n * - `'auto'`: text-string-only keys → `Record<string, unknown>`,\n * other key types → `Map<unknown, unknown>`.\n * Duplicate keys are silently overwritten (last value wins).\n * - `'object'`: always `Record<string, unknown>` — non-string keys are\n * converted via `String()`. Duplicate keys are overwritten (last wins).\n * - `'entries'`: always `MapEntries` (a typed `Array` subclass) — preserves all\n * entries including duplicate keys (§2.6.3 of draft-ietf-cbor-edn-literals-25).\n * `fromJS()` recognises `MapEntries` instances and converts them back to `CborMap`.\n * @default 'auto'\n */\n mapAs?: 'auto' | 'object' | 'entries';\n\n /**\n * When `true`, CBOR tag annotations are omitted from the JavaScript value.\n *\n * By default, generic tags are preserved using `CBOR.Tag` so that\n * `toJS()` → `fromJS()` can round-trip CBOR tags. Enable this option when\n * you only need the tagged content as a plain JavaScript value.\n *\n * @default false\n */\n stripTags?: boolean;\n\n /**\n * Post-conversion reviver function, applied bottom-up after the CBOR value\n * has been converted to JavaScript.\n *\n * Called for every key/value pair — including map entries with non-string\n * keys — and finally for the root value with key `''`.\n * Return `CBOR.OMIT` to remove the entry from its parent container.\n * When `undefinedOmits` is `true`, returning `undefined` also removes the\n * entry (matching `JSON.parse` behavior).\n *\n * Note: this option is honoured by `CborItem.toJS()` and the `CBOR.*`\n * shortcut methods. Calling `_toJS()` directly bypasses it.\n */\n reviver?: (this: unknown, key: unknown, value: unknown) => unknown;\n\n /**\n * When `true`, a reviver returning `undefined` removes the entry from its\n * parent container, matching `JSON.parse` behavior.\n * When `false` (default), only `CBOR.OMIT` removes an entry; returning\n * `undefined` keeps the entry as CBOR `undefined` (simple 23).\n * @default false\n */\n undefinedOmits?: boolean;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nexport interface ToCBOROptions {}\n\n/**\n * A CBOR validity violation detected during decoding.\n */\nexport interface DecodeWarning {\n /** Human-readable description of the violation. */\n message: string;\n /** Byte offset within the decoded input where the violation was detected. */\n offset: number;\n}\n\n/**\n * A CDN/EDN validity violation detected during parsing.\n */\nexport interface ParseWarning {\n /** Human-readable description of the violation. */\n message: string;\n /** Character offset within the input text where the violation was detected. */\n offset?: number;\n /** Line number (1-based) where the violation was detected. */\n line?: number;\n /** Column number (1-based) where the violation was detected. */\n column?: number;\n}\n\nexport interface FromCBOROptions {\n /**\n * Byte offset within the supplied input at which CBOR decoding starts.\n * Useful for reading one item from a CBOR Sequence.\n *\n * @default 0\n */\n offset?: number;\n\n /**\n * Allow bytes after the decoded item.\n *\n * When `false`, decoding still requires the item to consume the remaining\n * input, preserving the historical single-item behaviour. Set this to `true`\n * when using `CborItem.end` to continue decoding a CBOR Sequence.\n *\n * @example\n * // Read two items from a CBOR Sequence, validating that the second is last.\n * const first = CBOR.fromCBOR(bytes, { allowTrailing: true });\n * const second = CBOR.fromCBOR(bytes, { offset: first.end });\n *\n * @default false\n */\n allowTrailing?: boolean;\n\n /**\n * Extension plugins applied during CBOR decoding.\n * Extensions with `parseTag()` are invoked when a tagged item is\n * encountered; returning a non-`undefined` value replaces the default\n * `CborTag` node.\n */\n extensions?: CborExtension[];\n\n /**\n * Controls how CBOR validity violations are handled.\n *\n * - `true` (default): violations call `onWarning` and then throw, stopping\n * decoding immediately.\n * - `false`: recoverable violations call `onWarning` and decoding continues\n * with a best-effort interpretation of the data.\n *\n * Truly malformed data (e.g. truncated input, reserved AI values) always\n * throws regardless of this setting.\n *\n * @default true\n */\n strict?: boolean;\n\n /**\n * Callback invoked when a CBOR validity violation is detected.\n *\n * In strict mode (the default), this is called before the error is thrown.\n * In non-strict mode (`strict: false`), this is called and decoding\n * continues.\n *\n * If not supplied and `silent` is not `true`, violations are reported via\n * `console.warn`.\n */\n onWarning?: (warning: DecodeWarning) => void;\n\n /**\n * When `true`, suppresses the default `console.warn` output for validity\n * violations. An explicit `onWarning` callback is still invoked even when\n * `silent` is `true`.\n *\n * @default false\n */\n silent?: boolean;\n}\n\n/**\n * Options for parsing an annotated hex dump.\n */\nexport interface FromHexDumpOptions {\n /**\n * Extension plugins applied during CBOR decoding.\n * Extensions with `parseTag()` are invoked when a tagged item is encountered;\n * returning a non-`undefined` value replaces the default `CborTag` node.\n */\n extensions?: CborExtension[];\n}\n\nexport interface FromCDNOptions {\n /**\n * Character offset within the supplied text at which CDN parsing starts.\n * Leading whitespace/comments at or after this offset are skipped as usual.\n *\n * @default 0\n */\n offset?: number;\n\n /**\n * Allow tokens after the parsed item.\n *\n * When `false`, parsing still requires the item to consume the remaining\n * input, preserving the historical single-item behaviour. Set this to `true`\n * when using `CborItem.end` to continue parsing a CDN sequence.\n * Top-level comma separators are not skipped by `fromCDN()` itself; handle\n * them in sequence-level code before passing the next `offset`. For example,\n * after parsing `1, 2`, the first item's `end` points just before the comma;\n * advance past that comma before parsing the next item.\n *\n * @example\n * // Read two whitespace-separated items, validating that the second is last.\n * const first = CBOR.fromCDN(text, { allowTrailing: true });\n * const second = CBOR.fromCDN(text, { offset: first.end });\n *\n * @default false\n */\n allowTrailing?: boolean;\n\n /**\n * Extension plugins for CDN parsing.\n * Each extension declares which app-string prefixes (and, in future, tag\n * numbers) it handles via `appStringPrefixes` / `tagNumbers`, and provides\n * callback methods that return `CborItem`-subclassed objects controlling\n * subsequent serialisation.\n *\n * User-supplied extensions take priority over the built-in `dt`/`DT`\n * extension for the same prefix.\n */\n extensions?: CborExtension[];\n\n /**\n * How to handle unrecognised application-extension identifiers\n * (§4.1 of draft-ietf-cbor-edn-literals-25).\n *\n * - `'cpa999'`: wrap the literal in a `CPA999` tag\n * (`CborUnresolvedAppExt`) instead of failing. The resulting node\n * round-trips through `toCDN()` back to the original notation.\n * - `'error'`: throw `SyntaxError` for unknown prefixes.\n * @default 'cpa999'\n */\n unresolvedExtension?: 'cpa999' | 'error';\n\n /**\n * When `true`, byte-string chunks in text string concatenation\n * (`\"a\" + h'...'`) that are not valid UTF-8 are decoded with the Unicode\n * replacement character (U+FFFD) instead of throwing a `SyntaxError`.\n *\n * The CBOR text string type (RFC 8949 §3.1) requires valid UTF-8;\n * enabling this option produces non-conformant output and should only be\n * used when interoperating with lenient producers.\n *\n * @default false\n */\n allowInvalidUtf8?: boolean;\n\n /**\n * Preserve comments found between CDN values and attach them to the AST.\n *\n * Comments are metadata only: they are ignored by CBOR binary encoding and\n * JavaScript conversion. Use together with `ToCDNOptions.preserveComments`\n * to include them when formatting back to CDN.\n *\n * The string values `'c-style'` and `'cdn-style'` are treated as `true`\n * for parsing purposes; they become meaningful when passed to `toCDN()`.\n *\n * @default false\n */\n preserveComments?: boolean | 'c-style' | 'cdn-style';\n\n /**\n * Controls how CDN/EDN validity violations are handled.\n *\n * - `true` (default): recoverable violations call `onWarning` and then throw.\n * - `false`: recoverable violations call `onWarning` and parsing continues\n * with a best-effort interpretation of the input.\n *\n * Hard syntax errors (e.g. unterminated strings, unexpected tokens) always\n * throw regardless of this setting.\n *\n * @default true\n */\n strict?: boolean;\n\n /**\n * Callback invoked when a CDN/EDN validity violation is detected.\n *\n * In strict mode (the default), this is called before the error is thrown.\n * In non-strict mode (`strict: false`), this is called and parsing continues.\n *\n * If not supplied and `silent` is not `true`, violations are reported via\n * `console.warn`.\n */\n onWarning?: (warning: ParseWarning) => void;\n\n /**\n * When `true`, suppresses the default `console.warn` output for validity\n * violations. An explicit `onWarning` callback is still invoked even when\n * `silent` is `true`.\n *\n * @default false\n */\n silent?: boolean;\n}\n\n/**\n * Options for parsing Concise Diagnostic Notation (CDN).\n *\n * @deprecated Use `FromCDNOptions` instead.\n */\nexport type FromEDNOptions = FromCDNOptions;\n\nexport interface FromJSOptions {\n /**\n * Extension plugins applied during `fromJS()`.\n * Extensions with `fromJS()` are given first chance to convert each value.\n */\n extensions?: CborExtension[];\n\n /**\n * How to encode integer-valued JS `number`s.\n * - `'int'`: encode as CborUint / CborNint\n * - `'float'`: always encode as CborFloat\n * @default 'int'\n */\n encodeIntegerAs?: 'int' | 'float';\n\n /**\n * How to encode `Uint8Array` values.\n * - `'bytes'`: encode as CborByteString\n * - `'array'`: encode as CborArray of CborUint\n * @default 'bytes'\n */\n uint8ArrayAs?: 'bytes' | 'array';\n\n /**\n * Pre-encoding replacer function or key allowlist, applied before the\n * JavaScript value is converted to a CBOR AST node.\n *\n * - Function: called for every key/value pair (including `MapEntries`\n * entries with non-string keys). Return `CBOR.OMIT` to remove the entry.\n * When `undefinedOmits` is `true`, returning `undefined` also removes it.\n * - Array of strings/numbers: allowlist of object keys to include.\n * `MapEntries` entries retain all entries; their values are recursively\n * filtered.\n *\n * Note: this option is honoured by `fromJS()` and the `CBOR.*` shortcut\n * methods.\n */\n replacer?:\n | ((this: unknown, key: unknown, value: unknown) => unknown)\n | (string | number)[];\n\n /**\n * When `true`, a replacer returning `undefined` removes the entry from the\n * output, matching `JSON.stringify` behavior.\n * When `false` (default), only `CBOR.OMIT` removes an entry; returning\n * `undefined` keeps the entry as CBOR `undefined` (simple 23).\n * @default false\n */\n undefinedOmits?: boolean;\n}\n\nexport interface ToCDNOptions {\n /**\n * Indentation for pretty-printing.\n * - `number`: number of spaces\n * - `string`: literal indent string (e.g. `'\\t'`)\n * - omit for single-line output\n */\n indent?: number | string;\n\n /**\n * Emit comments previously captured by `FromCDNOptions.preserveComments`.\n *\n * - `true`: emit comments with their original markers.\n * - `'c-style'`: emit comments, normalising line comments to `//` and block\n * comments to `/* … *\\/`.\n * - `'cdn-style'`: emit comments, normalising line comments to `#` and block\n * comments to `/ … /`. When a `/* … *\\/` comment's content contains `/`\n * (which cannot be represented inside `/ … /`), the `/* … *\\/` form is\n * kept as-is.\n * - `false` / omitted: strip all comments from the output.\n *\n * When enabled for containers, comment-bearing arrays/maps are emitted in\n * multi-line form even if `indent` is omitted.\n *\n * @default false\n */\n preserveComments?: boolean | 'c-style' | 'cdn-style';\n\n /**\n * Re-emit byte string literals parsed from CDN using their original source\n * text when available.\n *\n * This preserves the spelling and interior layout of non-concatenated\n * `h'...'`, `b64'...'`, `b32'...'`, `h32'...'`, raw-backtick byte strings,\n * and single-quoted byte strings, including comments inside those literals.\n * Byte strings produced by `+` concatenation are normalised as usual.\n *\n * When enabled, this takes precedence over `bstrEncoding` and `sqstr` for\n * byte strings that carry original EDN source text.\n *\n * @default false\n */\n preserveByteString?: boolean;\n\n /**\n * Whether to emit commas between array/map elements.\n * - `'comma'`: emit commas (`[1, 2, 3]`)\n * - `'none'`: omit commas, use spaces only (`[1 2 3]`)\n * - `'trailing'`: emit commas including a trailing comma after the last element\n * @default 'comma'\n */\n commas?: 'comma' | 'none' | 'trailing';\n\n /**\n * Fallback binary encoding for byte string literals when sqstr is not applicable.\n * - `'hex'`: `h'...'`\n * - `'base64'`: `b64'...'`\n * - `'base64url'`: `b64'...'` (base64url alphabet)\n * @default 'hex'\n */\n bstrEncoding?: 'hex' | 'base64' | 'base64url';\n\n /**\n * Whether to prefer single-quoted string form (`sqstr`) for byte strings.\n * - `'printable-string'`: emit `'...'` when the bytes are valid UTF-8 and\n * contain no control characters; fall back to `bstrEncoding` otherwise.\n * - `'string'`: emit `'...'` when the bytes are valid UTF-8;\n * fall back to `bstrEncoding` otherwise.\n * - `'none'`: never emit sqstr; always use `bstrEncoding`.\n * @default 'printable-string'\n */\n sqstr?: 'printable-string' | 'string' | 'none';\n\n /**\n * Whether to use application-string / app-sequence notation for built-in\n * extensions (e.g. `dt'...'`, `DT'...'`, `ip'...'`, `IP'...'`).\n * - `true`: emit extension notation (`DT'2023-01-01T12:00:00Z'`)\n * - `false`: emit raw CBOR notation (`1(-14159024)`, `52(h'c000022a')`)\n * @default true\n */\n appStrings?: boolean;\n\n /**\n * Numeric format for integer values in CDN output.\n * - `'decimal'`: standard decimal notation (e.g. `42`, `-14159024`)\n * - `'hex'`: hexadecimal notation (e.g. `0x2a`, `-0xd83130`)\n * - `'octal'`: octal notation (e.g. `0o52`, `-0o67061560`)\n * - `'binary'`: binary notation (e.g. `0b101010`, `-0b110110000011000100110000`)\n * @default 'decimal'\n */\n intFormat?: 'decimal' | 'hex' | 'octal' | 'binary';\n\n /**\n * Numeric format for floating-point values in CDN output.\n * - `'decimal'`: standard decimal notation (e.g. `1.5`, `145544.0_3`)\n * - `'hex'`: C99-style hex float notation (e.g. `0x1.8p+0`, `0x1.1c54p+17_3`)\n * @default 'decimal'\n */\n floatFormat?: 'decimal' | 'hex';\n\n /**\n * Split long text strings using CDN string concatenation syntax (`\"a\" + \"b\"`).\n * Only effective when `indent` is specified.\n *\n * - `'newline'`: split at newline characters\n * - `'cdn'`: split according to CDN structure when the string content\n * is parseable as CDN (JSON superset)\n * - `'cboredn'`: deprecated alias for `'cdn'`\n *\n * When both are specified, CDN structure split points are combined with\n * newline split points.\n */\n textStringFormat?: TextStringFormat[];\n}\n\nexport type TextStringFormat = 'newline' | 'cdn' | DeprecatedTextStringFormat;\n\n/** @deprecated Use `'cdn'` instead. */\nexport type DeprecatedTextStringFormat = 'cboredn';\n\n/**\n * Options for serializing Concise Diagnostic Notation (CDN).\n *\n * @deprecated Use `ToCDNOptions` instead.\n */\nexport type ToEDNOptions = ToCDNOptions;\n\nexport interface CborComment {\n kind: 'line' | 'block';\n marker: '#' | '//' | '/*' | '/';\n text: string;\n start: number;\n end: number;\n line: number;\n col: number;\n}\n\nexport interface CborComments {\n leading?: CborComment[];\n trailing?: CborComment[];\n dangling?: CborComment[];\n}\n\n/**\n * Combined options for the `CBOR` constructor.\n *\n * These defaults are applied to every subsequent method call on the instance.\n * Per-call options always take precedence over these defaults.\n *\n * Note: `encodeIntegerAs` (from {@link FromJSOptions}) and `integerAs` (from\n * {@link ToJSOptions}) are distinct fields and do not conflict.\n */\nexport type CBOROptions = FromCDNOptions &\n FromJSOptions &\n ToCBOROptions &\n ToCDNOptions &\n ToJSOptions &\n ToHexDumpOptions;\n","/**\n * Wrapper for unrecognised CBOR simple values (0–255, excluding false/true/\n * null/undefined). Returned by CborSimple.toJS() so that fromJS() can\n * reconstruct the original CborSimple node and preserve the round-trip.\n *\n * Also serves as a namespace for simple-value utilities.\n *\n * @example\n * const v = CBOR.fromCDN('simple(19)').toJS();\n * Simple.is(v); // true\n * Simple.get(v); // 19\n *\n * const node = CBOR.fromJS(new Simple(19));\n * node.toCDN(); // \"simple(19)\"\n */\nexport class Simple {\n readonly value: number;\n\n constructor(value: number) {\n if (!Number.isInteger(value) || value < 0 || value > 255)\n throw new RangeError('Simple value must be an integer in 0–255');\n this.value = value;\n }\n\n valueOf(): number {\n return this.value;\n }\n\n toJSON(): never {\n throw new TypeError(`simple(${this.value}) cannot be serialized to JSON`);\n }\n\n /** Return true if value is a Simple instance. */\n static is(value: unknown): value is Simple {\n return value instanceof Simple;\n }\n\n /** Return the simple number if value is a Simple instance, otherwise undefined. */\n static get(value: unknown): number | undefined {\n return value instanceof Simple ? value.value : undefined;\n }\n}\n","/**\n * Pure utility functions for EDN serialization.\n * No AST imports — safe to import from any AST class.\n */\n\nimport type { CborComment, CborComments, ToCDNOptions } from '../types';\n\n// ─── Indent helpers ───────────────────────────────────────────────────────────\n\n/** Resolve indent option to a string, or null for single-line output. */\nexport function resolveIndent(\n options: ToCDNOptions | undefined\n): string | null {\n const indent = options?.indent;\n if (indent === undefined) return null;\n return typeof indent === 'number' ? ' '.repeat(indent) : indent;\n}\n\n/** Build the indent prefix for a given depth. */\nexport function indentOf(indentStr: string, depth: number): string {\n return indentStr.repeat(depth);\n}\n\n// ─── Comment helpers ─────────────────────────────────────────────────────────\n\nexport interface Commented {\n comments?: CborComments;\n}\n\nexport function hasPreservedComments(item: Commented): boolean {\n return Boolean(\n item.comments?.leading?.length ||\n item.comments?.trailing?.length ||\n item.comments?.dangling?.length\n );\n}\n\nexport function hasContainerLayoutComments(item: Commented): boolean {\n return Boolean(\n item.comments?.trailing?.length || item.comments?.dangling?.length\n );\n}\n\n/**\n * Convert a single comment's text to the requested marker style.\n *\n * Conversion table:\n * c-style : `#` → `//`, `/ … /` → `/* … *\\/`\n * cdn-style: `//` → `#`, `/* … *\\/` → `/ … /`\n *\n * Special case for cdn-style: when the inner content of `/* … *\\/` starts\n * with `*` or `/` the result would look like `/*…` or `//…` — a different\n * comment form. A single space is inserted after the opening `/` to prevent\n * this (e.g. `/**…*\\/` → `/ *…/`).\n */\nexport function convertCommentText(\n comment: CborComment,\n style: 'c-style' | 'cdn-style' | undefined\n): string {\n if (!style) return comment.text;\n const { marker, text } = comment;\n\n if (style === 'c-style') {\n if (marker === '#') return '//' + text.slice(1);\n if (marker === '/') return '/*' + text.slice(1, -1) + '*/';\n return text; // already // or /*...*/\n }\n\n // cdn-style\n if (marker === '//') return '#' + text.slice(2);\n if (marker === '/*') {\n const inner = text.slice(2, -2);\n // / … / comments have no escape mechanism for '/', so if the content\n // contains one we must keep the /* … */ form to avoid corrupting output.\n if (inner.includes('/')) return text;\n const safeInner =\n inner.startsWith('*') || inner.startsWith('/') ? ' ' + inner : inner;\n return '/' + safeInner + '/';\n }\n return text; // already # or /.../\n}\n\nexport function formatLeadingComments(\n item: Commented,\n indent: string,\n style?: 'c-style' | 'cdn-style' | undefined\n): string[] {\n return (item.comments?.leading ?? []).map(\n (comment) => indent + convertCommentText(comment, style)\n );\n}\n\nexport function formatTrailingComments(\n item: Commented,\n style?: 'c-style' | 'cdn-style' | undefined\n): string {\n const comments = item.comments?.trailing ?? [];\n if (comments.length === 0) return '';\n return (\n ' ' +\n comments.map((comment) => convertCommentText(comment, style)).join(' ')\n );\n}\n\nexport function formatDanglingComments(\n item: Commented,\n indent: string,\n style?: 'c-style' | 'cdn-style' | undefined\n): string[] {\n return (item.comments?.dangling ?? []).map(\n (comment) => indent + convertCommentText(comment, style)\n );\n}\n\n// ─── Comma / separator helpers ────────────────────────────────────────────────\n\n/**\n * Resolve separator options into concrete strings.\n *\n * @param compact - When `true` (no `indent` option), omit spaces around\n * separators to produce compact single-line output (like `JSON.stringify`).\n *\n * @returns\n * - `inlineSep` – between items on a single line\n * - `multilineSep` – appended after each non-last line in multi-line mode\n * - `trailSep` – appended after the last item (empty string or `,`)\n * - `colSep` – between map key and value (`': '` or `':'`)\n */\nexport function resolveSeparators(\n options: ToCDNOptions | undefined,\n compact = false\n): {\n inlineSep: string;\n multilineSep: string;\n trailSep: string;\n colSep: string;\n} {\n const commas = options?.commas ?? 'comma';\n const useCommas = commas !== 'none';\n const trailing = commas === 'trailing';\n return {\n inlineSep: useCommas ? (compact ? ',' : ', ') : ' ',\n multilineSep: useCommas ? ',' : '',\n trailSep: trailing ? ',' : '',\n colSep: compact ? ':' : ': ',\n };\n}\n\n// ─── Byte string encoding ─────────────────────────────────────────────────────\n\nfunction toHex(bytes: Uint8Array): string {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if (typeof (bytes as any).toHex === 'function')\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (bytes as any).toHex();\n return Array.from(bytes, (b) => b.toString(16).padStart(2, '0')).join('');\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst _hasNativeToBase64 =\n typeof (new Uint8Array(0) as any).toBase64 === 'function';\n\nfunction toBase64(bytes: Uint8Array): string {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if (_hasNativeToBase64) return (bytes as any).toBase64({ omitPadding: true });\n let binary = '';\n for (const b of bytes) binary += String.fromCharCode(b);\n return btoa(binary).replace(/=/g, '');\n}\n\nfunction toBase64Url(bytes: Uint8Array): string {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if (_hasNativeToBase64)\n return (bytes as any).toBase64({\n alphabet: 'base64url',\n omitPadding: true,\n });\n let binary = '';\n for (const b of bytes) binary += String.fromCharCode(b);\n return btoa(binary).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=/g, '');\n}\n\nconst B32_ALPHA = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567';\nconst H32_ALPHA = '0123456789ABCDEFGHIJKLMNOPQRSTUV';\n\nfunction base32Encode(bytes: Uint8Array, alpha: string): string {\n let result = '';\n let buf = 0,\n bufBits = 0;\n for (const b of bytes) {\n buf = (buf << 8) | b;\n bufBits += 8;\n while (bufBits >= 5) {\n bufBits -= 5;\n result += alpha[(buf >> bufBits) & 0x1f];\n }\n }\n if (bufBits > 0) result += alpha[(buf << (5 - bufBits)) & 0x1f];\n return result;\n}\n\n/**\n * Returns true if the string contains any C0 control character (U+0000–U+001F)\n * or DEL (U+007F).\n */\nfunction _hasNonPrintable(s: string): boolean {\n for (const char of s) {\n const cp = char.codePointAt(0)!;\n if (cp < 0x20 || cp === 0x7f) return true;\n }\n return false;\n}\n\nexport function serializeBytes(\n bytes: Uint8Array,\n encoding?: 'hex' | 'base64' | 'base64url' | 'base32' | 'base32hex',\n sqstr?: 'printable-string' | 'string' | 'none'\n): string {\n if (sqstr === 'string') {\n const s = _tryDecodeUtf8(bytes);\n if (s != null) return _escapeSingleQuoted(s);\n }\n if (sqstr === 'printable-string' || sqstr === undefined) {\n const s = _tryDecodeUtf8(bytes);\n if (s != null && !_hasNonPrintable(s)) return _escapeSingleQuoted(s);\n }\n switch (encoding) {\n case 'base64':\n return `b64'${toBase64(bytes)}'`;\n case 'base64url':\n return `b64'${toBase64Url(bytes)}'`;\n case 'base32':\n return `b32'${base32Encode(bytes, B32_ALPHA)}'`;\n case 'base32hex':\n return `h32'${base32Encode(bytes, H32_ALPHA)}'`;\n case 'hex':\n default:\n return `h'${toHex(bytes)}'`;\n }\n}\n\n/** Decode bytes as UTF-8; returns null if the bytes are not valid UTF-8. */\nfunction _tryDecodeUtf8(bytes: Uint8Array): string | null {\n try {\n return new TextDecoder('utf-8', { fatal: true }).decode(bytes);\n } catch {\n return null;\n }\n}\n\n// ─── Text string escaping ─────────────────────────────────────────────────────\n\n/**\n * Core EDN string escaper.\n *\n * Produces a quoted literal delimited by `quote` (`\"` or `'`).\n * Iterates by Unicode code point so characters above U+FFFF are emitted as a\n * single character rather than two surrogate `\\uXXXX` escapes.\n *\n * Always escapes:\n * - the delimiter character itself\n * - `\\` (backslash)\n * - `\\n`, `\\r`, `\\t`\n * - U+0000–U+001F (C0 controls), U+007F (DEL)\n * - U+2028 / U+2029 (JS line terminators)\n * - U+200B–U+200D (zero-width characters), U+FEFF (BOM)\n */\nfunction _escapeQuoted(s: string, quote: string): string {\n const quoteCP = quote.codePointAt(0)!;\n let result = quote;\n for (const char of s) {\n const cp = char.codePointAt(0)!;\n switch (cp) {\n case quoteCP:\n result += `\\\\${quote}`;\n break;\n case 0x5c: // \\\n result += '\\\\\\\\';\n break;\n case 0x0a: // \\n\n result += '\\\\n';\n break;\n case 0x0d: // \\r\n result += '\\\\r';\n break;\n case 0x09: // \\t\n result += '\\\\t';\n break;\n default:\n if (\n cp < 0x20 ||\n cp === 0x7f ||\n cp === 0x2028 ||\n cp === 0x2029 ||\n cp === 0x200b ||\n cp === 0x200c ||\n cp === 0x200d ||\n cp === 0xfeff\n )\n result += `\\\\u${cp.toString(16).padStart(4, '0')}`;\n else result += char;\n }\n }\n return result + quote;\n}\n\n/** Produce a single-quoted EDN byte string literal `'...'` from a string value. */\nfunction _escapeSingleQuoted(s: string): string {\n return _escapeQuoted(s, \"'\");\n}\n\n/**\n * Produce a single-quoted EDN app-string content `'...'` from a string value.\n * Exported for use by app-extension `_toCDN` implementations.\n */\nexport function escapeAppString(s: string): string {\n return _escapeQuoted(s, \"'\");\n}\n\n/**\n * Produce an EDN double-quoted string literal `\"...\"` from a string value.\n */\nexport function escapeString(s: string): string {\n return _escapeQuoted(s, '\"');\n}\n\n// ─── Float formatting ─────────────────────────────────────────────────────────\n\n/** Produce the numeric string for a float value (with decimal point if needed). */\nexport function floatValueToString(value: number): string {\n if (isNaN(value)) return 'NaN';\n if (!isFinite(value)) return value > 0 ? 'Infinity' : '-Infinity';\n if (Object.is(value, -0)) return '-0.0';\n const s = value.toString();\n // Ensure a decimal point is present to distinguish from CBOR integer types\n return s.includes('.') || s.includes('e') ? s : s + '.0';\n}\n\n/**\n * EDN encoding-indicator suffix for a float precision.\n * Returns '' when the auto-selected precision matches (no suffix needed).\n */\nexport function floatSuffix(\n _value: number,\n precision: 'half' | 'single' | 'double' | undefined,\n autoSelected: 'half' | 'single' | 'double'\n): string {\n if (precision === undefined || precision === autoSelected) return '';\n return precision === 'half' ? '_1' : precision === 'single' ? '_2' : '_3';\n}\n","import type {\n CBOROptions,\n ToCDNOptions,\n ToJSOptions,\n ToHexDumpOptions,\n ToCBOROptions,\n CborComments,\n DecodeWarning,\n ParseWarning,\n} from '../types';\nimport { CBOR_OMIT } from '../types';\nimport { convertCommentText } from '../cdn/serialize-utils';\n\n/** @internal One line of an annotated hex dump. */\nexport interface AnnotatedLine {\n depth: number;\n hex: string;\n comment: string;\n}\n\n/**\n * Abstract base class for all CBOR AST nodes.\n *\n * Every node can serialize itself to CBOR binary, CDN text, and a\n * plain JavaScript value. Concrete implementations are provided in each\n * subclass (added in later phases).\n */\nexport abstract class CborItem {\n /**\n * Character offset of the first character of this item in the parsed source.\n * Set by parsers; undefined when the node was constructed directly.\n * For CBOR input this is a byte offset.\n */\n start?: number;\n\n /**\n * Character offset just past the last character of this item in the parsed source.\n * Set by parsers; undefined when the node was constructed directly.\n * For CBOR input this is a byte offset.\n */\n end?: number;\n\n /**\n * Comments captured from CDN source when `preserveComments` is enabled.\n * They do not affect CBOR bytes or JS conversion.\n */\n comments?: CborComments;\n\n /**\n * Validity violations detected while decoding or parsing this node.\n * Populated when `strict: false` is set in `FromCBOROptions` or\n * `FromCDNOptions`.\n */\n warnings?: (DecodeWarning | ParseWarning)[];\n\n /**\n * Default options bound by a {@link CBOR} instance factory method.\n * Per-call options always take precedence.\n * @internal\n */\n _defaults?: CBOROptions;\n\n // ─── Public template methods ────────────────────────────────────────────────\n\n /** Serialize this node to CBOR binary. */\n toCBOR(options?: ToCBOROptions): Uint8Array {\n const merged = this._defaults ? { ...this._defaults, ...options } : options;\n return this._toCBOR(merged);\n }\n\n /** Serialize this node to a CDN text string. */\n toCDN(options?: ToCDNOptions): string {\n const merged = this._defaults ? { ...this._defaults, ...options } : options;\n const body = this._toCDN(merged, 0);\n const pv = merged?.preserveComments;\n if (!pv) return body;\n const style = typeof pv === 'string' ? pv : undefined;\n const leading =\n this.comments?.leading?.map((c) => convertCommentText(c, style)) ?? [];\n const trailing = this.comments?.trailing ?? [];\n const bodyWithTrailing =\n trailing.length === 0\n ? body\n : `${body} ${trailing.map((c) => convertCommentText(c, style).trimEnd()).join(' ')}`;\n return [...leading, bodyWithTrailing].join('\\n');\n }\n\n /**\n * Serialize this node to a CDN text string.\n *\n * @deprecated Use `toCDN()` instead.\n */\n toEDN(options?: ToCDNOptions): string {\n return this.toCDN(options);\n }\n\n /**\n * Convert this CBOR AST node to a plain JavaScript value.\n *\n * If `options.reviver` is supplied it is called with key `''` on the root\n * result after the full tree has been converted (matching the semantics of\n * `JSON.parse`). Container nodes call the reviver on each of their direct\n * children during conversion, so the walk is bottom-up.\n */\n toJS(options?: ToJSOptions): unknown {\n const merged = this._defaults ? { ...this._defaults, ...options } : options;\n const result = this._toJS(merged);\n if (!merged?.reviver) return result;\n const rv = merged.reviver.call({ '': result }, '', result);\n return rv === CBOR_OMIT ? undefined : rv;\n }\n\n /**\n * Generate an RFC 8949 §3 style annotated hex dump of this value.\n *\n * @example\n * const cbor = CBOR.fromCDN('[_ 1, [2, 3]]');\n * console.log(cbor.toHexDump());\n * // 9F -- Start indefinite-length array\n * // 01 -- 1\n * // 82 -- Array of length 2\n * // 02 -- 2\n * // 03 -- 3\n * // FF -- \"break\"\n * // FF -- \"break\"\n */\n toHexDump(options?: ToHexDumpOptions): string {\n const merged = this._defaults ? { ...this._defaults, ...options } : options;\n const raw = merged?.indent ?? 3;\n const indentStr = typeof raw === 'string' ? raw : ' '.repeat(raw);\n const marker = (merged?.commentStyle ?? '--') + ' ';\n const lines = this._toHexDump(0, merged);\n const maxPrefixLen = Math.max(\n ...lines.map((l) => l.depth * indentStr.length + l.hex.length)\n );\n const col = maxPrefixLen + 2;\n return lines\n .map((l) => {\n const prefix = indentStr.repeat(l.depth) + l.hex;\n return prefix.padEnd(col) + marker + l.comment;\n })\n .join('\\n');\n }\n\n // ─── Internal abstract methods ───────────────────────────────────────────────\n\n /** @internal Subclass CBOR encoding implementation. */\n abstract _toCBOR(options?: ToCBOROptions): Uint8Array;\n\n /**\n * @internal\n * Depth-aware CDN serialization.\n * Leaf nodes receive `depth` but may ignore it.\n * Container nodes use `depth` for indentation and call\n * `child._toCDN(options, depth + 1)` when recursing.\n */\n abstract _toCDN(options: ToCDNOptions | undefined, depth: number): string;\n\n /**\n * @internal\n * Core conversion logic implemented by each subclass.\n * Container nodes apply `options.reviver` to their direct children.\n * Do not call this directly — use `toJS()` instead.\n */\n abstract _toJS(options?: ToJSOptions): unknown;\n\n /**\n * @internal\n * Collect annotated-hex lines for this node.\n * Leaf nodes emit a single line; container nodes override to emit\n * open/close lines with recursively collected children.\n */\n _toHexDump(depth: number, options?: ToCDNOptions): AnnotatedLine[] {\n const hex = Array.from(this._toCBOR(), (b) =>\n b.toString(16).toUpperCase().padStart(2, '0')\n ).join(' ');\n return [{ depth, hex, comment: this._toCDN(options, 0) }];\n }\n}\n","/**\n * Float16 (IEEE 754 binary16) encode/decode utilities.\n *\n * Uses native DataView.getFloat16 / setFloat16 when both are available,\n * and falls back to a manual bit-manipulation implementation otherwise.\n *\n * binary16 format:\n * bit 15 : sign\n * bits 14-10: exponent (5 bits, bias = 15)\n * bits 9- 0: mantissa (10 bits)\n */\n\nexport const hasNativeFloat16 =\n 'getFloat16' in DataView.prototype && 'setFloat16' in DataView.prototype;\n\n// Reusable 8-byte buffer for float64 bit extraction (avoids per-call allocation)\nconst _buf8 = new ArrayBuffer(8);\nconst _dv8 = new DataView(_buf8);\n\n/**\n * float64 → float16 bit pattern (16-bit unsigned integer).\n *\n * Operates directly on float64 bits to avoid double-rounding artifacts that\n * arise from a float64 → float32 → float16 two-step conversion.\n * Implements IEEE 754 round-to-nearest-ties-to-even (RN-TE).\n *\n * Exported for testing (manual vs native consistency checks).\n */\nexport function float64ToFloat16Bits(value: number): number {\n // Store the float64 in big-endian order so the bit layout is predictable\n _dv8.setFloat64(0, value, false);\n const hi = _dv8.getUint32(0, false); // bits 63-32 of IEEE 754 binary64\n const lo = _dv8.getUint32(4, false); // bits 31-0\n\n const sign = (hi >>> 31) & 1;\n const exp64 = (hi >>> 20) & 0x7ff; // 11-bit exponent, bias 1023\n const mantHi = hi & 0x000f_ffff; // top 20 bits of the 52-bit mantissa\n // lo = lower 32 bits of the mantissa\n\n // ── Infinity / NaN ──────────────────────────────────────────────────────────\n if (exp64 === 0x7ff) {\n if (mantHi === 0 && lo === 0) return (sign << 15) | 0x7c00; // ±Infinity\n // NaN: carry top 10 mantissa bits; guarantee at least one bit is set\n const f16mant = (mantHi >> 10) | (lo !== 0 ? 1 : 0) || 1;\n return (sign << 15) | 0x7c00 | (f16mant & 0x3ff);\n }\n\n // Rebias: float64 exponent bias 1023 → float16 bias 15\n const f16Exp = exp64 - 1023 + 15;\n\n // ── Overflow → ±Infinity ────────────────────────────────────────────────────\n if (f16Exp >= 31) return (sign << 15) | 0x7c00;\n\n let f16mant: number;\n let roundBit: number;\n let sticky: boolean;\n\n if (f16Exp <= 0) {\n // ── Underflow ──────────────────────────────────────────────────────────────\n if (f16Exp < -10) return sign << 15; // → ±0\n\n // ── Denormal ───────────────────────────────────────────────────────────────\n // Reconstruct the 53-bit significand's top 21 bits: [implicit 1][mantHi 20-bit]\n const top21 = (1 << 20) | mantHi;\n\n // Right-shift amount to align the significand for a float16 denormal:\n // f16mant = round(top53 / 2^(43 - f16Exp))\n // We approximate top53 ≈ top21 × 2^32 (low bits from `lo` affect only rounding).\n const s = 11 - f16Exp; // s ∈ [11, 21]\n\n if (s <= 20) {\n f16mant = (top21 >> s) & 0x3ff;\n roundBit = (top21 >> (s - 1)) & 1;\n sticky = (top21 & ((1 << (s - 1)) - 1)) !== 0 || lo !== 0;\n } else {\n // s = 21: the implicit-1 bit becomes the round bit; truncated result is 0\n f16mant = 0;\n roundBit = 1; // implicit 1 is always present\n sticky = mantHi !== 0 || lo !== 0;\n }\n } else {\n // ── Normal ─────────────────────────────────────────────────────────────────\n // Take the top 10 bits of the 52-bit mantissa; round using the next bits.\n f16mant = mantHi >> 10;\n roundBit = (mantHi >> 9) & 1;\n sticky = (mantHi & 0x1ff) !== 0 || lo !== 0;\n }\n\n // ── Round-to-nearest-ties-to-even (RN-TE) ───────────────────────────────────\n if (roundBit !== 0 && (sticky || (f16mant & 1) !== 0)) {\n f16mant++;\n }\n\n // ── Mantissa overflow: carry into exponent ───────────────────────────────────\n if (f16mant >= 1024) {\n // Denormal rounds up to the smallest normal (exp = 1), or normal exponent increments\n const newExp = f16Exp <= 0 ? 1 : f16Exp + 1;\n if (newExp >= 31) return (sign << 15) | 0x7c00; // overflow to Infinity\n return (sign << 15) | (newExp << 10); // mant = 0\n }\n\n const outExp = f16Exp <= 0 ? 0 : f16Exp;\n return (sign << 15) | (outExp << 10) | f16mant;\n}\n\n/**\n * float16 bit pattern → float64.\n * Exported for testing purposes.\n */\nexport function float16BitsToFloat64(bits: number): number {\n const sign = (bits >>> 15) & 1;\n const exp = (bits >>> 10) & 0x1f;\n const mant = bits & 0x3ff;\n\n if (exp === 0x1f) {\n return mant === 0 ? (sign ? -Infinity : Infinity) : NaN;\n }\n if (exp === 0) {\n if (mant === 0) return sign ? -0 : 0;\n // Denormal: (-1)^sign × 2^(-14) × (mant / 1024)\n return (sign ? -1 : 1) * 2 ** -14 * (mant / 1024);\n }\n // Normal: (-1)^sign × 2^(exp-15) × (1 + mant/1024)\n return (sign ? -1 : 1) * 2 ** (exp - 15) * (1 + mant / 1024);\n}\n\n/**\n * Write a float16 value at the given offset in a DataView.\n */\ntype WriteFloat16 = (\n view: DataView,\n offset: number,\n value: number,\n littleEndian: boolean\n) => void;\n\n/**\n * Read a float16 value from the given offset in a DataView, returned as float64.\n */\ntype ReadFloat16 = (\n view: DataView,\n offset: number,\n littleEndian: boolean\n) => number;\n\nconst writeFloat16Native: WriteFloat16 = (\n view,\n offset,\n value,\n littleEndian\n) => {\n view.setFloat16(offset, value, littleEndian);\n};\n\nconst writeFloat16Fallback: WriteFloat16 = (\n view,\n offset,\n value,\n littleEndian\n) => {\n view.setUint16(offset, float64ToFloat16Bits(value), littleEndian);\n};\n\nconst readFloat16Native: ReadFloat16 = (view, offset, littleEndian) => {\n return view.getFloat16(offset, littleEndian);\n};\n\nconst readFloat16Fallback: ReadFloat16 = (view, offset, littleEndian) => {\n return float16BitsToFloat64(view.getUint16(offset, littleEndian));\n};\n\n// Dispatch between native and fallback once at module initialization time.\nexport const writeFloat16: WriteFloat16 = hasNativeFloat16\n ? writeFloat16Native\n : writeFloat16Fallback;\n\nexport const readFloat16: ReadFloat16 = hasNativeFloat16\n ? readFloat16Native\n : readFloat16Fallback;\n","import { float64ToFloat16Bits, float16BitsToFloat64 } from '../utils/float16';\nimport type { FloatPrecision } from '../ast/CborFloat';\nimport { AI_1BYTE, AI_2BYTE, AI_4BYTE, AI_8BYTE } from './constants';\n\n// ─── Encoding width ───────────────────────────────────────────────────────────\n\n/**\n * EDN encoding indicator, mapping to a specific CBOR AI encoding:\n * 'i' → ai 0–23 (argument in initial byte, value must be 0–23)\n * 0 → AI 24 (1-byte argument, value must be 0–0xFF)\n * 1 → AI 25 (2-byte argument, value must be 0–0xFFFF)\n * 2 → AI 26 (4-byte argument, value must be 0–0xFFFFFFFF)\n * 3 → AI 27 (8-byte argument, value must be 0–0xFFFFFFFFFFFFFFFF)\n */\nexport type EncodingWidth = 'i' | 0 | 1 | 2 | 3;\n\n// ─── Header encoding ──────────────────────────────────────────────────────────\n\n/**\n * Encode a CBOR initial byte + argument into a Uint8Array.\n *\n * When `encodingWidth` is provided the argument is always written using that\n * many additional bytes (AI = 24 + encodingWidth), even if the value would fit\n * in fewer bytes. Without it the smallest valid encoding is chosen.\n */\nexport function writeHead(\n mt: number,\n value: bigint,\n encodingWidth?: EncodingWidth\n): Uint8Array {\n if (encodingWidth !== undefined) {\n // Immediate encoding: value must fit in the lower 5 bits of the initial byte\n if (encodingWidth === 'i') {\n if (value > 23n)\n throw new RangeError(\n `value ${value} does not fit in immediate encoding _i (max 23)`\n );\n return new Uint8Array([(mt << 5) | Number(value)]);\n }\n const maxForWidth = [\n 0xffn,\n 0xffffn,\n 0xffff_ffffn,\n 0xffff_ffff_ffff_ffffn,\n ] as const;\n if (value > maxForWidth[encodingWidth]) {\n throw new RangeError(\n `value ${value} does not fit in encodingWidth _${encodingWidth} (max ${maxForWidth[encodingWidth]})`\n );\n }\n const ai = AI_1BYTE + encodingWidth; // 24, 25, 26, or 27\n if (ai === AI_1BYTE) {\n return new Uint8Array([(mt << 5) | AI_1BYTE, Number(value)]);\n }\n if (ai === AI_2BYTE) {\n const buf = new Uint8Array(3);\n buf[0] = (mt << 5) | AI_2BYTE;\n buf[1] = Number(value >> 8n);\n buf[2] = Number(value & 0xffn);\n return buf;\n }\n if (ai === AI_4BYTE) {\n const buf = new Uint8Array(5);\n buf[0] = (mt << 5) | AI_4BYTE;\n new DataView(buf.buffer).setUint32(1, Number(value), false);\n return buf;\n }\n // ai === AI_8BYTE\n const buf = new Uint8Array(9);\n buf[0] = (mt << 5) | AI_8BYTE;\n new DataView(buf.buffer).setBigUint64(1, value, false);\n return buf;\n }\n if (value <= 23n) {\n return new Uint8Array([(mt << 5) | Number(value)]);\n }\n if (value <= 0xffn) {\n return new Uint8Array([(mt << 5) | AI_1BYTE, Number(value)]);\n }\n if (value <= 0xffffn) {\n const buf = new Uint8Array(3);\n buf[0] = (mt << 5) | AI_2BYTE;\n buf[1] = Number(value >> 8n);\n buf[2] = Number(value & 0xffn);\n return buf;\n }\n if (value <= 0xffff_ffffn) {\n const buf = new Uint8Array(5);\n buf[0] = (mt << 5) | AI_4BYTE;\n new DataView(buf.buffer).setUint32(1, Number(value), false);\n return buf;\n }\n const buf = new Uint8Array(9);\n buf[0] = (mt << 5) | AI_8BYTE;\n new DataView(buf.buffer).setBigUint64(1, value, false);\n return buf;\n}\n\n/** Concatenate multiple Uint8Arrays into one. */\nexport function concat(parts: Uint8Array[]): Uint8Array {\n const total = parts.reduce((n, p) => n + p.length, 0);\n const out = new Uint8Array(total);\n let off = 0;\n for (const p of parts) {\n out.set(p, off);\n off += p.length;\n }\n return out;\n}\n\n// ─── Float precision helpers ──────────────────────────────────────────────────\n\nconst _f32buf = new DataView(new ArrayBuffer(4));\n\n/**\n * Returns true if `value` can be exactly represented as a float16 without\n * precision loss (including -0, Infinity, -Infinity, NaN identity).\n */\nexport function canEncodeAsFloat16(value: number): boolean {\n return Object.is(float16BitsToFloat64(float64ToFloat16Bits(value)), value);\n}\n\n/**\n * Returns true if `value` can be exactly represented as a float32 without\n * precision loss.\n */\nexport function canEncodeAsFloat32(value: number): boolean {\n _f32buf.setFloat32(0, value, false);\n return Object.is(_f32buf.getFloat32(0, false), value);\n}\n\n/**\n * Choose the smallest float precision that represents `value` exactly.\n * Used by CborFloat.toCBOR() when `precision` is undefined.\n */\nexport function autoSelectFloatPrecision(value: number): FloatPrecision {\n if (canEncodeAsFloat16(value)) return 'half';\n if (canEncodeAsFloat32(value)) return 'single';\n return 'double';\n}\n","import type { ToCDNOptions, ToJSOptions, ToCBOROptions } from '../types';\nimport { CborItem } from './CborItem';\nimport { MT_UINT } from '../cbor/constants';\nimport { writeHead, type EncodingWidth } from '../cbor/encode';\n\n/** CBOR Major Type 0 — unsigned integer (0 … 2^64−1). */\nexport class CborUint extends CborItem {\n readonly value: bigint;\n readonly encodingWidth: EncodingWidth | undefined;\n\n constructor(\n value: number | bigint,\n options?: { encodingWidth?: EncodingWidth }\n ) {\n super();\n this.value = BigInt(value);\n if (this.value < 0n)\n throw new RangeError('CborUint value must be non-negative');\n if (this.value > 0xffff_ffff_ffff_ffffn)\n throw new RangeError('CborUint value exceeds maximum uint64');\n this.encodingWidth = options?.encodingWidth;\n }\n\n _toCBOR(_options?: ToCBOROptions): Uint8Array {\n return writeHead(MT_UINT, this.value, this.encodingWidth);\n }\n\n _toCDN(options: ToCDNOptions | undefined, _depth: number): string {\n const suffix =\n this.encodingWidth !== undefined ? `_${this.encodingWidth}` : '';\n const v = this.value;\n switch (options?.intFormat) {\n case 'hex':\n return `0x${v.toString(16)}${suffix}`;\n case 'octal':\n return `0o${v.toString(8)}${suffix}`;\n case 'binary':\n return `0b${v.toString(2)}${suffix}`;\n default:\n return v.toString() + suffix;\n }\n }\n\n _toJS(options?: ToJSOptions): unknown {\n const mode = options?.integerAs ?? 'auto';\n if (mode === 'bigint') return this.value;\n if (mode === 'number') return Number(this.value);\n return this.value <= BigInt(Number.MAX_SAFE_INTEGER)\n ? Number(this.value)\n : this.value;\n }\n}\n","import type { ToCDNOptions, ToJSOptions, ToCBOROptions } from '../types';\nimport { CborItem } from './CborItem';\nimport { MT_NINT } from '../cbor/constants';\nimport { writeHead, type EncodingWidth } from '../cbor/encode';\n\n/**\n * CBOR Major Type 1 — negative integer (−2^64 … −1).\n *\n * The constructor accepts the actual negative value (e.g. `-5n`).\n * Internally the CBOR \"argument\" `n` is stored, where the decoded value\n * equals `−1 − n`. This matches the wire encoding directly.\n *\n * Examples:\n * new CborNint(-1n) → argument = 0n\n * new CborNint(-5n) → argument = 4n\n */\nexport class CborNint extends CborItem {\n /** CBOR raw argument n, where actual value = −1 − n. */\n readonly argument: bigint;\n readonly encodingWidth: EncodingWidth | undefined;\n\n constructor(\n value: number | bigint,\n options?: { encodingWidth?: EncodingWidth }\n ) {\n super();\n const v = BigInt(value);\n if (v >= 0n) throw new RangeError('CborNint value must be negative');\n if (v < -(0xffff_ffff_ffff_ffffn + 1n))\n throw new RangeError('CborNint value exceeds minimum int64');\n this.argument = -1n - v;\n this.encodingWidth = options?.encodingWidth;\n }\n\n /** The actual decoded negative value (−1 − argument). */\n get value(): bigint {\n return -1n - this.argument;\n }\n\n _toCBOR(_options?: ToCBOROptions): Uint8Array {\n return writeHead(MT_NINT, this.argument, this.encodingWidth);\n }\n\n _toCDN(options: ToCDNOptions | undefined, _depth: number): string {\n const suffix =\n this.encodingWidth !== undefined ? `_${this.encodingWidth}` : '';\n const abs = this.argument + 1n; // absolute value of the negative number\n switch (options?.intFormat) {\n case 'hex':\n return `-0x${abs.toString(16)}${suffix}`;\n case 'octal':\n return `-0o${abs.toString(8)}${suffix}`;\n case 'binary':\n return `-0b${abs.toString(2)}${suffix}`;\n default:\n return this.value.toString() + suffix;\n }\n }\n\n _toJS(options?: ToJSOptions): unknown {\n const v = this.value;\n const mode = options?.integerAs ?? 'auto';\n if (mode === 'bigint') return v;\n if (mode === 'number') return Number(v);\n return v >= BigInt(Number.MIN_SAFE_INTEGER) ? Number(v) : v;\n }\n}\n","/**\n * Hex float (C99-style, e.g. `0x1.8p+0`) encode/decode utilities.\n *\n * Hex float format:\n * [-] 0x [hex digits] [. [hex digits]] p [+-] [decimal exponent]\n *\n * This notation appears in CDN (draft-ietf-cbor-edn-literals-25) as an\n * alternative representation for floating-point values (major type 7).\n */\n\n// Reusable 8-byte buffer for float64 bit extraction\nconst _buf8 = new ArrayBuffer(8);\nconst _dv8 = new DataView(_buf8);\n\n/**\n * Parse a hex float literal (e.g. `0x4711p+03`, `0x1.8p+0`, `-0x1.fp-2`)\n * to a JS number.\n *\n * Assumes the string has already been stripped of any encoding-indicator\n * suffix (`_1`, `_2`, `_3`).\n */\nexport function parseHexFloat(s: string): number {\n const neg = s.startsWith('-');\n const body = s.slice(neg ? 3 : 2); // strip optional '-' and '0x'/'0X'\n\n const pIdx = body.search(/[pP]/);\n if (pIdx === -1)\n throw new SyntaxError(\n `EDN parse error: hex float missing 'p' exponent: ${s}`\n );\n\n const mantissaStr = body.slice(0, pIdx);\n const expStr = body.slice(pIdx + 1);\n\n // Exponent must be a non-empty decimal integer (optional sign + digits)\n if (!/^[+-]?\\d+$/.test(expStr))\n throw new SyntaxError(\n `EDN parse error: hex float has invalid or missing exponent: ${s}`\n );\n\n const exp = parseInt(expStr, 10);\n\n const dotIdx = mantissaStr.indexOf('.');\n let mantissa: number;\n if (dotIdx === -1) {\n // No decimal point: must have at least one hex digit\n if (!/^[0-9a-fA-F]+$/.test(mantissaStr))\n throw new SyntaxError(\n `EDN parse error: hex float has no mantissa digits: ${s}`\n );\n mantissa = parseInt(mantissaStr, 16);\n } else {\n const intPart = mantissaStr.slice(0, dotIdx);\n const fracStr = mantissaStr.slice(dotIdx + 1);\n // At least one hex digit required on either side of the decimal point\n if (intPart === '' && fracStr === '')\n throw new SyntaxError(\n `EDN parse error: hex float has no mantissa digits: ${s}`\n );\n if (intPart !== '' && !/^[0-9a-fA-F]+$/.test(intPart))\n throw new SyntaxError(\n `EDN parse error: hex float has invalid mantissa: ${s}`\n );\n if (fracStr !== '' && !/^[0-9a-fA-F]+$/.test(fracStr))\n throw new SyntaxError(\n `EDN parse error: hex float has invalid mantissa: ${s}`\n );\n const intVal = intPart === '' ? 0 : parseInt(intPart, 16);\n const fracVal =\n fracStr === '' ? 0 : parseInt(fracStr, 16) / Math.pow(16, fracStr.length);\n mantissa = intVal + fracVal;\n }\n\n const result = mantissa * Math.pow(2, exp);\n return neg ? -result : result;\n}\n\n/**\n * Convert a JS number to a normalized hex float string compatible with\n * CDN diagnostic notation.\n *\n * - Normal values: `0x1.[hex fraction]p[+-][exp]` (e.g. `0x1.8p+0` for 1.5)\n * - Subnormal values: `0x0.[hex fraction]p-1022`\n * - Zero: `0x0p+0` / `-0x0p+0`\n * - Non-finite values (NaN, ±Infinity) are returned unchanged as EDN tokens.\n */\nexport function floatToHexFloat(v: number): string {\n if (isNaN(v)) return 'NaN';\n if (!isFinite(v)) return v > 0 ? 'Infinity' : '-Infinity';\n\n const neg = Object.is(v, -0) || v < 0;\n const abs = Math.abs(v);\n\n if (abs === 0) return neg ? '-0x0p+0' : '0x0p+0';\n\n _dv8.setFloat64(0, abs, false); // big-endian\n const hi = _dv8.getUint32(0, false);\n const lo = _dv8.getUint32(4, false);\n\n // bits [30:20] of hi = biased exponent (11 bits)\n const biasedExp = (hi >>> 20) & 0x7ff;\n // bits [19:0] of hi = upper 20 bits of 52-bit mantissa\n const mantHi = hi & 0xfffff;\n // lo = lower 32 bits of mantissa\n const mantLo = lo;\n\n // Format mantissa as 13 hex digits (52 bits / 4), strip trailing zeros\n const hexMant =\n mantHi.toString(16).padStart(5, '0') + mantLo.toString(16).padStart(8, '0');\n const trimmed = hexMant.replace(/0+$/, '');\n const mantPart = trimmed === '' ? '' : `.${trimmed}`;\n\n let intPart: string;\n let exp: number;\n if (biasedExp === 0) {\n // Subnormal: value = 0.[mantissa] * 2^-1022\n intPart = '0';\n exp = -1022;\n } else {\n // Normal: value = 1.[mantissa] * 2^(biasedExp-1023)\n intPart = '1';\n exp = biasedExp - 1023;\n }\n\n const expStr = exp >= 0 ? `+${exp}` : `${exp}`;\n const result = `0x${intPart}${mantPart}p${expStr}`;\n return neg ? `-${result}` : result;\n}\n","import type { ToCDNOptions, ToJSOptions, ToCBOROptions } from '../types';\nimport { CborItem } from './CborItem';\nimport { MT_SIMPLE, AI_2BYTE, AI_4BYTE, AI_8BYTE } from '../cbor/constants';\nimport { autoSelectFloatPrecision } from '../cbor/encode';\nimport { writeFloat16 } from '../utils/float16';\nimport { floatValueToString, floatSuffix } from '../cdn/serialize-utils';\nimport { floatToHexFloat } from '../utils/hexfloat';\n\nexport type FloatPrecision = 'half' | 'single' | 'double';\n\n/**\n * CBOR Major Type 7 — IEEE 754 floating-point number.\n *\n * `precision` records the encoding size from the original CBOR stream so\n * that lossless round-trips are preserved. When constructing from a JS\n * `number`, omit `precision` (`undefined`) and the encoder will choose\n * the smallest encoding that preserves the value exactly.\n */\nexport class CborFloat extends CborItem {\n readonly value: number;\n /**\n * Encoding size hint.\n * - `'half'` / `'single'` / `'double'`: use exactly this size (set by the\n * decoder to guarantee lossless round-trips).\n * - `undefined`: encoder auto-selects the smallest lossless size.\n */\n readonly precision: FloatPrecision | undefined;\n /**\n * Original app-string source (e.g. `float'7e00'`), set by the parser when\n * this float is the result of a `float'...'` app-string. Used by toCDN()\n * to round-trip the literal when `appStrings` is not false.\n */\n ednSource?: string;\n\n constructor(value: number, options?: { precision?: FloatPrecision }) {\n super();\n this.value = value;\n this.precision = options?.precision;\n }\n\n _toCBOR(_options?: ToCBOROptions): Uint8Array {\n const precision = this.precision ?? autoSelectFloatPrecision(this.value);\n const initial = MT_SIMPLE << 5;\n\n if (precision === 'half') {\n const buf = new Uint8Array(3);\n buf[0] = initial | AI_2BYTE; // 0xf9\n writeFloat16(new DataView(buf.buffer), 1, this.value, false);\n return buf;\n }\n if (precision === 'single') {\n const buf = new Uint8Array(5);\n buf[0] = initial | AI_4BYTE; // 0xfa\n new DataView(buf.buffer).setFloat32(1, this.value, false);\n return buf;\n }\n // double\n const buf = new Uint8Array(9);\n buf[0] = initial | AI_8BYTE; // 0xfb\n new DataView(buf.buffer).setFloat64(1, this.value, false);\n return buf;\n }\n\n _toCDN(options: ToCDNOptions | undefined, _depth: number): string {\n if (options?.appStrings !== false && this.ednSource !== undefined)\n return this.ednSource;\n const autoSelected = autoSelectFloatPrecision(this.value);\n const numStr =\n options?.floatFormat === 'hex'\n ? floatToHexFloat(this.value)\n : floatValueToString(this.value);\n return numStr + floatSuffix(this.value, this.precision, autoSelected);\n }\n\n _toJS(_options?: ToJSOptions): unknown {\n return this.value;\n }\n}\n","import type { ToCDNOptions, ToJSOptions, ToCBOROptions } from '../types';\nimport { CborItem } from './CborItem';\nimport { Tag } from '../tag';\nimport type { AnnotatedLine } from './CborItem';\nimport { MT_TAG } from '../cbor/constants';\nimport { writeHead, concat, type EncodingWidth } from '../cbor/encode';\n\n/** CBOR Major Type 6 — tagged data item. */\nexport class CborTag extends CborItem {\n readonly tag: bigint;\n readonly content: CborItem;\n readonly encodingWidth: EncodingWidth | undefined;\n\n constructor(\n tag: number | bigint,\n content: CborItem,\n options?: { encodingWidth?: EncodingWidth }\n ) {\n super();\n this.tag = BigInt(tag);\n if (this.tag < 0n)\n throw new RangeError('CborTag tag number must be non-negative');\n this.content = content;\n this.encodingWidth = options?.encodingWidth;\n }\n\n _toCBOR(options?: ToCBOROptions): Uint8Array {\n return concat([\n writeHead(MT_TAG, this.tag, this.encodingWidth),\n this.content._toCBOR(options),\n ]);\n }\n\n override _toCDN(options: ToCDNOptions | undefined, depth: number): string {\n const suffix =\n this.encodingWidth !== undefined ? `_${this.encodingWidth}` : '';\n return `${this.tag}${suffix}(${this.content._toCDN(options, depth)})`;\n }\n\n override _toHexDump(depth: number, options?: ToCDNOptions): AnnotatedLine[] {\n const toHex = (bytes: Uint8Array) =>\n Array.from(bytes, (b) =>\n b.toString(16).toUpperCase().padStart(2, '0')\n ).join(' ');\n const lines: AnnotatedLine[] = [\n {\n depth,\n hex: toHex(writeHead(MT_TAG, this.tag, this.encodingWidth)),\n comment: `Tag ${this.tag}`,\n },\n ];\n lines.push(...this.content._toHexDump(depth + 1, options));\n return lines;\n }\n\n _toJS(options?: ToJSOptions): unknown {\n const value = this.content._toJS(options);\n return options?.stripTags ? value : Tag.set(value, this.tag);\n }\n}\n","/**\n * CDN lexer (internal).\n *\n * Used by parser.ts for parsing and by CborTextString serialization to collect\n * source offsets after parseCDN() has already validated embedded CDN.\n */\n\nexport type TokenType =\n | 'INTEGER'\n | 'FLOAT'\n | 'TSTR'\n | 'SQSTR'\n | 'RAWSTRING'\n | 'BYTES_HEX'\n | 'BYTES_HEX_ELIDED'\n | 'BYTES_B64'\n | 'APP_STRING'\n | 'APP_SEQUENCE'\n | 'EMPTY_INDEF_BYTES'\n | 'EMPTY_INDEF_TEXT'\n | 'TRUE'\n | 'FALSE'\n | 'NULL'\n | 'UNDEFINED'\n | 'SIMPLE'\n | 'LBRACKET'\n | 'RBRACKET'\n | 'LBRACE'\n | 'RBRACE'\n | 'LPAREN'\n | 'RPAREN'\n | 'COLON'\n | 'COMMA'\n | 'PLUS'\n | 'UNDERSCORE'\n | 'ENCODING_INDICATOR'\n | 'LT_LT'\n | 'GT_GT'\n | 'ELLIPSIS'\n | 'EOF';\n\nexport interface Token {\n type: TokenType;\n /** Processed value: decoded string content, raw number text, raw byte content, etc. */\n value: string;\n /** Original source text for this token. */\n raw: string;\n line: number;\n col: number;\n /** Character offset of the first character of this token in the source input. */\n offset: number;\n /** Character offset just past the last character of this token in the source input. */\n endOffset: number;\n /** Only set when type === 'APP_STRING': the extension prefix (e.g. 'dt', 'DT'). */\n appPrefix?: string;\n}\n\nexport interface TokenizerOptions {\n /** Character offset at which tokenization starts. */\n offset?: number;\n}\n\nexport interface EdnComment {\n kind: 'line' | 'block';\n marker: '#' | '//' | '/*' | '/';\n text: string;\n start: number;\n end: number;\n line: number;\n col: number;\n}\n\nfunction positionAt(\n input: string,\n offset: number\n): { line: number; col: number } {\n let line = 1;\n let col = 1;\n for (let i = 0; i < offset; i++) {\n if (input[i] === '\\n') {\n line++;\n col = 1;\n } else {\n col++;\n }\n }\n return { line, col };\n}\n\nexport class Tokenizer {\n private pos: number;\n private line: number;\n private col: number;\n private _peeked: Token | null = null;\n private _lastConsumedEndOffset: number;\n /** Comments encountered while scanning, appended in source order. */\n readonly comments: EdnComment[] = [];\n /**\n * When set, non-standard-but-JS-valid escape sequences are accepted instead\n * of throwing. The callback receives a message and the position of the `\\`\n * (offset, line, column) so the parser can forward it as a ParseWarning.\n */\n onEscapeWarning?: (\n msg: string,\n offset: number,\n line: number,\n col: number\n ) => void;\n constructor(\n private readonly input: string,\n options?: TokenizerOptions\n ) {\n const offset = options?.offset ?? 0;\n if (!Number.isInteger(offset) || offset < 0 || offset > input.length)\n throw new RangeError(\n `EDN parse offset must be an integer between 0 and ${input.length}`\n );\n const position = positionAt(input, offset);\n this.pos = offset;\n this.line = position.line;\n this.col = position.col;\n this._lastConsumedEndOffset = offset;\n }\n\n peek(): Token {\n if (this._peeked === null) this._peeked = this._readNext();\n return this._peeked;\n }\n\n consume(): Token {\n const tok = this._peeked !== null ? this._peeked : this._readNext();\n this._peeked = null;\n this._lastConsumedEndOffset = tok.endOffset;\n return tok;\n }\n\n /** Character offset just past the last character of the most recently consumed token. */\n get lastEndOffset(): number {\n return this._lastConsumedEndOffset;\n }\n\n /** The full source text supplied to this tokenizer. */\n get source(): string {\n return this.input;\n }\n\n // ── Internal helpers ─────────────────────────────────────────────────────\n\n private _ch(): string {\n return this.input[this.pos] ?? '';\n }\n private _eof(): boolean {\n return this.pos >= this.input.length;\n }\n\n private _advance(): string {\n const c = this.input[this.pos++] ?? '';\n if (c === '\\n') {\n this.line++;\n this.col = 1;\n } else {\n this.col++;\n }\n return c;\n }\n\n private _fail(msg: string, line = this.line, col = this.col): never {\n throw new SyntaxError(\n `EDN parse error at line ${line}, column ${col}: ${msg}`\n );\n }\n\n private _skipWS(): void {\n for (;;) {\n // Skip whitespace characters\n while (!this._eof() && /\\s/.test(this._ch())) this._advance();\n if (this._eof()) return;\n\n const c = this._ch();\n\n // CDN line comment: # to end of line\n if (c === '#') {\n const start = this.pos;\n const line = this.line;\n const col = this.col;\n while (!this._eof() && this._ch() !== '\\n') this._advance();\n this.comments.push({\n kind: 'line',\n marker: '#',\n text: this.input.slice(start, this.pos),\n start,\n end: this.pos,\n line,\n col,\n });\n continue;\n }\n\n // Comments starting with /\n if (c === '/') {\n const next = this.input[this.pos + 1] ?? '';\n if (next === '/') {\n // EDN end-of-line comment: // to end of line (§2.2)\n const start = this.pos;\n const line = this.line;\n const col = this.col;\n this._advance();\n this._advance();\n while (!this._eof() && this._ch() !== '\\n') this._advance();\n this.comments.push({\n kind: 'line',\n marker: '//',\n text: this.input.slice(start, this.pos),\n start,\n end: this.pos,\n line,\n col,\n });\n continue;\n }\n if (next === '*') {\n // EDN block comment: /* ... */ (§2.2)\n const start = this.pos;\n const line = this.line;\n const col = this.col;\n this._advance();\n this._advance();\n this._skipBlockCommentStar();\n this.comments.push({\n kind: 'block',\n marker: '/*',\n text: this.input.slice(start, this.pos),\n start,\n end: this.pos,\n line,\n col,\n });\n continue;\n }\n // EDN slash-delimited comment: / ... / (§2.2, first char must not be * or /)\n const start = this.pos;\n const line = this.line;\n const col = this.col;\n this._advance(); // consume opening /\n this._skipBlockCommentSlash();\n this.comments.push({\n kind: 'block',\n marker: '/',\n text: this.input.slice(start, this.pos),\n start,\n end: this.pos,\n line,\n col,\n });\n continue;\n }\n\n return;\n }\n }\n\n /**\n * Skip a comment in a quoted byte string literal (h'', b64'').\n * Returns true if a comment was consumed, false if the current char is not a\n * comment start. `quote` is the closing delimiter character.\n *\n * Supports / ... /, /* *\\/, //, and # comment forms (§2.2).\n */\n private _skipByteStringComment(quote: string): boolean {\n const ch = this._ch();\n if (ch === '/') {\n const next = this.input[this.pos + 1] ?? '';\n if (next === '/') {\n this._advance();\n this._advance();\n while (!this._eof() && this._ch() !== '\\n') {\n if (this._ch() === '\\\\') {\n this._advance();\n if (!this._eof() && this._ch() !== '\\n') this._advance();\n continue;\n }\n if (this._ch() === quote) break;\n this._advance();\n }\n return true;\n }\n if (next === '*') {\n this._advance();\n this._advance();\n this._skipBlockCommentStar();\n return true;\n }\n this._advance();\n this._skipBlockCommentSlash();\n return true;\n }\n if (ch === '#') {\n while (!this._eof() && this._ch() !== '\\n') {\n if (this._ch() === '\\\\') {\n this._advance(); // consume '\\'\n if (this._eof() || this._ch() === '\\n') continue;\n const escaped = this._advance();\n if (escaped === 'u') this._validateHexCommentUnicodeEscape();\n continue;\n }\n if (this._ch() === quote) break;\n this._advance();\n }\n return true;\n }\n return false;\n }\n\n /**\n * Validate a `\\uXXXX` or `\\u{N}` escape inside a hex-string comment.\n *\n * Called immediately after the `u` character has been consumed. Rejects\n * lone surrogates and invalid surrogate pairs; tolerates truncated/\n * non-hex sequences (comments are informational, but surrogates are\n * always illegal).\n */\n private _validateHexCommentUnicodeEscape(): void {\n const line = this.line,\n col = this.col;\n\n // Extended form \\u{XXXXXX}\n if (!this._eof() && this._ch() === '{') {\n this._advance(); // {\n let hex = '';\n while (!this._eof() && this._ch() !== '}' && this._ch() !== '\\n')\n hex += this._advance();\n if (!this._eof() && this._ch() === '}') this._advance(); // }\n const cp = parseInt(hex || '0', 16);\n if (cp >= 0xd800 && cp <= 0xdfff)\n this._fail(\n `\\\\u{${hex}} is a surrogate code point, not allowed in hex string comments`,\n line,\n col\n );\n return;\n }\n\n // Standard \\uXXXX — read up to 4 hex digits\n let hex = '';\n for (let i = 0; i < 4; i++) {\n if (this._eof() || this._ch() === '\\n') break;\n if (!/[0-9a-fA-F]/.test(this._ch())) break;\n hex += this._advance();\n }\n if (hex.length < 4) return; // truncated / non-hex — not our problem\n\n const cp = parseInt(hex, 16);\n\n // High surrogate: must be followed immediately by a low-surrogate escape\n if (cp >= 0xd800 && cp <= 0xdbff) {\n if (this._ch() !== '\\\\' || (this.input[this.pos + 1] ?? '') !== 'u')\n this._fail(\n `lone high surrogate \\\\u${hex} in hex string comment`,\n line,\n col\n );\n this._advance(); // \\\n this._advance(); // u\n let hex2 = '';\n for (let i = 0; i < 4; i++) {\n if (this._eof() || this._ch() === '\\n') break;\n if (!/[0-9a-fA-F]/.test(this._ch())) break;\n hex2 += this._advance();\n }\n const cp2 = parseInt(hex2 || '0', 16);\n if (cp2 < 0xdc00 || cp2 > 0xdfff)\n this._fail(\n `\\\\u${hex} (high surrogate) not followed by valid low surrogate in hex string comment`,\n line,\n col\n );\n return;\n }\n\n if (cp >= 0xdc00 && cp <= 0xdfff)\n this._fail(\n `lone low surrogate \\\\u${hex} in hex string comment`,\n line,\n col\n );\n }\n\n /**\n * Skip a comment in a raw byte string (h``, b64``).\n * Called with `i` pointing at the comment-start character.\n * Returns the index after the comment, or -1 if no comment was found.\n *\n * Supports / ... /, /* *\\/, //, and # comment forms (§2.2).\n * `context` is used in unterminated-comment error messages.\n */\n private _skipRawComment(\n raw: string,\n i: number,\n context: string,\n tokenLine: number,\n tokenCol: number\n ): number {\n const ch = raw[i];\n if (ch === '/') {\n i++;\n if (raw[i] === '/') {\n i++;\n while (i < raw.length && raw[i] !== '\\n') i++;\n return i;\n }\n if (raw[i] === '*') {\n i++;\n while (i < raw.length) {\n if (raw[i] === '*' && raw[i + 1] === '/') return i + 2;\n i++;\n }\n return i; // EOF inside comment — fall through; caller will report\n }\n // / … / comment\n while (i < raw.length && raw[i] !== '/') i++;\n if (i >= raw.length)\n throw new SyntaxError(\n `EDN parse error at line ${tokenLine}, column ${tokenCol}: unterminated block comment in ${context}`\n );\n return i + 1; // consume closing /\n }\n if (ch === '#') {\n while (i < raw.length && raw[i] !== '\\n') i++;\n return i;\n }\n return -1; // not a comment\n }\n\n /** Skip content until a closing `/` (CDN block comment). */\n private _skipBlockCommentSlash(): void {\n const line = this.line,\n col = this.col;\n while (!this._eof()) {\n if (this._ch() === '\\\\') {\n this._advance();\n if (!this._eof()) this._advance();\n continue;\n }\n if (this._ch() === '/') break;\n this._advance();\n }\n if (this._eof()) this._fail('unterminated block comment', line, col);\n this._advance(); // consume closing /\n }\n\n /** Skip content until a closing `*\\/` (JSONC block comment). */\n private _skipBlockCommentStar(): void {\n const line = this.line,\n col = this.col;\n while (!this._eof()) {\n if (this._ch() === '*' && (this.input[this.pos + 1] ?? '') === '/') {\n this._advance();\n this._advance();\n return;\n }\n this._advance();\n }\n this._fail('unterminated block comment', line, col);\n }\n\n /**\n * Read content between `quote` delimiters, processing escape sequences.\n *\n * Strict spec compliance:\n * - Literal LF (U+000A) is allowed; all other C0 controls and U+007F are rejected.\n * - Literal CR (U+000D) is silently stripped (source-level CRLF normalisation).\n * - Only spec-defined escape sequences are accepted; `\\q` etc. throw SyntaxError.\n * - `\\/` is valid only in double-quoted strings (not in escapable-s, §5.1).\n * - `\\\\` (backslash) is valid in both single- and double-quoted strings.\n * - `\\uXXXX` for a high surrogate must be immediately followed by `\\uXXXX` for\n * the corresponding low surrogate; lone surrogates are rejected.\n * - `\\u{N}` … `\\u{10FFFF}` extended syntax is supported; surrogates are rejected.\n * - In single-quoted strings, `\\u` escapes to printable ASCII (U+0020–U+007E)\n * are forbidden (hexchar-s restriction, draft-25 §5.1).\n */\n private _readStringContent(quote: string): string {\n this._advance(); // opening quote\n let out = '';\n while (!this._eof() && this._ch() !== quote) {\n const ch = this._ch();\n\n // Strip literal CR (cross-platform source normalisation — spec §2.5.1)\n if (ch === '\\r') {\n this._advance();\n continue;\n }\n\n // Reject unescaped C0 control characters (except LF) and DEL — spec §5.1 unescaped\n const cp = ch.codePointAt(0)!;\n if ((cp < 0x20 && cp !== 0x0a) || cp === 0x7f)\n this._fail(\n `unescaped control character U+${cp.toString(16).padStart(4, '0')} is not allowed in string literals`\n );\n\n if (ch === '\\\\') {\n // Capture position of the backslash itself before consuming it.\n const eOffset = this.pos,\n eLine = this.line,\n eCol = this.col;\n this._advance();\n const e = this._advance();\n switch (e) {\n case 'n':\n out += '\\n';\n break;\n case 'r':\n out += '\\r';\n break;\n case 't':\n out += '\\t';\n break;\n case 'b':\n out += '\\b';\n break;\n case 'f':\n out += '\\f';\n break;\n case '\\\\':\n out += '\\\\';\n break;\n case 'u':\n out += this._readUnicodeEscape(quote, eOffset, eLine, eCol);\n break;\n default:\n // Escaped delimiter char (e.g. \\' inside '...' or \\\" inside \"...\")\n if (e === quote) {\n out += e;\n break;\n }\n if (e === '/') {\n if (quote === \"'\")\n this._fail(\n `\\\\/ is not a valid escape in single-quoted byte strings (§5.1)`,\n eLine,\n eCol\n );\n out += '/';\n break;\n }\n // Non-standard JS escape sequences — accepted when onEscapeWarning is set.\n if (this.onEscapeWarning) {\n if (e === '0') {\n this.onEscapeWarning(\n '\\\\0 is a non-standard escape sequence; use \\\\u0000 instead',\n eOffset,\n eLine,\n eCol\n );\n out += '\\0';\n break;\n }\n if (e === 'v') {\n this.onEscapeWarning(\n '\\\\v is a non-standard escape sequence; use \\\\u000b instead',\n eOffset,\n eLine,\n eCol\n );\n out += '\\v';\n break;\n }\n if (e === 'x') {\n // \\xHH — two hex digits\n const h1 = this._ch();\n const h2 = this.input[this.pos + 1] ?? '';\n if (!/[0-9a-fA-F]/.test(h1) || !/[0-9a-fA-F]/.test(h2)) {\n this._fail(\n '\\\\x escape requires exactly two hex digits',\n eLine,\n eCol\n );\n }\n this._advance();\n this._advance();\n const codePoint = parseInt(h1 + h2, 16);\n this.onEscapeWarning(\n `\\\\x${h1}${h2} is a non-standard escape sequence; use \\\\u00${h1}${h2} instead`,\n eOffset,\n eLine,\n eCol\n );\n out += String.fromCharCode(codePoint);\n break;\n }\n // Cross-quote delimiter (e.g. \\\" inside '...' or \\' inside \"...\")\n if (e === '\"' || e === \"'\") {\n this.onEscapeWarning(\n `\\\\${e} inside ${quote === '\"' ? 'double' : 'single'}-quoted string is non-standard`,\n eOffset,\n eLine,\n eCol\n );\n out += e;\n break;\n }\n // JS line continuation: \\ + LF / CR / CRLF → nothing added\n if (e === '\\n' || e === '\\r') {\n if (e === '\\r' && this._ch() === '\\n') this._advance(); // consume CRLF\n this.onEscapeWarning(\n 'line continuation (\\\\<newline>) is non-standard; the newline is ignored',\n eOffset,\n eLine,\n eCol\n );\n break;\n }\n // Identity escape: \\X → X (JS accepts any \\X as just X)\n this.onEscapeWarning(\n `\\\\${e} is an unknown escape sequence; interpreted as '${e}'`,\n eOffset,\n eLine,\n eCol\n );\n out += e;\n break;\n }\n this._fail(\n `invalid escape sequence \\\\${e} in ${quote === '\"' ? 'double' : 'single'}-quoted string`,\n eLine,\n eCol\n );\n }\n } else {\n out += this._advance();\n }\n }\n if (this._eof()) this._fail('unterminated string literal');\n this._advance(); // closing quote\n return out;\n }\n\n /**\n * Parse a Unicode escape immediately after `\\u` has been consumed.\n *\n * @param quote - The enclosing string delimiter (`\"` or `'`).\n *\n * Handles two forms:\n * - `\\u{N}` … `\\u{10FFFF}`: direct Unicode scalar value (surrogates rejected)\n * - `\\uXXXX`: exactly four hex digits; a high surrogate must be followed by\n * `\\uXXXX` for the matching low surrogate to form a valid surrogate pair,\n * which is then decoded into the corresponding non-BMP code point.\n *\n * In single-quoted strings (`quote === \"'\"`), `\\u` escapes that resolve to\n * printable ASCII (U+0020–U+007E) are rejected per draft-25 §5.1 hexchar-s.\n * Use `\\\\` for backslash (U+005C) and `\\'` for the single-quote delimiter.\n */\n private _readUnicodeEscape(\n quote: string,\n bsOffset?: number,\n bsLine?: number,\n bsCol?: number\n ): string {\n const line = this.line,\n col = this.col;\n\n /** Warn or throw when this is a single-quoted string and the code point is printable ASCII. */\n const checkSingleQuotedPrintable = (cp: number): void => {\n // Per draft-25 §5.1 hexchar-s, \\u escapes for printable ASCII (U+0020–U+007E)\n // are not valid in single-quoted strings. Use \\\\ for backslash and \\' for\n // the single-quote delimiter. In lenient mode (onEscapeWarning set) we emit\n // a warning and accept the value rather than hard-failing.\n if (quote === \"'\" && cp >= 0x20 && cp <= 0x7e) {\n const msg = `\\\\u escape for printable ASCII U+${cp.toString(16).padStart(4, '0').toUpperCase()} is not allowed in single-quoted strings (§5.1 hexchar-s)`;\n if (this.onEscapeWarning) {\n this.onEscapeWarning(\n msg,\n bsOffset ?? this.pos,\n bsLine ?? line,\n bsCol ?? col\n );\n return;\n }\n this._fail(msg, line, col);\n }\n };\n\n // Extended form \\u{NNN}\n if (!this._eof() && this._ch() === '{') {\n this._advance(); // {\n let hex = '';\n while (!this._eof() && this._ch() !== '}') {\n const c = this._ch();\n if (!/[0-9a-fA-F]/.test(c))\n this._fail(\n `invalid character in \\\\u{} escape: ${JSON.stringify(c)}`,\n line,\n col\n );\n hex += this._advance();\n }\n if (this._eof()) this._fail('unterminated \\\\u{} escape', line, col);\n this._advance(); // }\n if (hex.length === 0) this._fail('empty \\\\u{} escape', line, col);\n const cp = parseInt(hex, 16);\n if (cp > 0x10_ffff)\n this._fail(\n `\\\\u{${hex}} exceeds maximum Unicode code point U+10FFFF`,\n line,\n col\n );\n if (cp >= 0xd800 && cp <= 0xdfff)\n this._fail(\n `\\\\u{${hex}} is a surrogate code point, which is not a valid Unicode scalar value`,\n line,\n col\n );\n checkSingleQuotedPrintable(cp);\n return String.fromCodePoint(cp);\n }\n\n // Standard form \\uXXXX\n let hex = '';\n for (let i = 0; i < 4; i++) {\n if (this._eof()) this._fail('truncated \\\\uXXXX escape', line, col);\n const c = this._ch();\n if (!/[0-9a-fA-F]/.test(c))\n this._fail(\n `invalid hex digit in \\\\uXXXX escape: ${JSON.stringify(c)}`,\n line,\n col\n );\n hex += this._advance();\n }\n const cp = parseInt(hex, 16);\n\n // High surrogate: must be immediately followed by a low-surrogate escape\n if (cp >= 0xd800 && cp <= 0xdbff) {\n if (this._ch() !== '\\\\' || (this.input[this.pos + 1] ?? '') !== 'u')\n this._fail(\n `lone high surrogate \\\\u${hex} must be followed by \\\\uDC00–\\\\uDFFF`,\n line,\n col\n );\n this._advance(); // \\\n this._advance(); // u\n const line2 = this.line,\n col2 = this.col;\n let hex2 = '';\n for (let i = 0; i < 4; i++) {\n if (this._eof())\n this._fail('truncated low-surrogate escape', line2, col2);\n hex2 += this._advance();\n }\n const cp2 = parseInt(hex2, 16);\n if (cp2 < 0xdc00 || cp2 > 0xdfff)\n this._fail(\n `\\\\u${hex} (high surrogate) not followed by a valid low surrogate (got \\\\u${hex2})`,\n line,\n col\n );\n // Surrogate pairs always resolve to non-BMP (> U+FFFF), never printable ASCII\n return String.fromCodePoint(\n 0x10000 + (cp - 0xd800) * 0x400 + (cp2 - 0xdc00)\n );\n }\n\n // Low surrogate without a preceding high surrogate is invalid\n if (cp >= 0xdc00 && cp <= 0xdfff)\n this._fail(`lone low surrogate \\\\u${hex} is not valid`, line, col);\n\n checkSingleQuotedPrintable(cp);\n return String.fromCharCode(cp);\n }\n\n /**\n * Read raw text-string content between N-backtick delimiters (§2.5.3).\n *\n * - The opening delimiter is the maximal run of consecutive backticks (N ≥ 1).\n * - A single leading newline (LF or CRLF) immediately after the opening is stripped.\n * - No escape sequences are processed — content is taken verbatim.\n * - Literal CR is stripped for source-level CRLF normalisation.\n * - The closing delimiter is the first run of M ≥ N backticks; any excess\n * M-N backticks are appended to the content before closing.\n */\n private _readRawStringContent(): string {\n const openLine = this.line,\n openCol = this.col;\n\n // Count opening backticks (greedy)\n let n = 0;\n while (!this._eof() && this._ch() === '`') {\n this._advance();\n n++;\n }\n\n // Strip a single leading CRLF or LF (§2.5.3)\n if (!this._eof() && this._ch() === '\\r') this._advance(); // CR\n if (!this._eof() && this._ch() === '\\n') this._advance(); // LF\n\n let out = '';\n while (!this._eof()) {\n const ch = this._ch();\n\n // Source-level CRLF normalisation: strip bare CR\n if (ch === '\\r') {\n this._advance();\n continue;\n }\n\n if (ch === '`') {\n // Count this backtick run\n let m = 0;\n while (!this._eof() && this._ch() === '`') {\n this._advance();\n m++;\n }\n if (m >= n) {\n // Closing delimiter found; excess backticks become content\n out += '`'.repeat(m - n);\n if (out === '')\n this._fail(\n 'raw string must not be empty (§2.5.3)',\n openLine,\n openCol\n );\n return out;\n }\n // Not enough backticks — all become content\n out += '`'.repeat(m);\n } else {\n const cp = ch.codePointAt(0)!;\n // rawchars = 1*(%x0a/%x0d / %x20-5f / %x61-7e / NONASCII) — HT and other C0 controls forbidden\n if (cp < 0x20 && cp !== 0x0a && cp !== 0x0d) {\n this._fail(\n `raw string content must not contain control character U+${cp.toString(16).toUpperCase().padStart(4, '0')} (§2.5.3)`,\n this.line,\n this.col\n );\n }\n if (cp === 0x7f) {\n this._fail(\n 'raw string content must not contain DEL (U+007F) (§2.5.3)',\n this.line,\n this.col\n );\n }\n out += this._advance();\n }\n }\n\n this._fail('unterminated raw string literal', openLine, openCol);\n }\n\n /**\n * Post-process raw hex content from a `h``…``\\` raw string (§5.3.3).\n *\n * Skips:\n * - lblank whitespace (LF, SP; also CR for source-level normalisation)\n * - `/ … /` block comments\n * - `# …` line comments (up to but not including LF)\n * Detects `...` ellipsis sequences.\n *\n * A trailing `# comment` immediately before the closing delimiter is allowed\n * per §5.3.3 `r-app-string-h`.\n *\n * Returns { value: hex-string-with-ellipsis-markers, elided: boolean }\n */\n private _processRawHexContent(\n raw: string,\n tokenLine: number,\n tokenCol: number\n ): { value: string; elided: boolean } {\n let hex = '';\n let elided = false;\n let i = 0;\n while (i < raw.length) {\n const ch = raw[i];\n // lblank / CR — skip\n if (ch === '\\n' || ch === ' ' || ch === '\\r') {\n i++;\n continue;\n }\n // HT is still forbidden (rawchars excludes %x09)\n if (ch === '\\t') {\n throw new SyntaxError(\n `EDN parse error at line ${tokenLine}, column ${tokenCol}: horizontal tab (HT) is not allowed inside h\\`\\` raw byte string literals (§5.3.3)`\n );\n }\n // Comments (§2.2)\n const afterComment = this._skipRawComment(\n raw,\n i,\n 'h`` raw byte string',\n tokenLine,\n tokenCol\n );\n if (afterComment !== -1) {\n i = afterComment;\n continue;\n }\n // Ellipsis: ... (three or more dots)\n if (ch === '.' && raw[i + 1] === '.' && raw[i + 2] === '.') {\n i += 3;\n while (i < raw.length && raw[i] === '.') i++;\n hex += '...';\n elided = true;\n continue;\n }\n // Hex digit\n if (/[0-9a-fA-F]/.test(ch)) {\n hex += ch;\n i++;\n continue;\n }\n throw new SyntaxError(\n `EDN parse error at line ${tokenLine}, column ${tokenCol}: unexpected character ${JSON.stringify(ch)} in h\\`\\` raw byte string`\n );\n }\n return { value: hex, elided };\n }\n\n /**\n * Post-process raw base64 content from a `b64``…``\\` raw string (§5.3.4).\n *\n * Skips:\n * - lblank whitespace (LF, SP; also CR for source-level normalisation)\n * - `# …` line comments (up to but not including LF)\n *\n * Returns the stripped base64 string.\n */\n private _processRawB64Content(\n raw: string,\n tokenLine: number,\n tokenCol: number\n ): string {\n let out = '';\n let i = 0;\n while (i < raw.length) {\n const ch = raw[i];\n // lblank / CR — skip\n if (ch === '\\n' || ch === ' ' || ch === '\\r') {\n i++;\n continue;\n }\n // HT forbidden\n if (ch === '\\t') {\n throw new SyntaxError(\n `EDN parse error at line ${tokenLine}, column ${tokenCol}: horizontal tab (HT) is not allowed inside b64\\`\\` raw byte string literals (§5.3.4)`\n );\n }\n // Line comment: # … (to end of line)\n // Note: // is NOT treated as a comment because / is a valid B64DIGIT\n // (e.g. 0xFF 0xFF encodes to //8= in standard base64).\n if (ch === '#') {\n while (i < raw.length && raw[i] !== '\\n') i++;\n continue;\n }\n out += ch;\n i++;\n }\n return out;\n }\n\n /**\n * Read raw byte-string content between `quote` chars (b64 / b64url).\n *\n * Strips whitespace and skips `# ...` line comments per §2.5.5.\n * `/` is NOT treated as a comment delimiter because it is a valid base64 character.\n */\n private _readByteContent(quote: string): string {\n this._advance(); // opening quote\n let raw = '';\n while (!this._eof() && this._ch() !== quote) {\n const ch = this._ch();\n // lblank = %x0A / %x20 — only LF and SP are whitespace (§5.2.2 Fig 4); HT is forbidden\n if (ch === '\\n' || ch === ' ') {\n this._advance();\n continue;\n }\n if (ch === '\\r') {\n // CR is not lblank; skip silently as source-level normalization only\n this._advance();\n continue;\n }\n if (ch === '\\t') {\n this._fail(\n 'horizontal tab (HT) is not allowed inside byte string literals (§5.2.2)',\n this.line,\n this.col\n );\n }\n // # line comment — stop at newline or the closing quote (whichever comes first)\n // Note: // is NOT treated as a comment here because / is a valid B64DIGIT;\n // treating // as a comment would corrupt base64 data that naturally contains\n // consecutive slashes (e.g. 0xFF 0xFF encodes to //8= in standard base64).\n if (ch === '#') {\n while (!this._eof() && this._ch() !== '\\n') {\n if (this._ch() === '\\\\') {\n this._advance();\n if (!this._eof() && this._ch() !== '\\n') this._advance();\n continue;\n }\n if (this._ch() === quote) break;\n this._advance();\n }\n continue;\n }\n raw += this._advance();\n }\n if (this._eof()) this._fail('unterminated byte string literal');\n this._advance(); // closing quote\n return raw;\n }\n\n /**\n * Read hex byte-string content, recognising `...` ellipsis sequences (§4.2).\n *\n * Returns the raw hex string (with `...` markers embedded) and a flag\n * indicating whether any ellipsis was found.\n */\n private _readHexByteContentElisionAware(quote: string): {\n value: string;\n elided: boolean;\n } {\n this._advance(); // opening quote\n let hex = '';\n let elided = false;\n while (!this._eof() && this._ch() !== quote) {\n const ch = this._ch();\n // lblank = %x0A / %x20 only; HT is forbidden per §5.2 Figure 3\n if (ch === '\\n' || ch === ' ' || ch === '\\r') {\n this._advance();\n continue;\n }\n if (ch === '\\t') {\n this._fail(\n 'horizontal tab (HT) is not allowed inside hex byte string literals (§5.2.1)',\n this.line,\n this.col\n );\n }\n if (this._skipByteStringComment(quote)) continue;\n // Detect '...' ellipsis inside hex literal\n if (\n ch === '.' &&\n (this.input[this.pos + 1] ?? '') === '.' &&\n (this.input[this.pos + 2] ?? '') === '.'\n ) {\n this._advance();\n this._advance();\n this._advance();\n // consume any additional dots (spec says \"three or more\")\n while (!this._eof() && this._ch() === '.') this._advance();\n // adjacent ... separated only by whitespace collapse into a single ellipsis\n if (!hex.endsWith('...')) hex += '...';\n elided = true;\n continue;\n }\n if (/[0-9a-fA-F]/.test(ch)) {\n hex += this._advance();\n continue;\n }\n this._fail(\n `unexpected character ${JSON.stringify(ch)} in hex byte string`\n );\n }\n if (this._eof()) this._fail('unterminated hex byte string literal');\n this._advance(); // closing quote\n return { value: hex, elided };\n }\n\n // ── Token reader ─────────────────────────────────────────────────────────\n\n private _readNext(): Token {\n this._skipWS();\n const offset = this.pos;\n const tok = this._readNextCore();\n return {\n ...tok,\n raw: this.input.slice(offset, this.pos),\n offset,\n endOffset: this.pos,\n };\n }\n\n private _readNextCore(): Omit<Token, 'raw' | 'offset' | 'endOffset'> {\n const line = this.line,\n col = this.col;\n if (this._eof()) return { type: 'EOF', value: '', line, col };\n\n const c = this._ch();\n\n switch (c) {\n case '[':\n this._advance();\n return { type: 'LBRACKET', value: '[', line, col };\n case ']':\n this._advance();\n return { type: 'RBRACKET', value: ']', line, col };\n case '{':\n this._advance();\n return { type: 'LBRACE', value: '{', line, col };\n case '}':\n this._advance();\n return { type: 'RBRACE', value: '}', line, col };\n case '(':\n this._advance();\n return { type: 'LPAREN', value: '(', line, col };\n case ')':\n this._advance();\n return { type: 'RPAREN', value: ')', line, col };\n case ':':\n this._advance();\n return { type: 'COLON', value: ':', line, col };\n case ',':\n this._advance();\n return { type: 'COMMA', value: ',', line, col };\n case '<':\n if ((this.input[this.pos + 1] ?? '') === '<') {\n this._advance();\n this._advance();\n return { type: 'LT_LT', value: '<<', line, col };\n }\n this._fail(`unexpected character '<'`, line, col);\n case '>':\n if ((this.input[this.pos + 1] ?? '') === '>') {\n this._advance();\n this._advance();\n return { type: 'GT_GT', value: '>>', line, col };\n }\n this._fail(`unexpected character '>'`, line, col);\n case '+': {\n const rest1 = this.input.slice(this.pos + 1);\n // +Infinity[_N]\n if (rest1.startsWith('Infinity')) {\n const after = rest1[8] ?? '';\n const hasSuffix =\n after === '_' &&\n /[0-3i]/.test(rest1[9] ?? '') &&\n !/[a-zA-Z0-9_]/.test(rest1[10] ?? '');\n if (!/[a-zA-Z0-9_]/.test(after) || hasSuffix) {\n this._advance(); // +\n for (let i = 0; i < 8; i++) this._advance(); // Infinity\n let value = 'Infinity';\n if (hasSuffix) value += this._advance() + this._advance(); // _N\n return { type: 'FLOAT', value, line, col };\n }\n }\n // Numeric literal with explicit positive sign\n const afterPlus = rest1[0] ?? '';\n if ((afterPlus >= '0' && afterPlus <= '9') || afterPlus === '.') {\n this._advance(); // consume '+'\n return this._readNumber(line, col);\n }\n // String concatenation operator\n this._advance();\n return { type: 'PLUS', value: '+', line, col };\n }\n case '`':\n return {\n type: 'RAWSTRING',\n value: this._readRawStringContent(),\n line,\n col,\n };\n case '\"': {\n const strVal = this._readStringContent('\"');\n if (strVal === '' && this._ch() === '_') {\n this._advance(); // _\n return { type: 'EMPTY_INDEF_TEXT', value: '', line, col };\n }\n return { type: 'TSTR', value: strVal, line, col };\n }\n case \"'\": {\n // ''_ → empty indefinite byte string\n if (\n (this.input[this.pos + 1] ?? '') === \"'\" &&\n (this.input[this.pos + 2] ?? '') === '_'\n ) {\n this._advance(); // first '\n this._advance(); // second '\n this._advance(); // _\n return { type: 'EMPTY_INDEF_BYTES', value: '', line, col };\n }\n // 'text' → UTF-8 encoded byte string (major type 2)\n const strVal = this._readStringContent(\"'\");\n const utf8 = new TextEncoder().encode(strVal);\n const hex = Array.from(utf8, (b) =>\n b.toString(16).padStart(2, '0')\n ).join('');\n return { type: 'SQSTR', value: hex, line, col };\n }\n }\n\n // -Infinity (check before generic '-' handling)\n if (c === '-') {\n const rest = this.input.slice(this.pos + 1);\n if (rest.startsWith('Infinity')) {\n const after = rest[8] ?? '';\n const hasSuffix =\n after === '_' &&\n /[0-7i]/.test(rest[9] ?? '') &&\n !/[a-zA-Z0-9_]/.test(rest[10] ?? '');\n if (!/[a-zA-Z0-9_]/.test(after) || hasSuffix) {\n this._advance(); // -\n for (let i = 0; i < 8; i++) this._advance(); // Infinity\n let value = '-Infinity';\n if (hasSuffix) value += this._advance() + this._advance(); // _N\n return { type: 'FLOAT', value, line, col };\n }\n }\n return this._readNumber(line, col);\n }\n\n if (c === '+') {\n const rest = this.input.slice(this.pos + 1);\n if (rest.startsWith('Infinity')) {\n const after = rest[8] ?? '';\n const hasSuffix =\n after === '_' &&\n /[0-7i]/.test(rest[9] ?? '') &&\n !/[a-zA-Z0-9_]/.test(rest[10] ?? '');\n if (!/[a-zA-Z0-9_]/.test(after) || hasSuffix) {\n this._advance(); // +\n for (let i = 0; i < 8; i++) this._advance(); // Infinity\n let value = 'Infinity';\n if (hasSuffix) value += this._advance() + this._advance(); // _N\n return { type: 'FLOAT', value, line, col };\n }\n }\n this._advance(); // consume '+' (positive sign is a no-op)\n return this._readNumber(line, col);\n }\n\n if (c >= '0' && c <= '9') return this._readNumber(line, col);\n // Leading-dot float: .5, .1e2, etc. (same as +.5 / -.5)\n if (c === '.' && /[0-9]/.test(this.input[this.pos + 1] ?? ''))\n return this._readNumber(line, col);\n if (/[a-zA-Z_]/.test(c)) return this._readIdent(line, col);\n\n // Three or more dots → ellipsis notation (§4.2)\n if (c === '.') {\n if (\n (this.input[this.pos + 1] ?? '') === '.' &&\n (this.input[this.pos + 2] ?? '') === '.'\n ) {\n this._advance();\n this._advance();\n this._advance();\n while (!this._eof() && this._ch() === '.') this._advance();\n return { type: 'ELLIPSIS', value: '...', line, col };\n }\n this._fail(`unexpected character '.'`, line, col);\n }\n\n this._fail(`unexpected character ${JSON.stringify(c)}`, line, col);\n }\n\n private _readNumber(\n line: number,\n col: number\n ): Omit<Token, 'raw' | 'offset' | 'endOffset'> {\n let raw = '';\n if (this._ch() === '-') raw += this._advance();\n\n // Alternative bases: 0x 0o 0b\n if (this._ch() === '0') {\n const next = this.input[this.pos + 1] ?? '';\n if (next === 'x' || next === 'X') {\n raw += this._advance() + this._advance(); // '0x'\n const hexDigitsBefore = raw.length;\n while (!this._eof() && /[0-9a-fA-F]/.test(this._ch()))\n raw += this._advance();\n const hasIntDigits = raw.length > hexDigitsBefore;\n // Hex float: optional '.[hex]' fractional part followed by 'p'/'P' exponent\n let isHexFloat = false;\n let hasFracDigits = false;\n if (!this._eof() && this._ch() === '.') {\n isHexFloat = true;\n raw += this._advance();\n const fracStart = raw.length;\n while (!this._eof() && /[0-9a-fA-F]/.test(this._ch()))\n raw += this._advance();\n hasFracDigits = raw.length > fracStart;\n }\n if (!this._eof() && (this._ch() === 'p' || this._ch() === 'P')) {\n isHexFloat = true;\n // Validate mantissa: need at least one hex digit before or after dot\n if (!hasIntDigits && !hasFracDigits)\n this._fail(`hex float has no mantissa digits: ${raw}`, line, col);\n raw += this._advance();\n if (!this._eof() && (this._ch() === '+' || this._ch() === '-'))\n raw += this._advance();\n const expStart = raw.length;\n while (!this._eof() && this._ch() >= '0' && this._ch() <= '9')\n raw += this._advance();\n // Validate exponent: at least one decimal digit required\n if (raw.length === expStart)\n this._fail(`hex float missing exponent digits: ${raw}`, line, col);\n } else if (isHexFloat) {\n // Had a dot but no 'p' — missing exponent\n this._fail(`hex float missing 'p' exponent: ${raw}`, line, col);\n }\n if (isHexFloat) {\n // Encoding-indicator suffix _0/_1/_2/_3/_4/_5/_6/_7/_i for hex floats\n if (this._ch() === '_') {\n const d = this.input[this.pos + 1] ?? '';\n const after = this.input[this.pos + 2] ?? '';\n if (\n (d === '0' ||\n d === '1' ||\n d === '2' ||\n d === '3' ||\n d === '4' ||\n d === '5' ||\n d === '6' ||\n d === '7' ||\n d === 'i') &&\n !/[0-9a-zA-Z_]/.test(after)\n ) {\n raw += this._advance() + this._advance();\n }\n }\n return { type: 'FLOAT', value: raw, line, col };\n }\n return { type: 'INTEGER', value: raw, line, col };\n }\n if (next === 'o' || next === 'O') {\n raw += this._advance() + this._advance();\n while (!this._eof() && this._ch() >= '0' && this._ch() <= '7')\n raw += this._advance();\n return { type: 'INTEGER', value: raw, line, col };\n }\n if (next === 'b' || next === 'B') {\n raw += this._advance() + this._advance();\n while (!this._eof() && (this._ch() === '0' || this._ch() === '1'))\n raw += this._advance();\n return { type: 'INTEGER', value: raw, line, col };\n }\n }\n\n // Decimal digits\n while (!this._eof() && this._ch() >= '0' && this._ch() <= '9')\n raw += this._advance();\n\n let isFloat = false;\n if (!this._eof() && this._ch() === '.') {\n isFloat = true;\n raw += this._advance();\n while (!this._eof() && this._ch() >= '0' && this._ch() <= '9')\n raw += this._advance();\n }\n if (!this._eof() && (this._ch() === 'e' || this._ch() === 'E')) {\n isFloat = true;\n raw += this._advance();\n if (!this._eof() && (this._ch() === '+' || this._ch() === '-'))\n raw += this._advance();\n const expStart = raw.length;\n while (!this._eof() && this._ch() >= '0' && this._ch() <= '9')\n raw += this._advance();\n if (raw.length === expStart)\n this._fail(\n `float exponent has no digits: ${JSON.stringify(raw)}`,\n line,\n col\n );\n }\n\n // Encoding-indicator suffix _0–_7 / _i (no whitespace, not followed by more ident chars)\n if (this._ch() === '_') {\n const d = this.input[this.pos + 1] ?? '';\n const after = this.input[this.pos + 2] ?? '';\n if (\n (d === '0' ||\n d === '1' ||\n d === '2' ||\n d === '3' ||\n d === '4' ||\n d === '5' ||\n d === '6' ||\n d === '7' ||\n d === 'i') &&\n !/[0-9a-zA-Z_]/.test(after)\n ) {\n // Include the suffix in the raw value.\n // isFloat is NOT set here — a float is only a float when it contains\n // '.' or 'e'/'E'. The parser extracts encoding width from the suffix.\n raw += this._advance() + this._advance();\n }\n }\n\n return { type: isFloat ? 'FLOAT' : 'INTEGER', value: raw, line, col };\n }\n\n private _readIdent(\n line: number,\n col: number\n ): Omit<Token, 'raw' | 'offset' | 'endOffset'> {\n let ident = '';\n while (!this._eof() && /[a-zA-Z0-9_]/.test(this._ch()))\n ident += this._advance();\n\n // Known keywords — checked first so they are never shadowed by app-strings.\n switch (ident) {\n case 'true':\n return { type: 'TRUE', value: ident, line, col };\n case 'false':\n return { type: 'FALSE', value: ident, line, col };\n case 'null':\n return { type: 'NULL', value: ident, line, col };\n case 'undefined':\n return { type: 'UNDEFINED', value: ident, line, col };\n case 'NaN':\n case 'NaN_0':\n case 'NaN_1':\n case 'NaN_2':\n case 'NaN_3':\n case 'NaN_4':\n case 'NaN_5':\n case 'NaN_6':\n case 'NaN_7':\n case 'NaN_i':\n case 'Infinity':\n case 'Infinity_0':\n case 'Infinity_1':\n case 'Infinity_2':\n case 'Infinity_3':\n case 'Infinity_4':\n case 'Infinity_5':\n case 'Infinity_6':\n case 'Infinity_7':\n case 'Infinity_i':\n return { type: 'FLOAT', value: ident, line, col };\n case 'simple':\n return { type: 'SIMPLE', value: ident, line, col };\n case '_':\n return { type: 'UNDERSCORE', value: '_', line, col };\n // Encoding indicators used in array/map/string/bytes contexts\n case '_0':\n return { type: 'ENCODING_INDICATOR', value: '0', line, col };\n case '_1':\n return { type: 'ENCODING_INDICATOR', value: '1', line, col };\n case '_2':\n return { type: 'ENCODING_INDICATOR', value: '2', line, col };\n case '_3':\n return { type: 'ENCODING_INDICATOR', value: '3', line, col };\n case '_4':\n return { type: 'ENCODING_INDICATOR', value: '4', line, col };\n case '_5':\n return { type: 'ENCODING_INDICATOR', value: '5', line, col };\n case '_6':\n return { type: 'ENCODING_INDICATOR', value: '6', line, col };\n case '_7':\n // _7 = AI 31 = indefinite-length; kept as ENCODING_INDICATOR so that\n // bare `_` (UNDERSCORE) and explicit `_7` stay distinguishable.\n return { type: 'ENCODING_INDICATOR', value: '7', line, col };\n case '_i':\n return { type: 'ENCODING_INDICATOR', value: 'i', line, col };\n }\n\n // Byte-string prefixes or app-string extensions.\n // App-prefix grammar (§3 of draft-ietf-cbor-edn-literals-25):\n // app-prefix = lcalpha *lcldh / ucalpha *ucldh\n // lcldh = lcalpha / DIGIT / \"-\"\n // ucldh = ucalpha / DIGIT / \"-\"\n // Mixed-case or underscore-containing idents are not valid app-prefixes.\n const firstChar = ident[0] ?? '';\n const isLower = firstChar >= 'a' && firstChar <= 'z';\n const isUpper = firstChar >= 'A' && firstChar <= 'Z';\n\n if (isLower || isUpper) {\n // Validate chars already consumed by the main loop (no underscore, correct case).\n const restAlreadyRead = ident.slice(1);\n const restValid = isLower\n ? /^[a-z0-9]*$/.test(restAlreadyRead)\n : /^[A-Z0-9]*$/.test(restAlreadyRead);\n\n if (restValid) {\n // Extend the prefix with any remaining lcldh / ucldh chars.\n // The main loop stops at '-', so we need to consume hyphen-segments here.\n while (!this._eof()) {\n const ch = this._ch();\n const validCh = isLower\n ? (ch >= 'a' && ch <= 'z') || (ch >= '0' && ch <= '9') || ch === '-'\n : (ch >= 'A' && ch <= 'Z') ||\n (ch >= '0' && ch <= '9') ||\n ch === '-';\n if (!validCh) break;\n ident += this._advance();\n }\n\n const q = this._ch();\n // Double quotes are not valid for app-string / byte-string prefixes.\n // app-string = app-prefix sqstr (sqstr uses single quotes only)\n if (q === '\"')\n this._fail(\n `\"${ident}\" prefix requires single quotes or backticks, not double quotes`,\n line,\n col\n );\n if (q === \"'\") {\n switch (ident) {\n case 'h': {\n const { value: hexVal, elided } =\n this._readHexByteContentElisionAware(q);\n return {\n type: elided ? 'BYTES_HEX_ELIDED' : 'BYTES_HEX',\n value: hexVal,\n line,\n col,\n };\n }\n case 'b64':\n return {\n type: 'BYTES_B64',\n value: this._readByteContent(q),\n line,\n col,\n };\n default:\n return {\n type: 'APP_STRING',\n appPrefix: ident,\n value: this._readStringContent(q),\n line,\n col,\n };\n }\n }\n\n // app-rstring: prefix followed by backtick raw string (§2.5.3 / app-rstring)\n if (q === '`') {\n const raw = this._readRawStringContent();\n switch (ident) {\n case 'h': {\n // §5.3.3: lblank + / / block comments + # line comments + ellipsis\n const { value: hexVal, elided } = this._processRawHexContent(\n raw,\n line,\n col\n );\n return {\n type: elided ? 'BYTES_HEX_ELIDED' : 'BYTES_HEX',\n value: hexVal,\n line,\n col,\n };\n }\n case 'b64':\n // §5.3.4: lblank + # line comments\n return {\n type: 'BYTES_B64',\n value: this._processRawB64Content(raw, line, col),\n line,\n col,\n };\n default:\n return {\n type: 'APP_STRING',\n appPrefix: ident,\n value: raw,\n line,\n col,\n };\n }\n }\n\n // App-sequence extension: prefix<<items...>>\n // The tokenizer consumes only prefix + \"<<\"; the parser reads items until \">>\".\n if (q === '<' && (this.input[this.pos + 1] ?? '') === '<') {\n this._advance();\n this._advance(); // <<\n return {\n type: 'APP_SEQUENCE',\n appPrefix: ident,\n value: '',\n line,\n col,\n };\n }\n }\n }\n\n this._fail(`unknown identifier ${JSON.stringify(ident)}`, line, col);\n }\n}\n","import type { ToCDNOptions, ToJSOptions, ToCBOROptions } from '../types';\nimport { CborItem } from './CborItem';\nimport { MT_BYTES } from '../cbor/constants';\nimport { writeHead, concat, type EncodingWidth } from '../cbor/encode';\nimport { serializeBytes } from '../cdn/serialize-utils';\n\n/** CBOR Major Type 2 — definite-length byte string. */\nexport class CborByteString extends CborItem {\n readonly indefiniteLength = false as const;\n readonly value: Uint8Array;\n /** Preferred EDN encoding for this byte string. */\n readonly ednEncoding: 'hex' | 'base64' | 'base64url' | 'base32' | 'base32hex';\n readonly encodingWidth: EncodingWidth | undefined;\n readonly ednSource: string | undefined;\n\n constructor(\n value: Uint8Array,\n options?: {\n ednEncoding?: 'hex' | 'base64' | 'base64url' | 'base32' | 'base32hex';\n encodingWidth?: EncodingWidth;\n ednSource?: string;\n }\n ) {\n super();\n this.value = value;\n this.ednEncoding = options?.ednEncoding ?? 'hex';\n this.encodingWidth = options?.encodingWidth;\n this.ednSource = options?.ednSource;\n }\n\n _toCBOR(_options?: ToCBOROptions): Uint8Array {\n return concat([\n writeHead(MT_BYTES, BigInt(this.value.length), this.encodingWidth),\n this.value,\n ]);\n }\n\n _toCDN(options: ToCDNOptions | undefined, _depth: number): string {\n const suffix =\n this.encodingWidth !== undefined ? `_${this.encodingWidth}` : '';\n if (options?.preserveByteString && this.ednSource !== undefined)\n return this.ednSource + suffix;\n let encoding = options?.bstrEncoding ?? this.ednEncoding;\n if (options?.appStrings === false && encoding !== 'hex') encoding = 'hex';\n return serializeBytes(this.value, encoding, options?.sqstr) + suffix;\n }\n\n _toJS(_options?: ToJSOptions): unknown {\n return this.value;\n }\n}\n","import type { ToCDNOptions, ToJSOptions, ToCBOROptions } from '../types';\nimport { CborItem } from './CborItem';\nimport type { AnnotatedLine } from './CborItem';\nimport type { CborByteString } from './CborByteString';\nimport { MT_BYTES, AI_INDEFINITE, BREAK_CODE } from '../cbor/constants';\nimport { concat } from '../cbor/encode';\n\n/** CBOR Major Type 2 — indefinite-length byte string (chunked). */\nexport class CborIndefiniteByteString extends CborItem {\n readonly indefiniteLength = true as const;\n readonly chunks: CborByteString[];\n\n constructor(chunks: CborByteString[]) {\n super();\n this.chunks = chunks;\n }\n\n _toCBOR(options?: ToCBOROptions): Uint8Array {\n const parts: Uint8Array[] = [\n new Uint8Array([(MT_BYTES << 5) | AI_INDEFINITE]),\n ];\n for (const chunk of this.chunks) parts.push(chunk._toCBOR(options));\n parts.push(new Uint8Array([BREAK_CODE]));\n return concat(parts);\n }\n\n _toCDN(options: ToCDNOptions | undefined, _depth: number): string {\n if (this.chunks.length === 0) return \"''_\";\n const chunkStrs = this.chunks.map((c) => c._toCDN(options, 0));\n return `(_ ${chunkStrs.join(', ')})`;\n }\n\n override _toHexDump(depth: number, options?: ToCDNOptions): AnnotatedLine[] {\n const byteHex = (b: number) =>\n b.toString(16).toUpperCase().padStart(2, '0');\n const lines: AnnotatedLine[] = [\n {\n depth,\n hex: byteHex((MT_BYTES << 5) | AI_INDEFINITE),\n comment: 'Start indefinite-length byte string',\n },\n ];\n for (const chunk of this.chunks)\n lines.push(...chunk._toHexDump(depth + 1, options));\n lines.push({ depth, hex: byteHex(BREAK_CODE), comment: '\"break\"' });\n return lines;\n }\n\n _toJS(_options?: ToJSOptions): unknown {\n const totalLen = this.chunks.reduce((sum, c) => sum + c.value.length, 0);\n const result = new Uint8Array(totalLen);\n let offset = 0;\n for (const chunk of this.chunks) {\n result.set(chunk.value, offset);\n offset += chunk.value.length;\n }\n return result;\n }\n}\n","import type { ToCDNOptions, ToJSOptions, ToCBOROptions } from '../types';\nimport { CborItem } from './CborItem';\nimport type { AnnotatedLine } from './CborItem';\nimport type { CborTextString } from './CborTextString';\nimport { MT_TEXT, AI_INDEFINITE, BREAK_CODE } from '../cbor/constants';\nimport { concat } from '../cbor/encode';\n\n/** CBOR Major Type 3 — indefinite-length UTF-8 text string (chunked). */\nexport class CborIndefiniteTextString extends CborItem {\n readonly indefiniteLength = true as const;\n readonly chunks: CborTextString[];\n\n constructor(chunks: CborTextString[]) {\n super();\n this.chunks = chunks;\n }\n\n _toCBOR(options?: ToCBOROptions): Uint8Array {\n const parts: Uint8Array[] = [\n new Uint8Array([(MT_TEXT << 5) | AI_INDEFINITE]),\n ];\n for (const chunk of this.chunks) parts.push(chunk._toCBOR(options));\n parts.push(new Uint8Array([BREAK_CODE]));\n return concat(parts);\n }\n\n _toCDN(options: ToCDNOptions | undefined, _depth: number): string {\n if (this.chunks.length === 0) return '\"\"_';\n const chunkStrs = this.chunks.map((c) => c._toCDN(options, 0));\n return `(_ ${chunkStrs.join(', ')})`;\n }\n\n override _toHexDump(depth: number, options?: ToCDNOptions): AnnotatedLine[] {\n const byteHex = (b: number) =>\n b.toString(16).toUpperCase().padStart(2, '0');\n const lines: AnnotatedLine[] = [\n {\n depth,\n hex: byteHex((MT_TEXT << 5) | AI_INDEFINITE),\n comment: 'Start indefinite-length text string',\n },\n ];\n for (const chunk of this.chunks)\n lines.push(...chunk._toHexDump(depth + 1, options));\n lines.push({ depth, hex: byteHex(BREAK_CODE), comment: '\"break\"' });\n return lines;\n }\n\n _toJS(_options?: ToJSOptions): unknown {\n return this.chunks.map((c) => c.value).join('');\n }\n}\n","import type { ToCDNOptions, ToJSOptions, ToCBOROptions } from '../types';\nimport { CBOR_OMIT } from '../types';\nimport { CborItem } from './CborItem';\nimport type { AnnotatedLine } from './CborItem';\nimport { MT_ARRAY, AI_INDEFINITE, BREAK_CODE } from '../cbor/constants';\nimport { writeHead, concat, type EncodingWidth } from '../cbor/encode';\nimport {\n resolveIndent,\n indentOf,\n resolveSeparators,\n formatDanglingComments,\n formatLeadingComments,\n formatTrailingComments,\n hasContainerLayoutComments,\n hasPreservedComments,\n} from '../cdn/serialize-utils';\n\n/** CBOR Major Type 4 — array (definite- or indefinite-length). */\nexport class CborArray extends CborItem {\n readonly items: CborItem[];\n readonly indefiniteLength: boolean;\n readonly encodingWidth: EncodingWidth | undefined;\n\n constructor(\n items: CborItem[],\n options?: { indefiniteLength?: boolean; encodingWidth?: EncodingWidth }\n ) {\n super();\n this.items = items;\n this.indefiniteLength = options?.indefiniteLength ?? false;\n this.encodingWidth = options?.encodingWidth;\n }\n\n _toCBOR(options?: ToCBOROptions): Uint8Array {\n if (this.indefiniteLength) {\n const parts: Uint8Array[] = [\n new Uint8Array([(MT_ARRAY << 5) | AI_INDEFINITE]),\n ];\n for (const item of this.items) parts.push(item._toCBOR(options));\n parts.push(new Uint8Array([BREAK_CODE]));\n return concat(parts);\n }\n const parts = [\n writeHead(MT_ARRAY, BigInt(this.items.length), this.encodingWidth),\n ];\n for (const item of this.items) parts.push(item._toCBOR(options));\n return concat(parts);\n }\n\n override _toCDN(options: ToCDNOptions | undefined, depth: number): string {\n let indentStr = resolveIndent(options);\n const preserveComments = options?.preserveComments;\n const commentStyle =\n typeof preserveComments === 'string' ? preserveComments : undefined;\n const hasComments =\n preserveComments &&\n (hasContainerLayoutComments(this) ||\n this.items.some(hasPreservedComments));\n if (indentStr === null && hasComments) indentStr = ' ';\n const { inlineSep, multilineSep, trailSep } = resolveSeparators(\n options,\n indentStr === null\n );\n const eiSuffix =\n !this.indefiniteLength && this.encodingWidth !== undefined\n ? `_${this.encodingWidth} `\n : '';\n\n if (indentStr === null || (this.items.length === 0 && !hasComments)) {\n // single-line\n const inner = this.items\n .map((item) => item._toCDN(options, depth + 1))\n .join(inlineSep);\n if (this.indefiniteLength) {\n return this.items.length === 0 ? '[_ ]' : `[_ ${inner}]`;\n }\n return `[${eiSuffix}${inner}]`;\n }\n\n // multi-line\n const childIndent = indentOf(indentStr, depth + 1);\n const closeIndent = indentOf(indentStr, depth);\n const open = this.indefiniteLength ? '[_ ' : `[${eiSuffix}`;\n const lines: string[] = [];\n for (let i = 0; i < this.items.length; i++) {\n const item = this.items[i];\n if (preserveComments)\n lines.push(...formatLeadingComments(item, childIndent, commentStyle));\n const sep = i < this.items.length - 1 ? multilineSep : trailSep;\n lines.push(\n `${childIndent}${item._toCDN(options, depth + 1)}${sep}${preserveComments ? formatTrailingComments(item, commentStyle) : ''}`\n );\n }\n if (preserveComments)\n lines.push(...formatDanglingComments(this, childIndent, commentStyle));\n const body = lines.join('\\n');\n return `${open}\\n${body}\\n${closeIndent}]`;\n }\n\n override _toHexDump(depth: number, options?: ToCDNOptions): AnnotatedLine[] {\n const byteHex = (b: number) =>\n b.toString(16).toUpperCase().padStart(2, '0');\n const toHex = (bytes: Uint8Array) =>\n Array.from(bytes, (b) =>\n b.toString(16).toUpperCase().padStart(2, '0')\n ).join(' ');\n\n if (this.indefiniteLength) {\n const lines: AnnotatedLine[] = [\n {\n depth,\n hex: byteHex((MT_ARRAY << 5) | AI_INDEFINITE),\n comment: 'Start indefinite-length array',\n },\n ];\n for (const item of this.items)\n lines.push(...item._toHexDump(depth + 1, options));\n lines.push({ depth, hex: byteHex(BREAK_CODE), comment: '\"break\"' });\n return lines;\n }\n const lines: AnnotatedLine[] = [\n {\n depth,\n hex: toHex(\n writeHead(MT_ARRAY, BigInt(this.items.length), this.encodingWidth)\n ),\n comment: `Array of length ${this.items.length}`,\n },\n ];\n for (const item of this.items)\n lines.push(...item._toHexDump(depth + 1, options));\n return lines;\n }\n\n _toJS(options?: ToJSOptions): unknown {\n const reviver = options?.reviver;\n if (!reviver) return this.items.map((item) => item._toJS(options));\n // First pass: pre-populate holder with unrevived values so later siblings\n // are still raw when earlier callbacks run (matches JSON.parse sibling timing).\n const optNoReviver = options\n ? { ...options, reviver: undefined }\n : undefined;\n const holder: unknown[] = this.items.map((item) =>\n item._toJS(optNoReviver)\n );\n // Second pass: revive each element depth-first, splice out undefined entries\n // immediately so `this` reflects the compacted in-progress array.\n // Original indices are used as reviver keys; undefined → omit (compact,\n // differs from JSON.parse which leaves holes).\n let deleted = 0;\n for (let i = 0; i < this.items.length; i++) {\n const hIdx = i - deleted;\n const val = this.items[i]._toJS(options);\n const rv = reviver.call(holder, String(i), val);\n const omit =\n rv === CBOR_OMIT || (options?.undefinedOmits && rv === undefined);\n if (omit) {\n holder.splice(hIdx, 1);\n deleted++;\n } else {\n holder[hIdx] = rv;\n }\n }\n return holder;\n }\n}\n","import type {\n CborComment,\n ToCDNOptions,\n ToJSOptions,\n ToCBOROptions,\n} from '../types';\nimport { CBOR_OMIT } from '../types';\nimport { MapEntries } from '../mapEntries';\nimport { CborItem } from './CborItem';\nimport type { AnnotatedLine } from './CborItem';\nimport { CborTextString } from './CborTextString';\nimport { MT_MAP, AI_INDEFINITE, BREAK_CODE } from '../cbor/constants';\nimport { writeHead, concat, type EncodingWidth } from '../cbor/encode';\nimport {\n resolveIndent,\n indentOf,\n resolveSeparators,\n convertCommentText,\n formatDanglingComments,\n formatLeadingComments,\n hasContainerLayoutComments,\n hasPreservedComments,\n} from '../cdn/serialize-utils';\n\n/** CBOR Major Type 5 — map (definite- or indefinite-length). */\nexport class CborMap extends CborItem {\n readonly entries: [CborItem, CborItem][];\n readonly indefiniteLength: boolean;\n readonly encodingWidth: EncodingWidth | undefined;\n\n constructor(\n entries: [CborItem, CborItem][],\n options?: { indefiniteLength?: boolean; encodingWidth?: EncodingWidth }\n ) {\n super();\n this.entries = entries;\n this.indefiniteLength = options?.indefiniteLength ?? false;\n this.encodingWidth = options?.encodingWidth;\n }\n\n _toCBOR(options?: ToCBOROptions): Uint8Array {\n if (this.indefiniteLength) {\n const parts: Uint8Array[] = [\n new Uint8Array([(MT_MAP << 5) | AI_INDEFINITE]),\n ];\n for (const [k, v] of this.entries) {\n parts.push(k._toCBOR(options), v._toCBOR(options));\n }\n parts.push(new Uint8Array([BREAK_CODE]));\n return concat(parts);\n }\n const parts = [\n writeHead(MT_MAP, BigInt(this.entries.length), this.encodingWidth),\n ];\n for (const [k, v] of this.entries) {\n parts.push(k._toCBOR(options), v._toCBOR(options));\n }\n return concat(parts);\n }\n\n override _toCDN(options: ToCDNOptions | undefined, depth: number): string {\n let indentStr = resolveIndent(options);\n const preserveComments = options?.preserveComments;\n const commentStyle =\n typeof preserveComments === 'string' ? preserveComments : undefined;\n const hasComments =\n preserveComments &&\n (hasContainerLayoutComments(this) ||\n this.entries.some(\n ([key, value]) =>\n hasPreservedComments(key) || hasPreservedComments(value)\n ));\n if (indentStr === null && hasComments) indentStr = ' ';\n const { inlineSep, multilineSep, trailSep, colSep } = resolveSeparators(\n options,\n indentStr === null\n );\n const eiSuffix =\n !this.indefiniteLength && this.encodingWidth !== undefined\n ? `_${this.encodingWidth} `\n : '';\n const open = this.indefiniteLength ? '{_ ' : `{${eiSuffix}`;\n\n if (indentStr === null || (this.entries.length === 0 && !hasComments)) {\n // single-line\n const inner = this.entries\n .map(\n ([k, v]) =>\n `${k._toCDN(options, depth + 1)}${colSep}${v._toCDN(options, depth + 1)}`\n )\n .join(inlineSep);\n if (this.indefiniteLength) {\n return this.entries.length === 0 ? '{_ }' : `{_ ${inner}}`;\n }\n return `{${eiSuffix}${inner}}`;\n }\n\n // multi-line\n const childIndent = indentOf(indentStr, depth + 1);\n const closeIndent = indentOf(indentStr, depth);\n const lines: string[] = [];\n for (let i = 0; i < this.entries.length; i++) {\n const [k, v] = this.entries[i];\n if (preserveComments) {\n lines.push(...formatLeadingComments(k, childIndent, commentStyle));\n }\n const sep = i < this.entries.length - 1 ? multilineSep : trailSep;\n const entryComments = preserveComments\n ? formatMapEntryTrailingComments(\n [\n ...(k.comments?.trailing ?? []),\n ...(v.comments?.leading ?? []),\n ...(v.comments?.trailing ?? []),\n ],\n commentStyle\n )\n : '';\n lines.push(\n `${childIndent}${k._toCDN(options, depth + 1)}${colSep}${v._toCDN(options, depth + 1)}${sep}${entryComments}`\n );\n }\n if (preserveComments)\n lines.push(...formatDanglingComments(this, childIndent, commentStyle));\n const body = lines.join('\\n');\n return `${open}\\n${body}\\n${closeIndent}}`;\n }\n\n override _toHexDump(depth: number, options?: ToCDNOptions): AnnotatedLine[] {\n const byteHex = (b: number) =>\n b.toString(16).toUpperCase().padStart(2, '0');\n const toHex = (bytes: Uint8Array) =>\n Array.from(bytes, (b) =>\n b.toString(16).toUpperCase().padStart(2, '0')\n ).join(' ');\n\n if (this.indefiniteLength) {\n const lines: AnnotatedLine[] = [\n {\n depth,\n hex: byteHex((MT_MAP << 5) | AI_INDEFINITE),\n comment: 'Start indefinite-length map',\n },\n ];\n for (const [k, v] of this.entries) {\n lines.push(...k._toHexDump(depth + 1, options));\n lines.push(...v._toHexDump(depth + 1, options));\n }\n lines.push({ depth, hex: byteHex(BREAK_CODE), comment: '\"break\"' });\n return lines;\n }\n const lines: AnnotatedLine[] = [\n {\n depth,\n hex: toHex(\n writeHead(MT_MAP, BigInt(this.entries.length), this.encodingWidth)\n ),\n comment: `Map of length ${this.entries.length}`,\n },\n ];\n for (const [k, v] of this.entries) {\n lines.push(...k._toHexDump(depth + 1, options));\n lines.push(...v._toHexDump(depth + 1, options));\n }\n return lines;\n }\n\n _toJS(options?: ToJSOptions): unknown {\n const reviver = options?.reviver;\n const toEntries = () => {\n const result = MapEntries.from(\n this.entries,\n ([k, v]) => [k._toJS(options), v._toJS(options)] as [unknown, unknown]\n );\n if (!reviver) return result;\n const uOmits = options?.undefinedOmits;\n for (let i = 0; i < result.length; i++) {\n const [k, v] = result[i];\n const rv = reviver.call(result, k, v);\n if (rv === CBOR_OMIT || (uOmits && rv === undefined))\n result.splice(i--, 1);\n else result[i] = [k, rv];\n }\n return result;\n };\n const toObject = () => {\n // First pass: pre-populate holder with unrevived values so all sibling\n // keys are visible in `this` when reviver runs (matches JSON.parse).\n const optNoReviver = options\n ? { ...options, reviver: undefined }\n : undefined;\n const holder: Record<string, unknown> = {};\n for (const [k, v] of this.entries) {\n const key = k instanceof CborTextString ? k.value : k.toCDN();\n const raw = v._toJS(optNoReviver);\n if (key === '__proto__') {\n Object.defineProperty(holder, key, {\n value: raw,\n writable: true,\n enumerable: true,\n configurable: true,\n });\n } else {\n holder[key] = raw;\n }\n }\n if (!reviver) return holder;\n // Second pass: process each property sequentially depth-first.\n // Only the last occurrence of each key is revived to avoid duplicate\n // callbacks when CBOR maps contain repeated keys.\n const lastIdx = new Map<string, number>();\n for (let i = 0; i < this.entries.length; i++) {\n const [k] = this.entries[i];\n lastIdx.set(k instanceof CborTextString ? k.value : k.toCDN(), i);\n }\n for (let i = 0; i < this.entries.length; i++) {\n const [k, v] = this.entries[i];\n const key = k instanceof CborTextString ? k.value : k.toCDN();\n if (lastIdx.get(key) !== i) continue;\n const val = v._toJS(options);\n const rv = reviver.call(holder, key, val);\n const omit =\n rv === CBOR_OMIT || (options?.undefinedOmits && rv === undefined);\n if (!omit) {\n if (key === '__proto__') {\n Object.defineProperty(holder, key, {\n value: rv,\n writable: true,\n enumerable: true,\n configurable: true,\n });\n } else {\n holder[key] = rv;\n }\n } else {\n delete holder[key];\n }\n }\n return holder;\n };\n\n if (options?.mapAs === 'entries') return toEntries();\n if (options?.mapAs === 'object') return toObject();\n if (this.entries.every(([k]) => k instanceof CborTextString))\n return toObject();\n return toEntries();\n }\n}\n\nfunction formatMapEntryTrailingComments(\n comments: CborComment[],\n style?: 'c-style' | 'cdn-style'\n): string {\n if (comments.length === 0) return '';\n return (\n ' ' +\n comments\n .map((comment) => convertCommentText(comment, style).trimEnd())\n .join(' ')\n );\n}\n","import type { ToCDNOptions, ToJSOptions, ToCBOROptions } from '../types';\nimport { CborItem } from './CborItem';\nimport { Simple } from '../simple';\nimport { MT_SIMPLE, AI_1BYTE } from '../cbor/constants';\n\n/**\n * CBOR Major Type 7 — simple value (0–255).\n *\n * Well-known values:\n * 20 → false\n * 21 → true\n * 22 → null\n * 23 → undefined\n */\nexport class CborSimple extends CborItem {\n readonly value: number;\n\n constructor(value: number) {\n super();\n if (!Number.isInteger(value) || value < 0 || value > 255)\n throw new RangeError('CborSimple value must be an integer in 0–255');\n this.value = value;\n }\n\n static readonly FALSE = new CborSimple(20);\n static readonly TRUE = new CborSimple(21);\n static readonly NULL = new CborSimple(22);\n static readonly UNDEFINED = new CborSimple(23);\n\n _toCBOR(_options?: ToCBOROptions): Uint8Array {\n // Values 0–23: encoded in the initial byte (MT7 | value)\n if (this.value <= 23)\n return new Uint8Array([(MT_SIMPLE << 5) | this.value]);\n // Values 24–255: MT7, AI_1BYTE, then one value byte\n return new Uint8Array([(MT_SIMPLE << 5) | AI_1BYTE, this.value]);\n }\n\n _toCDN(_options: ToCDNOptions | undefined, _depth: number): string {\n switch (this.value) {\n case 20:\n return 'false';\n case 21:\n return 'true';\n case 22:\n return 'null';\n case 23:\n return 'undefined';\n default:\n return `simple(${this.value})`;\n }\n }\n\n _toJS(_options?: ToJSOptions): unknown {\n switch (this.value) {\n case 20:\n return false;\n case 21:\n return true;\n case 22:\n return null;\n case 23:\n return undefined;\n default:\n return new Simple(this.value);\n }\n }\n}\n","import type { ToCDNOptions, ToJSOptions, ToCBOROptions } from '../types';\nimport { CborItem } from './CborItem';\nimport type { AnnotatedLine } from './CborItem';\nimport { MT_BYTES } from '../cbor/constants';\nimport { writeHead, concat } from '../cbor/encode';\nimport {\n resolveIndent,\n indentOf,\n resolveSeparators,\n} from '../cdn/serialize-utils';\n\n/**\n * CBOR Sequence Literal (§2.5.6) — `<<item, item, ...>>`.\n *\n * Encodes as a definite-length byte string whose value is the concatenation\n * of the CBOR encodings of the contained items.\n *\n * @example\n * // <<1, 2>> → h'0102'\n * new CborEmbeddedCBOR([new CborUint(1n), new CborUint(2n)])\n */\nexport class CborEmbeddedCBOR extends CborItem {\n readonly items: CborItem[];\n\n constructor(items: CborItem[]) {\n super();\n this.items = items;\n }\n\n /** The raw concatenated CBOR bytes of all contained items. */\n private _content(options?: ToCBOROptions): Uint8Array {\n return concat(this.items.map((item) => item._toCBOR(options)));\n }\n\n _toCBOR(options?: ToCBOROptions): Uint8Array {\n const content = this._content(options);\n return concat([writeHead(MT_BYTES, BigInt(content.length)), content]);\n }\n\n override _toCDN(options: ToCDNOptions | undefined, depth: number): string {\n if (this.items.length === 0) return '<<>>';\n\n const indentStr = resolveIndent(options);\n const { inlineSep, multilineSep, trailSep } = resolveSeparators(\n options,\n indentStr === null\n );\n\n if (indentStr === null) {\n // single-line\n const inner = this.items\n .map((item) => item._toCDN(options, depth + 1))\n .join(inlineSep);\n return `<<${inner}>>`;\n }\n\n // multi-line\n const childIndent = indentOf(indentStr, depth + 1);\n const closeIndent = indentOf(indentStr, depth);\n const lines = this.items.map(\n (item) => `${childIndent}${item._toCDN(options, depth + 1)}`\n );\n const lastIdx = lines.length - 1;\n const body = lines\n .map((line, i) =>\n i < lastIdx ? `${line}${multilineSep}` : `${line}${trailSep}`\n )\n .join('\\n');\n return `<<\\n${body}\\n${closeIndent}>>`;\n }\n\n override _toHexDump(depth: number, options?: ToCDNOptions): AnnotatedLine[] {\n const toHex = (bytes: Uint8Array) =>\n Array.from(bytes, (b) =>\n b.toString(16).toUpperCase().padStart(2, '0')\n ).join(' ');\n\n const content = this._content();\n const n = content.length;\n const lines: AnnotatedLine[] = [\n {\n depth,\n hex: toHex(writeHead(MT_BYTES, BigInt(n))),\n comment: `Embedded CBOR sequence, ${n} byte${n !== 1 ? 's' : ''}`,\n },\n ];\n for (const item of this.items) {\n lines.push(...item._toHexDump(depth + 1, options));\n }\n return lines;\n }\n\n _toJS(_options?: ToJSOptions): unknown {\n return this._content();\n }\n}\n","/**\n * §4.1 of draft-ietf-cbor-edn-literals-25 — Stand-in for unknown app-extensions.\n *\n * When the CDN parser encounters an unrecognised application-extension\n * identifier (the default `unresolvedExtension: 'cpa999'` behaviour), it wraps\n * the literal in a CPA999 tag instead of throwing a SyntaxError.\n *\n * Structure:\n * CPA999([<prefix>, [<content-items...>]])\n *\n * Examples:\n * cri'https://example.com' → CPA999([\"cri\", [\"https://example.com\"]])\n * hash<<\"data\", -44>> → CPA999([\"hash\", [\"data\", -44]])\n *\n * toCDN() reconstructs the original app-string / app-sequence notation:\n * CPA999([\"cri\", [\"https://example.com\"]]) → cri'https://example.com'\n * CPA999([\"hash\", [\"data\", -44]]) → hash<<\"data\", -44>>\n *\n * Note: CPA999 is a provisional tag number (CPA = Code Point Allocation).\n * It will be replaced by an IANA-assigned tag number upon RFC publication.\n */\n\nimport type { ToCDNOptions } from '../types';\nimport { CborTag } from './CborTag';\nimport { CborArray } from './CborArray';\nimport { CborTextString } from './CborTextString';\nimport type { CborItem } from './CborItem';\nimport { escapeAppString } from '../cdn/serialize-utils';\n\n/** Provisional tag number for the Unresolved Application-Extension stand-in. */\nexport const CPA999_TAG = 999n;\n\n/**\n * Stand-in for an unrecognised EDN application-extension literal.\n *\n * Structure:\n * App-string: CPA999([prefix, text])\n * App-sequence: CPA999([prefix, [items...]])\n */\nexport class CborUnresolvedAppExt extends CborTag {\n constructor(prefix: string, items: CborItem[]) {\n // App-string: single text item → tag(999, [prefix, text])\n // App-sequence: otherwise → tag(999, [prefix, [items...]])\n const content =\n items.length === 1 && items[0] instanceof CborTextString\n ? items[0]\n : new CborArray(items);\n super(CPA999_TAG, new CborArray([new CborTextString(prefix), content]));\n }\n\n override _toCDN(options: ToCDNOptions | undefined, depth: number): string {\n if (options?.appStrings === false) return super._toCDN(options, depth);\n\n const arr = this.content as CborArray;\n const prefix = (arr.items[0] as CborTextString).value;\n const contentItem = arr.items[1];\n\n // Text string → reconstruct app-string form: prefix'content'\n if (contentItem instanceof CborTextString) {\n return `${prefix}${escapeAppString(contentItem.value)}`;\n }\n\n // Array → reconstruct app-sequence form: prefix<<item, item, ...>>\n const contentArr = contentItem as CborArray;\n const inner = contentArr.items\n .map((item) => item._toCDN(options, depth))\n .join(', ');\n return `${prefix}<<${inner}>>`;\n }\n}\n","import type { ToCDNOptions, ToCBOROptions, ToJSOptions } from '../types';\nimport { CborItem } from './CborItem';\n\n/**\n * Wraps a resolved app-sequence result and preserves the original EDN source\n * text for round-trip fidelity.\n *\n * When `appStrings !== false`, `_toCDN` returns the stored source text verbatim.\n * Otherwise it delegates to the wrapped item so the caller gets a plain value.\n *\n * CBOR encoding and JS conversion always delegate to the inner item so the\n * wrapper is fully transparent for those operations.\n */\nexport class CborAppSeqResult extends CborItem {\n constructor(\n readonly inner: CborItem,\n readonly ednSource: string\n ) {\n super();\n }\n\n _toCBOR(options?: ToCBOROptions): Uint8Array {\n return this.inner._toCBOR(options);\n }\n\n _toCDN(options: ToCDNOptions | undefined, depth: number): string {\n if (options?.appStrings !== false) return this.ednSource;\n return this.inner._toCDN(options, depth);\n }\n\n _toJS(options?: ToJSOptions): unknown {\n return this.inner._toJS(options);\n }\n}\n","/**\n * §4.2 of draft-ietf-cbor-edn-literals-25 — Ellipsis (Elision) tag.\n *\n * Two forms:\n * 888(null) — subtree elision: a whole data item replaced by ...\n * 888([frag, 888(null), frag, ...])\n * — string/bytes elision: fragments alternating with ellipses\n *\n * Note: CPA888 is a provisional tag number.\n */\n\nimport type { ToCDNOptions } from '../types';\nimport { CborTag } from './CborTag';\nimport { CborArray } from './CborArray';\nimport { CborSimple } from './CborSimple';\nimport type { CborItem } from './CborItem';\n\nexport const CPA888_TAG = 888n;\n\nexport class CborEllipsis extends CborTag {\n /** Subtree elision: 888(null) */\n constructor();\n /** String/bytes elision: 888([items...]) */\n constructor(items: CborItem[]);\n constructor(items?: CborItem[]) {\n if (items === undefined) {\n super(CPA888_TAG, CborSimple.NULL);\n } else {\n super(CPA888_TAG, new CborArray(items));\n }\n }\n\n override _toCDN(options: ToCDNOptions | undefined, depth: number): string {\n if (this.content instanceof CborSimple) {\n // Subtree elision → \"...\"\n return '...';\n }\n if (this.content instanceof CborArray) {\n // String/bytes elision → frag + ... + frag\n return this.content.items\n .map((item) => item._toCDN(options, depth))\n .join(' + ');\n }\n return super._toCDN(options, depth);\n }\n}\n","/**\n * CBOR bignum tags (RFC 8949 §3.4.3).\n *\n * Tag 2 — unsigned bignum: tag(2, bstr) where bstr is the big-endian\n * encoding of a non-negative integer.\n * Tag 3 — negative bignum: tag(3, bstr) where the value = -1 - unsigned(bstr).\n *\n * These classes are used for integers that fall outside the uint64 / nint64\n * range of CBOR major types 0 and 1:\n * CborBigUint — value ≥ 2^64\n * CborBigNint — value ≤ -(2^64 + 1)\n *\n * toCDN() emits the plain decimal form (e.g. \"18446744073709551616\") so that\n * round-trips through EDN text are human-readable.\n */\n\nimport type { ToCDNOptions, ToJSOptions } from '../types';\nimport { CborTag } from './CborTag';\nimport { CborByteString } from './CborByteString';\n\nexport const BIGNUM_UINT_TAG = 2n;\nexport const BIGNUM_NINT_TAG = 3n;\n\nconst UINT64_MAX = 0xffff_ffff_ffff_ffffn;\nconst NINT64_MIN = -(UINT64_MAX + 1n); // -18446744073709551616n\n\n// ─── Bigint ↔ bytes helpers ───────────────────────────────────────────────────\n\n/**\n * Encode a non-negative bigint as a minimal big-endian byte string.\n * Zero is encoded as the empty byte string per RFC 8949 §3.4.3.\n */\nexport function bigintToBytes(n: bigint): Uint8Array {\n if (n < 0n)\n throw new RangeError('bigintToBytes requires a non-negative value');\n if (n === 0n) return new Uint8Array(0);\n let hex = n.toString(16);\n if (hex.length % 2 !== 0) hex = '0' + hex;\n const bytes = new Uint8Array(hex.length / 2);\n for (let i = 0; i < bytes.length; i++)\n bytes[i] = parseInt(hex.slice(i * 2, i * 2 + 2), 16);\n return bytes;\n}\n\n/**\n * Decode a big-endian byte string to a non-negative bigint.\n * Empty bytes → 0n.\n */\nexport function bytesToBigint(bytes: Uint8Array): bigint {\n let n = 0n;\n for (const b of bytes) n = (n << 8n) | BigInt(b);\n return n;\n}\n\n// ─── AST nodes ────────────────────────────────────────────────────────────────\n\n/**\n * Unsigned bignum — integers ≥ 2^64.\n * Wire format: tag(2, big-endian byte string).\n * toCDN() emits the plain decimal integer.\n */\nexport class CborBigUint extends CborTag {\n readonly bigValue: bigint;\n\n constructor(value: bigint) {\n if (value <= UINT64_MAX)\n throw new RangeError(\n `CborBigUint value ${value} fits in CborUint; use CborUint instead`\n );\n super(BIGNUM_UINT_TAG, new CborByteString(bigintToBytes(value)));\n this.bigValue = value;\n }\n\n override _toCDN(_options: ToCDNOptions | undefined, _depth: number): string {\n return this.bigValue.toString();\n }\n\n override _toJS(_options?: ToJSOptions): bigint {\n return this.bigValue;\n }\n}\n\n/**\n * Negative bignum — integers ≤ -(2^64 + 1).\n * Wire format: tag(3, big-endian byte string of (-1 - value)).\n * toCDN() emits the plain decimal integer.\n */\nexport class CborBigNint extends CborTag {\n readonly bigValue: bigint;\n\n constructor(value: bigint) {\n if (value >= NINT64_MIN)\n throw new RangeError(\n `CborBigNint value ${value} fits in CborNint; use CborNint instead`\n );\n super(BIGNUM_NINT_TAG, new CborByteString(bigintToBytes(-1n - value)));\n this.bigValue = value;\n }\n\n override _toCDN(_options: ToCDNOptions | undefined, _depth: number): string {\n return this.bigValue.toString();\n }\n\n override _toJS(_options?: ToJSOptions): bigint {\n return this.bigValue;\n }\n}\n","import {\n Tokenizer,\n type EdnComment,\n type Token,\n type TokenType,\n} from './tokenizer';\nimport type { CborItem } from '../ast/CborItem';\nimport type {\n CborComment,\n FromCDNOptions,\n CborExtension,\n ParseWarning,\n} from '../types';\nimport { CborUint } from '../ast/CborUint';\nimport { CborNint } from '../ast/CborNint';\nimport { CborByteString } from '../ast/CborByteString';\nimport { CborIndefiniteByteString } from '../ast/CborIndefiniteByteString';\nimport { CborTextString } from '../ast/CborTextString';\nimport { CborIndefiniteTextString } from '../ast/CborIndefiniteTextString';\nimport { CborArray } from '../ast/CborArray';\nimport { CborMap } from '../ast/CborMap';\nimport { CborTag } from '../ast/CborTag';\nimport { CborFloat, type FloatPrecision } from '../ast/CborFloat';\nimport { CborSimple } from '../ast/CborSimple';\nimport { CborEmbeddedCBOR } from '../ast/CborEmbeddedCBOR';\nimport type { EncodingWidth } from '../cbor/encode';\nimport { parseHexFloat } from '../utils/hexfloat';\nimport { float64ToFloat16Bits, float16BitsToFloat64 } from '../utils/float16';\nimport { BUILTIN_EXTENSIONS } from '../extensions/builtins';\nimport { CborUnresolvedAppExt } from '../ast/CborUnresolvedAppExt';\nimport { CborAppSeqResult } from '../ast/CborAppSeqResult';\nimport { CborEllipsis } from '../ast/CborEllipsis';\nimport { CborBigUint, CborBigNint } from '../ast/CborBignum';\n\n// ─── Public entry point ───────────────────────────────────────────────────────\n\n/**\n * Parse a CDN text string into a CborItem AST node.\n * Throws SyntaxError on invalid input.\n */\nexport function parseCDN(text: string, options?: FromCDNOptions): CborItem {\n const tokenizer = new Tokenizer(text, { offset: options?.offset });\n const parser = new CDNParser(tokenizer, options ?? {});\n const node = parser.parse();\n if (options?.preserveComments) attachComments(node, tokenizer.comments, text);\n return node;\n}\n\n// ─── Value helpers ────────────────────────────────────────────────────────────\n\n/** Strip an optional _0/_1/_2/_3/_i encoding-indicator suffix from a raw\n * integer token value and return both the numeric string and the width. */\nfunction parseIntegerRaw(raw: string): {\n numStr: string;\n rawSuffix: string | undefined;\n} {\n let numStr = raw;\n let rawSuffix: string | undefined;\n if (/[_][0-7i]$/.test(raw)) {\n rawSuffix = raw[raw.length - 1]!;\n numStr = raw.slice(0, -2);\n }\n return { numStr, rawSuffix };\n}\n\nfunction parseBigInt(raw: string): bigint {\n if (raw.startsWith('-')) return -BigInt(raw.slice(1));\n return BigInt(raw);\n}\n\nfunction parseFloatToken(\n raw: string,\n onRecoverableError?: (msg: string) => void\n): {\n value: number;\n precision: FloatPrecision | undefined;\n} {\n // Strip any invalid encoding indicator first, before NaN/Infinity checks,\n // so that e.g. \"NaN_7\" still resolves to NaN after the suffix is removed.\n if (raw.endsWith('_i') || raw.endsWith('_0')) {\n const msg =\n '_0 and _i encoding indicators are not valid for floating-point values';\n if (onRecoverableError) {\n onRecoverableError(msg);\n raw = raw.slice(0, -2);\n } else {\n throw new SyntaxError(`EDN parse error: ${msg}`);\n }\n } else if (/[_][4567]$/.test(raw)) {\n const suffix = raw[raw.length - 1]!;\n const msg =\n suffix === '7'\n ? 'indefinite-length encoding (_7) is not valid for floating-point values'\n : `encoding indicator _${suffix} (AI ${Number(suffix) + 24}) is reserved and not valid`;\n if (onRecoverableError) {\n onRecoverableError(msg);\n raw = raw.slice(0, -2);\n } else {\n throw new SyntaxError(`EDN parse error: ${msg}`);\n }\n }\n\n if (raw === 'NaN') return { value: NaN, precision: undefined };\n if (raw === 'Infinity') return { value: Infinity, precision: undefined };\n if (raw === '-Infinity') return { value: -Infinity, precision: undefined };\n\n let numStr = raw;\n let precision: FloatPrecision | undefined;\n if (raw.endsWith('_1')) {\n precision = 'half';\n numStr = raw.slice(0, -2);\n } else if (raw.endsWith('_2')) {\n precision = 'single';\n numStr = raw.slice(0, -2);\n } else if (raw.endsWith('_3')) {\n precision = 'double';\n numStr = raw.slice(0, -2);\n }\n\n // Hex float literal: 0x[hex]p[exp] or -0x[hex]p[exp]\n if (/^-?0[xX]/.test(numStr))\n return { value: parseHexFloat(numStr), precision };\n\n return { value: parseFloat(numStr), precision };\n}\n\nfunction hexToBytes(hex: string): Uint8Array {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if (typeof (Uint8Array as any).fromHex === 'function')\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (Uint8Array as any).fromHex(hex);\n if (hex.length % 2 !== 0)\n throw new SyntaxError(`hex string has odd length: ${hex.length}`);\n const out = new Uint8Array(hex.length / 2);\n for (let i = 0; i < hex.length; i += 2)\n out[i / 2] = parseInt(hex.slice(i, i + 2), 16);\n return out;\n}\n\nfunction base64ToBytes(\n b64: string,\n onRecoverableError?: (msg: string) => void\n): Uint8Array {\n // Separate data characters from trailing '=' padding.\n const eqIdx = b64.indexOf('=');\n const data = eqIdx >= 0 ? b64.slice(0, eqIdx) : b64;\n const pad = eqIdx >= 0 ? b64.slice(eqIdx) : '';\n\n // draft-25 b64dig = ALPHA / DIGIT / \"-\" / \"_\" / \"+\" / \"/\"\n // Classic (+/) and URL-safe (-_) position-62/63 chars are both valid in the\n // same literal. Reject anything outside this set as a hard error.\n if (/[^A-Za-z0-9+/\\-_]/.test(data)) {\n const bad = [...data].find((c) => !/[A-Za-z0-9+/\\-_]/.test(c)) ?? '';\n throw new SyntaxError(\n `invalid character ${JSON.stringify(bad)} in base64 data`\n );\n }\n if (pad && !/^=+$/.test(pad))\n throw new SyntaxError(`invalid character after base64 '=' padding`);\n\n const rem = data.length % 4;\n\n // rem === 1 cannot arise from any valid byte sequence (always invalid).\n if (rem === 1)\n throw new SyntaxError(\n `invalid base64 length: ${data.length} data characters (length mod 4 = 1 is never valid)`\n );\n\n // Expected number of '=' characters for this data length.\n const expectedPad = rem === 0 ? 0 : 4 - rem;\n\n if (pad.length > expectedPad) {\n const msg = `base64 has ${pad.length} '=' character${pad.length > 1 ? 's' : ''} but the data length (${data.length}) requires at most ${expectedPad}`;\n if (onRecoverableError) onRecoverableError(msg);\n else throw new SyntaxError(msg);\n }\n\n // Partial padding: some '=' present but fewer than the full required amount.\n // draft-25 accommodates NO padding; any '=' present must be the full set.\n if (pad.length > 0 && pad.length < expectedPad) {\n const msg = `base64 has ${pad.length} '=' character${pad.length > 1 ? 's' : ''} but needs exactly ${expectedPad} — use full padding or no padding at all`;\n if (onRecoverableError) onRecoverableError(msg);\n else throw new SyntaxError(msg);\n }\n // Zero '=': draft-25 allows omitting padding entirely — always accepted.\n\n // Non-zero trailing bits in the last data character (RFC 4648 §3.5).\n // Normalize URL-safe chars first so the lookup is against the classic table.\n // rem=2 (1-byte quantum): bottom 4 bits of the final char must be zero.\n // rem=3 (2-byte quantum): bottom 2 bits of the final char must be zero.\n if (rem !== 0 && data.length > 0) {\n const ALPHA =\n 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n const lastChar = data[data.length - 1]!.replace('-', '+').replace('_', '/');\n const lastVal = ALPHA.indexOf(lastChar);\n if (lastVal >= 0) {\n const mask = rem === 2 ? 0x0f : 0x03;\n if ((lastVal & mask) !== 0) {\n const msg = `base64 has non-zero trailing bits in the final quantum (RFC 4648 §3.5)`;\n if (onRecoverableError) onRecoverableError(msg);\n else throw new SyntaxError(msg);\n }\n }\n }\n\n // Normalize URL-safe chars to classic and add any missing padding so the\n // underlying decoder accepts the input regardless of what was originally used.\n const normalized =\n data.replace(/-/g, '+').replace(/_/g, '/') + '='.repeat(expectedPad);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if (typeof (Uint8Array as any).fromBase64 === 'function') {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (Uint8Array as any).fromBase64(normalized, {\n alphabet: 'base64',\n lastChunkHandling: 'loose',\n });\n }\n const binary = atob(normalized);\n const out = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) out[i] = binary.charCodeAt(i);\n return out;\n}\n\n// ─── Comment attachment ──────────────────────────────────────────────────────\n\ninterface NodeInfo {\n node: CborItem;\n start: number;\n end: number;\n}\n\nfunction attachComments(\n root: CborItem,\n comments: EdnComment[],\n source: string\n): void {\n if (comments.length === 0) return;\n const nodes = collectNodes(root);\n const lineAt = buildLineAt(source);\n\n for (const raw of comments) {\n const comment: CborComment = { ...raw };\n const prev = [...nodes]\n .filter((n) => n.end <= raw.start)\n .sort((a, b) => b.end - a.end || b.start - a.start)[0];\n const separatorBeforeComment = prev\n ? source.slice(prev.end, raw.start)\n : '';\n if (\n prev &&\n lineAt(prev.end) === raw.line &&\n !separatorBeforeComment.includes(':')\n ) {\n addComment(prev.node, 'trailing', comment);\n continue;\n }\n\n const container = [...nodes]\n .filter((n) => n.start < raw.start && raw.end < n.end)\n .sort((a, b) => b.start - a.start || a.end - b.end)[0];\n const next = [...nodes]\n .filter((n) => n.start >= raw.end)\n .sort((a, b) => a.start - b.start || b.end - a.end)[0];\n if (!container || (next && next.end <= container.end)) {\n if (next) {\n addComment(next.node, 'leading', comment);\n continue;\n }\n }\n\n addComment(container?.node ?? root, 'dangling', comment);\n }\n}\n\nfunction collectNodes(root: CborItem): NodeInfo[] {\n const out: NodeInfo[] = [];\n const visit = (node: CborItem) => {\n if (node.start !== undefined && node.end !== undefined)\n out.push({ node, start: node.start, end: node.end });\n if (node instanceof CborArray || node instanceof CborEmbeddedCBOR) {\n for (const item of node.items) visit(item);\n return;\n }\n if (node instanceof CborMap) {\n for (const [key, value] of node.entries) {\n visit(key);\n visit(value);\n }\n return;\n }\n if (\n node instanceof CborIndefiniteByteString ||\n node instanceof CborIndefiniteTextString\n ) {\n for (const chunk of node.chunks) visit(chunk);\n return;\n }\n if (node instanceof CborTag) visit(node.content);\n };\n visit(root);\n return out;\n}\n\nfunction addComment(\n node: CborItem,\n placement: 'leading' | 'trailing' | 'dangling',\n comment: CborComment\n): void {\n node.comments ??= {};\n node.comments[placement] ??= [];\n node.comments[placement].push(comment);\n}\n\nfunction buildLineAt(source: string): (offset: number) => number {\n const starts = [0];\n for (let i = 0; i < source.length; i++) {\n if (source[i] === '\\n') starts.push(i + 1);\n }\n return (offset: number): number => {\n let target = Math.max(0, Math.min(source.length, offset));\n if (target > 0 && target === source.length) target--;\n let lo = 0;\n let hi = starts.length - 1;\n while (lo <= hi) {\n const mid = (lo + hi) >> 1;\n if (starts[mid] <= target) lo = mid + 1;\n else hi = mid - 1;\n }\n return hi + 1;\n };\n}\n\n// ─── Parser ───────────────────────────────────────────────────────────────────\n\nclass CDNParser {\n /** Lookup from app-prefix → extension (user extensions override built-ins). */\n private readonly extByPrefix: Map<string, CborExtension>;\n /** Lookup from tag number → extension. */\n private readonly extByTag: Map<bigint, CborExtension>;\n\n private readonly unresolvedExtension: 'cpa999' | 'error';\n\n /** Warnings accumulated during the current parseValue() call. */\n private _pendingWarnings: ParseWarning[] = [];\n\n constructor(\n private readonly t: Tokenizer,\n private readonly _options: FromCDNOptions\n ) {\n this.extByPrefix = new Map();\n this.extByTag = new Map();\n this.unresolvedExtension = _options.unresolvedExtension ?? 'cpa999';\n for (const ext of [...BUILTIN_EXTENSIONS, ...(_options.extensions ?? [])]) {\n for (const prefix of ext.appStringPrefixes ?? [])\n this.extByPrefix.set(prefix, ext);\n for (const tag of ext.tagNumbers ?? []) this.extByTag.set(tag, ext);\n }\n this.t.onEscapeWarning = (msg, offset, line, col) => {\n const w: ParseWarning = { message: msg, offset, line, column: col };\n this._pendingWarnings.push(w);\n if (this._options.onWarning) this._options.onWarning(w);\n else if (!this._options.silent)\n console.warn(\n `CDN strict violation at line ${line}, column ${col}: ${msg}`\n );\n if (this._options.strict !== false)\n throw new SyntaxError(\n `EDN parse error at line ${line}, column ${col}: ${msg}`\n );\n };\n }\n\n parse(): CborItem {\n const value = this.parseValue();\n if (this._options.allowTrailing) return value;\n const next = this.t.peek();\n if (next.type !== 'EOF') {\n this._fail(\n `unexpected token after value: ${JSON.stringify(next.value)}`,\n next\n );\n }\n return value;\n }\n\n parseValue(): CborItem {\n const start = this.t.peek().offset;\n const node = this._parseValueNode();\n if (this._pendingWarnings.length > 0) {\n node.warnings ??= [];\n for (const w of this._pendingWarnings) node.warnings.push(w);\n this._pendingWarnings = [];\n }\n node.start = start;\n node.end = this.t.lastEndOffset;\n return node;\n }\n\n private _parseValueNode(): CborItem {\n const tok = this.t.peek();\n switch (tok.type) {\n case 'INTEGER':\n return this.parseIntegerOrTag();\n case 'FLOAT':\n return this.parseFloat();\n case 'TSTR':\n case 'RAWSTRING':\n return this.parseString();\n case 'BYTES_HEX':\n case 'SQSTR':\n case 'BYTES_B64': {\n this.t.consume();\n return this._parseBytesConcat(\n this._decodeBytesToken(tok),\n tok.type,\n tok.raw\n );\n }\n case 'EMPTY_INDEF_BYTES':\n this.t.consume();\n return new CborIndefiniteByteString([]);\n case 'EMPTY_INDEF_TEXT':\n this.t.consume();\n return new CborIndefiniteTextString([]);\n case 'TRUE':\n this.t.consume();\n return CborSimple.TRUE;\n case 'FALSE':\n this.t.consume();\n return CborSimple.FALSE;\n case 'NULL':\n this.t.consume();\n return CborSimple.NULL;\n case 'UNDEFINED':\n this.t.consume();\n return CborSimple.UNDEFINED;\n case 'SIMPLE':\n return this.parseSimple();\n case 'LBRACKET':\n return this.parseArray();\n case 'LBRACE':\n return this.parseMap();\n case 'LPAREN':\n return this.parseIndefGroup();\n case 'LT_LT':\n return this.parseEmbeddedCBOR();\n case 'APP_STRING': {\n this.t.consume();\n const ext = this.extByPrefix.get(tok.appPrefix!);\n if (!ext?.parseAppString) {\n if (this.unresolvedExtension === 'cpa999')\n return new CborUnresolvedAppExt(tok.appPrefix!, [\n new CborTextString(tok.value),\n ]);\n this._fail(\n `unknown app-string extension: ${JSON.stringify(tok.appPrefix)}`,\n tok\n );\n }\n {\n const warnsBefore = this._pendingWarnings.length;\n try {\n const result = ext.parseAppString(\n tok.appPrefix!,\n tok.value,\n this._extOnError(tok)\n );\n // Propagate ednSource so preserveByteString / appStrings round-trips correctly.\n // instanceof narrows the type; getPrototypeOf excludes subclasses like CborIpExt.\n if (\n result instanceof CborByteString &&\n Object.getPrototypeOf(result) === CborByteString.prototype &&\n result.ednSource === undefined\n )\n return new CborByteString(result.value, {\n ednEncoding: result.ednEncoding,\n encodingWidth: result.encodingWidth,\n ednSource: tok.raw,\n });\n if (result instanceof CborFloat && result.ednSource === undefined)\n result.ednSource = tok.raw;\n return result;\n } catch (e) {\n if (this._options.strict !== false) throw e;\n if (this._pendingWarnings.length === warnsBefore)\n this._warn(e instanceof Error ? e.message : String(e), tok);\n return new CborUnresolvedAppExt(tok.appPrefix!, [\n new CborTextString(tok.value),\n ]);\n }\n }\n }\n case 'APP_SEQUENCE': {\n this.t.consume();\n const items: CborItem[] = [];\n while (this.t.peek().type !== 'GT_GT') {\n if (this.t.peek().type === 'EOF')\n this._fail(`unterminated ${tok.appPrefix!}<<...>>`, tok);\n if (items.length > 0 && this.t.peek().type === 'COMMA') {\n this.t.consume();\n if (this.t.peek().type === 'GT_GT') break; // trailing comma\n }\n items.push(this.parseValue());\n }\n this.expect('GT_GT');\n const seqExt = this.extByPrefix.get(tok.appPrefix!);\n if (!seqExt) {\n if (this.unresolvedExtension === 'cpa999')\n return new CborUnresolvedAppExt(tok.appPrefix!, items);\n this._fail(\n `unknown app-string extension: ${JSON.stringify(tok.appPrefix)}`,\n tok\n );\n }\n if (!seqExt.parseAppSequence)\n this._fail(\n `app-string extension ${JSON.stringify(tok.appPrefix)} does not support <<...>> form`,\n tok\n );\n {\n const warnsBefore = this._pendingWarnings.length;\n try {\n const result = seqExt.parseAppSequence(\n tok.appPrefix!,\n items,\n this._extOnError(tok)\n );\n const rawSource = this.t.source.slice(\n tok.offset,\n this.t.lastEndOffset\n );\n if (result instanceof CborFloat) {\n if (result.ednSource === undefined) result.ednSource = rawSource;\n } else if (seqExt.preserveAppSeqSource) {\n return new CborAppSeqResult(result, rawSource);\n }\n return result;\n } catch (e) {\n if (this._options.strict !== false) throw e;\n if (this._pendingWarnings.length === warnsBefore)\n this._warn(e instanceof Error ? e.message : String(e), tok);\n return new CborUnresolvedAppExt(tok.appPrefix!, items);\n }\n }\n }\n case 'ELLIPSIS': {\n this.t.consume();\n if (this.t.peek().type !== 'PLUS') return new CborEllipsis();\n const items: CborItem[] = [new CborEllipsis()];\n while (this.t.peek().type === 'PLUS') {\n this.t.consume();\n items.push(this.parseValue());\n }\n return new CborEllipsis(items);\n }\n case 'BYTES_HEX_ELIDED': {\n this.t.consume();\n return this._parseHexElidedConcat(tok);\n }\n default:\n this._fail(`unexpected token: ${JSON.stringify(tok.value)}`, tok);\n }\n }\n\n private parseIntegerOrTag(): CborItem {\n const tok = this.t.consume(); // INTEGER\n const { numStr, rawSuffix } = parseIntegerRaw(tok.value);\n // Hex/octal/binary literals return before the suffix check in the tokenizer,\n // so their encoding indicator arrives as a separate ENCODING_INDICATOR token.\n let encodingWidth =\n rawSuffix !== undefined\n ? this._resolveEncodingWidth(rawSuffix, tok)\n : this.consumeEncodingIndicator();\n const n = parseBigInt(numStr);\n\n // Out-of-range integers become bignum tags per RFC 8949 §3.4.3.\n // Tag numbers must fit in uint64, so a value > UINT64_MAX before '(' is an error.\n if (n > 0xffff_ffff_ffff_ffffn) {\n if (this.t.peek().type === 'LPAREN')\n this._fail('tag number exceeds maximum uint64', tok);\n return new CborBigUint(n);\n }\n if (n < -(0xffff_ffff_ffff_ffffn + 1n)) {\n return new CborBigNint(n);\n }\n\n // Validate that the value fits in the requested encoding width.\n // For nint, the CBOR argument is abs(n)−1 (e.g. -1 → 0, -24 → 23).\n if (encodingWidth !== undefined) {\n const storedValue = n >= 0n ? n : -(n + 1n);\n encodingWidth = this._validateEncodingFit(\n storedValue,\n encodingWidth,\n tok\n );\n }\n\n const intNode =\n n >= 0n\n ? new CborUint(\n n,\n encodingWidth !== undefined ? { encodingWidth } : undefined\n )\n : new CborNint(\n n,\n encodingWidth !== undefined ? { encodingWidth } : undefined\n );\n\n // integer followed by '(' → tagged data item\n if (this.t.peek().type === 'LPAREN') {\n if (!(intNode instanceof CborUint))\n this._fail('tag number must be non-negative', tok);\n this.t.consume(); // (\n // Rescue setup warnings before content's parseValue() drains them into the content node.\n const setupWarnings = this._pendingWarnings.splice(0);\n const content = this.parseValue();\n this.expect('RPAREN');\n const tagNum = intNode.value;\n const ext = this.extByTag.get(tagNum);\n if (ext?.parseTag) {\n const result = ext.parseTag(tagNum, content);\n if (result !== undefined) {\n if (setupWarnings.length > 0) {\n result.warnings ??= [];\n result.warnings.push(...setupWarnings);\n }\n return result;\n }\n }\n const tagResult = new CborTag(\n tagNum,\n content,\n encodingWidth !== undefined ? { encodingWidth } : undefined\n );\n if (setupWarnings.length > 0) {\n tagResult.warnings ??= [];\n tagResult.warnings.push(...setupWarnings);\n }\n return tagResult;\n }\n return intNode;\n }\n\n private parseFloat(): CborItem {\n const tok = this.t.consume(); // FLOAT\n const onRecoverableError = (msg: string) => {\n this._warn(msg, tok);\n if (this._options.strict !== false) this._fail(msg, tok);\n };\n const { value, precision } = parseFloatToken(tok.value, onRecoverableError);\n if (precision === 'half' || precision === 'single') {\n const roundTripped =\n precision === 'half'\n ? float16BitsToFloat64(float64ToFloat16Bits(value))\n : Math.fround(value);\n const lossless =\n Object.is(value, roundTripped) || (isNaN(value) && isNaN(roundTripped));\n if (!lossless)\n onRecoverableError(\n `${value} cannot be exactly represented as ${precision === 'half' ? 'f16 (_1)' : 'f32 (_2)'}; use _3 or remove the indicator`\n );\n }\n return new CborFloat(\n value,\n precision !== undefined ? { precision } : undefined\n );\n }\n\n private parseString(): CborItem {\n const tok = this.t.consume(); // STRING\n\n // Fast path: no concatenation\n if (this.t.peek().type !== 'PLUS') {\n const byteLen = BigInt(new TextEncoder().encode(tok.value).length);\n const ew = this.consumeEncodingIndicator(byteLen);\n return new CborTextString(\n tok.value,\n ew !== undefined ? { encodingWidth: ew } : undefined\n );\n }\n\n // Concatenation chain — may include ellipsis, producing CborEllipsis\n let hasEllipsis = false;\n const parts: Array<{ text: string } | { ellipsis: true }> = [\n { text: tok.value },\n ];\n\n while (this.t.peek().type === 'PLUS') {\n this.t.consume(); // +\n const next = this.t.peek();\n if (next.type === 'ELLIPSIS') {\n this.t.consume();\n parts.push({ ellipsis: true });\n hasEllipsis = true;\n } else if (next.type === 'TSTR' || next.type === 'RAWSTRING') {\n this.t.consume();\n parts.push({ text: next.value });\n } else if (this._isBytesToken(next.type)) {\n this.t.consume();\n parts.push({\n text: this._decodeUtf8(this._decodeBytesToken(next), next),\n });\n } else {\n this._fail(\n `expected string or byte string after +, got ${JSON.stringify(next.value)}`,\n next\n );\n }\n }\n\n if (!hasEllipsis) {\n // No ellipsis — join all text fragments into a single CborTextString\n const joined = parts.map((p) => ('text' in p ? p.text : '')).join('');\n const byteLen = BigInt(new TextEncoder().encode(joined).length);\n const ew = this.consumeEncodingIndicator(byteLen);\n return new CborTextString(\n joined,\n ew !== undefined ? { encodingWidth: ew } : undefined\n );\n }\n\n // Build 888([...]) with consolidated adjacent text fragments\n const items: CborItem[] = [];\n let currentText = '';\n for (const part of parts) {\n if ('ellipsis' in part) {\n if (currentText !== '') {\n items.push(new CborTextString(currentText));\n currentText = '';\n }\n items.push(new CborEllipsis());\n } else {\n currentText += part.text;\n }\n }\n if (currentText !== '') items.push(new CborTextString(currentText));\n\n return new CborEllipsis(items);\n }\n\n private _isBytesToken(type: string): boolean {\n return type === 'BYTES_HEX' || type === 'SQSTR' || type === 'BYTES_B64';\n }\n\n private _decodeBytesToken(tok: Token): Uint8Array {\n const onRecoverableError = (msg: string) => {\n this._warn(msg, tok);\n if (this._options.strict !== false) this._fail(msg, tok);\n };\n switch (tok.type) {\n case 'BYTES_HEX':\n case 'SQSTR':\n return hexToBytes(tok.value);\n case 'BYTES_B64':\n return base64ToBytes(tok.value, onRecoverableError);\n default:\n this._fail(`expected byte string token`, tok);\n }\n }\n\n private _decodeUtf8(bytes: Uint8Array, tok: Token): string {\n if (this._options.allowInvalidUtf8)\n return new TextDecoder('utf-8', { fatal: false }).decode(bytes);\n try {\n return new TextDecoder('utf-8', { fatal: true }).decode(bytes);\n } catch {\n const msg = 'byte string in text concatenation is not valid UTF-8';\n this._warn(msg, tok);\n if (this._options.strict !== false) this._fail(msg, tok);\n return new TextDecoder('utf-8', { fatal: false }).decode(bytes);\n }\n }\n\n private _tokenTypeToCdnEncoding(type: string): 'hex' | 'base64' {\n return type === 'BYTES_B64' ? 'base64' : 'hex';\n }\n\n private _parseBytesConcat(\n first: Uint8Array,\n firstType: string,\n firstSource: string\n ): CborByteString | CborEllipsis {\n if (this.t.peek().type !== 'PLUS') {\n const ew = this.consumeEncodingIndicator(BigInt(first.length));\n const ednEncoding = this._tokenTypeToCdnEncoding(firstType);\n return new CborByteString(first, {\n ednEncoding,\n ednSource: firstSource,\n ...(ew !== undefined ? { encodingWidth: ew } : {}),\n });\n }\n\n // Concatenation chain — may include ellipsis\n let hasEllipsis = false;\n const parts: Array<{ bytes: Uint8Array } | { ellipsis: true }> = [\n { bytes: first },\n ];\n\n while (this.t.peek().type === 'PLUS') {\n this.t.consume(); // +\n const next = this.t.peek();\n if (next.type === 'ELLIPSIS') {\n this.t.consume();\n parts.push({ ellipsis: true });\n hasEllipsis = true;\n } else if (next.type === 'BYTES_HEX_ELIDED') {\n this.t.consume();\n const subItems = this._buildBytesElidedItems(next.value);\n for (const item of subItems) {\n if (item instanceof CborEllipsis) {\n parts.push({ ellipsis: true });\n hasEllipsis = true;\n } else if (item instanceof CborByteString) {\n parts.push({ bytes: item.value });\n }\n }\n } else if (this._isBytesToken(next.type)) {\n this.t.consume();\n parts.push({ bytes: this._decodeBytesToken(next) });\n } else if (next.type === 'TSTR' || next.type === 'RAWSTRING') {\n // §5.1: when a byte string leads, the right-hand side must also be a\n // byte string. Text strings are only allowed on the right of a\n // text-leading concatenation. In non-strict mode we UTF-8 encode\n // the text and continue; in strict mode this is a hard error.\n this.t.consume();\n const mixMsg =\n 'text string in a byte-string concatenation is not allowed; ' +\n \"use a byte string literal (h'...', b64'...', or '...') instead\";\n this._warn(mixMsg, next);\n if (this._options.strict !== false) this._fail(mixMsg, next);\n parts.push({ bytes: new TextEncoder().encode(next.value) });\n } else {\n this._fail(\n `expected byte string after +, got ${JSON.stringify(next.value)}`,\n next\n );\n }\n }\n\n if (!hasEllipsis) {\n const allBytes = parts.map((p) =>\n 'bytes' in p ? p.bytes : new Uint8Array(0)\n );\n const concat = this._concatBytes(allBytes);\n const ew = this.consumeEncodingIndicator(BigInt(concat.length));\n return new CborByteString(\n concat,\n ew !== undefined ? { encodingWidth: ew } : undefined\n );\n }\n\n // Build 888([...]) with consolidated adjacent byte fragments\n const items: CborItem[] = [];\n const pending: Uint8Array[] = [];\n const flushPending = () => {\n if (pending.length > 0) {\n items.push(new CborByteString(this._concatBytes([...pending])));\n pending.length = 0;\n }\n };\n for (const part of parts) {\n if ('ellipsis' in part) {\n flushPending();\n items.push(new CborEllipsis());\n } else {\n pending.push(part.bytes);\n }\n }\n flushPending();\n\n return new CborEllipsis(items);\n }\n\n /**\n * Parse a BYTES_HEX_ELIDED token (h'xx...yy') and any trailing + concatenation\n * into a CborEllipsis([h'xx', 888(null), h'yy', ...]).\n */\n private _parseHexElidedConcat(firstTok: Token): CborEllipsis {\n const items = this._buildBytesElidedItems(firstTok.value);\n\n while (this.t.peek().type === 'PLUS') {\n this.t.consume(); // +\n const next = this.t.peek();\n if (next.type === 'ELLIPSIS') {\n this.t.consume();\n items.push(new CborEllipsis());\n } else if (next.type === 'BYTES_HEX_ELIDED') {\n this.t.consume();\n const subItems = this._buildBytesElidedItems(next.value);\n this._mergeFirstBytesItem(items, subItems);\n } else if (this._isBytesToken(next.type)) {\n this.t.consume();\n const bytes = this._decodeBytesToken(next);\n // Append to the last item if it's a CborByteString\n const last = items[items.length - 1];\n if (last instanceof CborByteString) {\n items[items.length - 1] = new CborByteString(\n this._concatBytes([last.value, bytes])\n );\n } else {\n items.push(new CborByteString(bytes));\n }\n } else {\n this._fail(\n `expected byte string after +, got ${JSON.stringify(next.value)}`,\n next\n );\n }\n }\n return new CborEllipsis(items);\n }\n\n private _buildBytesElidedItems(hexWithEllipsis: string): CborItem[] {\n const segments = hexWithEllipsis.split('...');\n const items: CborItem[] = [];\n for (let i = 0; i < segments.length; i++) {\n if (i > 0) items.push(new CborEllipsis());\n if (segments[i].length > 0) {\n items.push(new CborByteString(hexToBytes(segments[i])));\n }\n }\n return items;\n }\n\n private _mergeFirstBytesItem(target: CborItem[], source: CborItem[]): void {\n if (source.length === 0) return;\n const lastTarget = target[target.length - 1];\n const firstSource = source[0];\n if (\n lastTarget instanceof CborByteString &&\n firstSource instanceof CborByteString\n ) {\n target[target.length - 1] = new CborByteString(\n this._concatBytes([lastTarget.value, firstSource.value])\n );\n target.push(...source.slice(1));\n } else {\n target.push(...source);\n }\n }\n\n private _concatBytes(parts: Uint8Array[]): Uint8Array {\n const total = parts.reduce((n, p) => n + p.byteLength, 0);\n const out = new Uint8Array(total);\n let off = 0;\n for (const p of parts) {\n out.set(p, off);\n off += p.byteLength;\n }\n return out;\n }\n\n private parseSimple(): CborSimple {\n this.t.consume(); // 'simple'\n this.expect('LPAREN');\n const numTok = this.t.peek();\n if (numTok.type !== 'INTEGER')\n this._fail(\n `expected integer inside simple(), got ${JSON.stringify(numTok.value)}`,\n numTok\n );\n this.t.consume();\n const { numStr } = parseIntegerRaw(numTok.value);\n const n = Number(parseBigInt(numStr));\n this.expect('RPAREN');\n return new CborSimple(n);\n }\n\n private parseEmbeddedCBOR(): CborEmbeddedCBOR {\n this.t.consume(); // <<\n const items: CborItem[] = [];\n while (this.t.peek().type !== 'GT_GT') {\n if (items.length > 0 && this.t.peek().type === 'COMMA') {\n this.t.consume();\n if (this.t.peek().type === 'GT_GT') break; // trailing comma\n }\n items.push(this.parseValue());\n }\n this.expect('GT_GT');\n return new CborEmbeddedCBOR(items);\n }\n\n private parseArray(): CborArray {\n this.t.consume(); // [\n let indefiniteLength = false;\n let encodingWidth: EncodingWidth | undefined;\n let eiTok: Token | undefined;\n if (this.t.peek().type === 'UNDERSCORE') {\n this.t.consume();\n indefiniteLength = true;\n } else if (this.t.peek().type === 'ENCODING_INDICATOR') {\n eiTok = this.t.consume();\n if (eiTok.value === '7') {\n indefiniteLength = true;\n const msg =\n 'encoding indicator _7 is non-standard; use _ to indicate indefinite length';\n this._warn(msg, eiTok);\n if (this._options.strict !== false) this._fail(msg, eiTok);\n eiTok = undefined;\n } else {\n encodingWidth = this._resolveEncodingWidth(eiTok.value, eiTok);\n }\n }\n // Rescue setup warnings before inner parseValue() calls drain them into child nodes.\n const setupWarnings = this._pendingWarnings.splice(0);\n const items: CborItem[] = [];\n while (this.t.peek().type !== 'RBRACKET') {\n if (items.length > 0 && this.t.peek().type === 'COMMA') {\n this.t.consume();\n if (this.t.peek().type === 'RBRACKET') break; // trailing comma\n }\n items.push(this.parseValue());\n }\n this.expect('RBRACKET');\n if (encodingWidth !== undefined && eiTok !== undefined) {\n encodingWidth = this._validateEncodingFit(\n BigInt(items.length),\n encodingWidth,\n eiTok\n );\n // _validateEncodingFit may add to _pendingWarnings; outer parseValue() flushes those.\n }\n const arrayResult = new CborArray(items, {\n indefiniteLength,\n encodingWidth,\n });\n if (setupWarnings.length > 0) {\n arrayResult.warnings ??= [];\n arrayResult.warnings.push(...setupWarnings);\n }\n return arrayResult;\n }\n\n private parseMap(): CborMap {\n this.t.consume(); // {\n let indefiniteLength = false;\n let encodingWidth: EncodingWidth | undefined;\n let eiTok: Token | undefined;\n if (this.t.peek().type === 'UNDERSCORE') {\n this.t.consume();\n indefiniteLength = true;\n } else if (this.t.peek().type === 'ENCODING_INDICATOR') {\n eiTok = this.t.consume();\n if (eiTok.value === '7') {\n indefiniteLength = true;\n const msg =\n 'encoding indicator _7 is non-standard; use _ to indicate indefinite length';\n this._warn(msg, eiTok);\n if (this._options.strict !== false) this._fail(msg, eiTok);\n eiTok = undefined;\n } else {\n encodingWidth = this._resolveEncodingWidth(eiTok.value, eiTok);\n }\n }\n // Rescue setup warnings before inner parseValue() calls drain them into child nodes.\n const setupWarnings = this._pendingWarnings.splice(0);\n const entries: [CborItem, CborItem][] = [];\n while (this.t.peek().type !== 'RBRACE') {\n if (entries.length > 0 && this.t.peek().type === 'COMMA') {\n this.t.consume();\n if (this.t.peek().type === 'RBRACE') break; // trailing comma\n }\n const key = this.parseValue();\n this.expect('COLON');\n const val = this.parseValue();\n entries.push([key, val]);\n }\n this.expect('RBRACE');\n if (encodingWidth !== undefined && eiTok !== undefined) {\n encodingWidth = this._validateEncodingFit(\n BigInt(entries.length),\n encodingWidth,\n eiTok\n );\n }\n const mapResult = new CborMap(entries, { indefiniteLength, encodingWidth });\n if (setupWarnings.length > 0) {\n mapResult.warnings ??= [];\n mapResult.warnings.push(...setupWarnings);\n }\n return mapResult;\n }\n\n /** Parses `(_ chunk, chunk, ...)` — indefinite byte or text string. */\n private parseIndefGroup():\n | CborIndefiniteByteString\n | CborIndefiniteTextString {\n this.t.consume(); // (\n const next = this.t.peek();\n if (next.type === 'UNDERSCORE') {\n this.t.consume(); // _\n } else if (next.type === 'ENCODING_INDICATOR' && next.value === '7') {\n this.t.consume(); // _7 — alias for _, but non-standard\n const msg7 =\n 'encoding indicator _7 is non-standard; use _ to indicate indefinite length';\n this._warn(msg7, next);\n if (this._options.strict !== false) this._fail(msg7, next);\n } else if (next.type === 'ENCODING_INDICATOR') {\n // _0–_6: not meaningful here; warn and drop, then parse chunks\n const tok = this.t.consume();\n const msg = `encoding indicator _${tok.value} is not valid in an indefinite string group; use _`;\n this._warn(msg, tok);\n if (this._options.strict !== false) this._fail(msg, tok);\n } else if (next.type !== 'RPAREN') {\n // No indicator at all — warn that _ is expected, then parse chunks\n const msg =\n 'indefinite string group is missing _ after (; interpreting as (_ ...)';\n this._warn(msg, next);\n if (this._options.strict !== false) this._fail(msg, next);\n // Do not consume — the next token is the first chunk\n }\n\n // Rescue any warnings emitted above from _pendingWarnings before inner\n // parseValue() calls for each chunk drain them into the wrong node.\n const setupWarnings = this._pendingWarnings.splice(0);\n\n const chunks: CborItem[] = [];\n while (this.t.peek().type !== 'RPAREN') {\n if (chunks.length > 0 && this.t.peek().type === 'COMMA') {\n this.t.consume();\n if (this.t.peek().type === 'RPAREN') break; // trailing comma\n }\n chunks.push(this.parseValue());\n }\n this.expect('RPAREN');\n\n if (chunks.length === 0)\n this._fail(\n 'empty indefinite group (_ ) is ambiguous; use \\'\\'_ for bytes or \"\"_ for text'\n );\n\n const first = chunks[0];\n // All chunks must be the same type — mixing byte and text strings is\n // a SyntaxError per draft §2.5.4.\n if (first instanceof CborByteString) {\n const byteChunks = chunks.map((c, i) => {\n if (c instanceof CborByteString) return c;\n this._fail(\n `indefinite byte string chunk ${i} must be a byte string, not a text string`\n );\n });\n const result = new CborIndefiniteByteString(byteChunks);\n if (setupWarnings.length > 0) result.warnings = setupWarnings;\n return result;\n }\n if (first instanceof CborTextString) {\n const textChunks = chunks.map((c, i) => {\n if (c instanceof CborTextString) return c;\n this._fail(\n `indefinite text string chunk ${i} must be a text string, not a byte string`\n );\n });\n const result = new CborIndefiniteTextString(textChunks);\n if (setupWarnings.length > 0) result.warnings = setupWarnings;\n return result;\n }\n this._fail('indefinite group chunks must be byte strings or text strings');\n }\n\n // ── Helpers ─────────────────────────────────────────────────────────────\n\n /**\n * Consume an ENCODING_INDICATOR token if present.\n * Validates the indicator type (reserved/indefinite), and when `storedValue`\n * is supplied also checks that the value fits in the requested encoding width.\n */\n private consumeEncodingIndicator(\n storedValue?: bigint\n ): EncodingWidth | undefined {\n if (this.t.peek().type === 'ENCODING_INDICATOR') {\n const tok = this.t.consume();\n let ew = this._resolveEncodingWidth(tok.value, tok);\n if (ew !== undefined && storedValue !== undefined) {\n ew = this._validateEncodingFit(storedValue, ew, tok);\n }\n return ew;\n }\n return undefined;\n }\n\n private expect(type: TokenType): Token {\n const tok = this.t.consume();\n if (tok.type !== type)\n this._fail(\n `expected ${type}, got ${tok.type} (${JSON.stringify(tok.value)})`,\n tok\n );\n return tok;\n }\n\n /**\n * Validate that `storedValue` fits in the given encoding width.\n * Returns `ew` if valid; warns and returns `undefined` if not (throws in strict mode).\n * `storedValue` is the CBOR argument: the integer itself for uint/tag, `abs(n)−1` for nint,\n * the byte-length for strings, or the item count for arrays/maps.\n */\n private _validateEncodingFit(\n storedValue: bigint,\n ew: EncodingWidth,\n tok: Token\n ): EncodingWidth | undefined {\n const maxForWidth: Record<EncodingWidth, bigint> = {\n i: 23n,\n 0: 0xffn,\n 1: 0xffffn,\n 2: 0xffff_ffffn,\n 3: 0xffff_ffff_ffff_ffffn,\n };\n if (storedValue <= maxForWidth[ew]) return ew;\n const label =\n ew === 'i' ? '_i (max 23)' : `_${ew} (max ${maxForWidth[ew]})`;\n const msg = `value ${storedValue} does not fit in encoding indicator ${label}`;\n this._warn(msg, tok);\n if (this._options.strict !== false) this._fail(msg, tok);\n return undefined;\n }\n\n private _resolveEncodingWidth(\n raw: string,\n tok: Token\n ): EncodingWidth | undefined {\n if (raw === '4' || raw === '5' || raw === '6') {\n const ai = Number(raw) + 24; // 28, 29, or 30 — reserved in RFC 8949\n const msg = `encoding indicator _${raw} (AI ${ai}) is reserved and not valid`;\n this._warn(msg, tok);\n if (this._options.strict !== false) this._fail(msg, tok);\n return undefined;\n }\n if (raw === '7') {\n const msg =\n 'indefinite-length encoding (_7) is not valid here; use [_ ...] or {_ ...} for indefinite collections';\n this._warn(msg, tok);\n if (this._options.strict !== false) this._fail(msg, tok);\n return undefined;\n }\n if (raw === 'i') return 'i';\n return Number(raw) as EncodingWidth; // '0'–'3' → 0–3\n }\n\n /** Builds the onError callback passed to extension parseAppString/parseAppSequence. */\n private _extOnError(tok: Token): (msg: string) => void {\n return (msg: string) => {\n this._warn(msg, tok);\n if (this._options.strict !== false) this._fail(msg, tok);\n };\n }\n\n private _warn(msg: string, tok?: Token): void {\n const warning: ParseWarning = { message: msg };\n if (tok !== undefined) {\n warning.offset = tok.offset;\n warning.line = tok.line;\n warning.column = tok.col;\n }\n this._pendingWarnings.push(warning);\n if (this._options.onWarning) {\n this._options.onWarning(warning);\n } else if (!this._options.silent) {\n const loc = tok ? ` at line ${tok.line}, column ${tok.col}` : '';\n console.warn(`CDN strict violation${loc}: ${msg}`);\n }\n }\n\n private _fail(msg: string, tok?: Token): never {\n const loc = tok ? ` at line ${tok.line}, column ${tok.col}` : '';\n throw new SyntaxError(`EDN parse error${loc}: ${msg}`);\n }\n}\n","import type { ToCDNOptions, ToJSOptions, ToCBOROptions } from '../types';\nimport { CborItem } from './CborItem';\nimport { MT_TEXT } from '../cbor/constants';\nimport { writeHead, concat, type EncodingWidth } from '../cbor/encode';\nimport { parseCDN } from '../cdn/parser';\n// Internal lexer reuse: parseCDN() validates embedded CDN first; this pass\n// only needs token offsets so string formatting can split without changing text.\nimport { Tokenizer, type TokenType } from '../cdn/tokenizer';\nimport { escapeString, indentOf, resolveIndent } from '../cdn/serialize-utils';\n\nconst textEncoder = new TextEncoder();\nlet didWarnCborEdnTextStringFormat = false;\n\n/** CBOR Major Type 3 — definite-length UTF-8 text string. */\nexport class CborTextString extends CborItem {\n readonly indefiniteLength = false as const;\n readonly value: string;\n readonly encodingWidth: EncodingWidth | undefined;\n\n constructor(value: string, options?: { encodingWidth?: EncodingWidth }) {\n super();\n this.value = value;\n this.encodingWidth = options?.encodingWidth;\n }\n\n _toCBOR(_options?: ToCBOROptions): Uint8Array {\n const encoded = textEncoder.encode(this.value);\n return concat([\n writeHead(MT_TEXT, BigInt(encoded.length), this.encodingWidth),\n encoded,\n ]);\n }\n\n _toCDN(options: ToCDNOptions | undefined, depth: number): string {\n const suffix =\n this.encodingWidth !== undefined ? `_${this.encodingWidth}` : '';\n return formatTextString(this.value, suffix, options, depth);\n }\n\n _toJS(_options?: ToJSOptions): unknown {\n return this.value;\n }\n}\n\nfunction formatTextString(\n value: string,\n suffix: string,\n options: ToCDNOptions | undefined,\n depth: number\n): string {\n const formats = normalizeTextStringFormats(options?.textStringFormat ?? []);\n const indentStr = resolveIndent(options);\n if (formats.length === 0 || indentStr === null) {\n return escapeString(value) + suffix;\n }\n\n const breakpoints = new Map<number, number>();\n let cdnBreakpoints: StringBreakpoint[] | null = null;\n if (formats.includes('cdn')) {\n cdnBreakpoints = collectCdnBreakpoints(value);\n if (cdnBreakpoints !== null) {\n for (const { point, contentDepth } of cdnBreakpoints) {\n breakpoints.set(point, contentDepth);\n }\n }\n }\n if (formats.includes('newline')) {\n const newlineBreakpoints =\n cdnBreakpoints !== null\n ? collectCdnNewlineBreakpoints(value)\n : collectNewlineBreakpoints(value, 0);\n for (const { point, contentDepth } of newlineBreakpoints) {\n if (!breakpoints.has(point)) {\n breakpoints.set(point, contentDepth);\n }\n }\n }\n\n const parts = splitAtBreakpoints(value, breakpoints);\n if (parts.length <= 1) return escapeString(value) + suffix;\n\n const literals = parts.map(({ text }, i) => {\n const literal = escapeString(text);\n return i === parts.length - 1 ? literal + suffix : literal;\n });\n let result = literals[0]!;\n for (let i = 1; i < literals.length; i++) {\n const continuationIndent = indentOf(\n indentStr,\n depth + 1 + parts[i]!.contentDepth\n );\n result += ` +\\n${continuationIndent}${literals[i]}`;\n }\n return result;\n}\n\nfunction normalizeTextStringFormats(\n formats: NonNullable<ToCDNOptions['textStringFormat']>\n): ('newline' | 'cdn')[] {\n return formats.map((format) => {\n if (format !== 'cboredn') return format;\n if (!didWarnCborEdnTextStringFormat) {\n didWarnCborEdnTextStringFormat = true;\n console.warn(\n \"`textStringFormat: ['cboredn']` is deprecated; use `textStringFormat: ['cdn']` instead.\"\n );\n }\n return 'cdn';\n });\n}\n\ninterface StringBreakpoint {\n point: number;\n contentDepth: number;\n}\n\ninterface StringPart {\n text: string;\n contentDepth: number;\n}\n\nfunction collectNewlineBreakpoints(\n value: string,\n contentDepth: number\n): StringBreakpoint[] {\n const points: StringBreakpoint[] = [];\n for (let i = 0; i < value.length; i++) {\n const ch = value[i];\n if (ch === '\\r') {\n if (value[i + 1] === '\\n') {\n points.push({ point: i + 2, contentDepth });\n i++;\n } else {\n points.push({ point: i + 1, contentDepth });\n }\n } else if (ch === '\\n') {\n points.push({ point: i + 1, contentDepth });\n }\n }\n return points;\n}\n\nfunction collectCdnBreakpoints(value: string): StringBreakpoint[] | null {\n try {\n parseCDN(value);\n } catch {\n return null;\n }\n\n // The parse above validates structure. This second tokenizer pass only\n // collects original-source offsets and nesting depth for non-mutating splits.\n const points: StringBreakpoint[] = [];\n const tokenizer = new Tokenizer(value);\n let nesting = 0;\n let pending: {\n point: number;\n contentDepth: number;\n kind: 'opener' | 'comma';\n } | null = null;\n let sawToken = false;\n let lastTokenEnd = 0;\n for (;;) {\n const token = tokenizer.consume();\n if (token.type === 'EOF') break;\n let skipClosePoint = false;\n\n if (!sawToken) {\n sawToken = true;\n if (\n token.offset > 0 &&\n hasCommentBetween(tokenizer.comments, 0, token.offset)\n ) {\n points.push({ point: token.offset, contentDepth: nesting });\n }\n }\n\n // After an opener/comma, split before the next token so intervening layout\n // whitespace stays at the end of the previous chunk.\n if (pending !== null) {\n if (pending.kind === 'opener' && OPENER_MODIFIER_TOKENS.has(token.type)) {\n pending.point = token.endOffset;\n lastTokenEnd = token.endOffset;\n continue;\n } else if (\n pending.kind === 'opener' &&\n CLOSE_TOKENS.has(token.type) &&\n hasOnlyWhitespaceBetween(value, pending.point, token.offset)\n ) {\n skipClosePoint = true;\n } else {\n points.push({\n point: token.offset,\n contentDepth: pending.contentDepth,\n });\n }\n pending = null;\n }\n\n if (OPEN_TOKENS.has(token.type)) {\n nesting++;\n pending = {\n point: token.endOffset,\n contentDepth: nesting,\n kind: 'opener',\n };\n } else if (CLOSE_TOKENS.has(token.type)) {\n nesting = Math.max(0, nesting - 1);\n if (!skipClosePoint) {\n points.push({ point: token.offset, contentDepth: nesting });\n }\n } else if (token.type === 'COMMA') {\n pending = {\n point: token.endOffset,\n contentDepth: nesting,\n kind: 'comma',\n };\n }\n lastTokenEnd = token.endOffset;\n }\n\n const trailingComment = tokenizer.comments.find(\n (comment) => comment.start >= lastTokenEnd\n );\n if (trailingComment !== undefined) {\n points.push({ point: trailingComment.start, contentDepth: nesting });\n }\n return points;\n}\n\nfunction collectCdnNewlineBreakpoints(value: string): StringBreakpoint[] {\n const points: StringBreakpoint[] = [];\n const tokenizer = new Tokenizer(value);\n let nesting = 0;\n for (;;) {\n const token = tokenizer.consume();\n if (token.type === 'EOF') break;\n\n if (OPEN_TOKENS.has(token.type)) {\n nesting++;\n } else if (CLOSE_TOKENS.has(token.type)) {\n nesting = Math.max(0, nesting - 1);\n } else if (token.type === 'COMMA') {\n // Commas can create structural split points, but never contain newline\n // split points themselves.\n } else if (token.type === 'TSTR') {\n // TSTR uses escape sequences (\\n, \\r) for newlines in addition to\n // literal newline characters.\n const tokenText = value.slice(token.offset, token.endOffset);\n for (const point of collectTstrNewlineBreakpoints(tokenText)) {\n points.push({ point: token.offset + point, contentDepth: nesting + 1 });\n }\n } else if (token.type === 'RAWSTRING') {\n // RAWSTRING has no escape sequences; only literal newlines apply.\n const tokenText = value.slice(token.offset, token.endOffset);\n for (const { point } of collectNewlineBreakpoints(tokenText, 0)) {\n points.push({ point: token.offset + point, contentDepth: nesting + 1 });\n }\n }\n }\n return points;\n}\n\n// Scans the raw source of a CDN double-quoted string (TSTR) for newline\n// escape sequences (\\n, \\r) and literal newline characters, returning the\n// position within tokenText immediately after each such sequence.\nfunction collectTstrNewlineBreakpoints(tokenText: string): number[] {\n const points: number[] = [];\n let i = 1; // skip opening \"\n const end = tokenText.length - 1; // stop before closing \"\n while (i < end) {\n const ch = tokenText[i];\n if (ch === '\\\\') {\n const next = tokenText[i + 1];\n if (next === 'n' || next === 'r') {\n points.push(i + 2);\n i += 2;\n } else if (next === 'u') {\n if (tokenText[i + 2] === '{') {\n const close = tokenText.indexOf('}', i + 3);\n i = close >= 0 ? close + 1 : i + 2;\n } else {\n i += 6; // \\uXXXX\n }\n } else {\n i += 2; // \\\\, \\\", \\t, etc.\n }\n } else if (ch === '\\r') {\n if (tokenText[i + 1] === '\\n') {\n points.push(i + 2);\n i += 2;\n } else {\n points.push(i + 1);\n i++;\n }\n } else if (ch === '\\n') {\n points.push(i + 1);\n i++;\n } else {\n i++;\n }\n }\n return points;\n}\n\nconst OPENER_MODIFIER_TOKENS = new Set<TokenType>([\n 'ENCODING_INDICATOR',\n 'UNDERSCORE',\n]);\n\nconst OPEN_TOKENS = new Set<TokenType>([\n 'LBRACKET',\n 'LBRACE',\n 'LPAREN',\n 'LT_LT',\n]);\n\nconst CLOSE_TOKENS = new Set<TokenType>([\n 'RBRACKET',\n 'RBRACE',\n 'RPAREN',\n 'GT_GT',\n]);\n\nfunction hasCommentBetween(\n comments: readonly { start: number; end: number }[],\n start: number,\n end: number\n): boolean {\n // Comments use half-open source ranges; this checks for comments wholly\n // contained in [start, end), including one that ends exactly at `end`.\n return comments.some(\n (comment) => comment.start >= start && comment.end <= end\n );\n}\n\nfunction hasOnlyWhitespaceBetween(\n value: string,\n start: number,\n end: number\n): boolean {\n return /^[\\t\\n\\r ]*$/.test(value.slice(start, end));\n}\n\nfunction splitAtBreakpoints(\n value: string,\n breakpoints: Map<number, number>\n): StringPart[] {\n const points = [...breakpoints]\n .filter(([point]) => point > 0 && point < value.length)\n .sort(([a], [b]) => a - b);\n if (points.length === 0) return [{ text: value, contentDepth: 0 }];\n\n const parts: StringPart[] = [];\n let start = 0;\n let contentDepth = 0;\n for (const [point, nextContentDepth] of points) {\n if (point === start) continue;\n parts.push({ text: value.slice(start, point), contentDepth });\n start = point;\n contentDepth = nextContentDepth;\n }\n if (start < value.length) {\n parts.push({ text: value.slice(start), contentDepth });\n }\n return parts;\n}\n","/**\n * Standard CDN \"dt\" / \"DT\" application-extension (§3.1 of draft-ietf-cbor-edn-literals-25).\n *\n * Parses RFC 3339 date-time app-strings into epoch-based numeric CBOR values.\n * The resulting CborItem subclasses override toCDN() so the value round-trips\n * back to dt'...' / DT'...' notation.\n *\n * For a richer variant that makes toJS() return Date objects, use dt_as_Date\n * from ./date instead.\n */\n\nimport type { ToCDNOptions, ToJSOptions, FromJSOptions } from '../types';\nimport type { CborExtension } from './types';\nimport type { CborItem } from '../ast/CborItem';\nimport { CborUint } from '../ast/CborUint';\nimport { CborNint } from '../ast/CborNint';\nimport { CborFloat } from '../ast/CborFloat';\nimport { CborTag } from '../ast/CborTag';\nimport type { EncodingWidth } from '../cbor/encode';\nimport { CborTextString } from '../ast/CborTextString';\nimport { CborByteString } from '../ast/CborByteString';\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\n\n/**\n * Convert epoch seconds to an RFC 3339 string with appropriate precision.\n *\n * - Integer epoch → \"…Z\" (no fractional part)\n * - Millisecond-precision → \"….SSSZ\" (3 decimal places, e.g. \".500Z\")\n * - Sub-millisecond → \"….S…Z\" (minimal digits, e.g. \".0001Z\")\n *\n * Millisecond precision is used whenever `Math.round(epochSeconds * 1000)`\n * round-trips back to the same float64 value, which is the common case for\n * timestamps stored as integer milliseconds (the JavaScript Date range).\n * Otherwise the shortest decimal representation of the fractional seconds is\n * used so that the float64 value is faithfully represented.\n */\nexport function epochToRfc3339(epochSeconds: number): string {\n if (Number.isInteger(epochSeconds))\n return new Date(epochSeconds * 1000).toISOString().replace(/\\.000Z$/, 'Z');\n\n // Check if millisecond precision suffices (the common case).\n const roundedMs = Math.round(epochSeconds * 1000);\n if (roundedMs / 1000 === epochSeconds)\n return new Date(roundedMs).toISOString().replace(/\\.000Z$/, 'Z');\n\n // Sub-millisecond precision: decompose into whole seconds + fractional part.\n // Math.floor ensures the fractional part is always in [0, 1), which is\n // correct for negative epochs too (e.g. -0.5 → floor=-1, frac=0.5).\n const wholeSeconds = Math.floor(epochSeconds);\n const frac = epochSeconds - wholeSeconds;\n\n // Base timestamp formatted to the second, without any fractional part.\n const base = new Date(wholeSeconds * 1000)\n .toISOString()\n .replace(/\\.\\d+Z$/, '');\n\n // Minimal decimal representation of the fractional seconds (JavaScript's\n // Number.prototype.toString uses the shortest round-trip string).\n const fracStr = frac.toString(); // e.g. \"0.0001\" or \"0.123456\"\n const dotIdx = fracStr.indexOf('.');\n let decDigits = dotIdx >= 0 ? fracStr.slice(dotIdx + 1) : '0';\n // Ensure at least 3 decimal places for conventional readability.\n while (decDigits.length < 3) decDigits += '0';\n\n return `${base}.${decDigits}Z`;\n}\n\n/**\n * Extract a date-time string from a single-item app-sequence.\n * Accepts CborTextString (dt<<\"...\">> ) and CborByteString (dt<<'...'>> , UTF-8).\n */\nfunction stringFromAppSequence(items: CborItem[]): string {\n if (items.length !== 1)\n throw new SyntaxError('dt<<...>>: expected exactly one item');\n const item = items[0];\n if (item instanceof CborTextString) return item.value;\n if (item instanceof CborByteString)\n return new TextDecoder('utf-8', { fatal: true }).decode(item.value);\n throw new SyntaxError('dt<<...>>: expected a text string or byte string');\n}\n\n/**\n * Parse an RFC 3339 string and produce the appropriate epoch CborItem subclass.\n * Integer seconds → CborEpochDtExtUint or CborEpochDtExtNint.\n * Fractional seconds → CborEpochDtExtFloat.\n *\n * Fractional seconds are extracted from the string directly (via parseFloat)\n * before passing the remainder to Date.parse, so sub-millisecond precision\n * is preserved rather than being rounded to the nearest millisecond.\n */\n// RFC 3339 §5.6: date-time = full-date \"T\" full-time, where full-time requires\n// an offset (Z or ±HH:MM). Anything shorter is rejected before Date.parse().\nconst RFC3339_RE =\n /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(Z|[+-]\\d{2}:\\d{2})$/i;\n\nexport function parseDtAppString(\n str: string,\n onError?: (msg: string) => void\n): CborEpochDtExtUint | CborEpochDtExtNint | CborEpochDtExtFloat {\n if (!RFC3339_RE.test(str)) {\n const msg = `dt: invalid RFC 3339 date-time: ${JSON.stringify(str)}`;\n if (onError) onError(msg);\n else throw new SyntaxError(msg);\n }\n\n // Separate the fractional-seconds part (if any) from the rest of the string.\n // This avoids Date.parse() truncating to millisecond precision.\n // Pattern: ...THH:MM:SS(.frac)(Z|±HH:MM)\n const fracMatch = str.match(\n /^(.+T\\d{2}:\\d{2}:\\d{2})(\\.\\d+)(Z|[+-]\\d{2}:\\d{2})$/i\n );\n\n let wholeStr: string;\n let fracValue: number | undefined;\n\n if (fracMatch) {\n // Parse the integer-seconds part (without the fractional digits).\n wholeStr = fracMatch[1] + fracMatch[3];\n // Parse the fractional seconds string with full float64 precision.\n fracValue = parseFloat('0' + fracMatch[2]); // e.g. parseFloat(\"0.0001\")\n } else {\n wholeStr = str;\n fracValue = undefined;\n }\n\n const ms = Date.parse(wholeStr);\n if (isNaN(ms))\n throw new SyntaxError(\n `dt: invalid RFC 3339 date-time: ${JSON.stringify(str)}`\n );\n\n if (fracValue === undefined) {\n const seconds = ms / 1000;\n if (seconds >= 0) return new CborEpochDtExtUint(BigInt(seconds));\n return new CborEpochDtExtNint(BigInt(seconds));\n }\n\n return new CborEpochDtExtFloat(ms / 1000 + fracValue);\n}\n\n// ─── Constants ────────────────────────────────────────────────────────────────\n\nexport const PREFIX_DT = 'dt';\nexport const PREFIX_DT_TAGGED = 'DT';\nexport const TAG_EPOCH = 1n;\n\n// ─── CborItem subclasses ─────────────────────────────────────────────────────\n\n/**\n * Unsigned epoch timestamp whose toCDN() emits dt'…' notation.\n * The RFC 3339 string is re-derived from the numeric value on each call.\n */\nexport class CborEpochDtExtUint extends CborUint {\n constructor(\n value: number | bigint,\n options?: { encodingWidth?: EncodingWidth }\n ) {\n super(value, options);\n }\n\n override _toCDN(options: ToCDNOptions | undefined, _depth: number): string {\n if (options?.appStrings === false) return super._toCDN(options, _depth);\n return `${PREFIX_DT}'${epochToRfc3339(Number(this.value))}'`;\n }\n}\n\n/**\n * Negative epoch timestamp whose toCDN() emits dt'…' notation.\n * The RFC 3339 string is re-derived from the numeric value on each call.\n */\nexport class CborEpochDtExtNint extends CborNint {\n constructor(\n value: number | bigint,\n options?: { encodingWidth?: EncodingWidth }\n ) {\n super(value, options);\n }\n\n override _toCDN(options: ToCDNOptions | undefined, _depth: number): string {\n if (options?.appStrings === false) return super._toCDN(options, _depth);\n return `${PREFIX_DT}'${epochToRfc3339(Number(this.value))}'`;\n }\n}\n\n/**\n * Float epoch timestamp whose toCDN() emits dt'…' notation.\n * The RFC 3339 string is re-derived from the numeric value on each call.\n */\nexport class CborEpochDtExtFloat extends CborFloat {\n constructor(\n value: number,\n options?: { precision?: 'half' | 'single' | 'double' }\n ) {\n super(value, options);\n }\n\n override _toCDN(options: ToCDNOptions | undefined, _depth: number): string {\n if (options?.appStrings === false) return super._toCDN(options, _depth);\n return `${PREFIX_DT}'${epochToRfc3339(this.value)}'`;\n }\n}\n\n/**\n * CBOR tag(1, epoch) whose toCDN() emits DT'…' notation.\n * The RFC 3339 string is re-derived from the numeric content on each call.\n */\nexport class CborTaggedEpochDtExt extends CborTag {\n constructor(datetime: string, options?: { encodingWidth?: EncodingWidth }) {\n super(TAG_EPOCH, parseDtAppString(datetime), options);\n }\n\n override _toCDN(options: ToCDNOptions | undefined, depth: number): string {\n if (options?.appStrings === false) return super._toCDN(options, depth);\n const c = this.content as\n | CborEpochDtExtUint\n | CborEpochDtExtNint\n | CborEpochDtExtFloat;\n const epochSeconds = c instanceof CborFloat ? c.value : Number(c.value);\n return `${PREFIX_DT_TAGGED}'${epochToRfc3339(epochSeconds)}'`;\n }\n}\n\n/**\n * CBOR tag(1, epoch) whose toJS() returns a plain Date object.\n * Use dt_as_Date (or createDtExtension({ jsDate: true })) to produce these nodes.\n */\nexport class CborTaggedEpochDtAsDateExt extends CborTaggedEpochDtExt {\n constructor(datetime: string, options?: { encodingWidth?: EncodingWidth }) {\n super(datetime, options);\n }\n\n override _toJS(_options?: ToJSOptions): Date {\n const c = this.content as\n | CborEpochDtExtUint\n | CborEpochDtExtNint\n | CborEpochDtExtFloat;\n const epochMs =\n c instanceof CborFloat ? c.value * 1000 : Number(c.value) * 1000;\n return new Date(epochMs);\n }\n}\n\n// ─── Factory ──────────────────────────────────────────────────────────────────\n\n/**\n * Create a dt/DT CborExtension.\n *\n * - `createDtExtension()` — tagged DT values produce `CborTaggedEpochDtExt`;\n * toJS() returns a number (epoch seconds).\n * - `createDtExtension({ jsDate: true })` — tagged DT values produce\n * `CborTaggedEpochDtAsDateExt`; toJS() returns a `Date` object, and\n * `fromJS(Date)` converts `Date` instances back to tagged epoch values.\n */\nexport function createDtExtension(options?: {\n jsDate?: boolean;\n}): CborExtension {\n const useDate = options?.jsDate ?? false;\n\n function makeTagged(\n datetime: string\n ): CborTaggedEpochDtExt | CborTaggedEpochDtAsDateExt {\n return useDate\n ? new CborTaggedEpochDtAsDateExt(datetime)\n : new CborTaggedEpochDtExt(datetime);\n }\n\n const ext: CborExtension = {\n appStringPrefixes: [PREFIX_DT, PREFIX_DT_TAGGED],\n tagNumbers: [TAG_EPOCH],\n\n parseAppString(\n prefix: string,\n content: string,\n onError?: (msg: string) => void\n ): CborItem {\n if (prefix === PREFIX_DT_TAGGED) return makeTagged(content);\n return parseDtAppString(content, onError);\n },\n\n parseAppSequence(\n prefix: string,\n items: CborItem[],\n onError?: (msg: string) => void\n ): CborItem {\n const str = stringFromAppSequence(items);\n if (prefix === PREFIX_DT_TAGGED) return makeTagged(str);\n return parseDtAppString(str, onError);\n },\n\n parseTag(tag: bigint, value: CborItem): CborItem | undefined {\n if (tag !== TAG_EPOCH) return undefined;\n let epochSeconds: number;\n if (value instanceof CborUint) epochSeconds = Number(value.value);\n else if (value instanceof CborNint) epochSeconds = Number(value.value);\n else if (value instanceof CborFloat) epochSeconds = value.value;\n else return undefined;\n return makeTagged(epochToRfc3339(epochSeconds));\n },\n };\n\n if (useDate) {\n ext.fromJS = (\n value: unknown,\n _options: FromJSOptions\n ): CborItem | undefined => {\n if (value instanceof Date)\n return new CborTaggedEpochDtAsDateExt(\n epochToRfc3339(value.getTime() / 1000)\n );\n return undefined;\n };\n ext.isJSType = (value: unknown): value is Date => value instanceof Date;\n }\n\n return ext;\n}\n\n// ─── Extension objects ────────────────────────────────────────────────────────\n\n/**\n * Standard dt/DT CborExtension.\n * Tagged DT values produce CborTaggedEpochDtExt; toJS() returns a number.\n * For Date-based toJS() use dt_as_Date or createDtExtension({ jsDate: true }).\n */\nexport const dt: CborExtension = createDtExtension();\n\n/**\n * Full-featured dt/DT CborExtension with Date support.\n * Tagged DT values produce CborTaggedEpochDtAsDateExt; toJS() returns a Date.\n * fromJS(Date) converts Date instances to tagged epoch values.\n */\nexport const dt_as_Date: CborExtension = createDtExtension({ jsDate: true });\n\nexport default dt;\n","/**\n * Shared IPv4 / IPv6 address parsing and formatting utilities.\n * Used by the \"ip\"/\"IP\" extension (RFC 9164) and the \"cri\"/\"CRI\" extension\n * (draft-ietf-core-href).\n */\n\n// ─── Parsing ──────────────────────────────────────────────────────────────────\n\nexport function parseIPv4(str: string): Uint8Array {\n const parts = str.split('.');\n if (parts.length !== 4)\n throw new SyntaxError(`ip: invalid IPv4 address: ${JSON.stringify(str)}`);\n const bytes = new Uint8Array(4);\n for (let i = 0; i < 4; i++) {\n const s = parts[i];\n if (!/^\\d+$/.test(s) || (s.length > 1 && s[0] === '0'))\n throw new SyntaxError(`ip: invalid IPv4 octet: ${JSON.stringify(s)}`);\n const n = parseInt(s, 10);\n if (n > 255) throw new SyntaxError(`ip: IPv4 octet out of range: ${n}`);\n bytes[i] = n;\n }\n return bytes;\n}\n\nexport function parseIPv6(str: string): Uint8Array {\n const bytes = new Uint8Array(16);\n if (str === '::') return bytes;\n\n // Handle IPv4-mapped suffix, e.g. ::ffff:192.0.2.1\n let head = str;\n let ipv4Tail: Uint8Array | null = null;\n const ipv4Match = str.match(/^(.*):(\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3})$/);\n if (ipv4Match) {\n head = ipv4Match[1];\n if (head.endsWith(':')) head += ':'; // restore :: split by the regex\n ipv4Tail = parseIPv4(ipv4Match[2]);\n }\n\n const halves = head.split('::');\n if (halves.length > 2)\n throw new SyntaxError(`ip: invalid IPv6 address: ${JSON.stringify(str)}`);\n\n const doubleColon = halves.length === 2;\n const leftParts = halves[0] ? halves[0].split(':') : [];\n const rightParts = doubleColon && halves[1] ? halves[1].split(':') : [];\n const totalGroups = ipv4Tail ? 6 : 8;\n\n if (!doubleColon && leftParts.length !== totalGroups)\n throw new SyntaxError(`ip: invalid IPv6 address: ${JSON.stringify(str)}`);\n if (doubleColon && leftParts.length + rightParts.length >= totalGroups)\n throw new SyntaxError(`ip: invalid IPv6 address: ${JSON.stringify(str)}`);\n\n const zeroCount = totalGroups - leftParts.length - rightParts.length;\n const groups = [...leftParts, ...Array(zeroCount).fill('0'), ...rightParts];\n\n let offset = 0;\n for (const g of groups) {\n if (!/^[0-9a-fA-F]{1,4}$/.test(g))\n throw new SyntaxError(`ip: invalid IPv6 group: ${JSON.stringify(g)}`);\n const n = parseInt(g, 16);\n bytes[offset++] = (n >> 8) & 0xff;\n bytes[offset++] = n & 0xff;\n }\n if (ipv4Tail) bytes.set(ipv4Tail, 12);\n return bytes;\n}\n\n// ─── Formatting ───────────────────────────────────────────────────────────────\n\nexport function formatIPv4(bytes: Uint8Array): string {\n return Array.from(bytes).join('.');\n}\n\nexport function formatIPv6(bytes: Uint8Array): string {\n // RFC 5952 §5: IPv4-mapped (::ffff:a.b.c.d) — bytes 0-9 zero, 10-11 = 0xffff\n const isIpv4Mapped =\n bytes.slice(0, 10).every((b) => b === 0) &&\n bytes[10] === 0xff &&\n bytes[11] === 0xff;\n\n const ipv4Suffix = isIpv4Mapped ? formatIPv4(bytes.slice(12)) : null;\n\n const hexGroups = ipv4Suffix ? 6 : 8;\n const groups: number[] = [];\n for (let i = 0; i < hexGroups * 2; i += 2)\n groups.push((bytes[i] << 8) | bytes[i + 1]);\n\n // RFC 5952 §4.2.3: find longest run of consecutive zero groups (≥ 2) for ::\n let bestStart = -1,\n bestLen = 0;\n let i = 0;\n while (i < hexGroups) {\n if (groups[i] === 0) {\n let j = i + 1;\n while (j < hexGroups && groups[j] === 0) j++;\n if (j - i > bestLen) {\n bestStart = i;\n bestLen = j - i;\n }\n i = j;\n } else {\n i++;\n }\n }\n if (bestLen < 2) bestStart = -1;\n\n const fmt = (g: number) => g.toString(16);\n let hexPart: string;\n if (bestStart === -1) {\n hexPart = groups.map(fmt).join(':');\n } else {\n const left = groups.slice(0, bestStart).map(fmt).join(':');\n const right = groups\n .slice(bestStart + bestLen)\n .map(fmt)\n .join(':');\n hexPart = `${left}::${right}`;\n }\n\n return ipv4Suffix ? `${hexPart}:${ipv4Suffix}` : hexPart;\n}\n","/**\n * CDN \"ip\" / \"IP\" application-extension (§3.2 of draft-ietf-cbor-edn-literals-25).\n *\n * Parses IPv4 / IPv6 address strings (RFC 3986 §3.2.2) into byte strings,\n * and optionally wraps them in CBOR tags per RFC 9164:\n * - tag 52 IPv4 address or prefix\n * - tag 54 IPv6 address or prefix\n *\n * Syntax:\n * ip'192.0.2.42' → CborIpExt bare 4-byte string\n * ip'2001:db8::1' → CborIpExt bare 16-byte string\n * ip'192.0.2.0/24' → CborIpPrefixExt bare [24, h'c00002']\n * ip'2001:db8::/32' → CborIpPrefixExt bare [32, h'20010db8']\n * IP'192.0.2.42' → CborTaggedIpExt tag(52, h'...')\n * IP'2001:db8::1' → CborTaggedIpExt tag(54, h'...')\n * IP'192.0.2.0/24' → CborTaggedIpExt tag(52, [24, h'c00002'])\n * IP'2001:db8::/32' → CborTaggedIpExt tag(54, [32, h'20010db8'])\n *\n * Lowercase ip produces the unwrapped content; uppercase IP additionally\n * wraps it in the IANA address family tag (52 for IPv4, 54 for IPv6).\n */\n\nimport type { ToCDNOptions } from '../types';\nimport type { CborExtension } from './types';\nimport type { CborItem } from '../ast/CborItem';\nimport { CborByteString } from '../ast/CborByteString';\nimport { CborTag } from '../ast/CborTag';\nimport { CborArray } from '../ast/CborArray';\nimport { CborUint } from '../ast/CborUint';\nimport { CborTextString } from '../ast/CborTextString';\nimport { parseIPv4, parseIPv6, formatIPv4, formatIPv6 } from '../utils/ip';\n\nconst PREFIX_IP = 'ip';\nconst PREFIX_IP_TAGGED = 'IP';\nconst TAG_IPV4 = 52n;\nconst TAG_IPV6 = 54n;\n\nfunction stringFromAppSequence(items: CborItem[]): string {\n if (items.length !== 1)\n throw new SyntaxError('ip<<...>>: expected exactly one item');\n const item = items[0];\n if (item instanceof CborTextString) return item.value;\n if (item instanceof CborByteString)\n return new TextDecoder('utf-8', { fatal: true }).decode(item.value);\n throw new SyntaxError('ip<<...>>: expected a text string or byte string');\n}\n\n// ─── Address parsing ──────────────────────────────────────────────────────────\n\nfunction parseAddress(str: string): { bytes: Uint8Array; isV4: boolean } {\n if (/^\\d/.test(str) && str.includes('.') && !str.includes(':'))\n return { bytes: parseIPv4(str), isV4: true };\n return { bytes: parseIPv6(str), isV4: false };\n}\n\n// ─── Address formatting ───────────────────────────────────────────────────────\n\nfunction formatAddress(bytes: Uint8Array): string {\n if (bytes.length === 4) return formatIPv4(bytes);\n if (bytes.length === 16) return formatIPv6(bytes);\n throw new SyntaxError(`ip: unexpected byte length: ${bytes.length}`);\n}\n\n// ─── CIDR helpers ─────────────────────────────────────────────────────────────\n\nfunction truncateToPrefix(bytes: Uint8Array, prefixLen: number): Uint8Array {\n // RFC 9164 §2.3: zero host bits, then strip trailing zero bytes.\n const masked = new Uint8Array(bytes.length);\n masked.set(bytes);\n const fullBytes = Math.floor(prefixLen / 8);\n const extraBits = prefixLen % 8;\n if (extraBits > 0 && fullBytes < bytes.length)\n masked[fullBytes] &= (0xff << (8 - extraBits)) & 0xff;\n for (let i = fullBytes + (extraBits > 0 ? 1 : 0); i < bytes.length; i++)\n masked[i] = 0;\n let end = Math.ceil(prefixLen / 8);\n while (end > 0 && masked[end - 1] === 0) end--;\n return masked.slice(0, end);\n}\n\nfunction expandToFull(truncated: Uint8Array, fullLen: number): Uint8Array {\n const full = new Uint8Array(fullLen);\n full.set(truncated);\n return full;\n}\n\n// ─── CborItem subclasses ─────────────────────────────────────────────────────\n\n/**\n * Bare IP address byte string whose toCDN() emits ip'…' notation.\n */\nexport class CborIpExt extends CborByteString {\n override _toCDN(options: ToCDNOptions | undefined, _depth: number): string {\n if (options?.appStrings === false) return super._toCDN(options, _depth);\n return `${PREFIX_IP}'${formatAddress(this.value)}'`;\n }\n}\n\n/**\n * Bare IP address prefix (CIDR) whose toCDN() emits ip'…/prefix' notation.\n * Encoded as [prefixLen, truncatedBytes] per RFC 9164 §2.3, without a tag.\n */\nexport class CborIpPrefixExt extends CborArray {\n private readonly _isV4: boolean;\n\n constructor(prefixLen: number, truncated: Uint8Array, isV4: boolean) {\n super([new CborUint(BigInt(prefixLen)), new CborByteString(truncated)]);\n this._isV4 = isV4;\n }\n\n override _toCDN(options: ToCDNOptions | undefined, depth: number): string {\n if (options?.appStrings === false) return super._toCDN(options, depth);\n const prefixLen = Number((this.items[0] as CborUint).value);\n const truncated = (this.items[1] as CborByteString).value;\n const full = expandToFull(truncated, this._isV4 ? 4 : 16);\n return `${PREFIX_IP}'${formatAddress(full)}/${prefixLen}'`;\n }\n}\n\n/**\n * CBOR tag(52/54, …) IP address whose toCDN() emits IP'…' notation.\n * Content may be a byte string (plain address) or an array [prefix, bytes]\n * (CIDR prefix per RFC 9164).\n */\nexport class CborTaggedIpExt extends CborTag {\n constructor(tag: bigint, content: CborItem) {\n super(tag, content);\n }\n\n override _toCDN(options: ToCDNOptions | undefined, depth: number): string {\n if (options?.appStrings === false) return super._toCDN(options, depth);\n const fullLen = this.tag === TAG_IPV4 ? 4 : 16;\n const c = this.content as CborItem;\n if (c instanceof CborByteString) {\n return `${PREFIX_IP_TAGGED}'${formatAddress(c.value)}'`;\n }\n if (\n c instanceof CborArray &&\n c.items.length === 2 &&\n c.items[0] instanceof CborUint &&\n c.items[1] instanceof CborByteString\n ) {\n const prefixLen = Number((c.items[0] as CborUint).value);\n const full = expandToFull((c.items[1] as CborByteString).value, fullLen);\n return `${PREFIX_IP_TAGGED}'${formatAddress(full)}/${prefixLen}'`;\n }\n return super._toCDN(options, depth);\n }\n}\n\n// ─── Factory ──────────────────────────────────────────────────────────────────\n\nfunction buildIpValue(prefix: string, content: string): CborItem {\n const slashIdx = content.indexOf('/');\n\n if (slashIdx === -1) {\n const { bytes, isV4 } = parseAddress(content);\n if (prefix === PREFIX_IP_TAGGED)\n return new CborTaggedIpExt(\n isV4 ? TAG_IPV4 : TAG_IPV6,\n new CborByteString(bytes)\n );\n return new CborIpExt(bytes);\n }\n\n // CIDR notation — supported with both lowercase ip and uppercase IP.\n // lowercase ip → bare [prefixLen, truncatedBytes] (no tag)\n // uppercase IP → tag(52/54, [prefixLen, truncatedBytes])\n const addrStr = content.slice(0, slashIdx);\n const lenStr = content.slice(slashIdx + 1);\n if (!/^\\d+$/.test(lenStr))\n throw new SyntaxError(\n `ip: invalid prefix length: ${JSON.stringify(lenStr)}`\n );\n const prefixLen = parseInt(lenStr, 10);\n\n const { bytes, isV4 } = parseAddress(addrStr);\n const maxLen = isV4 ? 32 : 128;\n if (prefixLen > maxLen)\n throw new SyntaxError(\n `ip: prefix length ${prefixLen} exceeds maximum ${maxLen} for ${isV4 ? 'IPv4' : 'IPv6'}`\n );\n\n const truncated = truncateToPrefix(bytes, prefixLen);\n if (prefix === PREFIX_IP_TAGGED) {\n return new CborTaggedIpExt(\n isV4 ? TAG_IPV4 : TAG_IPV6,\n new CborArray([\n new CborUint(BigInt(prefixLen)),\n new CborByteString(truncated),\n ])\n );\n }\n return new CborIpPrefixExt(prefixLen, truncated, isV4);\n}\n\n// ─── Factory ──────────────────────────────────────────────────────────────────\n\n/**\n * Create an ip/IP CborExtension (RFC 9164 / §3.2 of draft-ietf-cbor-edn-literals-25).\n *\n * - `ip'addr'` → CborIpExt (bare byte string, 4 or 16 bytes)\n * - `IP'addr'` → CborTaggedIpExt tag(52 or 54, bytes)\n * - `IP'addr/prefix'` → CborTaggedIpExt tag(52 or 54, [prefix_len, bytes])\n * - parseTag(52/54, …) → CborTaggedIpExt (reversible via fromCBOR)\n * - fromJS(tagged obj) → CborTaggedIpExt (reversible via fromJS)\n */\nexport const ip: CborExtension = {\n appStringPrefixes: [PREFIX_IP, PREFIX_IP_TAGGED],\n tagNumbers: [TAG_IPV4, TAG_IPV6],\n\n parseAppString(prefix: string, content: string): CborItem {\n return buildIpValue(prefix, content);\n },\n\n parseAppSequence(prefix: string, items: CborItem[]): CborItem {\n return buildIpValue(prefix, stringFromAppSequence(items));\n },\n\n parseTag(tag: bigint, value: CborItem): CborItem | undefined {\n if (tag !== TAG_IPV4 && tag !== TAG_IPV6) return undefined;\n if (value instanceof CborByteString || value instanceof CborArray)\n return new CborTaggedIpExt(tag, value);\n return undefined;\n },\n};\n\nexport default ip;\n","/**\n * Built-in bignum extension (RFC 8949 §3.4.3).\n *\n * Intercepts tag 2 (unsigned bignum) and tag 3 (negative bignum) during\n * fromCBOR() and fromCDN() so that out-of-range values are decoded as\n * CborBigUint / CborBigNint rather than plain CborTag nodes.\n *\n * In-range values (those that fit in uint64 / nint64) are left as plain\n * CborTag so that non-canonical bignum encodings of small integers don't\n * silently change behaviour.\n */\n\nimport type { CborExtension } from './types';\nimport type { CborItem } from '../ast/CborItem';\nimport { CborByteString } from '../ast/CborByteString';\nimport {\n CborBigUint,\n CborBigNint,\n bytesToBigint,\n BIGNUM_UINT_TAG,\n BIGNUM_NINT_TAG,\n} from '../ast/CborBignum';\n\nconst UINT64_MAX = 0xffff_ffff_ffff_ffffn;\nconst NINT64_MIN = -(UINT64_MAX + 1n);\n\nexport const bignum: CborExtension = {\n tagNumbers: [BIGNUM_UINT_TAG, BIGNUM_NINT_TAG],\n\n parseTag(tag: bigint, value: CborItem): CborItem | undefined {\n if (!(value instanceof CborByteString)) return undefined;\n\n if (tag === BIGNUM_UINT_TAG) {\n const n = bytesToBigint(value.value);\n if (n > UINT64_MAX) return new CborBigUint(n);\n return undefined; // fits in uint64 — leave as plain CborTag\n }\n\n if (tag === BIGNUM_NINT_TAG) {\n const n = -1n - bytesToBigint(value.value);\n if (n < NINT64_MIN) return new CborBigNint(n);\n return undefined; // fits in nint64 — leave as plain CborTag\n }\n\n return undefined;\n },\n};\n\nexport default bignum;\n","/**\n * Standard CDN \"cri\" / \"CRI\" application-extension (§3.4 and §5.2.5 of draft-ietf-cbor-edn-literals-25).\n *\n * Converts URI references (RFC 3986) to CRI (Constrained Resource Identifier,\n * draft-ietf-core-href) CBOR array format and back.\n *\n * Syntax:\n * cri'https://example.com/path' → bare CRI array (no CBOR tag)\n * CRI'https://example.com/path' → tag(99, CRI array)\n *\n * CRI array structures (trailing defaults removed):\n * Absolute: [scheme, authority, path, ?query, ?fragment]\n * Network-path: [false, authority, path, ?query, ?fragment]\n * Absolute-path: [true, path, ?query, ?fragment]\n * Relative-path: [uint(discard), path, ?query, ?fragment]\n * Same-document: [0, ?query, ?fragment]\n *\n * where:\n * scheme = scheme-id (nint, e.g. -4 for https) or scheme-name (text)\n * authority = [?userinfo, host, ?port] — host is text labels or IP bytes\n * path = [\"seg1\", \"seg2\", ...]\n * query = [\"k=v\", ...]\n * fragment = text\n * discard = uint — number of path segments to remove from base before appending\n * (1 = same directory, 2 = one level up \"../\", N = (N-1) levels up)\n *\n * Tag number 99 is used for the tagged \"CRI\" variant (§3.4 of draft-ietf-cbor-edn-literals-25).\n */\n\nimport type { ToCDNOptions } from '../types';\nimport type { CborExtension } from './types';\nimport type { CborItem } from '../ast/CborItem';\nimport { CborArray } from '../ast/CborArray';\nimport { CborTag } from '../ast/CborTag';\nimport { CborNint } from '../ast/CborNint';\nimport { CborUint } from '../ast/CborUint';\nimport { CborTextString } from '../ast/CborTextString';\nimport { CborByteString } from '../ast/CborByteString';\nimport { CborSimple } from '../ast/CborSimple';\nimport { parseIPv4, parseIPv6, formatIPv4, formatIPv6 } from '../utils/ip';\n\n// ─── Constants ────────────────────────────────────────────────────────────────\n\nconst PREFIX_CRI = 'cri';\nconst PREFIX_CRI_TAGGED = 'CRI';\n\n/**\n * CBOR tag number for the tagged CRI variant (§3.4 and §5.2.5 of draft-ietf-cbor-edn-literals-25).\n */\nexport const TAG_CRI = 99n;\n\n// ─── Scheme-ID table ──────────────────────────────────────────────────────────\n\n/**\n * Scheme-id values from the IANA URI Schemes Registry.\n * Formula: scheme-id = -(scheme-number + 1)\n * https://www.iana.org/assignments/uri-schemes/uri-schemes.xhtml\n */\nconst SCHEME_ID_BY_NAME = new Map<string, bigint>([\n ['coap', -1n],\n ['coaps', -2n],\n ['http', -3n],\n ['https', -4n],\n ['urn', -5n],\n ['did', -6n],\n ['coap+tcp', -7n],\n ['coaps+tcp', -8n],\n ['coap+ws', -25n],\n ['coaps+ws', -26n],\n]);\n\nconst SCHEME_NAME_BY_ID = new Map<bigint, string>(\n [...SCHEME_ID_BY_NAME.entries()].map(([name, id]) => [id, name])\n);\n\n// ─── Percent-encoding helpers ─────────────────────────────────────────────────\n\nfunction pctDecode(s: string): string {\n try {\n return decodeURIComponent(s);\n } catch {\n return s;\n }\n}\n\nfunction pctEncodeChar(c: string): string {\n return Array.from(\n new TextEncoder().encode(c),\n (b) => `%${b.toString(16).toUpperCase().padStart(2, '0')}`\n ).join('');\n}\n\nfunction encodePct(s: string, isAllowed: (c: string) => boolean): string {\n let out = '';\n for (const c of s) {\n out += isAllowed(c) ? c : pctEncodeChar(c);\n }\n return out;\n}\n\n// unreserved = A-Za-z0-9 \"-\" \".\" \"_\" \"~\"\n// sub-delims = \"!\" / \"$\" / \"&\" / \"'\" / \"(\" / \")\" / \"*\" / \"+\" / \",\" / \";\" / \"=\"\nfunction isUnreserved(c: string): boolean {\n return /[A-Za-z0-9\\-._~]/.test(c);\n}\nfunction isSubDelim(c: string): boolean {\n return /[!$&'()*+,;=]/.test(c);\n}\n\n// path segment: unreserved | sub-delims | \":\" | \"@\"\nfunction isPathAllowed(c: string): boolean {\n return isUnreserved(c) || isSubDelim(c) || c === ':' || c === '@';\n}\n\n// query item: path chars | \"/\" | \"?\" — but NOT \"&\" (used as item separator between items)\nfunction isQueryItemAllowed(c: string): boolean {\n return (isPathAllowed(c) || c === '/' || c === '?') && c !== '&';\n}\n\n// fragment: same as query\nfunction isFragmentAllowed(c: string): boolean {\n return isPathAllowed(c) || c === '/' || c === '?';\n}\n\n// userinfo: unreserved | sub-delims | \":\" (RFC 3986 §3.2.1: \":\" is allowed in userinfo)\nfunction isUserinfoAllowed(c: string): boolean {\n return isUnreserved(c) || isSubDelim(c) || c === ':';\n}\n\n// registered name label: unreserved | sub-delims\nfunction isRegNameAllowed(c: string): boolean {\n return isUnreserved(c) || isSubDelim(c);\n}\n\n// ─── Authority conversion ──────────────────────────────────────────────────────\n\n/**\n * Parse URI authority string → CRI authority array.\n *\n * CRI authority = [?userinfo, host, ?port]\n * userinfo = (false, text) — two inline elements\n * host-name = *text — zero-or-more text labels, inline\n * host-ip = bytes (4 or 16 bytes) — single inline element\n * port = uint 0..65535 — trailing optional element\n */\nfunction parseAuthorityStr(authStr: string): CborArray {\n const items: CborItem[] = [];\n let str = authStr;\n\n // Strip userinfo (everything up to the last '@')\n const atIdx = str.indexOf('@');\n if (atIdx >= 0) {\n items.push(CborSimple.FALSE);\n items.push(new CborTextString(pctDecode(str.slice(0, atIdx))));\n str = str.slice(atIdx + 1);\n }\n\n // IPv6 bracket literal: [addr]:port\n let hostStr: string;\n let portStr: string | null = null;\n\n if (str.startsWith('[')) {\n const close = str.indexOf(']');\n if (close < 0)\n throw new SyntaxError('cri: unterminated IPv6 bracket in authority');\n hostStr = str.slice(1, close);\n const after = str.slice(close + 1);\n if (after.startsWith(':')) portStr = after.slice(1);\n else if (after.length > 0)\n throw new SyntaxError(\n `cri: unexpected characters after ']' in authority`\n );\n items.push(new CborByteString(parseIPv6(hostStr)));\n } else {\n // IPv4 address or registered name — find port via last ':'\n const colonIdx = str.lastIndexOf(':');\n if (colonIdx >= 0) {\n hostStr = str.slice(0, colonIdx);\n portStr = str.slice(colonIdx + 1);\n } else {\n hostStr = str;\n }\n\n if (hostStr === '') {\n // Empty host (e.g. file:///path) — zero labels, nothing pushed\n } else if (/^\\d{1,3}(\\.\\d{1,3}){3}$/.test(hostStr)) {\n items.push(new CborByteString(parseIPv4(hostStr)));\n } else {\n // Registered name: split by '.' into lowercase labels\n for (const label of hostStr.toLowerCase().split('.')) {\n items.push(new CborTextString(label));\n }\n }\n }\n\n // Optional port\n if (portStr !== null && portStr !== '') {\n if (!/^\\d+$/.test(portStr))\n throw new SyntaxError(`cri: invalid port: ${JSON.stringify(portStr)}`);\n const port = parseInt(portStr, 10);\n if (port > 65535) throw new SyntaxError(`cri: port ${port} out of range`);\n items.push(new CborUint(BigInt(port)));\n }\n\n return new CborArray(items);\n}\n\n/**\n * Convert CRI authority array → URI authority string.\n */\nfunction criAuthorityToUri(auth: CborArray): string {\n const items = auth.items;\n let idx = 0;\n let result = '';\n\n // Userinfo: (false, text) as two consecutive elements\n if (\n idx < items.length &&\n items[idx] instanceof CborSimple &&\n (items[idx] as CborSimple).value === 20\n ) {\n idx++; // skip false sentinel\n const user = items[idx++] as CborTextString;\n result += encodePct(user.value, isUserinfoAllowed) + '@';\n }\n\n if (idx >= items.length) return result; // empty host\n\n const hostFirst = items[idx];\n if (hostFirst instanceof CborByteString) {\n idx++;\n const { length } = hostFirst.value;\n if (length === 4) {\n result += formatIPv4(hostFirst.value);\n } else if (length === 16) {\n result += '[' + formatIPv6(hostFirst.value) + ']';\n } else {\n throw new Error(`cri: unexpected host-ip byte length: ${length}`);\n }\n // Optional zone-id (text string immediately after the IP bytes)\n if (idx < items.length && items[idx] instanceof CborTextString) {\n result += `%25${encodePct((items[idx++] as CborTextString).value, isRegNameAllowed)}`;\n }\n } else {\n // Registered name: consecutive text strings up to the optional uint port\n const labels: string[] = [];\n while (idx < items.length && items[idx] instanceof CborTextString) {\n labels.push(\n encodePct((items[idx++] as CborTextString).value, isRegNameAllowed)\n );\n }\n result += labels.join('.');\n }\n\n // Optional port\n if (idx < items.length && items[idx] instanceof CborUint) {\n result += ':' + (items[idx] as CborUint).value.toString();\n }\n\n return result;\n}\n\n// ─── CRI array ↔ URI string ───────────────────────────────────────────────────\n\n/**\n * Parse `//authority/path` from a string starting with `//`.\n * Returns the CRI authority array and path segments.\n */\nfunction _parseHierarchicalPart(rest: string): {\n authority: CborArray;\n pathSegments: CborTextString[];\n} {\n const afterSlashes = rest.slice(2);\n const slashIdx = afterSlashes.indexOf('/');\n let authStr: string;\n let pathSegments: CborTextString[];\n if (slashIdx >= 0) {\n authStr = afterSlashes.slice(0, slashIdx);\n const pathStr = afterSlashes.slice(slashIdx + 1);\n pathSegments = pathStr\n .split('/')\n .map((s) => new CborTextString(pctDecode(s)));\n } else {\n authStr = afterSlashes;\n pathSegments = [];\n }\n return { authority: parseAuthorityStr(authStr), pathSegments };\n}\n\n/**\n * Parse a URI or URI-reference string into CRI array items.\n *\n * Supports all RFC 3986 reference forms:\n * Absolute URI: https://example.com/path → [scheme, authority, path, ...]\n * Network-path ref: //other.example.com/path → [false, authority, path, ...]\n * Absolute-path ref: /abs/path → [true, path, ...]\n * Relative-path ref: foo, ../bar → [uint(discard), path, ...]\n * Same-document ref: #frag, ?q=1, (empty) → [0, ...]\n *\n * Produces a compact representation with trailing defaults removed.\n */\nfunction uriToCriItems(str: string): CborItem[] {\n // ── 1. Fragment ────────────────────────────────────────────────────────────\n let rest = str;\n let fragment: string | null = null;\n const hashIdx = rest.indexOf('#');\n if (hashIdx >= 0) {\n fragment = pctDecode(rest.slice(hashIdx + 1));\n rest = rest.slice(0, hashIdx);\n }\n\n // ── 2. Query ───────────────────────────────────────────────────────────────\n let queryItems: CborTextString[] | null = null;\n const qIdx = rest.indexOf('?');\n if (qIdx >= 0) {\n const qs = rest.slice(qIdx + 1);\n rest = rest.slice(0, qIdx);\n // Per draft-ietf-core-href §5.1:\n // [] (empty array) = absent query (no \"?\") — this is the trailing default\n // [\"\"] (one empty string) = present but empty query (\"?\")\n // [\"k=v\", ...] = query with parameters\n queryItems = qs.split('&').map((s) => new CborTextString(pctDecode(s)));\n }\n\n // ── 3. Detect reference form and build leading items ───────────────────────\n const items: CborItem[] = [];\n\n const schemeMatch = /^([a-zA-Z][a-zA-Z0-9+.\\-]*):([\\s\\S]*)$/.exec(rest);\n if (schemeMatch) {\n // Absolute URI: scheme + hier-part\n const schemeName = schemeMatch[1].toLowerCase();\n const hierPart = schemeMatch[2];\n const schemeId = SCHEME_ID_BY_NAME.get(schemeName);\n items.push(\n schemeId !== undefined\n ? new CborNint(schemeId)\n : new CborTextString(schemeName)\n );\n if (hierPart.startsWith('//')) {\n const { authority, pathSegments } = _parseHierarchicalPart(hierPart);\n items.push(authority, new CborArray(pathSegments));\n } else if (hierPart.startsWith('/')) {\n const pathSegments = hierPart\n .slice(1)\n .split('/')\n .map((s) => new CborTextString(pctDecode(s)));\n items.push(CborSimple.NULL, new CborArray(pathSegments));\n } else {\n const pathSegments = hierPart\n .split('/')\n .map((s) => new CborTextString(pctDecode(s)));\n items.push(CborSimple.TRUE, new CborArray(pathSegments));\n }\n } else if (rest.startsWith('//')) {\n // Network-path reference: //authority/path\n const { authority, pathSegments } = _parseHierarchicalPart(rest);\n items.push(CborSimple.FALSE, authority, new CborArray(pathSegments));\n } else if (rest.startsWith('/')) {\n // Absolute-path reference: /path\n const pathSegments = rest\n .slice(1)\n .split('/')\n .map((s) => new CborTextString(pctDecode(s)));\n items.push(CborSimple.TRUE, new CborArray(pathSegments));\n } else if (rest === '') {\n // Same-document reference (only query/fragment differ from base)\n items.push(new CborUint(0n));\n } else {\n // Relative-path reference: count leading ../ sequences\n let discard = 1n;\n let pathRest = rest;\n let hasDotSlash = false;\n if (pathRest.startsWith('./')) {\n hasDotSlash = true;\n pathRest = pathRest.slice(2);\n }\n while (pathRest.startsWith('../')) {\n discard++;\n pathRest = pathRest.slice(3);\n }\n // Handle lone '..' or '.' at end\n if (pathRest === '..') {\n discard++;\n pathRest = '';\n } else if (pathRest === '.') {\n pathRest = '';\n }\n // RFC 3986 §3.3 path-noscheme: the first segment of a relative-path reference\n // must not contain ':' unless the path was explicitly prefixed with \"./\"\n // (which disambiguates it from a scheme). Without \"./\" the colon makes the\n // reference look like an absolute URI to parsers, and is most likely a typo.\n // This check applies only when discard=1 (same-directory) and no \"./\" was given.\n // For discard≥2 (e.g. \"../foo:bar\") the leading \"../\" already disambiguates.\n if (discard === 1n && !hasDotSlash && pathRest !== '') {\n const firstSeg = pathRest.split('/')[0];\n if (firstSeg.includes(':'))\n throw new SyntaxError(\n `cri: invalid relative-path reference — first segment must not contain ':' without a './' prefix (RFC 3986 §3.3): ${JSON.stringify(str)}`\n );\n }\n const pathSegments =\n pathRest === ''\n ? []\n : pathRest.split('/').map((s) => new CborTextString(pctDecode(s)));\n items.push(new CborUint(discard), new CborArray(pathSegments));\n }\n\n // ── 4. Append query and fragment ──────────────────────────────────────────\n if (queryItems !== null) items.push(new CborArray(queryItems));\n if (fragment !== null) {\n // When fragment is present but query is absent, use null as placeholder so that\n // \"no query\" is distinguishable from \"empty query []\" at the query position.\n if (queryItems === null) items.push(CborSimple.NULL);\n items.push(new CborTextString(fragment));\n }\n\n // ── 5. Trim trailing defaults ─────────────────────────────────────────────\n // Remove null placeholder for absent query (always at items.length - 2 when present)\n if (fragment !== null && queryItems === null) {\n items.splice(items.length - 2, 1);\n }\n // Remove trailing empty PATH array — but only when it is truly the last element\n // (i.e., neither a query nor a fragment follows it). An empty QUERY array []\n // means \"query is present but empty\" (?), which must be preserved.\n if (queryItems === null && fragment === null) {\n const last = items[items.length - 1];\n if (last instanceof CborArray && last.items.length === 0) {\n items.pop();\n }\n }\n\n // ── 6. Canonical same-document form ──────────────────────────────────────\n // Per §5.2: [discard=0] with no other items is sent as [] (empty array).\n if (\n items.length === 1 &&\n items[0] instanceof CborUint &&\n (items[0] as CborUint).value === 0n\n ) {\n return [];\n }\n\n return items;\n}\n\n/**\n * Encode query and fragment items from `items[startIdx..]` into a URI suffix string.\n * Handles both the `[] = empty query`, `[items] = query params`, `null = absent query`,\n * and optional trailing text fragment.\n */\nfunction _criSuffix(items: readonly CborItem[], startIdx: number): string {\n let idx = startIdx;\n let result = '';\n\n if (idx < items.length) {\n const qi = items[idx];\n if (qi instanceof CborArray) {\n idx++;\n // Per §5.1 / draft-ietf-core-href:\n // [] (empty array) = absent query — omit \"?\" entirely (trailing default)\n // [\"\"] = present but empty query — emit \"?\"\n // [\"k=v\", ...] = query with parameters — emit \"?k=v&...\"\n if (qi.items.length > 0) {\n const params = qi.items.map((s) => {\n if (!(s instanceof CborTextString))\n throw new Error('cri: query item must be a text string');\n return encodePct(s.value, isQueryItemAllowed);\n });\n result += '?' + params.join('&');\n }\n // [] = absent query → no '?' emitted\n } else if (qi instanceof CborSimple && qi.value === 22) {\n idx++; // explicit null = absent query component\n }\n // else: not a query item (text fragment follows); leave idx unchanged\n }\n\n if (idx < items.length && items[idx] instanceof CborTextString) {\n result +=\n '#' + encodePct((items[idx] as CborTextString).value, isFragmentAllowed);\n }\n\n return result;\n}\n\n/**\n * Encode a CRI path array into URI path segments.\n */\nfunction _criPathSegs(pathArr: CborArray): string[] {\n return pathArr.items.map((s) => {\n if (!(s instanceof CborTextString))\n throw new Error('cri: path segment must be a text string');\n return encodePct(s.value, isPathAllowed);\n });\n}\n\n/**\n * Convert CRI array items → URI string.\n *\n * Handles all CRI reference forms:\n * Absolute: first element is CborNint or CborTextString (scheme)\n * Network-path: first element is false (CborSimple(20))\n * Absolute-path: first element is true (CborSimple(21))\n * Relative-path: first element is CborUint (discard count ≥ 1)\n * Same-document: first element is CborUint(0)\n */\nfunction criItemsToUri(items: readonly CborItem[]): string {\n // Per §5.2: [] (empty array) is the canonical form of the same-document\n // reference [discard=0] with no query or fragment.\n if (items.length === 0) return '';\n\n let idx = 0;\n const first = items[idx++];\n\n // ── Absolute URI ──────────────────────────────────────────────────────────\n if (first instanceof CborNint || first instanceof CborTextString) {\n let schemePart: string;\n if (first instanceof CborNint) {\n const name = SCHEME_NAME_BY_ID.get(first.value);\n if (name === undefined)\n throw new Error(`cri: unrecognised scheme-id ${first.value}`);\n schemePart = name + ':';\n } else {\n schemePart = (first as CborTextString).value + ':';\n }\n\n if (idx >= items.length) return schemePart;\n\n const second = items[idx++];\n let authorityPart = '';\n let rootedPath = false;\n\n if (second instanceof CborArray) {\n authorityPart = '//' + criAuthorityToUri(second);\n rootedPath = true;\n } else if (second instanceof CborSimple) {\n if (second.value === 22)\n rootedPath = true; // null = NOAUTH-ROOTBASED\n else if (second.value === 21)\n rootedPath = false; // true = NOAUTH-ROOTLESS\n else\n throw new Error(\n `cri: unexpected no-authority value: simple(${second.value})`\n );\n } else {\n throw new Error('cri: unexpected type for authority element');\n }\n\n let pathPart = '';\n if (idx < items.length && items[idx] instanceof CborArray) {\n const pathArr = items[idx++] as CborArray;\n if (pathArr.items.length > 0) {\n pathPart = (rootedPath ? '/' : '') + _criPathSegs(pathArr).join('/');\n }\n }\n\n return schemePart + authorityPart + pathPart + _criSuffix(items, idx);\n }\n\n // ── Network-path reference: [false, authority-array, path-array, ...] ─────\n if (first instanceof CborSimple && first.value === 20) {\n if (idx >= items.length || !(items[idx] instanceof CborArray))\n throw new Error(\n 'cri: network-path reference requires an authority array'\n );\n const authority = criAuthorityToUri(items[idx++] as CborArray);\n let pathPart = '';\n if (idx < items.length && items[idx] instanceof CborArray) {\n const pathArr = items[idx++] as CborArray;\n if (pathArr.items.length > 0) {\n pathPart = '/' + _criPathSegs(pathArr).join('/');\n }\n }\n return '//' + authority + pathPart + _criSuffix(items, idx);\n }\n\n // ── Absolute-path reference: [true, path-array, ...] ─────────────────────\n if (first instanceof CborSimple && first.value === 21) {\n let pathPart = '/';\n if (idx < items.length && items[idx] instanceof CborArray) {\n const pathArr = items[idx++] as CborArray;\n pathPart = '/' + _criPathSegs(pathArr).join('/');\n }\n return pathPart + _criSuffix(items, idx);\n }\n\n // ── Relative-path / same-document: [uint(discard), ...] ──────────────────\n if (first instanceof CborUint) {\n const discard = first.value;\n\n if (discard === 0n) {\n // Same-document reference: path unchanged, only query/fragment differ\n return _criSuffix(items, idx);\n }\n\n // discard=1 → same directory (no \"../\" prefix)\n // discard=N → (N-1) \"../\" prefixes\n const dotdots = discard === 1n ? '' : '../'.repeat(Number(discard) - 1);\n\n let pathPart: string;\n if (idx < items.length && items[idx] instanceof CborArray) {\n const pathArr = items[idx++] as CborArray;\n if (pathArr.items.length > 0) {\n const segs = _criPathSegs(pathArr);\n // §6.1: when discard=1, prefix with \"./\" if the first segment contains \":\"\n // to prevent URI parsers from misreading it as a scheme (RFC 3986 §3.3).\n const needsDotSlash = discard === 1n && segs[0].includes(':');\n pathPart = (needsDotSlash ? './' : dotdots) + segs.join('/');\n } else {\n // Empty path array (should be trimmed, but handle defensively)\n pathPart = dotdots === '' ? './' : dotdots;\n }\n } else {\n // No path array (trimmed away)\n pathPart = dotdots === '' ? './' : dotdots;\n }\n\n return pathPart + _criSuffix(items, idx);\n }\n\n throw new Error(`cri: unrecognised first element type in CRI array`);\n}\n\n// ─── CborItem subclasses ──────────────────────────────────────────────────────\n\n/**\n * Bare CRI array whose toCDN() emits cri'…' notation.\n * Falls back to generic array notation if the content cannot be expressed as a URI.\n */\nexport class CborCriExt extends CborArray {\n override _toCDN(options: ToCDNOptions | undefined, depth: number): string {\n if (options?.appStrings === false) return super._toCDN(options, depth);\n try {\n return `${PREFIX_CRI}'${criItemsToUri(this.items)}'`;\n } catch {\n return super._toCDN(options, depth);\n }\n }\n}\n\n/**\n * tag(99, CRI array) whose toCDN() emits CRI'…' notation.\n * Falls back to generic tag notation if the content cannot be expressed as a URI.\n */\nexport class CborTaggedCriExt extends CborTag {\n constructor(content: CborArray) {\n super(TAG_CRI, content);\n }\n\n override _toCDN(options: ToCDNOptions | undefined, depth: number): string {\n if (options?.appStrings === false) return super._toCDN(options, depth);\n try {\n return `${PREFIX_CRI_TAGGED}'${criItemsToUri((this.content as CborArray).items)}'`;\n } catch {\n return super._toCDN(options, depth);\n }\n }\n}\n\n// ─── Builder ──────────────────────────────────────────────────────────────────\n\nfunction stringFromAppSequence(items: CborItem[]): string {\n if (items.length !== 1)\n throw new SyntaxError('cri<<...>>: expected exactly one item');\n const item = items[0];\n if (item instanceof CborTextString) return item.value;\n if (item instanceof CborByteString)\n return new TextDecoder('utf-8', { fatal: true }).decode(item.value);\n throw new SyntaxError('cri<<...>>: expected a text string or byte string');\n}\n\nfunction buildCriValue(prefix: string, uri: string): CborItem {\n const criItems = uriToCriItems(uri);\n const arr = new CborCriExt(criItems);\n if (prefix === PREFIX_CRI_TAGGED) return new CborTaggedCriExt(arr);\n return arr;\n}\n\n// ─── Extension factory ────────────────────────────────────────────────────────\n\n/**\n * Create the cri/CRI CborExtension (§3.4 and §5.2.5 of draft-ietf-cbor-edn-literals-25).\n *\n * - `cri'uri'` → CborCriExt (bare CRI array, no CBOR tag)\n * - `CRI'uri'` → CborTaggedCriExt tag(99, CRI array)\n * - parseTag(99n, …) → CborTaggedCriExt (roundtrip from CBOR binary)\n */\nexport const cri: CborExtension = {\n appStringPrefixes: [PREFIX_CRI, PREFIX_CRI_TAGGED],\n tagNumbers: [TAG_CRI],\n\n parseAppString(prefix: string, content: string): CborItem {\n return buildCriValue(prefix, content);\n },\n\n parseAppSequence(prefix: string, items: CborItem[]): CborItem {\n return buildCriValue(prefix, stringFromAppSequence(items));\n },\n\n parseTag(tag: bigint, value: CborItem): CborItem | undefined {\n if (tag !== TAG_CRI) return undefined;\n if (!(value instanceof CborArray)) return undefined;\n const inner = new CborCriExt(value.items, {\n indefiniteLength: value.indefiniteLength,\n encodingWidth: value.encodingWidth,\n });\n return new CborTaggedCriExt(inner);\n },\n};\n\nexport default cri;\n","import type { FromCBOROptions, DecodeWarning } from '../types';\nimport type { CborItem } from '../ast/CborItem';\nimport { BUILTIN_EXTENSIONS } from '../extensions/builtins';\nimport { CborUint } from '../ast/CborUint';\nimport { CborNint } from '../ast/CborNint';\nimport { CborByteString } from '../ast/CborByteString';\nimport { CborIndefiniteByteString } from '../ast/CborIndefiniteByteString';\nimport { CborTextString } from '../ast/CborTextString';\nimport { CborIndefiniteTextString } from '../ast/CborIndefiniteTextString';\nimport { CborArray } from '../ast/CborArray';\nimport { CborMap } from '../ast/CborMap';\nimport { CborTag } from '../ast/CborTag';\nimport { CborFloat } from '../ast/CborFloat';\nimport { CborSimple } from '../ast/CborSimple';\nimport { float16BitsToFloat64 } from '../utils/float16';\nimport {\n MT_UINT,\n MT_NINT,\n MT_BYTES,\n MT_TEXT,\n MT_ARRAY,\n MT_MAP,\n MT_TAG,\n MT_SIMPLE,\n AI_1BYTE,\n AI_2BYTE,\n AI_4BYTE,\n AI_8BYTE,\n AI_INDEFINITE,\n BREAK_CODE,\n} from './constants';\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\n\nconst textDecoderStrict = new TextDecoder('utf-8', {\n fatal: true,\n ignoreBOM: true,\n});\n\nconst textDecoderLenient = new TextDecoder('utf-8', {\n fatal: false,\n ignoreBOM: true,\n});\n\nfunction decodeError(msg: string): never {\n throw new Error(`CBOR decode error: ${msg}`);\n}\n\n/**\n * Emit a CBOR validity violation warning and, unless `strict: false`, throw.\n * Returns the created `DecodeWarning` (only reachable in non-strict mode).\n * For truly malformed data that cannot be recovered, use `decodeError` instead.\n */\nfunction strictViolation(\n msg: string,\n offset: number,\n options: FromCBOROptions | undefined\n): DecodeWarning {\n const warning: DecodeWarning = { message: msg, offset };\n if (options?.onWarning) {\n options.onWarning(warning);\n } else if (!options?.silent) {\n console.warn(`CBOR strict violation at offset ${offset}: ${msg}`);\n }\n if (options?.strict !== false) {\n throw new Error(`CBOR decode error: ${msg}`);\n }\n return warning;\n}\n\nfunction addWarning(node: CborItem, warning: DecodeWarning): void {\n node.warnings ??= [];\n node.warnings.push(warning);\n}\n\n/**\n * Return a data-model fingerprint for a CBOR map key.\n *\n * The fingerprint is designed so that two keys are equal if and only if they\n * represent the same CBOR data-model value, regardless of the encoding form:\n * - Integers: compared by numeric value (width differences ignored)\n * - Text strings: compared by Unicode string content (definite vs indefinite ignored)\n * - Byte strings: compared by raw byte sequence (definite vs indefinite ignored)\n * - Floats: compared by numeric value (precision ignored; all NaN treated equal)\n * - Simple values: compared by simple value number\n * - Arrays/maps/tags: recursively fingerprinted\n *\n * Implemented as two functions: `fingerprintKeyVal` builds a nested-array\n * structure (no pre-serialised strings), and `fingerprintKey` serialises it\n * with a single JSON.stringify call. Keeping recursion in the array domain\n * avoids the exponential character-escaping blowup that occurs when\n * pre-serialised JSON strings are embedded inside further JSON.stringify calls.\n */\nfunction fingerprintKeyVal(key: CborItem): unknown {\n if (key instanceof CborUint) return ['u', String(key.value)];\n if (key instanceof CborNint) return ['n', String(key.value)];\n if (key instanceof CborTextString) return ['t', key.value];\n if (key instanceof CborIndefiniteTextString)\n return ['t', key.chunks.map((c) => c.value).join('')];\n if (key instanceof CborByteString) {\n let h = '';\n for (const b of key.value) h += b.toString(16).padStart(2, '0');\n return ['b', h];\n }\n if (key instanceof CborIndefiniteByteString) {\n let h = '';\n for (const chunk of key.chunks)\n for (const b of chunk.value) h += b.toString(16).padStart(2, '0');\n return ['b', h];\n }\n if (key instanceof CborFloat) {\n // Use String() for all float cases: avoids JSON.stringify silently converting\n // NaN and ±Infinity to null, and -0 to \"0\".\n if (isNaN(key.value)) return ['f', 'NaN'];\n if (Object.is(key.value, -0)) return ['f', '-0'];\n return ['f', String(key.value)];\n }\n if (key instanceof CborSimple) return ['s', key.value];\n if (key instanceof CborArray) return ['A', key.items.map(fingerprintKeyVal)];\n if (key instanceof CborMap) {\n // Sort by key fingerprint so that maps with the same entries in different\n // insertion order fingerprint identically (RFC 8949 data model: unordered).\n const pairs = key.entries.map(([k, v]) => [\n fingerprintKeyVal(k),\n fingerprintKeyVal(v),\n ]);\n pairs.sort((a, b) => {\n const ak = JSON.stringify(a[0]);\n const bk = JSON.stringify(b[0]);\n return ak < bk ? -1 : ak > bk ? 1 : 0;\n });\n return ['M', pairs];\n }\n if (key instanceof CborTag)\n return ['G', String(key.tag), fingerprintKeyVal(key.content)];\n // Fallback for any remaining AST node (e.g. CborEmbeddedCBOR): canonical CBOR bytes.\n const bytes = key.toCBOR();\n let hex = '';\n for (const b of bytes) hex += b.toString(16).padStart(2, '0');\n return ['c', hex];\n}\n\nfunction fingerprintKey(key: CborItem): string {\n return JSON.stringify(fingerprintKeyVal(key));\n}\n\n/**\n * Read the CBOR \"argument\" that follows the initial byte.\n * For ai 0–23 the argument is inline; for 24–27 it occupies 1/2/4/8 bytes.\n */\nfunction readArgument(\n view: DataView,\n offset: number,\n ai: number\n): { value: bigint; nextOffset: number } {\n if (ai <= 23) {\n return { value: BigInt(ai), nextOffset: offset };\n }\n switch (ai) {\n case AI_1BYTE:\n if (offset + 1 > view.byteLength) decodeError('unexpected end of input');\n return { value: BigInt(view.getUint8(offset)), nextOffset: offset + 1 };\n case AI_2BYTE:\n if (offset + 2 > view.byteLength) decodeError('unexpected end of input');\n return {\n value: BigInt(view.getUint16(offset, false)),\n nextOffset: offset + 2,\n };\n case AI_4BYTE:\n if (offset + 4 > view.byteLength) decodeError('unexpected end of input');\n return {\n value: BigInt(view.getUint32(offset, false)),\n nextOffset: offset + 4,\n };\n case AI_8BYTE:\n if (offset + 8 > view.byteLength) decodeError('unexpected end of input');\n return {\n value: view.getBigUint64(offset, false),\n nextOffset: offset + 8,\n };\n default:\n decodeError(`reserved additional info value: ${ai}`);\n }\n}\n\n// ─── Core recursive decoder ───────────────────────────────────────────────────\n\ntype DecodeResult = { value: CborItem; nextOffset: number };\n\nfunction decodeItem(\n view: DataView,\n offset: number,\n options?: FromCBOROptions\n): DecodeResult {\n const startOffset = offset;\n const result = decodeItemInner(view, offset, options);\n result.value.start = startOffset;\n result.value.end = result.nextOffset;\n return result;\n}\n\nfunction decodeItemInner(\n view: DataView,\n offset: number,\n options?: FromCBOROptions\n): DecodeResult {\n if (offset >= view.byteLength) decodeError('unexpected end of input');\n\n const initialByte = view.getUint8(offset++);\n const mt = initialByte >> 5;\n const ai = initialByte & 0x1f;\n\n switch (mt) {\n // ── Major Type 0: unsigned integer ────────────────────────────────────────\n case MT_UINT: {\n const { value, nextOffset } = readArgument(view, offset, ai);\n return { value: new CborUint(value), nextOffset };\n }\n\n // ── Major Type 1: negative integer ───────────────────────────────────────\n case MT_NINT: {\n const { value, nextOffset } = readArgument(view, offset, ai);\n // CBOR encodes negative integers as -1 - argument\n return { value: new CborNint(-1n - value), nextOffset };\n }\n\n // ── Major Type 2: byte string ─────────────────────────────────────────────\n case MT_BYTES: {\n if (ai === AI_INDEFINITE) {\n const chunks: CborByteString[] = [];\n let pos = offset;\n while (true) {\n if (pos >= view.byteLength)\n decodeError('unexpected end of indefinite byte string');\n if (view.getUint8(pos) === BREAK_CODE) {\n pos++;\n break;\n }\n const result = decodeItem(view, pos, options);\n if (!(result.value instanceof CborByteString)) {\n decodeError(\n 'indefinite-length byte string chunk must be a definite byte string'\n );\n }\n chunks.push(result.value);\n pos = result.nextOffset;\n }\n return { value: new CborIndefiniteByteString(chunks), nextOffset: pos };\n }\n const { value: len, nextOffset: dataOffset } = readArgument(\n view,\n offset,\n ai\n );\n const length = Number(len);\n if (dataOffset + length > view.byteLength)\n decodeError('byte string extends beyond input');\n const bytes = new Uint8Array(\n view.buffer,\n view.byteOffset + dataOffset,\n length\n );\n return {\n value: new CborByteString(bytes.slice()),\n nextOffset: dataOffset + length,\n };\n }\n\n // ── Major Type 3: text string ─────────────────────────────────────────────\n case MT_TEXT: {\n if (ai === AI_INDEFINITE) {\n const chunks: CborTextString[] = [];\n let pos = offset;\n while (true) {\n if (pos >= view.byteLength)\n decodeError('unexpected end of indefinite text string');\n if (view.getUint8(pos) === BREAK_CODE) {\n pos++;\n break;\n }\n const result = decodeItem(view, pos, options);\n if (!(result.value instanceof CborTextString)) {\n decodeError(\n 'indefinite-length text string chunk must be a definite text string'\n );\n }\n chunks.push(result.value);\n pos = result.nextOffset;\n }\n return { value: new CborIndefiniteTextString(chunks), nextOffset: pos };\n }\n const { value: len, nextOffset: dataOffset } = readArgument(\n view,\n offset,\n ai\n );\n const length = Number(len);\n if (dataOffset + length > view.byteLength)\n decodeError('text string extends beyond input');\n const bytes = new Uint8Array(\n view.buffer,\n view.byteOffset + dataOffset,\n length\n );\n let text: string;\n let utf8Warning: DecodeWarning | undefined;\n try {\n text = textDecoderStrict.decode(bytes);\n } catch {\n utf8Warning = strictViolation(\n 'invalid UTF-8 sequence in text string',\n dataOffset,\n options\n );\n // Only reached in non-strict mode — decode with replacement characters\n text = textDecoderLenient.decode(bytes);\n }\n const textNode = new CborTextString(text);\n if (utf8Warning) addWarning(textNode, utf8Warning);\n return { value: textNode, nextOffset: dataOffset + length };\n }\n\n // ── Major Type 4: array ───────────────────────────────────────────────────\n case MT_ARRAY: {\n if (ai === AI_INDEFINITE) {\n const items: CborItem[] = [];\n let pos = offset;\n while (true) {\n if (pos >= view.byteLength)\n decodeError('unexpected end of indefinite array');\n if (view.getUint8(pos) === BREAK_CODE) {\n pos++;\n break;\n }\n const result = decodeItem(view, pos, options);\n items.push(result.value);\n pos = result.nextOffset;\n }\n return {\n value: new CborArray(items, { indefiniteLength: true }),\n nextOffset: pos,\n };\n }\n const { value: count, nextOffset: itemsStart } = readArgument(\n view,\n offset,\n ai\n );\n const length = Number(count);\n const items: CborItem[] = [];\n let pos = itemsStart;\n for (let i = 0; i < length; i++) {\n const result = decodeItem(view, pos, options);\n items.push(result.value);\n pos = result.nextOffset;\n }\n return { value: new CborArray(items), nextOffset: pos };\n }\n\n // ── Major Type 5: map ─────────────────────────────────────────────────────\n case MT_MAP: {\n if (ai === AI_INDEFINITE) {\n const entries: [CborItem, CborItem][] = [];\n const seenKeysIndef = new Set<string>();\n const indefMapWarnings: DecodeWarning[] = [];\n let pos = offset;\n while (true) {\n if (pos >= view.byteLength)\n decodeError('unexpected end of indefinite map');\n if (view.getUint8(pos) === BREAK_CODE) {\n pos++;\n break;\n }\n const keyResult = decodeItem(view, pos, options);\n const keyHex = fingerprintKey(keyResult.value);\n if (seenKeysIndef.has(keyHex)) {\n indefMapWarnings.push(\n strictViolation(\n `duplicate map key at offset ${keyResult.value.start}`,\n keyResult.value.start!,\n options\n )\n );\n }\n seenKeysIndef.add(keyHex);\n pos = keyResult.nextOffset;\n const valResult = decodeItem(view, pos, options);\n pos = valResult.nextOffset;\n entries.push([keyResult.value, valResult.value]);\n }\n const indefMapNode = new CborMap(entries, { indefiniteLength: true });\n for (const w of indefMapWarnings) addWarning(indefMapNode, w);\n return { value: indefMapNode, nextOffset: pos };\n }\n const { value: count, nextOffset: entriesStart } = readArgument(\n view,\n offset,\n ai\n );\n const length = Number(count);\n const entries: [CborItem, CborItem][] = [];\n const seenKeys = new Set<string>();\n const mapWarnings: DecodeWarning[] = [];\n let pos = entriesStart;\n for (let i = 0; i < length; i++) {\n const keyResult = decodeItem(view, pos, options);\n const keyHex = fingerprintKey(keyResult.value);\n if (seenKeys.has(keyHex)) {\n mapWarnings.push(\n strictViolation(\n `duplicate map key at offset ${keyResult.value.start}`,\n keyResult.value.start!,\n options\n )\n );\n }\n seenKeys.add(keyHex);\n pos = keyResult.nextOffset;\n const valResult = decodeItem(view, pos, options);\n pos = valResult.nextOffset;\n entries.push([keyResult.value, valResult.value]);\n }\n const mapNode = new CborMap(entries);\n for (const w of mapWarnings) addWarning(mapNode, w);\n return { value: mapNode, nextOffset: pos };\n }\n\n // ── Major Type 6: tagged item ─────────────────────────────────────────────\n case MT_TAG: {\n if (ai === AI_INDEFINITE)\n decodeError('tags cannot use indefinite-length encoding');\n const { value: tagNum, nextOffset: contentStart } = readArgument(\n view,\n offset,\n ai\n );\n const contentResult = decodeItem(view, contentStart, options);\n for (const ext of [\n ...(options?.extensions ?? []),\n ...BUILTIN_EXTENSIONS,\n ]) {\n if (ext.parseTag) {\n const result = ext.parseTag(tagNum, contentResult.value, options);\n if (result !== undefined)\n return { value: result, nextOffset: contentResult.nextOffset };\n }\n }\n return {\n value: new CborTag(tagNum, contentResult.value),\n nextOffset: contentResult.nextOffset,\n };\n }\n\n // ── Major Type 7: float / simple value ────────────────────────────────────\n case MT_SIMPLE: {\n // ai 0–19: simple value encoded inline\n if (ai <= 19) {\n return { value: new CborSimple(ai), nextOffset: offset };\n }\n // ai 20–23: false / true / null / undefined\n if (ai === 20) return { value: CborSimple.FALSE, nextOffset: offset };\n if (ai === 21) return { value: CborSimple.TRUE, nextOffset: offset };\n if (ai === 22) return { value: CborSimple.NULL, nextOffset: offset };\n if (ai === 23) return { value: CborSimple.UNDEFINED, nextOffset: offset };\n\n // ai 24: simple value in next byte (value must be >= 32)\n if (ai === AI_1BYTE) {\n if (offset + 1 > view.byteLength)\n decodeError('unexpected end of input');\n const simpleVal = view.getUint8(offset);\n if (simpleVal < 32) {\n const w = strictViolation(\n `simple value ${simpleVal} must be encoded in initial byte (0–31 reserved for extended encoding)`,\n offset - 1,\n options\n );\n // Only reached in non-strict mode — decode the value as-is\n const simpleNode = new CborSimple(simpleVal);\n addWarning(simpleNode, w);\n return { value: simpleNode, nextOffset: offset + 1 };\n }\n return { value: new CborSimple(simpleVal), nextOffset: offset + 1 };\n }\n\n // ai 25: half-precision float\n if (ai === AI_2BYTE) {\n if (offset + 2 > view.byteLength)\n decodeError('unexpected end of input');\n const bits = view.getUint16(offset, false);\n return {\n value: new CborFloat(float16BitsToFloat64(bits), {\n precision: 'half',\n }),\n nextOffset: offset + 2,\n };\n }\n\n // ai 26: single-precision float\n if (ai === AI_4BYTE) {\n if (offset + 4 > view.byteLength)\n decodeError('unexpected end of input');\n return {\n value: new CborFloat(view.getFloat32(offset, false), {\n precision: 'single',\n }),\n nextOffset: offset + 4,\n };\n }\n\n // ai 27: double-precision float\n if (ai === AI_8BYTE) {\n if (offset + 8 > view.byteLength)\n decodeError('unexpected end of input');\n return {\n value: new CborFloat(view.getFloat64(offset, false), {\n precision: 'double',\n }),\n nextOffset: offset + 8,\n };\n }\n\n // ai 28–30: reserved\n if (ai < AI_INDEFINITE) {\n decodeError(`reserved additional info value in major type 7: ${ai}`);\n }\n\n // ai 31: break code — not valid at item level\n return decodeError(\n 'unexpected break code outside indefinite-length item'\n );\n }\n }\n // unreachable: all major types 0–7 are handled above\n return decodeError(`unknown major type: ${mt}`);\n}\n\n// ─── Public API ───────────────────────────────────────────────────────────────\n\nfunction toInputBytes(data: ArrayBufferView | ArrayBufferLike): Uint8Array {\n if (\n data instanceof ArrayBuffer ||\n (typeof SharedArrayBuffer !== 'undefined' &&\n data instanceof SharedArrayBuffer)\n ) {\n return new Uint8Array(data);\n }\n if (ArrayBuffer.isView(data)) {\n return new Uint8Array(data.buffer, data.byteOffset, data.byteLength);\n }\n throw new TypeError('expected ArrayBufferView or ArrayBufferLike');\n}\n\n/**\n * Decode a CBOR-encoded byte array into a CborItem AST node.\n *\n * Accepts any `ArrayBufferView` (e.g. `Uint8Array`, `DataView`) or\n * `ArrayBufferLike` (e.g. `ArrayBuffer`, `SharedArrayBuffer`).\n *\n * Throws if the input is not well-formed CBOR or contains trailing bytes.\n */\nexport function decodeCBOR(\n input: ArrayBufferView | ArrayBufferLike,\n options?: FromCBOROptions\n): CborItem {\n const bytes = toInputBytes(input);\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const offset = options?.offset ?? 0;\n if (!Number.isInteger(offset) || offset < 0 || offset > view.byteLength) {\n throw new RangeError(\n `CBOR decode offset must be an integer between 0 and ${view.byteLength}`\n );\n }\n const { value, nextOffset } = decodeItem(view, offset, options);\n if (!options?.allowTrailing && nextOffset !== view.byteLength) {\n decodeError(\n `${view.byteLength - nextOffset} trailing byte(s) after end of CBOR item`\n );\n }\n return value;\n}\n","/**\n * Built-in embedded CBOR extension (RFC 8949 §3.4.5.1).\n *\n * Intercepts tag 24 during fromCBOR() so that the byte string content is\n * decoded as a CBOR data item and represented as CborEmbeddedCBOR. This\n * allows toCDN() to render the value as 24(<<item>>) instead of 24(h'...').\n *\n * If the byte string is not valid CBOR (or has trailing bytes), the extension\n * returns undefined and falls back to the plain CborTag representation.\n */\n\nimport type { CborExtension } from './types';\nimport type { CborItem } from '../ast/CborItem';\nimport type { FromCBOROptions } from '../types';\nimport { CborByteString } from '../ast/CborByteString';\nimport { CborEmbeddedCBOR } from '../ast/CborEmbeddedCBOR';\nimport { CborTag } from '../ast/CborTag';\nimport { decodeCBOR } from '../cbor/decoder';\n\nexport const TAG_CBOR_DATA = 24n;\n\nconst cbordata: CborExtension = {\n tagNumbers: [TAG_CBOR_DATA],\n\n parseTag(\n tag: bigint,\n value: CborItem,\n options?: FromCBOROptions\n ): CborItem | undefined {\n if (tag !== TAG_CBOR_DATA) return undefined;\n if (!(value instanceof CborByteString)) return undefined;\n // Forward strict/onWarning/silent into the inner decode, but reset\n // offset and allowTrailing since the embedded bytes start at 0.\n const innerOptions: FromCBOROptions | undefined = options\n ? {\n extensions: options.extensions,\n strict: options.strict,\n onWarning: options.onWarning,\n silent: options.silent,\n }\n : undefined;\n try {\n const decoded = decodeCBOR(value.value, innerOptions);\n return new CborTag(TAG_CBOR_DATA, new CborEmbeddedCBOR([decoded]));\n } catch (e) {\n if (innerOptions?.strict !== false) {\n // In strict mode, propagate inner violations to the outer decode.\n throw e;\n }\n // In non-strict mode, fall back to a plain CborTag.\n return undefined;\n }\n },\n};\n\nexport default cbordata;\n","import type { CborExtension } from './types';\nimport dt from './dt';\nimport ip from './ip';\nimport bignum from './bignum';\nimport cri from './cri';\nimport cbordata from './cbordata';\n\nexport const BUILTIN_EXTENSIONS: CborExtension[] = [\n dt,\n ip,\n bignum,\n cri,\n cbordata,\n];\n","import type { FromJSOptions } from '../types';\nimport { CBOR_OMIT } from '../types';\nimport type { CborItem } from '../ast/CborItem';\nimport type { CborExtension } from '../extensions/types';\nimport { BUILTIN_EXTENSIONS } from '../extensions/builtins';\nimport { CborUint } from '../ast/CborUint';\nimport { CborNint } from '../ast/CborNint';\nimport { CborBigUint, CborBigNint } from '../ast/CborBignum';\nimport { CborByteString } from '../ast/CborByteString';\nimport { CborTextString } from '../ast/CborTextString';\nimport { CborArray } from '../ast/CborArray';\nimport { CborMap } from '../ast/CborMap';\nimport { CborFloat } from '../ast/CborFloat';\nimport { CborSimple } from '../ast/CborSimple';\nimport { CborTag } from '../ast/CborTag';\nimport { Tag } from '../tag';\nimport { Simple } from '../simple';\nimport { MapEntries } from '../mapEntries';\n\n/**\n * Convert a plain JavaScript value to a CborItem AST node.\n *\n * Type dispatch order:\n * object with [Tag.symbol] symbol → CborTag (wraps the inner value)\n * null / undefined / boolean → CborSimple\n * bigint → CborUint / CborNint / CborBigUint / CborBigNint\n * number → CborFloat, or CborUint/CborNint if integerAs='int' (default)\n * string → CborTextString\n * Number / Boolean / String / BigInt object → unwrapped primitive (recurse)\n * Tag.Null / Tag.Undefined → CborSimple.NULL / UNDEFINED\n * ArrayBuffer / SharedArrayBuffer → CborByteString\n * ArrayBufferView (TypedArray, DataView, …) → CborByteString (Uint8Array respects uint8ArrayAs)\n * Array → CborArray (recursive)\n * Map → CborMap (keys also converted recursively)\n * plain object → CborMap (string keys → CborTextString)\n */\nexport function fromJS(value: unknown, options?: FromJSOptions): CborItem {\n if (options?.replacer) {\n const { replacer, ...rest } = options;\n const replaced = _applyReplacer(\n value,\n replacer,\n rest.extensions,\n rest.undefinedOmits\n );\n if (replaced === CBOR_OMIT) return CborSimple.UNDEFINED;\n return fromJS(\n replaced,\n Object.keys(rest).length > 0 ? (rest as FromJSOptions) : undefined\n );\n }\n return _fromJS(value, options, true);\n}\n\nfunction _fromJS(\n value: unknown,\n options: FromJSOptions | undefined,\n checkTag: boolean\n): CborItem {\n // ── Extension fromJS hooks ───────────────────────────────────────────────────\n for (const ext of [...(options?.extensions ?? []), ...BUILTIN_EXTENSIONS]) {\n if (ext.fromJS) {\n const result = ext.fromJS(value, options ?? {});\n if (result !== undefined) return result;\n }\n }\n\n // ── CBOR tag annotation (Symbol key) ────────────────────────────────────────\n // checkTag=false on the recursive call to skip this branch and convert the\n // inner value normally, avoiding infinite recursion.\n // After converting the inner value, try parseTag() hooks so that e.g.\n // dt / ip can produce their specialised subclasses without needing\n // a separate fromJS() hook on the extension.\n if (\n checkTag &&\n typeof value === 'object' &&\n value !== null &&\n Tag.symbol in (value as object)\n ) {\n const tag = (value as Record<symbol, bigint>)[Tag.symbol];\n const innerValue = _fromJS(value, options, false);\n for (const ext of [...(options?.extensions ?? []), ...BUILTIN_EXTENSIONS]) {\n if (ext.parseTag) {\n const result = ext.parseTag(tag, innerValue);\n if (result !== undefined) return result;\n }\n }\n return new CborTag(tag, innerValue);\n }\n\n // ── Null wrapper (from CborTag.toJS() of tagged null) ───────────────────────\n // Must come AFTER the Tag.symbol check so that Tag.Null (which carries\n // a [Tag.symbol] symbol) is first wrapped in CborTag, then unwrapped as NULL\n // in the recursive checkTag=false call.\n if (value instanceof Tag.Null) return CborSimple.NULL;\n if (value instanceof Tag.Undefined) return CborSimple.UNDEFINED;\n if (value instanceof Simple) return new CborSimple(value.value);\n\n // ── Primitives ───────────────────────────────────────────────────────────────\n if (value === null) return CborSimple.NULL;\n if (value === undefined) return CborSimple.UNDEFINED;\n if (value === true) return CborSimple.TRUE;\n if (value === false) return CborSimple.FALSE;\n\n if (typeof value === 'bigint') {\n if (value > 0xffff_ffff_ffff_ffffn) return new CborBigUint(value);\n if (value < -(0xffff_ffff_ffff_ffffn + 1n)) return new CborBigNint(value);\n return value >= 0n ? new CborUint(value) : new CborNint(value);\n }\n\n if (typeof value === 'number') {\n const integerAs = options?.encodeIntegerAs ?? 'int';\n if (\n integerAs === 'int' &&\n Number.isInteger(value) &&\n !Object.is(value, -0)\n ) {\n if (value >= 0) return new CborUint(BigInt(value));\n return new CborNint(BigInt(value));\n }\n return new CborFloat(value);\n }\n\n if (typeof value === 'string') return new CborTextString(value);\n\n // ── Boxed primitives — unwrap and recurse ───────────────────────────────────\n if (value instanceof Number) return _fromJS(value.valueOf(), options, false);\n if (value instanceof Boolean) return _fromJS(value.valueOf(), options, false);\n if (value instanceof String) return _fromJS(value.valueOf(), options, false);\n // Object(bigint) — detected via Object.prototype.toString\n if (Object.prototype.toString.call(value) === '[object BigInt]')\n return _fromJS((value as { valueOf(): bigint }).valueOf(), options, false);\n\n // ── ArrayBuffer / SharedArrayBuffer ─────────────────────────────────────────\n if (\n value instanceof ArrayBuffer ||\n (typeof SharedArrayBuffer !== 'undefined' &&\n value instanceof SharedArrayBuffer)\n ) {\n return new CborByteString(new Uint8Array(value as ArrayBuffer));\n }\n\n // ── ArrayBufferView (TypedArray variants, DataView) ─────────────────────────\n if (ArrayBuffer.isView(value)) {\n if (value instanceof Uint8Array && options?.uint8ArrayAs === 'array') {\n return new CborArray(Array.from(value, (b) => new CborUint(BigInt(b))));\n }\n return new CborByteString(\n new Uint8Array(value.buffer, value.byteOffset, value.byteLength)\n );\n }\n\n if (value instanceof MapEntries) {\n return new CborMap(\n [...value].map(\n ([k, v]) =>\n [fromJS(k, options), fromJS(v, options)] as [CborItem, CborItem]\n )\n );\n }\n\n if (Array.isArray(value)) {\n return new CborArray(value.map((item) => fromJS(item, options)));\n }\n\n if (typeof value === 'object') {\n const entries: [CborItem, CborItem][] = [];\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n entries.push([new CborTextString(k), fromJS(v, options)]);\n }\n return new CborMap(entries);\n }\n\n throw new TypeError(`fromJS: unsupported value type: ${typeof value}`);\n}\n\n// ─── Replacer helper ────────────────────────────────────────────────────────\n\ntype _FnReplacer = (this: unknown, key: unknown, value: unknown) => unknown;\ntype _Replacer = _FnReplacer | (string | number)[];\n\n/** True for values that _fromJS handles via a dedicated branch (not Object.entries). */\nfunction _isNativelyHandled(v: object): boolean {\n return (\n ArrayBuffer.isView(v) ||\n v instanceof ArrayBuffer ||\n (typeof SharedArrayBuffer !== 'undefined' &&\n v instanceof SharedArrayBuffer) ||\n v instanceof Number ||\n v instanceof Boolean ||\n v instanceof String ||\n Object.prototype.toString.call(v) === '[object BigInt]' ||\n v instanceof Tag.Null ||\n v instanceof Tag.Undefined ||\n v instanceof Simple\n );\n}\n\nexport function _applyReplacer(\n value: unknown,\n replacer: _Replacer,\n extensions?: readonly CborExtension[],\n undefinedOmits?: boolean\n): unknown {\n const allExts: readonly CborExtension[] = [\n ...(extensions ?? []),\n ...BUILTIN_EXTENSIONS,\n ];\n\n /** True when a replacer/reviver result should cause the entry to be dropped. */\n function _omits(v: unknown): boolean {\n return v === CBOR_OMIT || (undefinedOmits === true && v === undefined);\n }\n\n if (Array.isArray(replacer)) {\n const allowed = (replacer as (string | number)[]).map(String);\n function filterKeys(v: unknown): unknown {\n if (v === null || typeof v !== 'object') return v;\n if (v instanceof MapEntries)\n return MapEntries.from(\n v,\n ([k, val]) => [k, filterKeys(val)] as [unknown, unknown]\n );\n if (Array.isArray(v)) return v.map(filterKeys);\n // Tagged objects pass through so fromJS can encode the tag natively.\n if (Tag.symbol in (v as object)) return v;\n // Built-in types pass through so fromJS can handle them natively.\n if (_isNativelyHandled(v as object)) return v;\n // Extension-owned values pass through so fromJS can handle them natively.\n if (allExts.some((ext) => ext.isJSType?.(v))) return v;\n // Plain objects only: honor toJSON() first (matches JSON.stringify semantics).\n const proto = Object.getPrototypeOf(v as object) as unknown;\n if (proto === Object.prototype || proto === null) {\n const toJSON = (v as Record<string, unknown>)['toJSON'];\n if (typeof toJSON === 'function')\n return filterKeys((toJSON as () => unknown).call(v));\n }\n const result: Record<string, unknown> = {};\n for (const k of allowed) {\n if (Object.prototype.hasOwnProperty.call(v, k))\n result[k] = filterKeys((v as Record<string, unknown>)[k]);\n }\n return result;\n }\n return filterKeys(value);\n }\n\n const fn = replacer as _FnReplacer;\n function applyFn(val: unknown, key: unknown, holder: unknown): unknown {\n // Call toJSON() only on plain objects (proto === Object.prototype or null).\n // Non-plain objects (Date, TypedArray, extension-backed classes…) pass\n // through so fromJS extensions can handle them; MapEntries is also skipped\n // so its integer keys and structure are preserved for CBOR encoding.\n if (\n val !== null &&\n typeof val === 'object' &&\n !(val instanceof MapEntries)\n ) {\n const proto = Object.getPrototypeOf(val as object) as unknown;\n if (proto === Object.prototype || proto === null) {\n const toJSON = (val as Record<string, unknown>)['toJSON'];\n if (typeof toJSON === 'function')\n val = (toJSON as (k: unknown) => unknown).call(val, key);\n }\n }\n val = fn.call(holder, key, val);\n if (val !== null && typeof val === 'object') {\n // Tagged objects pass through so fromJS can encode the tag natively.\n if (Tag.symbol in (val as object)) return val;\n if (val instanceof MapEntries) {\n const result = new MapEntries();\n for (const [k, v] of val) {\n const newV = applyFn(v, k, val);\n if (!_omits(newV)) result.push([k, newV]);\n }\n return result;\n }\n if (Array.isArray(val)) {\n return (val as unknown[]).map((v, i) => {\n const child = applyFn(v, String(i), val);\n // CBOR.OMIT / undefined-omits in arrays → null (matches JSON.stringify).\n return _omits(child) ? null : child;\n });\n }\n // Built-in types pass through to fromJS unchanged.\n if (_isNativelyHandled(val as object)) return val;\n // Extension-owned values pass through so fromJS can handle them natively.\n if (allExts.some((ext) => ext.isJSType?.(val))) return val;\n const result: Record<string, unknown> = {};\n for (const k of Object.keys(val as object)) {\n const child = applyFn((val as Record<string, unknown>)[k], k, val);\n if (!_omits(child)) result[k] = child;\n }\n return result;\n }\n return val;\n }\n return applyFn(value, '', { '': value });\n}\n","import { fromJS } from './js/fromJS';\n\nexport class MapEntries extends Array<[unknown, unknown]> {\n toJSON(): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const [k, v] of this) {\n const key = typeof k === 'string' ? k : fromJS(k).toCDN();\n if (key === '__proto__') {\n Object.defineProperty(result, key, {\n value: v,\n writable: true,\n enumerable: true,\n configurable: true,\n });\n } else {\n result[key] = v;\n }\n }\n return result;\n }\n}\n"],"mappings":";AAAA,IAAa,IAA0B,OAAO,IAAI,UAAU,GAI/C,IAAb,MAAkB;CAChB,UAAgB;EACd,OAAO;CACT;CACA,SAAe;EACb,OAAO;CACT;AACF,GAEa,IAAb,MAAuB;CACrB,UAAqB,CAErB;CACA,SAAoB,CAEpB;AACF;AAKA,SAAgB,EAAW,GAAoC;CAC7D,IAAI,CAAC,EAAY,CAAK,GAAG;CACzB,IAAM,IAAO,EAAkC;CAC/C,OAAO,OAAO,KAAQ,WAAW,IAAM,KAAA;AACzC;AAGA,SAAgB,EAAW,GAAgB,GAAqB;CAC9D,IAAI;CACJ,QAAQ,OAAO,GAAf;EACE,KAAK;GACH,IAAM,IAAI,OAAO,CAAK;GACtB;EACF,KAAK;GACH,IAAM,IAAI,OAAO,CAAK;GACtB;EACF,KAAK;GACH,IAAM,IAAI,QAAQ,CAAK;GACvB;EACF,KAAK;GACH,IAAM,OAAO,CAAK;GAClB;EACF,KAAK;GACH,IAAM,IAAI,EAAU;GACpB;EACF,KAAK;GACH,IAAI,MAAU,MAAM;IAClB,IAAM,IAAI,EAAK;IACf;GACF;GACA,IAAM;GACN;EACF,SACE,MAAU,UACR,wCAAwC,OAAO,GACjD;CACJ;CAEA,OADA,EAAgC,KAAY,GACrC;AACT;AAGA,SAAgB,EAAc,GAAyB;CAIrD,IAHI,aAAiB,UACjB,aAAiB,UACjB,aAAiB,WACjB,OAAO,UAAU,SAAS,KAAK,CAAK,MAAM,mBAC5C,OAAQ,EAAgC,QAAQ;CAClD,IAAI,aAAiB,GAAM,OAAO;CAC9B,mBAAiB,IAKrB,OAJI,OAAO,KAAU,YAAY,KAC/B,OAAQ,EAAkC,IAGrC;AACT;AAGA,SAAgB,EAAmB,GAAyB;CAI1D,IAHI,aAAiB,UACjB,aAAiB,UACjB,aAAiB,WACjB,OAAO,UAAU,SAAS,KAAK,CAAK,MAAM,mBAC5C,OAAQ,EAAgC,QAAQ;CAClD,IAAI,aAAiB,GAAM,OAAO;CAC9B,mBAAiB,IACrB,OAAO;AACT;AAKA,SAAS,EAAY,GAAiC;CAGpD,OAAO,OAAO,KAAU,cAAY;AACtC;AAeA,IAAa,IAAb,MAAiB;CACf,cAAsB,CAAC;CAGvB,OAAgB,SAA0B;CAG1C,OAAgB,OAAO;CAGvB,OAAgB,YAAY;CAG5B,OAAO,IAAI,GAAoC;EAC7C,OAAO,EAAW,CAAK;CACzB;CAGA,OAAO,IAAI,GAAgB,GAAqB;EAC9C,OAAO,EAAW,GAAO,CAAG;CAC9B;CAGA,OAAO,OAAO,GAAyB;EACrC,OAAO,EAAc,CAAK;CAC5B;CAGA,OAAO,SAAS,GAAyB;EACvC,OAAO,EAAmB,CAAK;CACjC;AACF,GCtIa,IAA2B,OAAO,WAAW,GCE7C,IAAb,MAAa,EAAO;CAClB;CAEA,YAAY,GAAe;EACzB,IAAI,CAAC,OAAO,UAAU,CAAK,KAAK,IAAQ,KAAK,IAAQ,KACnD,MAAU,WAAW,0CAA0C;EACjE,KAAK,QAAQ;CACf;CAEA,UAAkB;EAChB,OAAO,KAAK;CACd;CAEA,SAAgB;EACd,MAAU,UAAU,UAAU,KAAK,MAAM,+BAA+B;CAC1E;CAGA,OAAO,GAAG,GAAiC;EACzC,OAAO,aAAiB;CAC1B;CAGA,OAAO,IAAI,GAAoC;EAC7C,OAAO,aAAiB,IAAS,EAAM,QAAQ,KAAA;CACjD;AACF;;;AC/BA,SAAgB,EACd,GACe;CACf,IAAM,IAAS,GAAS;CAExB,OADI,MAAW,KAAA,IAAkB,OAC1B,OAAO,KAAW,WAAW,IAAI,OAAO,CAAM,IAAI;AAC3D;AAGA,SAAgB,EAAS,GAAmB,GAAuB;CACjE,OAAO,EAAU,OAAO,CAAK;AAC/B;AAQA,SAAgB,EAAqB,GAA0B;CAC7D,OAAO,GACL,EAAK,UAAU,SAAS,UACxB,EAAK,UAAU,UAAU,UACzB,EAAK,UAAU,UAAU;AAE7B;AAEA,SAAgB,GAA2B,GAA0B;CACnE,OAAO,GACL,EAAK,UAAU,UAAU,UAAU,EAAK,UAAU,UAAU;AAEhE;AAcA,SAAgB,EACd,GACA,GACQ;CACR,IAAI,CAAC,GAAO,OAAO,EAAQ;CAC3B,IAAM,EAAE,WAAQ,YAAS;CAEzB,IAAI,MAAU,WAGZ,OAFI,MAAW,MAAY,OAAO,EAAK,MAAM,CAAC,IAC1C,MAAW,MAAY,OAAO,EAAK,MAAM,GAAG,EAAE,IAAI,OAC/C;CAIT,IAAI,MAAW,MAAM,OAAO,MAAM,EAAK,MAAM,CAAC;CAC9C,IAAI,MAAW,MAAM;EACnB,IAAM,IAAQ,EAAK,MAAM,GAAG,EAAE;EAM9B,OAHI,EAAM,SAAS,GAAG,IAAU,IAGzB,OADL,EAAM,WAAW,GAAG,KAAK,EAAM,WAAW,GAAG,IAAI,MAAM,IAAQ,KACxC;CAC3B;CACA,OAAO;AACT;AAEA,SAAgB,GACd,GACA,GACA,GACU;CACV,QAAQ,EAAK,UAAU,WAAW,CAAC,GAAG,KACnC,MAAY,IAAS,EAAmB,GAAS,CAAK,CACzD;AACF;AAEA,SAAgB,EACd,GACA,GACQ;CACR,IAAM,IAAW,EAAK,UAAU,YAAY,CAAC;CAE7C,OADI,EAAS,WAAW,IAAU,KAEhC,MACA,EAAS,KAAK,MAAY,EAAmB,GAAS,CAAK,CAAC,EAAE,KAAK,GAAG;AAE1E;AAEA,SAAgB,GACd,GACA,GACA,GACU;CACV,QAAQ,EAAK,UAAU,YAAY,CAAC,GAAG,KACpC,MAAY,IAAS,EAAmB,GAAS,CAAK,CACzD;AACF;AAgBA,SAAgB,GACd,GACA,IAAU,IAMV;CACA,IAAM,IAAS,GAAS,UAAU,SAC5B,IAAY,MAAW;CAE7B,OAAO;EACL,WAAW,IAAa,IAAU,MAAM,OAAQ;EAChD,cAAc,IAAY,MAAM;EAChC,UAJe,MAAW,aAIL,MAAM;EAC3B,QAAQ,IAAU,MAAM;CAC1B;AACF;AAIA,SAAS,GAAM,GAA2B;CAKxC,OAHI,OAAQ,EAAc,SAAU,aAE1B,EAAc,MAAM,IACvB,MAAM,KAAK,IAAQ,MAAM,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAAE,KAAK,EAAE;AAC1E;AAGA,IAAM,IACJ,OAAQ,IAAI,WAAY,EAAU,YAAa;AAEjD,SAAS,GAAS,GAA2B;CAE3C,IAAI,GAAoB,OAAQ,EAAc,SAAS,EAAE,aAAa,GAAK,CAAC;CAC5E,IAAI,IAAS;CACb,KAAK,IAAM,KAAK,GAAO,KAAU,OAAO,aAAa,CAAC;CACtD,OAAO,KAAK,CAAM,EAAE,QAAQ,MAAM,EAAE;AACtC;AAEA,SAAS,GAAY,GAA2B;CAE9C,IAAI,GACF,OAAQ,EAAc,SAAS;EAC7B,UAAU;EACV,aAAa;CACf,CAAC;CACH,IAAI,IAAS;CACb,KAAK,IAAM,KAAK,GAAO,KAAU,OAAO,aAAa,CAAC;CACtD,OAAO,KAAK,CAAM,EAAE,QAAQ,OAAO,GAAG,EAAE,QAAQ,OAAO,GAAG,EAAE,QAAQ,MAAM,EAAE;AAC9E;AAEA,IAAM,KAAY,oCACZ,KAAY;AAElB,SAAS,GAAa,GAAmB,GAAuB;CAC9D,IAAI,IAAS,IACT,IAAM,GACR,IAAU;CACZ,KAAK,IAAM,KAAK,GAGd,KAFA,IAAO,KAAO,IAAK,GACnB,KAAW,GACJ,KAAW,IAEhB,AADA,KAAW,GACX,KAAU,EAAO,KAAO,IAAW;CAIvC,OADI,IAAU,MAAG,KAAU,EAAO,KAAQ,IAAI,IAAY,MACnD;AACT;AAMA,SAAS,GAAiB,GAAoB;CAC5C,KAAK,IAAM,KAAQ,GAAG;EACpB,IAAM,IAAK,EAAK,YAAY,CAAC;EAC7B,IAAI,IAAK,MAAQ,MAAO,KAAM,OAAO;CACvC;CACA,OAAO;AACT;AAEA,SAAgB,GACd,GACA,GACA,GACQ;CACR,IAAI,MAAU,UAAU;EACtB,IAAM,IAAI,GAAe,CAAK;EAC9B,IAAI,KAAK,MAAM,OAAO,GAAoB,CAAC;CAC7C;CACA,IAAI,MAAU,sBAAsB,MAAU,KAAA,GAAW;EACvD,IAAM,IAAI,GAAe,CAAK;EAC9B,IAAI,KAAK,QAAQ,CAAC,GAAiB,CAAC,GAAG,OAAO,GAAoB,CAAC;CACrE;CACA,QAAQ,GAAR;EACE,KAAK,UACH,OAAO,OAAO,GAAS,CAAK,EAAE;EAChC,KAAK,aACH,OAAO,OAAO,GAAY,CAAK,EAAE;EACnC,KAAK,UACH,OAAO,OAAO,GAAa,GAAO,EAAS,EAAE;EAC/C,KAAK,aACH,OAAO,OAAO,GAAa,GAAO,EAAS,EAAE;EAE/C,SACE,OAAO,KAAK,GAAM,CAAK,EAAE;CAC7B;AACF;AAGA,SAAS,GAAe,GAAkC;CACxD,IAAI;EACF,OAAO,IAAI,YAAY,SAAS,EAAE,OAAO,GAAK,CAAC,EAAE,OAAO,CAAK;CAC/D,QAAQ;EACN,OAAO;CACT;AACF;AAmBA,SAAS,GAAc,GAAW,GAAuB;CACvD,IAAM,IAAU,EAAM,YAAY,CAAC,GAC/B,IAAS;CACb,KAAK,IAAM,KAAQ,GAAG;EACpB,IAAM,IAAK,EAAK,YAAY,CAAC;EAC7B,QAAQ,GAAR;GACE,KAAK;IACH,KAAU,KAAK;IACf;GACF,KAAK;IACH,KAAU;IACV;GACF,KAAK;IACH,KAAU;IACV;GACF,KAAK;IACH,KAAU;IACV;GACF,KAAK;IACH,KAAU;IACV;GACF,SACE,AACE,IAAK,MACL,MAAO,OACP,MAAO,QACP,MAAO,QACP,MAAO,QACP,MAAO,QACP,MAAO,QACP,MAAO,QAEP,KAAU,MAAM,EAAG,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,MAC5C,KAAU;EACnB;CACF;CACA,OAAO,IAAS;AAClB;AAGA,SAAS,GAAoB,GAAmB;CAC9C,OAAO,GAAc,GAAG,GAAG;AAC7B;AAMA,SAAgB,GAAgB,GAAmB;CACjD,OAAO,GAAc,GAAG,GAAG;AAC7B;AAKA,SAAgB,GAAa,GAAmB;CAC9C,OAAO,GAAc,GAAG,IAAG;AAC7B;AAKA,SAAgB,GAAmB,GAAuB;CACxD,IAAI,MAAM,CAAK,GAAG,OAAO;CACzB,IAAI,CAAC,SAAS,CAAK,GAAG,OAAO,IAAQ,IAAI,aAAa;CACtD,IAAI,OAAO,GAAG,GAAO,EAAE,GAAG,OAAO;CACjC,IAAM,IAAI,EAAM,SAAS;CAEzB,OAAO,EAAE,SAAS,GAAG,KAAK,EAAE,SAAS,GAAG,IAAI,IAAI,IAAI;AACtD;AAMA,SAAgB,GACd,GACA,GACA,GACQ;CAER,OADI,MAAc,KAAA,KAAa,MAAc,IAAqB,KAC3D,MAAc,SAAS,OAAO,MAAc,WAAW,OAAO;AACvE;;;AClUA,IAAsB,IAAtB,MAA+B;CAM7B;CAOA;CAMA;CAOA;CAOA;CAKA,OAAO,GAAqC;EAC1C,IAAM,IAAS,KAAK,YAAY;GAAE,GAAG,KAAK;GAAW,GAAG;EAAQ,IAAI;EACpE,OAAO,KAAK,QAAQ,CAAM;CAC5B;CAGA,MAAM,GAAgC;EACpC,IAAM,IAAS,KAAK,YAAY;GAAE,GAAG,KAAK;GAAW,GAAG;EAAQ,IAAI,GAC9D,IAAO,KAAK,OAAO,GAAQ,CAAC,GAC5B,IAAK,GAAQ;EACnB,IAAI,CAAC,GAAI,OAAO;EAChB,IAAM,IAAQ,OAAO,KAAO,WAAW,IAAK,KAAA,GACtC,IACJ,KAAK,UAAU,SAAS,KAAK,MAAM,EAAmB,GAAG,CAAK,CAAC,KAAK,CAAC,GACjE,IAAW,KAAK,UAAU,YAAY,CAAC,GACvC,IACJ,EAAS,WAAW,IAChB,IACA,GAAG,EAAK,GAAG,EAAS,KAAK,MAAM,EAAmB,GAAG,CAAK,EAAE,QAAQ,CAAC,EAAE,KAAK,GAAG;EACrF,OAAO,CAAC,GAAG,GAAS,CAAgB,EAAE,KAAK,IAAI;CACjD;CAOA,MAAM,GAAgC;EACpC,OAAO,KAAK,MAAM,CAAO;CAC3B;CAUA,KAAK,GAAgC;EACnC,IAAM,IAAS,KAAK,YAAY;GAAE,GAAG,KAAK;GAAW,GAAG;EAAQ,IAAI,GAC9D,IAAS,KAAK,MAAM,CAAM;EAChC,IAAI,CAAC,GAAQ,SAAS,OAAO;EAC7B,IAAM,IAAK,EAAO,QAAQ,KAAK,EAAE,IAAI,EAAO,GAAG,IAAI,CAAM;EACzD,OAAO,MAAO,IAAY,KAAA,IAAY;CACxC;CAgBA,UAAU,GAAoC;EAC5C,IAAM,IAAS,KAAK,YAAY;GAAE,GAAG,KAAK;GAAW,GAAG;EAAQ,IAAI,GAC9D,IAAM,GAAQ,UAAU,GACxB,IAAY,OAAO,KAAQ,WAAW,IAAM,IAAI,OAAO,CAAG,GAC1D,KAAU,GAAQ,gBAAgB,QAAQ,KAC1C,IAAQ,KAAK,WAAW,GAAG,CAAM,GAIjC,IAHe,KAAK,IACxB,GAAG,EAAM,KAAK,MAAM,EAAE,QAAQ,EAAU,SAAS,EAAE,IAAI,MAAM,CAEnD,IAAe;EAC3B,OAAO,EACJ,KAAK,OACW,EAAU,OAAO,EAAE,KAAK,IAAI,EAAE,KAC/B,OAAO,CAAG,IAAI,IAAS,EAAE,OACxC,EACA,KAAK,IAAI;CACd;CA8BA,WAAW,GAAe,GAAyC;EAIjE,OAAO,CAAC;GAAE;GAAO,KAHL,MAAM,KAAK,KAAK,QAAQ,IAAI,MACtC,EAAE,SAAS,EAAE,EAAE,YAAY,EAAE,SAAS,GAAG,GAAG,CAC9C,EAAE,KAAK,GACU;GAAK,SAAS,KAAK,OAAO,GAAS,CAAC;EAAE,CAAC;CAC1D;AACF,GCtKa,KACX,gBAAgB,SAAS,aAAa,gBAAgB,SAAS,WAI3D,qBAAO,IAAI,yBAAS,IADR,YAAY,CACJ,CAAK;AAW/B,SAAgB,GAAqB,GAAuB;CAE1D,GAAK,WAAW,GAAG,GAAO,EAAK;CAC/B,IAAM,IAAK,GAAK,UAAU,GAAG,EAAK,GAC5B,IAAK,GAAK,UAAU,GAAG,EAAK,GAE5B,IAAQ,MAAO,KAAM,GACrB,IAAS,MAAO,KAAM,MACtB,IAAS,IAAK;CAIpB,IAAI,MAAU,MAAO;EACnB,IAAI,MAAW,KAAK,MAAO,GAAG,OAAQ,KAAQ,KAAM;EAEpD,IAAM,IAAW,KAAU,MAAO,MAAO,IAAQ,IAAJ,MAAU;EACvD,OAAQ,KAAQ,KAAM,QAAU,IAAU;CAC5C;CAGA,IAAM,IAAS,IAAQ,OAAO;CAG9B,IAAI,KAAU,IAAI,OAAQ,KAAQ,KAAM;CAExC,IAAI,GACA,GACA;CAEJ,IAAI,KAAU,GAAG;EAEf,IAAI,IAAS,KAAK,OAAO,KAAQ;EAIjC,IAAM,IAAS,KAAK,KAAM,GAKpB,IAAI,KAAK;EAEf,AAAI,KAAK,MACP,IAAW,KAAS,IAAK,MACzB,IAAY,KAAU,IAAI,IAAM,GAChC,KAAU,KAAU,KAAM,IAAI,KAAM,MAAQ,KAAK,MAAO,MAGxD,IAAU,GACV,IAAW,GACX,IAAS,MAAW,KAAK,MAAO;CAEpC,OAKE,AAFA,IAAU,KAAU,IACpB,IAAY,KAAU,IAAK,GAC3B,KAAU,IAAS,QAAW,KAAK,MAAO;CAS5C,IALI,MAAa,MAAM,KAAW,IAAU,MAC1C,KAIE,KAAW,MAAM;EAEnB,IAAM,IAAS,KAAU,IAAI,IAAI,IAAS;EAE1C,OADI,KAAU,KAAY,KAAQ,KAAM,QAChC,KAAQ,KAAO,KAAU;CACnC;CAEA,IAAM,IAAS,KAAU,IAAI,IAAI;CACjC,OAAQ,KAAQ,KAAO,KAAU,KAAM;AACzC;AAMA,SAAgB,EAAqB,GAAsB;CACzD,IAAM,IAAQ,MAAS,KAAM,GACvB,IAAO,MAAS,KAAM,IACtB,IAAO,IAAO;CAWpB,OATI,MAAQ,KACH,MAAS,IAAK,IAAO,YAAY,WAAY,MAElD,MAAQ,IACN,MAAS,IAAU,IAAO,KAAK,KAE3B,IAAO,KAAK,KAAK,KAAK,OAAO,IAAO,SAGtC,IAAO,KAAK,KAAK,MAAM,IAAM,OAAO,IAAI,IAAO;AACzD;AAgDA,IAAa,KAA6B,MA1BxC,GACA,GACA,GACA,MACG;CACH,EAAK,WAAW,GAAQ,GAAO,CAAY;AAC7C,KAGE,GACA,GACA,GACA,MACG;CACH,EAAK,UAAU,GAAQ,GAAqB,CAAK,GAAG,CAAY;AAClE;;;ACxIA,SAAgB,EACd,GACA,GACA,GACY;CACZ,IAAI,MAAkB,KAAA,GAAW;EAE/B,IAAI,MAAkB,KAAK;GACzB,IAAI,IAAQ,KACV,MAAU,WACR,SAAS,EAAM,gDACjB;GACF,OAAO,IAAI,WAAW,CAAE,KAAM,IAAK,OAAO,CAAK,CAAC,CAAC;EACnD;EACA,IAAM,IAAc;GAClB;GACA;GACA;GACA;EACF;EACA,IAAI,IAAQ,EAAY,IACtB,MAAU,WACR,SAAS,EAAM,kCAAkC,EAAc,QAAQ,EAAY,GAAe,EACpG;EAEF,IAAM,IAAA,KAAgB;EACtB,IAAI,MAAA,IACF,OAAO,IAAI,WAAW,CAAE,KAAM,IAAA,IAAe,OAAO,CAAK,CAAC,CAAC;EAE7D,IAAI,MAAA,IAAiB;GACnB,IAAM,IAAM,IAAI,WAAW,CAAC;GAI5B,OAHA,EAAI,KAAM,KAAM,IAAA,IAChB,EAAI,KAAK,OAAO,KAAS,EAAE,GAC3B,EAAI,KAAK,OAAO,IAAQ,IAAK,GACtB;EACT;EACA,IAAI,MAAA,IAAiB;GACnB,IAAM,IAAM,IAAI,WAAW,CAAC;GAG5B,OAFA,EAAI,KAAM,KAAM,IAAA,IAChB,IAAI,SAAS,EAAI,MAAM,EAAE,UAAU,GAAG,OAAO,CAAK,GAAG,EAAK,GACnD;EACT;EAEA,IAAM,IAAM,IAAI,WAAW,CAAC;EAG5B,OAFA,EAAI,KAAM,KAAM,IAAA,IAChB,IAAI,SAAS,EAAI,MAAM,EAAE,aAAa,GAAG,GAAO,EAAK,GAC9C;CACT;CACA,IAAI,KAAS,KACX,OAAO,IAAI,WAAW,CAAE,KAAM,IAAK,OAAO,CAAK,CAAC,CAAC;CAEnD,IAAI,KAAS,MACX,OAAO,IAAI,WAAW,CAAE,KAAM,IAAA,IAAe,OAAO,CAAK,CAAC,CAAC;CAE7D,IAAI,KAAS,QAAS;EACpB,IAAM,IAAM,IAAI,WAAW,CAAC;EAI5B,OAHA,EAAI,KAAM,KAAM,IAAA,IAChB,EAAI,KAAK,OAAO,KAAS,EAAE,GAC3B,EAAI,KAAK,OAAO,IAAQ,IAAK,GACtB;CACT;CACA,IAAI,KAAS,aAAc;EACzB,IAAM,IAAM,IAAI,WAAW,CAAC;EAG5B,OAFA,EAAI,KAAM,KAAM,IAAA,IAChB,IAAI,SAAS,EAAI,MAAM,EAAE,UAAU,GAAG,OAAO,CAAK,GAAG,EAAK,GACnD;CACT;CACA,IAAM,IAAM,IAAI,WAAW,CAAC;CAG5B,OAFA,EAAI,KAAM,KAAM,IAAA,IAChB,IAAI,SAAS,EAAI,MAAM,EAAE,aAAa,GAAG,GAAO,EAAK,GAC9C;AACT;AAGA,SAAgB,EAAO,GAAiC;CACtD,IAAM,IAAQ,EAAM,QAAQ,GAAG,MAAM,IAAI,EAAE,QAAQ,CAAC,GAC9C,IAAM,IAAI,WAAW,CAAK,GAC5B,IAAM;CACV,KAAK,IAAM,KAAK,GAEd,AADA,EAAI,IAAI,GAAG,CAAG,GACd,KAAO,EAAE;CAEX,OAAO;AACT;AAIA,IAAM,qBAAU,IAAI,yBAAS,IAAI,YAAY,CAAC,CAAC;AAM/C,SAAgB,GAAmB,GAAwB;CACzD,OAAO,OAAO,GAAG,EAAqB,GAAqB,CAAK,CAAC,GAAG,CAAK;AAC3E;AAMA,SAAgB,GAAmB,GAAwB;CAEzD,OADA,GAAQ,WAAW,GAAG,GAAO,EAAK,GAC3B,OAAO,GAAG,GAAQ,WAAW,GAAG,EAAK,GAAG,CAAK;AACtD;AAMA,SAAgB,GAAyB,GAA+B;CAGtE,OAFI,GAAmB,CAAK,IAAU,SAClC,GAAmB,CAAK,IAAU,WAC/B;AACT;;;ACrIA,IAAa,IAAb,cAA8B,EAAS;CACrC;CACA;CAEA,YACE,GACA,GACA;EAGA,IAFA,MAAM,GACN,KAAK,QAAQ,OAAO,CAAK,GACrB,KAAK,QAAQ,IACf,MAAU,WAAW,qCAAqC;EAC5D,IAAI,KAAK,QAAQ,uBACf,MAAU,WAAW,uCAAuC;EAC9D,KAAK,gBAAgB,GAAS;CAChC;CAEA,QAAQ,GAAsC;EAC5C,OAAO,EAAA,GAAmB,KAAK,OAAO,KAAK,aAAa;CAC1D;CAEA,OAAO,GAAmC,GAAwB;EAChE,IAAM,IACJ,KAAK,kBAAkB,KAAA,IAAuC,KAA3B,IAAI,KAAK,iBACxC,IAAI,KAAK;EACf,QAAQ,GAAS,WAAjB;GACE,KAAK,OACH,OAAO,KAAK,EAAE,SAAS,EAAE,IAAI;GAC/B,KAAK,SACH,OAAO,KAAK,EAAE,SAAS,CAAC,IAAI;GAC9B,KAAK,UACH,OAAO,KAAK,EAAE,SAAS,CAAC,IAAI;GAC9B,SACE,OAAO,EAAE,SAAS,IAAI;EAC1B;CACF;CAEA,MAAM,GAAgC;EACpC,IAAM,IAAO,GAAS,aAAa;EAGnC,OAFI,MAAS,WAAiB,KAAK,QAC/B,MAAS,YACN,KAAK,SAAS,kBAA8B,IADrB,OAAO,KAAK,KAAK,IAG3C,KAAK;CACX;AACF,GCnCa,IAAb,cAA8B,EAAS;CAErC;CACA;CAEA,YACE,GACA,GACA;EACA,MAAM;EACN,IAAM,IAAI,OAAO,CAAK;EACtB,IAAI,KAAK,IAAI,MAAU,WAAW,iCAAiC;EACnE,IAAI,IAAI,CAAE,uBACR,MAAU,WAAW,sCAAsC;EAE7D,AADA,KAAK,WAAW,CAAC,KAAK,GACtB,KAAK,gBAAgB,GAAS;CAChC;CAGA,IAAI,QAAgB;EAClB,OAAO,CAAC,KAAK,KAAK;CACpB;CAEA,QAAQ,GAAsC;EAC5C,OAAO,EAAA,GAAmB,KAAK,UAAU,KAAK,aAAa;CAC7D;CAEA,OAAO,GAAmC,GAAwB;EAChE,IAAM,IACJ,KAAK,kBAAkB,KAAA,IAAuC,KAA3B,IAAI,KAAK,iBACxC,IAAM,KAAK,WAAW;EAC5B,QAAQ,GAAS,WAAjB;GACE,KAAK,OACH,OAAO,MAAM,EAAI,SAAS,EAAE,IAAI;GAClC,KAAK,SACH,OAAO,MAAM,EAAI,SAAS,CAAC,IAAI;GACjC,KAAK,UACH,OAAO,MAAM,EAAI,SAAS,CAAC,IAAI;GACjC,SACE,OAAO,KAAK,MAAM,SAAS,IAAI;EACnC;CACF;CAEA,MAAM,GAAgC;EACpC,IAAM,IAAI,KAAK,OACT,IAAO,GAAS,aAAa;EAGnC,OAFI,MAAS,WAAiB,IAC1B,MAAS,YACN,KAAK,OAAO,cAAuB,IADZ,OAAO,CAAC,IACoB;CAC5D;AACF,GCtDM,qBAAO,IAAI,yBAAS,IADR,YAAY,CACJ,CAAK;AAS/B,SAAgB,GAAc,GAAmB;CAC/C,IAAM,IAAM,EAAE,WAAW,GAAG,GACtB,IAAO,EAAE,MAAM,IAAM,IAAI,CAAC,GAE1B,IAAO,EAAK,OAAO,MAAM;CAC/B,IAAI,MAAS,IACX,MAAU,YACR,oDAAoD,GACtD;CAEF,IAAM,IAAc,EAAK,MAAM,GAAG,CAAI,GAChC,IAAS,EAAK,MAAM,IAAO,CAAC;CAGlC,IAAI,CAAC,aAAa,KAAK,CAAM,GAC3B,MAAU,YACR,+DAA+D,GACjE;CAEF,IAAM,IAAM,SAAS,GAAQ,EAAE,GAEzB,IAAS,EAAY,QAAQ,GAAG,GAClC;CACJ,IAAI,MAAW,IAAI;EAEjB,IAAI,CAAC,iBAAiB,KAAK,CAAW,GACpC,MAAU,YACR,sDAAsD,GACxD;EACF,IAAW,SAAS,GAAa,EAAE;CACrC,OAAO;EACL,IAAM,IAAU,EAAY,MAAM,GAAG,CAAM,GACrC,IAAU,EAAY,MAAM,IAAS,CAAC;EAE5C,IAAI,MAAY,MAAM,MAAY,IAChC,MAAU,YACR,sDAAsD,GACxD;EAKF,IAJI,MAAY,MAAM,CAAC,iBAAiB,KAAK,CAAO,KAIhD,MAAY,MAAM,CAAC,iBAAiB,KAAK,CAAO,GAClD,MAAU,YACR,oDAAoD,GACtD;EAIF,KAHe,MAAY,KAAK,IAAI,SAAS,GAAS,EAAE,MAEtD,MAAY,KAAK,IAAI,SAAS,GAAS,EAAE,IAAa,MAAI,EAAQ;CAEtE;CAEA,IAAM,IAAS,IAAoB,KAAG;CACtC,OAAO,IAAM,CAAC,IAAS;AACzB;AAWA,SAAgB,GAAgB,GAAmB;CACjD,IAAI,MAAM,CAAC,GAAG,OAAO;CACrB,IAAI,CAAC,SAAS,CAAC,GAAG,OAAO,IAAI,IAAI,aAAa;CAE9C,IAAM,IAAM,OAAO,GAAG,GAAG,EAAE,KAAK,IAAI,GAC9B,IAAM,KAAK,IAAI,CAAC;CAEtB,IAAI,MAAQ,GAAG,OAAO,IAAM,YAAY;CAExC,GAAK,WAAW,GAAG,GAAK,EAAK;CAC7B,IAAM,IAAK,GAAK,UAAU,GAAG,EAAK,GAC5B,IAAK,GAAK,UAAU,GAAG,EAAK,GAG5B,IAAa,MAAO,KAAM,MAE1B,IAAS,IAAK,SAEd,IAAS,GAKT,KADJ,EAAO,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,IAAI,EAAO,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,GACpD,QAAQ,OAAO,EAAE,GACnC,IAAW,MAAY,KAAK,KAAK,IAAI,KAEvC,GACA;CACJ,AAAI,MAAc,KAEhB,IAAU,KACV,IAAM,UAGN,IAAU,KACV,IAAM,IAAY;CAGpB,IAAM,IAAS,KAAO,IAAI,IAAI,MAAQ,GAAG,KACnC,IAAS,KAAK,IAAU,EAAS,GAAG;CAC1C,OAAO,IAAM,IAAI,MAAW;AAC9B;;;AC7GA,IAAa,IAAb,cAA+B,EAAS;CACtC;CAOA;CAMA;CAEA,YAAY,GAAe,GAA0C;EAGnE,AAFA,MAAM,GACN,KAAK,QAAQ,GACb,KAAK,YAAY,GAAS;CAC5B;CAEA,QAAQ,GAAsC;EAC5C,IAAM,IAAY,KAAK,aAAa,GAAyB,KAAK,KAAK;EAGvE,IAAI,MAAc,QAAQ;GACxB,IAAM,IAAM,IAAI,WAAW,CAAC;GAG5B,OAFA,EAAI,KAAK,KACT,GAAa,IAAI,SAAS,EAAI,MAAM,GAAG,GAAG,KAAK,OAAO,EAAK,GACpD;EACT;EACA,IAAI,MAAc,UAAU;GAC1B,IAAM,IAAM,IAAI,WAAW,CAAC;GAG5B,OAFA,EAAI,KAAK,KACT,IAAI,SAAS,EAAI,MAAM,EAAE,WAAW,GAAG,KAAK,OAAO,EAAK,GACjD;EACT;EAEA,IAAM,IAAM,IAAI,WAAW,CAAC;EAG5B,OAFA,EAAI,KAAK,KACT,IAAI,SAAS,EAAI,MAAM,EAAE,WAAW,GAAG,KAAK,OAAO,EAAK,GACjD;CACT;CAEA,OAAO,GAAmC,GAAwB;EAChE,IAAI,GAAS,eAAe,MAAS,KAAK,cAAc,KAAA,GACtD,OAAO,KAAK;EACd,IAAM,IAAe,GAAyB,KAAK,KAAK;EAKxD,QAHE,GAAS,gBAAgB,QACrB,GAAgB,KAAK,KAAK,IAC1B,GAAmB,KAAK,KAAK,KACnB,GAAY,KAAK,OAAO,KAAK,WAAW,CAAY;CACtE;CAEA,MAAM,GAAiC;EACrC,OAAO,KAAK;CACd;AACF,GCrEa,IAAb,cAA6B,EAAS;CACpC;CACA;CACA;CAEA,YACE,GACA,GACA,GACA;EAGA,IAFA,MAAM,GACN,KAAK,MAAM,OAAO,CAAG,GACjB,KAAK,MAAM,IACb,MAAU,WAAW,yCAAyC;EAEhE,AADA,KAAK,UAAU,GACf,KAAK,gBAAgB,GAAS;CAChC;CAEA,QAAQ,GAAqC;EAC3C,OAAO,EAAO,CACZ,EAAA,GAAkB,KAAK,KAAK,KAAK,aAAa,GAC9C,KAAK,QAAQ,QAAQ,CAAO,CAC9B,CAAC;CACH;CAEA,OAAgB,GAAmC,GAAuB;EACxE,IAAM,IACJ,KAAK,kBAAkB,KAAA,IAAuC,KAA3B,IAAI,KAAK;EAC9C,OAAO,GAAG,KAAK,MAAM,EAAO,GAAG,KAAK,QAAQ,OAAO,GAAS,CAAK,EAAE;CACrE;CAEA,WAAoB,GAAe,GAAyC;EAK1E,IAAM,IAAyB,CAC7B;GACE;GACA,OAPW,MACb,MAAM,KAAK,IAAQ,MACjB,EAAE,SAAS,EAAE,EAAE,YAAY,EAAE,SAAS,GAAG,GAAG,CAC9C,EAAE,KAAK,GAAG,GAIG,EAAA,GAAkB,KAAK,KAAK,KAAK,aAAa,CAAC;GAC1D,SAAS,OAAO,KAAK;EACvB,CACF;EAEA,OADA,EAAM,KAAK,GAAG,KAAK,QAAQ,WAAW,IAAQ,GAAG,CAAO,CAAC,GAClD;CACT;CAEA,MAAM,GAAgC;EACpC,IAAM,IAAQ,KAAK,QAAQ,MAAM,CAAO;EACxC,OAAO,GAAS,YAAY,IAAQ,EAAI,IAAI,GAAO,KAAK,GAAG;CAC7D;AACF;;;ACaA,SAAS,GACP,GACA,GAC+B;CAC/B,IAAI,IAAO,GACP,IAAM;CACV,KAAK,IAAI,IAAI,GAAG,IAAI,GAAQ,KAC1B,AAAI,EAAM,OAAO,QACf,KACA,IAAM,KAEN;CAGJ,OAAO;EAAE;EAAM;CAAI;AACrB;AAEA,IAAa,KAAb,MAAuB;CAoBF;CAnBnB;CACA;CACA;CACA,UAAgC;CAChC;CAEA,WAAkC,CAAC;CAMnC;CAMA,YACE,GACA,GACA;EAFiB,KAAA,QAAA;EAGjB,IAAM,IAAS,GAAS,UAAU;EAClC,IAAI,CAAC,OAAO,UAAU,CAAM,KAAK,IAAS,KAAK,IAAS,EAAM,QAC5D,MAAU,WACR,qDAAqD,EAAM,QAC7D;EACF,IAAM,IAAW,GAAW,GAAO,CAAM;EAIzC,AAHA,KAAK,MAAM,GACX,KAAK,OAAO,EAAS,MACrB,KAAK,MAAM,EAAS,KACpB,KAAK,yBAAyB;CAChC;CAEA,OAAc;EAEZ,OADI,KAAK,YAAY,SAAM,KAAK,UAAU,KAAK,UAAU,IAClD,KAAK;CACd;CAEA,UAAiB;EACf,IAAM,IAAM,KAAK,YAAY,OAAsB,KAAK,UAAU,IAA9B,KAAK;EAGzC,OAFA,KAAK,UAAU,MACf,KAAK,yBAAyB,EAAI,WAC3B;CACT;CAGA,IAAI,gBAAwB;EAC1B,OAAO,KAAK;CACd;CAGA,IAAI,SAAiB;EACnB,OAAO,KAAK;CACd;CAIA,MAAsB;EACpB,OAAO,KAAK,MAAM,KAAK,QAAQ;CACjC;CACA,OAAwB;EACtB,OAAO,KAAK,OAAO,KAAK,MAAM;CAChC;CAEA,WAA2B;EACzB,IAAM,IAAI,KAAK,MAAM,KAAK,UAAU;EAOpC,OANI,MAAM,QACR,KAAK,QACL,KAAK,MAAM,KAEX,KAAK,OAEA;CACT;CAEA,MAAc,GAAa,IAAO,KAAK,MAAM,IAAM,KAAK,KAAY;EAClE,MAAU,YACR,2BAA2B,EAAK,WAAW,EAAI,IAAI,GACrD;CACF;CAEA,UAAwB;EACtB,SAAS;GAEP,OAAO,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,CAAC,IAAG,KAAK,SAAS;GAC5D,IAAI,KAAK,KAAK,GAAG;GAEjB,IAAM,IAAI,KAAK,IAAI;GAGnB,IAAI,MAAM,KAAK;IACb,IAAM,IAAQ,KAAK,KACb,IAAO,KAAK,MACZ,IAAM,KAAK;IACjB,OAAO,CAAC,KAAK,KAAK,KAAK,KAAK,IAAI,MAAM,OAAM,KAAK,SAAS;IAC1D,KAAK,SAAS,KAAK;KACjB,MAAM;KACN,QAAQ;KACR,MAAM,KAAK,MAAM,MAAM,GAAO,KAAK,GAAG;KACtC;KACA,KAAK,KAAK;KACV;KACA;IACF,CAAC;IACD;GACF;GAGA,IAAI,MAAM,KAAK;IACb,IAAM,IAAO,KAAK,MAAM,KAAK,MAAM,MAAM;IACzC,IAAI,MAAS,KAAK;KAEhB,IAAM,IAAQ,KAAK,KACb,IAAO,KAAK,MACZ,IAAM,KAAK;KAGjB,KAFA,KAAK,SAAS,GACd,KAAK,SAAS,GACP,CAAC,KAAK,KAAK,KAAK,KAAK,IAAI,MAAM,OAAM,KAAK,SAAS;KAC1D,KAAK,SAAS,KAAK;MACjB,MAAM;MACN,QAAQ;MACR,MAAM,KAAK,MAAM,MAAM,GAAO,KAAK,GAAG;MACtC;MACA,KAAK,KAAK;MACV;MACA;KACF,CAAC;KACD;IACF;IACA,IAAI,MAAS,KAAK;KAEhB,IAAM,IAAQ,KAAK,KACb,IAAO,KAAK,MACZ,IAAM,KAAK;KAIjB,AAHA,KAAK,SAAS,GACd,KAAK,SAAS,GACd,KAAK,sBAAsB,GAC3B,KAAK,SAAS,KAAK;MACjB,MAAM;MACN,QAAQ;MACR,MAAM,KAAK,MAAM,MAAM,GAAO,KAAK,GAAG;MACtC;MACA,KAAK,KAAK;MACV;MACA;KACF,CAAC;KACD;IACF;IAEA,IAAM,IAAQ,KAAK,KACb,IAAO,KAAK,MACZ,IAAM,KAAK;IAGjB,AAFA,KAAK,SAAS,GACd,KAAK,uBAAuB,GAC5B,KAAK,SAAS,KAAK;KACjB,MAAM;KACN,QAAQ;KACR,MAAM,KAAK,MAAM,MAAM,GAAO,KAAK,GAAG;KACtC;KACA,KAAK,KAAK;KACV;KACA;IACF,CAAC;IACD;GACF;GAEA;EACF;CACF;CASA,uBAA+B,GAAwB;EACrD,IAAM,IAAK,KAAK,IAAI;EACpB,IAAI,MAAO,KAAK;GACd,IAAM,IAAO,KAAK,MAAM,KAAK,MAAM,MAAM;GACzC,IAAI,MAAS,KAAK;IAGhB,KAFA,KAAK,SAAS,GACd,KAAK,SAAS,GACP,CAAC,KAAK,KAAK,KAAK,KAAK,IAAI,MAAM,OAAM;KAC1C,IAAI,KAAK,IAAI,MAAM,MAAM;MAEvB,AADA,KAAK,SAAS,GACV,CAAC,KAAK,KAAK,KAAK,KAAK,IAAI,MAAM,QAAM,KAAK,SAAS;MACvD;KACF;KACA,IAAI,KAAK,IAAI,MAAM,GAAO;KAC1B,KAAK,SAAS;IAChB;IACA,OAAO;GACT;GASA,OARI,MAAS,OACX,KAAK,SAAS,GACd,KAAK,SAAS,GACd,KAAK,sBAAsB,GACpB,OAET,KAAK,SAAS,GACd,KAAK,uBAAuB,GACrB;EACT;EACA,IAAI,MAAO,KAAK;GACd,OAAO,CAAC,KAAK,KAAK,KAAK,KAAK,IAAI,MAAM,OAAM;IAC1C,IAAI,KAAK,IAAI,MAAM,MAAM;KAEvB,IADA,KAAK,SAAS,GACV,KAAK,KAAK,KAAK,KAAK,IAAI,MAAM,MAAM;KAExC,AADgB,KAAK,SACjB,MAAY,OAAK,KAAK,iCAAiC;KAC3D;IACF;IACA,IAAI,KAAK,IAAI,MAAM,GAAO;IAC1B,KAAK,SAAS;GAChB;GACA,OAAO;EACT;EACA,OAAO;CACT;CAUA,mCAAiD;EAC/C,IAAM,IAAO,KAAK,MAChB,IAAM,KAAK;EAGb,IAAI,CAAC,KAAK,KAAK,KAAK,KAAK,IAAI,MAAM,KAAK;GACtC,KAAK,SAAS;GACd,IAAI,IAAM;GACV,OAAO,CAAC,KAAK,KAAK,KAAK,KAAK,IAAI,MAAM,OAAO,KAAK,IAAI,MAAM,OAC1D,KAAO,KAAK,SAAS;GACvB,AAAI,CAAC,KAAK,KAAK,KAAK,KAAK,IAAI,MAAM,OAAK,KAAK,SAAS;GACtD,IAAM,IAAK,SAAS,KAAO,KAAK,EAAE;GAClC,AAAI,KAAM,SAAU,KAAM,SACxB,KAAK,MACH,OAAO,EAAI,kEACX,GACA,CACF;GACF;EACF;EAGA,IAAI,IAAM;EACV,KAAK,IAAI,IAAI,GAAG,IAAI,KAEd,EADA,KAAK,KAAK,KAAK,KAAK,IAAI,MAAM,QAC9B,CAAC,cAAc,KAAK,KAAK,IAAI,CAAC,IAFb,KAGrB,KAAO,KAAK,SAAS;EAEvB,IAAI,EAAI,SAAS,GAAG;EAEpB,IAAM,IAAK,SAAS,GAAK,EAAE;EAG3B,IAAI,KAAM,SAAU,KAAM,OAAQ;GAQhC,CAPI,KAAK,IAAI,MAAM,SAAS,KAAK,MAAM,KAAK,MAAM,MAAM,QAAQ,QAC9D,KAAK,MACH,0BAA0B,EAAI,yBAC9B,GACA,CACF,GACF,KAAK,SAAS,GACd,KAAK,SAAS;GACd,IAAI,IAAO;GACX,KAAK,IAAI,IAAI,GAAG,IAAI,KAEd,EADA,KAAK,KAAK,KAAK,KAAK,IAAI,MAAM,QAC9B,CAAC,cAAc,KAAK,KAAK,IAAI,CAAC,IAFb,KAGrB,KAAQ,KAAK,SAAS;GAExB,IAAM,IAAM,SAAS,KAAQ,KAAK,EAAE;GACpC,CAAI,IAAM,SAAU,IAAM,UACxB,KAAK,MACH,MAAM,EAAI,8EACV,GACA,CACF;GACF;EACF;EAEA,AAAI,KAAM,SAAU,KAAM,SACxB,KAAK,MACH,yBAAyB,EAAI,yBAC7B,GACA,CACF;CACJ;CAUA,gBACE,GACA,GACA,GACA,GACA,GACQ;EACR,IAAM,IAAK,EAAI;EACf,IAAI,MAAO,KAAK;GAEd,IADA,KACI,EAAI,OAAO,KAAK;IAElB,KADA,KACO,IAAI,EAAI,UAAU,EAAI,OAAO,OAAM;IAC1C,OAAO;GACT;GACA,IAAI,EAAI,OAAO,KAAK;IAElB,KADA,KACO,IAAI,EAAI,SAAQ;KACrB,IAAI,EAAI,OAAO,OAAO,EAAI,IAAI,OAAO,KAAK,OAAO,IAAI;KACrD;IACF;IACA,OAAO;GACT;GAEA,OAAO,IAAI,EAAI,UAAU,EAAI,OAAO,MAAK;GACzC,IAAI,KAAK,EAAI,QACX,MAAU,YACR,2BAA2B,EAAU,WAAW,EAAS,kCAAkC,GAC7F;GACF,OAAO,IAAI;EACb;EACA,IAAI,MAAO,KAAK;GACd,OAAO,IAAI,EAAI,UAAU,EAAI,OAAO,OAAM;GAC1C,OAAO;EACT;EACA,OAAO;CACT;CAGA,yBAAuC;EACrC,IAAM,IAAO,KAAK,MAChB,IAAM,KAAK;EACb,OAAO,CAAC,KAAK,KAAK,IAAG;GACnB,IAAI,KAAK,IAAI,MAAM,MAAM;IAEvB,AADA,KAAK,SAAS,GACT,KAAK,KAAK,KAAG,KAAK,SAAS;IAChC;GACF;GACA,IAAI,KAAK,IAAI,MAAM,KAAK;GACxB,KAAK,SAAS;EAChB;EAEA,AADI,KAAK,KAAK,KAAG,KAAK,MAAM,8BAA8B,GAAM,CAAG,GACnE,KAAK,SAAS;CAChB;CAGA,wBAAsC;EACpC,IAAM,IAAO,KAAK,MAChB,IAAM,KAAK;EACb,OAAO,CAAC,KAAK,KAAK,IAAG;GACnB,IAAI,KAAK,IAAI,MAAM,QAAQ,KAAK,MAAM,KAAK,MAAM,MAAM,QAAQ,KAAK;IAElE,AADA,KAAK,SAAS,GACd,KAAK,SAAS;IACd;GACF;GACA,KAAK,SAAS;EAChB;EACA,KAAK,MAAM,8BAA8B,GAAM,CAAG;CACpD;CAiBA,mBAA2B,GAAuB;EAChD,KAAK,SAAS;EACd,IAAI,IAAM;EACV,OAAO,CAAC,KAAK,KAAK,KAAK,KAAK,IAAI,MAAM,IAAO;GAC3C,IAAM,IAAK,KAAK,IAAI;GAGpB,IAAI,MAAO,MAAM;IACf,KAAK,SAAS;IACd;GACF;GAGA,IAAM,IAAK,EAAG,YAAY,CAAC;GAM3B,KALK,IAAK,MAAQ,MAAO,MAAS,MAAO,QACvC,KAAK,MACH,iCAAiC,EAAG,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,EAAE,mCACpE,GAEE,MAAO,MAAM;IAEf,IAAM,IAAU,KAAK,KACnB,IAAQ,KAAK,MACb,IAAO,KAAK;IACd,KAAK,SAAS;IACd,IAAM,IAAI,KAAK,SAAS;IACxB,QAAQ,GAAR;KACE,KAAK;MACH,KAAO;MACP;KACF,KAAK;MACH,KAAO;MACP;KACF,KAAK;MACH,KAAO;MACP;KACF,KAAK;MACH,KAAO;MACP;KACF,KAAK;MACH,KAAO;MACP;KACF,KAAK;MACH,KAAO;MACP;KACF,KAAK;MACH,KAAO,KAAK,mBAAmB,GAAO,GAAS,GAAO,CAAI;MAC1D;KACF;MAEE,IAAI,MAAM,GAAO;OACf,KAAO;OACP;MACF;MACA,IAAI,MAAM,KAAK;OAOb,AANI,MAAU,OACZ,KAAK,MACH,kEACA,GACA,CACF,GACF,KAAO;OACP;MACF;MAEA,IAAI,KAAK,iBAAiB;OACxB,IAAI,MAAM,KAAK;QAOb,AANA,KAAK,gBACH,8DACA,GACA,GACA,CACF,GACA,KAAO;QACP;OACF;OACA,IAAI,MAAM,KAAK;QAOb,AANA,KAAK,gBACH,8DACA,GACA,GACA,CACF,GACA,KAAO;QACP;OACF;OACA,IAAI,MAAM,KAAK;QAEb,IAAM,IAAK,KAAK,IAAI,GACd,IAAK,KAAK,MAAM,KAAK,MAAM,MAAM;QASvC,CARI,CAAC,cAAc,KAAK,CAAE,KAAK,CAAC,cAAc,KAAK,CAAE,MACnD,KAAK,MACH,8CACA,GACA,CACF,GAEF,KAAK,SAAS,GACd,KAAK,SAAS;QACd,IAAM,IAAY,SAAS,IAAK,GAAI,EAAE;QAOtC,AANA,KAAK,gBACH,MAAM,IAAK,EAAG,+CAA+C,IAAK,EAAG,WACrE,GACA,GACA,CACF,GACA,KAAO,OAAO,aAAa,CAAS;QACpC;OACF;OAEA,IAAI,MAAM,QAAO,MAAM,KAAK;QAO1B,AANA,KAAK,gBACH,KAAK,EAAE,UAAU,MAAU,OAAM,WAAW,SAAS,iCACrD,GACA,GACA,CACF,GACA,KAAO;QACP;OACF;OAEA,IAAI,MAAM,QAAQ,MAAM,MAAM;QAE5B,AADI,MAAM,QAAQ,KAAK,IAAI,MAAM,QAAM,KAAK,SAAS,GACrD,KAAK,gBACH,2EACA,GACA,GACA,CACF;QACA;OACF;OAQA,AANA,KAAK,gBACH,KAAK,EAAE,kDAAkD,EAAE,IAC3D,GACA,GACA,CACF,GACA,KAAO;OACP;MACF;MACA,KAAK,MACH,6BAA6B,EAAE,MAAM,MAAU,OAAM,WAAW,SAAS,iBACzE,GACA,CACF;IACJ;GACF,OACE,KAAO,KAAK,SAAS;EAEzB;EAGA,OAFI,KAAK,KAAK,KAAG,KAAK,MAAM,6BAA6B,GACzD,KAAK,SAAS,GACP;CACT;CAiBA,mBACE,GACA,GACA,GACA,GACQ;EACR,IAAM,IAAO,KAAK,MAChB,IAAM,KAAK,KAGP,KAA8B,MAAqB;GAKvD,IAAI,MAAU,OAAO,KAAM,MAAQ,KAAM,KAAM;IAC7C,IAAM,IAAM,oCAAoC,EAAG,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,EAAE,YAAY,EAAE;IAC/F,IAAI,KAAK,iBAAiB;KACxB,KAAK,gBACH,GACA,KAAY,KAAK,KACjB,KAAU,GACV,KAAS,CACX;KACA;IACF;IACA,KAAK,MAAM,GAAK,GAAM,CAAG;GAC3B;EACF;EAGA,IAAI,CAAC,KAAK,KAAK,KAAK,KAAK,IAAI,MAAM,KAAK;GACtC,KAAK,SAAS;GACd,IAAI,IAAM;GACV,OAAO,CAAC,KAAK,KAAK,KAAK,KAAK,IAAI,MAAM,MAAK;IACzC,IAAM,IAAI,KAAK,IAAI;IAOnB,AANK,cAAc,KAAK,CAAC,KACvB,KAAK,MACH,sCAAsC,KAAK,UAAU,CAAC,KACtD,GACA,CACF,GACF,KAAO,KAAK,SAAS;GACvB;GAGA,AAFI,KAAK,KAAK,KAAG,KAAK,MAAM,6BAA6B,GAAM,CAAG,GAClE,KAAK,SAAS,GACV,EAAI,WAAW,KAAG,KAAK,MAAM,sBAAsB,GAAM,CAAG;GAChE,IAAM,IAAK,SAAS,GAAK,EAAE;GAc3B,OAbI,IAAK,WACP,KAAK,MACH,OAAO,EAAI,gDACX,GACA,CACF,GACE,KAAM,SAAU,KAAM,SACxB,KAAK,MACH,OAAO,EAAI,yEACX,GACA,CACF,GACF,EAA2B,CAAE,GACtB,OAAO,cAAc,CAAE;EAChC;EAGA,IAAI,IAAM;EACV,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK;GAC1B,AAAI,KAAK,KAAK,KAAG,KAAK,MAAM,4BAA4B,GAAM,CAAG;GACjE,IAAM,IAAI,KAAK,IAAI;GAOnB,AANK,cAAc,KAAK,CAAC,KACvB,KAAK,MACH,wCAAwC,KAAK,UAAU,CAAC,KACxD,GACA,CACF,GACF,KAAO,KAAK,SAAS;EACvB;EACA,IAAM,IAAK,SAAS,GAAK,EAAE;EAG3B,IAAI,KAAM,SAAU,KAAM,OAAQ;GAQhC,CAPI,KAAK,IAAI,MAAM,SAAS,KAAK,MAAM,KAAK,MAAM,MAAM,QAAQ,QAC9D,KAAK,MACH,0BAA0B,EAAI,uCAC9B,GACA,CACF,GACF,KAAK,SAAS,GACd,KAAK,SAAS;GACd,IAAM,IAAQ,KAAK,MACjB,IAAO,KAAK,KACV,IAAO;GACX,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KAGrB,AAFI,KAAK,KAAK,KACZ,KAAK,MAAM,kCAAkC,GAAO,CAAI,GAC1D,KAAQ,KAAK,SAAS;GAExB,IAAM,IAAM,SAAS,GAAM,EAAE;GAQ7B,QAPI,IAAM,SAAU,IAAM,UACxB,KAAK,MACH,MAAM,EAAI,kEAAkE,EAAK,IACjF,GACA,CACF,GAEK,OAAO,cACZ,SAAW,IAAK,SAAU,QAAS,IAAM,MAC3C;EACF;EAOA,OAJI,KAAM,SAAU,KAAM,SACxB,KAAK,MAAM,yBAAyB,EAAI,gBAAgB,GAAM,CAAG,GAEnE,EAA2B,CAAE,GACtB,OAAO,aAAa,CAAE;CAC/B;CAYA,wBAAwC;EACtC,IAAM,IAAW,KAAK,MACpB,IAAU,KAAK,KAGb,IAAI;EACR,OAAO,CAAC,KAAK,KAAK,KAAK,KAAK,IAAI,MAAM,MAEpC,AADA,KAAK,SAAS,GACd;EAKF,AADI,CAAC,KAAK,KAAK,KAAK,KAAK,IAAI,MAAM,QAAM,KAAK,SAAS,GACnD,CAAC,KAAK,KAAK,KAAK,KAAK,IAAI,MAAM,QAAM,KAAK,SAAS;EAEvD,IAAI,IAAM;EACV,OAAO,CAAC,KAAK,KAAK,IAAG;GACnB,IAAM,IAAK,KAAK,IAAI;GAGpB,IAAI,MAAO,MAAM;IACf,KAAK,SAAS;IACd;GACF;GAEA,IAAI,MAAO,KAAK;IAEd,IAAI,IAAI;IACR,OAAO,CAAC,KAAK,KAAK,KAAK,KAAK,IAAI,MAAM,MAEpC,AADA,KAAK,SAAS,GACd;IAEF,IAAI,KAAK,GASP,OAPA,KAAO,IAAI,OAAO,IAAI,CAAC,GACnB,MAAQ,MACV,KAAK,MACH,yCACA,GACA,CACF,GACK;IAGT,KAAO,IAAI,OAAO,CAAC;GACrB,OAAO;IACL,IAAM,IAAK,EAAG,YAAY,CAAC;IAgB3B,AAdI,IAAK,MAAQ,MAAO,MAAQ,MAAO,MACrC,KAAK,MACH,2DAA2D,EAAG,SAAS,EAAE,EAAE,YAAY,EAAE,SAAS,GAAG,GAAG,EAAE,YAC1G,KAAK,MACL,KAAK,GACP,GAEE,MAAO,OACT,KAAK,MACH,6DACA,KAAK,MACL,KAAK,GACP,GAEF,KAAO,KAAK,SAAS;GACvB;EACF;EAEA,KAAK,MAAM,mCAAmC,GAAU,CAAO;CACjE;CAgBA,sBACE,GACA,GACA,GACoC;EACpC,IAAI,IAAM,IACN,IAAS,IACT,IAAI;EACR,OAAO,IAAI,EAAI,SAAQ;GACrB,IAAM,IAAK,EAAI;GAEf,IAAI,MAAO,QAAQ,MAAO,OAAO,MAAO,MAAM;IAC5C;IACA;GACF;GAEA,IAAI,MAAO,KACT,MAAU,YACR,2BAA2B,EAAU,WAAW,EAAS,oFAC3D;GAGF,IAAM,IAAe,KAAK,gBACxB,GACA,GACA,uBACA,GACA,CACF;GACA,IAAI,MAAiB,IAAI;IACvB,IAAI;IACJ;GACF;GAEA,IAAI,MAAO,OAAO,EAAI,IAAI,OAAO,OAAO,EAAI,IAAI,OAAO,KAAK;IAE1D,KADA,KAAK,GACE,IAAI,EAAI,UAAU,EAAI,OAAO,MAAK;IAEzC,AADA,KAAO,OACP,IAAS;IACT;GACF;GAEA,IAAI,cAAc,KAAK,CAAE,GAAG;IAE1B,AADA,KAAO,GACP;IACA;GACF;GACA,MAAU,YACR,2BAA2B,EAAU,WAAW,EAAS,yBAAyB,KAAK,UAAU,CAAE,EAAE,0BACvG;EACF;EACA,OAAO;GAAE,OAAO;GAAK;EAAO;CAC9B;CAWA,sBACE,GACA,GACA,GACQ;EACR,IAAI,IAAM,IACN,IAAI;EACR,OAAO,IAAI,EAAI,SAAQ;GACrB,IAAM,IAAK,EAAI;GAEf,IAAI,MAAO,QAAQ,MAAO,OAAO,MAAO,MAAM;IAC5C;IACA;GACF;GAEA,IAAI,MAAO,KACT,MAAU,YACR,2BAA2B,EAAU,WAAW,EAAS,sFAC3D;GAKF,IAAI,MAAO,KAAK;IACd,OAAO,IAAI,EAAI,UAAU,EAAI,OAAO,OAAM;IAC1C;GACF;GAEA,AADA,KAAO,GACP;EACF;EACA,OAAO;CACT;CAQA,iBAAyB,GAAuB;EAC9C,KAAK,SAAS;EACd,IAAI,IAAM;EACV,OAAO,CAAC,KAAK,KAAK,KAAK,KAAK,IAAI,MAAM,IAAO;GAC3C,IAAM,IAAK,KAAK,IAAI;GAEpB,IAAI,MAAO,QAAQ,MAAO,KAAK;IAC7B,KAAK,SAAS;IACd;GACF;GACA,IAAI,MAAO,MAAM;IAEf,KAAK,SAAS;IACd;GACF;GAYA,IAXI,MAAO,OACT,KAAK,MACH,2EACA,KAAK,MACL,KAAK,GACP,GAME,MAAO,KAAK;IACd,OAAO,CAAC,KAAK,KAAK,KAAK,KAAK,IAAI,MAAM,OAAM;KAC1C,IAAI,KAAK,IAAI,MAAM,MAAM;MAEvB,AADA,KAAK,SAAS,GACV,CAAC,KAAK,KAAK,KAAK,KAAK,IAAI,MAAM,QAAM,KAAK,SAAS;MACvD;KACF;KACA,IAAI,KAAK,IAAI,MAAM,GAAO;KAC1B,KAAK,SAAS;IAChB;IACA;GACF;GACA,KAAO,KAAK,SAAS;EACvB;EAGA,OAFI,KAAK,KAAK,KAAG,KAAK,MAAM,kCAAkC,GAC9D,KAAK,SAAS,GACP;CACT;CAQA,gCAAwC,GAGtC;EACA,KAAK,SAAS;EACd,IAAI,IAAM,IACN,IAAS;EACb,OAAO,CAAC,KAAK,KAAK,KAAK,KAAK,IAAI,MAAM,IAAO;GAC3C,IAAM,IAAK,KAAK,IAAI;GAEpB,IAAI,MAAO,QAAQ,MAAO,OAAO,MAAO,MAAM;IAC5C,KAAK,SAAS;IACd;GACF;GACA,IAAI,MAAO,OACT,KAAK,MACH,+EACA,KAAK,MACL,KAAK,GACP,GAEE,MAAK,uBAAuB,CAAK,GAErC;QACE,MAAO,QACN,KAAK,MAAM,KAAK,MAAM,MAAM,QAAQ,QACpC,KAAK,MAAM,KAAK,MAAM,MAAM,QAAQ,KACrC;KAKA,KAJA,KAAK,SAAS,GACd,KAAK,SAAS,GACd,KAAK,SAAS,GAEP,CAAC,KAAK,KAAK,KAAK,KAAK,IAAI,MAAM,MAAK,KAAK,SAAS;KAGzD,AADK,EAAI,SAAS,KAAK,MAAG,KAAO,QACjC,IAAS;KACT;IACF;IACA,IAAI,cAAc,KAAK,CAAE,GAAG;KAC1B,KAAO,KAAK,SAAS;KACrB;IACF;IACA,KAAK,MACH,wBAAwB,KAAK,UAAU,CAAE,EAAE,oBAC7C;GAPA;EAQF;EAGA,OAFI,KAAK,KAAK,KAAG,KAAK,MAAM,sCAAsC,GAClE,KAAK,SAAS,GACP;GAAE,OAAO;GAAK;EAAO;CAC9B;CAIA,YAA2B;EACzB,KAAK,QAAQ;EACb,IAAM,IAAS,KAAK;EAEpB,OAAO;GACL,GAFU,KAAK,cAEZ;GACH,KAAK,KAAK,MAAM,MAAM,GAAQ,KAAK,GAAG;GACtC;GACA,WAAW,KAAK;EAClB;CACF;CAEA,gBAAqE;EACnE,IAAM,IAAO,KAAK,MAChB,IAAM,KAAK;EACb,IAAI,KAAK,KAAK,GAAG,OAAO;GAAE,MAAM;GAAO,OAAO;GAAI;GAAM;EAAI;EAE5D,IAAM,IAAI,KAAK,IAAI;EAEnB,QAAQ,GAAR;GACE,KAAK,KAEH,OADA,KAAK,SAAS,GACP;IAAE,MAAM;IAAY,OAAO;IAAK;IAAM;GAAI;GACnD,KAAK,KAEH,OADA,KAAK,SAAS,GACP;IAAE,MAAM;IAAY,OAAO;IAAK;IAAM;GAAI;GACnD,KAAK,KAEH,OADA,KAAK,SAAS,GACP;IAAE,MAAM;IAAU,OAAO;IAAK;IAAM;GAAI;GACjD,KAAK,KAEH,OADA,KAAK,SAAS,GACP;IAAE,MAAM;IAAU,OAAO;IAAK;IAAM;GAAI;GACjD,KAAK,KAEH,OADA,KAAK,SAAS,GACP;IAAE,MAAM;IAAU,OAAO;IAAK;IAAM;GAAI;GACjD,KAAK,KAEH,OADA,KAAK,SAAS,GACP;IAAE,MAAM;IAAU,OAAO;IAAK;IAAM;GAAI;GACjD,KAAK,KAEH,OADA,KAAK,SAAS,GACP;IAAE,MAAM;IAAS,OAAO;IAAK;IAAM;GAAI;GAChD,KAAK,KAEH,OADA,KAAK,SAAS,GACP;IAAE,MAAM;IAAS,OAAO;IAAK;IAAM;GAAI;GAChD,KAAK;IACH,KAAK,KAAK,MAAM,KAAK,MAAM,MAAM,QAAQ,KAGvC,OAFA,KAAK,SAAS,GACd,KAAK,SAAS,GACP;KAAE,MAAM;KAAS,OAAO;KAAM;KAAM;IAAI;IAEjD,KAAK,MAAM,4BAA4B,GAAM,CAAG;GAClD,KAAK;IACH,KAAK,KAAK,MAAM,KAAK,MAAM,MAAM,QAAQ,KAGvC,OAFA,KAAK,SAAS,GACd,KAAK,SAAS,GACP;KAAE,MAAM;KAAS,OAAO;KAAM;KAAM;IAAI;IAEjD,KAAK,MAAM,4BAA4B,GAAM,CAAG;GAClD,KAAK,KAAK;IACR,IAAM,IAAQ,KAAK,MAAM,MAAM,KAAK,MAAM,CAAC;IAE3C,IAAI,EAAM,WAAW,UAAU,GAAG;KAChC,IAAM,IAAQ,EAAM,MAAM,IACpB,IACJ,MAAU,OACV,SAAS,KAAK,EAAM,MAAM,EAAE,KAC5B,CAAC,eAAe,KAAK,EAAM,OAAO,EAAE;KACtC,IAAI,CAAC,eAAe,KAAK,CAAK,KAAK,GAAW;MAC5C,KAAK,SAAS;MACd,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK,KAAK,SAAS;MAC1C,IAAI,IAAQ;MAEZ,OADI,MAAW,KAAS,KAAK,SAAS,IAAI,KAAK,SAAS,IACjD;OAAE,MAAM;OAAS;OAAO;OAAM;MAAI;KAC3C;IACF;IAEA,IAAM,IAAY,EAAM,MAAM;IAO9B,OANK,KAAa,OAAO,KAAa,OAAQ,MAAc,OAC1D,KAAK,SAAS,GACP,KAAK,YAAY,GAAM,CAAG,MAGnC,KAAK,SAAS,GACP;KAAE,MAAM;KAAQ,OAAO;KAAK;KAAM;IAAI;GAC/C;GACA,KAAK,KACH,OAAO;IACL,MAAM;IACN,OAAO,KAAK,sBAAsB;IAClC;IACA;GACF;GACF,KAAK,MAAK;IACR,IAAM,IAAS,KAAK,mBAAmB,IAAG;IAK1C,OAJI,MAAW,MAAM,KAAK,IAAI,MAAM,OAClC,KAAK,SAAS,GACP;KAAE,MAAM;KAAoB,OAAO;KAAI;KAAM;IAAI,KAEnD;KAAE,MAAM;KAAQ,OAAO;KAAQ;KAAM;IAAI;GAClD;GACA,KAAK,KAAK;IAER,KACG,KAAK,MAAM,KAAK,MAAM,MAAM,QAAQ,QACpC,KAAK,MAAM,KAAK,MAAM,MAAM,QAAQ,KAKrC,OAHA,KAAK,SAAS,GACd,KAAK,SAAS,GACd,KAAK,SAAS,GACP;KAAE,MAAM;KAAqB,OAAO;KAAI;KAAM;IAAI;IAG3D,IAAM,IAAS,KAAK,mBAAmB,GAAG,GACpC,IAAO,IAAI,YAAY,EAAE,OAAO,CAAM;IAI5C,OAAO;KAAE,MAAM;KAAS,OAHZ,MAAM,KAAK,IAAO,MAC5B,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAChC,EAAE,KAAK,EACwB;KAAK;KAAM;IAAI;GAChD;EACF;EAGA,IAAI,MAAM,KAAK;GACb,IAAM,IAAO,KAAK,MAAM,MAAM,KAAK,MAAM,CAAC;GAC1C,IAAI,EAAK,WAAW,UAAU,GAAG;IAC/B,IAAM,IAAQ,EAAK,MAAM,IACnB,IACJ,MAAU,OACV,SAAS,KAAK,EAAK,MAAM,EAAE,KAC3B,CAAC,eAAe,KAAK,EAAK,OAAO,EAAE;IACrC,IAAI,CAAC,eAAe,KAAK,CAAK,KAAK,GAAW;KAC5C,KAAK,SAAS;KACd,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK,KAAK,SAAS;KAC1C,IAAI,IAAQ;KAEZ,OADI,MAAW,KAAS,KAAK,SAAS,IAAI,KAAK,SAAS,IACjD;MAAE,MAAM;MAAS;MAAO;MAAM;KAAI;IAC3C;GACF;GACA,OAAO,KAAK,YAAY,GAAM,CAAG;EACnC;EAEA,IAAI,MAAM,KAAK;GACb,IAAM,IAAO,KAAK,MAAM,MAAM,KAAK,MAAM,CAAC;GAC1C,IAAI,EAAK,WAAW,UAAU,GAAG;IAC/B,IAAM,IAAQ,EAAK,MAAM,IACnB,IACJ,MAAU,OACV,SAAS,KAAK,EAAK,MAAM,EAAE,KAC3B,CAAC,eAAe,KAAK,EAAK,OAAO,EAAE;IACrC,IAAI,CAAC,eAAe,KAAK,CAAK,KAAK,GAAW;KAC5C,KAAK,SAAS;KACd,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK,KAAK,SAAS;KAC1C,IAAI,IAAQ;KAEZ,OADI,MAAW,KAAS,KAAK,SAAS,IAAI,KAAK,SAAS,IACjD;MAAE,MAAM;MAAS;MAAO;MAAM;KAAI;IAC3C;GACF;GAEA,OADA,KAAK,SAAS,GACP,KAAK,YAAY,GAAM,CAAG;EACnC;EAIA,IAFI,KAAK,OAAO,KAAK,OAEjB,MAAM,OAAO,QAAQ,KAAK,KAAK,MAAM,KAAK,MAAM,MAAM,EAAE,GAC1D,OAAO,KAAK,YAAY,GAAM,CAAG;EACnC,IAAI,YAAY,KAAK,CAAC,GAAG,OAAO,KAAK,WAAW,GAAM,CAAG;EAGzD,IAAI,MAAM,KAAK;GACb,KACG,KAAK,MAAM,KAAK,MAAM,MAAM,QAAQ,QACpC,KAAK,MAAM,KAAK,MAAM,MAAM,QAAQ,KACrC;IAIA,KAHA,KAAK,SAAS,GACd,KAAK,SAAS,GACd,KAAK,SAAS,GACP,CAAC,KAAK,KAAK,KAAK,KAAK,IAAI,MAAM,MAAK,KAAK,SAAS;IACzD,OAAO;KAAE,MAAM;KAAY,OAAO;KAAO;KAAM;IAAI;GACrD;GACA,KAAK,MAAM,4BAA4B,GAAM,CAAG;EAClD;EAEA,KAAK,MAAM,wBAAwB,KAAK,UAAU,CAAC,KAAK,GAAM,CAAG;CACnE;CAEA,YACE,GACA,GAC6C;EAC7C,IAAI,IAAM;EAIV,IAHI,KAAK,IAAI,MAAM,QAAK,KAAO,KAAK,SAAS,IAGzC,KAAK,IAAI,MAAM,KAAK;GACtB,IAAM,IAAO,KAAK,MAAM,KAAK,MAAM,MAAM;GACzC,IAAI,MAAS,OAAO,MAAS,KAAK;IAChC,KAAO,KAAK,SAAS,IAAI,KAAK,SAAS;IACvC,IAAM,IAAkB,EAAI;IAC5B,OAAO,CAAC,KAAK,KAAK,KAAK,cAAc,KAAK,KAAK,IAAI,CAAC,IAClD,KAAO,KAAK,SAAS;IACvB,IAAM,IAAe,EAAI,SAAS,GAE9B,IAAa,IACb,IAAgB;IACpB,IAAI,CAAC,KAAK,KAAK,KAAK,KAAK,IAAI,MAAM,KAAK;KAEtC,AADA,IAAa,IACb,KAAO,KAAK,SAAS;KACrB,IAAM,IAAY,EAAI;KACtB,OAAO,CAAC,KAAK,KAAK,KAAK,cAAc,KAAK,KAAK,IAAI,CAAC,IAClD,KAAO,KAAK,SAAS;KACvB,IAAgB,EAAI,SAAS;IAC/B;IACA,IAAI,CAAC,KAAK,KAAK,MAAM,KAAK,IAAI,MAAM,OAAO,KAAK,IAAI,MAAM,MAAM;KAM9D,AALA,IAAa,IAET,CAAC,KAAgB,CAAC,KACpB,KAAK,MAAM,qCAAqC,KAAO,GAAM,CAAG,GAClE,KAAO,KAAK,SAAS,GACjB,CAAC,KAAK,KAAK,MAAM,KAAK,IAAI,MAAM,OAAO,KAAK,IAAI,MAAM,SACxD,KAAO,KAAK,SAAS;KACvB,IAAM,IAAW,EAAI;KACrB,OAAO,CAAC,KAAK,KAAK,KAAK,KAAK,IAAI,KAAK,OAAO,KAAK,IAAI,KAAK,MACxD,KAAO,KAAK,SAAS;KAEvB,AAAI,EAAI,WAAW,KACjB,KAAK,MAAM,sCAAsC,KAAO,GAAM,CAAG;IACrE,OAAO,AAAI,KAET,KAAK,MAAM,mCAAmC,KAAO,GAAM,CAAG;IAEhE,IAAI,GAAY;KAEd,IAAI,KAAK,IAAI,MAAM,KAAK;MACtB,IAAM,IAAI,KAAK,MAAM,KAAK,MAAM,MAAM,IAChC,IAAQ,KAAK,MAAM,KAAK,MAAM,MAAM;MAC1C,CACG,MAAM,OACL,MAAM,OACN,MAAM,OACN,MAAM,OACN,MAAM,OACN,MAAM,OACN,MAAM,OACN,MAAM,OACN,MAAM,QACR,CAAC,eAAe,KAAK,CAAK,MAE1B,KAAO,KAAK,SAAS,IAAI,KAAK,SAAS;KAE3C;KACA,OAAO;MAAE,MAAM;MAAS,OAAO;MAAK;MAAM;KAAI;IAChD;IACA,OAAO;KAAE,MAAM;KAAW,OAAO;KAAK;KAAM;IAAI;GAClD;GACA,IAAI,MAAS,OAAO,MAAS,KAAK;IAEhC,KADA,KAAO,KAAK,SAAS,IAAI,KAAK,SAAS,GAChC,CAAC,KAAK,KAAK,KAAK,KAAK,IAAI,KAAK,OAAO,KAAK,IAAI,KAAK,MACxD,KAAO,KAAK,SAAS;IACvB,OAAO;KAAE,MAAM;KAAW,OAAO;KAAK;KAAM;IAAI;GAClD;GACA,IAAI,MAAS,OAAO,MAAS,KAAK;IAEhC,KADA,KAAO,KAAK,SAAS,IAAI,KAAK,SAAS,GAChC,CAAC,KAAK,KAAK,MAAM,KAAK,IAAI,MAAM,OAAO,KAAK,IAAI,MAAM,OAC3D,KAAO,KAAK,SAAS;IACvB,OAAO;KAAE,MAAM;KAAW,OAAO;KAAK;KAAM;IAAI;GAClD;EACF;EAGA,OAAO,CAAC,KAAK,KAAK,KAAK,KAAK,IAAI,KAAK,OAAO,KAAK,IAAI,KAAK,MACxD,KAAO,KAAK,SAAS;EAEvB,IAAI,IAAU;EACd,IAAI,CAAC,KAAK,KAAK,KAAK,KAAK,IAAI,MAAM,KAGjC,KAFA,IAAU,IACV,KAAO,KAAK,SAAS,GACd,CAAC,KAAK,KAAK,KAAK,KAAK,IAAI,KAAK,OAAO,KAAK,IAAI,KAAK,MACxD,KAAO,KAAK,SAAS;EAEzB,IAAI,CAAC,KAAK,KAAK,MAAM,KAAK,IAAI,MAAM,OAAO,KAAK,IAAI,MAAM,MAAM;GAG9D,AAFA,IAAU,IACV,KAAO,KAAK,SAAS,GACjB,CAAC,KAAK,KAAK,MAAM,KAAK,IAAI,MAAM,OAAO,KAAK,IAAI,MAAM,SACxD,KAAO,KAAK,SAAS;GACvB,IAAM,IAAW,EAAI;GACrB,OAAO,CAAC,KAAK,KAAK,KAAK,KAAK,IAAI,KAAK,OAAO,KAAK,IAAI,KAAK,MACxD,KAAO,KAAK,SAAS;GACvB,AAAI,EAAI,WAAW,KACjB,KAAK,MACH,iCAAiC,KAAK,UAAU,CAAG,KACnD,GACA,CACF;EACJ;EAGA,IAAI,KAAK,IAAI,MAAM,KAAK;GACtB,IAAM,IAAI,KAAK,MAAM,KAAK,MAAM,MAAM,IAChC,IAAQ,KAAK,MAAM,KAAK,MAAM,MAAM;GAC1C,CACG,MAAM,OACL,MAAM,OACN,MAAM,OACN,MAAM,OACN,MAAM,OACN,MAAM,OACN,MAAM,OACN,MAAM,OACN,MAAM,QACR,CAAC,eAAe,KAAK,CAAK,MAK1B,KAAO,KAAK,SAAS,IAAI,KAAK,SAAS;EAE3C;EAEA,OAAO;GAAE,MAAM,IAAU,UAAU;GAAW,OAAO;GAAK;GAAM;EAAI;CACtE;CAEA,WACE,GACA,GAC6C;EAC7C,IAAI,IAAQ;EACZ,OAAO,CAAC,KAAK,KAAK,KAAK,eAAe,KAAK,KAAK,IAAI,CAAC,IACnD,KAAS,KAAK,SAAS;EAGzB,QAAQ,GAAR;GACE,KAAK,QACH,OAAO;IAAE,MAAM;IAAQ,OAAO;IAAO;IAAM;GAAI;GACjD,KAAK,SACH,OAAO;IAAE,MAAM;IAAS,OAAO;IAAO;IAAM;GAAI;GAClD,KAAK,QACH,OAAO;IAAE,MAAM;IAAQ,OAAO;IAAO;IAAM;GAAI;GACjD,KAAK,aACH,OAAO;IAAE,MAAM;IAAa,OAAO;IAAO;IAAM;GAAI;GACtD,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK,cACH,OAAO;IAAE,MAAM;IAAS,OAAO;IAAO;IAAM;GAAI;GAClD,KAAK,UACH,OAAO;IAAE,MAAM;IAAU,OAAO;IAAO;IAAM;GAAI;GACnD,KAAK,KACH,OAAO;IAAE,MAAM;IAAc,OAAO;IAAK;IAAM;GAAI;GAErD,KAAK,MACH,OAAO;IAAE,MAAM;IAAsB,OAAO;IAAK;IAAM;GAAI;GAC7D,KAAK,MACH,OAAO;IAAE,MAAM;IAAsB,OAAO;IAAK;IAAM;GAAI;GAC7D,KAAK,MACH,OAAO;IAAE,MAAM;IAAsB,OAAO;IAAK;IAAM;GAAI;GAC7D,KAAK,MACH,OAAO;IAAE,MAAM;IAAsB,OAAO;IAAK;IAAM;GAAI;GAC7D,KAAK,MACH,OAAO;IAAE,MAAM;IAAsB,OAAO;IAAK;IAAM;GAAI;GAC7D,KAAK,MACH,OAAO;IAAE,MAAM;IAAsB,OAAO;IAAK;IAAM;GAAI;GAC7D,KAAK,MACH,OAAO;IAAE,MAAM;IAAsB,OAAO;IAAK;IAAM;GAAI;GAC7D,KAAK,MAGH,OAAO;IAAE,MAAM;IAAsB,OAAO;IAAK;IAAM;GAAI;GAC7D,KAAK,MACH,OAAO;IAAE,MAAM;IAAsB,OAAO;IAAK;IAAM;GAAI;EAC/D;EAQA,IAAM,IAAY,EAAM,MAAM,IACxB,IAAU,KAAa,OAAO,KAAa;EAGjD,IAAI,KAFY,KAAa,OAAO,KAAa,KAEzB;GAEtB,IAAM,IAAkB,EAAM,MAAM,CAAC;GAKrC,IAJkB,IACd,cAAc,KAAK,CAAe,IAClC,cAAc,KAAK,CAAe,GAEvB;IAGb,OAAO,CAAC,KAAK,KAAK,IAAG;KACnB,IAAM,IAAK,KAAK,IAAI;KAMpB,IAAI,EALY,IACX,KAAM,OAAO,KAAM,OAAS,KAAM,OAAO,KAAM,OAAQ,MAAO,MAC9D,KAAM,OAAO,KAAM,OACnB,KAAM,OAAO,KAAM,OACpB,MAAO,MACG;KACd,KAAS,KAAK,SAAS;IACzB;IAEA,IAAM,IAAI,KAAK,IAAI;IASnB,IANI,MAAM,QACR,KAAK,MACH,IAAI,EAAM,kEACV,GACA,CACF,GACE,MAAM,KACR,QAAQ,GAAR;KACE,KAAK,KAAK;MACR,IAAM,EAAE,OAAO,GAAQ,cACrB,KAAK,gCAAgC,CAAC;MACxC,OAAO;OACL,MAAM,IAAS,qBAAqB;OACpC,OAAO;OACP;OACA;MACF;KACF;KACA,KAAK,OACH,OAAO;MACL,MAAM;MACN,OAAO,KAAK,iBAAiB,CAAC;MAC9B;MACA;KACF;KACF,SACE,OAAO;MACL,MAAM;MACN,WAAW;MACX,OAAO,KAAK,mBAAmB,CAAC;MAChC;MACA;KACF;IACJ;IAIF,IAAI,MAAM,KAAK;KACb,IAAM,IAAM,KAAK,sBAAsB;KACvC,QAAQ,GAAR;MACE,KAAK,KAAK;OAER,IAAM,EAAE,OAAO,GAAQ,cAAW,KAAK,sBACrC,GACA,GACA,CACF;OACA,OAAO;QACL,MAAM,IAAS,qBAAqB;QACpC,OAAO;QACP;QACA;OACF;MACF;MACA,KAAK,OAEH,OAAO;OACL,MAAM;OACN,OAAO,KAAK,sBAAsB,GAAK,GAAM,CAAG;OAChD;OACA;MACF;MACF,SACE,OAAO;OACL,MAAM;OACN,WAAW;OACX,OAAO;OACP;OACA;MACF;KACJ;IACF;IAIA,IAAI,MAAM,QAAQ,KAAK,MAAM,KAAK,MAAM,MAAM,QAAQ,KAGpD,OAFA,KAAK,SAAS,GACd,KAAK,SAAS,GACP;KACL,MAAM;KACN,WAAW;KACX,OAAO;KACP;KACA;IACF;GAEJ;EACF;EAEA,KAAK,MAAM,sBAAsB,KAAK,UAAU,CAAK,KAAK,GAAM,CAAG;CACrE;AACF,GCriDa,IAAb,cAAoC,EAAS;CAC3C,mBAA4B;CAC5B;CAEA;CACA;CACA;CAEA,YACE,GACA,GAKA;EAKA,AAJA,MAAM,GACN,KAAK,QAAQ,GACb,KAAK,cAAc,GAAS,eAAe,OAC3C,KAAK,gBAAgB,GAAS,eAC9B,KAAK,YAAY,GAAS;CAC5B;CAEA,QAAQ,GAAsC;EAC5C,OAAO,EAAO,CACZ,EAAA,GAAoB,OAAO,KAAK,MAAM,MAAM,GAAG,KAAK,aAAa,GACjE,KAAK,KACP,CAAC;CACH;CAEA,OAAO,GAAmC,GAAwB;EAChE,IAAM,IACJ,KAAK,kBAAkB,KAAA,IAAuC,KAA3B,IAAI,KAAK;EAC9C,IAAI,GAAS,sBAAsB,KAAK,cAAc,KAAA,GACpD,OAAO,KAAK,YAAY;EAC1B,IAAI,IAAW,GAAS,gBAAgB,KAAK;EAE7C,OADI,GAAS,eAAe,MAAS,MAAa,UAAO,IAAW,QAC7D,GAAe,KAAK,OAAO,GAAU,GAAS,KAAK,IAAI;CAChE;CAEA,MAAM,GAAiC;EACrC,OAAO,KAAK;CACd;AACF,GC1Ca,IAAb,cAA8C,EAAS;CACrD,mBAA4B;CAC5B;CAEA,YAAY,GAA0B;EAEpC,AADA,MAAM,GACN,KAAK,SAAS;CAChB;CAEA,QAAQ,GAAqC;EAC3C,IAAM,IAAsB,CAC1B,IAAI,WAAW,CAAA,EAAgC,CAAC,CAClD;EACA,KAAK,IAAM,KAAS,KAAK,QAAQ,EAAM,KAAK,EAAM,QAAQ,CAAO,CAAC;EAElE,OADA,EAAM,KAAK,IAAI,WAAW,CAAA,GAAW,CAAC,CAAC,GAChC,EAAO,CAAK;CACrB;CAEA,OAAO,GAAmC,GAAwB;EAGhE,OAFI,KAAK,OAAO,WAAW,IAAU,QAE9B,MADW,KAAK,OAAO,KAAK,MAAM,EAAE,OAAO,GAAS,CAAC,CAC/C,EAAU,KAAK,IAAI,EAAE;CACpC;CAEA,WAAoB,GAAe,GAAyC;EAC1E,IAAM,KAAW,MACf,EAAE,SAAS,EAAE,EAAE,YAAY,EAAE,SAAS,GAAG,GAAG,GACxC,IAAyB,CAC7B;GACE;GACA,KAAK,EAAA,EAAuC;GAC5C,SAAS;EACX,CACF;EACA,KAAK,IAAM,KAAS,KAAK,QACvB,EAAM,KAAK,GAAG,EAAM,WAAW,IAAQ,GAAG,CAAO,CAAC;EAEpD,OADA,EAAM,KAAK;GAAE;GAAO,KAAK,EAAA,GAAkB;GAAG,SAAS;EAAU,CAAC,GAC3D;CACT;CAEA,MAAM,GAAiC;EACrC,IAAM,IAAW,KAAK,OAAO,QAAQ,GAAK,MAAM,IAAM,EAAE,MAAM,QAAQ,CAAC,GACjE,IAAS,IAAI,WAAW,CAAQ,GAClC,IAAS;EACb,KAAK,IAAM,KAAS,KAAK,QAEvB,AADA,EAAO,IAAI,EAAM,OAAO,CAAM,GAC9B,KAAU,EAAM,MAAM;EAExB,OAAO;CACT;AACF,GClDa,IAAb,cAA8C,EAAS;CACrD,mBAA4B;CAC5B;CAEA,YAAY,GAA0B;EAEpC,AADA,MAAM,GACN,KAAK,SAAS;CAChB;CAEA,QAAQ,GAAqC;EAC3C,IAAM,IAAsB,CAC1B,IAAI,WAAW,CAAA,GAA+B,CAAC,CACjD;EACA,KAAK,IAAM,KAAS,KAAK,QAAQ,EAAM,KAAK,EAAM,QAAQ,CAAO,CAAC;EAElE,OADA,EAAM,KAAK,IAAI,WAAW,CAAA,GAAW,CAAC,CAAC,GAChC,EAAO,CAAK;CACrB;CAEA,OAAO,GAAmC,GAAwB;EAGhE,OAFI,KAAK,OAAO,WAAW,IAAU,UAE9B,MADW,KAAK,OAAO,KAAK,MAAM,EAAE,OAAO,GAAS,CAAC,CAC/C,EAAU,KAAK,IAAI,EAAE;CACpC;CAEA,WAAoB,GAAe,GAAyC;EAC1E,IAAM,KAAW,MACf,EAAE,SAAS,EAAE,EAAE,YAAY,EAAE,SAAS,GAAG,GAAG,GACxC,IAAyB,CAC7B;GACE;GACA,KAAK,EAAA,GAAsC;GAC3C,SAAS;EACX,CACF;EACA,KAAK,IAAM,KAAS,KAAK,QACvB,EAAM,KAAK,GAAG,EAAM,WAAW,IAAQ,GAAG,CAAO,CAAC;EAEpD,OADA,EAAM,KAAK;GAAE;GAAO,KAAK,EAAA,GAAkB;GAAG,SAAS;EAAU,CAAC,GAC3D;CACT;CAEA,MAAM,GAAiC;EACrC,OAAO,KAAK,OAAO,KAAK,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE;CAChD;AACF,GCjCa,IAAb,cAA+B,EAAS;CACtC;CACA;CACA;CAEA,YACE,GACA,GACA;EAIA,AAHA,MAAM,GACN,KAAK,QAAQ,GACb,KAAK,mBAAmB,GAAS,oBAAoB,IACrD,KAAK,gBAAgB,GAAS;CAChC;CAEA,QAAQ,GAAqC;EAC3C,IAAI,KAAK,kBAAkB;GACzB,IAAM,IAAsB,CAC1B,IAAI,WAAW,CAAA,GAAgC,CAAC,CAClD;GACA,KAAK,IAAM,KAAQ,KAAK,OAAO,EAAM,KAAK,EAAK,QAAQ,CAAO,CAAC;GAE/D,OADA,EAAM,KAAK,IAAI,WAAW,CAAA,GAAW,CAAC,CAAC,GAChC,EAAO,CAAK;EACrB;EACA,IAAM,IAAQ,CACZ,EAAA,GAAoB,OAAO,KAAK,MAAM,MAAM,GAAG,KAAK,aAAa,CACnE;EACA,KAAK,IAAM,KAAQ,KAAK,OAAO,EAAM,KAAK,EAAK,QAAQ,CAAO,CAAC;EAC/D,OAAO,EAAO,CAAK;CACrB;CAEA,OAAgB,GAAmC,GAAuB;EACxE,IAAI,IAAY,EAAc,CAAO,GAC/B,IAAmB,GAAS,kBAC5B,IACJ,OAAO,KAAqB,WAAW,IAAmB,KAAA,GACtD,IACJ,MACC,GAA2B,IAAI,KAC9B,KAAK,MAAM,KAAK,CAAoB;EACxC,AAAI,MAAc,QAAQ,MAAa,IAAY;EACnD,IAAM,EAAE,cAAW,iBAAc,gBAAa,GAC5C,GACA,MAAc,IAChB,GACM,IACJ,CAAC,KAAK,oBAAoB,KAAK,kBAAkB,KAAA,IAC7C,IAAI,KAAK,cAAc,KACvB;EAEN,IAAI,MAAc,QAAS,KAAK,MAAM,WAAW,KAAK,CAAC,GAAc;GAEnE,IAAM,IAAQ,KAAK,MAChB,KAAK,MAAS,EAAK,OAAO,GAAS,IAAQ,CAAC,CAAC,EAC7C,KAAK,CAAS;GAIjB,OAHI,KAAK,mBACA,KAAK,MAAM,WAAW,IAAI,SAAS,MAAM,EAAM,KAEjD,IAAI,IAAW,EAAM;EAC9B;EAGA,IAAM,IAAc,EAAS,GAAW,IAAQ,CAAC,GAC3C,IAAc,EAAS,GAAW,CAAK,GACvC,KAAO,KAAK,mBAAmB,QAAQ,IAAI,KAC3C,IAAkB,CAAC;EACzB,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,MAAM,QAAQ,KAAK;GAC1C,IAAM,IAAO,KAAK,MAAM;GACxB,AAAI,KACF,EAAM,KAAK,GAAG,GAAsB,GAAM,GAAa,CAAY,CAAC;GACtE,IAAM,IAAM,IAAI,KAAK,MAAM,SAAS,IAAI,IAAe;GACvD,EAAM,KACJ,GAAG,IAAc,EAAK,OAAO,GAAS,IAAQ,CAAC,IAAI,IAAM,IAAmB,EAAuB,GAAM,CAAY,IAAI,IAC3H;EACF;EAIA,OAHI,KACF,EAAM,KAAK,GAAG,GAAuB,MAAM,GAAa,CAAY,CAAC,GAEhE,GAAG,GAAK,IADF,EAAM,KAAK,IACL,EAAK,IAAI,EAAY;CAC1C;CAEA,WAAoB,GAAe,GAAyC;EAC1E,IAAM,KAAW,MACf,EAAE,SAAS,EAAE,EAAE,YAAY,EAAE,SAAS,GAAG,GAAG,GACxC,KAAS,MACb,MAAM,KAAK,IAAQ,MACjB,EAAE,SAAS,EAAE,EAAE,YAAY,EAAE,SAAS,GAAG,GAAG,CAC9C,EAAE,KAAK,GAAG;EAEZ,IAAI,KAAK,kBAAkB;GACzB,IAAM,IAAyB,CAC7B;IACE;IACA,KAAK,EAAA,GAAuC;IAC5C,SAAS;GACX,CACF;GACA,KAAK,IAAM,KAAQ,KAAK,OACtB,EAAM,KAAK,GAAG,EAAK,WAAW,IAAQ,GAAG,CAAO,CAAC;GAEnD,OADA,EAAM,KAAK;IAAE;IAAO,KAAK,EAAA,GAAkB;IAAG,SAAS;GAAU,CAAC,GAC3D;EACT;EACA,IAAM,IAAyB,CAC7B;GACE;GACA,KAAK,EACH,EAAA,GAAoB,OAAO,KAAK,MAAM,MAAM,GAAG,KAAK,aAAa,CACnE;GACA,SAAS,mBAAmB,KAAK,MAAM;EACzC,CACF;EACA,KAAK,IAAM,KAAQ,KAAK,OACtB,EAAM,KAAK,GAAG,EAAK,WAAW,IAAQ,GAAG,CAAO,CAAC;EACnD,OAAO;CACT;CAEA,MAAM,GAAgC;EACpC,IAAM,IAAU,GAAS;EACzB,IAAI,CAAC,GAAS,OAAO,KAAK,MAAM,KAAK,MAAS,EAAK,MAAM,CAAO,CAAC;EAGjE,IAAM,IAAe,IACjB;GAAE,GAAG;GAAS,SAAS,KAAA;EAAU,IACjC,KAAA,GACE,IAAoB,KAAK,MAAM,KAAK,MACxC,EAAK,MAAM,CAAY,CACzB,GAKI,IAAU;EACd,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,MAAM,QAAQ,KAAK;GAC1C,IAAM,IAAO,IAAI,GACX,IAAM,KAAK,MAAM,GAAG,MAAM,CAAO,GACjC,IAAK,EAAQ,KAAK,GAAQ,OAAO,CAAC,GAAG,CAAG;GAG9C,AADE,MAAO,KAAc,GAAS,kBAAkB,MAAO,KAAA,KAEvD,EAAO,OAAO,GAAM,CAAC,GACrB,OAEA,EAAO,KAAQ;EAEnB;EACA,OAAO;CACT;AACF,GC5Ia,IAAb,cAA6B,EAAS;CACpC;CACA;CACA;CAEA,YACE,GACA,GACA;EAIA,AAHA,MAAM,GACN,KAAK,UAAU,GACf,KAAK,mBAAmB,GAAS,oBAAoB,IACrD,KAAK,gBAAgB,GAAS;CAChC;CAEA,QAAQ,GAAqC;EAC3C,IAAI,KAAK,kBAAkB;GACzB,IAAM,IAAsB,CAC1B,IAAI,WAAW,CAAA,GAA8B,CAAC,CAChD;GACA,KAAK,IAAM,CAAC,GAAG,MAAM,KAAK,SACxB,EAAM,KAAK,EAAE,QAAQ,CAAO,GAAG,EAAE,QAAQ,CAAO,CAAC;GAGnD,OADA,EAAM,KAAK,IAAI,WAAW,CAAA,GAAW,CAAC,CAAC,GAChC,EAAO,CAAK;EACrB;EACA,IAAM,IAAQ,CACZ,EAAA,GAAkB,OAAO,KAAK,QAAQ,MAAM,GAAG,KAAK,aAAa,CACnE;EACA,KAAK,IAAM,CAAC,GAAG,MAAM,KAAK,SACxB,EAAM,KAAK,EAAE,QAAQ,CAAO,GAAG,EAAE,QAAQ,CAAO,CAAC;EAEnD,OAAO,EAAO,CAAK;CACrB;CAEA,OAAgB,GAAmC,GAAuB;EACxE,IAAI,IAAY,EAAc,CAAO,GAC/B,IAAmB,GAAS,kBAC5B,IACJ,OAAO,KAAqB,WAAW,IAAmB,KAAA,GACtD,IACJ,MACC,GAA2B,IAAI,KAC9B,KAAK,QAAQ,MACV,CAAC,GAAK,OACL,EAAqB,CAAG,KAAK,EAAqB,CAAK,CAC3D;EACJ,AAAI,MAAc,QAAQ,MAAa,IAAY;EACnD,IAAM,EAAE,cAAW,iBAAc,aAAU,cAAW,GACpD,GACA,MAAc,IAChB,GACM,IACJ,CAAC,KAAK,oBAAoB,KAAK,kBAAkB,KAAA,IAC7C,IAAI,KAAK,cAAc,KACvB,IACA,IAAO,KAAK,mBAAmB,QAAQ,IAAI;EAEjD,IAAI,MAAc,QAAS,KAAK,QAAQ,WAAW,KAAK,CAAC,GAAc;GAErE,IAAM,IAAQ,KAAK,QAChB,KACE,CAAC,GAAG,OACH,GAAG,EAAE,OAAO,GAAS,IAAQ,CAAC,IAAI,IAAS,EAAE,OAAO,GAAS,IAAQ,CAAC,GAC1E,EACC,KAAK,CAAS;GAIjB,OAHI,KAAK,mBACA,KAAK,QAAQ,WAAW,IAAI,SAAS,MAAM,EAAM,KAEnD,IAAI,IAAW,EAAM;EAC9B;EAGA,IAAM,IAAc,EAAS,GAAW,IAAQ,CAAC,GAC3C,KAAc,EAAS,GAAW,CAAK,GACvC,IAAkB,CAAC;EACzB,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,QAAQ,KAAK;GAC5C,IAAM,CAAC,GAAG,KAAK,KAAK,QAAQ;GAC5B,AAAI,KACF,EAAM,KAAK,GAAG,GAAsB,GAAG,GAAa,CAAY,CAAC;GAEnE,IAAM,IAAM,IAAI,KAAK,QAAQ,SAAS,IAAI,IAAe,GACnD,IAAgB,IAClB,GACE;IACE,GAAI,EAAE,UAAU,YAAY,CAAC;IAC7B,GAAI,EAAE,UAAU,WAAW,CAAC;IAC5B,GAAI,EAAE,UAAU,YAAY,CAAC;GAC/B,GACA,CACF,IACA;GACJ,EAAM,KACJ,GAAG,IAAc,EAAE,OAAO,GAAS,IAAQ,CAAC,IAAI,IAAS,EAAE,OAAO,GAAS,IAAQ,CAAC,IAAI,IAAM,GAChG;EACF;EAIA,OAHI,KACF,EAAM,KAAK,GAAG,GAAuB,MAAM,GAAa,CAAY,CAAC,GAEhE,GAAG,EAAK,IADF,EAAM,KAAK,IACL,EAAK,IAAI,GAAY;CAC1C;CAEA,WAAoB,GAAe,GAAyC;EAC1E,IAAM,KAAW,MACf,EAAE,SAAS,EAAE,EAAE,YAAY,EAAE,SAAS,GAAG,GAAG,GACxC,KAAS,MACb,MAAM,KAAK,IAAQ,MACjB,EAAE,SAAS,EAAE,EAAE,YAAY,EAAE,SAAS,GAAG,GAAG,CAC9C,EAAE,KAAK,GAAG;EAEZ,IAAI,KAAK,kBAAkB;GACzB,IAAM,IAAyB,CAC7B;IACE;IACA,KAAK,EAAA,GAAqC;IAC1C,SAAS;GACX,CACF;GACA,KAAK,IAAM,CAAC,GAAG,MAAM,KAAK,SAExB,AADA,EAAM,KAAK,GAAG,EAAE,WAAW,IAAQ,GAAG,CAAO,CAAC,GAC9C,EAAM,KAAK,GAAG,EAAE,WAAW,IAAQ,GAAG,CAAO,CAAC;GAGhD,OADA,EAAM,KAAK;IAAE;IAAO,KAAK,EAAA,GAAkB;IAAG,SAAS;GAAU,CAAC,GAC3D;EACT;EACA,IAAM,IAAyB,CAC7B;GACE;GACA,KAAK,EACH,EAAA,GAAkB,OAAO,KAAK,QAAQ,MAAM,GAAG,KAAK,aAAa,CACnE;GACA,SAAS,iBAAiB,KAAK,QAAQ;EACzC,CACF;EACA,KAAK,IAAM,CAAC,GAAG,MAAM,KAAK,SAExB,AADA,EAAM,KAAK,GAAG,EAAE,WAAW,IAAQ,GAAG,CAAO,CAAC,GAC9C,EAAM,KAAK,GAAG,EAAE,WAAW,IAAQ,GAAG,CAAO,CAAC;EAEhD,OAAO;CACT;CAEA,MAAM,GAAgC;EACpC,IAAM,IAAU,GAAS,SACnB,UAAkB;GACtB,IAAM,IAAS,EAAW,KACxB,KAAK,UACJ,CAAC,GAAG,OAAO,CAAC,EAAE,MAAM,CAAO,GAAG,EAAE,MAAM,CAAO,CAAC,CACjD;GACA,IAAI,CAAC,GAAS,OAAO;GACrB,IAAM,IAAS,GAAS;GACxB,KAAK,IAAI,IAAI,GAAG,IAAI,EAAO,QAAQ,KAAK;IACtC,IAAM,CAAC,GAAG,KAAK,EAAO,IAChB,IAAK,EAAQ,KAAK,GAAQ,GAAG,CAAC;IACpC,AAAI,MAAO,KAAc,KAAU,MAAO,KAAA,IACxC,EAAO,OAAO,KAAK,CAAC,IACjB,EAAO,KAAK,CAAC,GAAG,CAAE;GACzB;GACA,OAAO;EACT;EA6DA,OAJI,GAAS,UAAU,YAAkB,EAAU,IAC/C,GAAS,UAAU,YACnB,KAAK,QAAQ,OAAO,CAAC,OAAO,aAAa,CAAc,WA1DpC;GAGrB,IAAM,IAAe,IACjB;IAAE,GAAG;IAAS,SAAS,KAAA;GAAU,IACjC,KAAA,GACE,IAAkC,CAAC;GACzC,KAAK,IAAM,CAAC,GAAG,MAAM,KAAK,SAAS;IACjC,IAAM,IAAM,aAAa,IAAiB,EAAE,QAAQ,EAAE,MAAM,GACtD,IAAM,EAAE,MAAM,CAAY;IAChC,AAAI,MAAQ,cACV,OAAO,eAAe,GAAQ,GAAK;KACjC,OAAO;KACP,UAAU;KACV,YAAY;KACZ,cAAc;IAChB,CAAC,IAED,EAAO,KAAO;GAElB;GACA,IAAI,CAAC,GAAS,OAAO;GAIrB,IAAM,oBAAU,IAAI,IAAoB;GACxC,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,QAAQ,KAAK;IAC5C,IAAM,CAAC,KAAK,KAAK,QAAQ;IACzB,EAAQ,IAAI,aAAa,IAAiB,EAAE,QAAQ,EAAE,MAAM,GAAG,CAAC;GAClE;GACA,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,QAAQ,KAAK;IAC5C,IAAM,CAAC,GAAG,KAAK,KAAK,QAAQ,IACtB,IAAM,aAAa,IAAiB,EAAE,QAAQ,EAAE,MAAM;IAC5D,IAAI,EAAQ,IAAI,CAAG,MAAM,GAAG;IAC5B,IAAM,IAAM,EAAE,MAAM,CAAO,GACrB,IAAK,EAAQ,KAAK,GAAQ,GAAK,CAAG;IAGxC,AADE,MAAO,KAAc,GAAS,kBAAkB,MAAO,KAAA,IAavD,OAAO,EAAO,KAXV,MAAQ,cACV,OAAO,eAAe,GAAQ,GAAK;KACjC,OAAO;KACP,UAAU;KACV,YAAY;KACZ,cAAc;IAChB,CAAC,IAED,EAAO,KAAO;GAKpB;GACA,OAAO;EACT,GAKkB,IACX,EAAU;CACnB;AACF;AAEA,SAAS,GACP,GACA,GACQ;CAER,OADI,EAAS,WAAW,IAAU,KAEhC,MACA,EACG,KAAK,MAAY,EAAmB,GAAS,CAAK,EAAE,QAAQ,CAAC,EAC7D,KAAK,GAAG;AAEf;;;ACrPA,IAAa,IAAb,MAAa,UAAmB,EAAS;CACvC;CAEA,YAAY,GAAe;EAEzB,IADA,MAAM,GACF,CAAC,OAAO,UAAU,CAAK,KAAK,IAAQ,KAAK,IAAQ,KACnD,MAAU,WAAW,8CAA8C;EACrE,KAAK,QAAQ;CACf;CAEA,OAAgB,QAAQ,IAAI,EAAW,EAAE;CACzC,OAAgB,OAAO,IAAI,EAAW,EAAE;CACxC,OAAgB,OAAO,IAAI,EAAW,EAAE;CACxC,OAAgB,YAAY,IAAI,EAAW,EAAE;CAE7C,QAAQ,GAAsC;EAK5C,OAHI,KAAK,SAAS,KACT,IAAI,WAAW,CAAA,MAAoB,KAAK,KAAK,CAAC,IAEhD,IAAI,WAAW,CAAA,KAA8B,KAAK,KAAK,CAAC;CACjE;CAEA,OAAO,GAAoC,GAAwB;EACjE,QAAQ,KAAK,OAAb;GACE,KAAK,IACH,OAAO;GACT,KAAK,IACH,OAAO;GACT,KAAK,IACH,OAAO;GACT,KAAK,IACH,OAAO;GACT,SACE,OAAO,UAAU,KAAK,MAAM;EAChC;CACF;CAEA,MAAM,GAAiC;EACrC,QAAQ,KAAK,OAAb;GACE,KAAK,IACH,OAAO;GACT,KAAK,IACH,OAAO;GACT,KAAK,IACH,OAAO;GACT,KAAK,IACH;GACF,SACE,OAAO,IAAI,EAAO,KAAK,KAAK;EAChC;CACF;AACF,GC7Ca,IAAb,cAAsC,EAAS;CAC7C;CAEA,YAAY,GAAmB;EAE7B,AADA,MAAM,GACN,KAAK,QAAQ;CACf;CAGA,SAAiB,GAAqC;EACpD,OAAO,EAAO,KAAK,MAAM,KAAK,MAAS,EAAK,QAAQ,CAAO,CAAC,CAAC;CAC/D;CAEA,QAAQ,GAAqC;EAC3C,IAAM,IAAU,KAAK,SAAS,CAAO;EACrC,OAAO,EAAO,CAAC,EAAA,GAAoB,OAAO,EAAQ,MAAM,CAAC,GAAG,CAAO,CAAC;CACtE;CAEA,OAAgB,GAAmC,GAAuB;EACxE,IAAI,KAAK,MAAM,WAAW,GAAG,OAAO;EAEpC,IAAM,IAAY,EAAc,CAAO,GACjC,EAAE,cAAW,iBAAc,gBAAa,GAC5C,GACA,MAAc,IAChB;EAEA,IAAI,MAAc,MAKhB,OAAO,KAHO,KAAK,MAChB,KAAK,MAAS,EAAK,OAAO,GAAS,IAAQ,CAAC,CAAC,EAC7C,KAAK,CACI,EAAM;EAIpB,IAAM,IAAc,EAAS,GAAW,IAAQ,CAAC,GAC3C,IAAc,EAAS,GAAW,CAAK,GACvC,IAAQ,KAAK,MAAM,KACtB,MAAS,GAAG,IAAc,EAAK,OAAO,GAAS,IAAQ,CAAC,GAC3D,GACM,IAAU,EAAM,SAAS;EAM/B,OAAO,OALM,EACV,KAAK,GAAM,MACV,IAAI,IAAU,GAAG,IAAO,MAAiB,GAAG,IAAO,GACrD,EACC,KAAK,IACM,EAAK,IAAI,EAAY;CACrC;CAEA,WAAoB,GAAe,GAAyC;EAC1E,IAAM,KAAS,MACb,MAAM,KAAK,IAAQ,MACjB,EAAE,SAAS,EAAE,EAAE,YAAY,EAAE,SAAS,GAAG,GAAG,CAC9C,EAAE,KAAK,GAAG,GAGN,IADU,KAAK,SACX,EAAQ,QACZ,IAAyB,CAC7B;GACE;GACA,KAAK,EAAM,EAAA,GAAoB,OAAO,CAAC,CAAC,CAAC;GACzC,SAAS,2BAA2B,EAAE,OAAO,MAAM,IAAU,KAAN;EACzD,CACF;EACA,KAAK,IAAM,KAAQ,KAAK,OACtB,EAAM,KAAK,GAAG,EAAK,WAAW,IAAQ,GAAG,CAAO,CAAC;EAEnD,OAAO;CACT;CAEA,MAAM,GAAiC;EACrC,OAAO,KAAK,SAAS;CACvB;AACF,GCjEa,KAAa,MASb,IAAb,cAA0C,EAAQ;CAChD,YAAY,GAAgB,GAAmB;EAG7C,IAAM,IACJ,EAAM,WAAW,KAAK,EAAM,cAAc,IACtC,EAAM,KACN,IAAI,EAAU,CAAK;EACzB,MAAM,IAAY,IAAI,EAAU,CAAC,IAAI,EAAe,CAAM,GAAG,CAAO,CAAC,CAAC;CACxE;CAEA,OAAgB,GAAmC,GAAuB;EACxE,IAAI,GAAS,eAAe,IAAO,OAAO,MAAM,OAAO,GAAS,CAAK;EAErE,IAAM,IAAM,KAAK,SACX,IAAU,EAAI,MAAM,GAAsB,OAC1C,IAAc,EAAI,MAAM;EAY9B,OATI,aAAuB,IAClB,GAAG,IAAS,GAAgB,EAAY,KAAK,MAQ/C,GAAG,EAAO,IAHH,EAAW,MACtB,KAAK,MAAS,EAAK,OAAO,GAAS,CAAK,CAAC,EACzC,KAAK,IACa,EAAM;CAC7B;AACF,GCxDa,KAAb,cAAsC,EAAS;CAElC;CACA;CAFX,YACE,GACA,GACA;EADS,AAET,MAAM,GAHG,KAAA,QAAA,GACA,KAAA,YAAA;CAGX;CAEA,QAAQ,GAAqC;EAC3C,OAAO,KAAK,MAAM,QAAQ,CAAO;CACnC;CAEA,OAAO,GAAmC,GAAuB;EAE/D,OADI,GAAS,eAAe,KACrB,KAAK,MAAM,OAAO,GAAS,CAAK,IADG,KAAK;CAEjD;CAEA,MAAM,GAAgC;EACpC,OAAO,KAAK,MAAM,MAAM,CAAO;CACjC;AACF,GChBa,KAAa,MAEb,IAAb,cAAkC,EAAQ;CAKxC,YAAY,GAAoB;EAC9B,AAAI,MAAU,KAAA,IACZ,MAAM,IAAY,EAAW,IAAI,IAEjC,MAAM,IAAY,IAAI,EAAU,CAAK,CAAC;CAE1C;CAEA,OAAgB,GAAmC,GAAuB;EAWxE,OAVI,KAAK,mBAAmB,IAEnB,QAEL,KAAK,mBAAmB,IAEnB,KAAK,QAAQ,MACjB,KAAK,MAAS,EAAK,OAAO,GAAS,CAAK,CAAC,EACzC,KAAK,KAAK,IAER,MAAM,OAAO,GAAS,CAAK;CACpC;AACF,GCzBa,KAAkB,IAClB,KAAkB,IAEzB,KAAa,uBACb,KAAa,CAAE;AAQrB,SAAgB,GAAc,GAAuB;CACnD,IAAI,IAAI,IACN,MAAU,WAAW,6CAA6C;CACpE,IAAI,MAAM,IAAI,OAAO,IAAI,WAAY;CACrC,IAAI,IAAM,EAAE,SAAS,EAAE;CACvB,AAAI,EAAI,SAAS,KAAM,MAAG,IAAM,MAAM;CACtC,IAAM,IAAQ,IAAI,WAAW,EAAI,SAAS,CAAC;CAC3C,KAAK,IAAI,IAAI,GAAG,IAAI,EAAM,QAAQ,KAChC,EAAM,KAAK,SAAS,EAAI,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE;CACrD,OAAO;AACT;AAMA,SAAgB,GAAc,GAA2B;CACvD,IAAI,IAAI;CACR,KAAK,IAAM,KAAK,GAAO,IAAK,KAAK,KAAM,OAAO,CAAC;CAC/C,OAAO;AACT;AASA,IAAa,IAAb,cAAiC,EAAQ;CACvC;CAEA,YAAY,GAAe;EACzB,IAAI,KAAS,IACX,MAAU,WACR,qBAAqB,EAAM,wCAC7B;EAEF,AADA,MAAM,IAAiB,IAAI,EAAe,GAAc,CAAK,CAAC,CAAC,GAC/D,KAAK,WAAW;CAClB;CAEA,OAAgB,GAAoC,GAAwB;EAC1E,OAAO,KAAK,SAAS,SAAS;CAChC;CAEA,MAAe,GAAgC;EAC7C,OAAO,KAAK;CACd;AACF,GAOa,IAAb,cAAiC,EAAQ;CACvC;CAEA,YAAY,GAAe;EACzB,IAAI,KAAS,IACX,MAAU,WACR,qBAAqB,EAAM,wCAC7B;EAEF,AADA,MAAM,IAAiB,IAAI,EAAe,GAAc,CAAC,KAAK,CAAK,CAAC,CAAC,GACrE,KAAK,WAAW;CAClB;CAEA,OAAgB,GAAoC,GAAwB;EAC1E,OAAO,KAAK,SAAS,SAAS;CAChC;CAEA,MAAe,GAAgC;EAC7C,OAAO,KAAK;CACd;AACF;;;AClEA,SAAgB,GAAS,GAAc,GAAoC;CACzE,IAAM,IAAY,IAAI,GAAU,GAAM,EAAE,QAAQ,GAAS,OAAO,CAAC,GAE3D,IAAO,IADM,GAAU,GAAW,KAAW,CAAC,CACvC,EAAO,MAAM;CAE1B,OADI,GAAS,oBAAkB,GAAe,GAAM,EAAU,UAAU,CAAI,GACrE;AACT;AAMA,SAAS,GAAgB,GAGvB;CACA,IAAI,IAAS,GACT;CAKJ,OAJI,aAAa,KAAK,CAAG,MACvB,IAAY,EAAI,EAAI,SAAS,IAC7B,IAAS,EAAI,MAAM,GAAG,EAAE,IAEnB;EAAE;EAAQ;CAAU;AAC7B;AAEA,SAAS,GAAY,GAAqB;CAExC,OADI,EAAI,WAAW,GAAG,IAAU,CAAC,OAAO,EAAI,MAAM,CAAC,CAAC,IAC7C,OAAO,CAAG;AACnB;AAEA,SAAS,GACP,GACA,GAIA;CAGA,IAAI,EAAI,SAAS,IAAI,KAAK,EAAI,SAAS,IAAI,GAAG;EAC5C,IAAM,IACJ;EACF,IAAI,GAEF,AADA,EAAmB,CAAG,GACtB,IAAM,EAAI,MAAM,GAAG,EAAE;OAErB,MAAU,YAAY,oBAAoB,GAAK;CAEnD,OAAO,IAAI,aAAa,KAAK,CAAG,GAAG;EACjC,IAAM,IAAS,EAAI,EAAI,SAAS,IAC1B,IACJ,MAAW,MACP,2EACA,uBAAuB,EAAO,OAAO,OAAO,CAAM,IAAI,GAAG;EAC/D,IAAI,GAEF,AADA,EAAmB,CAAG,GACtB,IAAM,EAAI,MAAM,GAAG,EAAE;OAErB,MAAU,YAAY,oBAAoB,GAAK;CAEnD;CAEA,IAAI,MAAQ,OAAO,OAAO;EAAE,OAAO;EAAK,WAAW,KAAA;CAAU;CAC7D,IAAI,MAAQ,YAAY,OAAO;EAAE,OAAO;EAAU,WAAW,KAAA;CAAU;CACvE,IAAI,MAAQ,aAAa,OAAO;EAAE,OAAO;EAAW,WAAW,KAAA;CAAU;CAEzE,IAAI,IAAS,GACT;CAgBJ,OAfI,EAAI,SAAS,IAAI,KACnB,IAAY,QACZ,IAAS,EAAI,MAAM,GAAG,EAAE,KACf,EAAI,SAAS,IAAI,KAC1B,IAAY,UACZ,IAAS,EAAI,MAAM,GAAG,EAAE,KACf,EAAI,SAAS,IAAI,MAC1B,IAAY,UACZ,IAAS,EAAI,MAAM,GAAG,EAAE,IAItB,WAAW,KAAK,CAAM,IACjB;EAAE,OAAO,GAAc,CAAM;EAAG;CAAU,IAE5C;EAAE,OAAO,WAAW,CAAM;EAAG;CAAU;AAChD;AAEA,SAAS,GAAW,GAAyB;CAE3C,IAAI,OAAQ,WAAmB,WAAY,YAEzC,OAAQ,WAAmB,QAAQ,CAAG;CACxC,IAAI,EAAI,SAAS,KAAM,GACrB,MAAU,YAAY,8BAA8B,EAAI,QAAQ;CAClE,IAAM,IAAM,IAAI,WAAW,EAAI,SAAS,CAAC;CACzC,KAAK,IAAI,IAAI,GAAG,IAAI,EAAI,QAAQ,KAAK,GACnC,EAAI,IAAI,KAAK,SAAS,EAAI,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE;CAC/C,OAAO;AACT;AAEA,SAAS,GACP,GACA,GACY;CAEZ,IAAM,IAAQ,EAAI,QAAQ,GAAG,GACvB,IAAO,KAAS,IAAI,EAAI,MAAM,GAAG,CAAK,IAAI,GAC1C,IAAM,KAAS,IAAI,EAAI,MAAM,CAAK,IAAI;CAK5C,IAAI,oBAAoB,KAAK,CAAI,GAAG;EAClC,IAAM,IAAM,CAAC,GAAG,CAAI,EAAE,MAAM,MAAM,CAAC,mBAAmB,KAAK,CAAC,CAAC,KAAK;EAClE,MAAU,YACR,qBAAqB,KAAK,UAAU,CAAG,EAAE,gBAC3C;CACF;CACA,IAAI,KAAO,CAAC,OAAO,KAAK,CAAG,GACzB,MAAU,YAAY,4CAA4C;CAEpE,IAAM,IAAM,EAAK,SAAS;CAG1B,IAAI,MAAQ,GACV,MAAU,YACR,0BAA0B,EAAK,OAAO,mDACxC;CAGF,IAAM,IAAc,MAAQ,IAAI,IAAI,IAAI;CAExC,IAAI,EAAI,SAAS,GAAa;EAC5B,IAAM,IAAM,cAAc,EAAI,OAAO,gBAAgB,EAAI,SAAS,IAAI,MAAM,GAAG,wBAAwB,EAAK,OAAO,qBAAqB;EACxI,IAAI,GAAoB,EAAmB,CAAG;OACzC,MAAU,YAAY,CAAG;CAChC;CAIA,IAAI,EAAI,SAAS,KAAK,EAAI,SAAS,GAAa;EAC9C,IAAM,IAAM,cAAc,EAAI,OAAO,gBAAgB,EAAI,SAAS,IAAI,MAAM,GAAG,qBAAqB,EAAY;EAChH,IAAI,GAAoB,EAAmB,CAAG;OACzC,MAAU,YAAY,CAAG;CAChC;CAOA,IAAI,MAAQ,KAAK,EAAK,SAAS,GAAG;EAChC,IAEM,IAAW,EAAK,EAAK,SAAS,GAAI,QAAQ,KAAK,GAAG,EAAE,QAAQ,KAAK,GAAG,GACpE,IAAU,mEAAM,QAAQ,CAAQ;EACtC,IAAI,KAAW,KAER,KADQ,MAAQ,IAAI,KAAO,IACJ;GAC1B,IAAM,IAAM;GACZ,IAAI,GAAoB,EAAmB,CAAG;QACzC,MAAU,YAAY,CAAG;EAChC;CAEJ;CAIA,IAAM,IACJ,EAAK,QAAQ,MAAM,GAAG,EAAE,QAAQ,MAAM,GAAG,IAAI,IAAI,OAAO,CAAW;CAErE,IAAI,OAAQ,WAAmB,cAAe,YAE5C,OAAQ,WAAmB,WAAW,GAAY;EAChD,UAAU;EACV,mBAAmB;CACrB,CAAC;CAEH,IAAM,IAAS,KAAK,CAAU,GACxB,IAAM,IAAI,WAAW,EAAO,MAAM;CACxC,KAAK,IAAI,IAAI,GAAG,IAAI,EAAO,QAAQ,KAAK,EAAI,KAAK,EAAO,WAAW,CAAC;CACpE,OAAO;AACT;AAUA,SAAS,GACP,GACA,GACA,GACM;CACN,IAAI,EAAS,WAAW,GAAG;CAC3B,IAAM,IAAQ,GAAa,CAAI,GACzB,IAAS,GAAY,CAAM;CAEjC,KAAK,IAAM,KAAO,GAAU;EAC1B,IAAM,IAAuB,EAAE,GAAG,EAAI,GAChC,IAAO,CAAC,GAAG,CAAK,EACnB,QAAQ,MAAM,EAAE,OAAO,EAAI,KAAK,EAChC,MAAM,GAAG,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,IAChD,IAAyB,IAC3B,EAAO,MAAM,EAAK,KAAK,EAAI,KAAK,IAChC;EACJ,IACE,KACA,EAAO,EAAK,GAAG,MAAM,EAAI,QACzB,CAAC,EAAuB,SAAS,GAAG,GACpC;GACA,GAAW,EAAK,MAAM,YAAY,CAAO;GACzC;EACF;EAEA,IAAM,IAAY,CAAC,GAAG,CAAK,EACxB,QAAQ,MAAM,EAAE,QAAQ,EAAI,SAAS,EAAI,MAAM,EAAE,GAAG,EACpD,MAAM,GAAG,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,IAChD,IAAO,CAAC,GAAG,CAAK,EACnB,QAAQ,MAAM,EAAE,SAAS,EAAI,GAAG,EAChC,MAAM,GAAG,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE;EACtD,KAAI,CAAC,KAAc,KAAQ,EAAK,OAAO,EAAU,QAC3C,GAAM;GACR,GAAW,EAAK,MAAM,WAAW,CAAO;GACxC;EACF;EAGF,GAAW,GAAW,QAAQ,GAAM,YAAY,CAAO;CACzD;AACF;AAEA,SAAS,GAAa,GAA4B;CAChD,IAAM,IAAkB,CAAC,GACnB,KAAS,MAAmB;EAGhC,IAFI,EAAK,UAAU,KAAA,KAAa,EAAK,QAAQ,KAAA,KAC3C,EAAI,KAAK;GAAE;GAAM,OAAO,EAAK;GAAO,KAAK,EAAK;EAAI,CAAC,GACjD,aAAgB,KAAa,aAAgB,GAAkB;GACjE,KAAK,IAAM,KAAQ,EAAK,OAAO,EAAM,CAAI;GACzC;EACF;EACA,IAAI,aAAgB,GAAS;GAC3B,KAAK,IAAM,CAAC,GAAK,MAAU,EAAK,SAE9B,AADA,EAAM,CAAG,GACT,EAAM,CAAK;GAEb;EACF;EACA,IACE,aAAgB,KAChB,aAAgB,GAChB;GACA,KAAK,IAAM,KAAS,EAAK,QAAQ,EAAM,CAAK;GAC5C;EACF;EACA,AAAI,aAAgB,KAAS,EAAM,EAAK,OAAO;CACjD;CAEA,OADA,EAAM,CAAI,GACH;AACT;AAEA,SAAS,GACP,GACA,GACA,GACM;CAGN,AAFA,EAAK,aAAa,CAAC,GACnB,EAAK,SAAS,OAAe,CAAC,GAC9B,EAAK,SAAS,GAAW,KAAK,CAAO;AACvC;AAEA,SAAS,GAAY,GAA4C;CAC/D,IAAM,IAAS,CAAC,CAAC;CACjB,KAAK,IAAI,IAAI,GAAG,IAAI,EAAO,QAAQ,KACjC,AAAI,EAAO,OAAO,QAAM,EAAO,KAAK,IAAI,CAAC;CAE3C,QAAQ,MAA2B;EACjC,IAAI,IAAS,KAAK,IAAI,GAAG,KAAK,IAAI,EAAO,QAAQ,CAAM,CAAC;EACxD,AAAI,IAAS,KAAK,MAAW,EAAO,UAAQ;EAC5C,IAAI,IAAK,GACL,IAAK,EAAO,SAAS;EACzB,OAAO,KAAM,IAAI;GACf,IAAM,IAAO,IAAK,KAAO;GACzB,AAAI,EAAO,MAAQ,IAAQ,IAAK,IAAM,IACjC,IAAK,IAAM;EAClB;EACA,OAAO,IAAK;CACd;AACF;AAIA,IAAM,KAAN,MAAgB;CAYK;CACA;CAXnB;CAEA;CAEA;CAGA,mBAA2C,CAAC;CAE5C,YACE,GACA,GACA;EAGA,AALiB,KAAA,IAAA,GACA,KAAA,WAAA,GAEjB,KAAK,8BAAc,IAAI,IAAI,GAC3B,KAAK,2BAAW,IAAI,IAAI,GACxB,KAAK,sBAAsB,EAAS,uBAAuB;EAC3D,KAAK,IAAM,KAAO,CAAC,GAAG,GAAoB,GAAI,EAAS,cAAc,CAAC,CAAE,GAAG;GACzE,KAAK,IAAM,KAAU,EAAI,qBAAqB,CAAC,GAC7C,KAAK,YAAY,IAAI,GAAQ,CAAG;GAClC,KAAK,IAAM,KAAO,EAAI,cAAc,CAAC,GAAG,KAAK,SAAS,IAAI,GAAK,CAAG;EACpE;EACA,KAAK,EAAE,mBAAmB,GAAK,GAAQ,GAAM,MAAQ;GACnD,IAAM,IAAkB;IAAE,SAAS;IAAK;IAAQ;IAAM,QAAQ;GAAI;GAOlE,IANA,KAAK,iBAAiB,KAAK,CAAC,GACxB,KAAK,SAAS,YAAW,KAAK,SAAS,UAAU,CAAC,IAC5C,KAAK,SAAS,UACtB,QAAQ,KACN,gCAAgC,EAAK,WAAW,EAAI,IAAI,GAC1D,GACE,KAAK,SAAS,WAAW,IAC3B,MAAU,YACR,2BAA2B,EAAK,WAAW,EAAI,IAAI,GACrD;EACJ;CACF;CAEA,QAAkB;EAChB,IAAM,IAAQ,KAAK,WAAW;EAC9B,IAAI,KAAK,SAAS,eAAe,OAAO;EACxC,IAAM,IAAO,KAAK,EAAE,KAAK;EAOzB,OANI,EAAK,SAAS,SAChB,KAAK,MACH,iCAAiC,KAAK,UAAU,EAAK,KAAK,KAC1D,CACF,GAEK;CACT;CAEA,aAAuB;EACrB,IAAM,IAAQ,KAAK,EAAE,KAAK,EAAE,QACtB,IAAO,KAAK,gBAAgB;EAClC,IAAI,KAAK,iBAAiB,SAAS,GAAG;GACpC,EAAK,aAAa,CAAC;GACnB,KAAK,IAAM,KAAK,KAAK,kBAAkB,EAAK,SAAS,KAAK,CAAC;GAC3D,KAAK,mBAAmB,CAAC;EAC3B;EAGA,OAFA,EAAK,QAAQ,GACb,EAAK,MAAM,KAAK,EAAE,eACX;CACT;CAEA,kBAAoC;EAClC,IAAM,IAAM,KAAK,EAAE,KAAK;EACxB,QAAQ,EAAI,MAAZ;GACE,KAAK,WACH,OAAO,KAAK,kBAAkB;GAChC,KAAK,SACH,OAAO,KAAK,WAAW;GACzB,KAAK;GACL,KAAK,aACH,OAAO,KAAK,YAAY;GAC1B,KAAK;GACL,KAAK;GACL,KAAK,aAEH,OADA,KAAK,EAAE,QAAQ,GACR,KAAK,kBACV,KAAK,kBAAkB,CAAG,GAC1B,EAAI,MACJ,EAAI,GACN;GAEF,KAAK,qBAEH,OADA,KAAK,EAAE,QAAQ,GACR,IAAI,EAAyB,CAAC,CAAC;GACxC,KAAK,oBAEH,OADA,KAAK,EAAE,QAAQ,GACR,IAAI,EAAyB,CAAC,CAAC;GACxC,KAAK,QAEH,OADA,KAAK,EAAE,QAAQ,GACR,EAAW;GACpB,KAAK,SAEH,OADA,KAAK,EAAE,QAAQ,GACR,EAAW;GACpB,KAAK,QAEH,OADA,KAAK,EAAE,QAAQ,GACR,EAAW;GACpB,KAAK,aAEH,OADA,KAAK,EAAE,QAAQ,GACR,EAAW;GACpB,KAAK,UACH,OAAO,KAAK,YAAY;GAC1B,KAAK,YACH,OAAO,KAAK,WAAW;GACzB,KAAK,UACH,OAAO,KAAK,SAAS;GACvB,KAAK,UACH,OAAO,KAAK,gBAAgB;GAC9B,KAAK,SACH,OAAO,KAAK,kBAAkB;GAChC,KAAK,cAAc;IACjB,KAAK,EAAE,QAAQ;IACf,IAAM,IAAM,KAAK,YAAY,IAAI,EAAI,SAAU;IAC/C,IAAI,CAAC,GAAK,gBAAgB;KACxB,IAAI,KAAK,wBAAwB,UAC/B,OAAO,IAAI,EAAqB,EAAI,WAAY,CAC9C,IAAI,EAAe,EAAI,KAAK,CAC9B,CAAC;KACH,KAAK,MACH,iCAAiC,KAAK,UAAU,EAAI,SAAS,KAC7D,CACF;IACF;IACA;KACE,IAAM,IAAc,KAAK,iBAAiB;KAC1C,IAAI;MACF,IAAM,IAAS,EAAI,eACjB,EAAI,WACJ,EAAI,OACJ,KAAK,YAAY,CAAG,CACtB;MAeA,OAXE,aAAkB,KAClB,OAAO,eAAe,CAAM,MAAM,EAAe,aACjD,EAAO,cAAc,KAAA,IAEd,IAAI,EAAe,EAAO,OAAO;OACtC,aAAa,EAAO;OACpB,eAAe,EAAO;OACtB,WAAW,EAAI;MACjB,CAAC,KACC,aAAkB,KAAa,EAAO,cAAc,KAAA,MACtD,EAAO,YAAY,EAAI,MAClB;KACT,SAAS,GAAG;MACV,IAAI,KAAK,SAAS,WAAW,IAAO,MAAM;MAG1C,OAFI,KAAK,iBAAiB,WAAW,KACnC,KAAK,MAAM,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,GAAG,CAAG,GACrD,IAAI,EAAqB,EAAI,WAAY,CAC9C,IAAI,EAAe,EAAI,KAAK,CAC9B,CAAC;KACH;IACF;GACF;GACA,KAAK,gBAAgB;IACnB,KAAK,EAAE,QAAQ;IACf,IAAM,IAAoB,CAAC;IAC3B,OAAO,KAAK,EAAE,KAAK,EAAE,SAAS,YACxB,KAAK,EAAE,KAAK,EAAE,SAAS,SACzB,KAAK,MAAM,gBAAgB,EAAI,UAAW,UAAU,CAAG,KACrD,EAAM,SAAS,KAAK,KAAK,EAAE,KAAK,EAAE,SAAS,YAC7C,KAAK,EAAE,QAAQ,GACX,KAAK,EAAE,KAAK,EAAE,SAAS,aAE7B,EAAM,KAAK,KAAK,WAAW,CAAC;IAE9B,KAAK,OAAO,OAAO;IACnB,IAAM,IAAS,KAAK,YAAY,IAAI,EAAI,SAAU;IAClD,IAAI,CAAC,GAAQ;KACX,IAAI,KAAK,wBAAwB,UAC/B,OAAO,IAAI,EAAqB,EAAI,WAAY,CAAK;KACvD,KAAK,MACH,iCAAiC,KAAK,UAAU,EAAI,SAAS,KAC7D,CACF;IACF;IACA,AAAK,EAAO,oBACV,KAAK,MACH,wBAAwB,KAAK,UAAU,EAAI,SAAS,EAAE,iCACtD,CACF;IACF;KACE,IAAM,IAAc,KAAK,iBAAiB;KAC1C,IAAI;MACF,IAAM,IAAS,EAAO,iBACpB,EAAI,WACJ,GACA,KAAK,YAAY,CAAG,CACtB,GACM,IAAY,KAAK,EAAE,OAAO,MAC9B,EAAI,QACJ,KAAK,EAAE,aACT;MACA,IAAI,aAAkB,GAChB,EAAO,cAAc,KAAA,MAAW,EAAO,YAAY;WAClD,IAAI,EAAO,sBAChB,OAAO,IAAI,GAAiB,GAAQ,CAAS;MAE/C,OAAO;KACT,SAAS,GAAG;MACV,IAAI,KAAK,SAAS,WAAW,IAAO,MAAM;MAG1C,OAFI,KAAK,iBAAiB,WAAW,KACnC,KAAK,MAAM,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,GAAG,CAAG,GACrD,IAAI,EAAqB,EAAI,WAAY,CAAK;KACvD;IACF;GACF;GACA,KAAK,YAAY;IAEf,IADA,KAAK,EAAE,QAAQ,GACX,KAAK,EAAE,KAAK,EAAE,SAAS,QAAQ,OAAO,IAAI,EAAa;IAC3D,IAAM,IAAoB,CAAC,IAAI,EAAa,CAAC;IAC7C,OAAO,KAAK,EAAE,KAAK,EAAE,SAAS,SAE5B,AADA,KAAK,EAAE,QAAQ,GACf,EAAM,KAAK,KAAK,WAAW,CAAC;IAE9B,OAAO,IAAI,EAAa,CAAK;GAC/B;GACA,KAAK,oBAEH,OADA,KAAK,EAAE,QAAQ,GACR,KAAK,sBAAsB,CAAG;GAEvC,SACE,KAAK,MAAM,qBAAqB,KAAK,UAAU,EAAI,KAAK,KAAK,CAAG;EACpE;CACF;CAEA,oBAAsC;EACpC,IAAM,IAAM,KAAK,EAAE,QAAQ,GACrB,EAAE,WAAQ,iBAAc,GAAgB,EAAI,KAAK,GAGnD,IACF,MAAc,KAAA,IAEV,KAAK,yBAAyB,IAD9B,KAAK,sBAAsB,GAAW,CAAG,GAEzC,IAAI,GAAY,CAAM;EAI5B,IAAI,IAAI,uBAGN,OAFI,KAAK,EAAE,KAAK,EAAE,SAAS,YACzB,KAAK,MAAM,qCAAqC,CAAG,GAC9C,IAAI,EAAY,CAAC;EAE1B,IAAI,IAAI,CAAE,uBACR,OAAO,IAAI,EAAY,CAAC;EAK1B,IAAI,MAAkB,KAAA,GAAW;GAC/B,IAAM,IAAc,KAAK,KAAK,IAAI,EAAE,IAAI;GACxC,IAAgB,KAAK,qBACnB,GACA,GACA,CACF;EACF;EAEA,IAAM,IACJ,KAAK,KACD,IAAI,EACF,GACA,MAAkB,KAAA,IAAgC,KAAA,IAApB,EAAE,iBAAc,CAChD,IACA,IAAI,EACF,GACA,MAAkB,KAAA,IAAgC,KAAA,IAApB,EAAE,iBAAc,CAChD;EAGN,IAAI,KAAK,EAAE,KAAK,EAAE,SAAS,UAAU;GAGnC,AAFM,aAAmB,KACvB,KAAK,MAAM,mCAAmC,CAAG,GACnD,KAAK,EAAE,QAAQ;GAEf,IAAM,IAAgB,KAAK,iBAAiB,OAAO,CAAC,GAC9C,IAAU,KAAK,WAAW;GAChC,KAAK,OAAO,QAAQ;GACpB,IAAM,IAAS,EAAQ,OACjB,IAAM,KAAK,SAAS,IAAI,CAAM;GACpC,IAAI,GAAK,UAAU;IACjB,IAAM,IAAS,EAAI,SAAS,GAAQ,CAAO;IAC3C,IAAI,MAAW,KAAA,GAKb,OAJI,EAAc,SAAS,MACzB,EAAO,aAAa,CAAC,GACrB,EAAO,SAAS,KAAK,GAAG,CAAa,IAEhC;GAEX;GACA,IAAM,IAAY,IAAI,EACpB,GACA,GACA,MAAkB,KAAA,IAAgC,KAAA,IAApB,EAAE,iBAAc,CAChD;GAKA,OAJI,EAAc,SAAS,MACzB,EAAU,aAAa,CAAC,GACxB,EAAU,SAAS,KAAK,GAAG,CAAa,IAEnC;EACT;EACA,OAAO;CACT;CAEA,aAA+B;EAC7B,IAAM,IAAM,KAAK,EAAE,QAAQ,GACrB,KAAsB,MAAgB;GAE1C,AADA,KAAK,MAAM,GAAK,CAAG,GACf,KAAK,SAAS,WAAW,MAAO,KAAK,MAAM,GAAK,CAAG;EACzD,GACM,EAAE,UAAO,iBAAc,GAAgB,EAAI,OAAO,CAAkB;EAC1E,IAAI,MAAc,UAAU,MAAc,UAAU;GAClD,IAAM,IACJ,MAAc,SACV,EAAqB,GAAqB,CAAK,CAAC,IAChD,KAAK,OAAO,CAAK;GAGvB,AADE,OAAO,GAAG,GAAO,CAAY,KAAM,MAAM,CAAK,KAAK,MAAM,CAAY,KAErE,EACE,GAAG,EAAM,oCAAoC,MAAc,SAAS,aAAa,WAAW,iCAC9F;EACJ;EACA,OAAO,IAAI,EACT,GACA,MAAc,KAAA,IAA4B,KAAA,IAAhB,EAAE,aAAU,CACxC;CACF;CAEA,cAAgC;EAC9B,IAAM,IAAM,KAAK,EAAE,QAAQ;EAG3B,IAAI,KAAK,EAAE,KAAK,EAAE,SAAS,QAAQ;GACjC,IAAM,IAAU,OAAO,IAAI,YAAY,EAAE,OAAO,EAAI,KAAK,EAAE,MAAM,GAC3D,IAAK,KAAK,yBAAyB,CAAO;GAChD,OAAO,IAAI,EACT,EAAI,OACJ,MAAO,KAAA,IAAoC,KAAA,IAAxB,EAAE,eAAe,EAAG,CACzC;EACF;EAGA,IAAI,IAAc,IACZ,IAAsD,CAC1D,EAAE,MAAM,EAAI,MAAM,CACpB;EAEA,OAAO,KAAK,EAAE,KAAK,EAAE,SAAS,SAAQ;GACpC,KAAK,EAAE,QAAQ;GACf,IAAM,IAAO,KAAK,EAAE,KAAK;GACzB,AAAI,EAAK,SAAS,cAChB,KAAK,EAAE,QAAQ,GACf,EAAM,KAAK,EAAE,UAAU,GAAK,CAAC,GAC7B,IAAc,MACL,EAAK,SAAS,UAAU,EAAK,SAAS,eAC/C,KAAK,EAAE,QAAQ,GACf,EAAM,KAAK,EAAE,MAAM,EAAK,MAAM,CAAC,KACtB,KAAK,cAAc,EAAK,IAAI,KACrC,KAAK,EAAE,QAAQ,GACf,EAAM,KAAK,EACT,MAAM,KAAK,YAAY,KAAK,kBAAkB,CAAI,GAAG,CAAI,EAC3D,CAAC,KAED,KAAK,MACH,+CAA+C,KAAK,UAAU,EAAK,KAAK,KACxE,CACF;EAEJ;EAEA,IAAI,CAAC,GAAa;GAEhB,IAAM,IAAS,EAAM,KAAK,MAAO,UAAU,IAAI,EAAE,OAAO,EAAG,EAAE,KAAK,EAAE,GAC9D,IAAU,OAAO,IAAI,YAAY,EAAE,OAAO,CAAM,EAAE,MAAM,GACxD,IAAK,KAAK,yBAAyB,CAAO;GAChD,OAAO,IAAI,EACT,GACA,MAAO,KAAA,IAAoC,KAAA,IAAxB,EAAE,eAAe,EAAG,CACzC;EACF;EAGA,IAAM,IAAoB,CAAC,GACvB,IAAc;EAClB,KAAK,IAAM,KAAQ,GACjB,AAAI,cAAc,KACZ,MAAgB,OAClB,EAAM,KAAK,IAAI,EAAe,CAAW,CAAC,GAC1C,IAAc,KAEhB,EAAM,KAAK,IAAI,EAAa,CAAC,KAE7B,KAAe,EAAK;EAKxB,OAFI,MAAgB,MAAI,EAAM,KAAK,IAAI,EAAe,CAAW,CAAC,GAE3D,IAAI,EAAa,CAAK;CAC/B;CAEA,cAAsB,GAAuB;EAC3C,OAAO,MAAS,eAAe,MAAS,WAAW,MAAS;CAC9D;CAEA,kBAA0B,GAAwB;EAChD,IAAM,KAAsB,MAAgB;GAE1C,AADA,KAAK,MAAM,GAAK,CAAG,GACf,KAAK,SAAS,WAAW,MAAO,KAAK,MAAM,GAAK,CAAG;EACzD;EACA,QAAQ,EAAI,MAAZ;GACE,KAAK;GACL,KAAK,SACH,OAAO,GAAW,EAAI,KAAK;GAC7B,KAAK,aACH,OAAO,GAAc,EAAI,OAAO,CAAkB;GACpD,SACE,KAAK,MAAM,8BAA8B,CAAG;EAChD;CACF;CAEA,YAAoB,GAAmB,GAAoB;EACzD,IAAI,KAAK,SAAS,kBAChB,OAAO,IAAI,YAAY,SAAS,EAAE,OAAO,GAAM,CAAC,EAAE,OAAO,CAAK;EAChE,IAAI;GACF,OAAO,IAAI,YAAY,SAAS,EAAE,OAAO,GAAK,CAAC,EAAE,OAAO,CAAK;EAC/D,QAAQ;GACN,IAAM,IAAM;GAGZ,OAFA,KAAK,MAAM,GAAK,CAAG,GACf,KAAK,SAAS,WAAW,MAAO,KAAK,MAAM,GAAK,CAAG,GAChD,IAAI,YAAY,SAAS,EAAE,OAAO,GAAM,CAAC,EAAE,OAAO,CAAK;EAChE;CACF;CAEA,wBAAgC,GAAgC;EAC9D,OAAO,MAAS,cAAc,WAAW;CAC3C;CAEA,kBACE,GACA,GACA,GAC+B;EAC/B,IAAI,KAAK,EAAE,KAAK,EAAE,SAAS,QAAQ;GACjC,IAAM,IAAK,KAAK,yBAAyB,OAAO,EAAM,MAAM,CAAC;GAE7D,OAAO,IAAI,EAAe,GAAO;IAC/B,aAFkB,KAAK,wBAAwB,CAE/C;IACA,WAAW;IACX,GAAI,MAAO,KAAA,IAAoC,CAAC,IAAzB,EAAE,eAAe,EAAG;GAC7C,CAAC;EACH;EAGA,IAAI,IAAc,IACZ,IAA2D,CAC/D,EAAE,OAAO,EAAM,CACjB;EAEA,OAAO,KAAK,EAAE,KAAK,EAAE,SAAS,SAAQ;GACpC,KAAK,EAAE,QAAQ;GACf,IAAM,IAAO,KAAK,EAAE,KAAK;GACzB,IAAI,EAAK,SAAS,YAGhB,AAFA,KAAK,EAAE,QAAQ,GACf,EAAM,KAAK,EAAE,UAAU,GAAK,CAAC,GAC7B,IAAc;QACT,IAAI,EAAK,SAAS,oBAAoB;IAC3C,KAAK,EAAE,QAAQ;IACf,IAAM,IAAW,KAAK,uBAAuB,EAAK,KAAK;IACvD,KAAK,IAAM,KAAQ,GACjB,AAAI,aAAgB,KAClB,EAAM,KAAK,EAAE,UAAU,GAAK,CAAC,GAC7B,IAAc,MACL,aAAgB,KACzB,EAAM,KAAK,EAAE,OAAO,EAAK,MAAM,CAAC;GAGtC,OAAO,IAAI,KAAK,cAAc,EAAK,IAAI,GAErC,AADA,KAAK,EAAE,QAAQ,GACf,EAAM,KAAK,EAAE,OAAO,KAAK,kBAAkB,CAAI,EAAE,CAAC;QAC7C,IAAI,EAAK,SAAS,UAAU,EAAK,SAAS,aAAa;IAK5D,KAAK,EAAE,QAAQ;IACf,IAAM,IACJ;IAIF,AAFA,KAAK,MAAM,GAAQ,CAAI,GACnB,KAAK,SAAS,WAAW,MAAO,KAAK,MAAM,GAAQ,CAAI,GAC3D,EAAM,KAAK,EAAE,OAAO,IAAI,YAAY,EAAE,OAAO,EAAK,KAAK,EAAE,CAAC;GAC5D,OACE,KAAK,MACH,qCAAqC,KAAK,UAAU,EAAK,KAAK,KAC9D,CACF;EAEJ;EAEA,IAAI,CAAC,GAAa;GAChB,IAAM,IAAW,EAAM,KAAK,MAC1B,WAAW,IAAI,EAAE,QAAQ,IAAI,WAAY,CAC3C,GACM,IAAS,KAAK,aAAa,CAAQ,GACnC,IAAK,KAAK,yBAAyB,OAAO,EAAO,MAAM,CAAC;GAC9D,OAAO,IAAI,EACT,GACA,MAAO,KAAA,IAAoC,KAAA,IAAxB,EAAE,eAAe,EAAG,CACzC;EACF;EAGA,IAAM,IAAoB,CAAC,GACrB,IAAwB,CAAC,GACzB,UAAqB;GACzB,AAAI,EAAQ,SAAS,MACnB,EAAM,KAAK,IAAI,EAAe,KAAK,aAAa,CAAC,GAAG,CAAO,CAAC,CAAC,CAAC,GAC9D,EAAQ,SAAS;EAErB;EACA,KAAK,IAAM,KAAQ,GACjB,AAAI,cAAc,KAChB,EAAa,GACb,EAAM,KAAK,IAAI,EAAa,CAAC,KAE7B,EAAQ,KAAK,EAAK,KAAK;EAK3B,OAFA,EAAa,GAEN,IAAI,EAAa,CAAK;CAC/B;CAMA,sBAA8B,GAA+B;EAC3D,IAAM,IAAQ,KAAK,uBAAuB,EAAS,KAAK;EAExD,OAAO,KAAK,EAAE,KAAK,EAAE,SAAS,SAAQ;GACpC,KAAK,EAAE,QAAQ;GACf,IAAM,IAAO,KAAK,EAAE,KAAK;GACzB,IAAI,EAAK,SAAS,YAEhB,AADA,KAAK,EAAE,QAAQ,GACf,EAAM,KAAK,IAAI,EAAa,CAAC;QACxB,IAAI,EAAK,SAAS,oBAAoB;IAC3C,KAAK,EAAE,QAAQ;IACf,IAAM,IAAW,KAAK,uBAAuB,EAAK,KAAK;IACvD,KAAK,qBAAqB,GAAO,CAAQ;GAC3C,OAAO,IAAI,KAAK,cAAc,EAAK,IAAI,GAAG;IACxC,KAAK,EAAE,QAAQ;IACf,IAAM,IAAQ,KAAK,kBAAkB,CAAI,GAEnC,IAAO,EAAM,EAAM,SAAS;IAClC,AAAI,aAAgB,IAClB,EAAM,EAAM,SAAS,KAAK,IAAI,EAC5B,KAAK,aAAa,CAAC,EAAK,OAAO,CAAK,CAAC,CACvC,IAEA,EAAM,KAAK,IAAI,EAAe,CAAK,CAAC;GAExC,OACE,KAAK,MACH,qCAAqC,KAAK,UAAU,EAAK,KAAK,KAC9D,CACF;EAEJ;EACA,OAAO,IAAI,EAAa,CAAK;CAC/B;CAEA,uBAA+B,GAAqC;EAClE,IAAM,IAAW,EAAgB,MAAM,KAAK,GACtC,IAAoB,CAAC;EAC3B,KAAK,IAAI,IAAI,GAAG,IAAI,EAAS,QAAQ,KAEnC,AADI,IAAI,KAAG,EAAM,KAAK,IAAI,EAAa,CAAC,GACpC,EAAS,GAAG,SAAS,KACvB,EAAM,KAAK,IAAI,EAAe,GAAW,EAAS,EAAE,CAAC,CAAC;EAG1D,OAAO;CACT;CAEA,qBAA6B,GAAoB,GAA0B;EACzE,IAAI,EAAO,WAAW,GAAG;EACzB,IAAM,IAAa,EAAO,EAAO,SAAS,IACpC,IAAc,EAAO;EAC3B,AACE,aAAsB,KACtB,aAAuB,KAEvB,EAAO,EAAO,SAAS,KAAK,IAAI,EAC9B,KAAK,aAAa,CAAC,EAAW,OAAO,EAAY,KAAK,CAAC,CACzD,GACA,EAAO,KAAK,GAAG,EAAO,MAAM,CAAC,CAAC,KAE9B,EAAO,KAAK,GAAG,CAAM;CAEzB;CAEA,aAAqB,GAAiC;EACpD,IAAM,IAAQ,EAAM,QAAQ,GAAG,MAAM,IAAI,EAAE,YAAY,CAAC,GAClD,IAAM,IAAI,WAAW,CAAK,GAC5B,IAAM;EACV,KAAK,IAAM,KAAK,GAEd,AADA,EAAI,IAAI,GAAG,CAAG,GACd,KAAO,EAAE;EAEX,OAAO;CACT;CAEA,cAAkC;EAEhC,AADA,KAAK,EAAE,QAAQ,GACf,KAAK,OAAO,QAAQ;EACpB,IAAM,IAAS,KAAK,EAAE,KAAK;EAM3B,AALI,EAAO,SAAS,aAClB,KAAK,MACH,yCAAyC,KAAK,UAAU,EAAO,KAAK,KACpE,CACF,GACF,KAAK,EAAE,QAAQ;EACf,IAAM,EAAE,cAAW,GAAgB,EAAO,KAAK,GACzC,IAAI,OAAO,GAAY,CAAM,CAAC;EAEpC,OADA,KAAK,OAAO,QAAQ,GACb,IAAI,EAAW,CAAC;CACzB;CAEA,oBAA8C;EAC5C,KAAK,EAAE,QAAQ;EACf,IAAM,IAAoB,CAAC;EAC3B,OAAO,KAAK,EAAE,KAAK,EAAE,SAAS,aACxB,EAAM,SAAS,KAAK,KAAK,EAAE,KAAK,EAAE,SAAS,YAC7C,KAAK,EAAE,QAAQ,GACX,KAAK,EAAE,KAAK,EAAE,SAAS,YAE7B,EAAM,KAAK,KAAK,WAAW,CAAC;EAG9B,OADA,KAAK,OAAO,OAAO,GACZ,IAAI,EAAiB,CAAK;CACnC;CAEA,aAAgC;EAC9B,KAAK,EAAE,QAAQ;EACf,IAAI,IAAmB,IACnB,GACA;EACJ,IAAI,KAAK,EAAE,KAAK,EAAE,SAAS,cAEzB,AADA,KAAK,EAAE,QAAQ,GACf,IAAmB;OACd,IAAI,KAAK,EAAE,KAAK,EAAE,SAAS,sBAEhC,IADA,IAAQ,KAAK,EAAE,QAAQ,GACnB,EAAM,UAAU,KAAK;GACvB,IAAmB;GACnB,IAAM,IACJ;GAGF,AAFA,KAAK,MAAM,GAAK,CAAK,GACjB,KAAK,SAAS,WAAW,MAAO,KAAK,MAAM,GAAK,CAAK,GACzD,IAAQ,KAAA;EACV,OACE,IAAgB,KAAK,sBAAsB,EAAM,OAAO,CAAK;EAIjE,IAAM,IAAgB,KAAK,iBAAiB,OAAO,CAAC,GAC9C,IAAoB,CAAC;EAC3B,OAAO,KAAK,EAAE,KAAK,EAAE,SAAS,gBACxB,EAAM,SAAS,KAAK,KAAK,EAAE,KAAK,EAAE,SAAS,YAC7C,KAAK,EAAE,QAAQ,GACX,KAAK,EAAE,KAAK,EAAE,SAAS,eAE7B,EAAM,KAAK,KAAK,WAAW,CAAC;EAG9B,AADA,KAAK,OAAO,UAAU,GAClB,MAAkB,KAAA,KAAa,MAAU,KAAA,MAC3C,IAAgB,KAAK,qBACnB,OAAO,EAAM,MAAM,GACnB,GACA,CACF;EAGF,IAAM,IAAc,IAAI,EAAU,GAAO;GACvC;GACA;EACF,CAAC;EAKD,OAJI,EAAc,SAAS,MACzB,EAAY,aAAa,CAAC,GAC1B,EAAY,SAAS,KAAK,GAAG,CAAa,IAErC;CACT;CAEA,WAA4B;EAC1B,KAAK,EAAE,QAAQ;EACf,IAAI,IAAmB,IACnB,GACA;EACJ,IAAI,KAAK,EAAE,KAAK,EAAE,SAAS,cAEzB,AADA,KAAK,EAAE,QAAQ,GACf,IAAmB;OACd,IAAI,KAAK,EAAE,KAAK,EAAE,SAAS,sBAEhC,IADA,IAAQ,KAAK,EAAE,QAAQ,GACnB,EAAM,UAAU,KAAK;GACvB,IAAmB;GACnB,IAAM,IACJ;GAGF,AAFA,KAAK,MAAM,GAAK,CAAK,GACjB,KAAK,SAAS,WAAW,MAAO,KAAK,MAAM,GAAK,CAAK,GACzD,IAAQ,KAAA;EACV,OACE,IAAgB,KAAK,sBAAsB,EAAM,OAAO,CAAK;EAIjE,IAAM,IAAgB,KAAK,iBAAiB,OAAO,CAAC,GAC9C,IAAkC,CAAC;EACzC,OAAO,KAAK,EAAE,KAAK,EAAE,SAAS,cACxB,EAAQ,SAAS,KAAK,KAAK,EAAE,KAAK,EAAE,SAAS,YAC/C,KAAK,EAAE,QAAQ,GACX,KAAK,EAAE,KAAK,EAAE,SAAS,aAHS;GAKtC,IAAM,IAAM,KAAK,WAAW;GAC5B,KAAK,OAAO,OAAO;GACnB,IAAM,IAAM,KAAK,WAAW;GAC5B,EAAQ,KAAK,CAAC,GAAK,CAAG,CAAC;EACzB;EAEA,AADA,KAAK,OAAO,QAAQ,GAChB,MAAkB,KAAA,KAAa,MAAU,KAAA,MAC3C,IAAgB,KAAK,qBACnB,OAAO,EAAQ,MAAM,GACrB,GACA,CACF;EAEF,IAAM,IAAY,IAAI,EAAQ,GAAS;GAAE;GAAkB;EAAc,CAAC;EAK1E,OAJI,EAAc,SAAS,MACzB,EAAU,aAAa,CAAC,GACxB,EAAU,SAAS,KAAK,GAAG,CAAa,IAEnC;CACT;CAGA,kBAE6B;EAC3B,KAAK,EAAE,QAAQ;EACf,IAAM,IAAO,KAAK,EAAE,KAAK;EACzB,IAAI,EAAK,SAAS,cAChB,KAAK,EAAE,QAAQ;OACV,IAAI,EAAK,SAAS,wBAAwB,EAAK,UAAU,KAAK;GACnE,KAAK,EAAE,QAAQ;GACf,IAAM,IACJ;GAEF,AADA,KAAK,MAAM,GAAM,CAAI,GACjB,KAAK,SAAS,WAAW,MAAO,KAAK,MAAM,GAAM,CAAI;EAC3D,OAAO,IAAI,EAAK,SAAS,sBAAsB;GAE7C,IAAM,IAAM,KAAK,EAAE,QAAQ,GACrB,IAAM,uBAAuB,EAAI,MAAM;GAE7C,AADA,KAAK,MAAM,GAAK,CAAG,GACf,KAAK,SAAS,WAAW,MAAO,KAAK,MAAM,GAAK,CAAG;EACzD,OAAO,IAAI,EAAK,SAAS,UAAU;GAEjC,IAAM,IACJ;GAEF,AADA,KAAK,MAAM,GAAK,CAAI,GAChB,KAAK,SAAS,WAAW,MAAO,KAAK,MAAM,GAAK,CAAI;EAE1D;EAIA,IAAM,IAAgB,KAAK,iBAAiB,OAAO,CAAC,GAE9C,IAAqB,CAAC;EAC5B,OAAO,KAAK,EAAE,KAAK,EAAE,SAAS,cACxB,EAAO,SAAS,KAAK,KAAK,EAAE,KAAK,EAAE,SAAS,YAC9C,KAAK,EAAE,QAAQ,GACX,KAAK,EAAE,KAAK,EAAE,SAAS,aAE7B,EAAO,KAAK,KAAK,WAAW,CAAC;EAI/B,AAFA,KAAK,OAAO,QAAQ,GAEhB,EAAO,WAAW,KACpB,KAAK,MACH,+EACF;EAEF,IAAM,IAAQ,EAAO;EAGrB,IAAI,aAAiB,GAAgB;GAOnC,IAAM,IAAS,IAAI,EANA,EAAO,KAAK,GAAG,MAAM;IACtC,IAAI,aAAa,GAAgB,OAAO;IACxC,KAAK,MACH,gCAAgC,EAAE,0CACpC;GACF,CAC4C,CAAU;GAEtD,OADI,EAAc,SAAS,MAAG,EAAO,WAAW,IACzC;EACT;EACA,IAAI,aAAiB,GAAgB;GAOnC,IAAM,IAAS,IAAI,EANA,EAAO,KAAK,GAAG,MAAM;IACtC,IAAI,aAAa,GAAgB,OAAO;IACxC,KAAK,MACH,gCAAgC,EAAE,0CACpC;GACF,CAC4C,CAAU;GAEtD,OADI,EAAc,SAAS,MAAG,EAAO,WAAW,IACzC;EACT;EACA,KAAK,MAAM,8DAA8D;CAC3E;CASA,yBACE,GAC2B;EAC3B,IAAI,KAAK,EAAE,KAAK,EAAE,SAAS,sBAAsB;GAC/C,IAAM,IAAM,KAAK,EAAE,QAAQ,GACvB,IAAK,KAAK,sBAAsB,EAAI,OAAO,CAAG;GAIlD,OAHI,MAAO,KAAA,KAAa,MAAgB,KAAA,MACtC,IAAK,KAAK,qBAAqB,GAAa,GAAI,CAAG,IAE9C;EACT;CAEF;CAEA,OAAe,GAAwB;EACrC,IAAM,IAAM,KAAK,EAAE,QAAQ;EAM3B,OALI,EAAI,SAAS,KACf,KAAK,MACH,YAAY,EAAK,QAAQ,EAAI,KAAK,IAAI,KAAK,UAAU,EAAI,KAAK,EAAE,IAChE,CACF,GACK;CACT;CAQA,qBACE,GACA,GACA,GAC2B;EAC3B,IAAM,IAA6C;GACjD,GAAG;GACH,GAAG;GACH,GAAG;GACH,GAAG;GACH,GAAG;EACL;EACA,IAAI,KAAe,EAAY,IAAK,OAAO;EAG3C,IAAM,IAAM,SAAS,EAAY,sCAD/B,MAAO,MAAM,gBAAgB,IAAI,EAAG,QAAQ,EAAY,GAAI;EAG9D,AADA,KAAK,MAAM,GAAK,CAAG,GACf,KAAK,SAAS,WAAW,MAAO,KAAK,MAAM,GAAK,CAAG;CAEzD;CAEA,sBACE,GACA,GAC2B;EAC3B,IAAI,MAAQ,OAAO,MAAQ,OAAO,MAAQ,KAAK;GAE7C,IAAM,IAAM,uBAAuB,EAAI,OAD5B,OAAO,CAAG,IAAI,GACwB;GAEjD,AADA,KAAK,MAAM,GAAK,CAAG,GACf,KAAK,SAAS,WAAW,MAAO,KAAK,MAAM,GAAK,CAAG;GACvD;EACF;EACA,IAAI,MAAQ,KAAK;GACf,IAAM,IACJ;GAEF,AADA,KAAK,MAAM,GAAK,CAAG,GACf,KAAK,SAAS,WAAW,MAAO,KAAK,MAAM,GAAK,CAAG;GACvD;EACF;EAEA,OADI,MAAQ,MAAY,MACjB,OAAO,CAAG;CACnB;CAGA,YAAoB,GAAmC;EACrD,QAAQ,MAAgB;GAEtB,AADA,KAAK,MAAM,GAAK,CAAG,GACf,KAAK,SAAS,WAAW,MAAO,KAAK,MAAM,GAAK,CAAG;EACzD;CACF;CAEA,MAAc,GAAa,GAAmB;EAC5C,IAAM,IAAwB,EAAE,SAAS,EAAI;EAO7C,IANI,MAAQ,KAAA,MACV,EAAQ,SAAS,EAAI,QACrB,EAAQ,OAAO,EAAI,MACnB,EAAQ,SAAS,EAAI,MAEvB,KAAK,iBAAiB,KAAK,CAAO,GAC9B,KAAK,SAAS,WAChB,KAAK,SAAS,UAAU,CAAO;OAC1B,IAAI,CAAC,KAAK,SAAS,QAAQ;GAChC,IAAM,IAAM,IAAM,YAAY,EAAI,KAAK,WAAW,EAAI,QAAQ;GAC9D,QAAQ,KAAK,uBAAuB,EAAI,IAAI,GAAK;EACnD;CACF;CAEA,MAAc,GAAa,GAAoB;EAC7C,IAAM,IAAM,IAAM,YAAY,EAAI,KAAK,WAAW,EAAI,QAAQ;EAC9D,MAAU,YAAY,kBAAkB,EAAI,IAAI,GAAK;CACvD;AACF,GCzuCM,KAAc,IAAI,YAAY,GAChC,KAAiC,IAGxB,IAAb,cAAoC,EAAS;CAC3C,mBAA4B;CAC5B;CACA;CAEA,YAAY,GAAe,GAA6C;EAGtE,AAFA,MAAM,GACN,KAAK,QAAQ,GACb,KAAK,gBAAgB,GAAS;CAChC;CAEA,QAAQ,GAAsC;EAC5C,IAAM,IAAU,GAAY,OAAO,KAAK,KAAK;EAC7C,OAAO,EAAO,CACZ,EAAA,GAAmB,OAAO,EAAQ,MAAM,GAAG,KAAK,aAAa,GAC7D,CACF,CAAC;CACH;CAEA,OAAO,GAAmC,GAAuB;EAC/D,IAAM,IACJ,KAAK,kBAAkB,KAAA,IAAuC,KAA3B,IAAI,KAAK;EAC9C,OAAO,GAAiB,KAAK,OAAO,GAAQ,GAAS,CAAK;CAC5D;CAEA,MAAM,GAAiC;EACrC,OAAO,KAAK;CACd;AACF;AAEA,SAAS,GACP,GACA,GACA,GACA,GACQ;CACR,IAAM,IAAU,GAA2B,GAAS,oBAAoB,CAAC,CAAC,GACpE,IAAY,EAAc,CAAO;CACvC,IAAI,EAAQ,WAAW,KAAK,MAAc,MACxC,OAAO,GAAa,CAAK,IAAI;CAG/B,IAAM,oBAAc,IAAI,IAAoB,GACxC,IAA4C;CAChD,IAAI,EAAQ,SAAS,KAAK,MACxB,IAAiB,GAAsB,CAAK,GACxC,MAAmB,OACrB,KAAK,IAAM,EAAE,UAAO,qBAAkB,GACpC,EAAY,IAAI,GAAO,CAAY;CAIzC,IAAI,EAAQ,SAAS,SAAS,GAAG;EAC/B,IAAM,IACJ,MAAmB,OAEf,GAA0B,GAAO,CAAC,IADlC,GAA6B,CAAK;EAExC,KAAK,IAAM,EAAE,UAAO,qBAAkB,GACpC,AAAK,EAAY,IAAI,CAAK,KACxB,EAAY,IAAI,GAAO,CAAY;CAGzC;CAEA,IAAM,IAAQ,GAAmB,GAAO,CAAW;CACnD,IAAI,EAAM,UAAU,GAAG,OAAO,GAAa,CAAK,IAAI;CAEpD,IAAM,IAAW,EAAM,KAAK,EAAE,WAAQ,MAAM;EAC1C,IAAM,IAAU,GAAa,CAAI;EACjC,OAAO,MAAM,EAAM,SAAS,IAAI,IAAU,IAAS;CACrD,CAAC,GACG,IAAS,EAAS;CACtB,KAAK,IAAI,IAAI,GAAG,IAAI,EAAS,QAAQ,KAAK;EACxC,IAAM,IAAqB,EACzB,GACA,IAAQ,IAAI,EAAM,GAAI,YACxB;EACA,KAAU,OAAO,IAAqB,EAAS;CACjD;CACA,OAAO;AACT;AAEA,SAAS,GACP,GACuB;CACvB,OAAO,EAAQ,KAAK,MACd,MAAW,aACV,OACH,KAAiC,IACjC,QAAQ,KACN,yFACF,IAEK,SAP0B,CAQlC;AACH;AAYA,SAAS,GACP,GACA,GACoB;CACpB,IAAM,IAA6B,CAAC;CACpC,KAAK,IAAI,IAAI,GAAG,IAAI,EAAM,QAAQ,KAAK;EACrC,IAAM,IAAK,EAAM;EACjB,AAAI,MAAO,OACL,EAAM,IAAI,OAAO,QACnB,EAAO,KAAK;GAAE,OAAO,IAAI;GAAG;EAAa,CAAC,GAC1C,OAEA,EAAO,KAAK;GAAE,OAAO,IAAI;GAAG;EAAa,CAAC,IAEnC,MAAO,QAChB,EAAO,KAAK;GAAE,OAAO,IAAI;GAAG;EAAa,CAAC;CAE9C;CACA,OAAO;AACT;AAEA,SAAS,GAAsB,GAA0C;CACvE,IAAI;EACF,GAAS,CAAK;CAChB,QAAQ;EACN,OAAO;CACT;CAIA,IAAM,IAA6B,CAAC,GAC9B,IAAY,IAAI,GAAU,CAAK,GACjC,IAAU,GACV,IAIO,MACP,IAAW,IACX,IAAe;CACnB,SAAS;EACP,IAAM,IAAQ,EAAU,QAAQ;EAChC,IAAI,EAAM,SAAS,OAAO;EAC1B,IAAI,IAAiB;EAcrB,IAZK,MACH,IAAW,IAET,EAAM,SAAS,KACf,GAAkB,EAAU,UAAU,GAAG,EAAM,MAAM,KAErD,EAAO,KAAK;GAAE,OAAO,EAAM;GAAQ,cAAc;EAAQ,CAAC,IAM1D,MAAY,MAAM;GACpB,IAAI,EAAQ,SAAS,YAAY,GAAuB,IAAI,EAAM,IAAI,GAAG;IAEvE,AADA,EAAQ,QAAQ,EAAM,WACtB,IAAe,EAAM;IACrB;GACF,OAAO,AACL,EAAQ,SAAS,YACjB,GAAa,IAAI,EAAM,IAAI,KAC3B,GAAyB,GAAO,EAAQ,OAAO,EAAM,MAAM,IAE3D,IAAiB,KAEjB,EAAO,KAAK;IACV,OAAO,EAAM;IACb,cAAc,EAAQ;GACxB,CAAC;GAEH,IAAU;EACZ;EAqBA,AAnBI,GAAY,IAAI,EAAM,IAAI,KAC5B,KACA,IAAU;GACR,OAAO,EAAM;GACb,cAAc;GACd,MAAM;EACR,KACS,GAAa,IAAI,EAAM,IAAI,KACpC,IAAU,KAAK,IAAI,GAAG,IAAU,CAAC,GAC5B,KACH,EAAO,KAAK;GAAE,OAAO,EAAM;GAAQ,cAAc;EAAQ,CAAC,KAEnD,EAAM,SAAS,YACxB,IAAU;GACR,OAAO,EAAM;GACb,cAAc;GACd,MAAM;EACR,IAEF,IAAe,EAAM;CACvB;CAEA,IAAM,IAAkB,EAAU,SAAS,MACxC,MAAY,EAAQ,SAAS,CAChC;CAIA,OAHI,MAAoB,KAAA,KACtB,EAAO,KAAK;EAAE,OAAO,EAAgB;EAAO,cAAc;CAAQ,CAAC,GAE9D;AACT;AAEA,SAAS,GAA6B,GAAmC;CACvE,IAAM,IAA6B,CAAC,GAC9B,IAAY,IAAI,GAAU,CAAK,GACjC,IAAU;CACd,SAAS;EACP,IAAM,IAAQ,EAAU,QAAQ;EAChC,IAAI,EAAM,SAAS,OAAO;EAE1B,IAAI,GAAY,IAAI,EAAM,IAAI,GAC5B;OACK,IAAI,GAAa,IAAI,EAAM,IAAI,GACpC,IAAU,KAAK,IAAI,GAAG,IAAU,CAAC;OAC5B,IAAI,EAAM,SAAS,SAGnB;OAAI,EAAM,SAAS,QAAQ;IAGhC,IAAM,IAAY,EAAM,MAAM,EAAM,QAAQ,EAAM,SAAS;IAC3D,KAAK,IAAM,KAAS,GAA8B,CAAS,GACzD,EAAO,KAAK;KAAE,OAAO,EAAM,SAAS;KAAO,cAAc,IAAU;IAAE,CAAC;GAE1E,OAAO,IAAI,EAAM,SAAS,aAAa;IAErC,IAAM,IAAY,EAAM,MAAM,EAAM,QAAQ,EAAM,SAAS;IAC3D,KAAK,IAAM,EAAE,cAAW,GAA0B,GAAW,CAAC,GAC5D,EAAO,KAAK;KAAE,OAAO,EAAM,SAAS;KAAO,cAAc,IAAU;IAAE,CAAC;GAE1E;;CACF;CACA,OAAO;AACT;AAKA,SAAS,GAA8B,GAA6B;CAClE,IAAM,IAAmB,CAAC,GACtB,IAAI,GACF,IAAM,EAAU,SAAS;CAC/B,OAAO,IAAI,IAAK;EACd,IAAM,IAAK,EAAU;EACrB,IAAI,MAAO,MAAM;GACf,IAAM,IAAO,EAAU,IAAI;GAC3B,IAAI,MAAS,OAAO,MAAS,KAE3B,AADA,EAAO,KAAK,IAAI,CAAC,GACjB,KAAK;QACA,IAAI,MAAS,KAClB,IAAI,EAAU,IAAI,OAAO,KAAK;IAC5B,IAAM,IAAQ,EAAU,QAAQ,KAAK,IAAI,CAAC;IAC1C,IAAI,KAAS,IAAI,IAAQ,IAAI,IAAI;GACnC,OACE,KAAK;QAGP,KAAK;EAET,OAAO,AAAI,MAAO,OACZ,EAAU,IAAI,OAAO,QACvB,EAAO,KAAK,IAAI,CAAC,GACjB,KAAK,MAEL,EAAO,KAAK,IAAI,CAAC,GACjB,QAEO,MAAO,QAChB,EAAO,KAAK,IAAI,CAAC,GAGjB;CAEJ;CACA,OAAO;AACT;AAEA,IAAM,KAAyB,IAAI,IAAe,CAChD,sBACA,YACF,CAAC,GAEK,KAAc,IAAI,IAAe;CACrC;CACA;CACA;CACA;AACF,CAAC,GAEK,KAAe,IAAI,IAAe;CACtC;CACA;CACA;CACA;AACF,CAAC;AAED,SAAS,GACP,GACA,GACA,GACS;CAGT,OAAO,EAAS,MACb,MAAY,EAAQ,SAAS,KAAS,EAAQ,OAAO,CACxD;AACF;AAEA,SAAS,GACP,GACA,GACA,GACS;CACT,OAAO,eAAe,KAAK,EAAM,MAAM,GAAO,CAAG,CAAC;AACpD;AAEA,SAAS,GACP,GACA,GACc;CACd,IAAM,IAAS,CAAC,GAAG,CAAW,EAC3B,QAAQ,CAAC,OAAW,IAAQ,KAAK,IAAQ,EAAM,MAAM,EACrD,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC;CAC3B,IAAI,EAAO,WAAW,GAAG,OAAO,CAAC;EAAE,MAAM;EAAO,cAAc;CAAE,CAAC;CAEjE,IAAM,IAAsB,CAAC,GACzB,IAAQ,GACR,IAAe;CACnB,KAAK,IAAM,CAAC,GAAO,MAAqB,GAClC,MAAU,MACd,EAAM,KAAK;EAAE,MAAM,EAAM,MAAM,GAAO,CAAK;EAAG;CAAa,CAAC,GAC5D,IAAQ,GACR,IAAe;CAKjB,OAHI,IAAQ,EAAM,UAChB,EAAM,KAAK;EAAE,MAAM,EAAM,MAAM,CAAK;EAAG;CAAa,CAAC,GAEhD;AACT;;;ACxUA,SAAgB,EAAe,GAA8B;CAC3D,IAAI,OAAO,UAAU,CAAY,GAC/B,wBAAO,IAAI,KAAK,IAAe,GAAI,GAAE,YAAY,EAAE,QAAQ,WAAW,GAAG;CAG3E,IAAM,IAAY,KAAK,MAAM,IAAe,GAAI;CAChD,IAAI,IAAY,QAAS,GACvB,OAAO,IAAI,KAAK,CAAS,EAAE,YAAY,EAAE,QAAQ,WAAW,GAAG;CAKjE,IAAM,IAAe,KAAK,MAAM,CAAY,GACtC,IAAO,IAAe,GAGtB,qBAAO,IAAI,KAAK,IAAe,GAAI,GACtC,YAAY,EACZ,QAAQ,WAAW,EAAE,GAIlB,IAAU,EAAK,SAAS,GACxB,IAAS,EAAQ,QAAQ,GAAG,GAC9B,IAAY,KAAU,IAAI,EAAQ,MAAM,IAAS,CAAC,IAAI;CAE1D,OAAO,EAAU,SAAS,IAAG,KAAa;CAE1C,OAAO,GAAG,EAAK,GAAG,EAAU;AAC9B;AAMA,SAAS,GAAsB,GAA2B;CACxD,IAAI,EAAM,WAAW,GACnB,MAAU,YAAY,sCAAsC;CAC9D,IAAM,IAAO,EAAM;CACnB,IAAI,aAAgB,GAAgB,OAAO,EAAK;CAChD,IAAI,aAAgB,GAClB,OAAO,IAAI,YAAY,SAAS,EAAE,OAAO,GAAK,CAAC,EAAE,OAAO,EAAK,KAAK;CACpE,MAAU,YAAY,kDAAkD;AAC1E;AAaA,IAAM,KACJ;AAEF,SAAgB,GACd,GACA,GAC+D;CAC/D,IAAI,CAAC,GAAW,KAAK,CAAG,GAAG;EACzB,IAAM,IAAM,mCAAmC,KAAK,UAAU,CAAG;EACjE,IAAI,GAAS,EAAQ,CAAG;OACnB,MAAU,YAAY,CAAG;CAChC;CAKA,IAAM,IAAY,EAAI,MACpB,qDACF,GAEI,GACA;CAEJ,AAAI,KAEF,IAAW,EAAU,KAAK,EAAU,IAEpC,IAAY,WAAW,MAAM,EAAU,EAAE,MAEzC,IAAW,GACX,IAAY,KAAA;CAGd,IAAM,IAAK,KAAK,MAAM,CAAQ;CAC9B,IAAI,MAAM,CAAE,GACV,MAAU,YACR,mCAAmC,KAAK,UAAU,CAAG,GACvD;CAEF,IAAI,MAAc,KAAA,GAAW;EAC3B,IAAM,IAAU,IAAK;EAErB,OADI,KAAW,IAAU,IAAI,GAAmB,OAAO,CAAO,CAAC,IACxD,IAAI,GAAmB,OAAO,CAAO,CAAC;CAC/C;CAEA,OAAO,IAAI,GAAoB,IAAK,MAAO,CAAS;AACtD;AAMA,IAAa,KAAY,IAQZ,KAAb,cAAwC,EAAS;CAC/C,YACE,GACA,GACA;EACA,MAAM,GAAO,CAAO;CACtB;CAEA,OAAgB,GAAmC,GAAwB;EAEzE,OADI,GAAS,eAAe,KAAc,MAAM,OAAO,GAAS,CAAM,IAC/D,MAAgB,EAAe,OAAO,KAAK,KAAK,CAAC,EAAE;CAC5D;AACF,GAMa,KAAb,cAAwC,EAAS;CAC/C,YACE,GACA,GACA;EACA,MAAM,GAAO,CAAO;CACtB;CAEA,OAAgB,GAAmC,GAAwB;EAEzE,OADI,GAAS,eAAe,KAAc,MAAM,OAAO,GAAS,CAAM,IAC/D,MAAgB,EAAe,OAAO,KAAK,KAAK,CAAC,EAAE;CAC5D;AACF,GAMa,KAAb,cAAyC,EAAU;CACjD,YACE,GACA,GACA;EACA,MAAM,GAAO,CAAO;CACtB;CAEA,OAAgB,GAAmC,GAAwB;EAEzE,OADI,GAAS,eAAe,KAAc,MAAM,OAAO,GAAS,CAAM,IAC/D,MAAgB,EAAe,KAAK,KAAK,EAAE;CACpD;AACF,GAMa,KAAb,cAA0C,EAAQ;CAChD,YAAY,GAAkB,GAA6C;EACzE,MAAM,IAAW,GAAiB,CAAQ,GAAG,CAAO;CACtD;CAEA,OAAgB,GAAmC,GAAuB;EACxE,IAAI,GAAS,eAAe,IAAO,OAAO,MAAM,OAAO,GAAS,CAAK;EACrE,IAAM,IAAI,KAAK;EAKf,OAAO,MAAuB,EADT,aAAa,IAAY,EAAE,QAAQ,OAAO,EAAE,KAAK,CACb,EAAE;CAC7D;AACF,GAMa,KAAb,cAAgD,GAAqB;CACnE,YAAY,GAAkB,GAA6C;EACzE,MAAM,GAAU,CAAO;CACzB;CAEA,MAAe,GAA8B;EAC3C,IAAM,IAAI,KAAK,SAIT,IACJ,aAAa,IAAY,EAAE,QAAQ,MAAO,OAAO,EAAE,KAAK,IAAI;EAC9D,OAAO,IAAI,KAAK,CAAO;CACzB;AACF;AAaA,SAAgB,GAAkB,GAEhB;CAChB,IAAM,IAAU,GAAS,UAAU;CAEnC,SAAS,EACP,GACmD;EACnD,OAAO,IACH,IAAI,GAA2B,CAAQ,IACvC,IAAI,GAAqB,CAAQ;CACvC;CAEA,IAAM,IAAqB;EACzB,mBAAmB,CAAA,MAAA,IAA4B;EAC/C,YAAY,CAAC,EAAS;EAEtB,eACE,GACA,GACA,GACU;GAEV,OADI,MAAA,OAAoC,EAAW,CAAO,IACnD,GAAiB,GAAS,CAAO;EAC1C;EAEA,iBACE,GACA,GACA,GACU;GACV,IAAM,IAAM,GAAsB,CAAK;GAEvC,OADI,MAAA,OAAoC,EAAW,CAAG,IAC/C,GAAiB,GAAK,CAAO;EACtC;EAEA,SAAS,GAAa,GAAuC;GAC3D,IAAI,MAAA,IAAmB;GACvB,IAAI;GACJ,IAAI,aAAiB,GAAU,IAAe,OAAO,EAAM,KAAK;QAC3D,IAAI,aAAiB,GAAU,IAAe,OAAO,EAAM,KAAK;QAChE,IAAI,aAAiB,GAAW,IAAe,EAAM;QACrD;GACL,OAAO,EAAW,EAAe,CAAY,CAAC;EAChD;CACF;CAgBA,OAdI,MACF,EAAI,UACF,GACA,MACyB;EACzB,IAAI,aAAiB,MACnB,OAAO,IAAI,GACT,EAAe,EAAM,QAAQ,IAAI,GAAI,CACvC;CAEJ,GACA,EAAI,YAAY,MAAkC,aAAiB,OAG9D;AACT;AASA,IAAa,KAAoB,GAAkB,GAOtC,KAA4B,GAAkB,EAAE,QAAQ,GAAK,CAAC;;;ACpU3E,SAAgB,GAAU,GAAyB;CACjD,IAAM,IAAQ,EAAI,MAAM,GAAG;CAC3B,IAAI,EAAM,WAAW,GACnB,MAAU,YAAY,6BAA6B,KAAK,UAAU,CAAG,GAAG;CAC1E,IAAM,IAAQ,IAAI,WAAW,CAAC;CAC9B,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK;EAC1B,IAAM,IAAI,EAAM;EAChB,IAAI,CAAC,QAAQ,KAAK,CAAC,KAAM,EAAE,SAAS,KAAK,EAAE,OAAO,KAChD,MAAU,YAAY,2BAA2B,KAAK,UAAU,CAAC,GAAG;EACtE,IAAM,IAAI,SAAS,GAAG,EAAE;EACxB,IAAI,IAAI,KAAK,MAAU,YAAY,gCAAgC,GAAG;EACtE,EAAM,KAAK;CACb;CACA,OAAO;AACT;AAEA,SAAgB,GAAU,GAAyB;CACjD,IAAM,IAAQ,IAAI,WAAW,EAAE;CAC/B,IAAI,MAAQ,MAAM,OAAO;CAGzB,IAAI,IAAO,GACP,IAA8B,MAC5B,IAAY,EAAI,MAAM,6CAA6C;CACzE,AAAI,MACF,IAAO,EAAU,IACb,EAAK,SAAS,GAAG,MAAG,KAAQ,MAChC,IAAW,GAAU,EAAU,EAAE;CAGnC,IAAM,IAAS,EAAK,MAAM,IAAI;CAC9B,IAAI,EAAO,SAAS,GAClB,MAAU,YAAY,6BAA6B,KAAK,UAAU,CAAG,GAAG;CAE1E,IAAM,IAAc,EAAO,WAAW,GAChC,IAAY,EAAO,KAAK,EAAO,GAAG,MAAM,GAAG,IAAI,CAAC,GAChD,IAAa,KAAe,EAAO,KAAK,EAAO,GAAG,MAAM,GAAG,IAAI,CAAC,GAChE,IAAc,IAAW,IAAI;CAInC,IAFI,CAAC,KAAe,EAAU,WAAW,KAErC,KAAe,EAAU,SAAS,EAAW,UAAU,GACzD,MAAU,YAAY,6BAA6B,KAAK,UAAU,CAAG,GAAG;CAE1E,IAAM,IAAY,IAAc,EAAU,SAAS,EAAW,QACxD,IAAS;EAAC,GAAG;EAAW,GAAG,MAAM,CAAS,EAAE,KAAK,GAAG;EAAG,GAAG;CAAU,GAEtE,IAAS;CACb,KAAK,IAAM,KAAK,GAAQ;EACtB,IAAI,CAAC,qBAAqB,KAAK,CAAC,GAC9B,MAAU,YAAY,2BAA2B,KAAK,UAAU,CAAC,GAAG;EACtE,IAAM,IAAI,SAAS,GAAG,EAAE;EAExB,AADA,EAAM,OAAa,KAAK,IAAK,KAC7B,EAAM,OAAY,IAAI;CACxB;CAEA,OADI,KAAU,EAAM,IAAI,GAAU,EAAE,GAC7B;AACT;AAIA,SAAgB,GAAW,GAA2B;CACpD,OAAO,MAAM,KAAK,CAAK,EAAE,KAAK,GAAG;AACnC;AAEA,SAAgB,GAAW,GAA2B;CAOpD,IAAM,IAJJ,EAAM,MAAM,GAAG,EAAE,EAAE,OAAO,MAAM,MAAM,CAAC,KACvC,EAAM,QAAQ,OACd,EAAM,QAAQ,MAEkB,GAAW,EAAM,MAAM,EAAE,CAAC,IAAI,MAE1D,IAAY,IAAa,IAAI,GAC7B,IAAmB,CAAC;CAC1B,KAAK,IAAI,IAAI,GAAG,IAAI,IAAY,GAAG,KAAK,GACtC,EAAO,KAAM,EAAM,MAAM,IAAK,EAAM,IAAI,EAAE;CAG5C,IAAI,IAAY,IACd,IAAU,GACR,IAAI;CACR,OAAO,IAAI,IACT,IAAI,EAAO,OAAO,GAAG;EACnB,IAAI,IAAI,IAAI;EACZ,OAAO,IAAI,KAAa,EAAO,OAAO,IAAG;EAKzC,AAJI,IAAI,IAAI,MACV,IAAY,GACZ,IAAU,IAAI,IAEhB,IAAI;CACN,OACE;CAGJ,AAAI,IAAU,MAAG,IAAY;CAE7B,IAAM,KAAO,MAAc,EAAE,SAAS,EAAE,GACpC;CAYJ,OAXA,AAQE,IARE,MAAc,KACN,EAAO,IAAI,CAAG,EAAE,KAAK,GAAG,IAOxB,GALG,EAAO,MAAM,GAAG,CAAS,EAAE,IAAI,CAAG,EAAE,KAAK,GAKzC,EAAK,IAJJ,EACX,MAAM,IAAY,CAAO,EACzB,IAAI,CAAG,EACP,KAAK,GACc,KAGjB,IAAa,GAAG,EAAQ,GAAG,MAAe;AACnD;;;ACxFA,IAAM,KAAY,MACZ,IAAmB,MACnB,IAAW,KACX,IAAW;AAEjB,SAAS,GAAsB,GAA2B;CACxD,IAAI,EAAM,WAAW,GACnB,MAAU,YAAY,sCAAsC;CAC9D,IAAM,IAAO,EAAM;CACnB,IAAI,aAAgB,GAAgB,OAAO,EAAK;CAChD,IAAI,aAAgB,GAClB,OAAO,IAAI,YAAY,SAAS,EAAE,OAAO,GAAK,CAAC,EAAE,OAAO,EAAK,KAAK;CACpE,MAAU,YAAY,kDAAkD;AAC1E;AAIA,SAAS,GAAa,GAAmD;CAGvE,OAFI,MAAM,KAAK,CAAG,KAAK,EAAI,SAAS,GAAG,KAAK,CAAC,EAAI,SAAS,GAAG,IACpD;EAAE,OAAO,GAAU,CAAG;EAAG,MAAM;CAAK,IACtC;EAAE,OAAO,GAAU,CAAG;EAAG,MAAM;CAAM;AAC9C;AAIA,SAAS,EAAc,GAA2B;CAChD,IAAI,EAAM,WAAW,GAAG,OAAO,GAAW,CAAK;CAC/C,IAAI,EAAM,WAAW,IAAI,OAAO,GAAW,CAAK;CAChD,MAAU,YAAY,+BAA+B,EAAM,QAAQ;AACrE;AAIA,SAAS,GAAiB,GAAmB,GAA+B;CAE1E,IAAM,IAAS,IAAI,WAAW,EAAM,MAAM;CAC1C,EAAO,IAAI,CAAK;CAChB,IAAM,IAAY,KAAK,MAAM,IAAY,CAAC,GACpC,IAAY,IAAY;CAC9B,AAAI,IAAY,KAAK,IAAY,EAAM,WACrC,EAAO,MAAe,OAAS,IAAI,IAAc;CACnD,KAAK,IAAI,IAAI,IAAa,MAAY,IAAY,IAAI,EAAM,QAAQ,KAClE,EAAO,KAAK;CACd,IAAI,IAAM,KAAK,KAAK,IAAY,CAAC;CACjC,OAAO,IAAM,KAAK,EAAO,IAAM,OAAO,IAAG;CACzC,OAAO,EAAO,MAAM,GAAG,CAAG;AAC5B;AAEA,SAAS,GAAa,GAAuB,GAA6B;CACxE,IAAM,IAAO,IAAI,WAAW,CAAO;CAEnC,OADA,EAAK,IAAI,CAAS,GACX;AACT;AAOA,IAAa,KAAb,cAA+B,EAAe;CAC5C,OAAgB,GAAmC,GAAwB;EAEzE,OADI,GAAS,eAAe,KAAc,MAAM,OAAO,GAAS,CAAM,IAC/D,GAAG,GAAU,GAAG,EAAc,KAAK,KAAK,EAAE;CACnD;AACF,GAMa,KAAb,cAAqC,EAAU;CAC7C;CAEA,YAAY,GAAmB,GAAuB,GAAe;EAEnE,AADA,MAAM,CAAC,IAAI,EAAS,OAAO,CAAS,CAAC,GAAG,IAAI,EAAe,CAAS,CAAC,CAAC,GACtE,KAAK,QAAQ;CACf;CAEA,OAAgB,GAAmC,GAAuB;EACxE,IAAI,GAAS,eAAe,IAAO,OAAO,MAAM,OAAO,GAAS,CAAK;EACrE,IAAM,IAAY,OAAQ,KAAK,MAAM,GAAgB,KAAK,GACpD,IAAa,KAAK,MAAM,GAAsB;EAEpD,OAAO,GAAG,GAAU,GAAG,EADV,GAAa,GAAW,KAAK,QAAQ,IAAI,EACjB,CAAI,EAAE,GAAG,EAAU;CAC1D;AACF,GAOa,KAAb,cAAqC,EAAQ;CAC3C,YAAY,GAAa,GAAmB;EAC1C,MAAM,GAAK,CAAO;CACpB;CAEA,OAAgB,GAAmC,GAAuB;EACxE,IAAI,GAAS,eAAe,IAAO,OAAO,MAAM,OAAO,GAAS,CAAK;EACrE,IAAM,IAAU,KAAK,QAAQ,IAAW,IAAI,IACtC,IAAI,KAAK;EACf,IAAI,aAAa,GACf,OAAO,GAAG,EAAiB,GAAG,EAAc,EAAE,KAAK,EAAE;EAEvD,IACE,aAAa,KACb,EAAE,MAAM,WAAW,KACnB,EAAE,MAAM,cAAc,KACtB,EAAE,MAAM,cAAc,GACtB;GACA,IAAM,IAAY,OAAQ,EAAE,MAAM,GAAgB,KAAK;GAEvD,OAAO,GAAG,EAAiB,GAAG,EADjB,GAAc,EAAE,MAAM,GAAsB,OAAO,CACpB,CAAI,EAAE,GAAG,EAAU;EACjE;EACA,OAAO,MAAM,OAAO,GAAS,CAAK;CACpC;AACF;AAIA,SAAS,GAAa,GAAgB,GAA2B;CAC/D,IAAM,IAAW,EAAQ,QAAQ,GAAG;CAEpC,IAAI,MAAa,IAAI;EACnB,IAAM,EAAE,UAAO,YAAS,GAAa,CAAO;EAM5C,OALI,MAAW,IACN,IAAI,GACT,IAAO,IAAW,GAClB,IAAI,EAAe,CAAK,CAC1B,IACK,IAAI,GAAU,CAAK;CAC5B;CAKA,IAAM,IAAU,EAAQ,MAAM,GAAG,CAAQ,GACnC,IAAS,EAAQ,MAAM,IAAW,CAAC;CACzC,IAAI,CAAC,QAAQ,KAAK,CAAM,GACtB,MAAU,YACR,8BAA8B,KAAK,UAAU,CAAM,GACrD;CACF,IAAM,IAAY,SAAS,GAAQ,EAAE,GAE/B,EAAE,UAAO,YAAS,GAAa,CAAO,GACtC,IAAS,IAAO,KAAK;CAC3B,IAAI,IAAY,GACd,MAAU,YACR,qBAAqB,EAAU,mBAAmB,EAAO,OAAO,IAAO,SAAS,QAClF;CAEF,IAAM,IAAY,GAAiB,GAAO,CAAS;CAUnD,OATI,MAAW,IACN,IAAI,GACT,IAAO,IAAW,GAClB,IAAI,EAAU,CACZ,IAAI,EAAS,OAAO,CAAS,CAAC,GAC9B,IAAI,EAAe,CAAS,CAC9B,CAAC,CACH,IAEK,IAAI,GAAgB,GAAW,GAAW,CAAI;AACvD;AAaA,IAAa,KAAoB;CAC/B,mBAAmB,CAAC,IAAW,CAAgB;CAC/C,YAAY,CAAC,GAAU,CAAQ;CAE/B,eAAe,GAAgB,GAA2B;EACxD,OAAO,GAAa,GAAQ,CAAO;CACrC;CAEA,iBAAiB,GAAgB,GAA6B;EAC5D,OAAO,GAAa,GAAQ,GAAsB,CAAK,CAAC;CAC1D;CAEA,SAAS,GAAa,GAAuC;EACvD,YAAQ,KAAY,MAAQ,OAC5B,aAAiB,KAAkB,aAAiB,IACtD,OAAO,IAAI,GAAgB,GAAK,CAAK;CAEzC;AACF,GC1MM,KAAa,uBACb,KAAa,CAAE,uBAER,KAAwB;CACnC,YAAY,CAAC,IAAiB,EAAe;CAE7C,SAAS,GAAa,GAAuC;EACrD,iBAAiB,GAEvB;OAAI,MAAA,IAAyB;IAC3B,IAAM,IAAI,GAAc,EAAM,KAAK;IAEnC,OADI,IAAI,KAAmB,IAAI,EAAY,CAAC,IAC5C;GACF;GAEA,IAAI,MAAA,IAAyB;IAC3B,IAAM,IAAI,CAAC,KAAK,GAAc,EAAM,KAAK;IAEzC,OADI,IAAI,KAAmB,IAAI,EAAY,CAAC,IAC5C;GACF;EANA;CASF;AACF,GCHM,KAAa,OACb,KAAoB,OAKb,KAAU,KASjB,KAAoB,IAAI,IAAoB;CAChD,CAAC,QAAQ,CAAC,EAAE;CACZ,CAAC,SAAS,CAAC,EAAE;CACb,CAAC,QAAQ,CAAC,EAAE;CACZ,CAAC,SAAS,CAAC,EAAE;CACb,CAAC,OAAO,CAAC,EAAE;CACX,CAAC,OAAO,CAAC,EAAE;CACX,CAAC,YAAY,CAAC,EAAE;CAChB,CAAC,aAAa,CAAC,EAAE;CACjB,CAAC,WAAW,CAAC,GAAG;CAChB,CAAC,YAAY,CAAC,GAAG;AACnB,CAAC,GAEK,KAAoB,IAAI,IAC5B,CAAC,GAAG,GAAkB,QAAQ,CAAC,EAAE,KAAK,CAAC,GAAM,OAAQ,CAAC,GAAI,CAAI,CAAC,CACjE;AAIA,SAAS,EAAU,GAAmB;CACpC,IAAI;EACF,OAAO,mBAAmB,CAAC;CAC7B,QAAQ;EACN,OAAO;CACT;AACF;AAEA,SAAS,GAAc,GAAmB;CACxC,OAAO,MAAM,KACX,IAAI,YAAY,EAAE,OAAO,CAAC,IACzB,MAAM,IAAI,EAAE,SAAS,EAAE,EAAE,YAAY,EAAE,SAAS,GAAG,GAAG,GACzD,EAAE,KAAK,EAAE;AACX;AAEA,SAAS,EAAU,GAAW,GAA2C;CACvE,IAAI,IAAM;CACV,KAAK,IAAM,KAAK,GACd,KAAO,EAAU,CAAC,IAAI,IAAI,GAAc,CAAC;CAE3C,OAAO;AACT;AAIA,SAAS,GAAa,GAAoB;CACxC,OAAO,mBAAmB,KAAK,CAAC;AAClC;AACA,SAAS,GAAW,GAAoB;CACtC,OAAO,gBAAgB,KAAK,CAAC;AAC/B;AAGA,SAAS,GAAc,GAAoB;CACzC,OAAO,GAAa,CAAC,KAAK,GAAW,CAAC,KAAK,MAAM,OAAO,MAAM;AAChE;AAGA,SAAS,GAAmB,GAAoB;CAC9C,QAAQ,GAAc,CAAC,KAAK,MAAM,OAAO,MAAM,QAAQ,MAAM;AAC/D;AAGA,SAAS,GAAkB,GAAoB;CAC7C,OAAO,GAAc,CAAC,KAAK,MAAM,OAAO,MAAM;AAChD;AAGA,SAAS,GAAkB,GAAoB;CAC7C,OAAO,GAAa,CAAC,KAAK,GAAW,CAAC,KAAK,MAAM;AACnD;AAGA,SAAS,GAAiB,GAAoB;CAC5C,OAAO,GAAa,CAAC,KAAK,GAAW,CAAC;AACxC;AAaA,SAAS,GAAkB,GAA4B;CACrD,IAAM,IAAoB,CAAC,GACvB,IAAM,GAGJ,IAAQ,EAAI,QAAQ,GAAG;CAC7B,AAAI,KAAS,MACX,EAAM,KAAK,EAAW,KAAK,GAC3B,EAAM,KAAK,IAAI,EAAe,EAAU,EAAI,MAAM,GAAG,CAAK,CAAC,CAAC,CAAC,GAC7D,IAAM,EAAI,MAAM,IAAQ,CAAC;CAI3B,IAAI,GACA,IAAyB;CAE7B,IAAI,EAAI,WAAW,GAAG,GAAG;EACvB,IAAM,IAAQ,EAAI,QAAQ,GAAG;EAC7B,IAAI,IAAQ,GACV,MAAU,YAAY,6CAA6C;EACrE,IAAU,EAAI,MAAM,GAAG,CAAK;EAC5B,IAAM,IAAQ,EAAI,MAAM,IAAQ,CAAC;EACjC,IAAI,EAAM,WAAW,GAAG,GAAG,IAAU,EAAM,MAAM,CAAC;OAC7C,IAAI,EAAM,SAAS,GACtB,MAAU,YACR,mDACF;EACF,EAAM,KAAK,IAAI,EAAe,GAAU,CAAO,CAAC,CAAC;CACnD,OAAO;EAEL,IAAM,IAAW,EAAI,YAAY,GAAG;EAQpC,IAPI,KAAY,KACd,IAAU,EAAI,MAAM,GAAG,CAAQ,GAC/B,IAAU,EAAI,MAAM,IAAW,CAAC,KAEhC,IAAU,GAGR,MAAY,IAET,IAAI,0BAA0B,KAAK,CAAO,GAC/C,EAAM,KAAK,IAAI,EAAe,GAAU,CAAO,CAAC,CAAC;OAGjD,KAAK,IAAM,KAAS,EAAQ,YAAY,EAAE,MAAM,GAAG,GACjD,EAAM,KAAK,IAAI,EAAe,CAAK,CAAC;CAG1C;CAGA,IAAI,MAAY,QAAQ,MAAY,IAAI;EACtC,IAAI,CAAC,QAAQ,KAAK,CAAO,GACvB,MAAU,YAAY,sBAAsB,KAAK,UAAU,CAAO,GAAG;EACvE,IAAM,IAAO,SAAS,GAAS,EAAE;EACjC,IAAI,IAAO,OAAO,MAAU,YAAY,aAAa,EAAK,cAAc;EACxE,EAAM,KAAK,IAAI,EAAS,OAAO,CAAI,CAAC,CAAC;CACvC;CAEA,OAAO,IAAI,EAAU,CAAK;AAC5B;AAKA,SAAS,GAAkB,GAAyB;CAClD,IAAM,IAAQ,EAAK,OACf,IAAM,GACN,IAAS;CAGb,IACE,IAAM,EAAM,UACZ,EAAM,cAAgB,KACrB,EAAM,GAAoB,UAAU,IACrC;EACA;EACA,IAAM,IAAO,EAAM;EACnB,KAAU,EAAU,EAAK,OAAO,EAAiB,IAAI;CACvD;CAEA,IAAI,KAAO,EAAM,QAAQ,OAAO;CAEhC,IAAM,IAAY,EAAM;CACxB,IAAI,aAAqB,GAAgB;EACvC;EACA,IAAM,EAAE,cAAW,EAAU;EAC7B,IAAI,MAAW,GACb,KAAU,GAAW,EAAU,KAAK;OAC/B,IAAI,MAAW,IACpB,KAAU,MAAM,GAAW,EAAU,KAAK,IAAI;OAE9C,MAAU,MAAM,wCAAwC,GAAQ;EAGlE,AAAI,IAAM,EAAM,UAAU,EAAM,cAAgB,MAC9C,KAAU,MAAM,EAAW,EAAM,KAA0B,OAAO,EAAgB;CAEtF,OAAO;EAEL,IAAM,IAAmB,CAAC;EAC1B,OAAO,IAAM,EAAM,UAAU,EAAM,cAAgB,IACjD,EAAO,KACL,EAAW,EAAM,KAA0B,OAAO,EAAgB,CACpE;EAEF,KAAU,EAAO,KAAK,GAAG;CAC3B;CAOA,OAJI,IAAM,EAAM,UAAU,EAAM,cAAgB,MAC9C,KAAU,MAAO,EAAM,GAAkB,MAAM,SAAS,IAGnD;AACT;AAQA,SAAS,GAAuB,GAG9B;CACA,IAAM,IAAe,EAAK,MAAM,CAAC,GAC3B,IAAW,EAAa,QAAQ,GAAG,GACrC,GACA;CAWJ,OAVI,KAAY,KACd,IAAU,EAAa,MAAM,GAAG,CAAQ,GAExC,IADgB,EAAa,MAAM,IAAW,CAC/B,EACZ,MAAM,GAAG,EACT,KAAK,MAAM,IAAI,EAAe,EAAU,CAAC,CAAC,CAAC,MAE9C,IAAU,GACV,IAAe,CAAC,IAEX;EAAE,WAAW,GAAkB,CAAO;EAAG;CAAa;AAC/D;AAcA,SAAS,GAAc,GAAyB;CAE9C,IAAI,IAAO,GACP,IAA0B,MACxB,IAAU,EAAK,QAAQ,GAAG;CAChC,AAAI,KAAW,MACb,IAAW,EAAU,EAAK,MAAM,IAAU,CAAC,CAAC,GAC5C,IAAO,EAAK,MAAM,GAAG,CAAO;CAI9B,IAAI,IAAsC,MACpC,IAAO,EAAK,QAAQ,GAAG;CAC7B,IAAI,KAAQ,GAAG;EACb,IAAM,IAAK,EAAK,MAAM,IAAO,CAAC;EAM9B,AALA,IAAO,EAAK,MAAM,GAAG,CAAI,GAKzB,IAAa,EAAG,MAAM,GAAG,EAAE,KAAK,MAAM,IAAI,EAAe,EAAU,CAAC,CAAC,CAAC;CACxE;CAGA,IAAM,IAAoB,CAAC,GAErB,IAAc,yCAAyC,KAAK,CAAI;CACtE,IAAI,GAAa;EAEf,IAAM,IAAa,EAAY,GAAG,YAAY,GACxC,IAAW,EAAY,IACvB,IAAW,GAAkB,IAAI,CAAU;EAMjD,IALA,EAAM,KACJ,MAAa,KAAA,IAET,IAAI,EAAe,CAAU,IAD7B,IAAI,EAAS,CAAQ,CAE3B,GACI,EAAS,WAAW,IAAI,GAAG;GAC7B,IAAM,EAAE,cAAW,oBAAiB,GAAuB,CAAQ;GACnE,EAAM,KAAK,GAAW,IAAI,EAAU,CAAY,CAAC;EACnD,OAAO,IAAI,EAAS,WAAW,GAAG,GAAG;GACnC,IAAM,IAAe,EAClB,MAAM,CAAC,EACP,MAAM,GAAG,EACT,KAAK,MAAM,IAAI,EAAe,EAAU,CAAC,CAAC,CAAC;GAC9C,EAAM,KAAK,EAAW,MAAM,IAAI,EAAU,CAAY,CAAC;EACzD,OAAO;GACL,IAAM,IAAe,EAClB,MAAM,GAAG,EACT,KAAK,MAAM,IAAI,EAAe,EAAU,CAAC,CAAC,CAAC;GAC9C,EAAM,KAAK,EAAW,MAAM,IAAI,EAAU,CAAY,CAAC;EACzD;CACF,OAAO,IAAI,EAAK,WAAW,IAAI,GAAG;EAEhC,IAAM,EAAE,cAAW,oBAAiB,GAAuB,CAAI;EAC/D,EAAM,KAAK,EAAW,OAAO,GAAW,IAAI,EAAU,CAAY,CAAC;CACrE,OAAO,IAAI,EAAK,WAAW,GAAG,GAAG;EAE/B,IAAM,IAAe,EAClB,MAAM,CAAC,EACP,MAAM,GAAG,EACT,KAAK,MAAM,IAAI,EAAe,EAAU,CAAC,CAAC,CAAC;EAC9C,EAAM,KAAK,EAAW,MAAM,IAAI,EAAU,CAAY,CAAC;CACzD,OAAO,IAAI,MAAS,IAElB,EAAM,KAAK,IAAI,EAAS,EAAE,CAAC;MACtB;EAEL,IAAI,IAAU,IACV,IAAW,GACX,IAAc;EAKlB,KAJI,EAAS,WAAW,IAAI,MAC1B,IAAc,IACd,IAAW,EAAS,MAAM,CAAC,IAEtB,EAAS,WAAW,KAAK,IAE9B,AADA,KACA,IAAW,EAAS,MAAM,CAAC;EAe7B,IAZI,MAAa,QACf,KACA,IAAW,MACF,MAAa,QACtB,IAAW,KAQT,MAAY,MAAM,CAAC,KAAe,MAAa,MAChC,EAAS,MAAM,GAAG,EAAE,GACxB,SAAS,GAAG,GACvB,MAAU,YACR,oHAAoH,KAAK,UAAU,CAAG,GACxI;EAEJ,IAAM,IACJ,MAAa,KACT,CAAC,IACD,EAAS,MAAM,GAAG,EAAE,KAAK,MAAM,IAAI,EAAe,EAAU,CAAC,CAAC,CAAC;EACrE,EAAM,KAAK,IAAI,EAAS,CAAO,GAAG,IAAI,EAAU,CAAY,CAAC;CAC/D;CAmBA,IAhBI,MAAe,QAAM,EAAM,KAAK,IAAI,EAAU,CAAU,CAAC,GACzD,MAAa,SAGX,MAAe,QAAM,EAAM,KAAK,EAAW,IAAI,GACnD,EAAM,KAAK,IAAI,EAAe,CAAQ,CAAC,IAKrC,MAAa,QAAQ,MAAe,QACtC,EAAM,OAAO,EAAM,SAAS,GAAG,CAAC,GAK9B,MAAe,QAAQ,MAAa,MAAM;EAC5C,IAAM,IAAO,EAAM,EAAM,SAAS;EAClC,AAAI,aAAgB,KAAa,EAAK,MAAM,WAAW,KACrD,EAAM,IAAI;CAEd;CAYA,OAPE,EAAM,WAAW,KACjB,EAAM,cAAc,KACnB,EAAM,GAAgB,UAAU,KAE1B,CAAC,IAGH;AACT;AAOA,SAAS,EAAW,GAA4B,GAA0B;CACxE,IAAI,IAAM,GACN,IAAS;CAEb,IAAI,IAAM,EAAM,QAAQ;EACtB,IAAM,IAAK,EAAM;EACjB,IAAI,aAAc,GAMhB;OALA,KAKI,EAAG,MAAM,SAAS,GAAG;IACvB,IAAM,IAAS,EAAG,MAAM,KAAK,MAAM;KACjC,IAAI,EAAE,aAAa,IACjB,MAAU,MAAM,uCAAuC;KACzD,OAAO,EAAU,EAAE,OAAO,EAAkB;IAC9C,CAAC;IACD,KAAU,MAAM,EAAO,KAAK,GAAG;GACjC;SAEK,AAAI,aAAc,KAAc,EAAG,UAAU,MAClD;CAGJ;CAOA,OALI,IAAM,EAAM,UAAU,EAAM,cAAgB,MAC9C,KACE,MAAM,EAAW,EAAM,GAAwB,OAAO,EAAiB,IAGpE;AACT;AAKA,SAAS,EAAa,GAA8B;CAClD,OAAO,EAAQ,MAAM,KAAK,MAAM;EAC9B,IAAI,EAAE,aAAa,IACjB,MAAU,MAAM,yCAAyC;EAC3D,OAAO,EAAU,EAAE,OAAO,EAAa;CACzC,CAAC;AACH;AAYA,SAAS,GAAc,GAAoC;CAGzD,IAAI,EAAM,WAAW,GAAG,OAAO;CAE/B,IAAI,IAAM,GACJ,IAAQ,EAAM;CAGpB,IAAI,aAAiB,KAAY,aAAiB,GAAgB;EAChE,IAAI;EACJ,IAAI,aAAiB,GAAU;GAC7B,IAAM,IAAO,GAAkB,IAAI,EAAM,KAAK;GAC9C,IAAI,MAAS,KAAA,GACX,MAAU,MAAM,+BAA+B,EAAM,OAAO;GAC9D,IAAa,IAAO;EACtB,OACE,IAAc,EAAyB,QAAQ;EAGjD,IAAI,KAAO,EAAM,QAAQ,OAAO;EAEhC,IAAM,IAAS,EAAM,MACjB,IAAgB,IAChB,IAAa;EAEjB,IAAI,aAAkB,GAEpB,AADA,IAAgB,OAAO,GAAkB,CAAM,GAC/C,IAAa;OACR,IAAI,aAAkB,GAC3B,IAAI,EAAO,UAAU,IACnB,IAAa;OACV,IAAI,EAAO,UAAU,IACxB,IAAa;OAEb,MAAU,MACR,8CAA8C,EAAO,MAAM,EAC7D;OAEF,MAAU,MAAM,4CAA4C;EAG9D,IAAI,IAAW;EACf,IAAI,IAAM,EAAM,UAAU,EAAM,cAAgB,GAAW;GACzD,IAAM,IAAU,EAAM;GACtB,AAAI,EAAQ,MAAM,SAAS,MACzB,KAAY,IAAa,MAAM,MAAM,EAAa,CAAO,EAAE,KAAK,GAAG;EAEvE;EAEA,OAAO,IAAa,IAAgB,IAAW,EAAW,GAAO,CAAG;CACtE;CAGA,IAAI,aAAiB,KAAc,EAAM,UAAU,IAAI;EACrD,IAAI,KAAO,EAAM,UAAU,EAAE,EAAM,cAAgB,IACjD,MAAU,MACR,yDACF;EACF,IAAM,IAAY,GAAkB,EAAM,IAAmB,GACzD,IAAW;EACf,IAAI,IAAM,EAAM,UAAU,EAAM,cAAgB,GAAW;GACzD,IAAM,IAAU,EAAM;GACtB,AAAI,EAAQ,MAAM,SAAS,MACzB,IAAW,MAAM,EAAa,CAAO,EAAE,KAAK,GAAG;EAEnD;EACA,OAAO,OAAO,IAAY,IAAW,EAAW,GAAO,CAAG;CAC5D;CAGA,IAAI,aAAiB,KAAc,EAAM,UAAU,IAAI;EACrD,IAAI,IAAW;EACf,IAAI,IAAM,EAAM,UAAU,EAAM,cAAgB,GAAW;GACzD,IAAM,IAAU,EAAM;GACtB,IAAW,MAAM,EAAa,CAAO,EAAE,KAAK,GAAG;EACjD;EACA,OAAO,IAAW,EAAW,GAAO,CAAG;CACzC;CAGA,IAAI,aAAiB,GAAU;EAC7B,IAAM,IAAU,EAAM;EAEtB,IAAI,MAAY,IAEd,OAAO,EAAW,GAAO,CAAG;EAK9B,IAAM,IAAU,MAAY,KAAK,KAAK,MAAM,OAAO,OAAO,CAAO,IAAI,CAAC,GAElE;EACJ,IAAI,IAAM,EAAM,UAAU,EAAM,cAAgB,GAAW;GACzD,IAAM,IAAU,EAAM;GACtB,IAAI,EAAQ,MAAM,SAAS,GAAG;IAC5B,IAAM,IAAO,EAAa,CAAO;IAIjC,KADsB,MAAY,MAAM,EAAK,GAAG,SAAS,GAAG,IAChC,OAAO,KAAW,EAAK,KAAK,GAAG;GAC7D,OAEE,IAAW,MAAY,KAAK,OAAO;EAEvC,OAEE,IAAW,MAAY,KAAK,OAAO;EAGrC,OAAO,IAAW,EAAW,GAAO,CAAG;CACzC;CAEA,MAAU,MAAM,mDAAmD;AACrE;AAQA,IAAa,KAAb,cAAgC,EAAU;CACxC,OAAgB,GAAmC,GAAuB;EACxE,IAAI,GAAS,eAAe,IAAO,OAAO,MAAM,OAAO,GAAS,CAAK;EACrE,IAAI;GACF,OAAO,GAAG,GAAW,GAAG,GAAc,KAAK,KAAK,EAAE;EACpD,QAAQ;GACN,OAAO,MAAM,OAAO,GAAS,CAAK;EACpC;CACF;AACF,GAMa,KAAb,cAAsC,EAAQ;CAC5C,YAAY,GAAoB;EAC9B,MAAM,IAAS,CAAO;CACxB;CAEA,OAAgB,GAAmC,GAAuB;EACxE,IAAI,GAAS,eAAe,IAAO,OAAO,MAAM,OAAO,GAAS,CAAK;EACrE,IAAI;GACF,OAAO,GAAG,GAAkB,GAAG,GAAe,KAAK,QAAsB,KAAK,EAAE;EAClF,QAAQ;GACN,OAAO,MAAM,OAAO,GAAS,CAAK;EACpC;CACF;AACF;AAIA,SAAS,GAAsB,GAA2B;CACxD,IAAI,EAAM,WAAW,GACnB,MAAU,YAAY,uCAAuC;CAC/D,IAAM,IAAO,EAAM;CACnB,IAAI,aAAgB,GAAgB,OAAO,EAAK;CAChD,IAAI,aAAgB,GAClB,OAAO,IAAI,YAAY,SAAS,EAAE,OAAO,GAAK,CAAC,EAAE,OAAO,EAAK,KAAK;CACpE,MAAU,YAAY,mDAAmD;AAC3E;AAEA,SAAS,GAAc,GAAgB,GAAuB;CAE5D,IAAM,IAAM,IAAI,GADC,GAAc,CACJ,CAAQ;CAEnC,OADI,MAAW,KAA0B,IAAI,GAAiB,CAAG,IAC1D;AACT;AAWA,IAAa,KAAqB;CAChC,mBAAmB,CAAC,IAAY,EAAiB;CACjD,YAAY,CAAC,EAAO;CAEpB,eAAe,GAAgB,GAA2B;EACxD,OAAO,GAAc,GAAQ,CAAO;CACtC;CAEA,iBAAiB,GAAgB,GAA6B;EAC5D,OAAO,GAAc,GAAQ,GAAsB,CAAK,CAAC;CAC3D;CAEA,SAAS,GAAa,GAAuC;EACvD,UAAA,OACE,aAAiB,GAKvB,OAAO,IAAI,GAAiB,IAJV,GAAW,EAAM,OAAO;GACxC,kBAAkB,EAAM;GACxB,eAAe,EAAM;EACvB,CAC4B,CAAK;CACnC;AACF,GCjqBM,KAAoB,IAAI,YAAY,SAAS;CACjD,OAAO;CACP,WAAW;AACb,CAAC,GAEK,KAAqB,IAAI,YAAY,SAAS;CAClD,OAAO;CACP,WAAW;AACb,CAAC;AAED,SAAS,EAAY,GAAoB;CACvC,MAAU,MAAM,sBAAsB,GAAK;AAC7C;AAOA,SAAS,EACP,GACA,GACA,GACe;CACf,IAAM,IAAyB;EAAE,SAAS;EAAK;CAAO;CAMtD,IALI,GAAS,YACX,EAAQ,UAAU,CAAO,IACf,GAAS,UACnB,QAAQ,KAAK,mCAAmC,EAAO,IAAI,GAAK,GAE9D,GAAS,WAAW,IACtB,MAAU,MAAM,sBAAsB,GAAK;CAE7C,OAAO;AACT;AAEA,SAAS,GAAW,GAAgB,GAA8B;CAEhE,AADA,EAAK,aAAa,CAAC,GACnB,EAAK,SAAS,KAAK,CAAO;AAC5B;AAoBA,SAAS,EAAkB,GAAwB;CACjD,IAAI,aAAe,GAAU,OAAO,CAAC,KAAK,OAAO,EAAI,KAAK,CAAC;CAC3D,IAAI,aAAe,GAAU,OAAO,CAAC,KAAK,OAAO,EAAI,KAAK,CAAC;CAC3D,IAAI,aAAe,GAAgB,OAAO,CAAC,KAAK,EAAI,KAAK;CACzD,IAAI,aAAe,GACjB,OAAO,CAAC,KAAK,EAAI,OAAO,KAAK,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;CACtD,IAAI,aAAe,GAAgB;EACjC,IAAI,IAAI;EACR,KAAK,IAAM,KAAK,EAAI,OAAO,KAAK,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG;EAC9D,OAAO,CAAC,KAAK,CAAC;CAChB;CACA,IAAI,aAAe,GAA0B;EAC3C,IAAI,IAAI;EACR,KAAK,IAAM,KAAS,EAAI,QACtB,KAAK,IAAM,KAAK,EAAM,OAAO,KAAK,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG;EAClE,OAAO,CAAC,KAAK,CAAC;CAChB;CACA,IAAI,aAAe,GAKjB,OAFI,MAAM,EAAI,KAAK,IAAU,CAAC,KAAK,KAAK,IACpC,OAAO,GAAG,EAAI,OAAO,EAAE,IAAU,CAAC,KAAK,IAAI,IACxC,CAAC,KAAK,OAAO,EAAI,KAAK,CAAC;CAEhC,IAAI,aAAe,GAAY,OAAO,CAAC,KAAK,EAAI,KAAK;CACrD,IAAI,aAAe,GAAW,OAAO,CAAC,KAAK,EAAI,MAAM,IAAI,CAAiB,CAAC;CAC3E,IAAI,aAAe,GAAS;EAG1B,IAAM,IAAQ,EAAI,QAAQ,KAAK,CAAC,GAAG,OAAO,CACxC,EAAkB,CAAC,GACnB,EAAkB,CAAC,CACrB,CAAC;EAMD,OALA,EAAM,MAAM,GAAG,MAAM;GACnB,IAAM,IAAK,KAAK,UAAU,EAAE,EAAE,GACxB,IAAK,KAAK,UAAU,EAAE,EAAE;GAC9B,OAAO,IAAK,IAAK,KAAK,MAAK;EAC7B,CAAC,GACM,CAAC,KAAK,CAAK;CACpB;CACA,IAAI,aAAe,GACjB,OAAO;EAAC;EAAK,OAAO,EAAI,GAAG;EAAG,EAAkB,EAAI,OAAO;CAAC;CAE9D,IAAM,IAAQ,EAAI,OAAO,GACrB,IAAM;CACV,KAAK,IAAM,KAAK,GAAO,KAAO,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG;CAC5D,OAAO,CAAC,KAAK,CAAG;AAClB;AAEA,SAAS,GAAe,GAAuB;CAC7C,OAAO,KAAK,UAAU,EAAkB,CAAG,CAAC;AAC9C;AAMA,SAAS,EACP,GACA,GACA,GACuC;CACvC,IAAI,KAAM,IACR,OAAO;EAAE,OAAO,OAAO,CAAE;EAAG,YAAY;CAAO;CAEjD,QAAQ,GAAR;EACE,KAAA,IAEE,OADI,IAAS,IAAI,EAAK,cAAY,EAAY,yBAAyB,GAChE;GAAE,OAAO,OAAO,EAAK,SAAS,CAAM,CAAC;GAAG,YAAY,IAAS;EAAE;EACxE,KAAA,IAEE,OADI,IAAS,IAAI,EAAK,cAAY,EAAY,yBAAyB,GAChE;GACL,OAAO,OAAO,EAAK,UAAU,GAAQ,EAAK,CAAC;GAC3C,YAAY,IAAS;EACvB;EACF,KAAA,IAEE,OADI,IAAS,IAAI,EAAK,cAAY,EAAY,yBAAyB,GAChE;GACL,OAAO,OAAO,EAAK,UAAU,GAAQ,EAAK,CAAC;GAC3C,YAAY,IAAS;EACvB;EACF,KAAA,IAEE,OADI,IAAS,IAAI,EAAK,cAAY,EAAY,yBAAyB,GAChE;GACL,OAAO,EAAK,aAAa,GAAQ,EAAK;GACtC,YAAY,IAAS;EACvB;EACF,SACE,EAAY,mCAAmC,GAAI;CACvD;AACF;AAMA,SAAS,EACP,GACA,GACA,GACc;CACd,IAAM,IAAc,GACd,IAAS,GAAgB,GAAM,GAAQ,CAAO;CAGpD,OAFA,EAAO,MAAM,QAAQ,GACrB,EAAO,MAAM,MAAM,EAAO,YACnB;AACT;AAEA,SAAS,GACP,GACA,GACA,GACc;CACd,AAAI,KAAU,EAAK,cAAY,EAAY,yBAAyB;CAEpE,IAAM,IAAc,EAAK,SAAS,GAAQ,GACpC,IAAK,KAAe,GACpB,IAAK,IAAc;CAEzB,QAAQ,GAAR;EAEE,KAAA,GAAc;GACZ,IAAM,EAAE,UAAO,kBAAe,EAAa,GAAM,GAAQ,CAAE;GAC3D,OAAO;IAAE,OAAO,IAAI,EAAS,CAAK;IAAG;GAAW;EAClD;EAGA,KAAA,GAAc;GACZ,IAAM,EAAE,UAAO,kBAAe,EAAa,GAAM,GAAQ,CAAE;GAE3D,OAAO;IAAE,OAAO,IAAI,EAAS,CAAC,KAAK,CAAK;IAAG;GAAW;EACxD;EAGA,KAAA,GAAe;GACb,IAAI,MAAA,IAAsB;IACxB,IAAM,IAA2B,CAAC,GAC9B,IAAM;IACV,SAAa;KAGX,IAFI,KAAO,EAAK,cACd,EAAY,0CAA0C,GACpD,EAAK,SAAS,CAAG,MAAA,KAAkB;MACrC;MACA;KACF;KACA,IAAM,IAAS,EAAW,GAAM,GAAK,CAAO;KAO5C,AANM,EAAO,iBAAiB,KAC5B,EACE,oEACF,GAEF,EAAO,KAAK,EAAO,KAAK,GACxB,IAAM,EAAO;IACf;IACA,OAAO;KAAE,OAAO,IAAI,EAAyB,CAAM;KAAG,YAAY;IAAI;GACxE;GACA,IAAM,EAAE,OAAO,GAAK,YAAY,MAAe,EAC7C,GACA,GACA,CACF,GACM,IAAS,OAAO,CAAG;GAQzB,OAPI,IAAa,IAAS,EAAK,cAC7B,EAAY,kCAAkC,GAMzC;IACL,OAAO,IAAI,EAAe,IANV,WAChB,EAAK,QACL,EAAK,aAAa,GAClB,CAG0B,EAAM,MAAM,CAAC;IACvC,YAAY,IAAa;GAC3B;EACF;EAGA,KAAA,GAAc;GACZ,IAAI,MAAA,IAAsB;IACxB,IAAM,IAA2B,CAAC,GAC9B,IAAM;IACV,SAAa;KAGX,IAFI,KAAO,EAAK,cACd,EAAY,0CAA0C,GACpD,EAAK,SAAS,CAAG,MAAA,KAAkB;MACrC;MACA;KACF;KACA,IAAM,IAAS,EAAW,GAAM,GAAK,CAAO;KAO5C,AANM,EAAO,iBAAiB,KAC5B,EACE,oEACF,GAEF,EAAO,KAAK,EAAO,KAAK,GACxB,IAAM,EAAO;IACf;IACA,OAAO;KAAE,OAAO,IAAI,EAAyB,CAAM;KAAG,YAAY;IAAI;GACxE;GACA,IAAM,EAAE,OAAO,GAAK,YAAY,MAAe,EAC7C,GACA,GACA,CACF,GACM,IAAS,OAAO,CAAG;GACzB,AAAI,IAAa,IAAS,EAAK,cAC7B,EAAY,kCAAkC;GAChD,IAAM,IAAQ,IAAI,WAChB,EAAK,QACL,EAAK,aAAa,GAClB,CACF,GACI,GACA;GACJ,IAAI;IACF,IAAO,GAAkB,OAAO,CAAK;GACvC,QAAQ;IAON,AANA,IAAc,EACZ,yCACA,GACA,CACF,GAEA,IAAO,GAAmB,OAAO,CAAK;GACxC;GACA,IAAM,IAAW,IAAI,EAAe,CAAI;GAExC,OADI,KAAa,GAAW,GAAU,CAAW,GAC1C;IAAE,OAAO;IAAU,YAAY,IAAa;GAAO;EAC5D;EAGA,KAAA,GAAe;GACb,IAAI,MAAA,IAAsB;IACxB,IAAM,IAAoB,CAAC,GACvB,IAAM;IACV,SAAa;KAGX,IAFI,KAAO,EAAK,cACd,EAAY,oCAAoC,GAC9C,EAAK,SAAS,CAAG,MAAA,KAAkB;MACrC;MACA;KACF;KACA,IAAM,IAAS,EAAW,GAAM,GAAK,CAAO;KAE5C,AADA,EAAM,KAAK,EAAO,KAAK,GACvB,IAAM,EAAO;IACf;IACA,OAAO;KACL,OAAO,IAAI,EAAU,GAAO,EAAE,kBAAkB,GAAK,CAAC;KACtD,YAAY;IACd;GACF;GACA,IAAM,EAAE,OAAO,GAAO,YAAY,MAAe,EAC/C,GACA,GACA,CACF,GACM,IAAS,OAAO,CAAK,GACrB,IAAoB,CAAC,GACvB,IAAM;GACV,KAAK,IAAI,IAAI,GAAG,IAAI,GAAQ,KAAK;IAC/B,IAAM,IAAS,EAAW,GAAM,GAAK,CAAO;IAE5C,AADA,EAAM,KAAK,EAAO,KAAK,GACvB,IAAM,EAAO;GACf;GACA,OAAO;IAAE,OAAO,IAAI,EAAU,CAAK;IAAG,YAAY;GAAI;EACxD;EAGA,KAAA,GAAa;GACX,IAAI,MAAA,IAAsB;IACxB,IAAM,IAAkC,CAAC,GACnC,oBAAgB,IAAI,IAAY,GAChC,IAAoC,CAAC,GACvC,IAAM;IACV,SAAa;KAGX,IAFI,KAAO,EAAK,cACd,EAAY,kCAAkC,GAC5C,EAAK,SAAS,CAAG,MAAA,KAAkB;MACrC;MACA;KACF;KACA,IAAM,IAAY,EAAW,GAAM,GAAK,CAAO,GACzC,IAAS,GAAe,EAAU,KAAK;KAW7C,AAVI,EAAc,IAAI,CAAM,KAC1B,EAAiB,KACf,EACE,+BAA+B,EAAU,MAAM,SAC/C,EAAU,MAAM,OAChB,CACF,CACF,GAEF,EAAc,IAAI,CAAM,GACxB,IAAM,EAAU;KAChB,IAAM,IAAY,EAAW,GAAM,GAAK,CAAO;KAE/C,AADA,IAAM,EAAU,YAChB,EAAQ,KAAK,CAAC,EAAU,OAAO,EAAU,KAAK,CAAC;IACjD;IACA,IAAM,IAAe,IAAI,EAAQ,GAAS,EAAE,kBAAkB,GAAK,CAAC;IACpE,KAAK,IAAM,KAAK,GAAkB,GAAW,GAAc,CAAC;IAC5D,OAAO;KAAE,OAAO;KAAc,YAAY;IAAI;GAChD;GACA,IAAM,EAAE,OAAO,GAAO,YAAY,MAAiB,EACjD,GACA,GACA,CACF,GACM,IAAS,OAAO,CAAK,GACrB,IAAkC,CAAC,GACnC,oBAAW,IAAI,IAAY,GAC3B,IAA+B,CAAC,GAClC,IAAM;GACV,KAAK,IAAI,IAAI,GAAG,IAAI,GAAQ,KAAK;IAC/B,IAAM,IAAY,EAAW,GAAM,GAAK,CAAO,GACzC,IAAS,GAAe,EAAU,KAAK;IAW7C,AAVI,EAAS,IAAI,CAAM,KACrB,EAAY,KACV,EACE,+BAA+B,EAAU,MAAM,SAC/C,EAAU,MAAM,OAChB,CACF,CACF,GAEF,EAAS,IAAI,CAAM,GACnB,IAAM,EAAU;IAChB,IAAM,IAAY,EAAW,GAAM,GAAK,CAAO;IAE/C,AADA,IAAM,EAAU,YAChB,EAAQ,KAAK,CAAC,EAAU,OAAO,EAAU,KAAK,CAAC;GACjD;GACA,IAAM,IAAU,IAAI,EAAQ,CAAO;GACnC,KAAK,IAAM,KAAK,GAAa,GAAW,GAAS,CAAC;GAClD,OAAO;IAAE,OAAO;IAAS,YAAY;GAAI;EAC3C;EAGA,KAAA,GAAa;GACX,AAAI,MAAA,MACF,EAAY,4CAA4C;GAC1D,IAAM,EAAE,OAAO,GAAQ,YAAY,MAAiB,EAClD,GACA,GACA,CACF,GACM,IAAgB,EAAW,GAAM,GAAc,CAAO;GAC5D,KAAK,IAAM,KAAO,CAChB,GAAI,GAAS,cAAc,CAAC,GAC5B,GAAG,CACL,GACE,IAAI,EAAI,UAAU;IAChB,IAAM,IAAS,EAAI,SAAS,GAAQ,EAAc,OAAO,CAAO;IAChE,IAAI,MAAW,KAAA,GACb,OAAO;KAAE,OAAO;KAAQ,YAAY,EAAc;IAAW;GACjE;GAEF,OAAO;IACL,OAAO,IAAI,EAAQ,GAAQ,EAAc,KAAK;IAC9C,YAAY,EAAc;GAC5B;EACF;EAGA,KAAA;GAEE,IAAI,KAAM,IACR,OAAO;IAAE,OAAO,IAAI,EAAW,CAAE;IAAG,YAAY;GAAO;GAGzD,IAAI,MAAO,IAAI,OAAO;IAAE,OAAO,EAAW;IAAO,YAAY;GAAO;GACpE,IAAI,MAAO,IAAI,OAAO;IAAE,OAAO,EAAW;IAAM,YAAY;GAAO;GACnE,IAAI,MAAO,IAAI,OAAO;IAAE,OAAO,EAAW;IAAM,YAAY;GAAO;GACnE,IAAI,MAAO,IAAI,OAAO;IAAE,OAAO,EAAW;IAAW,YAAY;GAAO;GAGxE,IAAI,MAAA,IAAiB;IACnB,AAAI,IAAS,IAAI,EAAK,cACpB,EAAY,yBAAyB;IACvC,IAAM,IAAY,EAAK,SAAS,CAAM;IACtC,IAAI,IAAY,IAAI;KAClB,IAAM,IAAI,EACR,gBAAgB,EAAU,yEAC1B,IAAS,GACT,CACF,GAEM,IAAa,IAAI,EAAW,CAAS;KAE3C,OADA,GAAW,GAAY,CAAC,GACjB;MAAE,OAAO;MAAY,YAAY,IAAS;KAAE;IACrD;IACA,OAAO;KAAE,OAAO,IAAI,EAAW,CAAS;KAAG,YAAY,IAAS;IAAE;GACpE;GA6CA,OA1CI,MAAA,MACE,IAAS,IAAI,EAAK,cACpB,EAAY,yBAAyB,GAEhC;IACL,OAAO,IAAI,EAAU,EAFV,EAAK,UAAU,GAAQ,EAEQ,CAAI,GAAG,EAC/C,WAAW,OACb,CAAC;IACD,YAAY,IAAS;GACvB,KAIE,MAAA,MACE,IAAS,IAAI,EAAK,cACpB,EAAY,yBAAyB,GAChC;IACL,OAAO,IAAI,EAAU,EAAK,WAAW,GAAQ,EAAK,GAAG,EACnD,WAAW,SACb,CAAC;IACD,YAAY,IAAS;GACvB,KAIE,MAAA,MACE,IAAS,IAAI,EAAK,cACpB,EAAY,yBAAyB,GAChC;IACL,OAAO,IAAI,EAAU,EAAK,WAAW,GAAQ,EAAK,GAAG,EACnD,WAAW,SACb,CAAC;IACD,YAAY,IAAS;GACvB,MAIE,IAAA,MACF,EAAY,mDAAmD,GAAI,GAI9D,EACL,sDACF;CAEJ;CAEA,OAAO,EAAY,uBAAuB,GAAI;AAChD;AAIA,SAAS,GAAa,GAAqD;CACzE,IACE,aAAgB,eACf,OAAO,oBAAsB,OAC5B,aAAgB,mBAElB,OAAO,IAAI,WAAW,CAAI;CAE5B,IAAI,YAAY,OAAO,CAAI,GACzB,OAAO,IAAI,WAAW,EAAK,QAAQ,EAAK,YAAY,EAAK,UAAU;CAErE,MAAU,UAAU,6CAA6C;AACnE;AAUA,SAAgB,GACd,GACA,GACU;CACV,IAAM,IAAQ,GAAa,CAAK,GAC1B,IAAO,IAAI,SAAS,EAAM,QAAQ,EAAM,YAAY,EAAM,UAAU,GACpE,IAAS,GAAS,UAAU;CAClC,IAAI,CAAC,OAAO,UAAU,CAAM,KAAK,IAAS,KAAK,IAAS,EAAK,YAC3D,MAAU,WACR,uDAAuD,EAAK,YAC9D;CAEF,IAAM,EAAE,UAAO,kBAAe,EAAW,GAAM,GAAQ,CAAO;CAM9D,OALI,CAAC,GAAS,iBAAiB,MAAe,EAAK,cACjD,EACE,GAAG,EAAK,aAAa,EAAW,yCAClC,GAEK;AACT;;;AChjBA,IAAa,KAAgB,KCZhB,IAAsC;CACjD;CACA;CACA;CACA;CACA;EDUA,YAAY,CAAC,EAAa;EAE1B,SACE,GACA,GACA,GACsB;GAEtB,IADI,MAAA,OACA,EAAE,aAAiB,IAAiB;GAGxC,IAAM,IAA4C,IAC9C;IACE,YAAY,EAAQ;IACpB,QAAQ,EAAQ;IAChB,WAAW,EAAQ;IACnB,QAAQ,EAAQ;GAClB,IACA,KAAA;GACJ,IAAI;IAEF,OAAO,IAAI,EAAQ,IAAe,IAAI,EAAiB,CADvC,GAAW,EAAM,OAAO,CACgB,CAAO,CAAC,CAAC;GACnE,SAAS,GAAG;IACV,IAAI,GAAc,WAAW,IAE3B,MAAM;IAGR;GACF;EACF;CCxCA;AACF;;;ACuBA,SAAgB,EAAO,GAAgB,GAAmC;CACxE,IAAI,GAAS,UAAU;EACrB,IAAM,EAAE,aAAU,GAAG,MAAS,GACxB,IAAW,GACf,GACA,GACA,EAAK,YACL,EAAK,cACP;EAEA,OADI,MAAa,IAAkB,EAAW,YACvC,EACL,GACA,OAAO,KAAK,CAAI,EAAE,SAAS,IAAK,IAAyB,KAAA,CAC3D;CACF;CACA,OAAO,GAAQ,GAAO,GAAS,EAAI;AACrC;AAEA,SAAS,GACP,GACA,GACA,GACU;CAEV,KAAK,IAAM,KAAO,CAAC,GAAI,GAAS,cAAc,CAAC,GAAI,GAAG,CAAkB,GACtE,IAAI,EAAI,QAAQ;EACd,IAAM,IAAS,EAAI,OAAO,GAAO,KAAW,CAAC,CAAC;EAC9C,IAAI,MAAW,KAAA,GAAW,OAAO;CACnC;CASF,IACE,KACA,OAAO,KAAU,YACjB,KACA,EAAI,UAAW,GACf;EACA,IAAM,IAAO,EAAiC,EAAI,SAC5C,IAAa,GAAQ,GAAO,GAAS,EAAK;EAChD,KAAK,IAAM,KAAO,CAAC,GAAI,GAAS,cAAc,CAAC,GAAI,GAAG,CAAkB,GACtE,IAAI,EAAI,UAAU;GAChB,IAAM,IAAS,EAAI,SAAS,GAAK,CAAU;GAC3C,IAAI,MAAW,KAAA,GAAW,OAAO;EACnC;EAEF,OAAO,IAAI,EAAQ,GAAK,CAAU;CACpC;CAMA,IAAI,aAAiB,EAAI,MAAM,OAAO,EAAW;CACjD,IAAI,aAAiB,EAAI,WAAW,OAAO,EAAW;CACtD,IAAI,aAAiB,GAAQ,OAAO,IAAI,EAAW,EAAM,KAAK;CAG9D,IAAI,MAAU,MAAM,OAAO,EAAW;CACtC,IAAI,MAAU,KAAA,GAAW,OAAO,EAAW;CAC3C,IAAI,MAAU,IAAM,OAAO,EAAW;CACtC,IAAI,MAAU,IAAO,OAAO,EAAW;CAEvC,IAAI,OAAO,KAAU,UAGnB,OAFI,IAAQ,wBAA+B,IAAI,EAAY,CAAK,IAC5D,IAAQ,CAAE,wBAAqC,IAAI,EAAY,CAAK,IACjE,KAAS,KAAK,IAAI,EAAS,CAAK,IAAI,IAAI,EAAS,CAAK;CAG/D,IAAI,OAAO,KAAU,UAUnB,QATkB,GAAS,mBAAmB,WAE9B,SACd,OAAO,UAAU,CAAK,KACtB,CAAC,OAAO,GAAG,GAAO,EAAE,IAEhB,KAAS,IAAU,IAAI,EAAS,OAAO,CAAK,CAAC,IAC1C,IAAI,EAAS,OAAO,CAAK,CAAC,IAE5B,IAAI,EAAU,CAAK;CAG5B,IAAI,OAAO,KAAU,UAAU,OAAO,IAAI,EAAe,CAAK;CAO9D,IAJI,aAAiB,UACjB,aAAiB,WACjB,aAAiB,UAEjB,OAAO,UAAU,SAAS,KAAK,CAAK,MAAM,mBAC5C,OAAO,GAAS,EAAgC,QAAQ,GAAG,GAAS,EAAK;CAG3E,IACE,aAAiB,eAChB,OAAO,oBAAsB,OAC5B,aAAiB,mBAEnB,OAAO,IAAI,EAAe,IAAI,WAAW,CAAoB,CAAC;CAIhE,IAAI,YAAY,OAAO,CAAK,GAI1B,OAHI,aAAiB,cAAc,GAAS,iBAAiB,UACpD,IAAI,EAAU,MAAM,KAAK,IAAQ,MAAM,IAAI,EAAS,OAAO,CAAC,CAAC,CAAC,CAAC,IAEjE,IAAI,EACT,IAAI,WAAW,EAAM,QAAQ,EAAM,YAAY,EAAM,UAAU,CACjE;CAGF,IAAI,aAAiB,GACnB,OAAO,IAAI,EACT,CAAC,GAAG,CAAK,EAAE,KACR,CAAC,GAAG,OACH,CAAC,EAAO,GAAG,CAAO,GAAG,EAAO,GAAG,CAAO,CAAC,CAC3C,CACF;CAGF,IAAI,MAAM,QAAQ,CAAK,GACrB,OAAO,IAAI,EAAU,EAAM,KAAK,MAAS,EAAO,GAAM,CAAO,CAAC,CAAC;CAGjE,IAAI,OAAO,KAAU,UAAU;EAC7B,IAAM,IAAkC,CAAC;EACzC,KAAK,IAAM,CAAC,GAAG,MAAM,OAAO,QAAQ,CAAgC,GAClE,EAAQ,KAAK,CAAC,IAAI,EAAe,CAAC,GAAG,EAAO,GAAG,CAAO,CAAC,CAAC;EAE1D,OAAO,IAAI,EAAQ,CAAO;CAC5B;CAEA,MAAU,UAAU,mCAAmC,OAAO,GAAO;AACvE;AAQA,SAAS,GAAmB,GAAoB;CAC9C,OACE,YAAY,OAAO,CAAC,KACpB,aAAa,eACZ,OAAO,oBAAsB,OAC5B,aAAa,qBACf,aAAa,UACb,aAAa,WACb,aAAa,UACb,OAAO,UAAU,SAAS,KAAK,CAAC,MAAM,qBACtC,aAAa,EAAI,QACjB,aAAa,EAAI,aACjB,aAAa;AAEjB;AAEA,SAAgB,GACd,GACA,GACA,GACA,GACS;CACT,IAAM,IAAoC,CACxC,GAAI,KAAc,CAAC,GACnB,GAAG,CACL;CAGA,SAAS,EAAO,GAAqB;EACnC,OAAO,MAAM,KAAc,MAAmB,MAAQ,MAAM,KAAA;CAC9D;CAEA,IAAI,MAAM,QAAQ,CAAQ,GAAG;EAC3B,IAAM,IAAW,EAAiC,IAAI,MAAM;EAC5D,SAAS,EAAW,GAAqB;GACvC,IAAkB,OAAO,KAAM,aAA3B,GAAqC,OAAO;GAChD,IAAI,aAAa,GACf,OAAO,EAAW,KAChB,IACC,CAAC,GAAG,OAAS,CAAC,GAAG,EAAW,CAAG,CAAC,CACnC;GACF,IAAI,MAAM,QAAQ,CAAC,GAAG,OAAO,EAAE,IAAI,CAAU;GAM7C,IAJI,EAAI,UAAW,KAEf,GAAmB,CAAW,KAE9B,EAAQ,MAAM,MAAQ,EAAI,WAAW,CAAC,CAAC,GAAG,OAAO;GAErD,IAAM,IAAQ,OAAO,eAAe,CAAW;GAC/C,IAAI,MAAU,OAAO,aAAa,MAAU,MAAM;IAChD,IAAM,IAAU,EAA8B;IAC9C,IAAI,OAAO,KAAW,YACpB,OAAO,EAAY,EAAyB,KAAK,CAAC,CAAC;GACvD;GACA,IAAM,IAAkC,CAAC;GACzC,KAAK,IAAM,KAAK,GACd,AAAI,OAAO,UAAU,eAAe,KAAK,GAAG,CAAC,MAC3C,EAAO,KAAK,EAAY,EAA8B,EAAE;GAE5D,OAAO;EACT;EACA,OAAO,EAAW,CAAK;CACzB;CAEA,IAAM,IAAK;CACX,SAAS,EAAQ,GAAc,GAAc,GAA0B;EAKrE,IAEE,OAAO,KAAQ,YADf,KAEA,EAAE,aAAe,IACjB;GACA,IAAM,IAAQ,OAAO,eAAe,CAAa;GACjD,IAAI,MAAU,OAAO,aAAa,MAAU,MAAM;IAChD,IAAM,IAAU,EAAgC;IAChD,AAAI,OAAO,KAAW,eACpB,IAAO,EAAmC,KAAK,GAAK,CAAG;GAC3D;EACF;EAEA,IADA,IAAM,EAAG,KAAK,GAAQ,GAAK,CAAG,GACV,OAAO,KAAQ,YAA/B,GAAyC;GAE3C,IAAI,EAAI,UAAW,GAAgB,OAAO;GAC1C,IAAI,aAAe,GAAY;IAC7B,IAAM,IAAS,IAAI,EAAW;IAC9B,KAAK,IAAM,CAAC,GAAG,MAAM,GAAK;KACxB,IAAM,IAAO,EAAQ,GAAG,GAAG,CAAG;KAC9B,AAAK,EAAO,CAAI,KAAG,EAAO,KAAK,CAAC,GAAG,CAAI,CAAC;IAC1C;IACA,OAAO;GACT;GACA,IAAI,MAAM,QAAQ,CAAG,GACnB,OAAQ,EAAkB,KAAK,GAAG,MAAM;IACtC,IAAM,IAAQ,EAAQ,GAAG,OAAO,CAAC,GAAG,CAAG;IAEvC,OAAO,EAAO,CAAK,IAAI,OAAO;GAChC,CAAC;GAKH,IAFI,GAAmB,CAAa,KAEhC,EAAQ,MAAM,MAAQ,EAAI,WAAW,CAAG,CAAC,GAAG,OAAO;GACvD,IAAM,IAAkC,CAAC;GACzC,KAAK,IAAM,KAAK,OAAO,KAAK,CAAa,GAAG;IAC1C,IAAM,IAAQ,EAAS,EAAgC,IAAI,GAAG,CAAG;IACjE,AAAK,EAAO,CAAK,MAAG,EAAO,KAAK;GAClC;GACA,OAAO;EACT;EACA,OAAO;CACT;CACA,OAAO,EAAQ,GAAO,IAAI,EAAE,IAAI,EAAM,CAAC;AACzC;;;ACxSA,IAAa,IAAb,cAAgC,MAA0B;CACxD,SAAkC;EAChC,IAAM,IAAkC,CAAC;EACzC,KAAK,IAAM,CAAC,GAAG,MAAM,MAAM;GACzB,IAAM,IAAM,OAAO,KAAM,WAAW,IAAI,EAAO,CAAC,EAAE,MAAM;GACxD,AAAI,MAAQ,cACV,OAAO,eAAe,GAAQ,GAAK;IACjC,OAAO;IACP,UAAU;IACV,YAAY;IACZ,cAAc;GAChB,CAAC,IAED,EAAO,KAAO;EAElB;EACA,OAAO;CACT;AACF"}
|