@shbernal/ts-pptx 3.2.0 → 3.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +19 -20
- package/dist/{autopage-QQyfRtoK.js → autopage-D1sqK6j7.js} +16 -15
- package/dist/{autopage-QQyfRtoK.js.map → autopage-D1sqK6j7.js.map} +1 -1
- package/dist/browser.d.ts +6 -6
- package/dist/browser.js +5 -6
- package/dist/browser.js.map +1 -1
- package/dist/{diagnostics-Chjz_4_Q.d.ts → diagnostics-B2yWpcjB.d.ts} +31 -14
- package/dist/{diagnostics-Chjz_4_Q.d.ts.map → diagnostics-B2yWpcjB.d.ts.map} +1 -1
- package/dist/{diagnostics-DYQC7xLV.js → diagnostics-H1QzgRSw.js} +0 -0
- package/dist/{diagnostics-DYQC7xLV.js.map → diagnostics-H1QzgRSw.js.map} +1 -1
- package/dist/{enums-CoXnxiCI.d.ts → enums-CvRYniUA.d.ts} +13 -3
- package/dist/{enums-CoXnxiCI.d.ts.map → enums-CvRYniUA.d.ts.map} +1 -1
- package/dist/{errors-BVLCFr-t.d.ts → errors-fB1KDJKQ.d.ts} +5 -5
- package/dist/{errors-BVLCFr-t.d.ts.map → errors-fB1KDJKQ.d.ts.map} +1 -1
- package/dist/{fit-DhMbQG5O.js → fit-CYJ1jkQI.js} +0 -0
- package/dist/fit-CYJ1jkQI.js.map +1 -0
- package/dist/{html-dom-DajBuobe.js → html-dom-CzewEdE1.js} +4 -5
- package/dist/{html-dom-DajBuobe.js.map → html-dom-CzewEdE1.js.map} +1 -1
- package/dist/html.d.ts +3 -3
- package/dist/html.js +1 -1
- package/dist/index.d.ts +6 -6
- package/dist/index.js +5 -6
- package/dist/index.js.map +1 -1
- package/dist/inspect.d.ts +1 -1
- package/dist/inspect.js +4 -4
- package/dist/math.d.ts +1 -1
- package/dist/measure.d.ts +96 -6
- package/dist/measure.d.ts.map +1 -1
- package/dist/measure.js +2 -2
- package/dist/node.d.ts +6 -6
- package/dist/node.js +4 -5
- package/dist/node.js.map +1 -1
- package/dist/notes-SCvpJz0l.js +1646 -0
- package/dist/notes-SCvpJz0l.js.map +1 -0
- package/dist/{pres-C-EU3SkN.d.ts → pres-Cb-1xDne.d.ts} +4 -4
- package/dist/{pres-C-EU3SkN.d.ts.map → pres-Cb-1xDne.d.ts.map} +1 -1
- package/dist/{presentation-CxnUVhK9.js → presentation-DeKTJGHf.js} +1002 -422
- package/dist/presentation-DeKTJGHf.js.map +1 -0
- package/dist/{presentation-Osx1cDdJ.d.ts → presentation-types-B50aOUFI.d.ts} +679 -11
- package/dist/presentation-types-B50aOUFI.d.ts.map +1 -0
- package/dist/read.d.ts +4 -5
- package/dist/read.d.ts.map +1 -1
- package/dist/read.js +2 -2
- package/dist/script.d.ts +2 -2
- package/dist/script.d.ts.map +1 -1
- package/dist/script.js +0 -0
- package/dist/script.js.map +1 -1
- package/dist/{shapes-DoJBPrwN.js → shapes-BXVgsk0F.js} +3 -3
- package/dist/{shapes-DoJBPrwN.js.map → shapes-BXVgsk0F.js.map} +1 -1
- package/dist/{slide-BTfn1Pyp.d.ts → slide-DWw9UoI6.d.ts} +39 -3
- package/dist/slide-DWw9UoI6.d.ts.map +1 -0
- package/dist/{st-enums-evQG2A7Z.js → st-enums-bVnezkMJ.js} +33 -12
- package/dist/{st-enums-evQG2A7Z.js.map → st-enums-bVnezkMJ.js.map} +1 -1
- package/dist/{text-C4P9MNdf.js → text-uM-zGton.js} +219 -1668
- package/dist/text-uM-zGton.js.map +1 -0
- package/dist/{units-internal-CR8s8YQa.js → units-internal-CGf4VrXy.js} +156 -4
- package/dist/units-internal-CGf4VrXy.js.map +1 -0
- package/dist/zip.d.ts +2 -2
- package/package.json +36 -27
- package/dist/embedded-fonts-MaynAHa9.js +0 -94
- package/dist/embedded-fonts-MaynAHa9.js.map +0 -1
- package/dist/fit-DhMbQG5O.js.map +0 -1
- package/dist/presentation-CxnUVhK9.js.map +0 -1
- package/dist/presentation-Osx1cDdJ.d.ts.map +0 -1
- package/dist/presentation-types-Dj4riuDs.d.ts +0 -538
- package/dist/presentation-types-Dj4riuDs.d.ts.map +0 -1
- package/dist/slide-BTfn1Pyp.d.ts.map +0 -1
- package/dist/text-C4P9MNdf.js.map +0 -1
- package/dist/units-C7QM1KgH.js +0 -144
- package/dist/units-C7QM1KgH.js.map +0 -1
- package/dist/units-internal-CR8s8YQa.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"presentation-CxnUVhK9.js","names":["#defaults","#overrides","#dirty","textDecoder","textEncoder","#bytes","#dom","#dirty","#byId","#dirty","textEncoder","#parts","#contentTypesBytes","#relationshipsCache","#flushRelationships","#ph","#cNvPr","#themeContext","#spTree","#byType","#clrScheme","#themeElements","#cNvPr","#cSld","#relTarget","#spTree","#themeContext","childTnLst","#themeColors","#cSld","#spTree","#nextShapeId","#appendShape","textEncoder","textEncoder","#presentationPart","#insertSlidePart","#importContext","#rescaledParts","#importRegistry","#nextSlideId"],"sources":["../src/read/opc/content-types.ts","../src/read/opc/part.ts","../src/read/opc/relationships.ts","../src/read/opc/package.ts","../src/read/api/ops/flatten.ts","../src/read/api/slide-background.ts","../src/read/api/notes.ts","../src/read/api/comments.ts","../src/read/api/tags.ts","../src/read/api/chrome.ts","../src/read/api/transition.ts","../src/read/api/animation.ts","../src/read/api/slide.ts","../src/read/api/document-properties.ts","../src/read/oxml/slide-dom.ts","../src/read/api/ops/rescale.ts","../src/read/api/ops/table-styles.ts","../src/read/api/ops/master-registry.ts","../src/read/api/ops/part-copy.ts","../src/read/api/ops/carried-rels.ts","../src/read/api/ops/embedded-fonts.ts","../src/read/api/ops/flatten-context.ts","../src/read/api/ops/part-index.ts","../src/read/api/ops/import-slide.ts","../src/read/api/ops/notes-master.ts","../src/read/api/ops/prune.ts","../src/read/api/ops/rescale-import.ts","../src/read/api/presentation.ts"],"sourcesContent":["import { escapeXmlAttribute, getElements, parseXml } from '../oxml/dom.js'\nimport { partNameExtension } from './partnames.js'\nimport { PackageReadError } from '../../errors.js'\n\n/**\n * Overlay over `[Content_Types].xml`, used to resolve part content types at\n * load and to register new ones when parts are added. While clean, the original\n * bytes pass through verbatim on save (byte-identical); once a mutation marks it\n * dirty, `OpcPackage.save()` writes `serialize()` instead.\n */\nexport class ContentTypes {\n\t#defaults = new Map<string, string>()\n\t#overrides = new Map<string, string>()\n\t#dirty = false\n\n\tstatic parse(xml: string): ContentTypes {\n\t\tconst contentTypes = new ContentTypes()\n\t\tconst types = parseXml(xml).documentElement\n\t\tif (!types || types.localName !== 'Types')\n\t\t\tthrow new PackageReadError(\n\t\t\t\t'package/content-types-invalid-root',\n\t\t\t\t'[Content_Types].xml: expected <Types> root element'\n\t\t\t)\n\t\tfor (const element of getElements(types, 'ct:Default')) {\n\t\t\tconst extension = element.getAttribute('Extension')\n\t\t\tconst contentType = element.getAttribute('ContentType')\n\t\t\tif (!extension || !contentType)\n\t\t\t\tthrow new PackageReadError(\n\t\t\t\t\t'package/content-types-entry-incomplete',\n\t\t\t\t\t'[Content_Types].xml: <Default> missing Extension or ContentType'\n\t\t\t\t)\n\t\t\tcontentTypes.#defaults.set(extension.toLowerCase(), contentType)\n\t\t}\n\t\tfor (const element of getElements(types, 'ct:Override')) {\n\t\t\tconst partName = element.getAttribute('PartName')\n\t\t\tconst contentType = element.getAttribute('ContentType')\n\t\t\tif (!partName || !contentType)\n\t\t\t\tthrow new PackageReadError(\n\t\t\t\t\t'package/content-types-entry-incomplete',\n\t\t\t\t\t'[Content_Types].xml: <Override> missing PartName or ContentType'\n\t\t\t\t)\n\t\t\tcontentTypes.#overrides.set(partName, contentType)\n\t\t}\n\t\treturn contentTypes\n\t}\n\n\t/** Exact `Override` match first, else `Default` by lowercased extension. */\n\tcontentTypeFor(partName: string): string | undefined {\n\t\treturn this.#overrides.get(partName) ?? this.#defaults.get(partNameExtension(partName))\n\t}\n\n\t/** True once a registration changed the overlay; `serialize()` is then authoritative. */\n\tget isDirty(): boolean {\n\t\treturn this.#dirty\n\t}\n\n\t/**\n\t * Ensure `partName` resolves to `contentType`, adding the minimum needed.\n\t * A no-op when an existing `Default`/`Override` already resolves it to the\n\t * same type; otherwise an `Override` is added (always valid, never conflicts\n\t * with a differing `Default`).\n\t */\n\tensureRegistered(partName: string, contentType: string): void {\n\t\tif (this.contentTypeFor(partName) === contentType) return\n\t\tthis.#overrides.set(partName, contentType)\n\t\tthis.#dirty = true\n\t}\n\n\t/**\n\t * Drop the `Override` for `partName` if present (e.g. when a part is removed).\n\t * `Default` rules by extension are left untouched — they may still serve other\n\t * parts. Marks the overlay dirty when something was removed.\n\t */\n\tremoveOverride(partName: string): void {\n\t\tif (this.#overrides.delete(partName)) this.#dirty = true\n\t}\n\n\t/** Register a `Default` content type for a (lowercased) extension if absent. */\n\tensureDefault(extension: string, contentType: string): void {\n\t\tconst ext = extension.toLowerCase()\n\t\tif (this.#defaults.get(ext) === contentType) return\n\t\tthis.#defaults.set(ext, contentType)\n\t\tthis.#dirty = true\n\t}\n\n\tserialize(): string {\n\t\tconst lines: string[] = [\n\t\t\t'<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>',\n\t\t\t'<Types xmlns=\"http://schemas.openxmlformats.org/package/2006/content-types\">',\n\t\t]\n\t\tfor (const [extension, contentType] of this.#defaults) {\n\t\t\tlines.push(\n\t\t\t\t`<Default Extension=\"${escapeXmlAttribute(extension)}\" ContentType=\"${escapeXmlAttribute(contentType)}\"/>`\n\t\t\t)\n\t\t}\n\t\tfor (const [partName, contentType] of this.#overrides) {\n\t\t\tlines.push(\n\t\t\t\t`<Override PartName=\"${escapeXmlAttribute(partName)}\" ContentType=\"${escapeXmlAttribute(contentType)}\"/>`\n\t\t\t)\n\t\t}\n\t\tlines.push('</Types>')\n\t\treturn lines.join('')\n\t}\n}\n","import { parseXml, serializeXml, type Document } from '../oxml/dom.js'\nimport { InvalidOptionError } from '../../errors.js'\n\nconst textDecoder = new TextDecoder('utf-8')\nconst textEncoder = new TextEncoder()\n\nconst XML_DECLARATION_RE = /^\\uFEFF?<\\?xml[^>]*\\?>\\s*/\n\n/**\n * One OPC part. Holds the original bytes from the zip for its whole life;\n * parses to a DOM only on demand; serializes back to the original bytes\n * unless something mutated the DOM and called `markDirty()`.\n *\n * Untouched parts therefore round-trip byte-identically.\n */\nexport class Part {\n\treadonly partName: string\n\treadonly contentType: string\n\t#bytes: Uint8Array\n\t#dom: Document | null = null\n\t#dirty = false\n\n\tconstructor(partName: string, contentType: string, bytes: Uint8Array) {\n\t\tthis.partName = partName\n\t\tthis.contentType = contentType\n\t\tthis.#bytes = bytes\n\t}\n\n\t/** Whether this part's body is XML (by content type). */\n\tget isXmlPart(): boolean {\n\t\treturn (\n\t\t\tthis.contentType.endsWith('+xml') || this.contentType === 'application/xml' || this.contentType === 'text/xml'\n\t\t)\n\t}\n\n\t/** True once the body has been materialized as a DOM. */\n\tget isParsed(): boolean {\n\t\treturn this.#dom !== null\n\t}\n\n\t/** The original bytes from the package. Do not mutate. */\n\tget bytes(): Uint8Array {\n\t\treturn this.#bytes\n\t}\n\n\t/**\n\t * Lazily parsed DOM for XML parts. Parsing alone does not mark the part\n\t * dirty; call `markDirty()` after mutating the tree.\n\t */\n\tget dom(): Document {\n\t\tif (!this.isXmlPart)\n\t\t\tthrow new InvalidOptionError(\n\t\t\t\t'part/not-xml',\n\t\t\t\t`Part ${this.partName} (${this.contentType}) is not an XML part and has no DOM`\n\t\t\t)\n\t\tif (!this.#dom) this.#dom = parseXml(textDecoder.decode(this.#bytes))\n\t\treturn this.#dom\n\t}\n\n\t/** Call after mutating the DOM so `serialize()` reserializes this part. */\n\tmarkDirty(): void {\n\t\tif (!this.isXmlPart)\n\t\t\tthrow new InvalidOptionError(\n\t\t\t\t'part/not-xml',\n\t\t\t\t`Part ${this.partName} (${this.contentType}) is not an XML part and cannot be marked dirty`\n\t\t\t)\n\t\tthis.#dirty = true\n\t}\n\n\tget isDirty(): boolean {\n\t\treturn this.#dirty\n\t}\n\n\t/**\n\t * Bytes to write on save: the original bytes when clean (byte-identical),\n\t * the serialized DOM when dirty (semantically equivalent, schema-valid).\n\t */\n\tserialize(): Uint8Array {\n\t\tif (!this.#dirty) return this.#bytes\n\t\tlet xml = serializeXml(this.dom)\n\t\tif (!xml.startsWith('<?xml')) {\n\t\t\tconst declaration = XML_DECLARATION_RE.exec(textDecoder.decode(this.#bytes))?.[0]\n\t\t\txml = (declaration ?? '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\r\\n') + xml\n\t\t}\n\t\treturn textEncoder.encode(xml)\n\t}\n}\n","import { escapeXmlAttribute, getElements, parseXml } from '../oxml/dom.js'\nimport { resolveRelativePartName } from './partnames.js'\nimport { InvalidOptionError, PackageReadError } from '../../errors.js'\n\nexport interface Relationship {\n\tid: string\n\ttype: string\n\ttarget: string\n\ttargetMode?: 'Internal' | 'External'\n}\n\n/**\n * Overlay over one `.rels` part, keyed by relationship id. While clean, the\n * `.rels` bytes pass through verbatim on save (byte-identical); once `add()`\n * (or another mutation) marks it dirty, `OpcPackage.save()` writes\n * `serialize()` into the owning `.rels` part instead.\n */\nexport class Relationships {\n\t/** Partname of the part owning these relationships ('/' for package-level). */\n\treadonly sourcePartName: string\n\t#byId = new Map<string, Relationship>()\n\t#dirty = false\n\n\tprivate constructor(sourcePartName: string) {\n\t\tthis.sourcePartName = sourcePartName\n\t}\n\n\t/**\n\t * @param xml body of the `.rels` part\n\t * @param sourcePartName partname of the owning part ('/' for `/_rels/.rels`)\n\t */\n\tstatic parse(xml: string, sourcePartName: string): Relationships {\n\t\tconst relationships = new Relationships(sourcePartName)\n\t\tconst root = parseXml(xml).documentElement\n\t\tif (!root || root.localName !== 'Relationships')\n\t\t\tthrow new PackageReadError(\n\t\t\t\t'package/relationships-invalid-root',\n\t\t\t\t`Relationships of ${sourcePartName}: expected <Relationships> root element`\n\t\t\t)\n\t\tfor (const element of getElements(root, 'pr:Relationship')) {\n\t\t\tconst id = element.getAttribute('Id')\n\t\t\tconst type = element.getAttribute('Type')\n\t\t\tconst target = element.getAttribute('Target')\n\t\t\tif (!id || !type || !target)\n\t\t\t\tthrow new PackageReadError(\n\t\t\t\t\t'package/relationship-incomplete',\n\t\t\t\t\t`Relationships of ${sourcePartName}: <Relationship> missing Id, Type, or Target`\n\t\t\t\t)\n\t\t\tconst targetModeAttribute = element.getAttribute('TargetMode')\n\t\t\tconst targetMode =\n\t\t\t\ttargetModeAttribute === 'Internal' || targetModeAttribute === 'External' ? targetModeAttribute : undefined\n\t\t\tif (targetModeAttribute !== null && targetMode === undefined) {\n\t\t\t\tthrow new PackageReadError(\n\t\t\t\t\t'package/relationship-invalid-target-mode',\n\t\t\t\t\t`Relationships of ${sourcePartName}: invalid TargetMode \"${targetModeAttribute}\" on ${id}`\n\t\t\t\t)\n\t\t\t}\n\t\t\tconst relationship: Relationship = { id, type, target }\n\t\t\tif (targetMode) relationship.targetMode = targetMode\n\t\t\tif (relationships.#byId.has(id))\n\t\t\t\tthrow new PackageReadError(\n\t\t\t\t\t'package/duplicate-relationship-id',\n\t\t\t\t\t`Relationships of ${sourcePartName}: duplicate relationship id ${id}`\n\t\t\t\t)\n\t\t\trelationships.#byId.set(id, relationship)\n\t\t}\n\t\treturn relationships\n\t}\n\n\t/** Empty relationship set (for parts that have no `.rels`). */\n\tstatic empty(sourcePartName: string): Relationships {\n\t\treturn new Relationships(sourcePartName)\n\t}\n\n\tget size(): number {\n\t\treturn this.#byId.size\n\t}\n\n\t/** True once a relationship was added/changed; `serialize()` is then authoritative. */\n\tget isDirty(): boolean {\n\t\treturn this.#dirty\n\t}\n\n\t/**\n\t * Add a relationship and return it. Allocates an id `rId<n>` with `n` one\n\t * past the highest existing numeric id. `target` is relative to the source\n\t * part's directory for internal targets (e.g. `../media/image1.png`), or an\n\t * absolute URI for external ones. Marks this set dirty.\n\t */\n\tadd(type: string, target: string, targetMode?: 'Internal' | 'External'): Relationship {\n\t\tlet max = 0\n\t\tfor (const id of this.#byId.keys()) {\n\t\t\tconst match = /^rId(\\d+)$/.exec(id)\n\t\t\tif (match) max = Math.max(max, Number(match[1]))\n\t\t}\n\t\tconst id = `rId${max + 1}`\n\t\tconst relationship: Relationship = { id, type, target }\n\t\tif (targetMode) relationship.targetMode = targetMode\n\t\tthis.#byId.set(id, relationship)\n\t\tthis.#dirty = true\n\t\treturn relationship\n\t}\n\n\t/**\n\t * Add a relationship under a caller-chosen id and return it. Used when\n\t * rebuilding a copied part's relationships across a package boundary: keeping\n\t * each source id lets the copied part body's `r:id`/`r:embed` references stay\n\t * valid without rewriting the body. Throws if the id is already present.\n\t * Marks this set dirty.\n\t */\n\taddWithId(id: string, type: string, target: string, targetMode?: 'Internal' | 'External'): Relationship {\n\t\tif (this.#byId.has(id))\n\t\t\tthrow new InvalidOptionError(\n\t\t\t\t'relationship/duplicate-id',\n\t\t\t\t`Relationships of ${this.sourcePartName}: duplicate relationship id ${id}`\n\t\t\t)\n\t\tconst relationship: Relationship = { id, type, target }\n\t\tif (targetMode) relationship.targetMode = targetMode\n\t\tthis.#byId.set(id, relationship)\n\t\tthis.#dirty = true\n\t\treturn relationship\n\t}\n\n\t/**\n\t * Remove the relationship with `id` and return whether one was present. Used\n\t * when a referenced part is deleted (e.g. removing a slide drops the\n\t * presentation→slide relationship). Marks this set dirty when it removes one.\n\t */\n\tremove(id: string): boolean {\n\t\tconst removed = this.#byId.delete(id)\n\t\tif (removed) this.#dirty = true\n\t\treturn removed\n\t}\n\n\tget(id: string): Relationship | undefined {\n\t\treturn this.#byId.get(id)\n\t}\n\n\tbyType(type: string): Relationship[] {\n\t\treturn [...this.#byId.values()].filter((relationship) => relationship.type === type)\n\t}\n\n\t[Symbol.iterator](): IterableIterator<Relationship> {\n\t\treturn this.#byId.values()\n\t}\n\n\t/** Resolve an internal relationship's target to an absolute partname. */\n\tresolveTarget(id: string): string {\n\t\tconst relationship = this.#byId.get(id)\n\t\tif (!relationship)\n\t\t\tthrow new InvalidOptionError(\n\t\t\t\t'relationship/not-found',\n\t\t\t\t`Relationships of ${this.sourcePartName}: no relationship with id ${id}`\n\t\t\t)\n\t\tif (relationship.targetMode === 'External') {\n\t\t\tthrow new InvalidOptionError(\n\t\t\t\t'relationship/external-has-no-partname',\n\t\t\t\t`Relationships of ${this.sourcePartName}: ${id} is External (${relationship.target}) and has no partname`\n\t\t\t)\n\t\t}\n\t\treturn resolveRelativePartName(this.sourcePartName, relationship.target)\n\t}\n\n\tserialize(): string {\n\t\tconst lines: string[] = [\n\t\t\t'<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>',\n\t\t\t'<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">',\n\t\t]\n\t\tfor (const { id, type, target, targetMode } of this.#byId.values()) {\n\t\t\tconst mode = targetMode ? ` TargetMode=\"${targetMode}\"` : ''\n\t\t\tlines.push(\n\t\t\t\t`<Relationship Id=\"${escapeXmlAttribute(id)}\" Type=\"${escapeXmlAttribute(type)}\" Target=\"${escapeXmlAttribute(target)}\"${mode}/>`\n\t\t\t)\n\t\t}\n\t\tlines.push('</Relationships>')\n\t\treturn lines.join('')\n\t}\n}\n","import { ZipWriter, readZip } from '../../zip.js'\nimport { ContentTypes } from './content-types.js'\nimport { Part } from './part.js'\nimport { Relationships } from './relationships.js'\nimport { partNameToZipPath, relsPartNameFor, zipPathToPartName } from './partnames.js'\nimport { InvalidOptionError, PackageReadError } from '../../errors.js'\n\n/**\n * Input to {@link OpcPackage.load}. A `string` is a **filesystem path** (Node)\n * read from disk; pass `Uint8Array`/`ArrayBuffer`/`Blob`/`number[]` for an\n * in-memory archive. (A string is a path, not JSZip's latin1 binary content.)\n */\nexport type OpcInput = string | number[] | Uint8Array | ArrayBuffer | Blob\n\nconst CONTENT_TYPES_ZIP_PATH = '[Content_Types].xml'\nconst RELATIONSHIPS_CONTENT_TYPE = 'application/vnd.openxmlformats-package.relationships+xml'\n\nconst textDecoder = new TextDecoder('utf-8')\nconst textEncoder = new TextEncoder()\n\n/**\n * An OPC package loaded from `.pptx` bytes.\n *\n * Fidelity contract: parts that are never mutated (`Part.markDirty()`) are\n * written back byte-identically by `save()`. Whole-zip byte-identity is not\n * promised — zip metadata and compression may differ — but part bodies, the\n * part-name set, and part order are preserved.\n */\nexport class OpcPackage {\n\t/** All parts, keyed by partname (e.g. `/ppt/slides/slide1.xml`), in original zip order. */\n\t#parts: Map<string, Part>\n\t/** Content-type resolution + registration overlay. */\n\treadonly contentTypes: ContentTypes\n\t#contentTypesBytes: Uint8Array\n\t#relationshipsCache = new Map<string, Relationships>()\n\n\tprivate constructor(parts: Map<string, Part>, contentTypes: ContentTypes, contentTypesBytes: Uint8Array) {\n\t\tthis.#parts = parts\n\t\tthis.contentTypes = contentTypes\n\t\tthis.#contentTypesBytes = contentTypesBytes\n\t}\n\n\t/** All parts, keyed by partname, in zip/add order. */\n\tget parts(): ReadonlyMap<string, Part> {\n\t\treturn this.#parts\n\t}\n\n\tstatic async load(input: OpcInput): Promise<OpcPackage> {\n\t\tconst entries = await readZip(input)\n\t\tconst contentTypesBytes = entries.get(CONTENT_TYPES_ZIP_PATH)\n\t\tif (!contentTypesBytes)\n\t\t\tthrow new PackageReadError('package/not-an-opc-package', 'Not an OPC package: missing [Content_Types].xml')\n\t\tconst contentTypes = ContentTypes.parse(textDecoder.decode(contentTypesBytes))\n\n\t\tconst parts = new Map<string, Part>()\n\t\tfor (const [zipPath, bytes] of entries) {\n\t\t\tif (zipPath === CONTENT_TYPES_ZIP_PATH) continue\n\t\t\tconst partName = zipPathToPartName(zipPath)\n\t\t\t// PowerPoint leaves deleted parts in a `[trash]` folder that is not\n\t\t\t// registered in [Content_Types].xml and is referenced by nothing. These\n\t\t\t// are inert artifacts (common in real-world authored decks); drop them on\n\t\t\t// load rather than failing, so the package model holds only live parts.\n\t\t\tif (partName.startsWith('/[trash]/')) continue\n\t\t\tconst contentType = contentTypes.contentTypeFor(partName)\n\t\t\tif (!contentType) {\n\t\t\t\tthrow new PackageReadError(\n\t\t\t\t\t'package/part-content-type-missing',\n\t\t\t\t\t`No content type for part ${partName}: [Content_Types].xml has no matching Override or Default`\n\t\t\t\t)\n\t\t\t}\n\t\t\tparts.set(partName, new Part(partName, contentType, bytes))\n\t\t}\n\t\treturn new OpcPackage(parts, contentTypes, contentTypesBytes)\n\t}\n\n\tpart(partName: string): Part | undefined {\n\t\treturn this.parts.get(partName)\n\t}\n\n\tpartsByContentType(contentType: string): Part[] {\n\t\treturn [...this.parts.values()].filter((part) => part.contentType === contentType)\n\t}\n\n\t/**\n\t * Relationships owned by a part ('/' for the package-level\n\t * `/_rels/.rels`). Parts without a `.rels` part get an empty set.\n\t */\n\trelationshipsFor(sourcePartName = '/'): Relationships {\n\t\tconst cached = this.#relationshipsCache.get(sourcePartName)\n\t\tif (cached) return cached\n\t\tconst relsPart = this.parts.get(relsPartNameFor(sourcePartName))\n\t\tconst relationships = relsPart\n\t\t\t? Relationships.parse(textDecoder.decode(relsPart.bytes), sourcePartName)\n\t\t\t: Relationships.empty(sourcePartName)\n\t\tthis.#relationshipsCache.set(sourcePartName, relationships)\n\t\treturn relationships\n\t}\n\n\t/**\n\t * Add a new part and register its content type (`ensureRegistered`), so the\n\t * package stays consistent. Throws if the partname is already taken.\n\t */\n\taddPart(partName: string, contentType: string, bytes: Uint8Array): Part {\n\t\tif (this.#parts.has(partName))\n\t\t\tthrow new InvalidOptionError(\n\t\t\t\t'package/duplicate-part-name',\n\t\t\t\t`Cannot add part ${partName}: a part with that name already exists`\n\t\t\t)\n\t\tthis.contentTypes.ensureRegistered(partName, contentType)\n\t\tconst part = new Part(partName, contentType, bytes)\n\t\tthis.#parts.set(partName, part)\n\t\treturn part\n\t}\n\n\t/**\n\t * Remove a part and return whether it existed. Drops its `Override` content-type\n\t * registration and any cached relationship set it owned, so a later `save()`\n\t * neither re-emits it nor flushes a stale `.rels` for it. Low-level: it does not\n\t * touch references *to* this part (dangling rels are the caller's concern) nor\n\t * cascade to parts this one referenced — see {@link Presentation.removeSlide}\n\t * for the slide-aware variant that unwires the presentation and prunes orphans.\n\t */\n\tremovePart(partName: string): boolean {\n\t\tif (!this.#parts.delete(partName)) return false\n\t\tthis.contentTypes.removeOverride(partName)\n\t\t// Cache is keyed by owning part; clearing it stops a stale set being flushed.\n\t\tthis.#relationshipsCache.delete(partName)\n\t\treturn true\n\t}\n\n\t/**\n\t * Reserve an unused media partname `/ppt/media/<base><n>.<ext>` (n one past\n\t * the highest existing index for that base). Does not create the part.\n\t */\n\treserveMediaPartName(extension: string, base = 'image'): string {\n\t\tconst ext = extension.toLowerCase().replace(/^\\./, '')\n\t\tconst re = new RegExp(`^/ppt/media/${base}(\\\\d+)\\\\.${ext}$`, 'i')\n\t\tlet max = 0\n\t\tfor (const partName of this.#parts.keys()) {\n\t\t\tconst match = re.exec(partName)\n\t\t\tif (match) max = Math.max(max, Number(match[1]))\n\t\t}\n\t\treturn `/ppt/media/${base}${max + 1}.${ext}`\n\t}\n\n\t/**\n\t * Reserve an unused partname in the same directory and naming family as\n\t * `templatePartName`, with a fresh index one past the highest existing one.\n\t * The template's filename is split into a base (its stem minus any trailing\n\t * digits) and an extension, e.g. `/ppt/slideLayouts/slideLayout1.xml` →\n\t * `/ppt/slideLayouts/slideLayout<n>.xml`, `/ppt/media/image1.png` →\n\t * `/ppt/media/image<n>.png`. Used when copying a part in from another package.\n\t * Does not create the part.\n\t */\n\treservePartNameLike(templatePartName: string): string {\n\t\tconst slash = templatePartName.lastIndexOf('/')\n\t\tconst dir = templatePartName.slice(0, slash)\n\t\tconst fileName = templatePartName.slice(slash + 1)\n\t\tconst dot = fileName.lastIndexOf('.')\n\t\tconst ext = dot > 0 ? fileName.slice(dot) : '' // includes the leading '.'\n\t\tconst stem = dot > 0 ? fileName.slice(0, dot) : fileName\n\t\tconst base = stem.replace(/\\d+$/, '')\n\t\tconst escape = (s: string): string => s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n\t\tconst re = new RegExp(`^${escape(`${dir}/${base}`)}(\\\\d+)${escape(ext)}$`)\n\t\tlet max = 0\n\t\tfor (const partName of this.#parts.keys()) {\n\t\t\tconst match = re.exec(partName)\n\t\t\tif (match) max = Math.max(max, Number(match[1]))\n\t\t}\n\t\treturn `${dir}/${base}${max + 1}${ext}`\n\t}\n\n\t/**\n\t * Re-emit the package. Clean parts are written from their original bytes;\n\t * dirty parts from their DOM. Dirty relationship sets and content types are\n\t * flushed first. Part order is preserved from load; added parts append.\n\t */\n\tasync save(): Promise<Uint8Array> {\n\t\tthis.#flushRelationships()\n\t\tconst zip = new ZipWriter()\n\t\tzip.add(CONTENT_TYPES_ZIP_PATH, this.contentTypes.isDirty ? this.contentTypes.serialize() : this.#contentTypesBytes)\n\t\tfor (const part of this.#parts.values()) {\n\t\t\tzip.add(partNameToZipPath(part.partName), part.serialize())\n\t\t}\n\t\treturn zip.toBytes()\n\t}\n\n\t/** Write each dirty `Relationships` set back into its `.rels` part (creating it if new). */\n\t#flushRelationships(): void {\n\t\tfor (const relationships of this.#relationshipsCache.values()) {\n\t\t\tif (!relationships.isDirty) continue\n\t\t\tconst relsPartName = relsPartNameFor(relationships.sourcePartName)\n\t\t\tconst bytes = textEncoder.encode(relationships.serialize())\n\t\t\t// Overwriting an existing key preserves its position in the Map.\n\t\t\tthis.#parts.set(relsPartName, new Part(relsPartName, RELATIONSHIPS_CONTENT_TYPE, bytes))\n\t\t}\n\t}\n}\n","/**\n * Baking a slide's theme dependencies into the slide itself, for `Presentation.importSlide` /\n * `importShape`.\n *\n * A slide imported into another deck is rebound to the *destination* master, so everything it\n * resolved symbolically against its own theme silently re-resolves against a different one — its\n * scheme colours change, its style-matrix fills change, its placeholders snap to different\n * geometry and type sizes. The `theme: 'preserve'` mode exists to stop that: each pass here\n * resolves a dependency against the **source** theme (via `read/oxml/theme.ts` and\n * `read/oxml/placeholder-inherit.ts`) and writes the answer explicitly onto the slide, so after\n * the rebind there is nothing left to re-resolve.\n *\n * What gets flattened, and why each one matters:\n *\n * 1. **`a:schemeClr` tokens** — rewritten to the literal `a:srgbClr` the source `clrMap` +\n * `clrScheme` produce. Child transforms (`lumMod`/`shade`/`alpha`/…) are carried through\n * untouched, so tints and shades render identically; only the *base* reference is swapped,\n * never the transform math.\n * 2. **Style-matrix refs** — a shape's `p:style` (`lnRef`/`fillRef`/`effectRef`) indexes the\n * theme `fmtScheme`; the indexed entry is resolved into an explicit `spPr` fill/line/effect\n * (with its `phClr` substituted) and the ref neutralized so it cannot re-resolve. The\n * `fontRef` is deliberately left intact so its font can re-bind to the destination theme —\n * the \"normalize fonts on attach\" bonus.\n * 3. **Placeholder-inherited run colour, size and weight** — a run that sets none of its own\n * takes them from the source placeholder → layout → master text-style chain. Rebinding\n * replaces that chain, so each is resolved from the source styles and written onto the run.\n * Typeface (`a:latin`) is deliberately *not* baked — it re-binds along with `fontRef`.\n * 4. **Placeholder-inherited geometry** — a placeholder with no own `a:xfrm` takes position and\n * size from the matching source layout/master placeholder; without baking it, a title snaps\n * to the destination default and often clips off-canvas.\n *\n * The `restyle` mode is the deliberate inverse ({@link restyleSlide}): it bakes *nothing*, so\n * everything re-resolves against the destination and the slide takes on the new brand.\n *\n * **Why this lives in `api/ops/` and not in `read/oxml/`.** Everything here *mutates* a live\n * part. The modules it calls into resolve and build detached elements but never write, which is\n * what lets the read model's getters share them; keeping the writes on this side of the line is\n * what keeps that true. Callers own marking the part dirty.\n */\nimport {\n\tOOXML_NS,\n\tattr,\n\tchildElements,\n\tcreateElement,\n\tdescendantsByTag,\n\tfirstChild,\n\tfirstChildElement,\n\tgetElements,\n\tgetOrAddChild,\n\tinsertInOrder,\n\tintValue,\n\townerDocumentOf,\n\tremoveChildrenByQName,\n\treplaceInParent,\n\tsetAttr,\n\ttype Element,\n} from '../../oxml/dom.js'\nimport { FILL_CHOICES } from '../../oxml/fill.js'\nimport {\n\tLST_STYLE_LEVELS,\n\tRUN_PROP_NAMES,\n\tplaceholderInheritedAnchor,\n\tplaceholderInheritedColor,\n\tplaceholderInheritedListStyles,\n\tplaceholderInheritedRunProps,\n\tplaceholderInheritedXfrm,\n\tplaceholderOf,\n\tslideDefinesColor,\n\tslideDefinesProp,\n\ttype RunProps,\n} from '../../oxml/placeholder-inherit.js'\nimport {\n\tSCHEME_SLOTS,\n\tfmtEntry,\n\tintAttr,\n\tisA,\n\tresolveColor,\n\tresolveSchemeToken,\n\tstyleRefFill,\n\tstyleRefLine,\n\tsubstitutePhClr,\n\ttype ColorContext,\n\ttype ResolvedColor,\n\ttype ThemeContext,\n} from '../../oxml/theme.js'\nimport {\n\tRPR_FILL_AFTER,\n\tSHAPE_AFTER_SPPR,\n\tSPPR_AFTER_XFRM,\n\tSPPR_EFFECT_AFTER,\n\tSPPR_FILL_AFTER,\n\tSPPR_LN_AFTER,\n\tSPPR_SCENE3D_AFTER,\n\tSPPR_SP3D_AFTER,\n} from '../../../ooxml/sequence.js'\n\n/**\n * A {@link ThemeContext} plus the one thing only the flatten pass needs to write from.\n *\n * It is separate from `ThemeContext` because every *other* consumer of a theme context — the\n * read model's colour, font and geometry getters — resolves against a source subgraph without\n * ever carrying a background to apply. Keeping the field here means those callers cannot be\n * handed one and quietly ignore it.\n */\nexport interface FlattenContext extends ThemeContext {\n\t/**\n\t * The slide's effective background inherited from the *source* `slideLayout`/`slideMaster`\n\t * (the raw `p:bg` element), or `null` when the slide carries its own. Applied onto the slide\n\t * before flattening so the background survives rebinding to the destination master.\n\t */\n\tinheritedBackground?: Element | null\n}\n\n/**\n * Flatten one slide's theme dependencies in place:\n *\n * 1. carry the background the slide inherited from its source layout/master onto\n * the slide (so it survives rebinding to a different master);\n * 2. materialize `p:bgRef` and style-matrix refs into explicit fills/lines/effects;\n * 3. bake each placeholder's effective geometry (inherited `a:xfrm`) onto the\n * shape so a rebind cannot move or resize it;\n * 4. bake each placeholder run's effective colour and size/weight (inherited from\n * the source layout/master text styles) explicitly onto the run;\n * 5. rewrite every remaining `a:schemeClr` to its literal `a:srgbClr`.\n *\n * Steps run in this order so the inherited/materialized backgrounds are present\n * before the final scheme-colour sweep resolves the colours they carry. The\n * placeholder geometry/colour/size passes have no data dependency on the others.\n * The caller marks the part dirty.\n */\nexport function flattenSlide(slideRoot: Element, ctx: FlattenContext): void {\n\tapplyInheritedBackground(slideRoot, ctx)\n\tmaterializeBackground(slideRoot, ctx)\n\tmaterializeStyleRefs(slideRoot, ctx)\n\tresolvePlaceholderGeometry(slideRoot, ctx)\n\tresolvePlaceholderRunColors(slideRoot, ctx)\n\tresolvePlaceholderRunSizes(slideRoot, ctx)\n\tresolveSchemeColors(slideRoot, ctx)\n}\n\n/**\n * Flatten a single lifted shape's theme dependencies in place — the shape-scoped\n * subset of {@link flattenSlide} used by `Presentation.importShape` `preserve`\n * mode. It runs every pass that resolves a *shape's* theme references against the\n * source theme (style-matrix refs, placeholder-inherited geometry/colour/size/\n * anchor/list-style, scheme colours) but deliberately **omits** the two\n * slide-scoped background passes (`applyInheritedBackground`/`materializeBackground`):\n * a background belongs to a slide, not to a shape being composed onto a foreign host.\n *\n * Unlike {@link flattenSlide}, this also **demotes** a lifted placeholder to a\n * plain shape ({@link demotePlaceholders}) once everything it inherited is baked.\n * A placeholder makes sense on its own slide, where it resolves against that deck's\n * master/layout; lifted onto a foreign host its surviving `p:ph` would re-resolve\n * against the *host* placeholder of the same type/idx (wrong inheritance, or a\n * fallback when absent) and could collide with the host's own placeholder. The\n * extra bakes here (anchor + list style, on top of the geometry/colour/size the\n * shared passes cover) make the shape self-contained so demotion loses nothing\n * visible. This is why the demotion is scoped to `flattenShape`: `flattenSlide`\n * keeps placeholders as placeholders by design.\n *\n * `shapeRoot` must be an element whose *descendants* include the lifted shape\n * (the passes match via `getElementsByTagNameNS`, which excludes the root element\n * itself) — the caller wraps the imported `p:sp`/`p:pic`/`p:graphicFrame`/`p:grpSp`\n * in a throwaway container before calling. The caller marks the part dirty.\n */\nexport function flattenShape(shapeRoot: Element, ctx: FlattenContext): void {\n\tmaterializeStyleRefs(shapeRoot, ctx)\n\tresolvePlaceholderGeometry(shapeRoot, ctx)\n\tresolvePlaceholderRunColors(shapeRoot, ctx)\n\tresolvePlaceholderRunSizes(shapeRoot, ctx)\n\tresolvePlaceholderBodyPr(shapeRoot, ctx)\n\tresolvePlaceholderListStyle(shapeRoot, ctx) // before resolveSchemeColors: cloned levels carry schemeClr\n\tresolveSchemeColors(shapeRoot, ctx)\n\tdemotePlaceholders(shapeRoot) // last: the passes above key on p:ph\n}\n\n/**\n * Restyle a rebound slide in place (the `theme: 'restyle'` mode): the exact\n * inverse of {@link flattenSlide}. It bakes *nothing* — leaving every\n * `a:schemeClr`/style-matrix ref and `p:bg` `bgRef` symbolic is the whole point,\n * so they re-resolve against the *destination* master's `clrMap` + theme once the\n * slide is rebound. The single mutation is dropping the slide's own colour-map\n * override (`p:clrMapOvr/a:overrideClrMapping`): a source override would keep\n * mapping the slide's scheme-token names the source way and defeat the re-brand,\n * so it must yield to the destination master's `p:clrMap`.\n *\n * Caveat carried from the plan: only *symbolic* colours re-brand. Anything the\n * source authored as a literal `a:srgbClr` has no theme reference to re-resolve\n * and stays exactly that colour. The caller marks the part dirty.\n */\nexport function restyleSlide(slideRoot: Element): void {\n\tremoveChildrenByQName(slideRoot, ['p:clrMapOvr'])\n}\n\n/**\n * The optional inverse of {@link resolveSchemeColors}, for `restyle`'s\n * force-remap-literals mode (the `Presentation.importSlide` `remapLiterals`\n * option). Every literal `a:srgbClr` whose value equals a *source* `clrScheme`\n * slot is rewritten back to a symbolic `a:schemeClr` so it re-resolves against the\n * destination theme; a literal matching no slot (the common case) is left exactly\n * as authored. Transform children (`lumMod`/`shade`/`alpha`/…) are carried across.\n *\n * Plain `restyle` cannot re-brand a literal — it carries no theme reference. This\n * re-introduces one by matching the literal's RGB against the slots the *source*\n * theme defined, emitting the scheme token that routes through the source `clrMap`\n * (so a literal equal to the source `accent1` slot becomes `schemeClr accent1`,\n * which the destination `clrMap`/theme then re-resolve). Slots are matched in\n * `clrScheme` order, so the first slot defining a given RGB wins when several share\n * it. Opt-in because it deliberately reinterprets authored literals as theme\n * colours — visual QA territory, the same caveat as the rest of `restyle`.\n */\nexport function remapLiteralColors(slideRoot: Element, ctx: ColorContext): void {\n\tconst slotByHex = reverseClrScheme(ctx.clrScheme)\n\tif (slotByHex.size === 0) return\n\tconst tokenBySlot = reverseClrMap(ctx.clrMap)\n\tconst doc = ownerDocumentOf(slideRoot)\n\tfor (const srgb of descendantsByTag(slideRoot, OOXML_NS.a, 'srgbClr')) {\n\t\tconst hex = attr(srgb, 'val')\n\t\tconst slot = hex ? slotByHex.get(hex.toUpperCase()) : undefined\n\t\tif (!slot) continue\n\t\tconst scheme = createElement(doc, 'a:schemeClr')\n\t\tsetAttr(scheme, 'val', tokenBySlot.get(slot) ?? slot) // route through the source clrMap; dk1/lt1/… are themselves valid tokens\n\t\twhile (srgb.firstChild) scheme.appendChild(srgb.firstChild) // carry transforms\n\t\treplaceInParent(srgb, scheme)\n\t}\n}\n\n/** Reverse a slot → RGB `clrScheme` into RGB → slot, in `SCHEME_SLOTS` order (first slot wins on a shared RGB). */\nfunction reverseClrScheme(clrScheme: Map<string, string>): Map<string, string> {\n\tconst out = new Map<string, string>()\n\tfor (const slot of SCHEME_SLOTS) {\n\t\tconst hex = clrScheme.get(slot)\n\t\tif (hex && !out.has(hex.toUpperCase())) out.set(hex.toUpperCase(), slot)\n\t}\n\treturn out\n}\n\n/** Reverse a token → slot `clrMap` into slot → token (first token wins on a shared slot). */\nfunction reverseClrMap(clrMap: Map<string, string>): Map<string, string> {\n\tconst out = new Map<string, string>()\n\tfor (const [token, slot] of clrMap) if (!out.has(slot)) out.set(slot, token)\n\treturn out\n}\n\n/**\n * If the slide has no own `p:bg`, insert (a copy of) the background it inherited\n * from its source layout/master as an explicit `p:cSld/p:bg`. The clone is left\n * unresolved here; the later passes flatten its `bgRef`/`schemeClr` in place.\n */\nfunction applyInheritedBackground(slideRoot: Element, ctx: FlattenContext): void {\n\tconst inherited = ctx.inheritedBackground\n\tif (!inherited) return\n\tconst cSld = firstChild(slideRoot, 'p:cSld')\n\tif (!cSld || firstChild(cSld, 'p:bg')) return // no cSld, or the slide already owns a background\n\tconst doc = ownerDocumentOf(slideRoot)\n\tconst bg = doc.importNode(inherited, true)\n\tinsertInOrder(cSld, bg, ['p:spTree', 'p:custDataLst', 'p:controls', 'p:extLst'])\n}\n\n/**\n * Resolve every `p:bgRef` (theme-indexed background) under the slide into an\n * explicit `p:bgPr` fill, so the background no longer depends on the destination\n * theme's `fmtScheme`. A `bgPr` background is left for the scheme-colour sweep.\n */\nfunction materializeBackground(slideRoot: Element, ctx: FlattenContext): void {\n\tconst doc = ownerDocumentOf(slideRoot)\n\tfor (const bg of descendantsByTag(slideRoot, OOXML_NS.p, 'bg')) {\n\t\tconst bgRef = firstChild(bg, 'p:bgRef')\n\t\tif (!bgRef) continue\n\t\t// A `p:bgRef` is a `CT_StyleMatrixReference`, the same shape as a shape's\n\t\t// `a:fillRef`, so `styleRefFill` builds its resolved `fmtScheme` fill (phClr\n\t\t// already substituted). `null` (idx 0 / unresolved colour) → transparent.\n\t\tconst fill = styleRefFill(bgRef, ctx)\n\t\tconst bgPr = createElement(doc, 'p:bgPr')\n\t\tbgPr.appendChild(fill ?? createElement(doc, 'a:noFill'))\n\t\tbg.replaceChild(bgPr, bgRef)\n\t}\n}\n\n/** Rewrite every `a:schemeClr` under `root` to a literal `a:srgbClr` when resolvable. */\nfunction resolveSchemeColors(root: Element, ctx: FlattenContext): void {\n\tconst doc = ownerDocumentOf(root)\n\tfor (const schemeClr of descendantsByTag(root, OOXML_NS.a, 'schemeClr')) {\n\t\tconst token = attr(schemeClr, 'val')\n\t\tconst hex = token ? resolveSchemeToken(token, ctx) : null\n\t\tif (!hex) continue // phClr or an unmapped token — leave it for the destination theme.\n\t\tconst srgb = createElement(doc, 'a:srgbClr')\n\t\tsetAttr(srgb, 'val', hex)\n\t\twhile (schemeClr.firstChild) srgb.appendChild(schemeClr.firstChild) // carry transforms\n\t\treplaceInParent(schemeClr, srgb)\n\t}\n}\n\n/**\n * Bake placeholder-inherited run colours onto the slide. For each placeholder run\n * that defines no colour of its own (nor at paragraph/text-body level on the\n * *slide*), resolve the colour it would inherit from the source\n * `slideLayout`/`slideMaster` text styles and write it explicitly onto the run's\n * `a:rPr`. After this the run's colour cannot change when the slide is rebound to\n * the destination master. `a:fld` runs (dates, slide numbers) are treated like\n * `a:r`. Only colour is resolved; other inheritable run properties are left to\n * re-bind to the destination styles.\n */\nfunction resolvePlaceholderRunColors(slideRoot: Element, ctx: FlattenContext): void {\n\tif (!ctx.layoutRoot && !ctx.masterRoot) return\n\tfor (const sp of descendantsByTag(slideRoot, OOXML_NS.p, 'sp')) {\n\t\tconst ph = placeholderOf(sp)\n\t\tif (!ph) continue\n\t\tconst txBody = firstChild(sp, 'p:txBody')\n\t\tif (!txBody) continue\n\t\tconst type = attr(ph, 'type')\n\t\tconst idx = attr(ph, 'idx') ?? '0'\n\t\tconst slideLst = firstChild(txBody, 'a:lstStyle')\n\t\tconst byLevel = new Map<number, ResolvedColor | null>()\n\t\tfor (const p of getElements(txBody, 'a:p')) {\n\t\t\tconst pPr = firstChild(p, 'a:pPr')\n\t\t\tconst level = (pPr && intValue(attr(pPr, 'lvl'))) ?? 0\n\t\t\tconst runs = [...getElements(p, 'a:r'), ...getElements(p, 'a:fld')]\n\t\t\tif (runs.length === 0) continue\n\t\t\tlet color = byLevel.get(level)\n\t\t\tif (color === undefined) {\n\t\t\t\tcolor = placeholderInheritedColor(type, idx, level, ctx)\n\t\t\t\tbyLevel.set(level, color)\n\t\t\t}\n\t\t\tif (!color) continue\n\t\t\tfor (const run of runs) {\n\t\t\t\tif (slideDefinesColor(run, pPr, slideLst, level)) continue\n\t\t\t\twriteRunColor(run, color)\n\t\t\t}\n\t\t}\n\t}\n}\n\n/** Write a resolved colour as an explicit `a:solidFill` (with carried transforms) onto a run's `a:rPr`. */\nfunction writeRunColor(run: Element, color: ResolvedColor): void {\n\tconst doc = ownerDocumentOf(run)\n\tconst rPr = getOrAddChild(run, 'a:rPr', ['a:t'])\n\tconst fill = createElement(doc, 'a:solidFill')\n\tconst srgb = createElement(doc, 'a:srgbClr')\n\tsetAttr(srgb, 'val', color.hex)\n\tfor (const t of color.transforms) srgb.appendChild(t.cloneNode(true))\n\tfill.appendChild(srgb)\n\tinsertInOrder(rPr, fill, RPR_FILL_AFTER)\n}\n\n/**\n * Bake placeholder-inherited geometry onto the slide. A placeholder shape\n * that carries no own `p:spPr/a:xfrm` takes its position/size from the matching\n * source `slideLayout` placeholder, else the `slideMaster` placeholder. Rebinding\n * to the destination master replaces that inheritance, so the placeholder would\n * snap to the destination default (often clipping off-canvas). We deep-clone the\n * effective source `a:xfrm` and write it explicitly onto the shape. Shapes with\n * their own `a:xfrm` are left untouched (explicit geometry is not inherited), and\n * an orphan placeholder with no source match keeps the current fall-back behaviour.\n */\nfunction resolvePlaceholderGeometry(slideRoot: Element, ctx: FlattenContext): void {\n\tif (!ctx.layoutRoot && !ctx.masterRoot) return\n\tfor (const sp of descendantsByTag(slideRoot, OOXML_NS.p, 'sp')) {\n\t\tconst ph = placeholderOf(sp)\n\t\tif (!ph) continue\n\t\tconst spPr = firstChild(sp, 'p:spPr')\n\t\tif (spPr && firstChild(spPr, 'a:xfrm')) continue // explicit geometry is not inherited — leave it\n\t\tconst found = placeholderInheritedXfrm(attr(ph, 'type'), attr(ph, 'idx') ?? '0', ctx)\n\t\tif (!found) continue\n\t\tconst target = getOrAddChild(sp, 'p:spPr', SHAPE_AFTER_SPPR)\n\t\tinsertInOrder(target, found.xfrm.cloneNode(true), SPPR_AFTER_XFRM)\n\t}\n}\n\n/**\n * Bake the placeholder-inherited vertical anchor onto a lifted shape's text body\n * (the {@link flattenShape} placeholder-demotion path). A placeholder whose own\n * `a:bodyPr` sets no `@anchor` inherits it from the source layout/master placeholder;\n * once {@link demotePlaceholders} strips the `p:ph` the shape would lose that\n * inheritance and fall back to top-anchored, so a vertically-centred title jumps.\n * We resolve the effective anchor from the source chain and write it explicitly.\n * Shapes whose `a:bodyPr` already fixes `@anchor`, and placeholders with no\n * resolvable inherited anchor, are left untouched. Other `a:bodyPr` knobs (insets,\n * autofit) are left as authored — they have sane defaults a plain shape keeps.\n */\nfunction resolvePlaceholderBodyPr(shapeRoot: Element, ctx: FlattenContext): void {\n\tif (!ctx.layoutRoot && !ctx.masterRoot) return\n\tfor (const sp of descendantsByTag(shapeRoot, OOXML_NS.p, 'sp')) {\n\t\tconst ph = placeholderOf(sp)\n\t\tif (!ph) continue\n\t\tconst txBody = firstChild(sp, 'p:txBody')\n\t\tif (!txBody) continue\n\t\tconst bodyPr = firstChild(txBody, 'a:bodyPr')\n\t\tif (bodyPr && attr(bodyPr, 'anchor') != null) continue // slide fixes it — not inherited\n\t\tconst anchor = placeholderInheritedAnchor(attr(ph, 'type'), attr(ph, 'idx') ?? '0', ctx)\n\t\tif (!anchor) continue\n\t\tsetAttr(bodyPr ?? getOrAddChild(txBody, 'a:bodyPr', ['a:lstStyle', 'a:p']), 'anchor', anchor)\n\t}\n}\n\n/**\n * Bake the placeholder-inherited list style onto a lifted shape's text body (the\n * {@link flattenShape} placeholder-demotion path). A placeholder's per-level\n * *paragraph* formatting — indent (`marL`/`indent`), bullets (`a:buChar`/\n * `a:buAutoNum`/`a:buNone`), alignment, and the level `a:defRPr` — is inherited\n * from the source layout/master placeholder `a:lstStyle` and the master\n * `p:txStyles` category style. Run colour/size are baked onto each run by the\n * sibling passes, but paragraph-level defaults live here; once\n * {@link demotePlaceholders} strips the `p:ph` the shape stops inheriting them, so\n * bullets and indents would vanish. We materialize the effective list style onto\n * the shape's `p:txBody/a:lstStyle`.\n *\n * Resolution is per *level*, most specific tier wins whole: the slide's own level\n * (if it defines one) is kept verbatim, else the first source tier that defines it\n * (layout placeholder, then master placeholder, then master category style) is\n * cloned. This is a whole-element overlay, not the per-attribute merge PowerPoint\n * does — but explicit paragraph `a:pPr` on the slide's own runs travels with the\n * shape and still wins, so this only supplies defaults for the inherited case\n * (paragraphs that set no `a:pPr` of their own). Scheme colours in the cloned\n * levels are resolved by the later `resolveSchemeColors` pass.\n */\nfunction resolvePlaceholderListStyle(shapeRoot: Element, ctx: FlattenContext): void {\n\tif (!ctx.layoutRoot && !ctx.masterRoot) return\n\tfor (const sp of descendantsByTag(shapeRoot, OOXML_NS.p, 'sp')) {\n\t\tconst ph = placeholderOf(sp)\n\t\tif (!ph) continue\n\t\tconst txBody = firstChild(sp, 'p:txBody')\n\t\tif (!txBody) continue\n\t\tconst tiers = placeholderInheritedListStyles(attr(ph, 'type'), attr(ph, 'idx') ?? '0', ctx)\n\t\tif (tiers.length === 0) continue\n\t\tconst slideLst = firstChild(txBody, 'a:lstStyle')\n\t\tconst merged = createElement(ownerDocumentOf(txBody), 'a:lstStyle')\n\t\tlet any = false\n\t\tfor (const level of LST_STYLE_LEVELS) {\n\t\t\t// Slide's own level wins; otherwise the most-specific source tier that defines it.\n\t\t\tconst own = slideLst && firstChild(slideLst, level)\n\t\t\tconst src = own ?? tiers.map((t) => firstChild(t, level)).find((e): e is Element => !!e) ?? null\n\t\t\tif (!src) continue\n\t\t\tmerged.appendChild(src.cloneNode(true))\n\t\t\tany = true\n\t\t}\n\t\tif (!any) continue\n\t\tif (slideLst) txBody.replaceChild(merged, slideLst)\n\t\telse insertInOrder(txBody, merged, ['a:p'])\n\t}\n}\n\n/**\n * Strip the `p:ph` marker from every placeholder shape in a lifted subtree so it\n * becomes a self-contained ordinary shape (the {@link flattenShape} path only). By\n * the time this runs, the shape's inherited geometry, colour, run size, anchor, and\n * list style are all baked explicitly, so it no longer needs — and must not keep —\n * its placeholder identity: a surviving `p:ph` would re-resolve against the *host*\n * deck's layout/master placeholder of the same type/idx (wrong inheritance, or a\n * fallback when the host has none) and could collide with the host slide's own\n * placeholder of that type. Removing the marker severs both. The `p:nvPr` itself is\n * kept (it can carry media/custom-data children); only the `p:ph` child goes.\n */\nfunction demotePlaceholders(shapeRoot: Element): void {\n\tfor (const sp of descendantsByTag(shapeRoot, OOXML_NS.p, 'sp')) {\n\t\tconst nvSpPr = firstChild(sp, 'p:nvSpPr')\n\t\tconst nvPr = nvSpPr && firstChild(nvSpPr, 'p:nvPr')\n\t\tif (nvPr) removeChildrenByQName(nvPr, ['p:ph'])\n\t}\n}\n\n/**\n * Bake placeholder-inherited run size/weight onto the slide. Mirrors\n * {@link resolvePlaceholderRunColors}: for each placeholder run that sets no\n * `sz`/`b`/`i` of its own (nor at paragraph/text-body level on the *slide*),\n * resolve the value it would inherit from the source `slideLayout`/`slideMaster`\n * text styles — per paragraph list level — and write it explicitly onto the run's\n * `a:rPr`. Each property resolves independently up the chain. Typeface (`a:latin`)\n * is left to re-bind to the destination theme, as the colour pass does for the `fontRef`.\n */\nfunction resolvePlaceholderRunSizes(slideRoot: Element, ctx: FlattenContext): void {\n\tif (!ctx.layoutRoot && !ctx.masterRoot) return\n\tfor (const sp of descendantsByTag(slideRoot, OOXML_NS.p, 'sp')) {\n\t\tconst ph = placeholderOf(sp)\n\t\tif (!ph) continue\n\t\tconst txBody = firstChild(sp, 'p:txBody')\n\t\tif (!txBody) continue\n\t\tconst type = attr(ph, 'type')\n\t\tconst idx = attr(ph, 'idx') ?? '0'\n\t\tconst slideLst = firstChild(txBody, 'a:lstStyle')\n\t\tconst byLevel = new Map<number, RunProps | null>()\n\t\tfor (const p of getElements(txBody, 'a:p')) {\n\t\t\tconst pPr = firstChild(p, 'a:pPr')\n\t\t\tconst level = (pPr && intValue(attr(pPr, 'lvl'))) ?? 0\n\t\t\tconst runs = [...getElements(p, 'a:r'), ...getElements(p, 'a:fld')]\n\t\t\tif (runs.length === 0) continue\n\t\t\tlet props = byLevel.get(level)\n\t\t\tif (props === undefined) {\n\t\t\t\tprops = placeholderInheritedRunProps(type, idx, level, ctx)\n\t\t\t\tbyLevel.set(level, props)\n\t\t\t}\n\t\t\tif (!props) continue\n\t\t\tfor (const run of runs) writeRunProps(run, props, pPr, slideLst, level)\n\t\t}\n\t}\n}\n\n/** Write each resolved run property onto a run's `a:rPr`, skipping ones the slide already fixes. */\nfunction writeRunProps(\n\trun: Element,\n\tprops: RunProps,\n\tpPr: Element | null,\n\tslideLst: Element | null,\n\tlevel: number\n): void {\n\tlet rPr: Element | null = null\n\tfor (const name of RUN_PROP_NAMES) {\n\t\tconst value = props[name]\n\t\tif (value == null) continue\n\t\tif (slideDefinesProp(name, run, pPr, slideLst, level)) continue\n\t\trPr ??= getOrAddChild(run, 'a:rPr', ['a:t'])\n\t\tsetAttr(rPr, name, value)\n\t}\n}\n\n/**\n * Resolve each shape's `p:style` `lnRef`/`fillRef`/`effectRef` into explicit\n * `spPr` children (using the theme `fmtScheme`), then neutralize the ref. The\n * `fontRef` is intentionally left for the destination theme to re-resolve.\n */\nfunction materializeStyleRefs(root: Element, ctx: FlattenContext): void {\n\tif (!ctx.fmtScheme) return\n\tfor (const style of descendantsByTag(root, OOXML_NS.p, 'style')) {\n\t\tconst shape = style.parentNode as Element | null\n\t\tif (!shape) continue\n\t\tconst spPr = getOrAddChild(shape, 'p:spPr', SHAPE_AFTER_SPPR)\n\t\tmaterializeFill(spPr, firstChild(style, 'a:fillRef'), ctx)\n\t\tmaterializeLine(spPr, firstChild(style, 'a:lnRef'), ctx)\n\t\tmaterializeEffect(spPr, firstChild(style, 'a:effectRef'), ctx)\n\t}\n}\n\nfunction materializeFill(spPr: Element, fillRef: Element | null, ctx: FlattenContext): void {\n\tif (!fillRef) return\n\tif (!FILL_CHOICES.some((q) => firstChild(spPr, q))) {\n\t\tconst fill = styleRefFill(fillRef, ctx)\n\t\tif (fill) insertInOrder(spPr, fill, SPPR_FILL_AFTER)\n\t}\n\tneutralizeRef(fillRef)\n}\n\nfunction materializeLine(spPr: Element, lnRef: Element | null, ctx: FlattenContext): void {\n\tif (!lnRef) return\n\tif (!firstChild(spPr, 'a:ln')) {\n\t\tconst ln = styleRefLine(lnRef, ctx)\n\t\tif (ln) insertInOrder(spPr, ln, SPPR_LN_AFTER)\n\t}\n\tneutralizeRef(lnRef)\n}\n\nfunction materializeEffect(spPr: Element, effectRef: Element | null, ctx: FlattenContext): void {\n\tif (!effectRef) return\n\tconst idx = intAttr(effectRef, 'idx')\n\tif (idx !== null && idx > 0 && !firstChild(spPr, 'a:effectLst') && !firstChild(spPr, 'a:effectDag')) {\n\t\tconst style = fmtEntry(ctx, 'a:effectStyleLst', idx) // a:effectStyle (effectLst?, scene3d?, sp3d?)\n\t\tconst ref = resolveColor(firstChildElement(effectRef), ctx)\n\t\tif (style && ref) {\n\t\t\tsubstitutePhClr(style, ref)\n\t\t\t// Lift the effectStyle's children (effectLst/scene3d/sp3d) into spPr, in order.\n\t\t\tfor (const child of childElements(style)) {\n\t\t\t\tif (isA(child, 'effectLst') || isA(child, 'effectDag')) insertInOrder(spPr, child, SPPR_EFFECT_AFTER)\n\t\t\t\telse if (isA(child, 'scene3d')) insertInOrder(spPr, child, SPPR_SCENE3D_AFTER)\n\t\t\t\telse if (isA(child, 'sp3d')) insertInOrder(spPr, child, SPPR_SP3D_AFTER)\n\t\t\t}\n\t\t}\n\t}\n\tneutralizeRef(effectRef)\n}\n\n/** Strip a style-matrix ref to `idx=\"0\"` with no colour child so it contributes nothing. */\nfunction neutralizeRef(ref: Element): void {\n\tsetAttr(ref, 'idx', '0')\n\tfor (const child of childElements(ref)) ref.removeChild(child)\n}\n","/**\n * Read a slide's effective background (`p:cSld/p:bg`), decoded into a typed union.\n *\n * A background lives on the slide itself, or is inherited from its slideLayout,\n * else its slideMaster — the {@link SlideBackground.source} field records which.\n * The writer authors solid-colour, gradient, and image backgrounds (all FAITHFUL);\n * pattern and theme-indexed (`p:bgRef`) backgrounds are read-only for imported\n * decks — surface them so a codegen pass can carry the part rather than fake it. A\n * `themeRef` additionally resolves its `idx` through the slide theme's `fmtScheme`\n * to a concrete {@link BackgroundFill} in `resolvedFill`, so a consumer can ask what\n * colour/gradient a theme-indexed background actually renders as.\n */\nimport {\n\tattr,\n\tcreateElement,\n\tfirstChild,\n\tfirstChildElement,\n\tintValue,\n\townerDocumentOf,\n\ttype Element,\n} from '../oxml/dom.js'\nimport { styleRefFill, type ThemeContext } from '../oxml/theme.js'\nimport type { Relationships } from '../opc/relationships.js'\nimport { resolveColorElement, type ResolvedColor } from './theme-context.js'\nimport { readGradientFill, type GradientFill } from './gradient.js'\nimport { readPictureFill, type PictureFill } from './picture-fill.js'\nimport { readPatternFill } from './pattern-fill.js'\n\n/** Where a slide's effective background comes from in the slide → layout → master chain. */\nexport type BackgroundSource = 'slide' | 'layout' | 'master'\n\n/**\n * An explicit background fill, decoded from a `p:bgPr` (or from a `p:bgRef`'s\n * resolved `fmtScheme` entry). The source-less core of {@link SlideBackground}: the\n * top-level variants add {@link BackgroundSource}, and it is what a `themeRef`'s\n * {@link SlideBackground.resolvedFill} carries.\n *\n * The `image` variant keeps `relId`/`partName` at the top level — the fields\n * callers already read — and adds the full {@link PictureFill} (stretch/tile\n * geometry, crop, alpha) under `picture`.\n */\nexport type BackgroundFill =\n\t| { type: 'solid'; color: ResolvedColor | null }\n\t| { type: 'gradient'; gradient: GradientFill }\n\t| { type: 'image'; picture: PictureFill; relId: string | null; partName: string | null }\n\t| { type: 'pattern'; preset: string | null; foreground: ResolvedColor | null; background: ResolvedColor | null }\n\t| { type: 'none' }\n\n/**\n * A slide's effective background (`p:cSld/p:bg`), as a discriminated union on\n * `type`. Every variant carries {@link BackgroundSource}. `solid`/`gradient`/`image`\n * are what the writer authors and round-trip faithfully; `pattern`/`themeRef` are\n * read-only (imported decks) and `none` is an explicit `a:noFill`. A `themeRef`\n * keeps its raw `idx` for fidelity and also exposes `resolvedFill` — the concrete\n * fill that `idx` resolves to through the slide theme's `fmtScheme` (`null` when the\n * theme/entry cannot be resolved).\n */\nexport type SlideBackground =\n\t| { type: 'solid'; source: BackgroundSource; color: ResolvedColor | null }\n\t| { type: 'gradient'; source: BackgroundSource; gradient: GradientFill }\n\t| { type: 'image'; source: BackgroundSource; picture: PictureFill; relId: string | null; partName: string | null }\n\t| {\n\t\t\ttype: 'pattern'\n\t\t\tsource: BackgroundSource\n\t\t\tpreset: string | null\n\t\t\tforeground: ResolvedColor | null\n\t\t\tbackground: ResolvedColor | null\n\t }\n\t| {\n\t\t\ttype: 'themeRef'\n\t\t\tsource: BackgroundSource\n\t\t\tidx: number | null\n\t\t\tcolor: ResolvedColor | null\n\t\t\tresolvedFill: BackgroundFill | null\n\t }\n\t| { type: 'none'; source: BackgroundSource }\n\n/** The `p:cSld/p:bg` element of a slide/layout/master root, or `null`. */\nexport function backgroundElementOf(root: Element | null): Element | null {\n\tconst cSld = root && firstChild(root, 'p:cSld')\n\treturn cSld ? firstChild(cSld, 'p:bg') : null\n}\n\n/**\n * Decode a colour-bearing container (`p:bgPr`, or a synthetic wrapper around a\n * `fmtScheme` fill entry) into a {@link BackgroundFill}. `a:noFill`, an empty\n * container, or an unrecognized fill all read as `{ type: 'none' }`.\n */\nfunction decodeBackgroundFill(container: Element, ctx: ThemeContext, rels: Relationships | null): BackgroundFill {\n\tconst solid = firstChild(container, 'a:solidFill')\n\tif (solid) return { type: 'solid', color: resolveColorElement(firstChildElement(solid), ctx) }\n\n\tconst grad = firstChild(container, 'a:gradFill')\n\tif (grad) return { type: 'gradient', gradient: readGradientFill(container, ctx) as GradientFill }\n\n\tconst picture = readPictureFill(container, rels)\n\tif (picture) return { type: 'image', picture, relId: picture.relId, partName: picture.partName }\n\n\tconst patt = readPatternFill(container, ctx)\n\tif (patt) return { type: 'pattern', preset: patt.preset, foreground: patt.foreground, background: patt.background }\n\n\treturn { type: 'none' }\n}\n\n/**\n * Resolve a `p:bgRef`'s `idx` into the concrete {@link BackgroundFill} it renders\n * as, through the slide theme's `fmtScheme`. A `p:bgRef` is a\n * `CT_StyleMatrixReference` — the same shape as a shape's `a:fillRef` — so\n * {@link styleRefFill} builds the indexed `bgFillStyleLst`/`fillStyleLst` entry with\n * its `phClr` substituted by the bgRef's colour, and the resulting fill element is\n * decoded like a `p:bgPr`. `null` when the theme has no `fmtScheme`, the entry is\n * absent, or the colour cannot be resolved.\n *\n * `themeRels` — not the owning slide/layout/master's rels — is what an `a:blipFill`\n * entry's `r:embed` resolves against: the fill element is lifted out of the *theme*\n * part, so its relationship id is scoped to that part. Several stock Office themes\n * (Ion, Facet, …) put a picture in the third `bgFillStyleLst` slot, so a deck using\n * `p:bgRef idx=\"1003\"` hits this.\n */\nfunction resolveThemeRefFill(\n\tbgRef: Element,\n\tctx: ThemeContext,\n\tthemeRels: Relationships | null\n): BackgroundFill | null {\n\tconst fill = styleRefFill(bgRef, ctx)\n\tif (!fill) return null\n\t// Wrap the bare fill element (e.g. `a:gradFill`) in a synthetic container so the\n\t// same child-dispatch decode used for `p:bgPr` applies unchanged.\n\tconst wrapper = createElement(ownerDocumentOf(bgRef), 'p:bgPr')\n\twrapper.appendChild(fill)\n\treturn decodeBackgroundFill(wrapper, ctx, themeRels)\n}\n\n/**\n * Decode a `p:bg` element into a {@link SlideBackground}. `ctx` resolves colour\n * tokens and (for a `themeRef`) the theme `fmtScheme`; `rels` (the *owning* part's\n * relationships) resolves an image background's `r:embed` to an absolute part name.\n *\n * `themeRels` is the theme part's own relationships, used only for a `themeRef`'s\n * {@link SlideBackground.resolvedFill}: that fill comes out of the theme part, so an\n * image entry's `r:embed` is scoped to the theme, not to `rels`.\n */\nexport function readSlideBackground(\n\tbg: Element,\n\tsource: BackgroundSource,\n\tctx: ThemeContext,\n\trels: Relationships | null,\n\tthemeRels: Relationships | null\n): SlideBackground {\n\t// A background is either a `p:bgPr` (explicit fill) or a `p:bgRef` (theme-indexed).\n\tconst bgRef = firstChild(bg, 'p:bgRef')\n\tif (bgRef) {\n\t\treturn {\n\t\t\ttype: 'themeRef',\n\t\t\tsource,\n\t\t\tidx: intValue(attr(bgRef, 'idx')),\n\t\t\tcolor: resolveColorElement(firstChildElement(bgRef), ctx),\n\t\t\tresolvedFill: resolveThemeRefFill(bgRef, ctx, themeRels),\n\t\t}\n\t}\n\n\tconst bgPr = firstChild(bg, 'p:bgPr')\n\tif (!bgPr) return { type: 'none', source }\n\n\t// `a:noFill` (or an empty/unrecognized bgPr) is an explicit transparent background.\n\tconst fill = decodeBackgroundFill(bgPr, ctx, rels)\n\treturn { ...fill, source }\n}\n","/**\n * Read-model proxies for a slide's speaker-notes slide (`notesSlideN.xml`).\n *\n * A notes slide is a small, fixed surface: a shape tree of exactly three\n * placeholders — the slide thumbnail (`sldImg`), the notes body (`body`), and the\n * slide number (`sldNum`) — and never groups, pictures, connectors, or charts.\n * So it is modeled with a dedicated {@link NotesPlaceholder} rather than the full\n * slide shape hierarchy: each placeholder exposes its `type`/`name`/`id`, its\n * geometry (EMU, `null` when the part carries no `a:xfrm`), and — for the body and\n * the slide-number field — a navigable {@link TextFrame}.\n *\n * The writer authors all three placeholders but leaves the `sldImg`/`sldNum`\n * `p:spPr` empty (no `a:xfrm`), so on an *authored* deck geometry reads `null`; an\n * imported deck carries the notesMaster-derived geometry PowerPoint stamps. The\n * body's text and the `sldNum` field, by contrast, are authored and round-trip.\n *\n * Text frames are threaded with the notes theme context (notesMaster → `theme2.xml`,\n * see {@link resolveNotesColorContext}) so a notes run's own `schemeClr` resolves to\n * a literal hex, and with the notes part's own relationships so a notes hyperlink\n * resolves its url. The body frame is additionally given a placeholder context, so a\n * body run that sets no own size/face/bold resolves its *inherited* value from the\n * notesMaster's `p:notesStyle` — the notes analogue of a slide placeholder's\n * `Run.resolved*` chain.\n */\nimport type { OpcPackage } from '../opc/package.js'\nimport type { Part } from '../opc/part.js'\nimport type { Relationships } from '../opc/relationships.js'\nimport { attr, firstChild, getElements, intValue, type Element } from '../oxml/dom.js'\nimport type { ThemeContext } from '../oxml/theme.js'\nimport { resolveNotesColorContext } from './theme-context.js'\nimport { spPrXfrmEmu } from './shapes/oxml.js'\nimport { TextFrame } from './text.js'\n\n/**\n * One placeholder shape (`p:sp`) of a notes slide. A notes slide holds a fixed set:\n * the slide thumbnail (`type=\"sldImg\"`), the notes body (`type=\"body\"`), and the\n * slide number (`type=\"sldNum\"`). Geometry getters read the placeholder's *own*\n * `a:xfrm` and are `null` when it inherits geometry from the notesMaster (the case\n * on an authored deck, whose `sldImg`/`sldNum` carry an empty `p:spPr`).\n */\nexport class NotesPlaceholder {\n\tconstructor(\n\t\tprivate readonly sp: Element,\n\t\tprivate readonly part: Part,\n\t\t/** The notes theme context (notesMaster → `theme2.xml`), threaded to {@link textFrame}. */\n\t\tprivate readonly themeContext: ThemeContext,\n\t\t/** The notes part's relationships, threaded to {@link textFrame} for hyperlink resolution. */\n\t\tprivate readonly relationships: Relationships\n\t) {}\n\n\t#ph(): Element | null {\n\t\tconst nvSpPr = firstChild(this.sp, 'p:nvSpPr')\n\t\tconst nvPr = nvSpPr && firstChild(nvSpPr, 'p:nvPr')\n\t\treturn nvPr ? firstChild(nvPr, 'p:ph') : null\n\t}\n\n\t#cNvPr(): Element | null {\n\t\tconst nvSpPr = firstChild(this.sp, 'p:nvSpPr')\n\t\treturn nvSpPr ? firstChild(nvSpPr, 'p:cNvPr') : null\n\t}\n\n\t/** Placeholder type (`p:ph/@type`: `sldImg` | `body` | `sldNum`), or `null` when absent. */\n\tget type(): string | null {\n\t\tconst ph = this.#ph()\n\t\treturn ph ? attr(ph, 'type') : null\n\t}\n\n\t/** Placeholder index (`p:ph/@idx`), or `null` when unset. */\n\tget idx(): string | null {\n\t\tconst ph = this.#ph()\n\t\treturn ph ? attr(ph, 'idx') : null\n\t}\n\n\t/** Shape name (`p:cNvPr/@name`), or `''` when unnamed. */\n\tget name(): string {\n\t\tconst cNvPr = this.#cNvPr()\n\t\treturn (cNvPr && attr(cNvPr, 'name')) ?? ''\n\t}\n\n\t/** Drawing id (`p:cNvPr/@id`), or `null` when absent. */\n\tget id(): number | null {\n\t\tconst cNvPr = this.#cNvPr()\n\t\treturn cNvPr ? intValue(attr(cNvPr, 'id')) : null\n\t}\n\n\t/** Left edge in EMU (`a:off/@x`), or `null` when geometry is inherited (no own `a:xfrm`). */\n\tget left(): number | null {\n\t\treturn spPrXfrmEmu(this.sp, 'a:off', 'x')\n\t}\n\n\t/** Top edge in EMU (`a:off/@y`), or `null` when geometry is inherited. */\n\tget top(): number | null {\n\t\treturn spPrXfrmEmu(this.sp, 'a:off', 'y')\n\t}\n\n\t/** Width in EMU (`a:ext/@cx`), or `null` when geometry is inherited. */\n\tget width(): number | null {\n\t\treturn spPrXfrmEmu(this.sp, 'a:ext', 'cx')\n\t}\n\n\t/** Height in EMU (`a:ext/@cy`), or `null` when geometry is inherited. */\n\tget height(): number | null {\n\t\treturn spPrXfrmEmu(this.sp, 'a:ext', 'cy')\n\t}\n\n\t/**\n\t * The placeholder's text as a navigable {@link TextFrame} (`p:txBody`), or `null`\n\t * when it carries no text body (the `sldImg` thumbnail). The body placeholder's\n\t * runs round-trip a slide's authored notes; the `sldNum` placeholder's frame\n\t * holds the slide-number `a:fld`, whose value surfaces through `TextFrame.text`.\n\t */\n\tget textFrame(): TextFrame | null {\n\t\tconst txBody = firstChild(this.sp, 'p:txBody')\n\t\tif (!txBody) return null\n\t\t// The notes *body* placeholder's runs inherit their effective size/face/bold\n\t\t// (and colour) from the notesMaster's `p:notesStyle`, carried on the notes theme\n\t\t// context (`resolveNotesColorContext`). Give the body frame a placeholder context\n\t\t// so `Run.resolved*` walks that chain; the `sldNum` field frame needs none.\n\t\tconst placeholder =\n\t\t\tthis.type === 'body' ? { ph: { type: this.type, idx: this.idx ?? '0' }, flatten: this.themeContext } : undefined\n\t\treturn new TextFrame(txBody, this.part, this.themeContext, placeholder, this.relationships)\n\t}\n\n\t/** The placeholder's flattened text (paragraphs joined by `\\n`), or `''` when it has no text body. */\n\tget text(): string {\n\t\treturn this.textFrame?.text ?? ''\n\t}\n\n\t/** Escape hatch: the underlying `p:sp` element. After mutating it call {@link markDirty}, or `save()` writes the original bytes. */\n\tget element_(): Element {\n\t\treturn this.sp\n\t}\n\n\t/** Mark the owning notes-slide part dirty so `save()` reserializes it. Call after mutating {@link element_}. */\n\tmarkDirty(): void {\n\t\tthis.part.markDirty()\n\t}\n}\n\n/**\n * A slide's speaker-notes slide (`notesSlideN.xml`) as a modeled object — the deep\n * companion to {@link import('./slide.js').Slide.notesText}. Exposes the notes\n * shape tree as {@link NotesPlaceholder}s ({@link body}/{@link slideImage}/\n * {@link slideNumber}) plus the body {@link textFrame} the older getters flatten.\n *\n * The theme context (notesMaster → `theme2.xml`) is resolved once and shared across\n * every placeholder's text frame.\n */\nexport class NotesSlide {\n\t#themeContext?: ThemeContext\n\n\tconstructor(\n\t\tprivate readonly opc: OpcPackage,\n\t\t/** The notes slide's OPC part (`/ppt/notesSlides/notesSlideN.xml`). */\n\t\treadonly part: Part\n\t) {}\n\n\t/** Partname of the notes slide part. */\n\tget partName(): string {\n\t\treturn this.part.partName\n\t}\n\n\t/**\n\t * The notes theme context, resolved through the notesMaster → `theme2.xml` chain\n\t * and cached. Backs {@link NotesPlaceholder.textFrame}'s `Run.resolvedColor`.\n\t */\n\tthemeContext(): ThemeContext {\n\t\treturn (this.#themeContext ??= resolveNotesColorContext(this.opc, this.partName))\n\t}\n\n\t/** The placeholders (`p:sp`) in the notes shape tree, in document order. */\n\tget placeholders(): NotesPlaceholder[] {\n\t\tconst spTree = this.#spTree()\n\t\tif (!spTree) return []\n\t\tconst ctx = this.themeContext()\n\t\tconst rels = this.opc.relationshipsFor(this.partName)\n\t\treturn getElements(spTree, 'p:sp').map((sp) => new NotesPlaceholder(sp, this.part, ctx, rels))\n\t}\n\n\t/** The notes body placeholder (`p:ph type=\"body\"`), or `null` when the notes slide has none. */\n\tget body(): NotesPlaceholder | null {\n\t\treturn this.#byType('body')\n\t}\n\n\t/** The slide-thumbnail placeholder (`p:ph type=\"sldImg\"`), or `null` when absent. */\n\tget slideImage(): NotesPlaceholder | null {\n\t\treturn this.#byType('sldImg')\n\t}\n\n\t/** The slide-number placeholder (`p:ph type=\"sldNum\"`, carrying the slide-number field), or `null`. */\n\tget slideNumber(): NotesPlaceholder | null {\n\t\treturn this.#byType('sldNum')\n\t}\n\n\t/** The notes body as a navigable {@link TextFrame}, or `null` when there is no body text frame. */\n\tget textFrame(): TextFrame | null {\n\t\treturn this.body?.textFrame ?? null\n\t}\n\n\t/** The notes body text flattened (paragraphs joined by `\\n`), or `''` when the body is empty/absent. */\n\tget text(): string {\n\t\treturn this.body?.text ?? ''\n\t}\n\n\t#byType(type: string): NotesPlaceholder | null {\n\t\treturn this.placeholders.find((ph) => ph.type === type) ?? null\n\t}\n\n\t#spTree(): Element | null {\n\t\tconst root = this.part.dom.documentElement\n\t\tconst cSld = root && firstChild(root, 'p:cSld')\n\t\treturn cSld ? firstChild(cSld, 'p:spTree') : null\n\t}\n}\n","/**\n * Read a slide's **legacy** review comments (`p:cmLst/p:cm` in\n * `ppt/comments/commentN.xml`) plus the deck-wide comment-author registry\n * (`p:cmAuthorLst/p:cmAuthor` in `ppt/commentAuthors.xml`), the read counterparts\n * of the write-side `slide.addComment(...)` / `commentAuthors.xml` emitter.\n *\n * This models the ISO/IEC 29500 §13 *legacy* comment schema — the one the writer\n * authors and older PowerPoint decks carry. The 2018 **modern** comment parts\n * (`p188:cm` / `ppt/comments/modernComment_*` + `authors.xml`) are a separate,\n * GUID-keyed, thread-capable schema; they are decoded read-only by the\n * `readModern*` functions below, and have no writer (preserved byte-perfect on\n * round-trip). The two schemas do not coexist in a single deck in practice —\n * {@link commentSchema} reports which one a deck uses.\n */\nimport { OpcPackage } from '../opc/package.js'\nimport type { Part } from '../opc/part.js'\nimport { attr, firstChild, getElements, intValue, type Element } from '../oxml/dom.js'\n\n/** The slide → comments-part relationship type (legacy comments). */\nconst COMMENTS_REL_TYPE = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments'\n/** The presentation → commentAuthors-part relationship type. */\nconst COMMENT_AUTHORS_REL_TYPE = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/commentAuthors'\n\n/** Content type of a legacy per-slide comments part (`ppt/comments/commentN.xml`). */\nconst LEGACY_COMMENTS_CONTENT_TYPE = 'application/vnd.openxmlformats-officedocument.presentationml.comments+xml'\n/** The slide → modern-comments-part relationship type (2018 schema). */\nconst MODERN_COMMENTS_REL_TYPE = 'http://schemas.microsoft.com/office/2018/10/relationships/comments'\n/** The presentation → modern-authors-part relationship type (2018 schema). */\nconst MODERN_AUTHORS_REL_TYPE = 'http://schemas.microsoft.com/office/2018/10/relationships/authors'\n/** Content type of the modern per-slide comments part (`ppt/comments/modernComment_*.xml`). */\nconst MODERN_COMMENTS_CONTENT_TYPE = 'application/vnd.ms-powerpoint.comments+xml'\n\n/** One entry of the deck-wide comment-author registry (`p:cmAuthor`). */\nexport interface CommentAuthor {\n\t/** Author id (`@id`), referenced by each comment's `@authorId`. */\n\tid: number | null\n\t/** Display name (`@name`). */\n\tname: string\n\t/** Initials shown in the comment marker (`@initials`). */\n\tinitials: string\n\t/** Highest per-author comment index used (`@lastIdx`). */\n\tlastIdx: number | null\n\t/** Author colour slot (`@clrIdx`). */\n\tclrIdx: number | null\n}\n\n/** One legacy review comment (`p:cm`), with its author resolved via the registry. */\nexport interface Comment {\n\t/** Resolved author display name (via `@authorId` → `commentAuthors.xml`), or `null` when unresolved. */\n\tauthor: string | null\n\t/** Resolved author initials, or `null` when unresolved. */\n\tauthorInitials: string | null\n\t/** The comment's `@authorId`, or `null` when absent/unparseable. */\n\tauthorId: number | null\n\t/** The comment's per-author 1-based index (`@idx`), or `null` when absent. */\n\tidx: number | null\n\t/** The comment body text (`p:text`). */\n\ttext: string\n\t/** Marker X position in EMU (`p:pos/@x`), or `null` when absent. */\n\tx: number | null\n\t/** Marker Y position in EMU (`p:pos/@y`), or `null` when absent. */\n\ty: number | null\n\t/** Authored timestamp (`@dt`, ISO-8601 as written), or `null` when absent. */\n\tdate: string | null\n}\n\n/** Parse a `p:cmAuthorLst` root element into the author registry. */\nfunction parseCommentAuthors(root: Element | null): CommentAuthor[] {\n\tif (!root) return []\n\treturn getElements(root, 'p:cmAuthor').map((el) => ({\n\t\tid: intValue(attr(el, 'id')),\n\t\tname: attr(el, 'name') ?? '',\n\t\tinitials: attr(el, 'initials') ?? '',\n\t\tlastIdx: intValue(attr(el, 'lastIdx')),\n\t\tclrIdx: intValue(attr(el, 'clrIdx')),\n\t}))\n}\n\n/**\n * Read the deck-wide comment authors from `ppt/commentAuthors.xml`, resolved via the\n * presentation part's `commentAuthors` relationship. `[]` when the deck has no comments.\n */\nexport function readCommentAuthors(opc: OpcPackage, presentationPartName: string): CommentAuthor[] {\n\tconst rels = opc.relationshipsFor(presentationPartName)\n\tconst rel = rels.byType(COMMENT_AUTHORS_REL_TYPE)[0]\n\tif (!rel) return []\n\tconst part = opc.part(rels.resolveTarget(rel.id))\n\treturn parseCommentAuthors(part?.dom.documentElement ?? null)\n}\n\n/**\n * Read one slide's legacy comments from its `comments/commentN.xml` part (resolved\n * via the slide's `comments` relationship), resolving each comment's `@authorId`\n * against `authors` (typically {@link readCommentAuthors}). `[]` when the slide has\n * no comments part.\n */\nexport function readSlideComments(opc: OpcPackage, slidePart: Part, authors: CommentAuthor[]): Comment[] {\n\tconst rels = opc.relationshipsFor(slidePart.partName)\n\tconst rel = rels.byType(COMMENTS_REL_TYPE)[0]\n\tif (!rel) return []\n\tconst part = opc.part(rels.resolveTarget(rel.id))\n\tconst root = part?.dom.documentElement\n\tif (!root) return []\n\n\tconst byId = new Map(authors.map((a) => [a.id, a]))\n\treturn getElements(root, 'p:cm').map((cm) => {\n\t\tconst authorId = intValue(attr(cm, 'authorId'))\n\t\tconst author = authorId !== null ? (byId.get(authorId) ?? null) : null\n\t\tconst pos = firstChild(cm, 'p:pos')\n\t\tconst textEl = firstChild(cm, 'p:text')\n\t\treturn {\n\t\t\tauthor: author ? author.name : null,\n\t\t\tauthorInitials: author ? author.initials : null,\n\t\t\tauthorId,\n\t\t\tidx: intValue(attr(cm, 'idx')),\n\t\t\ttext: textEl?.textContent ?? '',\n\t\t\tx: pos ? intValue(attr(pos, 'x')) : null,\n\t\t\ty: pos ? intValue(attr(pos, 'y')) : null,\n\t\t\tdate: attr(cm, 'dt') ?? null,\n\t\t}\n\t})\n}\n\n// --- Modern (2018) comments ------------------------------------------------\n//\n// PowerPoint's post-2018 comment schema (`p188`, uri\n// `http://schemas.microsoft.com/office/powerpoint/2018/8/main`). Authors move to\n// their own deck-wide `ppt/authors.xml` keyed by **GUID**, and each slide's\n// comments live in a `ppt/comments/modernComment_*.xml` part that supports reply\n// threads. This is read-only; the writer never emits these, and a modern part is\n// preserved byte-for-byte on round-trip.\n\n/** One entry of the modern deck-wide author registry (`p188:author`). */\nexport interface ModernCommentAuthor {\n\t/** Author id (`@id`) — a GUID string like `{E8A64ABA-…}`, referenced by each comment's `@authorId`. */\n\tid: string | null\n\t/** Display name (`@name`). */\n\tname: string\n\t/** Initials (`@initials`). */\n\tinitials: string\n\t/** Account identifier (`@userId`, e.g. an email), or `null`. */\n\tuserId: string | null\n\t/** Identity provider (`@providerId`, e.g. `Windows Live`), or `null`. */\n\tproviderId: string | null\n}\n\n/** One modern comment or reply (`p188:cm` / `p188:reply`), with its author resolved via the registry. */\nexport interface ModernComment {\n\t/** The comment's own GUID id (`@id`), or `null` when absent. */\n\tid: string | null\n\t/** Resolved author display name (via `@authorId` → `authors.xml`), or `null` when unresolved. */\n\tauthor: string | null\n\t/** Resolved author initials, or `null` when unresolved. */\n\tauthorInitials: string | null\n\t/** The comment's `@authorId` GUID, or `null` when absent. */\n\tauthorId: string | null\n\t/** Creation timestamp (`@created`, ISO-8601 as written), or `null` when absent. */\n\tcreated: string | null\n\t/** The comment body text; multiple paragraphs are joined with `\\n`. */\n\ttext: string\n\t/** Marker X position in EMU (`p188:pos/@x`), or `null` (replies carry no position). */\n\tx: number | null\n\t/** Marker Y position in EMU (`p188:pos/@y`), or `null` (replies carry no position). */\n\ty: number | null\n\t/** Nested replies in thread order; each is itself a {@link ModernComment} with no further replies. */\n\treplies: ModernComment[]\n}\n\n/** Which comment schema a deck carries. `'none'` when it has neither part. */\nexport type CommentSchema = 'legacy' | 'modern' | 'none'\n\n/** Concatenate a `p188:txBody`'s paragraphs into plain text, joining paragraphs with `\\n`. */\nfunction modernCommentText(el: Element): string {\n\tconst txBody = firstChild(el, 'p188:txBody')\n\tif (!txBody) return ''\n\tconst paras = getElements(txBody, 'a:p')\n\tif (paras.length === 0) return txBody.textContent ?? ''\n\treturn paras.map((p) => p.textContent ?? '').join('\\n')\n}\n\n/**\n * Decode one `p188:cm` (or `p188:reply`) element. Only the top-level comment\n * carries a position and a reply list; replies pass `withThread: false` so they\n * report `x`/`y` as `null` and never recurse (the schema forbids nested replies).\n */\nfunction parseModernComment(\n\tel: Element,\n\tbyId: Map<string | null, ModernCommentAuthor>,\n\twithThread: boolean\n): ModernComment {\n\tconst authorId = attr(el, 'authorId')\n\tconst author = authorId !== null ? (byId.get(authorId) ?? null) : null\n\tconst pos = withThread ? firstChild(el, 'p188:pos') : null\n\tconst replyLst = withThread ? firstChild(el, 'p188:replyLst') : null\n\treturn {\n\t\tid: attr(el, 'id'),\n\t\tauthor: author ? author.name : null,\n\t\tauthorInitials: author ? author.initials : null,\n\t\tauthorId,\n\t\tcreated: attr(el, 'created'),\n\t\ttext: modernCommentText(el),\n\t\tx: pos ? intValue(attr(pos, 'x')) : null,\n\t\ty: pos ? intValue(attr(pos, 'y')) : null,\n\t\treplies: replyLst ? getElements(replyLst, 'p188:reply').map((r) => parseModernComment(r, byId, false)) : [],\n\t}\n}\n\n/**\n * Read the deck-wide modern comment authors from `ppt/authors.xml`, resolved via\n * the presentation part's 2018 `authors` relationship. `[]` when the deck has no\n * modern authors part.\n */\nexport function readModernCommentAuthors(opc: OpcPackage, presentationPartName: string): ModernCommentAuthor[] {\n\tconst rels = opc.relationshipsFor(presentationPartName)\n\tconst rel = rels.byType(MODERN_AUTHORS_REL_TYPE)[0]\n\tif (!rel) return []\n\tconst part = opc.part(rels.resolveTarget(rel.id))\n\tconst root = part?.dom.documentElement\n\tif (!root) return []\n\treturn getElements(root, 'p188:author').map((el) => ({\n\t\tid: attr(el, 'id'),\n\t\tname: attr(el, 'name') ?? '',\n\t\tinitials: attr(el, 'initials') ?? '',\n\t\tuserId: attr(el, 'userId'),\n\t\tproviderId: attr(el, 'providerId'),\n\t}))\n}\n\n/**\n * Read one slide's modern comments from its `modernComment_*.xml` part (resolved\n * via the slide's 2018 `comments` relationship), resolving each comment's and\n * reply's `@authorId` GUID against `authors` (typically\n * {@link readModernCommentAuthors}). Replies are nested, not flattened. `[]` when\n * the slide has no modern comments part.\n */\nexport function readModernSlideComments(\n\topc: OpcPackage,\n\tslidePart: Part,\n\tauthors: ModernCommentAuthor[]\n): ModernComment[] {\n\tconst rels = opc.relationshipsFor(slidePart.partName)\n\tconst rel = rels.byType(MODERN_COMMENTS_REL_TYPE)[0]\n\tif (!rel) return []\n\tconst root = opc.part(rels.resolveTarget(rel.id))?.dom.documentElement\n\tif (!root) return []\n\tconst byId = new Map(authors.map((a) => [a.id, a]))\n\treturn getElements(root, 'p188:cm').map((cm) => parseModernComment(cm, byId, true))\n}\n\n/**\n * Report which comment schema a deck uses: `'modern'` when it carries any 2018\n * `modernComment_*` part, else `'legacy'` when it carries any classic\n * `commentN.xml` part, else `'none'`. Lets a consumer pick the right accessor\n * ({@link readModernSlideComments} vs {@link readSlideComments}) without probing\n * both.\n */\nexport function commentSchema(opc: OpcPackage): CommentSchema {\n\tif (opc.partsByContentType(MODERN_COMMENTS_CONTENT_TYPE).length > 0) return 'modern'\n\tif (opc.partsByContentType(LEGACY_COMMENTS_CONTENT_TYPE).length > 0) return 'legacy'\n\treturn 'none'\n}\n","/**\n * Read the programmatic **tags** attached to an owner part — a slide or the\n * presentation itself. A tag is a simple `@name`/`@val` string pair PowerPoint\n * (or an add-in) stores out-of-band from the visible content, referenced from the\n * owner via `p:custDataLst/p:tags@r:id` and materialized in a `ppt/tags/tagN.xml`\n * part (`p:tagLst` → `p:tag`, CT_StringTag).\n *\n * There is no writer for tags, so this is a read-only accessor; a deck's tag parts\n * are preserved byte-for-byte on round-trip. An owner may reference more than one\n * tag part (rare but legal); {@link readTagsForPart} concatenates them in\n * relationship order.\n */\nimport { OpcPackage } from '../opc/package.js'\nimport { attr, getElements } from '../oxml/dom.js'\n\n/** The owner → tags-part relationship type. */\nconst TAGS_REL_TYPE = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/tags'\n\n/** One programmatic tag (`p:tag`) — a name/value string pair. */\nexport interface Tag {\n\t/** The tag's `@name`. */\n\tname: string\n\t/** The tag's `@val`. */\n\tval: string\n}\n\n/**\n * Read every tag referenced by `ownerPartName` (a slide part or the presentation\n * part), resolving the owner's `tags` relationship(s) to their `ppt/tags/tagN.xml`\n * part(s) and flattening each part's `p:tag` children into `{ name, val }`. `[]`\n * when the owner references no tag part. Rel-driven rather than walking\n * `p:custDataLst`, so it is robust to element ordering in the owner.\n */\nexport function readTagsForPart(opc: OpcPackage, ownerPartName: string): Tag[] {\n\tconst rels = opc.relationshipsFor(ownerPartName)\n\tconst out: Tag[] = []\n\tfor (const rel of rels.byType(TAGS_REL_TYPE)) {\n\t\tconst root = opc.part(rels.resolveTarget(rel.id))?.dom.documentElement\n\t\tif (!root) continue\n\t\tfor (const tag of getElements(root, 'p:tag')) {\n\t\t\tout.push({ name: attr(tag, 'name') ?? '', val: attr(tag, 'val') ?? '' })\n\t\t}\n\t}\n\treturn out\n}\n","/**\n * Read-model proxies for a deck's shared *chrome* — the slide masters, slide\n * layouts, and themes reachable through the presentation → master → layout → theme\n * graph but owned by no single slide. A slide's concrete content is modeled by\n * {@link import('./slide.js').Slide}; this module models the property tiers a slide\n * *inherits* from: the theme's colour scheme and font scheme, the master's colour\n * map, and each master/layout placeholder's own geometry.\n *\n * The three parts form a chain — a {@link SlideLayout} resolves its {@link SlideMaster}\n * (which resolves its {@link Theme}) — and a {@link Slide} enters it through\n * `slide.layout`. Placeholders (master/layout `p:sp` shapes carrying a `p:ph`) are\n * modeled as {@link Placeholder}s: type/idx/name/id, own-`a:xfrm` geometry (EMU),\n * and a navigable {@link TextFrame}. Unlike a notes placeholder — whose geometry is\n * inherited and so reads `null` on an authored deck — a master/layout placeholder\n * carries its geometry explicitly, so position/size round-trip.\n *\n * A master's and a layout's *non*-placeholder content — the bands, rules, logos and\n * decorative furniture a template is recognized by — is reached through\n * {@link SlideMaster.shapes} / {@link SlideLayout.shapes}, which return the same\n * `AnyShape` union `Slide.shapes` does (both classes are {@link ShapeHost}s). Those\n * shapes carry the full paint surface — `resolvedFill`, `resolvedLine`,\n * `presetGeometry`, `rotation`, `absoluteFrame` — so a template renders, not merely\n * positions. `placeholders` remains the filtered convenience view over the same tree.\n *\n * A *slide* placeholder's effective inherited geometry against this chain resolves\n * via `Shape.resolvedFrame` (`shapes.ts`), the geometry sibling of the run\n * colour/size/face resolution already backed by `Slide.themeContext` → `Run.resolved*`.\n */\nimport type { OpcPackage } from '../opc/package.js'\nimport type { Part } from '../opc/part.js'\nimport type { Relationships } from '../opc/relationships.js'\nimport { attr, boolValue, firstChild, getElements, intValue, type Element } from '../oxml/dom.js'\nimport { parseClrMap, parseClrScheme, type ThemeContext } from '../oxml/theme.js'\nimport { resolveLayoutColorContext, resolveMasterColorContext } from './theme-context.js'\nimport { placeholderOf } from '../oxml/placeholder-inherit.js'\nimport { spPrXfrmEmu } from './shapes/oxml.js'\nimport { backgroundElementOf, readSlideBackground, type SlideBackground } from './slide-background.js'\nimport { buildShapes, findShapeByIdDeep, type AnyShape, type ShapeHost } from './shapes.js'\nimport { TextFrame } from './text.js'\nimport { SLIDE_MASTER_REL, THEME_REL } from '../../ooxml/rel-types.js'\n\n/** The 12 theme colour-scheme slots (`a:clrScheme` children), in schema order. */\nexport type ThemeColorSlot =\n\t| 'dk1'\n\t| 'lt1'\n\t| 'dk2'\n\t| 'lt2'\n\t| 'accent1'\n\t| 'accent2'\n\t| 'accent3'\n\t| 'accent4'\n\t| 'accent5'\n\t| 'accent6'\n\t| 'hlink'\n\t| 'folHlink'\n\nconst THEME_COLOR_SLOTS: readonly ThemeColorSlot[] = [\n\t'dk1',\n\t'lt1',\n\t'dk2',\n\t'lt2',\n\t'accent1',\n\t'accent2',\n\t'accent3',\n\t'accent4',\n\t'accent5',\n\t'accent6',\n\t'hlink',\n\t'folHlink',\n]\n\n/** The 12 colour-map tokens (`p:clrMap` attributes), each pointing at a {@link ThemeColorSlot}. */\nexport type ColorMapToken =\n\t| 'bg1'\n\t| 'tx1'\n\t| 'bg2'\n\t| 'tx2'\n\t| 'accent1'\n\t| 'accent2'\n\t| 'accent3'\n\t| 'accent4'\n\t| 'accent5'\n\t| 'accent6'\n\t| 'hlink'\n\t| 'folHlink'\n\nconst COLOR_MAP_TOKENS: readonly ColorMapToken[] = [\n\t'bg1',\n\t'tx1',\n\t'bg2',\n\t'tx2',\n\t'accent1',\n\t'accent2',\n\t'accent3',\n\t'accent4',\n\t'accent5',\n\t'accent6',\n\t'hlink',\n\t'folHlink',\n]\n\n/**\n * One theme font family (`a:majorFont` or `a:minorFont`): the primary Latin face\n * plus the East-Asian and complex-script faces. Each is `null` when the theme\n * leaves that slot empty (`typeface=\"\"`, PowerPoint's default for `ea`/`cs`). The\n * per-script `<a:font>` fallback list is not decoded here.\n */\nexport interface ThemeFontFace {\n\t/** `<a:latin@typeface>` — the primary face (e.g. `Calibri Light`), or `null` when empty. */\n\tlatin: string | null\n\t/** `<a:ea@typeface>` — the East-Asian face, or `null` when empty. */\n\tea: string | null\n\t/** `<a:cs@typeface>` — the complex-script face, or `null` when empty. */\n\tcs: string | null\n}\n\n/** A theme's `a:fontScheme`: its name plus the major (heading) and minor (body) font families. */\nexport interface ThemeFontScheme {\n\t/** `<a:fontScheme@name>` (e.g. `Office`), or `null` when unnamed. */\n\tname: string | null\n\t/** The `a:majorFont` family — the heading (`+mj-*`) fonts. */\n\tmajor: ThemeFontFace\n\t/** The `a:minorFont` family — the body (`+mn-*`) fonts. */\n\tminor: ThemeFontFace\n}\n\n/** Read `<a:latin>`/`<a:ea>`/`<a:cs>` typefaces of a theme font family; empty string ⇒ `null`. */\nfunction readThemeFontFace(font: Element | null): ThemeFontFace {\n\tconst face = (child: string): string | null => {\n\t\tconst el = font && firstChild(font, child)\n\t\treturn (el && attr(el, 'typeface')) || null\n\t}\n\treturn { latin: face('a:latin'), ea: face('a:ea'), cs: face('a:cs') }\n}\n\n/**\n * A deck's theme part (`theme1.xml`) as a modeled object. Exposes the two property\n * tiers a slide resolves against: the {@link colorScheme} (the 12 `a:clrScheme`\n * slots as literal hex, `a:sysClr` resolved via its `lastClr`) and the\n * {@link fontScheme} (major/minor Latin/EA/CS faces). Reachable from\n * {@link SlideMaster.theme} and `Slide.theme`.\n */\nexport class Theme {\n\tconstructor(\n\t\t/** The theme's OPC part (`/ppt/theme/themeN.xml`). */\n\t\treadonly part: Part\n\t) {}\n\n\t/** Partname of the theme part. */\n\tget partName(): string {\n\t\treturn this.part.partName\n\t}\n\n\t/** Theme name (`a:theme/@name`, e.g. `Office Theme`), or `null` when unnamed. */\n\tget name(): string | null {\n\t\tconst root = this.part.dom.documentElement\n\t\treturn root ? attr(root, 'name') : null\n\t}\n\n\t/** Colour-scheme name (`a:clrScheme/@name`, e.g. `Office`), or `null`. */\n\tget colorSchemeName(): string | null {\n\t\tconst clrScheme = this.#clrScheme()\n\t\treturn clrScheme ? attr(clrScheme, 'name') : null\n\t}\n\n\t/**\n\t * The theme colour scheme: the 12 {@link ThemeColorSlot}s resolved to a 6-hex RGB\n\t * (an `a:sysClr` slot resolves through its `lastClr`). A slot the theme does not\n\t * define reads `null`. Use {@link color} to look one slot up.\n\t */\n\tget colorScheme(): Record<ThemeColorSlot, string | null> {\n\t\tconst parsed = parseClrScheme(this.#clrScheme())\n\t\tconst out = {} as Record<ThemeColorSlot, string | null>\n\t\tfor (const slot of THEME_COLOR_SLOTS) out[slot] = parsed.get(slot) ?? null\n\t\treturn out\n\t}\n\n\t/** The 6-hex RGB of one colour-scheme slot, or `null` when the theme does not define it. */\n\tcolor(slot: ThemeColorSlot): string | null {\n\t\treturn parseClrScheme(this.#clrScheme()).get(slot) ?? null\n\t}\n\n\t/** The theme's `a:fontScheme` (major/minor font families), or `null` when the theme declares none. */\n\tget fontScheme(): ThemeFontScheme | null {\n\t\tconst themeElements = this.#themeElements()\n\t\tconst fontScheme = themeElements && firstChild(themeElements, 'a:fontScheme')\n\t\tif (!fontScheme) return null\n\t\treturn {\n\t\t\tname: attr(fontScheme, 'name'),\n\t\t\tmajor: readThemeFontFace(firstChild(fontScheme, 'a:majorFont')),\n\t\t\tminor: readThemeFontFace(firstChild(fontScheme, 'a:minorFont')),\n\t\t}\n\t}\n\n\t/** Escape hatch: the underlying `a:theme` element. After mutating it call {@link markDirty}, or `save()` writes the original bytes. */\n\tget element_(): Element | null {\n\t\treturn this.part.dom.documentElement\n\t}\n\n\t/** Mark the theme part dirty so `save()` reserializes it. Call after mutating {@link element_}. */\n\tmarkDirty(): void {\n\t\tthis.part.markDirty()\n\t}\n\n\t#themeElements(): Element | null {\n\t\tconst root = this.part.dom.documentElement\n\t\treturn root ? firstChild(root, 'a:themeElements') : null\n\t}\n\n\t#clrScheme(): Element | null {\n\t\tconst themeElements = this.#themeElements()\n\t\treturn themeElements ? firstChild(themeElements, 'a:clrScheme') : null\n\t}\n}\n\n/** The placeholder shapes (`p:sp` carrying a `p:ph`) of a master/layout `p:spTree`, in document order. */\nfunction placeholderShapes(spTree: Element | null): Element[] {\n\tif (!spTree) return []\n\treturn getElements(spTree, 'p:sp').filter((sp) => placeholderOf(sp) !== null)\n}\n\n/**\n * One placeholder shape (`p:sp` with a `p:ph`) of a slide master or slide layout —\n * the definition a slide's placeholder of the same `type`/`idx` inherits geometry\n * and text style from. Geometry getters read the placeholder's *own* `a:xfrm`,\n * which a master/layout placeholder carries explicitly (so it round-trips, unlike a\n * notes placeholder's inherited geometry).\n *\n * This is the identity-and-geometry view. The same `p:sp` also appears in\n * {@link SlideMaster.shapes} / {@link SlideLayout.shapes} as an `AutoShape`, which\n * additionally carries the paint surface (`resolvedFill`, `resolvedLine`,\n * `presetGeometry`, `rotation`, `absoluteFrame`) and reports its `p:ph` through\n * `AutoShape.placeholder`. Read a placeholder here to *place* it; read it there to\n * *draw* it.\n */\nexport class Placeholder {\n\tconstructor(\n\t\tprivate readonly sp: Element,\n\t\tprivate readonly part: Part,\n\t\t/** The owning master/layout theme context, threaded to {@link textFrame}. */\n\t\tprivate readonly themeContext: ThemeContext,\n\t\t/** The owning part's relationships, threaded to {@link textFrame} for hyperlink resolution. */\n\t\tprivate readonly relationships: Relationships\n\t) {}\n\n\t#cNvPr(): Element | null {\n\t\tconst nvSpPr = firstChild(this.sp, 'p:nvSpPr')\n\t\treturn nvSpPr ? firstChild(nvSpPr, 'p:cNvPr') : null\n\t}\n\n\t/** Placeholder type (`p:ph/@type`: `title` | `body` | `sldNum` | …), or `null` when absent (a body placeholder). */\n\tget type(): string | null {\n\t\tconst ph = placeholderOf(this.sp)\n\t\treturn ph ? attr(ph, 'type') : null\n\t}\n\n\t/** Placeholder index (`p:ph/@idx`), or `null` when unset. */\n\tget idx(): string | null {\n\t\tconst ph = placeholderOf(this.sp)\n\t\treturn ph ? attr(ph, 'idx') : null\n\t}\n\n\t/** Shape name (`p:cNvPr/@name`), or `''` when unnamed. */\n\tget name(): string {\n\t\tconst cNvPr = this.#cNvPr()\n\t\treturn (cNvPr && attr(cNvPr, 'name')) ?? ''\n\t}\n\n\t/** Drawing id (`p:cNvPr/@id`), or `null` when absent. */\n\tget id(): number | null {\n\t\tconst cNvPr = this.#cNvPr()\n\t\treturn cNvPr ? intValue(attr(cNvPr, 'id')) : null\n\t}\n\n\t/** Left edge in EMU (`a:off/@x`), or `null` when the placeholder carries no own `a:xfrm`. */\n\tget left(): number | null {\n\t\treturn spPrXfrmEmu(this.sp, 'a:off', 'x')\n\t}\n\n\t/** Top edge in EMU (`a:off/@y`), or `null` when the placeholder carries no own `a:xfrm`. */\n\tget top(): number | null {\n\t\treturn spPrXfrmEmu(this.sp, 'a:off', 'y')\n\t}\n\n\t/** Width in EMU (`a:ext/@cx`), or `null` when the placeholder carries no own `a:xfrm`. */\n\tget width(): number | null {\n\t\treturn spPrXfrmEmu(this.sp, 'a:ext', 'cx')\n\t}\n\n\t/** Height in EMU (`a:ext/@cy`), or `null` when the placeholder carries no own `a:xfrm`. */\n\tget height(): number | null {\n\t\treturn spPrXfrmEmu(this.sp, 'a:ext', 'cy')\n\t}\n\n\t/**\n\t * The placeholder's text as a navigable {@link TextFrame} (`p:txBody`), or `null`\n\t * when it carries no text body. Threaded with the owning master/layout theme\n\t * context so a run's own `schemeClr` resolves through `Run.resolvedColor`.\n\t */\n\tget textFrame(): TextFrame | null {\n\t\tconst txBody = firstChild(this.sp, 'p:txBody')\n\t\treturn txBody ? new TextFrame(txBody, this.part, this.themeContext, undefined, this.relationships) : null\n\t}\n\n\t/** Escape hatch: the underlying `p:sp` element. After mutating it call {@link markDirty}, or `save()` writes the original bytes. */\n\tget element_(): Element {\n\t\treturn this.sp\n\t}\n\n\t/** Mark the owning master/layout part dirty so `save()` reserializes it. Call after mutating {@link element_}. */\n\tmarkDirty(): void {\n\t\tthis.part.markDirty()\n\t}\n}\n\n/**\n * A deck's slide master (`slideMasterN.xml`) as a modeled object. Exposes the\n * property tiers a bound slide inherits: the {@link colorMap} (token → theme slot),\n * its {@link theme}, its {@link shapes} and the {@link placeholders} subset of them,\n * its own {@link background}, and the {@link layouts} that build on it. Reachable\n * from {@link SlideLayout.master} and `Slide.master`.\n */\nexport class SlideMaster implements ShapeHost {\n\t#themeContext?: ThemeContext\n\n\tconstructor(\n\t\t/** The package the master belongs to, for reaching its layouts, theme, and media. */\n\t\treadonly opc: OpcPackage,\n\t\t/** The master's OPC part (`/ppt/slideMasters/slideMasterN.xml`). */\n\t\treadonly part: Part\n\t) {}\n\n\t/** Partname of the master part. */\n\tget partName(): string {\n\t\treturn this.part.partName\n\t}\n\n\t/** This master part's relationships (its layouts, its theme, image embeds, …). */\n\tget relationships(): Relationships {\n\t\treturn this.opc.relationshipsFor(this.partName)\n\t}\n\n\t/** The master's authoring name (`p:cSld/@name`), or `''` when unnamed (the writer's default). */\n\tget name(): string {\n\t\tconst cSld = this.#cSld()\n\t\treturn (cSld && attr(cSld, 'name')) ?? ''\n\t}\n\n\t/** The master's theme (via its `theme` relationship), or `null` when absent. */\n\tget theme(): Theme | null {\n\t\tconst themePart = this.#relTarget(THEME_REL)\n\t\treturn themePart ? new Theme(themePart) : null\n\t}\n\n\t/**\n\t * The master's colour map (`p:clrMap`): each of the 12 {@link ColorMapToken}s\n\t * mapped to the {@link ThemeColorSlot} it resolves through. This is the indirection\n\t * that lets a slide's `schemeClr val=\"tx1\"` reach a theme slot (e.g. `tx1` → `dk1`).\n\t * A token the map omits reads `null`.\n\t */\n\tget colorMap(): Record<ColorMapToken, string | null> {\n\t\tconst root = this.part.dom.documentElement\n\t\tconst parsed = parseClrMap(root ? firstChild(root, 'p:clrMap') : null)\n\t\tconst out = {} as Record<ColorMapToken, string | null>\n\t\tfor (const token of COLOR_MAP_TOKENS) out[token] = parsed.get(token) ?? null\n\t\treturn out\n\t}\n\n\t/**\n\t * Every shape in the master's `p:cSld/p:spTree`, in document order — the same\n\t * `AnyShape` union `Slide.shapes` returns, so shape-walking code applies\n\t * unchanged. This is where a template's non-placeholder furniture lives: the\n\t * header band, the rule under the title, the logo. Whether a given slide draws\n\t * them is `Slide.showMasterSp` (and, for a layout, {@link SlideLayout.showMasterSp}).\n\t *\n\t * {@link placeholders} is the filtered view of the same tree.\n\t */\n\tget shapes(): AnyShape[] {\n\t\tconst spTree = this.#spTree()\n\t\treturn spTree ? buildShapes(spTree, this) : []\n\t}\n\n\t/** The shape anywhere in the master's tree with the given drawing id, or `undefined`. */\n\tshapeByIdDeep(id: number): AnyShape | undefined {\n\t\treturn findShapeByIdDeep(this.shapes, id)\n\t}\n\n\t/** The master's placeholder shapes (`p:sp` carrying a `p:ph`), in document order. */\n\tget placeholders(): Placeholder[] {\n\t\tconst ctx = this.themeContext()\n\t\tconst rels = this.relationships\n\t\treturn placeholderShapes(this.#spTree()).map((sp) => new Placeholder(sp, this.part, ctx, rels))\n\t}\n\n\t/** The layouts built on this master (via `p:sldLayoutIdLst` → its relationships), in list order. */\n\tget layouts(): SlideLayout[] {\n\t\tconst root = this.part.dom.documentElement\n\t\tconst lst = root && firstChild(root, 'p:sldLayoutIdLst')\n\t\tif (!lst) return []\n\t\tconst rels = this.relationships\n\t\tconst out: SlideLayout[] = []\n\t\tfor (const entry of getElements(lst, 'p:sldLayoutId')) {\n\t\t\tconst relId = attr(entry, 'r:id')\n\t\t\tconst part = relId ? this.opc.part(rels.resolveTarget(relId)) : null\n\t\t\tif (part) out.push(new SlideLayout(this.opc, part))\n\t\t}\n\t\treturn out\n\t}\n\n\t/**\n\t * The master's *own* background (`p:cSld/p:bg`), decoded, or `null` when it defines\n\t * none. Scoped to the master's own element — a slide's *effective* background,\n\t * resolved through the slide → layout → master chain, is `Slide.background`.\n\t */\n\tget background(): SlideBackground | null {\n\t\tconst bg = backgroundElementOf(this.part.dom.documentElement)\n\t\tif (!bg) return null\n\t\tconst themePart = this.#relTarget(THEME_REL)\n\t\treturn readSlideBackground(\n\t\t\tbg,\n\t\t\t'master',\n\t\t\tthis.themeContext(),\n\t\t\tthis.relationships,\n\t\t\tthemePart ? this.opc.relationshipsFor(themePart.partName) : null\n\t\t)\n\t}\n\n\t/**\n\t * The master's colour/font context (its `p:clrMap` + theme), resolved once and\n\t * cached. Backs each {@link Placeholder}'s text frame.\n\t */\n\tthemeContext(): ThemeContext {\n\t\treturn (this.#themeContext ??= resolveMasterColorContext(this.opc, this.partName))\n\t}\n\n\t#relTarget(type: string): Part | null {\n\t\tconst rels = this.relationships\n\t\tconst rel = rels.byType(type)[0]\n\t\treturn rel ? (this.opc.part(rels.resolveTarget(rel.id)) ?? null) : null\n\t}\n\n\t#cSld(): Element | null {\n\t\tconst root = this.part.dom.documentElement\n\t\treturn root ? firstChild(root, 'p:cSld') : null\n\t}\n\n\t#spTree(): Element | null {\n\t\tconst cSld = this.#cSld()\n\t\treturn cSld ? firstChild(cSld, 'p:spTree') : null\n\t}\n}\n\n/**\n * A deck's slide layout (`slideLayoutN.xml`) as a modeled object — the gallery entry\n * a slide binds to. Exposes its {@link name}, its {@link type} (import-only; the\n * writer authors none), its {@link master} (and, through it, the {@link theme}), its\n * {@link shapes} and the {@link placeholders} subset of them, and its own\n * {@link background}. Reachable from `Slide.layout` and {@link SlideMaster.layouts}.\n */\nexport class SlideLayout implements ShapeHost {\n\t#themeContext?: ThemeContext\n\n\tconstructor(\n\t\t/** The package the layout belongs to, for reaching its master, theme, and media. */\n\t\treadonly opc: OpcPackage,\n\t\t/** The layout's OPC part (`/ppt/slideLayouts/slideLayoutN.xml`). */\n\t\treadonly part: Part\n\t) {}\n\n\t/** Partname of the layout part. */\n\tget partName(): string {\n\t\treturn this.part.partName\n\t}\n\n\t/** This layout part's relationships (its master, image embeds, hyperlinks, …). */\n\tget relationships(): Relationships {\n\t\treturn this.opc.relationshipsFor(this.partName)\n\t}\n\n\t/** The layout's authoring name (`p:cSld/@name`, e.g. `Title and Content`), or `''` when unnamed. */\n\tget name(): string {\n\t\tconst cSld = this.#cSld()\n\t\treturn (cSld && attr(cSld, 'name')) ?? ''\n\t}\n\n\t/**\n\t * The layout type (`p:sldLayout/@type`, e.g. `title` | `obj` | `blank`), or `null`\n\t * when the layout declares none. Import-only: the writer authors no `@type`, so an\n\t * authored deck reads `null`; an imported deck carries PowerPoint's value.\n\t */\n\tget type(): string | null {\n\t\tconst root = this.part.dom.documentElement\n\t\treturn root ? attr(root, 'type') : null\n\t}\n\n\t/**\n\t * Whether this layout draws the master's non-placeholder shapes\n\t * (`p:sldLayout/@showMasterSp`). `xsd:boolean` defaulting to `true`, so an absent\n\t * attribute means shown — the layout-tier counterpart of `Slide.showMasterSp`,\n\t * and the one PowerPoint actually writes on a section-divider or full-bleed\n\t * layout. A renderer resolving what to paint under a slide's own shapes has to\n\t * consult both: the slide's flag, then its layout's.\n\t */\n\tget showMasterSp(): boolean {\n\t\tconst root = this.part.dom.documentElement\n\t\treturn boolValue(root && attr(root, 'showMasterSp')) !== false\n\t}\n\n\t/** The master this layout is built on (via its `slideMaster` relationship), or `null` when absent. */\n\tget master(): SlideMaster | null {\n\t\tconst rels = this.relationships\n\t\tconst rel = rels.byType(SLIDE_MASTER_REL)[0]\n\t\tconst part = rel ? this.opc.part(rels.resolveTarget(rel.id)) : null\n\t\treturn part ? new SlideMaster(this.opc, part) : null\n\t}\n\n\t/** The theme this layout resolves against, via its {@link master}, or `null`. */\n\tget theme(): Theme | null {\n\t\treturn this.master?.theme ?? null\n\t}\n\n\t/**\n\t * Every shape in the layout's `p:cSld/p:spTree`, in document order — the same\n\t * `AnyShape` union `Slide.shapes` returns, so shape-walking code applies\n\t * unchanged. The write API authors non-placeholder shapes here: every\n\t * `defineSlideMaster({ objects })` member that is not a `placeholder` (a `rect`,\n\t * a `line`, an `image`, a `chart`, a `text` box) lands in this tree.\n\t *\n\t * {@link placeholders} is the filtered view of the same tree.\n\t */\n\tget shapes(): AnyShape[] {\n\t\tconst spTree = this.#spTree()\n\t\treturn spTree ? buildShapes(spTree, this) : []\n\t}\n\n\t/** The shape anywhere in the layout's tree with the given drawing id, or `undefined`. */\n\tshapeByIdDeep(id: number): AnyShape | undefined {\n\t\treturn findShapeByIdDeep(this.shapes, id)\n\t}\n\n\t/** The layout's placeholder shapes (`p:sp` carrying a `p:ph`), in document order. */\n\tget placeholders(): Placeholder[] {\n\t\tconst ctx = this.themeContext()\n\t\tconst rels = this.relationships\n\t\treturn placeholderShapes(this.#spTree()).map((sp) => new Placeholder(sp, this.part, ctx, rels))\n\t}\n\n\t/**\n\t * The layout's *own* background (`p:cSld/p:bg`), decoded, or `null` when it defines\n\t * none. A layout usually authors one — an explicit fill (`p:bgPr`) or a\n\t * theme-indexed reference (`p:bgRef`). The slide's *effective* background is\n\t * `Slide.background`.\n\t */\n\tget background(): SlideBackground | null {\n\t\tconst bg = backgroundElementOf(this.part.dom.documentElement)\n\t\tif (!bg) return null\n\t\tconst themePart = this.master?.theme?.part ?? null\n\t\treturn readSlideBackground(\n\t\t\tbg,\n\t\t\t'layout',\n\t\t\tthis.themeContext(),\n\t\t\tthis.relationships,\n\t\t\tthemePart ? this.opc.relationshipsFor(themePart.partName) : null\n\t\t)\n\t}\n\n\t/**\n\t * The layout's colour/font context (walked layout → master → theme), resolved once\n\t * and cached. Backs each {@link Placeholder}'s text frame.\n\t */\n\tthemeContext(): ThemeContext {\n\t\treturn (this.#themeContext ??= resolveLayoutColorContext(this.opc, this.partName))\n\t}\n\n\t#cSld(): Element | null {\n\t\tconst root = this.part.dom.documentElement\n\t\treturn root ? firstChild(root, 'p:cSld') : null\n\t}\n\n\t#spTree(): Element | null {\n\t\tconst cSld = this.#cSld()\n\t\treturn cSld ? firstChild(cSld, 'p:spTree') : null\n\t}\n}\n","/**\n * Typed read/edit model for a slide's `p:transition` (slide-show transition).\n *\n * The element sits in `CT_Slide` between `p:clrMapOvr` and `p:timing` and comes\n * in two shapes PowerPoint emits:\n *\n * - **bare** `<p:transition spd=… advClick=… advTm=…><p:TYPE …/></p:transition>`\n * when the duration matches a coarse `spd` speed bucket; and\n * - **wrapped** `<mc:AlternateContent>` carrying a `<mc:Choice Requires=\"p14\">`\n * whose `p:transition` adds the precise `p14:dur` (milliseconds), plus a base\n * `<mc:Fallback>` without it — emitted for an off-bucket exact duration.\n *\n * The getter prefers the `p14` Choice (so `durationMs` is recovered); the setter\n * emits the `mc:AlternateContent` form when `durationMs` is set and the bare form\n * otherwise. See `docs/animations-and-transitions.md`.\n */\nimport {\n\tOOXML_NS,\n\tattr,\n\tboolValue,\n\tchildElements,\n\tcreateElement,\n\tfirstChild,\n\tintValue,\n\tsetAttr,\n\ttype Document,\n\ttype Element,\n} from '../oxml/dom.js'\n\n/** `ST_TransitionSpeed` — the coarse speed bucket (`spd`), default `fast`. */\nexport type TransitionSpeed = 'slow' | 'med' | 'fast'\n\n/** Decoded slide transition (`p:transition`), as returned by {@link Slide.transition}. */\nexport interface TransitionInfo {\n\t/**\n\t * The transition-type element's local name (e.g. `fade`, `push`, `wipe`,\n\t * `cut`, `dissolve`). Base ECMA-376 types use the `p` namespace; modern\n\t * PowerPoint types live in `p14`/`p15`/`p159` (see {@link namespace}).\n\t */\n\ttype: string\n\t/** The transition element's namespace prefix (`p` for base, else `p14`/`p15`/`p159`). */\n\tnamespace: string\n\t/** Coarse speed bucket; `fast` when `spd` is absent (its schema default). */\n\tspeed: TransitionSpeed\n\t/** Exact duration in milliseconds (`p14:dur`), or `null` when only a speed bucket is set. */\n\tdurationMs: number | null\n\t/** Whether the slide advances on click (`advClick`, default `true`). */\n\tadvanceOnClick: boolean\n\t/** Auto-advance delay in milliseconds (`advTm`), or `null` when not timed. */\n\tadvanceAfterMs: number | null\n\t/** Type-specific variant attributes (e.g. `{ dir: 'd' }` for push, `{ spokes: '2' }` for wheel). */\n\tvariant: Record<string, string>\n\t/** Transition sound (`p:sndAc`), or `null` when the transition is silent. */\n\tsound: TransitionSoundInfo | null\n}\n\n/** Decoded transition sound (`p:sndAc`). A start sound (`p:stSnd`) or the stop-previous form (`p:endSnd`). */\nexport interface TransitionSoundInfo {\n\t/** `start` for an embedded start sound (`p:stSnd`), `stop` for the stop-previous form (`p:endSnd`). */\n\tform: 'start' | 'stop'\n\t/** Whether the start sound loops until the next sound (`p:stSnd @loop`). Always `false` for `stop`. */\n\tloop: boolean\n\t/** Relationship id of the embedded WAV (`p:snd @r:embed`), or `null` (stop form / missing). */\n\tembedRid: string | null\n\t/** Display name on `p:snd @name`, or `null`. */\n\tname: string | null\n}\n\n/** Transition fields accepted by the {@link Slide.transition} setter. `speed` defaults are derived from `durationMs`. */\nexport interface TransitionInput {\n\ttype: string\n\t/** Namespace prefix for the type element; defaults to `p` (base ECMA-376). */\n\tnamespace?: string\n\tspeed?: TransitionSpeed\n\tdurationMs?: number | null\n\tadvanceOnClick?: boolean\n\tadvanceAfterMs?: number | null\n\tvariant?: Record<string, string>\n}\n\n/** Child element names of `p:transition` that are not the transition-type choice. */\nconst NON_TYPE_CHILDREN = new Set(['sndAc', 'extLst'])\n\n/** The single transition-type child element (the choice), or `null`. */\nfunction typeElement(transition: Element): Element | null {\n\tfor (const child of childElements(transition)) {\n\t\tif (!NON_TYPE_CHILDREN.has(child.localName ?? '')) return child\n\t}\n\treturn null\n}\n\n/** Namespace prefix for a URI, defaulting to `p` for the base presentationml namespace. */\nfunction prefixFor(uri: string | null): string {\n\tif (!uri) return 'p'\n\tfor (const [prefix, ns] of Object.entries(OOXML_NS)) {\n\t\tif (ns === uri) return prefix\n\t}\n\t// Modern transition namespaces not in the canonical registry.\n\tif (uri === 'http://schemas.microsoft.com/office/powerpoint/2012/main') return 'p15'\n\tif (uri === 'http://schemas.microsoft.com/office/powerpoint/2015/9/main') return 'p159'\n\treturn 'p'\n}\n\n/** Collect a transition-type element's non-namespace attributes by local name. */\nfunction variantAttrs(element: Element): Record<string, string> {\n\tconst out: Record<string, string> = {}\n\tconst attrs = element.attributes\n\tfor (let i = 0; i < attrs.length; i++) {\n\t\tconst a = attrs[i]\n\t\tif (!a || a.prefix === 'xmlns' || a.name === 'xmlns') continue\n\t\tout[a.localName ?? a.name] = a.value\n\t}\n\treturn out\n}\n\n/**\n * Locate the slide's transition under the root `p:sld`, returning the\n * `p:transition` element to decode (the `p14` Choice when wrapped) and the\n * outermost node that represents it (the bare element or the `mc:AlternateContent`\n * wrapper), or `null` when the slide has no transition.\n */\nexport function findTransition(root: Element): { transition: Element; outer: Element } | null {\n\tconst bare = firstChild(root, 'p:transition')\n\tif (bare) return { transition: bare, outer: bare }\n\n\tconst altContent = firstChild(root, 'mc:AlternateContent')\n\tif (altContent) {\n\t\tconst choice = firstChild(altContent, 'mc:Choice')\n\t\tconst transition = choice ? firstChild(choice, 'p:transition') : null\n\t\tif (transition) return { transition, outer: altContent }\n\t\t// Degenerate AlternateContent with only a Fallback — still surface it.\n\t\tconst fallback = firstChild(altContent, 'mc:Fallback')\n\t\tconst fbTransition = fallback ? firstChild(fallback, 'p:transition') : null\n\t\tif (fbTransition) return { transition: fbTransition, outer: altContent }\n\t}\n\treturn null\n}\n\n/** Decode a `p:transition` element into a {@link TransitionInfo}, or `null` when malformed. */\nexport function parseTransition(root: Element): TransitionInfo | null {\n\tconst found = findTransition(root)\n\tif (!found) return null\n\tconst { transition } = found\n\tconst type = typeElement(transition)\n\tif (!type) return null\n\n\tconst advClick = boolValue(attr(transition, 'advClick'))\n\tconst advTm = intValue(attr(transition, 'advTm'))\n\tconst spd = attr(transition, 'spd')\n\treturn {\n\t\ttype: type.localName ?? '',\n\t\tnamespace: prefixFor(type.namespaceURI),\n\t\tspeed: spd === 'slow' || spd === 'med' || spd === 'fast' ? spd : 'fast',\n\t\tdurationMs: intValue(attr(transition, 'p14:dur')),\n\t\tadvanceOnClick: advClick ?? true,\n\t\tadvanceAfterMs: advTm,\n\t\tvariant: variantAttrs(type),\n\t\tsound: parseSound(transition),\n\t}\n}\n\n/** Decode the `p:sndAc` sound-action child of a transition into a {@link TransitionSoundInfo}, or `null`. */\nfunction parseSound(transition: Element): TransitionSoundInfo | null {\n\tconst sndAc = firstChild(transition, 'p:sndAc')\n\tif (!sndAc) return null\n\tconst stSnd = firstChild(sndAc, 'p:stSnd')\n\tif (stSnd) {\n\t\tconst snd = firstChild(stSnd, 'p:snd')\n\t\treturn {\n\t\t\tform: 'start',\n\t\t\tloop: boolValue(attr(stSnd, 'loop')) ?? false,\n\t\t\tembedRid: snd ? attr(snd, 'r:embed') : null,\n\t\t\tname: snd ? attr(snd, 'name') : null,\n\t\t}\n\t}\n\tif (firstChild(sndAc, 'p:endSnd')) return { form: 'stop', loop: false, embedRid: null, name: null }\n\treturn null\n}\n\n/** Map an exact duration (ms) to PowerPoint's coarse speed bucket. */\nfunction speedForDuration(durationMs: number): TransitionSpeed {\n\tif (durationMs <= 500) return 'fast'\n\tif (durationMs <= 1000) return 'med'\n\treturn 'slow'\n}\n\n/** Build a `p:transition` element (without the `p14:dur` attribute) from an input. */\nfunction buildTransitionElement(\n\tdoc: Document,\n\tinput: TransitionInput,\n\tspeed: TransitionSpeed | null,\n\twithDur: boolean\n): Element {\n\tconst transition = createElement(doc, 'p:transition')\n\tif (speed) setAttr(transition, 'spd', speed)\n\tif (withDur && typeof input.durationMs === 'number')\n\t\tsetAttr(transition, 'p14:dur', String(Math.round(input.durationMs)))\n\tif (input.advanceOnClick === false) setAttr(transition, 'advClick', '0')\n\tif (typeof input.advanceAfterMs === 'number') setAttr(transition, 'advTm', String(Math.round(input.advanceAfterMs)))\n\n\tconst prefix = input.namespace ?? 'p'\n\tconst type = createElement(doc, `${prefix}:${input.type}`)\n\tfor (const [name, value] of Object.entries(input.variant ?? {})) setAttr(type, name, value)\n\ttransition.appendChild(type)\n\treturn transition\n}\n\n/**\n * Build the DOM node for a transition: the bare `p:transition` when no exact\n * duration is requested, or an `mc:AlternateContent` wrapper (a `p14` Choice\n * carrying `p14:dur` plus a base `mc:Fallback`) when `durationMs` is set.\n */\nexport function buildTransition(doc: Document, input: TransitionInput): Element {\n\tconst hasDuration = typeof input.durationMs === 'number'\n\tconst speed = input.speed ?? (hasDuration ? speedForDuration(input.durationMs as number) : null)\n\n\tif (!hasDuration) return buildTransitionElement(doc, input, speed, false)\n\n\tconst alt = createElement(doc, 'mc:AlternateContent')\n\tconst choice = createElement(doc, 'mc:Choice')\n\tsetAttr(choice, 'Requires', 'p14')\n\tchoice.appendChild(buildTransitionElement(doc, input, speed, true))\n\talt.appendChild(choice)\n\tconst fallback = createElement(doc, 'mc:Fallback')\n\tfallback.appendChild(buildTransitionElement(doc, input, speed, false))\n\talt.appendChild(fallback)\n\treturn alt\n}\n\n/** Remove any existing transition node (bare or wrapped) from the slide root. */\nexport function removeTransition(root: Element): void {\n\tconst found = findTransition(root)\n\tif (found) root.removeChild(found.outer)\n}\n","/**\n * Spid-aware, otherwise-opaque handling of a slide's build-animation tree\n * (`p:timing` / `p:bldLst`).\n *\n * The `p:timing` subtree is `CT_TimeNodeList` — deeply recursive and modeled\n * here as opaque DOM (an unmodified slide round-trips it byte-identically for\n * free). The only structured data we extract or rewrite is the set of `spid`\n * references — `<p:spTgt spid>` inside the timing tree and `<p:bldP spid>` in the\n * build list — so animations stay coherent when shape ids change. Three purely\n * structural operations: **enumerate**, **remap**, and **prune**. See\n * `docs/animations-and-transitions.md` (\"spid-awareness\").\n */\nimport {\n\tOOXML_NS,\n\tattr,\n\tchildElements,\n\tcreateElement,\n\tfirstChild,\n\tinsertInOrder,\n\tintValue,\n\tparseXml,\n\tsetAttr,\n\ttype Document,\n\ttype Element,\n} from '../oxml/dom.js'\nimport { InternalError } from '../../errors.js'\n\nconst P_NS = OOXML_NS.p\n\n/** Every element carrying an animation `spid` reference, across the timing tree and build list. */\nfunction spidElements(root: Element): Element[] {\n\tconst out: Element[] = []\n\tfor (const el of root.getElementsByTagNameNS(OOXML_NS.p, 'spTgt')) out.push(el)\n\tfor (const el of root.getElementsByTagNameNS(OOXML_NS.p, 'bldP')) out.push(el)\n\treturn out\n}\n\n/**\n * Whether the slide carries build animations — a `<p:bldP>` entry or any timing\n * node with a `presetID` (distinguishing animation timing from the media-loop\n * timing that has neither).\n */\nexport function hasAnimations(root: Element): boolean {\n\tif (root.getElementsByTagNameNS(OOXML_NS.p, 'bldP').length > 0) return true\n\tfor (const cTn of root.getElementsByTagNameNS(OOXML_NS.p, 'cTn')) {\n\t\tif (attr(cTn, 'presetID') !== null) return true\n\t}\n\treturn false\n}\n\n/** The sorted, de-duplicated set of `spid`s referenced by the slide's animations. */\nexport function enumerateSpids(root: Element): number[] {\n\tconst seen = new Set<number>()\n\tfor (const element of spidElements(root)) {\n\t\tconst spid = intValue(attr(element, 'spid'))\n\t\tif (spid !== null) seen.add(spid)\n\t}\n\treturn [...seen].sort((a, b) => a - b)\n}\n\n/**\n * Rewrite every animation `spid` according to `mapping` (old → new). Returns\n * `true` when at least one reference changed, so callers can `markDirty()` only\n * when needed.\n */\nexport function remapSpids(root: Element, mapping: Map<number, number>): boolean {\n\tlet changed = false\n\tfor (const element of spidElements(root)) {\n\t\tconst spid = intValue(attr(element, 'spid'))\n\t\tif (spid === null) continue\n\t\tconst next = mapping.get(spid)\n\t\tif (next !== undefined && next !== spid) {\n\t\t\tsetAttr(element, 'spid', String(next))\n\t\t\tchanged = true\n\t\t}\n\t}\n\treturn changed\n}\n\n/** The nearest ancestor `<p:par>` whose `<p:cTn>` carries a `presetID` (the effect node), or `null`. */\nfunction effectParFor(spTgt: Element): Element | null {\n\tfor (let node: Element | null = spTgt.parentNode as Element | null; node; node = node.parentNode as Element | null) {\n\t\tif (node.localName === 'par' && node.namespaceURI === OOXML_NS.p) {\n\t\t\tconst cTn = firstChild(node, 'p:cTn')\n\t\t\tif (cTn && attr(cTn, 'presetID') !== null) return node\n\t\t}\n\t}\n\treturn null\n}\n\n/** Whether a `<p:par>` wrapper node has become empty (its `p:cTn/p:childTnLst` has no element children). */\nfunction isEmptyWrapperPar(par: Element): boolean {\n\tif (par.localName !== 'par' || par.namespaceURI !== OOXML_NS.p) return false\n\tconst cTn = firstChild(par, 'p:cTn')\n\tif (!cTn || attr(cTn, 'presetID') !== null) return false // an effect par, not a wrapper\n\tconst childTnLst = firstChild(cTn, 'p:childTnLst')\n\treturn !childTnLst || childElements(childTnLst).length === 0\n}\n\n/**\n * Remove all animation traces of the given `spid`s: each shape's `<p:bldP>` and\n * the effect-level `<p:par>` nodes whose `<p:spTgt>` targets it, then any wrapper\n * `<p:par>` left empty by the removal. Keeps the opaque timing tree free of\n * dangling references when shapes are deleted. Returns `true` when anything was\n * removed.\n */\nexport function pruneSpids(root: Element, spids: Iterable<number>): boolean {\n\tconst drop = new Set<number>()\n\tfor (const s of spids) drop.add(s)\n\tif (drop.size === 0) return false\n\n\tlet changed = false\n\tconst wrappersToCheck = new Set<Element>()\n\n\t// Remove effect pars whose spTgt targets a pruned shape.\n\tconst spTgts = Array.from(root.getElementsByTagNameNS(OOXML_NS.p, 'spTgt'))\n\tconst effectPars = new Set<Element>()\n\tfor (const spTgt of spTgts) {\n\t\tconst spid = intValue(attr(spTgt, 'spid'))\n\t\tif (spid === null || !drop.has(spid)) continue\n\t\tconst effectPar = effectParFor(spTgt)\n\t\tif (effectPar) effectPars.add(effectPar)\n\t}\n\tfor (const effectPar of effectPars) {\n\t\tconst parent = effectPar.parentNode as Element | null\n\t\teffectPar.parentNode?.removeChild(effectPar)\n\t\tchanged = true\n\t\t// The wrapper par is two levels up: childTnLst → par.\n\t\tconst childTnLst = parent\n\t\tconst wrapperPar = childTnLst?.parentNode?.parentNode as Element | null\n\t\tif (wrapperPar) wrappersToCheck.add(wrapperPar)\n\t}\n\n\t// Remove now-empty wrapper pars, climbing while they keep collapsing.\n\tlet progress = true\n\twhile (progress) {\n\t\tprogress = false\n\t\t// The spread is a snapshot, not a redundant copy: the body both deletes the\n\t\t// current wrapper and adds its grandparent, and iterating a Set while mutating\n\t\t// it would visit entries added during this pass.\n\t\t// oxlint-disable-next-line unicorn/no-useless-spread\n\t\tfor (const wrapper of [...wrappersToCheck]) {\n\t\t\tif (isEmptyWrapperPar(wrapper)) {\n\t\t\t\tconst grandWrapper = wrapper.parentNode?.parentNode?.parentNode as Element | null\n\t\t\t\twrapper.parentNode?.removeChild(wrapper)\n\t\t\t\twrappersToCheck.delete(wrapper)\n\t\t\t\tif (grandWrapper) wrappersToCheck.add(grandWrapper)\n\t\t\t\tprogress = true\n\t\t\t\tchanged = true\n\t\t\t}\n\t\t}\n\t}\n\n\t// Remove the build-list entries.\n\tconst bldPs = Array.from(root.getElementsByTagNameNS(OOXML_NS.p, 'bldP'))\n\tfor (const bldP of bldPs) {\n\t\tconst spid = intValue(attr(bldP, 'spid'))\n\t\tif (spid !== null && drop.has(spid)) {\n\t\t\tbldP.parentNode?.removeChild(bldP)\n\t\t\tchanged = true\n\t\t}\n\t}\n\n\t// Drop an emptied <p:bldLst>.\n\tconst bldLsts = Array.from(root.getElementsByTagNameNS(OOXML_NS.p, 'bldLst'))\n\tfor (const bldLst of bldLsts) {\n\t\tif (childElements(bldLst).length === 0) bldLst.parentNode?.removeChild(bldLst)\n\t}\n\n\treturn changed\n}\n\n/**\n * Flatten the whole slide to its final static state by removing the build\n * animation timeline: drop the `<p:timing>` block (which carries the `<p:bldLst>`\n * and the effect tree) so every shape renders at once with no click-through\n * staging. Gated on {@link hasAnimations}: a `<p:timing>` that is purely a\n * media loop (no `<p:bldP>` and no `presetID`-bearing node) is left untouched so\n * media playback survives. Returns `true` when a timing block was removed.\n *\n * This is the whole-slide counterpart to {@link pruneSpids} (which drops the\n * builds of specific shapes). It only removes staging; it never deletes shapes,\n * so a slide that animated alternating states over the same region will show\n * them all at once after flattening — that is \"drop animations\", distinct from\n * \"remove staged/duplicate shapes\".\n */\nexport function flattenAnimations(root: Element): boolean {\n\tif (!hasAnimations(root)) return false\n\tconst timing = firstChild(root, 'p:timing')\n\tif (!timing) return false\n\ttiming.parentNode?.removeChild(timing)\n\treturn true\n}\n\n// --- carry: bring a copied shape's build animation into a destination slide ---\n\nconst P_XMLNS = `xmlns:p=\"${P_NS}\"`\n/** A fresh `p:timing` carrying only an empty `tmRoot` (no effects yet). */\nconst TIMING_SCAFFOLD = `<p:timing ${P_XMLNS}><p:tnLst><p:par><p:cTn id=\"1\" dur=\"indefinite\" restart=\"never\" nodeType=\"tmRoot\"><p:childTnLst/></p:cTn></p:par></p:tnLst></p:timing>`\n/** A fresh `mainSeq` `p:seq` (its `cTn@id` is filled in by the caller). */\nconst MAIN_SEQ_SCAFFOLD =\n\t`<p:seq ${P_XMLNS} concurrent=\"1\" nextAc=\"seek\"><p:cTn id=\"0\" dur=\"indefinite\" nodeType=\"mainSeq\"><p:childTnLst/></p:cTn>` +\n\t'<p:prevCondLst><p:cond evt=\"onPrev\" delay=\"0\"><p:tgtEl><p:sldTgt/></p:tgtEl></p:cond></p:prevCondLst>' +\n\t'<p:nextCondLst><p:cond evt=\"onNext\" delay=\"0\"><p:tgtEl><p:sldTgt/></p:tgtEl></p:cond></p:nextCondLst></p:seq>'\n\n/** Largest `<p:cTn @id>` in a subtree (0 when none). */\nfunction maxCTnId(scope: Element): number {\n\tlet max = 0\n\tfor (const cTn of scope.getElementsByTagNameNS(P_NS, 'cTn')) {\n\t\tconst id = intValue(attr(cTn, 'id'))\n\t\tif (id !== null && id > max) max = id\n\t}\n\treturn max\n}\n\n/** Renumber every `<p:cTn @id>` in `node` (document order) starting at `start`; returns the next free id. */\nfunction renumberCTnIds(node: Element, start: number): number {\n\tlet id = start\n\tfor (const cTn of node.getElementsByTagNameNS(P_NS, 'cTn')) setAttr(cTn, 'id', String(id++))\n\treturn id\n}\n\n/** Whether `par`'s subtree targets any of `spids` via a `<p:spTgt>`. */\nfunction targetsAnySpid(par: Element, spids: Set<number>): boolean {\n\tfor (const spTgt of par.getElementsByTagNameNS(P_NS, 'spTgt')) {\n\t\tconst spid = intValue(attr(spTgt, 'spid'))\n\t\tif (spid !== null && spids.has(spid)) return true\n\t}\n\treturn false\n}\n\n/** Parse a namespaced scaffold string and import its root into `doc`. */\nfunction importScaffold(doc: Document, xml: string): Element {\n\treturn doc.importNode(parseXml(xml).documentElement as Element, true)\n}\n\n/** The destination `mainSeq` `p:childTnLst` to append click groups into, creating the timing/seq scaffold as needed. */\nfunction getOrCreateMainSeqChildTnLst(root: Element, doc: Document): Element {\n\tlet timing = firstChild(root, 'p:timing')\n\tif (!timing) {\n\t\ttiming = importScaffold(doc, TIMING_SCAFFOLD)\n\t\tinsertInOrder(root, timing, ['p:extLst'])\n\t}\n\t// Reuse an existing mainSeq if present.\n\tconst existingSeq = timing.getElementsByTagNameNS(P_NS, 'seq')[0]\n\tif (existingSeq) {\n\t\tconst seqCTn = firstChild(existingSeq, 'p:cTn')\n\t\tif (seqCTn) {\n\t\t\tlet childLst = firstChild(seqCTn, 'p:childTnLst')\n\t\t\tif (!childLst) {\n\t\t\t\tchildLst = createElement(doc, 'p:childTnLst')\n\t\t\t\tseqCTn.appendChild(childLst)\n\t\t\t}\n\t\t\treturn childLst\n\t\t}\n\t}\n\t// Otherwise insert a fresh mainSeq into the tmRoot child list (before any media nodes).\n\tlet tmRootChildLst = timing.getElementsByTagNameNS(P_NS, 'childTnLst')[0]\n\tif (!tmRootChildLst) {\n\t\t// Degenerate timing with no tmRoot child list — graft the full scaffold's tnLst.\n\t\tconst fresh = importScaffold(doc, TIMING_SCAFFOLD)\n\t\tconst freshTnLst = firstChild(fresh, 'p:tnLst')\n\t\tif (freshTnLst) insertInOrder(timing, freshTnLst, ['p:bldLst', 'p:extLst'])\n\t\ttmRootChildLst = timing.getElementsByTagNameNS(P_NS, 'childTnLst')[0]\n\t}\n\tif (!tmRootChildLst)\n\t\tthrow new InternalError(\n\t\t\t'animation/timing-scaffold-failed',\n\t\t\t'getOrCreateMainSeqChildTnLst: failed to resolve or create the tmRoot child list'\n\t\t)\n\tconst seq = importScaffold(doc, MAIN_SEQ_SCAFFOLD)\n\tsetAttr(firstChild(seq, 'p:cTn') as Element, 'id', String(maxCTnId(timing) + 1))\n\ttmRootChildLst.insertBefore(seq, tmRootChildLst.firstChild)\n\treturn firstChild(firstChild(seq, 'p:cTn') as Element, 'p:childTnLst') as Element\n}\n\n/** The destination `p:bldLst` (under `p:timing`), creating it before any `p:extLst`. */\nfunction getOrCreateBldLst(timing: Element, doc: Document): Element {\n\tlet bldLst = firstChild(timing, 'p:bldLst')\n\tif (!bldLst) {\n\t\tbldLst = createElement(doc, 'p:bldLst')\n\t\tinsertInOrder(timing, bldLst, ['p:extLst'])\n\t}\n\treturn bldLst\n}\n\n/**\n * Carry the build animation of one or more copied shapes from `sourceRoot`'s\n * timing into `targetRoot`'s, remapping shape ids via `spidMap` (source id → new\n * id on the destination). For each mapped shape: its mainSeq click-group `<p:par>`\n * (the whole click step) and `<p:bldP>` are cloned, their `spid`s remapped, their\n * `<p:cTn>` ids renumbered to stay collision-free in the destination, and appended\n * after any existing build — matching how PowerPoint merges a pasted shape's\n * animation. Returns `true` when anything was carried (so the caller can\n * `markDirty()`), `false` when the source shapes have no animation.\n */\nexport function carryShapeAnimations(sourceRoot: Element, targetRoot: Element, spidMap: Map<number, number>): boolean {\n\tconst sourceTiming = firstChild(sourceRoot, 'p:timing')\n\tif (!sourceTiming) return false\n\tconst carriedSpids = new Set(spidMap.keys())\n\n\t// Source click groups (direct children of the mainSeq child list) that target a carried shape.\n\tconst sourceSeq = sourceTiming.getElementsByTagNameNS(P_NS, 'seq')[0]\n\tconst groups: Element[] = []\n\tif (sourceSeq) {\n\t\tconst seqCTn = firstChild(sourceSeq, 'p:cTn')\n\t\tconst seqChildLst = seqCTn ? firstChild(seqCTn, 'p:childTnLst') : null\n\t\tif (seqChildLst) {\n\t\t\tfor (const par of childElements(seqChildLst)) {\n\t\t\t\tif (targetsAnySpid(par, carriedSpids)) groups.push(par)\n\t\t\t}\n\t\t}\n\t}\n\t// Source build-list entries for the carried shapes.\n\tconst sourceBldLst = firstChild(sourceTiming, 'p:bldLst')\n\tconst bldPs: Element[] = []\n\tif (sourceBldLst) {\n\t\tfor (const bldP of childElements(sourceBldLst)) {\n\t\t\tconst spid = intValue(attr(bldP, 'spid'))\n\t\t\tif (spid !== null && carriedSpids.has(spid)) bldPs.push(bldP)\n\t\t}\n\t}\n\tif (groups.length === 0 && bldPs.length === 0) return false\n\n\tconst doc = targetRoot.ownerDocument as Document\n\tconst destChildLst = getOrCreateMainSeqChildTnLst(targetRoot, doc)\n\tconst destTiming = firstChild(targetRoot, 'p:timing') as Element\n\tlet nextId = maxCTnId(destTiming) + 1\n\n\tfor (const par of groups) {\n\t\tconst clone = doc.importNode(par, true)\n\t\tremapSpids(clone, spidMap)\n\t\tnextId = renumberCTnIds(clone, nextId)\n\t\tdestChildLst.appendChild(clone)\n\t}\n\tif (bldPs.length > 0) {\n\t\tconst destBldLst = getOrCreateBldLst(destTiming, doc)\n\t\tfor (const bldP of bldPs) {\n\t\t\tconst clone = doc.importNode(bldP, true)\n\t\t\tconst spid = intValue(attr(clone, 'spid'))\n\t\t\tif (spid !== null && spidMap.has(spid)) setAttr(clone, 'spid', String(spidMap.get(spid)))\n\t\t\tdestBldLst.appendChild(clone)\n\t\t}\n\t}\n\treturn true\n}\n","/**\n * Read-model proxy for one slide (`p:sld`), backed by its live part DOM.\n */\nimport type { OpcPackage } from '../opc/package.js'\nimport type { Part } from '../opc/part.js'\nimport { relativePartName } from '../opc/partnames.js'\nimport type { Relationships } from '../opc/relationships.js'\nimport {\n\tOOXML_NS,\n\tattr,\n\tboolValue,\n\tcreateElement,\n\tfirstChild,\n\tinsertInOrder,\n\tintValue,\n\tremoveAttr,\n\tsetAttr,\n\ttype Document,\n\ttype Element,\n} from '../oxml/dom.js'\nimport type { ThemeContext } from '../oxml/theme.js'\nimport { resolveSlideColorContext, resolveSlideThemeParts } from './theme-context.js'\nimport { backgroundElementOf, readSlideBackground, type SlideBackground } from './slide-background.js'\nimport type { Presentation } from './presentation.js'\nimport {\n\tAutoShape,\n\tGraphicFrame,\n\tGroupShape,\n\tPicture,\n\tbuildShapes,\n\tfindShapeByIdDeep,\n\ttype AnyShape,\n\ttype ShapeHost,\n} from './shapes.js'\nimport { NotesSlide } from './notes.js'\nimport { readModernSlideComments, readSlideComments, type Comment, type ModernComment } from './comments.js'\nimport { readTagsForPart, type Tag } from './tags.js'\nimport { SlideLayout, type SlideMaster, type Theme } from './chrome.js'\nimport type { TextFrame } from './text.js'\nimport {\n\tbuildTransition,\n\tparseTransition,\n\tremoveTransition,\n\ttype TransitionInfo,\n\ttype TransitionInput,\n} from './transition.js'\nimport { enumerateSpids, flattenAnimations, hasAnimations, pruneSpids, remapSpids } from './animation.js'\nimport { IMAGE_REL, NOTES_SLIDE_REL, SLIDE_LAYOUT_REL } from '../../ooxml/rel-types.js'\nimport { InternalError, InvalidOptionError, PackageReadError } from '../../errors.js'\n\n/** Options for {@link Slide.addTextBox}. Geometry is in EMU. */\nexport interface AddTextBoxOptions {\n\t/** Left edge in EMU (`a:off/@x`). */\n\tleft: number\n\t/** Top edge in EMU (`a:off/@y`). */\n\ttop: number\n\t/** Width in EMU (`a:ext/@cx`); must be positive. */\n\twidth: number\n\t/** Height in EMU (`a:ext/@cy`); must be positive. */\n\theight: number\n\t/** Initial text; omitted/empty yields an empty paragraph. */\n\ttext?: string\n\t/** Shape name (`p:cNvPr/@name`); defaults to `TextBox <id>`. */\n\tname?: string\n}\n\n/** Options for {@link Slide.addPicture}. Geometry is in EMU. */\nexport interface AddPictureOptions {\n\t/** Left edge in EMU (`a:off/@x`). */\n\tleft: number\n\t/** Top edge in EMU (`a:off/@y`). */\n\ttop: number\n\t/** Width in EMU (`a:ext/@cx`); must be positive. */\n\twidth: number\n\t/** Height in EMU (`a:ext/@cy`); must be positive. */\n\theight: number\n\t/** Shape name (`p:cNvPr/@name`); defaults to `Picture <id>`. */\n\tname?: string\n\t/**\n\t * Image file extension (e.g. `png`). When omitted it is sniffed from the\n\t * image's magic bytes; supply it (with `contentType`) for formats the\n\t * sniffer does not recognize.\n\t */\n\textension?: string\n\t/** MIME content type (e.g. `image/png`); sniffed alongside `extension` when omitted. */\n\tcontentType?: string\n}\n\ninterface ImageType {\n\textension: string\n\tcontentType: string\n}\n\n/** Recognize a handful of common raster formats from their leading bytes. */\nfunction sniffImageType(bytes: Uint8Array): ImageType | null {\n\tconst b = bytes\n\tif (b.length >= 8 && b[0] === 0x89 && b[1] === 0x50 && b[2] === 0x4e && b[3] === 0x47)\n\t\treturn { extension: 'png', contentType: 'image/png' }\n\tif (b.length >= 3 && b[0] === 0xff && b[1] === 0xd8 && b[2] === 0xff)\n\t\treturn { extension: 'jpeg', contentType: 'image/jpeg' }\n\tif (b.length >= 4 && b[0] === 0x47 && b[1] === 0x49 && b[2] === 0x46 && b[3] === 0x38)\n\t\treturn { extension: 'gif', contentType: 'image/gif' }\n\tif (b.length >= 2 && b[0] === 0x42 && b[1] === 0x4d) return { extension: 'bmp', contentType: 'image/bmp' }\n\tif (\n\t\tb.length >= 4 &&\n\t\t((b[0] === 0x49 && b[1] === 0x49 && b[2] === 0x2a && b[3] === 0x00) ||\n\t\t\t(b[0] === 0x4d && b[1] === 0x4d && b[2] === 0x00 && b[3] === 0x2a))\n\t)\n\t\treturn { extension: 'tiff', contentType: 'image/tiff' }\n\tif (\n\t\tb.length >= 12 &&\n\t\tb[0] === 0x52 &&\n\t\tb[1] === 0x49 &&\n\t\tb[2] === 0x46 &&\n\t\tb[3] === 0x46 &&\n\t\tb[8] === 0x57 &&\n\t\tb[9] === 0x45 &&\n\t\tb[10] === 0x42 &&\n\t\tb[11] === 0x50\n\t)\n\t\treturn { extension: 'webp', contentType: 'image/webp' }\n\treturn null\n}\n\nexport class Slide implements ShapeHost {\n\tconstructor(\n\t\treadonly presentation: Presentation,\n\t\t/** The slide's OPC part (`/ppt/slides/slideN.xml`). */\n\t\treadonly part: Part,\n\t\t/** The slide id from `p:sldIdLst` (`p:sldId/@id`). */\n\t\treadonly slideId: number,\n\t\t/** Zero-based position in presentation order. */\n\t\treadonly index: number\n\t) {}\n\n\t/** Partname of this slide's part. */\n\tget partName(): string {\n\t\treturn this.part.partName\n\t}\n\n\t/**\n\t * Escape hatch: the underlying `p:sld` element. After mutating it call\n\t * {@link markDirty}, or `save()` writes the original bytes. Slide-level DOM\n\t * access is also reachable as `slide.part.dom`; this getter is the same node,\n\t * on the same rung of the ladder as `Shape.element_` and the rest.\n\t */\n\tget element_(): Element {\n\t\tconst root = this.part.dom.documentElement\n\t\tif (!root)\n\t\t\tthrow new PackageReadError('package/part-has-no-root', `Slide ${this.partName} has no root <p:sld> element`)\n\t\treturn root\n\t}\n\n\t/** Mark this slide's part dirty so `save()` reserializes it. Call after mutating {@link element_}. */\n\tmarkDirty(): void {\n\t\tthis.part.markDirty()\n\t}\n\n\t/** This slide part's relationships (image embeds, layout, hyperlinks, …). */\n\tget relationships(): Relationships {\n\t\treturn this.presentation.opc.relationshipsFor(this.partName)\n\t}\n\n\t/**\n\t * The deck's OPC package. Convenience for `presentation.opc`, and the member\n\t * {@link ShapeHost} names so a shape can reach a referenced part (an image, a\n\t * chart) the same way whether it lives on a slide, a layout, or a master.\n\t */\n\tget opc(): OpcPackage {\n\t\treturn this.presentation.opc\n\t}\n\n\t#themeColors?: ThemeContext\n\n\t/**\n\t * The slide's resolved theme context (`clrMap` + `clrScheme` + the theme\n\t * `fmtScheme` + `fontScheme`, plus the layout/master roots), walked once from\n\t * slide → layout → master → theme and cached on this proxy. Backs the read-model\n\t * resolved getters ({@link Shape.resolvedFill}, `Run.resolvedColor`,\n\t * `Run.resolvedSizePt`, `Run.resolvedFontFace`) so a `schemeClr` token — including\n\t * one delivered through a shape's `p:style` `fillRef`/`lnRef` — resolves to a\n\t * literal hex, and a placeholder run's inherited size/typeface (a `+mj-*`/`+mn-*`\n\t * font token included) resolves to a literal value. The maps/roots are empty when\n\t * the theme chain is incomplete, in which case tokens simply stay unresolved.\n\t */\n\tthemeContext(): ThemeContext {\n\t\treturn (this.#themeColors ??= resolveSlideColorContext(this.presentation.opc, this.partName))\n\t}\n\n\t/** Authoring name of the slide (`p:cSld/@name`), or `null` if unnamed. */\n\tget name(): string | null {\n\t\tconst cSld = this.#cSld()\n\t\treturn cSld ? attr(cSld, 'name') : null\n\t}\n\n\t/**\n\t * Whether this slide is hidden (`p:sld/@show=\"0\"`). The attribute is\n\t * `xsd:boolean` defaulting to `true`, so an absent attribute means shown.\n\t * Hidden slides are dropped from PowerPoint/LibreOffice presentations and\n\t * exported PDFs, so render order diverges from model order when any earlier\n\t * slide is hidden.\n\t */\n\tget hidden(): boolean {\n\t\tconst root = this.part.dom.documentElement\n\t\tconst show = root ? attr(root, 'show') : null\n\t\treturn show === '0' || show === 'false'\n\t}\n\n\t/**\n\t * Hide or show this slide. Hiding writes `p:sld/@show=\"0\"`; showing removes\n\t * the attribute, restoring PowerPoint's canonical shown form (absent ⇒ shown).\n\t * Marks the slide part dirty.\n\t */\n\tset hidden(value: boolean) {\n\t\tconst root = this.part.dom.documentElement\n\t\tif (!root)\n\t\t\tthrow new PackageReadError('package/part-has-no-root', `Slide ${this.partName} has no root <p:sld> element`)\n\t\tif (value) setAttr(root, 'show', '0')\n\t\telse removeAttr(root, 'show')\n\t\tthis.part.markDirty()\n\t}\n\n\t/**\n\t * Whether this slide draws the master's non-placeholder shapes\n\t * (`p:sld/@showMasterSp`). `xsd:boolean` defaulting to `true`, so an absent\n\t * attribute means shown — the same shape as {@link hidden}.\n\t *\n\t * This is the switch that decides whether {@link SlideMaster.shapes} belongs on\n\t * *this* slide. A slide the author gave a full-bleed image or a section divider\n\t * usually sets it to `0`, and a renderer that paints the master's band and logo\n\t * anyway puts the template's furniture on top of a slide that deliberately hid\n\t * it. Placeholders are unaffected: the flag suppresses only the master's\n\t * decorative shapes.\n\t */\n\tget showMasterSp(): boolean {\n\t\tconst root = this.part.dom.documentElement\n\t\treturn boolValue(root && attr(root, 'showMasterSp')) !== false\n\t}\n\n\t/**\n\t * The slide's show transition (`p:transition`), decoded into a typed model, or\n\t * `null` when the slide has none. Handles both PowerPoint forms: the bare\n\t * `<p:transition>` and the `mc:AlternateContent` wrapper that carries the exact\n\t * `p14:dur` duration (the `p14` Choice is preferred so `durationMs` is recovered).\n\t */\n\tget transition(): TransitionInfo | null {\n\t\tconst root = this.part.dom.documentElement\n\t\treturn root ? parseTransition(root) : null\n\t}\n\n\t/**\n\t * Set or clear the slide's show transition. Assigning `null` removes it.\n\t * Writing a transition with `durationMs` emits the `mc:AlternateContent` form\n\t * (a `p14` Choice carrying `p14:dur` plus a base `mc:Fallback`); otherwise the\n\t * bare `<p:transition>` is written. The node is inserted at its schema slot —\n\t * after `p:clrMapOvr`, before `p:timing`/`p:extLst`. Marks the slide part dirty.\n\t */\n\tset transition(value: TransitionInput | null) {\n\t\tconst root = this.part.dom.documentElement\n\t\tif (!root)\n\t\t\tthrow new PackageReadError('package/part-has-no-root', `Slide ${this.partName} has no root <p:sld> element`)\n\t\tremoveTransition(root)\n\t\tif (value) {\n\t\t\tconst doc = this.part.dom\n\t\t\tinsertInOrder(root, buildTransition(doc, value), ['p:timing', 'p:extLst'])\n\t\t}\n\t\tthis.part.markDirty()\n\t}\n\n\t/**\n\t * Whether the slide carries build animations (`p:timing` with a `<p:bldP>` or a\n\t * `presetID`-bearing time node). The animation tree itself is preserved opaquely;\n\t * see {@link animationSpids}.\n\t */\n\tget hasAnimations(): boolean {\n\t\tconst root = this.part.dom.documentElement\n\t\treturn root ? hasAnimations(root) : false\n\t}\n\n\t/**\n\t * @internal The sorted, de-duplicated set of shape ids (`spid`) referenced by\n\t * the slide's animations (`<p:spTgt spid>` and `<p:bldP spid>`). Exposed for the\n\t * import paths' spid-coherence checks.\n\t */\n\tanimationSpids(): number[] {\n\t\tconst root = this.part.dom.documentElement\n\t\treturn root ? enumerateSpids(root) : []\n\t}\n\n\t/**\n\t * @internal Rewrite every animation `spid` per `mapping` (old → new), keeping\n\t * the opaque timing tree coherent when shape ids are reassigned. Marks the slide\n\t * part dirty only when a reference changed.\n\t */\n\tremapAnimationSpids(mapping: Map<number, number>): void {\n\t\tconst root = this.part.dom.documentElement\n\t\tif (root && remapSpids(root, mapping)) this.part.markDirty()\n\t}\n\n\t/**\n\t * @internal Remove the build animations targeting the given shape ids (their\n\t * `<p:bldP>` and effect nodes), so deleting a shape never leaves a dangling\n\t * `spid` reference. Marks the slide part dirty only when something was removed.\n\t */\n\tpruneAnimationSpids(spids: Iterable<number>): void {\n\t\tconst root = this.part.dom.documentElement\n\t\tif (root && pruneSpids(root, spids)) this.part.markDirty()\n\t}\n\n\t/**\n\t * Flatten the slide's build animations: remove the `<p:timing>` block so the\n\t * slide renders and edits as its final static state, with every shape shown at\n\t * once. Gated like {@link hasAnimations} — a `<p:timing>` that is purely a media\n\t * loop (no `<p:bldP>` or `presetID`) is preserved so media playback survives.\n\t * Marks the slide part dirty and returns `true` only when a timing block was\n\t * removed.\n\t *\n\t * This removes click-through staging only; it does not delete shapes. If a slide\n\t * animated alternating states over the same region, the flattened render shows\n\t * them all at once — keep that distinct from removing staged/duplicate shapes.\n\t */\n\tflattenAnimations(): boolean {\n\t\tconst root = this.part.dom.documentElement\n\t\tif (root && flattenAnimations(root)) {\n\t\t\tthis.part.markDirty()\n\t\t\treturn true\n\t\t}\n\t\treturn false\n\t}\n\n\t/** Top-level shapes in the slide's shape tree, in document order. */\n\tget shapes(): AnyShape[] {\n\t\tconst spTree = this.#spTree()\n\t\treturn spTree ? buildShapes(spTree, this) : []\n\t}\n\n\t/**\n\t * All text on the slide, flattened in document order — the read-model\n\t * counterpart to {@link TextFrame.text} one level up. Every text-bearing shape\n\t * contributes its text, recursing into groups ({@link GroupShape}) and reading\n\t * table cells ({@link GraphicFrame.table}); text-free shapes (pictures,\n\t * connectors, empty boxes) contribute nothing. Blocks are joined by `\\n`; within\n\t * a table, cells in a row are joined by `\\t` and rows by `\\n`.\n\t *\n\t * This is deliberately scoped to the slide's own shape tree. It does **not**\n\t * include speaker notes (read those via {@link notesText}) or chart data labels\n\t * (read those via {@link GraphicFrame.chart}); folding those in would force\n\t * ordering and separator choices a caller is better placed to make. Extract a\n\t * whole deck with `deck.slides.map((s) => s.text)`.\n\t */\n\tget text(): string {\n\t\tconst blocks: string[] = []\n\t\tconst walk = (shapes: AnyShape[]): void => {\n\t\t\tfor (const shape of shapes) {\n\t\t\t\tif (shape instanceof GroupShape) {\n\t\t\t\t\twalk(shape.shapes)\n\t\t\t\t} else if (shape instanceof GraphicFrame) {\n\t\t\t\t\tconst table = shape.table\n\t\t\t\t\tif (!table) continue\n\t\t\t\t\tfor (const row of table.rows) {\n\t\t\t\t\t\tconst cells = row.cells.map((cell) => cell.text)\n\t\t\t\t\t\tif (cells.some((cell) => cell.length > 0)) blocks.push(cells.join('\\t'))\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tconst text = shape.text\n\t\t\t\t\tif (text.length > 0) blocks.push(text)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\twalk(this.shapes)\n\t\treturn blocks.join('\\n')\n\t}\n\n\t/**\n\t * The slide's speaker-note text — the companion to {@link text} for the notes\n\t * that {@link text} deliberately excludes. Delegates to {@link notesSlide}: finds\n\t * the notes body placeholder (`p:ph` `type=\"body\"`) and flattens its text frame\n\t * the same way {@link TextFrame.text} does (paragraphs joined by `\\n`).\n\t *\n\t * Returns `null` when the slide has **no notes slide part at all** — distinct\n\t * from `''`, which means a notes slide exists but its body is empty (PowerPoint\n\t * often attaches an empty notes slide to every slide). Only the body placeholder\n\t * is read; the slide-thumbnail (`sldImg`) and slide-number (`sldNum`)\n\t * placeholders a notes slide also carries are read via {@link notesSlide}.\n\t */\n\tget notesText(): string | null {\n\t\tconst notes = this.notesSlide\n\t\treturn notes ? notes.text : null\n\t}\n\n\t/**\n\t * The slide's speaker-note body as a navigable {@link TextFrame} — the rich\n\t * companion to {@link notesText}, which flattens the same body to a plain string.\n\t * Walk `paragraphs → runs` to recover per-run formatting (bold/italic/underline,\n\t * colour, size, face) and any notes hyperlink that {@link notesText} discards.\n\t *\n\t * `null` when the slide has **no notes slide part** (the same boundary\n\t * {@link notesText} returns `null` at), and also when a notes part exists but\n\t * carries no body-placeholder text frame — there is then no frame to hand back\n\t * (whereas {@link notesText} reports `''` for that empty-body case). Convenience\n\t * for `notesSlide.textFrame`; see {@link notesSlide} for the whole modeled notes\n\t * slide (its `sldImg`/`sldNum` placeholders and their geometry).\n\t */\n\tget notesTextFrame(): TextFrame | null {\n\t\treturn this.notesSlide?.textFrame ?? null\n\t}\n\n\t/**\n\t * The slide's speaker-notes slide (`notesSlideN.xml`) as a modeled\n\t * {@link NotesSlide}, or `null` when the slide has no notes slide part. Beyond the\n\t * body text {@link notesText}/{@link notesTextFrame} surface, this exposes the\n\t * notes slide's three placeholders — the slide thumbnail (`slideImage`), the notes\n\t * body, and the slide-number field (`slideNumber`) — each with its geometry and\n\t * (where present) a navigable text frame.\n\t *\n\t * The writer authors all three placeholders but leaves `sldImg`/`sldNum` with an\n\t * empty `p:spPr`, so on an authored deck their geometry reads `null` while an\n\t * imported deck carries the notesMaster-derived geometry. The body text and the\n\t * slide-number field round-trip either way.\n\t */\n\tget notesSlide(): NotesSlide | null {\n\t\tconst notesRel = this.relationships.byType(NOTES_SLIDE_REL)[0]\n\t\tif (!notesRel) return null\n\t\tconst notesPart = this.presentation.opc.part(this.relationships.resolveTarget(notesRel.id))\n\t\tif (!notesPart) return null\n\t\treturn new NotesSlide(this.presentation.opc, notesPart)\n\t}\n\n\t/**\n\t * The slide layout this slide is bound to (`slideLayout` relationship), as a\n\t * modeled {@link SlideLayout}, or `null` when the slide has no layout. The layout\n\t * carries the placeholder geometry and background a slide inherits; walk on to\n\t * {@link master} and {@link theme} through it (`slide.layout.master.theme`).\n\t */\n\tget layout(): SlideLayout | null {\n\t\tconst rel = this.relationships.byType(SLIDE_LAYOUT_REL)[0]\n\t\tif (!rel) return null\n\t\tconst part = this.presentation.opc.part(this.relationships.resolveTarget(rel.id))\n\t\treturn part ? new SlideLayout(this.presentation.opc, part) : null\n\t}\n\n\t/**\n\t * The slide master this slide resolves against, via its {@link layout}, as a\n\t * modeled {@link SlideMaster}, or `null` when the layout/master chain is broken.\n\t * The master owns the colour map (`schemeClr` token → theme slot) and the default\n\t * text styles a placeholder inherits.\n\t */\n\tget master(): SlideMaster | null {\n\t\treturn this.layout?.master ?? null\n\t}\n\n\t/**\n\t * The theme this slide resolves colour and font tokens against, via its\n\t * {@link layout} → {@link master} → theme, as a modeled {@link Theme}, or `null`.\n\t * Read its {@link Theme.colorScheme}/{@link Theme.fontScheme} to see the literal\n\t * palette and faces a `schemeClr`/`+mj-*` token resolves to.\n\t */\n\tget theme(): Theme | null {\n\t\treturn this.layout?.master?.theme ?? null\n\t}\n\n\t/**\n\t * The slide's **legacy** review comments (`p:cm` in its `comments/commentN.xml`\n\t * part), `[]` when it has none. Each {@link Comment} carries its body text, marker\n\t * position (EMU), timestamp, and its author resolved through the deck-wide\n\t * {@link Presentation.commentAuthors} registry (`@authorId` → name/initials). These\n\t * are the comments the writer authors via `slide.addComment(...)`; the 2018 modern\n\t * comment parts (`p188:cm`) are a separate schema, preserved but not decoded.\n\t */\n\tget comments(): Comment[] {\n\t\treturn readSlideComments(this.presentation.opc, this.part, this.presentation.commentAuthors)\n\t}\n\n\t/**\n\t * The slide's **modern** (2018) review comments (`p188:cm` in its\n\t * `modernComment_*.xml` part), `[]` when it has none. Each {@link ModernComment}\n\t * carries its body text, `created` timestamp, marker position (EMU), its author\n\t * resolved through the deck-wide {@link Presentation.modernCommentAuthors}\n\t * registry (`@authorId` GUID → name/initials), and its reply thread nested under\n\t * `replies`. Read-only — the writer authors the legacy schema; see\n\t * {@link Presentation.commentSchema} to tell which schema a deck uses.\n\t */\n\tget modernComments(): ModernComment[] {\n\t\treturn readModernSlideComments(this.presentation.opc, this.part, this.presentation.modernCommentAuthors)\n\t}\n\n\t/**\n\t * The slide's programmatic tags (`p:custDataLst/p:tags` on the slide part,\n\t * resolved to `ppt/tags/tagN.xml`) as `{ name, val }` string pairs, `[]` when it\n\t * has none. Host/add-in metadata with no visible rendering and no writer —\n\t * read-only, preserved byte-for-byte on round-trip. Deck-level tags are\n\t * {@link Presentation.tags}.\n\t */\n\tget tags(): Tag[] {\n\t\treturn readTagsForPart(this.presentation.opc, this.partName)\n\t}\n\n\t/**\n\t * The slide's effective background (`p:cSld/p:bg`), decoded into a typed\n\t * {@link SlideBackground}. Resolved through the inheritance chain: the slide's\n\t * own `p:bg` wins; failing that the slideLayout's, then the slideMaster's — the\n\t * result's `source` records which supplied it. `null` when nothing in the chain\n\t * defines a background.\n\t *\n\t * Colour tokens resolve against this slide's theme; an image background's\n\t * `r:embed` resolves to an absolute part name through the *owning* part's\n\t * relationships (the layout's rels for a layout-inherited image, etc.). Solid,\n\t * gradient, and image backgrounds are the three the writer authors and so\n\t * round-trip faithfully; `pattern`/`themeRef` are read-only for imported decks.\n\t */\n\tget background(): SlideBackground | null {\n\t\tconst opc = this.presentation.opc\n\t\tconst parts = resolveSlideThemeParts(opc, this.partName)\n\t\tconst ctx = this.themeContext()\n\t\tconst candidates: { root: Element | null; source: 'slide' | 'layout' | 'master'; partName: string | null }[] = [\n\t\t\t{ root: parts.slideRoot, source: 'slide', partName: this.partName },\n\t\t\t{ root: parts.layoutRoot, source: 'layout', partName: parts.layoutPartName },\n\t\t\t{ root: parts.masterRoot, source: 'master', partName: parts.masterPartName },\n\t\t]\n\t\tconst themeRels = parts.themePartName ? opc.relationshipsFor(parts.themePartName) : null\n\t\tfor (const { root, source, partName } of candidates) {\n\t\t\tconst bg = backgroundElementOf(root)\n\t\t\tif (!bg) continue\n\t\t\tconst rels = partName ? opc.relationshipsFor(partName) : null\n\t\t\treturn readSlideBackground(bg, source, ctx, rels, themeRels)\n\t\t}\n\t\treturn null\n\t}\n\n\t/**\n\t * The slide's own slide-number placeholder (`p:sp` with `p:ph type=\"sldNum\"`,\n\t * carrying an `<a:fld type=\"slidenum\">`), or `null` when the slide shows no slide\n\t * number of its own. This is the concrete shape the writer emits for\n\t * `pptx.setSlideNumber(...)` on a slide's layout; its geometry and run formatting\n\t * read off the returned {@link AutoShape} the same as any placeholder.\n\t *\n\t * Scoped to the slide's *own* shape tree — a slide number inherited purely from\n\t * the master's `p:hf`/placeholder (with no shape on the slide) is a master-level\n\t * concern this getter does not resolve.\n\t */\n\tget slideNumberPlaceholder(): AutoShape | null {\n\t\treturn this.placeholder('sldNum') ?? null\n\t}\n\n\t/** The first top-level shape with the given drawing id (`p:cNvPr/@id`), or `undefined`. */\n\tshapeById(id: number): AnyShape | undefined {\n\t\treturn this.shapes.find((shape) => shape.id === id)\n\t}\n\n\t/**\n\t * The first shape *anywhere* in the slide's shape tree with the given drawing id\n\t * (`p:cNvPr/@id`), descending into groups — unlike {@link shapeById}, which scans\n\t * only top-level shapes. Walked pre-order (a group is visited before its children),\n\t * matching how the writer allocates ids. `undefined` when no shape carries that id.\n\t *\n\t * Drawing ids are unique within a slide, so the first match is the only match; the\n\t * pre-order walk just fixes a deterministic order. This backs the connector-binding\n\t * resolution ({@link import('./shapes.js').Connector.startConnection}), which must\n\t * resolve a binding into a group that top-level {@link shapeById} cannot see.\n\t */\n\tshapeByIdDeep(id: number): AnyShape | undefined {\n\t\treturn findShapeByIdDeep(this.shapes, id)\n\t}\n\n\t/** The first top-level shape with the given name (`p:cNvPr/@name`), or `undefined`. */\n\tshapeByName(name: string): AnyShape | undefined {\n\t\treturn this.shapes.find((shape) => shape.name === name)\n\t}\n\n\t/**\n\t * The first placeholder of the given type (`p:ph/@type`, e.g. `title`,\n\t * `ctrTitle`, `subTitle`, `body`), optionally narrowed by `idx`. Returns\n\t * `undefined` when none match. Only `p:sp` shapes can be placeholders, so the\n\t * result is an {@link AutoShape}.\n\t */\n\tplaceholder(type: string, idx?: string): AutoShape | undefined {\n\t\treturn this.shapes.find((shape): shape is AutoShape => {\n\t\t\tconst ph = shape instanceof AutoShape ? shape.placeholder : null\n\t\t\treturn ph !== null && ph.type === type && (idx === undefined || ph.idx === idx)\n\t\t})\n\t}\n\n\t/**\n\t * Append a text box (`p:sp` with `txBox=\"1\"`) to the slide's shape tree and\n\t * return it. Geometry is required (EMU); width and height must be positive.\n\t * Allocates a drawing id unique within the slide. Marks the slide part dirty.\n\t */\n\taddTextBox(options: AddTextBoxOptions): AutoShape {\n\t\tconst { left, top, width, height } = options\n\t\trequireFinite(left, 'left')\n\t\trequireFinite(top, 'top')\n\t\trequirePositive(width, 'width')\n\t\trequirePositive(height, 'height')\n\n\t\tconst spTree = this.#spTree()\n\t\tif (!spTree)\n\t\t\tthrow new PackageReadError('slide/no-shape-tree', `Slide ${this.partName} has no spTree to add a shape to`)\n\t\tconst doc = spTree.ownerDocument\n\t\tif (!doc) throw new InternalError('oxml/node-has-no-document', 'Slide DOM has no owner document')\n\n\t\tconst id = this.#nextShapeId()\n\t\tconst sp = buildTextBox(doc, {\n\t\t\tid,\n\t\t\tname: options.name ?? `TextBox ${id}`,\n\t\t\ttext: options.text ?? '',\n\t\t\tleft: Math.round(left),\n\t\t\ttop: Math.round(top),\n\t\t\twidth: Math.round(width),\n\t\t\theight: Math.round(height),\n\t\t})\n\t\tthis.#appendShape(spTree, sp)\n\t\treturn new AutoShape(sp, this)\n\t}\n\n\t/**\n\t * Add a picture (`p:pic`) from raw image bytes and return it. Creates a media\n\t * part under `/ppt/media/`, registers its content type, wires an `image`\n\t * relationship from this slide, and appends the picture to the shape tree.\n\t * Geometry is required (EMU); width and height must be positive. The image\n\t * format is sniffed from the bytes unless `extension`/`contentType` are given.\n\t */\n\taddPicture(image: Uint8Array, options: AddPictureOptions): Picture {\n\t\tconst { left, top, width, height } = options\n\t\trequireFinite(left, 'left')\n\t\trequireFinite(top, 'top')\n\t\trequirePositive(width, 'width')\n\t\trequirePositive(height, 'height')\n\n\t\tconst sniffed = sniffImageType(image)\n\t\tconst extension = (options.extension ?? sniffed?.extension)?.toLowerCase().replace(/^\\./, '')\n\t\tconst contentType = options.contentType ?? sniffed?.contentType\n\t\tif (!extension || !contentType) {\n\t\t\tthrow new InvalidOptionError(\n\t\t\t\t'image/undeterminable-type',\n\t\t\t\t'Could not determine image type; pass { extension, contentType } to addPicture'\n\t\t\t)\n\t\t}\n\n\t\tconst spTree = this.#spTree()\n\t\tif (!spTree)\n\t\t\tthrow new PackageReadError('slide/no-shape-tree', `Slide ${this.partName} has no spTree to add a picture to`)\n\t\tconst doc = spTree.ownerDocument\n\t\tif (!doc) throw new InternalError('oxml/node-has-no-document', 'Slide DOM has no owner document')\n\n\t\tconst opc = this.presentation.opc\n\t\tconst mediaPartName = opc.reserveMediaPartName(extension)\n\t\topc.addPart(mediaPartName, contentType, image)\n\t\tconst relId = this.relationships.add(IMAGE_REL, relativePartName(this.partName, mediaPartName)).id\n\n\t\tconst id = this.#nextShapeId()\n\t\tconst pic = buildPicture(doc, {\n\t\t\tid,\n\t\t\tname: options.name ?? `Picture ${id}`,\n\t\t\trelId,\n\t\t\tleft: Math.round(left),\n\t\t\ttop: Math.round(top),\n\t\t\twidth: Math.round(width),\n\t\t\theight: Math.round(height),\n\t\t})\n\t\tthis.#appendShape(spTree, pic)\n\t\treturn new Picture(pic, this)\n\t}\n\n\t/**\n\t * @internal The slide's shape tree (`p:cSld/p:spTree`), or `null` if absent.\n\t * Exposed for cross-slide composition (`Presentation.importShape`).\n\t */\n\tshapeTree(): Element | null {\n\t\treturn this.#spTree()\n\t}\n\n\t/**\n\t * @internal The smallest drawing id (`p:cNvPr/@id`) not already used on this\n\t * slide. Exposed so `Presentation.importShape` can give a lifted shape (and its\n\t * group children) collision-free ids on the host.\n\t */\n\tnextShapeId(): number {\n\t\treturn this.#nextShapeId()\n\t}\n\n\t/** Insert a shape after grpSpPr and before any trailing p:extLst on the tree; mark dirty. */\n\t#appendShape(spTree: Element, shape: Element): void {\n\t\tspTree.insertBefore(shape, firstChild(spTree, 'p:extLst'))\n\t\tthis.part.markDirty()\n\t}\n\n\t/** The smallest drawing id (`p:cNvPr/@id`) not already used on the slide. */\n\t#nextShapeId(): number {\n\t\tconst root = this.part.dom.documentElement\n\t\tlet max = 1\n\t\tif (root) {\n\t\t\tfor (const cNvPr of root.getElementsByTagNameNS(OOXML_NS.p, 'cNvPr')) {\n\t\t\t\tconst id = intValue(attr(cNvPr, 'id'))\n\t\t\t\tif (id !== null && id > max) max = id\n\t\t\t}\n\t\t}\n\t\treturn max + 1\n\t}\n\n\t#cSld(): Element | null {\n\t\tconst root = this.part.dom.documentElement\n\t\treturn root ? firstChild(root, 'p:cSld') : null\n\t}\n\n\t#spTree(): Element | null {\n\t\tconst cSld = this.#cSld()\n\t\treturn cSld ? firstChild(cSld, 'p:spTree') : null\n\t}\n}\n\nfunction requireFinite(value: number, name: string): void {\n\tif (!Number.isFinite(value))\n\t\tthrow new InvalidOptionError('coord/non-finite', `${name} must be a finite number of EMU, got ${value}`)\n}\n\nfunction requirePositive(value: number, name: string): void {\n\trequireFinite(value, name)\n\tif (value <= 0) throw new InvalidOptionError('coord/not-positive', `${name} must be positive, got ${value}`)\n}\n\ninterface TextBoxSpec {\n\tid: number\n\tname: string\n\ttext: string\n\tleft: number\n\ttop: number\n\twidth: number\n\theight: number\n}\n\n/** Build a minimal, schema-valid text-box `p:sp` element (not yet attached). */\nfunction buildTextBox(doc: Document, spec: TextBoxSpec): Element {\n\tconst make = (qname: string): Element => createElement(doc, qname)\n\tconst append = (parent: Element, qname: string): Element => {\n\t\tconst child = make(qname)\n\t\tparent.appendChild(child)\n\t\treturn child\n\t}\n\n\tconst sp = make('p:sp')\n\n\tconst nvSpPr = append(sp, 'p:nvSpPr')\n\tconst cNvPr = append(nvSpPr, 'p:cNvPr')\n\tsetAttr(cNvPr, 'id', String(spec.id))\n\tsetAttr(cNvPr, 'name', spec.name)\n\tconst cNvSpPr = append(nvSpPr, 'p:cNvSpPr')\n\tsetAttr(cNvSpPr, 'txBox', '1')\n\tappend(nvSpPr, 'p:nvPr')\n\n\tconst spPr = append(sp, 'p:spPr')\n\tconst xfrm = append(spPr, 'a:xfrm')\n\tconst off = append(xfrm, 'a:off')\n\tsetAttr(off, 'x', String(spec.left))\n\tsetAttr(off, 'y', String(spec.top))\n\tconst ext = append(xfrm, 'a:ext')\n\tsetAttr(ext, 'cx', String(spec.width))\n\tsetAttr(ext, 'cy', String(spec.height))\n\tconst prstGeom = append(spPr, 'a:prstGeom')\n\tsetAttr(prstGeom, 'prst', 'rect')\n\tappend(prstGeom, 'a:avLst')\n\n\tconst txBody = append(sp, 'p:txBody')\n\tappend(txBody, 'a:bodyPr')\n\tappend(txBody, 'a:lstStyle')\n\tconst p = append(txBody, 'a:p')\n\tif (spec.text !== '') {\n\t\tconst r = append(p, 'a:r')\n\t\tconst t = append(r, 'a:t')\n\t\tt.textContent = spec.text\n\t\tif (spec.text !== spec.text.trim()) setAttr(t, 'xml:space', 'preserve')\n\t}\n\n\treturn sp\n}\n\ninterface PictureSpec {\n\tid: number\n\tname: string\n\trelId: string\n\tleft: number\n\ttop: number\n\twidth: number\n\theight: number\n}\n\n/** Build a minimal, schema-valid `p:pic` element (not yet attached). */\nfunction buildPicture(doc: Document, spec: PictureSpec): Element {\n\tconst make = (qname: string): Element => createElement(doc, qname)\n\tconst append = (parent: Element, qname: string): Element => {\n\t\tconst child = make(qname)\n\t\tparent.appendChild(child)\n\t\treturn child\n\t}\n\n\tconst pic = make('p:pic')\n\n\tconst nvPicPr = append(pic, 'p:nvPicPr')\n\tconst cNvPr = append(nvPicPr, 'p:cNvPr')\n\tsetAttr(cNvPr, 'id', String(spec.id))\n\tsetAttr(cNvPr, 'name', spec.name)\n\tconst cNvPicPr = append(nvPicPr, 'p:cNvPicPr')\n\tconst picLocks = append(cNvPicPr, 'a:picLocks')\n\tsetAttr(picLocks, 'noChangeAspect', '1')\n\tappend(nvPicPr, 'p:nvPr')\n\n\tconst blipFill = append(pic, 'p:blipFill')\n\tconst blip = append(blipFill, 'a:blip')\n\tsetAttr(blip, 'r:embed', spec.relId)\n\tconst stretch = append(blipFill, 'a:stretch')\n\tappend(stretch, 'a:fillRect')\n\n\tconst spPr = append(pic, 'p:spPr')\n\tconst xfrm = append(spPr, 'a:xfrm')\n\tconst off = append(xfrm, 'a:off')\n\tsetAttr(off, 'x', String(spec.left))\n\tsetAttr(off, 'y', String(spec.top))\n\tconst ext = append(xfrm, 'a:ext')\n\tsetAttr(ext, 'cx', String(spec.width))\n\tsetAttr(ext, 'cy', String(spec.height))\n\tconst prstGeom = append(spPr, 'a:prstGeom')\n\tsetAttr(prstGeom, 'prst', 'rect')\n\tappend(prstGeom, 'a:avLst')\n\n\treturn pic\n}\n","/**\n * Read a deck's document properties — the `docProps/core.xml` core properties\n * (Dublin Core title/subject/creator + OPC keywords/revision/timestamps) and the\n * `docProps/custom.xml` user-defined name/value pairs. These are the read\n * counterparts of the write-side `pptx.title`/`subject`/`author`/`revision`\n * setters (`makeXmlCore`) and `pptx.setCustomProperty(...)` (`makeXmlCustomProperties`),\n * so a reader is verified by a genuine write→read round-trip.\n *\n * Both parts are declared at the package root (`/_rels/.rels`): core-properties\n * via the OPC `metadata/core-properties` rel, custom-properties via the\n * officeDocument `custom-properties` rel.\n */\nimport type { CustomPropertyValue } from '../../types/index.js'\nimport { OpcPackage } from '../opc/package.js'\nimport { attr, childElements, firstChild, firstChildElement, intValue, type Element } from '../oxml/dom.js'\n\n/** Package-root rel to `/docProps/core.xml`. */\nconst CORE_PROPS_REL_TYPE = 'http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties'\n/** Content type of the core-properties part (fallback lookup when the rel is absent). */\nconst CORE_PROPS_CONTENT_TYPE = 'application/vnd.openxmlformats-package.core-properties+xml'\n/** Package-root rel to `/docProps/custom.xml`. */\nconst CUSTOM_PROPS_REL_TYPE = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/custom-properties'\n/** Content type of the custom-properties part (fallback lookup when the rel is absent). */\nconst CUSTOM_PROPS_CONTENT_TYPE = 'application/vnd.openxmlformats-officedocument.custom-properties+xml'\n\n/**\n * Decoded `docProps/core.xml`. Every field is optional (present only when the\n * element is). `created`/`modified`/`lastPrinted` are kept as the **raw W3CDTF\n * string** rather than parsed to `Date`, avoiding timezone round-trip loss and\n * matching the byte-preserve ethos of the read model.\n */\nexport interface CoreProperties {\n\t/** `dc:title`. */\n\ttitle?: string\n\t/** `dc:subject`. */\n\tsubject?: string\n\t/** `dc:creator` (the write-side `pptx.author`). */\n\tcreator?: string\n\t/** `cp:keywords`. */\n\tkeywords?: string\n\t/** `dc:description`. */\n\tdescription?: string\n\t/** `cp:lastModifiedBy`. */\n\tlastModifiedBy?: string\n\t/** `cp:revision`. */\n\trevision?: string\n\t/** `cp:category`. */\n\tcategory?: string\n\t/** `cp:contentStatus`. */\n\tcontentStatus?: string\n\t/** `dcterms:created`, raw W3CDTF string. */\n\tcreated?: string\n\t/** `dcterms:modified`, raw W3CDTF string. */\n\tmodified?: string\n\t/** `cp:lastPrinted`, raw W3CDTF string. */\n\tlastPrinted?: string\n}\n\n/** One user-defined custom document property (`docProps/custom.xml`). */\nexport interface CustomProperty {\n\t/** The property's `@name`. */\n\tname: string\n\t/** The decoded value, typed from its `vt:` child element. */\n\tvalue: CustomPropertyValue\n}\n\n/** `dc:title`-style core-property fields, keyed by output field → element qname. */\nconst CORE_FIELDS: ReadonlyArray<[keyof CoreProperties, string]> = [\n\t['title', 'dc:title'],\n\t['subject', 'dc:subject'],\n\t['creator', 'dc:creator'],\n\t['keywords', 'cp:keywords'],\n\t['description', 'dc:description'],\n\t['lastModifiedBy', 'cp:lastModifiedBy'],\n\t['revision', 'cp:revision'],\n\t['category', 'cp:category'],\n\t['contentStatus', 'cp:contentStatus'],\n\t['created', 'dcterms:created'],\n\t['modified', 'dcterms:modified'],\n\t['lastPrinted', 'cp:lastPrinted'],\n]\n\n/**\n * Read the deck's core document properties from `/docProps/core.xml`, resolved\n * via the package-root `core-properties` relationship (fallback: the part's\n * content type). Missing part → `{}` (all fields undefined). Present-but-empty\n * elements decode to the empty string.\n */\nexport function readCoreProperties(opc: OpcPackage): CoreProperties {\n\tconst rels = opc.relationshipsFor('/')\n\tconst rel = rels.byType(CORE_PROPS_REL_TYPE)[0]\n\tconst part = rel ? opc.part(rels.resolveTarget(rel.id)) : opc.partsByContentType(CORE_PROPS_CONTENT_TYPE)[0]\n\tconst root = part?.dom.documentElement\n\tif (!root) return {}\n\tconst out: CoreProperties = {}\n\tfor (const [field, qname] of CORE_FIELDS) {\n\t\tconst el = firstChild(root, qname)\n\t\tif (el) out[field] = el.textContent ?? ''\n\t}\n\treturn out\n}\n\n/**\n * Decode one `<property>`'s single `vt:` child into a typed value. String types\n * (`lpwstr`/`lpstr`/`bstr`) → string; integer types (`i1`..`i8`/`int`/`ui*`) →\n * number; real types (`r4`/`r8`/`decimal`) → number; `bool` → boolean;\n * `filetime`/`date` → the **raw string** (see {@link CoreProperties} on\n * timestamps). Any unrecognized `vt:` element falls back to its text content as a\n * string — lossy but never throws.\n */\nfunction decodeValue(vt: Element): CustomPropertyValue {\n\tconst text = vt.textContent ?? ''\n\tswitch (vt.localName) {\n\t\tcase 'lpwstr':\n\t\tcase 'lpstr':\n\t\tcase 'bstr':\n\t\t\treturn text\n\t\tcase 'i1':\n\t\tcase 'i2':\n\t\tcase 'i4':\n\t\tcase 'i8':\n\t\tcase 'int':\n\t\tcase 'ui1':\n\t\tcase 'ui2':\n\t\tcase 'ui4':\n\t\tcase 'ui8':\n\t\tcase 'uint':\n\t\t\treturn intValue(text) ?? text\n\t\tcase 'r4':\n\t\tcase 'r8':\n\t\tcase 'decimal': {\n\t\t\tconst n = Number.parseFloat(text)\n\t\t\treturn Number.isFinite(n) ? n : text\n\t\t}\n\t\tcase 'bool':\n\t\t\treturn text.trim().toLowerCase() === 'true' || text.trim() === '1'\n\t\tcase 'filetime':\n\t\tcase 'date':\n\t\t\treturn text\n\t\tdefault:\n\t\t\t// Unknown vt type (vt:array, vt:cy, …): keep the raw text, lossy but safe.\n\t\t\treturn text\n\t}\n}\n\n/**\n * Read the deck's user-defined custom properties from `/docProps/custom.xml`,\n * resolved via the package-root `custom-properties` relationship (fallback: the\n * part's content type). Each `<property name=...>` maps to `{ name, value }`,\n * with `value` typed from its single `vt:` child. Missing part → `[]`. A\n * `<property>` without a `@name` or without a `vt:` child is skipped.\n *\n * The `vt:` child and `<property>` element sit in namespaces outside the read\n * model's qname registry, so children are matched by local name rather than the\n * `firstChild`/`getElements` helpers.\n */\nexport function readCustomProperties(opc: OpcPackage): CustomProperty[] {\n\tconst rels = opc.relationshipsFor('/')\n\tconst rel = rels.byType(CUSTOM_PROPS_REL_TYPE)[0]\n\tconst part = rel ? opc.part(rels.resolveTarget(rel.id)) : opc.partsByContentType(CUSTOM_PROPS_CONTENT_TYPE)[0]\n\tconst root = part?.dom.documentElement\n\tif (!root) return []\n\tconst out: CustomProperty[] = []\n\tfor (const property of childElements(root)) {\n\t\tif (property.localName !== 'property') continue\n\t\tconst name = attr(property, 'name')\n\t\tconst vt = firstChildElement(property)\n\t\tif (name === null || !vt) continue\n\t\tout.push({ name, value: decodeValue(vt) })\n\t}\n\treturn out\n}\n","/**\n * Small DOM navigation helpers shared by the read-model slide/import paths.\n *\n * Each is a pure query over a live OOXML node -- no package state, no mutation -- which\n * is why they sit outside `Presentation` rather than as private methods on it.\n */\n\nimport type { Part } from '../opc/part.js'\nimport { ELEMENT_NODE, OOXML_NS, attr, firstChild, firstChildElement, type Element } from './dom.js'\n\n/** The `p:cSld@name` of a slide/layout/master part (`''` when absent). */\nexport function cSldName(part: Part | undefined): string {\n\tconst root = part?.dom.documentElement\n\tconst cSld = root && firstChild(root, 'p:cSld')\n\treturn (cSld && attr(cSld, 'name')) ?? ''\n}\n\n/** Whether `el` is a `p:spTree`'s own group properties (`p:nvGrpSpPr`/`p:grpSpPr`), not a shape. */\nfunction isSpTreeProperty(el: Element): boolean {\n\treturn el.namespaceURI === OOXML_NS.p && (el.localName === 'nvGrpSpPr' || el.localName === 'grpSpPr')\n}\n\n/** Whether a `p:spTree` child is a placeholder shape (its `*nvPr` carries a `p:ph`). */\nfunction isPlaceholderShape(shape: Element): boolean {\n\tconst nv = firstChildElement(shape)\n\tconst nvPr = nv && firstChild(nv, 'p:nvPr')\n\treturn !!(nvPr && firstChild(nvPr, 'p:ph'))\n}\n\n/** The decorative shapes on a layout/master `p:spTree`: every shape child except placeholders. */\nexport function carriedDecorations(root: Element | null): Element[] {\n\tif (!root) return []\n\tconst cSld = firstChild(root, 'p:cSld')\n\tconst spTree = cSld && firstChild(cSld, 'p:spTree')\n\tif (!spTree) return []\n\tconst out: Element[] = []\n\tfor (let node = spTree.firstChild; node; node = node.nextSibling) {\n\t\tif (node.nodeType !== ELEMENT_NODE) continue\n\t\tconst el = node as Element\n\t\tif (isSpTreeProperty(el) || isPlaceholderShape(el)) continue\n\t\tout.push(el)\n\t}\n\treturn out\n}\n\n/**\n * The `n`-th shape child of a `p:spTree` in document (z-)order, skipping the\n * tree's own `nvGrpSpPr`/`grpSpPr` and any trailing `p:extLst`. Returns `null`\n * when `n` is past the last shape (the caller then appends).\n */\nexport function nthShapeChild(spTree: Element, n: number): Element | null {\n\tlet i = 0\n\tfor (let node = spTree.firstChild; node; node = node.nextSibling) {\n\t\tif (node.nodeType !== ELEMENT_NODE) continue\n\t\tconst el = node as Element\n\t\tif (isSpTreeProperty(el)) continue\n\t\tif (el.namespaceURI === OOXML_NS.p && el.localName === 'extLst') continue\n\t\tif (i === n) return el\n\t\ti++\n\t}\n\treturn null\n}\n\n/** The first shape child of a `p:spTree` (skipping `nvGrpSpPr`/`grpSpPr`), or `null`. */\nexport function firstShapeChild(spTree: Element): Element | null {\n\tfor (let node = spTree.firstChild; node; node = node.nextSibling) {\n\t\tif (node.nodeType !== ELEMENT_NODE) continue\n\t\tconst el = node as Element\n\t\tif (!isSpTreeProperty(el)) return el\n\t}\n\treturn null\n}\n\n/** Collect `node` and all its descendant elements (document order) into `out`. */\nexport function collectElements(node: Element, out: Element[]): void {\n\tout.push(node)\n\tfor (let child = node.firstChild; child; child = child.nextSibling) {\n\t\tif (child.nodeType === ELEMENT_NODE) collectElements(child as Element, out)\n\t}\n}\n","/**\n * EMU geometry rescaling for slides imported across differing canvas sizes.\n *\n * {@link computeRescale} turns a source/target {@link SlideSize} pair into an affine\n * transform; the `rescale*` functions apply it in place to a live `p:spTree` and to the\n * table grids inside it. Pure DOM mutation -- the caller decides which parts to visit\n * and tracks which have already been rewritten.\n */\n\nimport type { SlideSize } from '../presentation-types.js'\nimport {\n\tELEMENT_NODE,\n\tOOXML_NS,\n\tattr,\n\tfirstChild,\n\tgetElements,\n\tintValue,\n\tsetAttr,\n\ttype Element,\n} from '../../oxml/dom.js'\n\n/** An EMU coordinate remap: `newX = x*sx + dx`, `newY = y*sy + dy`; sizes scale by `sx`/`sy` only. */\nexport interface RescaleTransform {\n\tsx: number\n\tsy: number\n\tdx: number\n\tdy: number\n}\n\n/** Build the EMU transform mapping source-canvas coordinates onto the target canvas (see {@link ImportSlideOptions.rescale}). */\nexport function computeRescale(source: SlideSize, target: SlideSize, mode: 'fit' | 'stretch'): RescaleTransform {\n\tif (mode === 'stretch') {\n\t\treturn { sx: target.widthEmu / source.widthEmu, sy: target.heightEmu / source.heightEmu, dx: 0, dy: 0 }\n\t}\n\t// 'fit': uniform scale (no distortion), centering the slack on the longer axis.\n\tconst scale = Math.min(target.widthEmu / source.widthEmu, target.heightEmu / source.heightEmu)\n\treturn {\n\t\tsx: scale,\n\t\tsy: scale,\n\t\tdx: (target.widthEmu - source.widthEmu * scale) / 2,\n\t\tdy: (target.heightEmu - source.heightEmu * scale) / 2,\n\t}\n}\n\n/**\n * Rescale every top-level transform on a `p:spTree`: shapes/pictures/connectors\n * (`p:spPr/a:xfrm`), groups (`p:grpSpPr/a:xfrm` — only the group's own off/ext, so\n * its children remap via the unchanged `chOff`/`chExt` rather than being recursed\n * into), and graphic frames (`p:graphicFrame/p:xfrm`, plus any inner table grid).\n * Placeholders that inherit geometry carry no `a:xfrm` and are left to inherit from\n * the (separately rescaled) layout/master.\n */\nexport function rescaleSpTree(spTree: Element, t: RescaleTransform): void {\n\tfor (let node = spTree.firstChild; node; node = node.nextSibling) {\n\t\tif (node.nodeType !== ELEMENT_NODE) continue\n\t\tconst el = node as Element\n\t\tif (el.namespaceURI !== OOXML_NS.p) continue\n\t\tswitch (el.localName) {\n\t\t\tcase 'sp':\n\t\t\tcase 'pic':\n\t\t\tcase 'cxnSp': {\n\t\t\t\tconst spPr = firstChild(el, 'p:spPr')\n\t\t\t\trescaleXfrm(spPr && firstChild(spPr, 'a:xfrm'), t)\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tcase 'grpSp': {\n\t\t\t\tconst grpSpPr = firstChild(el, 'p:grpSpPr')\n\t\t\t\trescaleXfrm(grpSpPr && firstChild(grpSpPr, 'a:xfrm'), t)\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tcase 'graphicFrame': {\n\t\t\t\trescaleXfrm(firstChild(el, 'p:xfrm'), t)\n\t\t\t\trescaleTableGrid(el, t)\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n}\n\n/** Rewrite an `a:xfrm`/`p:xfrm`: `a:off` is repositioned (scale + translate); `a:ext` is resized (scale only). */\nfunction rescaleXfrm(xfrm: Element | null, t: RescaleTransform): void {\n\tif (!xfrm) return\n\tconst off = firstChild(xfrm, 'a:off')\n\tif (off) {\n\t\tconst x = intValue(attr(off, 'x'))\n\t\tconst y = intValue(attr(off, 'y'))\n\t\tif (x !== null) setAttr(off, 'x', String(Math.round(x * t.sx + t.dx)))\n\t\tif (y !== null) setAttr(off, 'y', String(Math.round(y * t.sy + t.dy)))\n\t}\n\tconst ext = firstChild(xfrm, 'a:ext')\n\tif (ext) {\n\t\tconst cx = intValue(attr(ext, 'cx'))\n\t\tconst cy = intValue(attr(ext, 'cy'))\n\t\tif (cx !== null) setAttr(ext, 'cx', String(Math.max(0, Math.round(cx * t.sx))))\n\t\tif (cy !== null) setAttr(ext, 'cy', String(Math.max(0, Math.round(cy * t.sy))))\n\t}\n}\n\n/**\n * Scale a graphic-frame table's intrinsic dimensions — column widths by `sx`, row\n * heights by `sy` — so the table resizes with the slide (PowerPoint derives table\n * geometry from the grid, not the frame `a:ext`). No-op for non-table frames.\n */\nfunction rescaleTableGrid(graphicFrame: Element, t: RescaleTransform): void {\n\tconst graphic = firstChild(graphicFrame, 'a:graphic')\n\tconst graphicData = graphic && firstChild(graphic, 'a:graphicData')\n\tconst tbl = graphicData && firstChild(graphicData, 'a:tbl')\n\tif (!tbl) return\n\tconst grid = firstChild(tbl, 'a:tblGrid')\n\tif (grid) {\n\t\tfor (const col of getElements(grid, 'a:gridCol')) {\n\t\t\tconst w = intValue(attr(col, 'w'))\n\t\t\tif (w !== null) setAttr(col, 'w', String(Math.max(0, Math.round(w * t.sx))))\n\t\t}\n\t}\n\tfor (const tr of getElements(tbl, 'a:tr')) {\n\t\tconst h = intValue(attr(tr, 'h'))\n\t\tif (h !== null) setAttr(tr, 'h', String(Math.max(0, Math.round(h * t.sy))))\n\t}\n}\n","/**\n * Presentation-level `tableStyles.xml` merging for imported slides and masters.\n *\n * `tableStyles.xml` is a single deck-wide part that records no ownership -- it does not\n * say which style belongs to which master -- so copying styles across decks is its own\n * traversal rather than part of the master/layout copy chain. Both entry points union\n * `<a:tblStyle>` by `styleId` and are idempotent.\n *\n * The functions take a structural {@link DeckTarget} rather than a `Presentation`,\n * so this module stays independent of the class that calls it.\n */\n\nimport type { OpcPackage } from '../../opc/package.js'\nimport type { Part } from '../../opc/part.js'\nimport { relativePartName } from '../../opc/partnames.js'\nimport { OOXML_NS, attr, getElements, ownerDocumentOf, type Element } from '../../oxml/dom.js'\nimport type { DeckTarget } from './deck-target.js'\n\nconst TABLE_STYLES_REL = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/tableStyles'\nconst TABLE_STYLES_CONTENT_TYPE = 'application/vnd.openxmlformats-officedocument.presentationml.tableStyles+xml'\n// The well-known \"no style / table grid\" GUID PowerPoint uses as a tblStyleLst @def.\nconst TABLE_STYLES_DEFAULT_GUID = '{5C22544A-7EE6-4342-B048-85BDC9FD1C3A}'\n\nconst textEncoder = new TextEncoder()\n\n/**\n * Copy any table style the restyled slide references from the source\n * `tableStyles.xml` into this deck's (the `remapLiterals` table leg). A restyled\n * table resolves its `@tableStyleId` against the *destination* `tableStyles` and\n * silently falls back when that id is absent; the source `<a:tblStyle>` is itself\n * symbolic (scheme colours), so copying it verbatim under the **same** id lets the\n * table keep its structure while re-branding to this deck's theme — no table-XML\n * rewrite needed. Idempotent: an id this deck already defines is left as-is, and a\n * referenced id with no source definition is skipped. Creates and wires a\n * `tableStyles.xml` part if this deck has none.\n */\nexport function copySourceTableStyles(dest: DeckTarget, sourceOpc: OpcPackage, slideRoot: Element): void {\n\tconst ids = new Set<string>()\n\tfor (const idEl of slideRoot.getElementsByTagNameNS(OOXML_NS.a, 'tableStyleId')) {\n\t\tconst id = idEl.textContent?.trim()\n\t\tif (id) ids.add(id)\n\t}\n\tif (ids.size === 0) return\n\n\tconst sourceList = tableStyleList(sourceOpc)\n\tif (!sourceList) return\n\tconst sourceStyles = new Map(getElements(sourceList, 'a:tblStyle').map((st) => [attr(st, 'styleId'), st] as const))\n\n\tconst destPart = ensureTableStylesPart(dest)\n\tconst destList = destPart.dom.documentElement\n\tif (!destList) return\n\n\tconst referenced: Element[] = []\n\tfor (const id of ids) {\n\t\tconst src = sourceStyles.get(id)\n\t\tif (src) referenced.push(src)\n\t}\n\tif (addTableStyles(destList, referenced)) destPart.markDirty()\n}\n\n/**\n * Append each source `<a:tblStyle>` this deck does not already define, keyed by\n * `styleId` — the shared core of {@link copySourceTableStyles} (which offers only\n * the styles a restyled slide references) and {@link carryTableStyles} (which\n * offers the source's whole list). Destination-wins per id: a style this deck\n * already defines is left untouched, so a re-call adds nothing. Returns whether\n * anything was added.\n */\nfunction addTableStyles(destList: Element, styles: Iterable<Element>): boolean {\n\tconst present = new Set(getElements(destList, 'a:tblStyle').map((st) => attr(st, 'styleId')))\n\tlet added = false\n\tfor (const style of styles) {\n\t\tconst id = attr(style, 'styleId')\n\t\tif (!id || present.has(id)) continue\n\t\tdestList.appendChild(ownerDocumentOf(destList).importNode(style, true))\n\t\tpresent.add(id)\n\t\tadded = true\n\t}\n\treturn added\n}\n\n/**\n * Copy the source deck's **whole** `tableStyles.xml` into this deck: every\n * `<a:tblStyle>` it defines, plus its `a:tblStyleLst@def` (the default table\n * style). Presentation-level, so a separate traversal from the master/layout copy\n * chain — and whole-deck, since `tableStyles.xml` does not record which style\n * belongs to which master. See `ImportSlideMastersOptions.tableStyles`.\n *\n * Styles union by `styleId` (destination-wins per id, via {@link addTableStyles}),\n * but `def` is **source-wins**: a caller asking for the source's table styling\n * wants its default too, and the destination's `def` is typically a generator stub\n * rather than a deliberate choice. Carrying the styles without the `def` would be\n * the worse half-measure — the standard default GUID is one most templates also\n * define, so a new table would silently resolve to the wrong style rather than\n * visibly to none. Idempotent: a re-call re-adds nothing and re-sets `def` to the\n * same value.\n */\nexport function carryTableStyles(dest: DeckTarget, sourceOpc: OpcPackage): void {\n\tconst sourceList = tableStyleList(sourceOpc)\n\tif (!sourceList) return\n\n\tconst destPart = ensureTableStylesPart(dest)\n\tconst destList = destPart.dom.documentElement\n\tif (!destList) return\n\n\tlet changed = addTableStyles(destList, getElements(sourceList, 'a:tblStyle'))\n\n\tconst sourceDef = attr(sourceList, 'def')\n\tif (sourceDef && attr(destList, 'def') !== sourceDef) {\n\t\tdestList.setAttribute('def', sourceDef)\n\t\tchanged = true\n\t}\n\tif (changed) destPart.markDirty()\n}\n\n/** The `a:tblStyleLst` root of a package's `tableStyles.xml`, or `null` when it has none. */\nfunction tableStyleList(opc: OpcPackage): Element | null {\n\tconst part = opc.partsByContentType(TABLE_STYLES_CONTENT_TYPE)[0]\n\treturn part ? part.dom.documentElement : null\n}\n\n/**\n * The deck's `tableStyles.xml` part, creating an empty one (and wiring its\n * `presentation.xml` relationship + content type) when the deck has none.\n */\nfunction ensureTableStylesPart(dest: DeckTarget): Part {\n\tconst existing = dest.opc.partsByContentType(TABLE_STYLES_CONTENT_TYPE)[0]\n\tif (existing) return existing\n\tconst partName = dest.opc.reservePartNameLike('/ppt/tableStyles.xml')\n\tconst xml = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\r\\n<a:tblStyleLst xmlns:a=\"${OOXML_NS.a}\" def=\"${TABLE_STYLES_DEFAULT_GUID}\"/>`\n\tconst part = dest.opc.addPart(partName, TABLE_STYLES_CONTENT_TYPE, textEncoder.encode(xml))\n\tconst presRels = dest.opc.relationshipsFor(dest.presentationPart.partName)\n\tpresRels.add(TABLE_STYLES_REL, relativePartName(dest.presentationPart.partName, partName))\n\treturn part\n}\n","/**\n * Slide-master bookkeeping in `presentation.xml` and in a master's own\n * `p:sldLayoutIdLst`: registering a master so renderers treat it as active,\n * promoting masters to the front of the id list, allocating ids out of the shared\n * master/layout id space, and emptying a freshly-copied master's layout list.\n *\n * These are the destination-side half of the import machinery -- they read and\n * write only this deck, never a source package and never the copy registry -- so\n * they take a structural {@link DeckTarget} rather than a `Presentation`. The\n * source-side half that drives most of them is `part-copy.ts`.\n */\n\nimport { relativePartName } from '../../opc/partnames.js'\nimport {\n\tattr,\n\tcreateElement,\n\tfirstChild,\n\tgetElements,\n\tgetOrAddChild,\n\tintValue,\n\tremoveChildrenByQName,\n\tsetAttr,\n\ttype Element,\n} from '../../oxml/dom.js'\nimport type { DeckTarget } from './deck-target.js'\nimport { SLIDE_LAYOUT_REL, SLIDE_MASTER_REL } from '../../../ooxml/rel-types.js'\nimport { PackageReadError } from '../../../errors.js'\n\n// ST_SlideMasterId and ST_SlideLayoutId share this floor.\nconst MIN_SLIDE_MASTER_ID = 2147483648\n\n/**\n * Wire a freshly-copied slide master into `presentation.xml`: add a\n * presentation→master relationship and a `p:sldMasterId` entry in\n * `p:sldMasterIdLst`. A master that is reachable only through the\n * slide→layout→master rel chain but absent from `p:sldMasterIdLst` is treated\n * as inactive by renderers, so its background/graphics never paint. No-op when\n * the master is already registered (shared across imports from one source).\n */\nexport function registerMaster(dest: DeckTarget, masterPartName: string): void {\n\tconst presPart = dest.presentationPart\n\tconst presRels = dest.opc.relationshipsFor(presPart.partName)\n\tfor (const rel of presRels.byType(SLIDE_MASTER_REL)) {\n\t\tif (presRels.resolveTarget(rel.id) === masterPartName) return\n\t}\n\tconst relId = presRels.add(SLIDE_MASTER_REL, relativePartName(presPart.partName, masterPartName)).id\n\n\tconst root = presPart.dom.documentElement\n\tif (!root)\n\t\tthrow new PackageReadError(\n\t\t\t'package/part-has-no-root',\n\t\t\t'presentation.xml has no document element to register a master in'\n\t\t)\n\t// `p:sldMasterIdLst` is the first child of CT_Presentation; create it before\n\t// any later sibling if a (degenerate) deck lacks one.\n\tconst lst = getOrAddChild(root, 'p:sldMasterIdLst', [\n\t\t'p:notesMasterIdLst',\n\t\t'p:handoutMasterIdLst',\n\t\t'p:sldIdLst',\n\t\t'p:sldSz',\n\t\t'p:notesSz',\n\t\t'p:embeddedFontLst',\n\t\t'p:custShowLst',\n\t\t'p:photoAlbum',\n\t\t'p:custDataLst',\n\t\t'p:kinsoku',\n\t\t'p:defaultTextStyle',\n\t\t'p:modifyVerifier',\n\t\t'p:extLst',\n\t])\n\tconst entry = createElement(presPart.dom, 'p:sldMasterId')\n\tsetAttr(entry, 'id', String(nextMasterLayoutId(dest)))\n\tsetAttr(entry, 'r:id', relId)\n\tlst.appendChild(entry)\n\tpresPart.markDirty()\n}\n\n/**\n * Move the `p:sldMasterId` entries for `masterPartNames` to the front of\n * `p:sldMasterIdLst`, preserving their existing relative order, so the first of\n * them becomes the deck's `Designs(1)` — the theme PowerPoint's Design tab shows.\n * Reorders the id list only; relationships, ids, and all other parts are left as\n * they are. A no-op when the named masters already lead (idempotent re-call).\n */\nexport function promoteMasters(dest: DeckTarget, masterPartNames: string[]): void {\n\tif (masterPartNames.length === 0) return\n\tconst presPart = dest.presentationPart\n\tconst root = presPart.dom.documentElement\n\tconst lst = root && firstChild(root, 'p:sldMasterIdLst')\n\tif (!lst) return\n\tconst rels = dest.opc.relationshipsFor(presPart.partName)\n\tconst promote = new Set(masterPartNames)\n\tconst entries = getElements(lst, 'p:sldMasterId')\n\t// Entries whose relationship resolves to a promoted master, kept in their\n\t// current order, then everyone else in theirs — a stable partition.\n\tconst isPromoted = (entry: Element): boolean => {\n\t\tconst relId = attr(entry, 'r:id')\n\t\treturn relId ? promote.has(rels.resolveTarget(relId)) : false\n\t}\n\tconst desired = [...entries.filter(isPromoted), ...entries.filter((e) => !isPromoted(e))]\n\tif (desired.every((entry, i) => entry === entries[i])) return\n\tfor (const entry of desired) lst.appendChild(entry)\n\tpresPart.markDirty()\n}\n\n/**\n * The next free id in the presentation-wide slide-master / slide-layout id space.\n *\n * `p:sldMasterId/@id` and every master's `p:sldLayoutId/@id` draw from ONE shared\n * id space (both ST_SlideMasterId/ST_SlideLayoutId, floor 2147483648) and must be\n * unique across the WHOLE presentation, not just within their own list. A duplicate\n * anywhere in this space makes PowerPoint report the file as corrupt on open\n * (\"found a problem with content\" / 0x80070570), even though LibreOffice silently\n * tolerates it — so an imported master AND each of its layouts must take an id past\n * the max of both the master-id list and every layout-id list. Recomputed per\n * allocation so ids appended earlier in the same import are counted.\n */\nfunction nextMasterLayoutId(dest: DeckTarget): number {\n\tlet max = MIN_SLIDE_MASTER_ID - 1\n\tconst presPart = dest.presentationPart\n\tconst root = presPart.dom.documentElement\n\tconst masterLst = root && firstChild(root, 'p:sldMasterIdLst')\n\tif (masterLst) {\n\t\tfor (const entry of getElements(masterLst, 'p:sldMasterId')) {\n\t\t\tconst id = intValue(attr(entry, 'id'))\n\t\t\tif (id !== null && id > max) max = id\n\t\t}\n\t}\n\t// Every master's layout-id list shares the same id space; scan them all.\n\tconst presRels = dest.opc.relationshipsFor(presPart.partName)\n\tfor (const rel of presRels.byType(SLIDE_MASTER_REL)) {\n\t\tconst masterPart = dest.opc.part(presRels.resolveTarget(rel.id))\n\t\tconst masterRoot = masterPart?.dom.documentElement\n\t\tconst layoutLst = masterRoot && firstChild(masterRoot, 'p:sldLayoutIdLst')\n\t\tif (!layoutLst) continue\n\t\tfor (const entry of getElements(layoutLst, 'p:sldLayoutId')) {\n\t\t\tconst id = intValue(attr(entry, 'id'))\n\t\t\tif (id !== null && id > max) max = id\n\t\t}\n\t}\n\treturn max + 1\n}\n\n/** Empty a freshly-copied master's `p:sldLayoutIdLst`; copied layouts repopulate it. */\nexport function clearLayoutIdList(dest: DeckTarget, masterPartName: string): void {\n\tconst masterPart = dest.opc.part(masterPartName)\n\tconst root = masterPart?.dom.documentElement\n\tconst lst = root && firstChild(root, 'p:sldLayoutIdLst')\n\tif (!masterPart || !lst) return\n\tremoveChildrenByQName(lst, ['p:sldLayoutId'])\n\tmasterPart.markDirty()\n}\n\n/**\n * Append a `p:sldLayoutId` entry for `layoutPartName` to `masterPartName`'s\n * `p:sldLayoutIdLst`, adding the master→layout relationship it points at. The\n * destination-side half of linking a copied layout into its copied master; the\n * caller resolves which master that is from the source-side rels.\n */\nexport function addLayoutToMaster(dest: DeckTarget, masterPartName: string, layoutPartName: string): void {\n\tconst masterPart = dest.opc.part(masterPartName)\n\tconst root = masterPart?.dom.documentElement\n\tif (!masterPart || !root) return\n\n\tconst masterRels = dest.opc.relationshipsFor(masterPartName)\n\tconst relId = masterRels.add(SLIDE_LAYOUT_REL, relativePartName(masterPartName, layoutPartName)).id\n\tconst lst = getOrAddChild(root, 'p:sldLayoutIdLst', ['p:transition', 'p:timing', 'p:hf', 'p:txStyles', 'p:extLst'])\n\tconst entry = createElement(masterPart.dom, 'p:sldLayoutId')\n\tsetAttr(entry, 'id', String(nextMasterLayoutId(dest)))\n\tsetAttr(entry, 'r:id', relId)\n\tlst.appendChild(entry)\n\tmasterPart.markDirty()\n}\n","/**\n * The part-copy traversal: pulling a part -- and, recursively, every internal part\n * it references -- out of a source package into a destination deck, rewriting\n * relationship targets to the freshly-allocated partnames as it goes.\n *\n * This is the source-side half of the import machinery; the destination-side\n * bookkeeping it hands off to lives in `master-registry.ts`. It takes an\n * {@link ImportContext} rather than a `Presentation`, so it stays independent of\n * the class that calls it.\n */\n\nimport type { OpcPackage } from '../../opc/package.js'\nimport { relativePartName } from '../../opc/partnames.js'\nimport type { DeckTarget } from './deck-target.js'\nimport { addLayoutToMaster, clearLayoutIdList, registerMaster } from './master-registry.js'\nimport { NOTES_SLIDE_REL, SLIDE_LAYOUT_REL, SLIDE_MASTER_REL } from '../../../ooxml/rel-types.js'\nimport { PackageReadError } from '../../../errors.js'\n\nconst SLIDE_MASTER_CONTENT_TYPE = 'application/vnd.openxmlformats-officedocument.presentationml.slideMaster+xml'\nconst SLIDE_LAYOUT_CONTENT_TYPE = 'application/vnd.openxmlformats-officedocument.presentationml.slideLayout+xml'\n\n/**\n * One import in progress: where parts are going, where they are coming from, and\n * what has already come across.\n *\n * `source` and `registry` are one fact, not two — a registry maps partnames *of\n * that package*, so pairing it with any other package silently returns partnames\n * for parts that were never copied. Holding them in a single value makes the\n * pairing a type invariant rather than a call-site convention; mint one with\n * `Presentation`'s factory, which reads through to the per-source registry that\n * outlives any one call (see {@link copyPart}'s idempotence).\n */\nexport interface ImportContext {\n\t/** The deck being copied into. */\n\treadonly dest: DeckTarget\n\t/** The package being copied out of. */\n\treadonly source: OpcPackage\n\t/** Source partname → the partname allocated for it in `dest`. */\n\treadonly registry: Map<string, string>\n}\n\n/**\n * Copy `sourcePartName` (and, recursively, every internal part it references)\n * from `ctx.source` into `ctx.dest`, returning the new partname. Idempotent\n * per source package via the copy registry. Relationship ids are preserved so\n * the copied part body's `r:id`/`r:embed` references stay valid; targets are\n * rewritten to the freshly-allocated partnames. Notes relationships are\n * dropped. A copied `slideMaster` does not drag in all its sibling layouts —\n * each imported `slideLayout` wires itself into the master instead (see\n * {@link linkLayoutIntoMaster}).\n */\nexport function copyPart(ctx: ImportContext, sourcePartName: string): string {\n\tconst existing = ctx.registry.get(sourcePartName)\n\tif (existing) return existing\n\n\tconst sourcePart = ctx.source.part(sourcePartName)\n\tif (!sourcePart)\n\t\tthrow new PackageReadError('package/part-missing', `importSlide: source package has no part ${sourcePartName}`)\n\n\tconst newPartName = ctx.dest.opc.reservePartNameLike(sourcePartName)\n\tctx.dest.opc.addPart(newPartName, sourcePart.contentType, sourcePart.bytes)\n\t// Record before recursing so the master↔layout cycle terminates.\n\tctx.registry.set(sourcePartName, newPartName)\n\n\tconst isMaster = sourcePart.contentType === SLIDE_MASTER_CONTENT_TYPE\n\tconst sourceRels = ctx.source.relationshipsFor(sourcePartName)\n\tconst targetRels = ctx.dest.opc.relationshipsFor(newPartName)\n\tfor (const rel of sourceRels) {\n\t\t// Notes pull in a notesMaster + its own theme; an imported slide does not need them.\n\t\tif (rel.type === NOTES_SLIDE_REL) continue\n\t\t// Lean master: skip its layout rels; copied layouts re-link themselves.\n\t\tif (isMaster && rel.type === SLIDE_LAYOUT_REL) continue\n\t\tif (rel.targetMode === 'External') {\n\t\t\ttargetRels.addWithId(rel.id, rel.type, rel.target, 'External')\n\t\t\tcontinue\n\t\t}\n\t\tconst newTargetPartName = copyPart(ctx, sourceRels.resolveTarget(rel.id))\n\t\ttargetRels.addWithId(rel.id, rel.type, relativePartName(newPartName, newTargetPartName))\n\t}\n\n\tif (isMaster) {\n\t\tclearLayoutIdList(ctx.dest, newPartName)\n\t\t// Register the copied master in presentation.xml. Without a\n\t\t// `p:sldMasterId` entry (and a presentation→master relationship) the\n\t\t// master is inert: PowerPoint/LibreOffice ignore its background and shape\n\t\t// tree, so a `copy`-imported slide whose look lives on its master (a\n\t\t// cover/closer) renders blank. Idempotent, so masters shared across\n\t\t// repeated imports are registered exactly once.\n\t\tregisterMaster(ctx.dest, newPartName)\n\t}\n\tif (sourcePart.contentType === SLIDE_LAYOUT_CONTENT_TYPE) {\n\t\tlinkLayoutIntoMaster(ctx, sourceRels, newPartName)\n\t}\n\n\treturn newPartName\n}\n\n/**\n * Wire a just-copied layout into its (already-copied) master. Resolves which\n * destination master that is by running the layout's *source* master rel through\n * the copy registry, then hands the destination-side wiring to\n * {@link addLayoutToMaster}. Called once per copied layout, so the master\n * accumulates exactly the imported layouts.\n */\nfunction linkLayoutIntoMaster(\n\tctx: ImportContext,\n\tlayoutSourceRels: ReturnType<OpcPackage['relationshipsFor']>,\n\tlayoutPartName: string\n): void {\n\tconst masterRel = layoutSourceRels.byType(SLIDE_MASTER_REL)[0]\n\tif (!masterRel) return\n\tconst masterPartName = ctx.registry.get(layoutSourceRels.resolveTarget(masterRel.id))\n\tif (!masterPartName) return\n\taddLayoutToMaster(ctx.dest, masterPartName, layoutPartName)\n}\n","/**\n * Relationship rewriting for content carried between packages.\n *\n * When a shape or decoration is deep-copied out of a source deck, every relationship\n * reference it carries (`r:embed` on a picture fill, `r:id` on a chart frame, `r:link` on a\n * linked image, …) still names an id in the *source* part's relationship list. Left alone\n * those ids either dangle or — worse — silently resolve to whatever the destination part\n * happens to have under the same id. This rewrites each one to a fresh relationship on the\n * destination part, copying the referenced part into the destination package on first sight.\n *\n * Both functions are pure with respect to the deck: everything they touch arrives as an\n * argument. They were private methods on `Presentation` and used no instance state, which\n * made the import subsystem look more entangled with the read model than it is.\n */\n\nimport { OOXML_NS, setAttr, type Element } from '../../oxml/dom.js'\nimport type { Relationships } from '../../opc/relationships.js'\nimport { InvalidOptionError } from '../../../errors.js'\nimport { relativePartName } from '../../opc/partnames.js'\nimport { collectElements } from '../../oxml/slide-dom.js'\nimport { copyPart, type ImportContext } from './part-copy.js'\n\n/**\n * Rewrite every relationship reference inside a carried subtree to a fresh destination-local id.\n * @param {Element} node - root of the carried subtree (rewritten in place)\n * @param {ImportContext} ctx - the open import (destination deck + source package + copy registry)\n * @param {Relationships} sourceRels - relationships of the source part the subtree came from\n * @param {string} destPartName - partname of the destination part the subtree is being placed in\n * @param {Relationships} destRels - relationships of that destination part\n * @param {Map<string, string>} relIdMap - per-call cache (source part + source id → new id) deduping references shared within one import\n */\nexport function rewriteCarriedRels(\n\tnode: Element,\n\tctx: ImportContext,\n\tsourceRels: Relationships,\n\tdestPartName: string,\n\tdestRels: Relationships,\n\trelIdMap: Map<string, string>\n): void {\n\tconst elements: Element[] = []\n\tcollectElements(node, elements)\n\tfor (const el of elements) {\n\t\tconst refs: { local: string; id: string }[] = []\n\t\tconst attrs = el.attributes\n\t\tfor (let i = 0; i < attrs.length; i++) {\n\t\t\tconst a = attrs.item(i)\n\t\t\tif (!a || a.namespaceURI !== OOXML_NS.r || !a.value) continue\n\t\t\tif (!sourceRels.get(a.value)) continue // an r-namespaced attribute that isn't a relationship id\n\t\t\trefs.push({ local: a.localName ?? a.name, id: a.value })\n\t\t}\n\t\tfor (const { local, id } of refs) {\n\t\t\tsetAttr(el, `r:${local}`, carryRel(ctx, sourceRels, id, destPartName, destRels, relIdMap))\n\t\t}\n\t}\n}\n\n/**\n * Resolve one carried relationship to a fresh destination-local id, copying its internal target.\n * @param {ImportContext} ctx - the open import\n * @param {Relationships} sourceRels - relationships of the source part\n * @param {string} id - the source relationship id to carry\n * @param {string} destPartName - partname of the destination part\n * @param {Relationships} destRels - relationships of that destination part\n * @param {Map<string, string>} relIdMap - per-call dedupe cache\n * @return {string} the new relationship id on the destination part\n */\nfunction carryRel(\n\tctx: ImportContext,\n\tsourceRels: Relationships,\n\tid: string,\n\tdestPartName: string,\n\tdestRels: Relationships,\n\trelIdMap: Map<string, string>\n): string {\n\tconst key = `${sourceRels.sourcePartName}|${id}`\n\tconst cached = relIdMap.get(key)\n\tif (cached) return cached\n\tconst rel = sourceRels.get(id)\n\tif (!rel)\n\t\tthrow new InvalidOptionError(\n\t\t\t'relationship/not-found',\n\t\t\t`Relationships of ${sourceRels.sourcePartName}: no relationship with id ${id}`\n\t\t)\n\tconst newId =\n\t\trel.targetMode === 'External'\n\t\t\t? destRels.add(rel.type, rel.target, 'External').id\n\t\t\t: destRels.add(rel.type, relativePartName(destPartName, copyPart(ctx, sourceRels.resolveTarget(id)))).id\n\trelIdMap.set(key, newId)\n\treturn newId\n}\n","/**\n * Merging embedded font faces into a deck's `p:embeddedFontLst`.\n *\n * Fonts arrive two ways — copied out of another `Presentation`, or handed over as raw bytes by a\n * generator during an append — and the two differ only in how the binary part comes into being.\n * That difference is confined to a per-face thunk, so both paths share one merge core: entries\n * join by typeface, faces de-dupe by slot, and the thunk runs only for a face actually being\n * added, so a face the deck already embeds never mints an orphan part.\n */\n\nimport {\n\tattr,\n\tcreateElement,\n\tfirstChild,\n\tgetElements,\n\tgetOrAddChild,\n\tinsertInOrder,\n\tsetAttr,\n\ttype Element,\n} from '../../oxml/dom.js'\nimport {\n\tEMBEDDED_FONT_SLOTS,\n\tFONT_DATA_CONTENT_TYPE,\n\tFONT_DATA_EXTENSION,\n\tFONT_REL_TYPE,\n\ttype EmbeddedFont,\n\ttype EmbeddedFontSlot,\n} from '../../../embedded-fonts.js'\nimport { relativePartName } from '../../opc/partnames.js'\nimport { copyPart, type ImportContext } from './part-copy.js'\nimport type { Presentation } from '../presentation.js'\nimport { PackageReadError } from '../../../errors.js'\n\n/**\n * `p:embeddedFontLst`'s document-order successors in `CT_Presentation` (index 7,\n * after `smartTags`): everything that may legally follow it, so a created list\n * lands in the right slot when the deck has none yet.\n */\nconst PRESENTATION_EMBEDDED_FONT_LST_SUCCESSORS = [\n\t'p:custShowLst',\n\t'p:photoAlbum',\n\t'p:custDataLst',\n\t'p:kinsoku',\n\t'p:defaultTextStyle',\n\t'p:modifyVerifier',\n\t'p:extLst',\n]\n\n/**\n * A face slot's document-order successors in `CT_EmbeddedFontListEntry`\n * (`font`, `regular`, `bold`, `italic`, `boldItalic`), so a newly-inserted face\n * keeps the schema's child order regardless of which slots already exist.\n */\nconst EMBEDDED_FONT_FACE_SUCCESSORS: Record<EmbeddedFontSlot, string[]> = {\n\tregular: ['p:bold', 'p:italic', 'p:boldItalic'],\n\tbold: ['p:italic', 'p:boldItalic'],\n\titalic: ['p:boldItalic'],\n\tboldItalic: [],\n}\n\n/**\n * One typeface's faces normalized for the embedded-font merge core (`#mergeEmbeddedFontEntries`):\n * the `p:font` identity attributes plus, per face slot, a thunk that creates the\n * binary font part on demand and returns its partname. The thunk runs only for a\n * face actually being added (after the typeface+slot de-dupe), so no orphan part is\n * created for a face the deck already embeds. Lets the import-side (copy a part out\n * of a source package) and append-side (write raw generator bytes) callers share one\n * merge core while differing only in how the binary part is produced.\n */\ninterface IncomingEmbeddedFont {\n\ttypeface: string\n\t/** `p:font` identity attrs other than `typeface` (panose/pitchFamily/charset), in document order. */\n\tidentity: Array<{ name: string; value: string }>\n\tfaces: Array<{ slot: EmbeddedFontSlot; createPart: () => string }>\n}\n\n/**\n * Copy `source`'s embedded fonts into this deck and merge them into our\n * `p:embeddedFontLst`. Font binaries come across via {@link copyPart} (so the\n * per-source registry dedupes faces shared across repeated imports); entries are\n * merged by `typeface` + face slot, so a face this deck already embeds is reused\n * rather than duplicated. No-op when the source embeds no fonts. See\n * {@link ImportSlideOptions.embedFonts}.\n */\nexport function carryEmbeddedFonts(dest: Presentation, source: Presentation, ctx: ImportContext): void {\n\tconst sourceRoot = source.presentationPart.dom.documentElement\n\tconst sourceLst = sourceRoot && firstChild(sourceRoot, 'p:embeddedFontLst')\n\tconst sourceEntries = sourceLst ? getElements(sourceLst, 'p:embeddedFont') : []\n\tif (sourceEntries.length === 0) return\n\n\tconst sourcePresRels = source.opc.relationshipsFor(source.presentationPart.partName)\n\tconst incoming: IncomingEmbeddedFont[] = []\n\tfor (const srcEntry of sourceEntries) {\n\t\tconst srcFont = firstChild(srcEntry, 'p:font')\n\t\tconst typeface = srcFont ? attr(srcFont, 'typeface') : null\n\t\tif (!srcFont || !typeface) continue\n\n\t\t// Copy the source p:font identity attributes (panose/pitchFamily/charset).\n\t\tconst identity: IncomingEmbeddedFont['identity'] = []\n\t\tfor (const name of ['panose', 'pitchFamily', 'charset']) {\n\t\t\tconst value = attr(srcFont, name)\n\t\t\tif (value !== null) identity.push({ name, value })\n\t\t}\n\n\t\tconst faces: IncomingEmbeddedFont['faces'] = []\n\t\tfor (const slot of EMBEDDED_FONT_SLOTS) {\n\t\t\tconst srcFace = firstChild(srcEntry, `p:${slot}`)\n\t\t\tconst srcRid = srcFace && attr(srcFace, 'r:id')\n\t\t\tif (!srcFace || !srcRid) continue\n\t\t\t// Binary comes across via copyPart, so the per-source registry dedupes faces\n\t\t\t// shared across repeated imports; the thunk runs only when the face is added.\n\t\t\tfaces.push({ slot, createPart: () => copyPart(ctx, sourcePresRels.resolveTarget(srcRid)) })\n\t\t}\n\t\tincoming.push({ typeface, identity, faces })\n\t}\n\tmergeEmbeddedFontEntries(dest, incoming)\n}\n\n/**\n * Carry a generator's presentation-level embedded fonts ({@link ExtractedSlides.embeddedFonts},\n * from `pptx.embedFont`) into this deck during {@link Presentation.appendSlides}. Each face's raw bytes are\n * written as a fresh `/ppt/fonts/fontN.fntdata` part; merge/de-dupe by typeface + slot is shared\n * with {@link carryEmbeddedFonts} via {@link mergeEmbeddedFontEntries}, so appending the same\n * generator twice (or onto a deck that already embeds the face) carries each face once.\n */\nexport function carryGeneratedEmbeddedFonts(dest: Presentation, fonts: EmbeddedFont[]): void {\n\tconst incoming: IncomingEmbeddedFont[] = []\n\tfor (const font of fonts) {\n\t\tif (!font.typeface) continue\n\t\tconst identity: IncomingEmbeddedFont['identity'] = []\n\t\tif (font.panose !== undefined) identity.push({ name: 'panose', value: font.panose })\n\t\tif (font.pitchFamily !== undefined) identity.push({ name: 'pitchFamily', value: String(font.pitchFamily) })\n\t\tif (font.charset !== undefined) identity.push({ name: 'charset', value: String(font.charset) })\n\n\t\tconst faces: IncomingEmbeddedFont['faces'] = []\n\t\tfor (const slot of EMBEDDED_FONT_SLOTS) {\n\t\t\tconst face = font.faces.find((f) => f.slot === slot)\n\t\t\tif (!face?.bytes) continue\n\t\t\tconst bytes = face.bytes\n\t\t\tfaces.push({\n\t\t\t\tslot,\n\t\t\t\tcreatePart: () => {\n\t\t\t\t\tconst partName = dest.opc.reservePartNameLike('/ppt/fonts/font1.fntdata')\n\t\t\t\t\tdest.opc.addPart(partName, FONT_DATA_CONTENT_TYPE, bytes)\n\t\t\t\t\treturn partName\n\t\t\t\t},\n\t\t\t})\n\t\t}\n\t\tif (faces.length > 0) incoming.push({ typeface: font.typeface, identity, faces })\n\t}\n\tmergeEmbeddedFontEntries(dest, incoming)\n}\n\n/**\n * Merge normalized {@link IncomingEmbeddedFont} entries into this deck's\n * `p:embeddedFontLst` — the shared core of {@link carryEmbeddedFonts} (import-side)\n * and {@link carryGeneratedEmbeddedFonts} (append-side). Entries merge by `typeface`,\n * faces de-dupe by slot (a face this deck already embeds is left as is). For each newly\n * added face the `fntdata` Default is ensured, the binary part is created via the face's\n * `createPart` thunk, a `font` rel is added to presentation.xml, and the `p:<slot>` element\n * is inserted in schema child order. The list is created at CT_Presentation index 7 when\n * the deck has none yet. No-op for empty input.\n */\nfunction mergeEmbeddedFontEntries(dest: Presentation, entries: IncomingEmbeddedFont[]): void {\n\tif (entries.length === 0) return\n\n\tconst presPart = dest.presentationPart\n\tconst presRoot = presPart.dom.documentElement\n\tif (!presRoot)\n\t\tthrow new PackageReadError(\n\t\t\t'package/part-has-no-root',\n\t\t\t'presentation.xml has no document element to carry embedded fonts into'\n\t\t)\n\tconst presRels = dest.opc.relationshipsFor(presPart.partName)\n\n\tconst targetLst = getOrAddChild(presRoot, 'p:embeddedFontLst', PRESENTATION_EMBEDDED_FONT_LST_SUCCESSORS)\n\tconst targetByTypeface = new Map<string, Element>()\n\tfor (const entry of getElements(targetLst, 'p:embeddedFont')) {\n\t\tconst font = firstChild(entry, 'p:font')\n\t\tconst typeface = font && attr(font, 'typeface')\n\t\tif (typeface) targetByTypeface.set(typeface, entry)\n\t}\n\n\tlet copiedAny = false\n\tfor (const incoming of entries) {\n\t\t// Find or create the target entry for this typeface, carrying its\n\t\t// p:font identity attributes (typeface + optional panose/pitchFamily/charset).\n\t\tlet targetEntry = targetByTypeface.get(incoming.typeface)\n\t\tif (!targetEntry) {\n\t\t\ttargetEntry = createElement(presPart.dom, 'p:embeddedFont')\n\t\t\tconst targetFont = createElement(presPart.dom, 'p:font')\n\t\t\tsetAttr(targetFont, 'typeface', incoming.typeface)\n\t\t\tfor (const { name, value } of incoming.identity) setAttr(targetFont, name, value)\n\t\t\ttargetEntry.appendChild(targetFont)\n\t\t\ttargetLst.appendChild(targetEntry)\n\t\t\ttargetByTypeface.set(incoming.typeface, targetEntry)\n\t\t}\n\n\t\tfor (const face of incoming.faces) {\n\t\t\tif (firstChild(targetEntry, `p:${face.slot}`)) continue // de-dupe: face already present\n\n\t\t\t// Ensure the fntdata Default exists *before* creating the part, so addPart\n\t\t\t// resolves the content type via the Default (no per-part Override).\n\t\t\tdest.opc.contentTypes.ensureDefault(FONT_DATA_EXTENSION, FONT_DATA_CONTENT_TYPE)\n\t\t\tconst newFontPart = face.createPart()\n\t\t\tconst relId = presRels.add(FONT_REL_TYPE, relativePartName(presPart.partName, newFontPart)).id\n\n\t\t\tconst targetFace = createElement(presPart.dom, `p:${face.slot}`)\n\t\t\tsetAttr(targetFace, 'r:id', relId)\n\t\t\tinsertInOrder(targetEntry, targetFace, EMBEDDED_FONT_FACE_SUCCESSORS[face.slot])\n\t\t\tcopiedAny = true\n\t\t}\n\t}\n\n\tif (copiedAny) presPart.markDirty()\n}\n","/**\n * The theme context a source slide is flattened against.\n *\n * `preserve`-mode import bakes a slide's *source* look into its XML — scheme colours and\n * style-matrix fills resolved to literals — so it keeps that look after being attached to a\n * different deck's master. Doing so needs the source subgraph's colour map, colour scheme,\n * format scheme, and the background the slide inherits but does not itself carry. This\n * gathers exactly that.\n *\n * Pure with respect to the destination deck: it reads only the source package. It was a\n * private method on `Presentation` that used no instance state.\n */\n\nimport { firstChild, type Element } from '../../oxml/dom.js'\nimport type { OpcPackage } from '../../opc/package.js'\nimport type { FlattenContext } from './flatten.js'\nimport { resolveSlideThemeParts } from '../theme-context.js'\n\n/** The `p:cSld/p:bg` element of a slide/layout/master root, or `null`. */\nfunction backgroundOf(root: Element): Element | null {\n\tconst cSld = firstChild(root, 'p:cSld')\n\treturn cSld ? firstChild(cSld, 'p:bg') : null\n}\n\n/**\n * The background the slide effectively inherits from its source subgraph: the layout's\n * `p:bg`, else the master's. Returns `null` when the slide carries its own `p:bg` (it stays\n * on the slide and is flattened directly) or when none exists.\n */\nfunction effectiveBackground(\n\tsourceOpc: OpcPackage,\n\tslideRoot: Element | null,\n\tlayoutPartName: string | null,\n\tmasterPartName: string | null\n): Element | null {\n\tif (slideRoot && backgroundOf(slideRoot)) return null\n\tconst layoutRoot = layoutPartName ? (sourceOpc.part(layoutPartName)?.dom.documentElement ?? null) : null\n\tconst masterRoot = masterPartName ? (sourceOpc.part(masterPartName)?.dom.documentElement ?? null) : null\n\treturn (layoutRoot && backgroundOf(layoutRoot)) ?? (masterRoot && backgroundOf(masterRoot)) ?? null\n}\n\n/**\n * Gather the flatten context for a source slide: walk slide → layout → master → theme,\n * reading the effective colour map (the slide's `clrMapOvr` override, or the master\n * `clrMap`), the theme `clrScheme`, and the theme `fmtScheme`.\n * @param {OpcPackage} sourceOpc - the source package to read\n * @param {string} slidePartName - partname of the source slide\n * @return {FlattenContext} the context {@link flattenSlide} / {@link flattenShape} resolve against\n */\nexport function sourceFlattenContext(sourceOpc: OpcPackage, slidePartName: string): FlattenContext {\n\t// Reuse the shared slide → layout → master → theme walk (also backing the read-model\n\t// colour getters), then layer the flatten-only needs on top.\n\tconst parts = resolveSlideThemeParts(sourceOpc, slidePartName)\n\tconst themeElements = parts.themeElements\n\treturn {\n\t\tclrMap: parts.clrMap,\n\t\tclrScheme: parts.clrScheme,\n\t\tfmtScheme: themeElements ? firstChild(themeElements, 'a:fmtScheme') : null,\n\t\tinheritedBackground: effectiveBackground(sourceOpc, parts.slideRoot, parts.layoutPartName, parts.masterPartName),\n\t\tlayoutRoot: parts.layoutRoot,\n\t\tmasterRoot: parts.masterRoot,\n\t}\n}\n","/**\n * Walking a deck's master/layout spine by partname.\n *\n * The `p:sldMasterIdLst` / `p:sldLayoutIdLst` entries hold relationship ids, not partnames, so\n * every traversal has to resolve through the owning part's relationships. These are the\n * source-side reads that do it — used against a *foreign* presentation as often as against this\n * one, which is why they take the deck rather than living on it.\n */\n\nimport { attr, firstChild, getElements } from '../../oxml/dom.js'\nimport type { Presentation } from '../presentation.js'\n\n// Resolving a single-of-a-kind relationship is an OPC concern, not a spine-walking one; it is\n// re-exported here because the spine walkers were its first callers.\nexport { resolveSingleRel } from '../../opc/partnames.js'\n\n/** Master partnames in `p:sldMasterIdLst` order. */\nexport function slideMasterPartNames(pres: Presentation): string[] {\n\tconst root = pres.presentationPart.dom.documentElement\n\tconst lst = root && firstChild(root, 'p:sldMasterIdLst')\n\tif (!lst) return []\n\tconst rels = pres.opc.relationshipsFor(pres.presentationPart.partName)\n\tconst out: string[] = []\n\tfor (const entry of getElements(lst, 'p:sldMasterId')) {\n\t\tconst relId = attr(entry, 'r:id')\n\t\tif (relId) out.push(rels.resolveTarget(relId))\n\t}\n\treturn out\n}\n\n/** A master's layout partnames in `p:sldLayoutIdLst` order. */\nexport function layoutPartNamesOf(pres: Presentation, masterPartName: string): string[] {\n\tconst root = pres.opc.part(masterPartName)?.dom.documentElement\n\tconst lst = root && firstChild(root, 'p:sldLayoutIdLst')\n\tif (!lst) return []\n\tconst rels = pres.opc.relationshipsFor(masterPartName)\n\tconst out: string[] = []\n\tfor (const entry of getElements(lst, 'p:sldLayoutId')) {\n\t\tconst relId = attr(entry, 'r:id')\n\t\tif (relId) out.push(rels.resolveTarget(relId))\n\t}\n\treturn out\n}\n","/**\n * The three ways a slide can be brought across from another deck.\n *\n * {@link Presentation.importSlide} picks one by `options.theme`, and the difference between\n * them is entirely about what happens to the slide's *look*:\n *\n * - **`copy`** — not here. It copies the source theme subgraph wholesale via `copyPart`, so\n * the slide keeps its look by keeping its own theme; nothing needs rewriting.\n * - **`preserve`** ({@link importSlidePreserve}) — rebind to this deck's master, then bake\n * the source theme into the slide XML. The slide looks the same as it did; it just no\n * longer depends on the theme it came from.\n * - **`restyle`** ({@link importSlideRestyle}) — rebind and bake *nothing*, so the slide's\n * symbolic theme references re-resolve against the destination theme and it re-brands.\n *\n * The two share {@link importSlideRebind} and are exact inverses on top of it: preserve\n * resolves every reference it can, restyle resolves none. Any baking added to the shared\n * rebind would break restyle by pinning the slide to its source look, which is why the\n * rebind carries no theme handling of its own — not even the inherited background.\n *\n * These were private methods on `Presentation`, where they made the read model's own surface\n * (open a deck, walk slides, read shapes) hard to see: the import machinery was roughly two\n * thirds of the class. They live here as free functions taking the destination deck, matching\n * the other `ops/` modules.\n */\n\nimport { firstChild, ownerDocumentOf, type Element } from '../../oxml/dom.js'\nimport type { Part } from '../../opc/part.js'\nimport { relativePartName } from '../../opc/partnames.js'\nimport { PackageReadError, InvalidOptionError } from '../../../errors.js'\nimport { flattenSlide, remapLiteralColors, restyleSlide } from './flatten.js'\nimport { resolveSlideThemeParts } from '../theme-context.js'\nimport { carriedDecorations, firstShapeChild } from '../../oxml/slide-dom.js'\nimport { copySourceTableStyles } from './table-styles.js'\nimport { copyPart, type ImportContext } from './part-copy.js'\nimport type { Presentation } from '../presentation.js'\nimport type { Slide } from '../slide.js'\nimport { NOTES_SLIDE_REL, SLIDE_LAYOUT_REL, SLIDE_MASTER_REL } from '../../../ooxml/rel-types.js'\nimport { resolveSingleRel } from './part-index.js'\nimport { rewriteCarriedRels } from './carried-rels.js'\nimport { sourceFlattenContext } from './flatten-context.js'\n\n/** What {@link importSlideRebind} hands back for the caller's mode-specific pass. */\ninterface RebindResult {\n\tnewPartName: string\n\tslideRoot: Element\n\tnewPart: Part\n}\n\n/**\n * Import a slide in `preserve` mode: rebind it to this deck's master/layout, then flatten its\n * source theme into the slide XML (scheme colours + style-matrix fills baked to literals).\n *\n * The flatten context is gathered from the *source* subgraph, so it can be read before or\n * after the rebind; the rebind injects any carried decorations before we flatten, so a single\n * sweep resolves the theme references on the slide's own content and on the carried\n * decorations together.\n * @param {Presentation} dest - the destination deck\n * @param {ImportContext} ctx - the open import out of the source package\n * @param {Presentation} source - the source deck\n * @param {Slide} sourceSlide - the slide being imported\n * @param {boolean} carryGraphics - bake the source master/layout decorations onto the slide\n * @return {string} partname of the new slide part in the destination package\n */\nexport function importSlidePreserve(\n\tdest: Presentation,\n\tctx: ImportContext,\n\tsource: Presentation,\n\tsourceSlide: Slide,\n\tcarryGraphics: boolean\n): string {\n\tconst flattenCtx = sourceFlattenContext(source.opc, sourceSlide.partName)\n\tconst { newPartName, slideRoot, newPart } = importSlideRebind(dest, ctx, source, sourceSlide, carryGraphics)\n\tflattenSlide(slideRoot, flattenCtx)\n\tnewPart.markDirty()\n\treturn newPartName\n}\n\n/**\n * Import a slide in `restyle` mode: rebind it to this deck's master/layout and then\n * {@link restyleSlide} it — drop its colour map override but bake *nothing*, so its symbolic\n * theme references re-resolve against the destination theme and the slide re-brands.\n *\n * The deliberate inverse of `preserve`: no flatten, no inherited-background bake, no\n * placeholder colour/size/geometry bake — every one of those would pin the slide to its\n * source look, the opposite of re-branding. Carried decorations are left symbolic too, so\n * they re-brand along with the slide.\n *\n * With `remapLiterals` it additionally force-remaps the slide's source-theme literal colours\n * back to symbolic scheme colours and copies any referenced source table style into this deck\n * — the two things plain `restyle` cannot re-brand.\n * @param {Presentation} dest - the destination deck\n * @param {ImportContext} ctx - the open import out of the source package\n * @param {Presentation} source - the source deck\n * @param {Slide} sourceSlide - the slide being imported\n * @param {boolean} carryGraphics - bake the source master/layout decorations onto the slide\n * @param {boolean} remapLiterals - additionally remap source-theme literal colours to scheme tokens\n * @return {string} partname of the new slide part in the destination package\n */\nexport function importSlideRestyle(\n\tdest: Presentation,\n\tctx: ImportContext,\n\tsource: Presentation,\n\tsourceSlide: Slide,\n\tcarryGraphics: boolean,\n\tremapLiterals: boolean\n): string {\n\tconst { newPartName, slideRoot, newPart } = importSlideRebind(dest, ctx, source, sourceSlide, carryGraphics)\n\trestyleSlide(slideRoot)\n\tif (remapLiterals) {\n\t\t// The source colour context (slot ↔ RGB ↔ token) the literals are matched against.\n\t\tconst parts = resolveSlideThemeParts(source.opc, sourceSlide.partName)\n\t\tremapLiteralColors(slideRoot, { clrMap: parts.clrMap, clrScheme: parts.clrScheme })\n\t\tcopySourceTableStyles(dest, source.opc, slideRoot)\n\t}\n\tnewPart.markDirty()\n\treturn newPartName\n}\n\n/**\n * The rebind shared by `preserve` and `restyle`: copy the slide bytes into a fresh part,\n * rebuild its relationships (drop notes, repoint the `slideLayout` rel at this deck's\n * existing layout, copy every other internal target — media/charts — and pass externals\n * through), and optionally bake the source master/layout decorations onto the slide. Returns\n * the new part, its name, and its live root element for the caller's mode-specific pass.\n *\n * This carries *no* theme baking of its own — not even the inherited background.\n * `preserve` adds that via {@link flattenSlide}'s context; `restyle` must not, so the\n * background stays symbolic and re-brands.\n * @param {Presentation} dest - the destination deck\n * @param {ImportContext} ctx - the open import out of the source package\n * @param {Presentation} source - the source deck\n * @param {Slide} sourceSlide - the slide being imported\n * @param {boolean} carryGraphics - bake the source master/layout decorations onto the slide\n * @return {RebindResult} the new part, its partname, and its live root element\n */\nexport function importSlideRebind(\n\tdest: Presentation,\n\tctx: ImportContext,\n\tsource: Presentation,\n\tsourceSlide: Slide,\n\tcarryGraphics: boolean\n): RebindResult {\n\tconst destLayout = destinationLayoutPartName(dest)\n\n\t// Copy the slide bytes into a fresh partname; we then mutate that copy's DOM\n\t// (a distinct document, so the source package is never touched).\n\tconst sourcePart = source.opc.part(sourceSlide.partName)\n\tif (!sourcePart)\n\t\tthrow new PackageReadError(\n\t\t\t'package/part-missing',\n\t\t\t`importSlide: source package has no part ${sourceSlide.partName}`\n\t\t)\n\tconst newPartName = dest.opc.reservePartNameLike(sourceSlide.partName)\n\tconst newPart = dest.opc.addPart(newPartName, sourcePart.contentType, sourcePart.bytes)\n\tconst slideRoot = newPart.dom.documentElement\n\tif (!slideRoot)\n\t\tthrow new PackageReadError('package/part-has-no-root', `Imported slide ${newPartName} has no root element`)\n\n\t// Rebuild the slide's relationships: drop notes, repoint slideLayout at the\n\t// destination layout, and copy every other internal target (media/charts).\n\tconst sourceRels = source.opc.relationshipsFor(sourceSlide.partName)\n\tconst targetRels = dest.opc.relationshipsFor(newPartName)\n\tfor (const rel of sourceRels) {\n\t\tif (rel.type === NOTES_SLIDE_REL) continue\n\t\tif (rel.type === SLIDE_LAYOUT_REL) {\n\t\t\ttargetRels.addWithId(rel.id, SLIDE_LAYOUT_REL, relativePartName(newPartName, destLayout))\n\t\t\tcontinue\n\t\t}\n\t\tif (rel.targetMode === 'External') {\n\t\t\ttargetRels.addWithId(rel.id, rel.type, rel.target, 'External')\n\t\t\tcontinue\n\t\t}\n\t\tconst newTarget = copyPart(ctx, sourceRels.resolveTarget(rel.id))\n\t\ttargetRels.addWithId(rel.id, rel.type, relativePartName(newPartName, newTarget))\n\t}\n\n\t// Optionally bake the source master/layout decorations (logos, accent shapes) onto the\n\t// slide behind its own content. Done after the slide's own rels are in place (so carried\n\t// media get fresh, non-colliding ids) but before the caller's flatten/restyle pass acts\n\t// on the carried shapes.\n\tif (carryGraphics) carryMasterGraphics(dest, ctx, slideRoot, newPartName, sourceSlide.partName)\n\n\treturn { newPartName, slideRoot, newPart }\n}\n\n/**\n * Bake the source `slideLayout`/`slideMaster` shape-tree decorations onto the imported slide\n * (the `carryMasterGraphics` path). Every shape on those trees *except* placeholders is\n * deep-copied into the slide's `p:spTree` ahead of its own content — master decorations\n * first, then layout, then the slide's shapes — so document (z-)order keeps the master\n * furthest back. Each decoration's media and other relationship targets are copied into this\n * package and its `r:embed`/`r:id`/… references rewritten to fresh slide-local ids. The\n * injected shapes are left for the caller's {@link flattenSlide} pass to resolve any theme\n * references they carry.\n * @param {Presentation} dest - the destination deck\n * @param {ImportContext} ctx - the open import out of the source package\n * @param {Element} slideRoot - root element of the new slide part (mutated in place)\n * @param {string} newPartName - partname of the new slide part\n * @param {string} slidePartName - partname of the source slide, for resolving its layout/master\n */\nfunction carryMasterGraphics(\n\tdest: Presentation,\n\tctx: ImportContext,\n\tslideRoot: Element,\n\tnewPartName: string,\n\tslidePartName: string\n): void {\n\tconst sourceOpc = ctx.source\n\tconst layoutPartName = resolveSingleRel(sourceOpc, slidePartName, SLIDE_LAYOUT_REL)\n\tconst masterPartName = layoutPartName ? resolveSingleRel(sourceOpc, layoutPartName, SLIDE_MASTER_REL) : null\n\tconst cSld = firstChild(slideRoot, 'p:cSld')\n\tconst spTree = cSld && firstChild(cSld, 'p:spTree')\n\tif (!spTree) return\n\n\tconst doc = ownerDocumentOf(slideRoot)\n\tconst slideRels = dest.opc.relationshipsFor(newPartName)\n\tconst relIdMap = new Map<string, string>()\n\t// Insert ahead of the slide's own first shape so decorations render behind it.\n\tconst anchor = firstShapeChild(spTree)\n\t// Master behind layout behind the slide (document order == z-order).\n\tfor (const partName of [masterPartName, layoutPartName]) {\n\t\tif (!partName) continue\n\t\tconst decorations = carriedDecorations(sourceOpc.part(partName)?.dom.documentElement ?? null)\n\t\tif (decorations.length === 0) continue\n\t\tconst sourceRels = sourceOpc.relationshipsFor(partName)\n\t\tfor (const deco of decorations) {\n\t\t\tconst imported = doc.importNode(deco, true)\n\t\t\trewriteCarriedRels(imported, ctx, sourceRels, newPartName, slideRels, relIdMap)\n\t\t\tspTree.insertBefore(imported, anchor)\n\t\t}\n\t}\n}\n\n/**\n * The partname of the layout this deck's slides should attach to in `preserve` mode: the\n * first layout of the first slide master. Throws when the deck has no master/layout to attach\n * to (a deck ts-pptx always provides).\n * @param {Presentation} dest - the destination deck\n * @return {string} partname of the destination layout\n */\nfunction destinationLayoutPartName(dest: Presentation): string {\n\tconst presRels = dest.opc.relationshipsFor(dest.presentationPart.partName)\n\tconst masterRel = presRels.byType(SLIDE_MASTER_REL)[0]\n\tif (!masterRel)\n\t\tthrow new InvalidOptionError(\n\t\t\t'import/destination-missing-master',\n\t\t\t'importSlide preserve mode requires a slide master in the destination deck'\n\t\t)\n\tconst masterPartName = presRels.resolveTarget(masterRel.id)\n\tconst masterRels = dest.opc.relationshipsFor(masterPartName)\n\tconst layoutRel = masterRels.byType(SLIDE_LAYOUT_REL)[0]\n\tif (!layoutRel)\n\t\tthrow new InvalidOptionError(\n\t\t\t'import/destination-missing-layout',\n\t\t\t'importSlide preserve mode requires a slide layout in the destination deck'\n\t\t)\n\treturn masterRels.resolveTarget(layoutRel.id)\n}\n","/**\n * Carrying speaker notes and the deck's single notes master across an import or an append.\n *\n * A `notesSlide` is not self-contained: it back-references the slide it annotates and forward-\n * references the deck's notes master. `CT_NotesMasterIdList` allows at most one master per\n * presentation, so a deck that already has one keeps it — the destination's notes styling wins —\n * and a source master is copied only into a deck that has none. That single rule is why both the\n * `Presentation`-to-`Presentation` path and the generator-XML path funnel through\n * `registerNotesMaster`: they differ only in how the *part* comes into being.\n */\n\nimport { createElement, getOrAddChild, removeChildrenByQName, setAttr } from '../../oxml/dom.js'\nimport { relativePartName } from '../../opc/partnames.js'\nimport { copyPart, type ImportContext } from './part-copy.js'\nimport type { Presentation } from '../presentation.js'\nimport { NOTES_MASTER_REL, NOTES_SLIDE_REL, SLIDE_REL, THEME_REL } from '../../../ooxml/rel-types.js'\nimport { PackageReadError } from '../../../errors.js'\n\nconst NOTES_MASTER_CONTENT_TYPE = 'application/vnd.openxmlformats-officedocument.presentationml.notesMaster+xml'\nconst THEME_CONTENT_TYPE = 'application/vnd.openxmlformats-officedocument.theme+xml'\n\nconst textEncoder = new TextEncoder()\n\n/**\n * Carry the source slide's speaker notes onto the just-imported slide (the\n * `importNotes` option). The slide copy itself dropped the `notesSlide` rel, so\n * this copies the source `notesSlide` part into a fresh partname, wires a\n * `slide → notesSlide` rel on the new slide, and rebuilds the copied notesSlide's\n * own relationships:\n *\n * - its `slide` back-rel is repointed at the new slide (`newSlidePartName`) — the\n * source slide is *not* copied (that would be circular);\n * - its `notesMaster` rel is resolved through {@link ensureNotesMaster}, which\n * reuses this deck's notesMaster when it has one and copies the source's only\n * when it has none (a deck may have at most one notesMaster);\n * - any other internal target (media, etc.) is copied via {@link copyPart}.\n *\n * No-op when the source slide has no notes. Content-type registration for the\n * copied parts is handled by `addPart`/{@link copyPart}.\n */\nexport function carryNotes(\n\tdest: Presentation,\n\tsource: Presentation,\n\tctx: ImportContext,\n\tsourceSlidePartName: string,\n\tnewSlidePartName: string\n): void {\n\tconst sourceSlideRels = source.opc.relationshipsFor(sourceSlidePartName)\n\tconst notesRel = sourceSlideRels.byType(NOTES_SLIDE_REL)[0]\n\tif (!notesRel) return // slide has no speaker notes\n\tconst sourceNotesPartName = sourceSlideRels.resolveTarget(notesRel.id)\n\tconst sourceNotesPart = source.opc.part(sourceNotesPartName)\n\tif (!sourceNotesPart) return\n\n\t// Copy the notesSlide bytes into a fresh partname, then wire slide → notesSlide.\n\tconst newNotesPartName = dest.opc.reservePartNameLike(sourceNotesPartName)\n\tdest.opc.addPart(newNotesPartName, sourceNotesPart.contentType, sourceNotesPart.bytes)\n\tdest.opc.relationshipsFor(newSlidePartName).add(NOTES_SLIDE_REL, relativePartName(newSlidePartName, newNotesPartName))\n\n\t// Rebuild the copied notesSlide's relationships. Preserve each source rel id so\n\t// the notesSlide body's r:id references stay valid; only the targets are rewritten.\n\tconst notesSourceRels = source.opc.relationshipsFor(sourceNotesPartName)\n\tconst notesTargetRels = dest.opc.relationshipsFor(newNotesPartName)\n\tfor (const rel of notesSourceRels) {\n\t\tif (rel.type === SLIDE_REL) {\n\t\t\t// Back-reference to the annotated slide → repoint at the new slide (don't copy it).\n\t\t\tnotesTargetRels.addWithId(rel.id, SLIDE_REL, relativePartName(newNotesPartName, newSlidePartName))\n\t\t\tcontinue\n\t\t}\n\t\tif (rel.type === NOTES_MASTER_REL) {\n\t\t\tconst notesMaster = ensureNotesMaster(dest, ctx, notesSourceRels.resolveTarget(rel.id))\n\t\t\tnotesTargetRels.addWithId(rel.id, NOTES_MASTER_REL, relativePartName(newNotesPartName, notesMaster))\n\t\t\tcontinue\n\t\t}\n\t\tif (rel.targetMode === 'External') {\n\t\t\tnotesTargetRels.addWithId(rel.id, rel.type, rel.target, 'External')\n\t\t\tcontinue\n\t\t}\n\t\tconst newTarget = copyPart(ctx, notesSourceRels.resolveTarget(rel.id))\n\t\tnotesTargetRels.addWithId(rel.id, rel.type, relativePartName(newNotesPartName, newTarget))\n\t}\n}\n\n/**\n * Resolve the notesMaster an imported `notesSlide` should bind to, honouring the\n * single-notesMaster-per-presentation rule (`p:notesMasterIdLst` holds 0..1\n * `p:notesMasterId`). If this deck already has a notesMaster it is reused and the\n * source's is *not* copied (the destination's notes styling wins); otherwise the\n * source notesMaster (and, via {@link copyPart}, its theme) is copied and\n * registered in `presentation.xml`. Returns the destination notesMaster partname.\n */\nfunction ensureNotesMaster(dest: Presentation, ctx: ImportContext, sourceNotesMasterPartName: string): string {\n\tconst presPart = dest.presentationPart\n\tconst presRels = dest.opc.relationshipsFor(presPart.partName)\n\tconst existing = presRels.byType(NOTES_MASTER_REL)[0]\n\tif (existing) return presRels.resolveTarget(existing.id)\n\n\t// No notesMaster yet: copy the source's (pulls its theme) and register it.\n\treturn registerNotesMaster(dest, copyPart(ctx, sourceNotesMasterPartName))\n}\n\n/**\n * Wire an already-added notesMaster part into `presentation.xml`: a `notesMaster`\n * relationship plus the single `p:notesMasterId` entry that `CT_NotesMasterIdList`\n * allows. Returns the partname, so callers can use it as a rel target.\n *\n * Split out of {@link ensureNotesMaster} because the two ways a notesMaster arrives\n * — copied from another `Presentation`, or authored by a generator and injected by\n * {@link Presentation.appendSlides} — differ only in how the *part* is created, not in how it is\n * registered.\n */\nfunction registerNotesMaster(dest: Presentation, notesMasterPartName: string): string {\n\tconst presPart = dest.presentationPart\n\tconst presRels = dest.opc.relationshipsFor(presPart.partName)\n\tconst relId = presRels.add(NOTES_MASTER_REL, relativePartName(presPart.partName, notesMasterPartName)).id\n\n\tconst root = presPart.dom.documentElement\n\tif (!root)\n\t\tthrow new PackageReadError(\n\t\t\t'package/part-has-no-root',\n\t\t\t'presentation.xml has no document element to register a notes master in'\n\t\t)\n\t// `p:notesMasterIdLst` follows `p:sldMasterIdLst` in CT_Presentation order.\n\tconst lst = getOrAddChild(root, 'p:notesMasterIdLst', [\n\t\t'p:handoutMasterIdLst',\n\t\t'p:sldIdLst',\n\t\t'p:sldSz',\n\t\t'p:notesSz',\n\t\t'p:embeddedFontLst',\n\t\t'p:custShowLst',\n\t\t'p:photoAlbum',\n\t\t'p:custDataLst',\n\t\t'p:kinsoku',\n\t\t'p:defaultTextStyle',\n\t\t'p:modifyVerifier',\n\t\t'p:extLst',\n\t])\n\t// CT_NotesMasterIdList holds a single p:notesMasterId; replace any stray entry.\n\tremoveChildrenByQName(lst, ['p:notesMasterId'])\n\tconst entry = createElement(presPart.dom, 'p:notesMasterId')\n\tsetAttr(entry, 'r:id', relId)\n\tlst.appendChild(entry)\n\tpresPart.markDirty()\n\treturn notesMasterPartName\n}\n\n/**\n * Resolve the notesMaster an *appended* slide's notes should bind to. Same\n * single-notesMaster rule as {@link ensureNotesMaster}: this deck's own wins when it\n * has one, so the destination's notes styling is preserved and `master.xml` is\n * discarded. Otherwise the generator's notes master is installed, together with the\n * theme its `.rels` requires (the normal write path emits that as `theme2.xml`).\n */\nexport function ensureNotesMasterFromXml(dest: Presentation, master: { xml: string; themeXml: string }): string {\n\tconst presPart = dest.presentationPart\n\tconst presRels = dest.opc.relationshipsFor(presPart.partName)\n\tconst existing = presRels.byType(NOTES_MASTER_REL)[0]\n\tif (existing) return presRels.resolveTarget(existing.id)\n\n\tconst masterPartName = dest.opc.reservePartNameLike('/ppt/notesMasters/notesMaster1.xml')\n\tdest.opc.addPart(masterPartName, NOTES_MASTER_CONTENT_TYPE, textEncoder.encode(master.xml))\n\n\t// A notesMaster's .rels must resolve a theme; reserve alongside any theme the\n\t// destination already owns rather than assuming theme2.xml is free.\n\tconst themePartName = dest.opc.reservePartNameLike('/ppt/theme/theme1.xml')\n\tdest.opc.addPart(themePartName, THEME_CONTENT_TYPE, textEncoder.encode(master.themeXml))\n\tdest.opc.relationshipsFor(masterPartName).add(THEME_REL, relativePartName(masterPartName, themePartName))\n\n\treturn registerNotesMaster(dest, masterPartName)\n}\n","/**\n * Orphan pruning after a part stops being referenced.\n *\n * Removing a slide can strand the parts only it used — its notes slide, media, chart parts. This\n * walks that fringe: a part is dropped when nothing left in the package (or the package root)\n * still resolves an internal relationship to it, and the parts *it* referenced are then examined\n * the same way. Shared chrome (masters, layouts, themes, the notes master) is exempt, so a deck\n * that momentarily has no slides does not lose its design.\n */\n\nimport { relsPartNameFor } from '../../opc/partnames.js'\nimport type { Presentation } from '../presentation.js'\n\nconst SLIDE_MASTER_CONTENT_TYPE = 'application/vnd.openxmlformats-officedocument.presentationml.slideMaster+xml'\nconst SLIDE_LAYOUT_CONTENT_TYPE = 'application/vnd.openxmlformats-officedocument.presentationml.slideLayout+xml'\nconst NOTES_MASTER_CONTENT_TYPE = 'application/vnd.openxmlformats-officedocument.presentationml.notesMaster+xml'\nconst THEME_CONTENT_TYPE = 'application/vnd.openxmlformats-officedocument.theme+xml'\nconst PRESENTATION_MAIN_CONTENT_TYPE =\n\t'application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml'\n\n/**\n * Content types that are shared deck chrome: reachable through the\n * presentation → master → layout → theme graph, not owned by any one slide.\n * {@link Presentation.removeSlide} never prunes these as a removed slide's\n * orphan, even while momentarily unreferenced.\n */\nconst SHARED_CHROME_CONTENT_TYPES = new Set([\n\tSLIDE_MASTER_CONTENT_TYPE,\n\tSLIDE_LAYOUT_CONTENT_TYPE,\n\tTHEME_CONTENT_TYPE,\n\t'application/vnd.openxmlformats-officedocument.themeOverride+xml',\n\tNOTES_MASTER_CONTENT_TYPE,\n\t'application/vnd.openxmlformats-officedocument.presentationml.handoutMaster+xml',\n\t'application/vnd.openxmlformats-officedocument.presentationml.presProps+xml',\n\t'application/vnd.openxmlformats-officedocument.presentationml.viewProps+xml',\n\t'application/vnd.openxmlformats-officedocument.presentationml.tableStyles+xml',\n\tPRESENTATION_MAIN_CONTENT_TYPE,\n])\n\n/**\n * Remove `partName` if it is neither shared chrome nor still referenced by any\n * remaining part, then recurse into the parts it referenced. The pruning a\n * removed slide triggers (notes/media/charts the slide alone used).\n */\nexport function pruneIfOrphan(pres: Presentation, partName: string): void {\n\tconst part = pres.opc.part(partName)\n\tif (!part || SHARED_CHROME_CONTENT_TYPES.has(part.contentType)) return\n\tif (isReferenced(pres, partName)) return\n\tconst rels = pres.opc.relationshipsFor(partName)\n\tconst childTargets = [...rels].filter((rel) => rel.targetMode !== 'External').map((rel) => rels.resolveTarget(rel.id))\n\tpres.opc.removePart(relsPartNameFor(partName))\n\tpres.opc.removePart(partName)\n\tfor (const child of childTargets) pruneIfOrphan(pres, child)\n}\n\n/** Whether any remaining part (or the package root) resolves an internal relationship to `partName`. */\nfunction isReferenced(pres: Presentation, partName: string): boolean {\n\tfor (const owner of [...pres.opc.parts.keys(), '/']) {\n\t\tif (owner.endsWith('.rels')) continue\n\t\tconst rels = pres.opc.relationshipsFor(owner)\n\t\tfor (const rel of rels) {\n\t\t\tif (rel.targetMode === 'External') continue\n\t\t\tif (rels.resolveTarget(rel.id) === partName) return true\n\t\t}\n\t}\n\treturn false\n}\n","/**\n * Rescaling an imported slide's geometry onto the destination canvas.\n *\n * The memo of already-rescaled parts is the load-bearing part: a layout or master shared by\n * several imports from one source deck must be rescaled exactly once, or the second import\n * scales it again on top of the first. It is owned by the calling `Presentation` and threaded\n * through here, so it lives as long as the deck does rather than as long as one call.\n */\n\nimport { firstChild } from '../../oxml/dom.js'\nimport { computeRescale, rescaleSpTree, type RescaleTransform } from './rescale.js'\nimport { resolveSingleRel } from './part-index.js'\nimport type { ImportSlideOptions, SlideSize } from '../presentation-types.js'\nimport type { Presentation } from '../presentation.js'\nimport { SLIDE_LAYOUT_REL, SLIDE_MASTER_REL } from '../../../ooxml/rel-types.js'\n\n/**\n * Rescale an imported slide's geometry onto this deck's canvas (the `rescale`\n * option of {@link Presentation.importSlide}). Rewrites every top-level shape/group/\n * graphicFrame transform and table grid on the slide; in `copy` mode also\n * rescales the imported layout and master shape trees (resolved via the\n * slide → layout → master rel chain) so inherited placeholder/background geometry\n * stays aligned. `preserve`/`restyle` rebind to this deck's own master/layout —\n * already the destination size — so only the slide is touched. Geometry only:\n * font sizes and line widths are left as authored.\n */\nexport function rescaleImportedGeometry(\n\tdest: Presentation,\n\trescaledParts: Set<string>,\n\tslidePartName: string,\n\ttheme: ImportSlideOptions['theme'],\n\tsource: SlideSize,\n\ttarget: SlideSize,\n\tmode: 'fit' | 'stretch'\n): void {\n\tconst transform = computeRescale(source, target, mode)\n\trescalePartGeometry(dest, rescaledParts, slidePartName, transform)\n\tif (theme === undefined || theme === 'copy') {\n\t\tconst layout = resolveSingleRel(dest.opc, slidePartName, SLIDE_LAYOUT_REL)\n\t\tconst master = layout ? resolveSingleRel(dest.opc, layout, SLIDE_MASTER_REL) : null\n\t\tif (layout) rescalePartGeometry(dest, rescaledParts, layout, transform)\n\t\tif (master) rescalePartGeometry(dest, rescaledParts, master, transform)\n\t}\n}\n\n/**\n * Rescale one part's `p:spTree` geometry in place. Idempotent per part\n * (`rescaledParts`), so a layout/master shared across repeated imports from one\n * source is rescaled exactly once.\n */\nfunction rescalePartGeometry(\n\tdest: Presentation,\n\trescaledParts: Set<string>,\n\tpartName: string,\n\ttransform: RescaleTransform\n): void {\n\tif (rescaledParts.has(partName)) return\n\trescaledParts.add(partName)\n\tconst part = dest.opc.part(partName)\n\tconst root = part?.dom.documentElement\n\tconst cSld = root && firstChild(root, 'p:cSld')\n\tconst spTree = cSld && firstChild(cSld, 'p:spTree')\n\tif (!part || !spTree) return\n\trescaleSpTree(spTree, transform)\n\tpart.markDirty()\n}\n","/**\n * Read-model entry point: `Presentation` wraps an `OpcPackage` and exposes a\n * navigable, typed view of the deck (slides → shapes → text), backed by the\n * live DOM so the same nodes can later be mutated.\n *\n * The class holds the model and the deck-level plumbing every operation needs — the part\n * index, the slide list, the copy registry that lets repeated imports from one source share\n * what they already copied, and the `p:sldIdLst` wiring. The operations themselves live in\n * `ops/`, one job per module, taking this deck as an argument. The slide-import machinery\n * used to sit here as ~280 lines of private methods and made that split hard to see: the\n * read model's own surface was outnumbered by one feature's internals.\n */\nimport { emuToInches } from '../../units.js'\nimport { OpcPackage, type OpcInput } from '../opc/package.js'\nimport type { Part } from '../opc/part.js'\nimport { relativePartName, relsPartNameFor } from '../opc/partnames.js'\nimport {\n\tOOXML_NS,\n\tattr,\n\tcreateElement,\n\tfirstChild,\n\tgetElements,\n\tgetOrAddChild,\n\tintValue,\n\tsetAttr,\n} from '../oxml/dom.js'\nimport { EMBEDDED_FONT_SLOTS } from '../../embedded-fonts.js'\nimport { flattenShape } from './ops/flatten.js'\nimport { Slide } from './slide.js'\nimport { SlideMaster } from './chrome.js'\nimport { wrapShapeElement, type AnyShape } from './shapes.js'\nimport { carryShapeAnimations } from './animation.js'\nimport {\n\tcommentSchema,\n\treadCommentAuthors,\n\treadModernCommentAuthors,\n\ttype CommentAuthor,\n\ttype CommentSchema,\n\ttype ModernCommentAuthor,\n} from './comments.js'\nimport {\n\treadCoreProperties,\n\treadCustomProperties,\n\ttype CoreProperties,\n\ttype CustomProperty,\n} from './document-properties.js'\nimport { readTagsForPart, type Tag } from './tags.js'\nimport type {\n\tAppendSlidesOptions,\n\tFromTemplateOptions,\n\tImportShapeOptions,\n\tEmbeddedFontInfo,\n\tImportSlideMastersOptions,\n\tImportSlideOptions,\n\tImportedSlideMaster,\n\tLayoutHandle,\n\tSlideSize,\n\tSlideSource,\n} from './presentation-types.js'\nimport { cSldName, nthShapeChild } from '../oxml/slide-dom.js'\nimport { computeRescale, rescaleSpTree, type RescaleTransform } from './ops/rescale.js'\nimport { carryTableStyles } from './ops/table-styles.js'\nimport { promoteMasters } from './ops/master-registry.js'\nimport { copyPart, type ImportContext } from './ops/part-copy.js'\n// Deck-mutation operations. They live beside the model rather than on it: each is a whole job\n// (prune a part fringe, carry notes, merge embedded fonts, rescale onto a new canvas) that reads\n// and writes the package through the deck's public surface, and none of them is something a\n// caller navigates *to*.\nimport { rewriteCarriedRels } from './ops/carried-rels.js'\nimport { carryEmbeddedFonts, carryGeneratedEmbeddedFonts } from './ops/embedded-fonts.js'\nimport { sourceFlattenContext } from './ops/flatten-context.js'\nimport { importSlidePreserve, importSlideRestyle } from './ops/import-slide.js'\nimport { carryNotes, ensureNotesMasterFromXml } from './ops/notes-master.js'\nimport { layoutPartNamesOf, slideMasterPartNames } from './ops/part-index.js'\nimport { pruneIfOrphan } from './ops/prune.js'\nimport { rescaleImportedGeometry } from './ops/rescale-import.js'\nimport {\n\tIMAGE_REL,\n\tNOTES_MASTER_REL,\n\tNOTES_SLIDE_REL,\n\tOFFICE_DOCUMENT_REL,\n\tSLIDE_LAYOUT_REL,\n\tSLIDE_REL,\n} from '../../ooxml/rel-types.js'\nimport { InternalError, InvalidOptionError, PackageReadError, UnsupportedFeatureError } from '../../errors.js'\n\nconst HYPERLINK_REL = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink'\nconst CHART_REL = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart'\nconst PACKAGE_REL = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/package'\nconst AUDIO_REL = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/audio'\nconst VIDEO_REL = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/video'\n// Microsoft 2007 `media` rel: paired with the ECMA audio/video rel (same Target),\n// referenced by the slide body's <p14:media r:embed>.\nconst MS_MEDIA_REL = 'http://schemas.microsoft.com/office/2007/relationships/media'\n\nconst SLIDE_CONTENT_TYPE = 'application/vnd.openxmlformats-officedocument.presentationml.slide+xml'\nconst NOTES_SLIDE_CONTENT_TYPE = 'application/vnd.openxmlformats-officedocument.presentationml.notesSlide+xml'\nconst CHART_CONTENT_TYPE = 'application/vnd.openxmlformats-officedocument.drawingml.chart+xml'\nconst XLSX_CONTENT_TYPE = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'\n\n/** Content type of the main part in an editable `.pptx` package. */\nconst PRESENTATION_MAIN_CONTENT_TYPE =\n\t'application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml'\n/** Content type of the main part in a `.potx` template package — flipped to {@link PRESENTATION_MAIN_CONTENT_TYPE} by {@link Presentation.fromTemplate}. */\nconst PRESENTATION_TEMPLATE_MAIN_CONTENT_TYPE =\n\t'application/vnd.openxmlformats-officedocument.presentationml.template.main+xml'\n\nconst textEncoder = new TextEncoder()\n\n/**\n * `p:sldIdLst`'s document-order successors in `CT_Presentation` (ECMA-376):\n * everything that may legally follow it, so an inserted `p:sldIdLst` lands in the\n * right position when a template omitted it (zero slides).\n */\nconst PRESENTATION_SLD_ID_LST_SUCCESSORS = [\n\t'p:sldSz',\n\t'p:notesSz',\n\t'p:smartTags',\n\t'p:embeddedFontLst',\n\t'p:custShowLst',\n\t'p:photoAlbum',\n\t'p:custDataLst',\n\t'p:kinsoku',\n\t'p:defaultTextStyle',\n\t'p:modifyVerifier',\n\t'p:extLst',\n]\n/** ST_SlideId minimum (ECMA-376): slide ids live in [256, 2147483647]. */\nconst MIN_SLIDE_ID = 256\n\nexport class Presentation {\n\t#presentationPart: Part | undefined\n\t/**\n\t * Per-source copy registry for {@link importSlide}: source `OpcPackage` →\n\t * (source partname → partname allocated in this package). Lets parts shared\n\t * across imports from the same source deck (layout, master, theme, media) be\n\t * copied once and reused on later calls.\n\t */\n\t#importRegistry = new Map<OpcPackage, Map<string, string>>()\n\t/**\n\t * Parts whose geometry {@link importSlide}'s `rescale` has already rewritten, so a\n\t * layout/master shared across repeated imports from one source is not scaled twice.\n\t */\n\t#rescaledParts = new Set<string>()\n\n\tprivate constructor(readonly opc: OpcPackage) {}\n\n\t/** Open a `.pptx` from bytes and wrap it as a navigable `Presentation`. */\n\tstatic async load(input: OpcInput): Promise<Presentation> {\n\t\treturn new Presentation(await OpcPackage.load(input))\n\t}\n\n\t/** Wrap an already-loaded OPC package (e.g. from the lower-level API). */\n\tstatic fromPackage(opc: OpcPackage): Presentation {\n\t\treturn new Presentation(opc)\n\t}\n\n\t/**\n\t * Open a PowerPoint template (`.pptx` or `.potx`) and return it as an empty\n\t * deck shell ready to author onto: its slide masters, layouts, and theme are\n\t * kept **byte-identical**, while any sample slides the template carried are\n\t * stripped so only the shared chrome remains.\n\t *\n\t * Use it to build a fresh deck on a corporate template without rebuilding the\n\t * masters in code: discover the bindable layouts with {@link layouts}, then\n\t * author slides with a generator sized to match the template and graft them in\n\t * with {@link appendSlides} (which enforces an equal slide size). Saving yields\n\t * an editable `.pptx` that reuses the template's authored chrome verbatim.\n\t *\n\t * ```ts\n\t * const deck = await Presentation.fromTemplate(templateBytes) // .pptx or .potx\n\t * deck.layouts().map(l => l.name) // discover layouts\n\t * await deck.appendSlides(pptx, { layout: 'Title and Content' })\n\t * const out = await deck.save() // editable .pptx\n\t * ```\n\t *\n\t * A `.potx` package declares its main part with the template content type; by\n\t * default that override is flipped to the editable presentation type so the\n\t * saved output opens as a normal deck. Pass `keepTemplateContentType: true` to\n\t * preserve the template type. A `.pptx` input needs no flip, and a template\n\t * that already carries zero slides makes the strip a no-op.\n\t */\n\tstatic async fromTemplate(input: OpcInput, options: FromTemplateOptions = {}): Promise<Presentation> {\n\t\tconst pres = new Presentation(await OpcPackage.load(input))\n\n\t\t// Normalize a .potx main part to the editable presentation content type so\n\t\t// the saved package opens as a deck, not a template. The officeDocument\n\t\t// relationship resolves the main part regardless of its content type, so a\n\t\t// .potx already loads; only the [Content_Types].xml override needs flipping.\n\t\tif (!options.keepTemplateContentType) {\n\t\t\tconst mainPart = pres.presentationPart\n\t\t\tif (mainPart.contentType === PRESENTATION_TEMPLATE_MAIN_CONTENT_TYPE) {\n\t\t\t\tpres.opc.contentTypes.ensureRegistered(mainPart.partName, PRESENTATION_MAIN_CONTENT_TYPE)\n\t\t\t}\n\t\t}\n\n\t\t// Strip any sample slides to a master/layout-only shell. removeSlide never\n\t\t// prunes shared chrome, so masters/layouts/theme stay byte-identical.\n\t\twhile (pres.slides.length > 0) pres.removeSlide(0)\n\n\t\treturn pres\n\t}\n\n\t/** The main presentation part (`/ppt/presentation.xml`), resolved via the package `officeDocument` relationship. */\n\tget presentationPart(): Part {\n\t\tif (this.#presentationPart) return this.#presentationPart\n\t\tconst packageRels = this.opc.relationshipsFor('/')\n\t\tconst officeDocument = packageRels.byType(OFFICE_DOCUMENT_REL)\n\t\tconst officeDocumentRel = officeDocument[0]\n\t\tif (officeDocument.length !== 1 || !officeDocumentRel) {\n\t\t\tthrow new PackageReadError(\n\t\t\t\t'package/office-document-relationship-invalid',\n\t\t\t\t`Expected exactly one officeDocument relationship, found ${officeDocument.length}`\n\t\t\t)\n\t\t}\n\t\tconst partName = packageRels.resolveTarget(officeDocumentRel.id)\n\t\tconst part = this.opc.part(partName)\n\t\tif (!part)\n\t\t\tthrow new PackageReadError(\n\t\t\t\t'package/relationship-target-missing',\n\t\t\t\t`officeDocument relationship targets a missing part: ${partName}`\n\t\t\t)\n\t\tthis.#presentationPart = part\n\t\treturn part\n\t}\n\n\t/** The slides in presentation order (resolved from `p:sldIdLst` + the presentation's relationships). */\n\tget slides(): Slide[] {\n\t\tconst root = this.presentationPart.dom.documentElement\n\t\tconst sldIdLst = root && firstChild(root, 'p:sldIdLst')\n\t\tif (!sldIdLst) return []\n\t\tconst rels = this.opc.relationshipsFor(this.presentationPart.partName)\n\t\tconst slides: Slide[] = []\n\t\tlet index = 0\n\t\tfor (const sldId of getElements(sldIdLst, 'p:sldId')) {\n\t\t\tconst relId = attr(sldId, 'r:id')\n\t\t\tif (!relId) continue\n\t\t\tconst partName = rels.resolveTarget(relId)\n\t\t\tconst part = this.opc.part(partName)\n\t\t\tif (!part)\n\t\t\t\tthrow new PackageReadError(\n\t\t\t\t\t'package/relationship-target-missing',\n\t\t\t\t\t`Slide relationship ${relId} targets a missing part: ${partName}`\n\t\t\t\t)\n\t\t\tslides.push(new Slide(this, part, intValue(attr(sldId, 'id')) ?? 0, index++))\n\t\t}\n\t\treturn slides\n\t}\n\n\t/** Slide dimensions (`p:sldSz`), or `null` if the presentation declares none. */\n\tget slideSize(): SlideSize | null {\n\t\tconst root = this.presentationPart.dom.documentElement\n\t\tconst sldSz = root && firstChild(root, 'p:sldSz')\n\t\tif (!sldSz) return null\n\t\tconst widthEmu = intValue(attr(sldSz, 'cx'))\n\t\tconst heightEmu = intValue(attr(sldSz, 'cy'))\n\t\tif (widthEmu === null || heightEmu === null) return null\n\t\treturn { widthEmu, heightEmu, widthIn: emuToInches(widthEmu), heightIn: emuToInches(heightEmu) }\n\t}\n\n\t/**\n\t * The deck's embedded font families (`p:embeddedFontLst` in `presentation.xml`),\n\t * `[]` when it embeds none. Each entry names the typeface and resolves every\n\t * embedded face's `r:id` to the absolute partname of its `.fntdata` binary — the\n\t * read counterpart to the write-side `pptx.embedFont` / `importSlide({ embedFonts })`\n\t * carry. An entry whose `p:font` has no `@typeface`, or a face whose `r:id` is\n\t * missing or dangling, is skipped (faithful degradation, no throw). Read-only.\n\t */\n\tget embeddedFonts(): EmbeddedFontInfo[] {\n\t\tconst root = this.presentationPart.dom.documentElement\n\t\tconst lst = root && firstChild(root, 'p:embeddedFontLst')\n\t\tif (!lst) return []\n\t\tconst rels = this.opc.relationshipsFor(this.presentationPart.partName)\n\t\tconst fonts: EmbeddedFontInfo[] = []\n\t\tfor (const entry of getElements(lst, 'p:embeddedFont')) {\n\t\t\tconst font = firstChild(entry, 'p:font')\n\t\t\tconst typeface = font && attr(font, 'typeface')\n\t\t\tif (!typeface) continue\n\t\t\tconst faces: EmbeddedFontInfo['faces'] = []\n\t\t\tfor (const slot of EMBEDDED_FONT_SLOTS) {\n\t\t\t\tconst face = firstChild(entry, `p:${slot}`)\n\t\t\t\tconst relId = face && attr(face, 'r:id')\n\t\t\t\tif (!relId || !rels.get(relId)) continue\n\t\t\t\tfaces.push({ slot, partName: rels.resolveTarget(relId) })\n\t\t\t}\n\t\t\tfonts.push({ typeface, panose: font ? attr(font, 'panose') : null, faces })\n\t\t}\n\t\treturn fonts\n\t}\n\n\t/**\n\t * The deck-wide **legacy** comment-author registry (`p:cmAuthorLst` in\n\t * `ppt/commentAuthors.xml`), `[]` when the deck has no comments. Each slide's\n\t * {@link Slide.comments} resolves its `@authorId` against this list. The 2018\n\t * modern comment authors (`ppt/authors.xml`) are a separate part, not decoded here.\n\t */\n\tget commentAuthors(): CommentAuthor[] {\n\t\treturn readCommentAuthors(this.opc, this.presentationPart.partName)\n\t}\n\n\t/**\n\t * The deck-wide **modern** (2018) comment-author registry (`p188:authorLst` in\n\t * `ppt/authors.xml`), `[]` when the deck carries no modern comments. Unlike the\n\t * legacy {@link commentAuthors}, each entry is keyed by a GUID `id` (plus\n\t * `userId`/`providerId`); each slide's {@link Slide.modernComments} resolves its\n\t * `@authorId` against this list. Read-only — the writer emits legacy comments.\n\t */\n\tget modernCommentAuthors(): ModernCommentAuthor[] {\n\t\treturn readModernCommentAuthors(this.opc, this.presentationPart.partName)\n\t}\n\n\t/**\n\t * Which comment schema this deck uses: `'modern'` when it carries any 2018\n\t * `modernComment_*` part (read via {@link Slide.modernComments} /\n\t * {@link modernCommentAuthors}), `'legacy'` when it carries classic\n\t * `commentN.xml` parts (read via {@link Slide.comments} / {@link commentAuthors}),\n\t * or `'none'`. The two schemas do not coexist in practice, so this tells a\n\t * consumer which accessor to read without probing both.\n\t */\n\tget commentSchema(): CommentSchema {\n\t\treturn commentSchema(this.opc)\n\t}\n\n\t/**\n\t * The deck's core document properties (`docProps/core.xml`): title, subject,\n\t * creator, keywords, revision, and the created/modified/lastPrinted timestamps\n\t * (kept as raw W3CDTF strings). `{}` when the deck carries no core-properties\n\t * part. The read counterpart of the write-side `pptx.title`/`subject`/`author`\n\t * (→ `creator`)/`revision` setters.\n\t */\n\tget coreProperties(): CoreProperties {\n\t\treturn readCoreProperties(this.opc)\n\t}\n\n\t/**\n\t * The deck's user-defined custom document properties (`docProps/custom.xml`) as\n\t * `{ name, value }` pairs, each value typed from its `vt:` element (string,\n\t * number, boolean, or a raw filetime string). `[]` when the deck carries no\n\t * custom-properties part. The read counterpart of `pptx.setCustomProperty(...)`.\n\t */\n\tget customProperties(): CustomProperty[] {\n\t\treturn readCustomProperties(this.opc)\n\t}\n\n\t/**\n\t * The deck-level programmatic tags (`p:custDataLst/p:tags` on `presentation.xml`,\n\t * resolved to `ppt/tags/tagN.xml`) as `{ name, val }` string pairs, `[]` when the\n\t * deck carries none. These are add-in/host metadata with no visible rendering and\n\t * no writer — read-only, preserved byte-for-byte on round-trip. Per-slide tags are\n\t * {@link Slide.tags}.\n\t */\n\tget tags(): Tag[] {\n\t\treturn readTagsForPart(this.opc, this.presentationPart.partName)\n\t}\n\n\t/**\n\t * Duplicate the slide at `index` and insert the copy at `options.at` (deck\n\t * order; `0` = first), defaulting to appending at the end when `at` is omitted\n\t * or out of range. Returns the new slide. The new slide part copies the source\n\t * bytes verbatim and shares the source's relationship targets (layout, images,\n\t * …) by copying its `.rels`; a new presentation→slide relationship and a\n\t * `p:sldId` entry are wired up. Marks the presentation part dirty.\n\t *\n\t * Note: relationships are copied as-is, so a source slide that owns a\n\t * one-to-one part (e.g. a notes slide) would end up shared with the clone.\n\t */\n\tcloneSlide(index: number, options: { at?: number } = {}): Slide {\n\t\tconst source = this.slides[index]\n\t\tif (!source) throw new InvalidOptionError('slide/index-out-of-range', `No slide at index ${index} to clone`)\n\t\tconst opc = this.opc\n\t\tconst sourcePart = source.part\n\n\t\t// 1. Copy the slide part bytes verbatim into a fresh slide partname.\n\t\tconst newPartName = opc.reservePartNameLike(sourcePart.partName)\n\t\tconst newPart = opc.addPart(newPartName, sourcePart.contentType, sourcePart.bytes)\n\n\t\t// 2. Copy the slide's relationships (targets resolve identically — same dir).\n\t\tconst sourceRels = opc.part(relsPartNameFor(sourcePart.partName))\n\t\tif (sourceRels) opc.addPart(relsPartNameFor(newPartName), sourceRels.contentType, sourceRels.bytes)\n\n\t\t// 3. Wire the new slide into the presentation (rel + p:sldId entry) at `at`.\n\t\treturn this.#insertSlidePart(newPart, options.at)\n\t}\n\n\t/**\n\t * Remove the slide at `index` (deck order) and return its former partname. The\n\t * `p:sldId` entry and the presentation→slide relationship are dropped, the slide\n\t * part and its `.rels` are deleted, and any part the slide *privately* owned\n\t * (its notes slide, slide-only media, charts/embeddings) that no remaining part\n\t * references is pruned too — recursively. Shared deck chrome (layout, master,\n\t * theme, …) is never pruned, so the deck stays renderable; removing every slide\n\t * leaves a valid master/layout-only package (a template shell).\n\t *\n\t * Untouched parts stay byte-identical, matching the package fidelity contract.\n\t * Throws when there is no slide at `index`.\n\t */\n\tremoveSlide(index: number): string {\n\t\tconst slide = this.slides[index]\n\t\tif (!slide) throw new InvalidOptionError('slide/index-out-of-range', `No slide at index ${index} to remove`)\n\t\tconst partName = slide.partName\n\n\t\t// The slide's internal targets, captured before its rels are dropped, so the\n\t\t// parts it privately owned can be pruned afterwards.\n\t\tconst slideRels = this.opc.relationshipsFor(partName)\n\t\tconst formerTargets = [...slideRels]\n\t\t\t.filter((rel) => rel.targetMode !== 'External')\n\t\t\t.map((rel) => slideRels.resolveTarget(rel.id))\n\n\t\t// Unwire from presentation.xml: remove the matching p:sldId and the rel.\n\t\tconst presPart = this.presentationPart\n\t\tconst presRels = this.opc.relationshipsFor(presPart.partName)\n\t\tconst root = presPart.dom.documentElement\n\t\tconst sldIdLst = root && firstChild(root, 'p:sldIdLst')\n\t\tif (sldIdLst) {\n\t\t\tfor (const sldId of getElements(sldIdLst, 'p:sldId')) {\n\t\t\t\tconst relId = attr(sldId, 'r:id')\n\t\t\t\tif (relId && presRels.get(relId) && presRels.resolveTarget(relId) === partName) {\n\t\t\t\t\tsldIdLst.removeChild(sldId)\n\t\t\t\t\tpresRels.remove(relId)\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tpresPart.markDirty()\n\n\t\t// Drop the slide part and its .rels, then prune the parts it privately owned.\n\t\tthis.opc.removePart(relsPartNameFor(partName))\n\t\tthis.opc.removePart(partName)\n\t\tfor (const target of formerTargets) pruneIfOrphan(this, target)\n\n\t\treturn partName\n\t}\n\n\t/**\n\t * Append a copy of `source.slides[index]` to this presentation and return it.\n\t *\n\t * Unlike {@link cloneSlide} (same-deck duplicate), this copies a slide across\n\t * a package boundary: it brings the connected sub-graph the slide depends on —\n\t * its `slideLayout` → `slideMaster` → `theme`, plus any media, charts, and\n\t * embeddings — into this package under fresh partnames, rewriting every\n\t * partname, relationship id, and content-type registration so the result is a\n\t * self-consistent OPC package. Parts of this (target) package that are not\n\t * touched stay byte-identical, matching `cloneSlide`'s fidelity contract.\n\t *\n\t * Only the layout(s) actually used by imported slides are copied; the imported\n\t * master's `p:sldLayoutIdLst` is pruned to exactly those, mirroring how\n\t * PowerPoint's \"Reuse Slides\" brings a slide across. Parts shared by repeated\n\t * imports from the same source deck are copied once and reused.\n\t *\n\t * With `{ theme: 'preserve' }` the slide's source theme is instead *flattened*\n\t * into the slide XML and the slide is bound to this deck's existing\n\t * master/layout; with `{ theme: 'restyle' }` the slide is bound to this deck's\n\t * master/layout with its theme references left symbolic, so it re-brands to the\n\t * destination palette — see {@link ImportSlideOptions}.\n\t *\n\t * v1 limitations: by default the source slide size must equal this\n\t * presentation's — pass `{ rescale: 'fit' | 'stretch' }` to rescale the imported\n\t * geometry onto this deck's canvas instead (geometry only, not fonts/line\n\t * widths). Source notes are dropped unless you pass `{ importNotes: true }`.\n\t */\n\timportSlide(source: Presentation, index: number, options: ImportSlideOptions = {}): Slide {\n\t\tconst sourceSlide = source.slides[index]\n\t\tif (!sourceSlide) throw new InvalidOptionError('slide/index-out-of-range', `No slide at index ${index} to import`)\n\n\t\t// 1. Pre-flight: slide sizes must match unless the caller opts into a rescale.\n\t\tconst target = this.slideSize\n\t\tconst incoming = source.slideSize\n\t\tconst sizesDiffer =\n\t\t\t!target || !incoming || target.widthEmu !== incoming.widthEmu || target.heightEmu !== incoming.heightEmu\n\t\tif (sizesDiffer && !options.rescale) {\n\t\t\tconst fmt = (s: SlideSize | null): string => (s ? `${s.widthEmu}×${s.heightEmu} EMU` : 'unknown')\n\t\t\tthrow new InvalidOptionError(\n\t\t\t\t'import/slide-size-mismatch',\n\t\t\t\t`importSlide requires equal slide sizes (pass { rescale: 'fit' | 'stretch' } to rescale); target is ${fmt(target)}, source is ${fmt(incoming)}`\n\t\t\t)\n\t\t}\n\t\tif (sizesDiffer && options.rescale && (!target || !incoming)) {\n\t\t\tthrow new InvalidOptionError(\n\t\t\t\t'import/slide-size-unknown',\n\t\t\t\t'importSlide rescale requires both decks to declare a slide size (p:sldSz)'\n\t\t\t)\n\t\t}\n\n\t\t// 2. Copy the slide and its dependencies. 'preserve' flattens the theme into\n\t\t// the slide and attaches it to this deck's master; 'restyle' attaches it\n\t\t// to this deck's master with theme refs left symbolic (re-brand); 'copy'\n\t\t// brings the source theme subgraph across wholesale.\n\t\tconst importCtx = this.#importContext(source.opc)\n\t\tconst newPartName =\n\t\t\toptions.theme === 'preserve'\n\t\t\t\t? importSlidePreserve(this, importCtx, source, sourceSlide, options.carryMasterGraphics === true)\n\t\t\t\t: options.theme === 'restyle'\n\t\t\t\t\t? importSlideRestyle(\n\t\t\t\t\t\t\tthis,\n\t\t\t\t\t\t\timportCtx,\n\t\t\t\t\t\t\tsource,\n\t\t\t\t\t\t\tsourceSlide,\n\t\t\t\t\t\t\toptions.carryMasterGraphics === true,\n\t\t\t\t\t\t\toptions.remapLiterals === true\n\t\t\t\t\t\t)\n\t\t\t\t\t: copyPart(importCtx, sourceSlide.partName)\n\t\tconst newPart = this.opc.part(newPartName)\n\t\tif (!newPart)\n\t\t\tthrow new InternalError('import/part-went-missing', `Imported slide part went missing: ${newPartName}`)\n\n\t\t// 2b. Rescale the imported geometry to this deck's canvas when sizes differ.\n\t\tif (sizesDiffer && options.rescale && target && incoming) {\n\t\t\trescaleImportedGeometry(\n\t\t\t\tthis,\n\t\t\t\tthis.#rescaledParts,\n\t\t\t\tnewPartName,\n\t\t\t\toptions.theme,\n\t\t\t\tincoming,\n\t\t\t\ttarget,\n\t\t\t\toptions.rescale === true ? 'fit' : options.rescale\n\t\t\t)\n\t\t}\n\n\t\t// 3. Wire the new slide into the presentation (rel + p:sldId entry) at `at`.\n\t\tconst slide = this.#insertSlidePart(newPart, options.at)\n\n\t\t// 4. Optionally carry the source slide's speaker notes. The slide copy above\n\t\t// drops the notesSlide rel (both copyPart and importSlideRebind do); this\n\t\t// re-adds it wired to the new slide and merged onto a single notesMaster.\n\t\tif (options.importNotes) carryNotes(this, source, importCtx, sourceSlide.partName, newPartName)\n\n\t\t// 5. Optionally carry the source deck's embedded fonts (presentation-level, so\n\t\t// a separate traversal from the slide-part copy chain above).\n\t\tif (options.embedFonts) carryEmbeddedFonts(this, source, importCtx)\n\n\t\treturn slide\n\t}\n\n\t/**\n\t * Graft slide master(s) from another open package into this one and return what\n\t * was copied. Unlike {@link importSlide} — which brings a master across only as\n\t * the dependency of an imported *slide* and prunes it to the one layout that\n\t * slide uses — this copies a master together with its **whole** layout family\n\t * and attaches it to no slide: the master and its layouts land in this deck's\n\t * layout gallery (PowerPoint's *Insert ▸ New Slide* / *Layout* picker) without\n\t * changing any existing slide.\n\t *\n\t * It is the \"ship a brand template's layouts into a generated deck\" capability,\n\t * kept brand-agnostic here: the caller supplies the source `.pptx`. Each grafted\n\t * master is wired into `p:sldMasterIdLst` (so renderers treat it as active) and\n\t * its `p:sldLayoutIdLst` is rebuilt to list exactly the copied layouts; the\n\t * connected theme/media/tag parts come across under fresh partnames, and parts\n\t * shared with earlier imports from the same source are reused (the copy\n\t * registry), so a re-call is idempotent. Untouched parts of this package stay\n\t * byte-identical, matching {@link importSlide}'s fidelity contract.\n\t *\n\t * `options.masters` / `options.layouts` narrow what is grafted; by default every\n\t * master and every layout comes across. The source and destination slide sizes\n\t * must match unless `options.requireEqualSize` is `false` (see\n\t * {@link ImportSlideMastersOptions}).\n\t *\n\t * Presentation-level parts are carried only on request: embedded fonts via\n\t * `options.embedFonts` and table styles via `options.tableStyles`. By default a\n\t * grafted master is appended after the deck's existing masters; `options.primary`\n\t * moves the grafted masters to the front so the deck presents as their theme (see\n\t * {@link ImportSlideMastersOptions}). The v1 limitation mirroring\n\t * {@link importSlide} is that geometry is not rescaled.\n\t */\n\timportSlideMasters(source: Presentation, options: ImportSlideMastersOptions = {}): ImportedSlideMaster[] {\n\t\tif (options.requireEqualSize !== false) {\n\t\t\tconst target = this.slideSize\n\t\t\tconst incoming = source.slideSize\n\t\t\tif (!target || !incoming || target.widthEmu !== incoming.widthEmu || target.heightEmu !== incoming.heightEmu) {\n\t\t\t\tconst fmt = (s: SlideSize | null): string => (s ? `${s.widthEmu}×${s.heightEmu} EMU` : 'unknown')\n\t\t\t\tthrow new InvalidOptionError(\n\t\t\t\t\t'import/slide-size-mismatch',\n\t\t\t\t\t`importSlideMasters requires equal slide sizes (pass { requireEqualSize: false } to override); target is ${fmt(target)}, source is ${fmt(incoming)}`\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\n\t\tconst pickMaster = options.masters ?? (() => true)\n\t\tconst pickLayout = options.layouts ?? (() => true)\n\n\t\tconst ctx = this.#importContext(source.opc)\n\t\tconst imported: ImportedSlideMaster[] = []\n\t\tslideMasterPartNames(source).forEach((masterPartName, masterIndex) => {\n\t\t\tif (!pickMaster(cSldName(source.opc.part(masterPartName)), masterIndex)) return\n\n\t\t\t// Copy the (lean) master first: copyPart registers it in p:sldMasterIdLst\n\t\t\t// and clears its layout list, then each copied layout re-links itself in.\n\t\t\tconst newMasterPartName = copyPart(ctx, masterPartName)\n\n\t\t\tconst layoutPartNames: string[] = []\n\t\t\tlayoutPartNamesOf(source, masterPartName).forEach((layoutPartName, layoutIndex) => {\n\t\t\t\tif (!pickLayout(cSldName(source.opc.part(layoutPartName)), layoutIndex)) return\n\t\t\t\tlayoutPartNames.push(copyPart(ctx, layoutPartName))\n\t\t\t})\n\n\t\t\timported.push({ partName: newMasterPartName, layoutPartNames })\n\t\t})\n\n\t\t// Optionally carry the source deck's presentation-level styling parts. Both are\n\t\t// separate traversals from the master/layout copy chain above, and both are\n\t\t// whole-deck: neither part records which font/style belongs to which master.\n\t\tif (options.embedFonts) carryEmbeddedFonts(this, source, this.#importContext(source.opc))\n\t\tif (options.tableStyles) carryTableStyles(this, source.opc)\n\t\tif (options.primary)\n\t\t\tpromoteMasters(\n\t\t\t\tthis,\n\t\t\t\timported.map((m) => m.partName)\n\t\t\t)\n\n\t\treturn imported\n\t}\n\n\t/**\n\t * The deck's slide masters, in `p:sldMasterIdLst` order, as modeled\n\t * {@link SlideMaster}s — the typed read model over the shared chrome (each\n\t * master's colour map, theme, placeholders, and the layouts built on it). Walk\n\t * `pres.masters()[i].layouts` for the rich layout model, or use {@link layouts}\n\t * for the flat {@link LayoutHandle} gallery {@link appendSlides} binds to.\n\t * Read-only: it copies nothing and leaves the package byte-identical.\n\t */\n\tmasters(): SlideMaster[] {\n\t\treturn slideMasterPartNames(this)\n\t\t\t.map((partName) => this.opc.part(partName))\n\t\t\t.filter((part): part is Part => part !== undefined)\n\t\t\t.map((part) => new SlideMaster(this.opc, part))\n\t}\n\n\t/**\n\t * The deck's slide layouts, in master then layout order — the gallery a new\n\t * slide can bind to. Each {@link LayoutHandle} addresses one layout for\n\t * {@link appendSlides}; the `name` is its `p:cSld@name`. Read-only enumeration:\n\t * it copies nothing and leaves the package byte-identical.\n\t */\n\tlayouts(): LayoutHandle[] {\n\t\tconst out: LayoutHandle[] = []\n\t\tslideMasterPartNames(this).forEach((masterPartName, masterIndex) => {\n\t\t\tlayoutPartNamesOf(this, masterPartName).forEach((layoutPartName, layoutIndex) => {\n\t\t\t\tout.push({\n\t\t\t\t\tpartName: layoutPartName,\n\t\t\t\t\tname: cSldName(this.opc.part(layoutPartName)),\n\t\t\t\t\tmasterPartName,\n\t\t\t\t\tmasterIndex,\n\t\t\t\t\tlayoutIndex,\n\t\t\t\t})\n\t\t\t})\n\t\t})\n\t\treturn out\n\t}\n\n\t/**\n\t * Append generator-produced slides onto this deck, binding each to an existing\n\t * layout, and return the new {@link Slide}s. This is the hybrid\n\t * \"generate-onto-existing\" path: the deck's masters, layouts, theme — and every\n\t * other untouched part — stay **byte-identical** (only `presentation.xml`, its\n\t * `.rels`, `[Content_Types].xml`, and the freshly-added slide/media parts\n\t * change), because the existing chrome is never regenerated.\n\t *\n\t * `source` is any slide producer (a `TsPptx` instance); its authored slides\n\t * are serialized via {@link SlideSource.extractSlides} and spliced in under\n\t * fresh partnames, with each slide's `slideLayout` relationship pointed at the\n\t * layout named by `options.layout` and its image/hyperlink relationships rebuilt\n\t * (preserving the body's relationship ids). Insert position follows\n\t * `options.at` (see {@link AppendSlidesOptions}).\n\t *\n\t * Charts and internal slide-to-slide hyperlinks are carried across: chart parts\n\t * (chart XML + `.rels` + embedded workbook) are injected under fresh names, and a\n\t * `slide:N` link is repointed at the Nth appended slide's new partname.\n\t *\n\t * The generator's presentation-level embedded fonts (`pptx.embedFont`) are also\n\t * carried into this deck and merged into its `p:embeddedFontLst`, de-duped by\n\t * typeface + face slot — so author-side embedded fonts survive the append onto a\n\t * template that may itself already embed fonts.\n\t *\n\t * Embedded audio/video is carried too: the media part backs the ECMA audio/video rel\n\t * and the MS-2007 `media` rel sharing one Target, plus a separate preview image part,\n\t * with the media content type registered as a Default extension entry (what PowerPoint\n\t * authors). Online (external-link) video rides as two External rels over the link.\n\t *\n\t * Speaker notes ride across too: a slide authored with `addNotes` gets a `notesSlide`\n\t * part wired back to it, with its hyperlink rels preserved. A notes slide must bind to\n\t * a notes master, and a template commonly has none, so the generator's is installed\n\t * (with the theme its `.rels` needs) — but only when this deck has none of its own, so\n\t * an existing notes master and its styling always win.\n\t *\n\t * Limitations:\n\t * - An internal link to a source slide outside the appended batch throws (its\n\t * target has no counterpart in the destination).\n\t * - Appended slides are concrete absolute-positioned content with no placeholder\n\t * inheritance from the bound layout; the binding governs theme/`clrMap`\n\t * resolution and the \"based on\" link, not placeholder geometry. Author with\n\t * concrete colours — any `schemeClr` re-resolves against the destination theme.\n\t * - Source and destination slide sizes must match (no geometry rescale).\n\t */\n\tasync appendSlides(source: SlideSource, options: AppendSlidesOptions): Promise<Slide[]> {\n\t\t// 1. Resolve the target layout partname (explicit; no silent fallback).\n\t\tconst gallery = this.layouts()\n\t\tlet target: LayoutHandle\n\t\tif (typeof options.layout === 'string') {\n\t\t\tconst matches = gallery.filter((l) => l.name === options.layout)\n\t\t\tif (matches.length > 1) {\n\t\t\t\tthrow new InvalidOptionError(\n\t\t\t\t\t'layout/ambiguous-name',\n\t\t\t\t\t`appendSlides: layout name ${JSON.stringify(options.layout)} is ambiguous (${matches.length} layouts share it); pass a LayoutHandle from layouts() instead`\n\t\t\t\t)\n\t\t\t}\n\t\t\tconst [only] = matches\n\t\t\tif (!only) {\n\t\t\t\tconst names = gallery.map((l) => JSON.stringify(l.name)).join(', ')\n\t\t\t\tthrow new InvalidOptionError(\n\t\t\t\t\t'layout/not-found',\n\t\t\t\t\t`appendSlides: no layout named ${JSON.stringify(options.layout)}; available: ${names || '(none)'}`\n\t\t\t\t)\n\t\t\t}\n\t\t\ttarget = only\n\t\t} else {\n\t\t\tconst handle = options.layout\n\t\t\tif (!gallery.some((l) => l.partName === handle.partName)) {\n\t\t\t\tthrow new InvalidOptionError(\n\t\t\t\t\t'layout/foreign-handle',\n\t\t\t\t\t`appendSlides: layout ${handle.partName} does not belong to this presentation`\n\t\t\t\t)\n\t\t\t}\n\t\t\ttarget = handle\n\t\t}\n\n\t\t// 2. Author + extract; enforce equal slide size (no geometry rescale in v1).\n\t\tconst extracted = await source.extractSlides({ onMediaError: options.onMediaError })\n\t\tconst size = this.slideSize\n\t\tif (!size || size.widthEmu !== extracted.widthEmu || size.heightEmu !== extracted.heightEmu) {\n\t\t\tconst fmt = (w: number, h: number): string => `${w}×${h} EMU`\n\t\t\tthrow new InvalidOptionError(\n\t\t\t\t'import/slide-size-mismatch',\n\t\t\t\t`appendSlides requires equal slide sizes; target is ${size ? fmt(size.widthEmu, size.heightEmu) : 'unknown'}, source is ${fmt(extracted.widthEmu, extracted.heightEmu)}`\n\t\t\t)\n\t\t}\n\n\t\t// Any existing slide partname seeds the fresh-partname family; fall back to a\n\t\t// literal seed for a slide-less template shell (reservePartNameLike parses the\n\t\t// string, it does not require the part to exist).\n\t\tconst slideTemplate = this.slides[0]?.partName ?? '/ppt/slides/slide1.xml'\n\n\t\t// Pass 1: reserve + add every slide body first, so internal slide-to-slide\n\t\t// links (which may point forward) can resolve to any appended slide. Adding\n\t\t// each part immediately claims its name — reservePartNameLike returns max+1\n\t\t// from the existing parts, so the next reservation sees it. (addPart registers\n\t\t// the slide's Override content type.)\n\t\tconst placed = extracted.slides.map((slide) => {\n\t\t\tconst partName = this.opc.reservePartNameLike(slideTemplate)\n\t\t\tconst part = this.opc.addPart(partName, SLIDE_CONTENT_TYPE, textEncoder.encode(slide.xml))\n\t\t\treturn { slide, part, partName }\n\t\t})\n\n\t\t// 1-based source slide number -> the appended slide's new partname.\n\t\tconst partBySourceNumber = new Map<number, string>(placed.map((p, i) => [i + 1, p.partName]))\n\n\t\t// Pass 2: build each slide's .rels and wire it into presentation.xml. Media,\n\t\t// hyperlinks, charts, and slide-links keep the body's rId (addWithId); the\n\t\t// layout rel is added last via add() so its auto-id cannot collide.\n\t\tconst added: Slide[] = []\n\t\tplaced.forEach(({ slide, part, partName }, i) => {\n\t\t\tconst rels = this.opc.relationshipsFor(partName)\n\t\t\tfor (const m of slide.media) {\n\t\t\t\tconst mediaPartName = this.opc.reserveMediaPartName(m.extn)\n\t\t\t\tthis.opc.addPart(mediaPartName, m.contentType, m.bytes)\n\t\t\t\trels.addWithId(`rId${m.rId}`, IMAGE_REL, relativePartName(partName, mediaPartName))\n\t\t\t}\n\t\t\tfor (const av of slide.avMedia) {\n\t\t\t\t// One media part backs two rels (ECMA audio/video + MS-2007 media) sharing\n\t\t\t\t// its Target; the preview poster is a separate image part. ensureDefault\n\t\t\t\t// runs before addPart so the content type resolves via a Default extension\n\t\t\t\t// entry (what PowerPoint authors) rather than a per-part Override.\n\t\t\t\tconst mediaPartName = this.opc.reserveMediaPartName(av.mediaExtn, 'media')\n\t\t\t\tthis.opc.contentTypes.ensureDefault(av.mediaExtn, av.mediaContentType)\n\t\t\t\tthis.opc.addPart(mediaPartName, av.mediaContentType, av.mediaBytes)\n\t\t\t\tconst mediaTarget = relativePartName(partName, mediaPartName)\n\t\t\t\trels.addWithId(`rId${av.mediaRid}`, av.mtype === 'audio' ? AUDIO_REL : VIDEO_REL, mediaTarget)\n\t\t\t\trels.addWithId(`rId${av.msMediaRid}`, MS_MEDIA_REL, mediaTarget)\n\n\t\t\t\tconst previewPartName = this.opc.reserveMediaPartName(av.previewExtn)\n\t\t\t\tthis.opc.contentTypes.ensureDefault(av.previewExtn, av.previewContentType)\n\t\t\t\tthis.opc.addPart(previewPartName, av.previewContentType, av.previewBytes)\n\t\t\t\trels.addWithId(`rId${av.previewRid}`, IMAGE_REL, relativePartName(partName, previewPartName))\n\t\t\t}\n\t\t\tfor (const ov of slide.onlineMedia) {\n\t\t\t\t// Online (external-link) video: two External rels share the link Target — the\n\t\t\t\t// ECMA video rel and the MS-2007 media rel — with no media binary part and no\n\t\t\t\t// content-type entry. The poster image is wired by the `slide.media` loop above.\n\t\t\t\trels.addWithId(`rId${ov.mediaRid}`, VIDEO_REL, ov.link, 'External')\n\t\t\t\trels.addWithId(`rId${ov.msMediaRid}`, MS_MEDIA_REL, ov.link, 'External')\n\t\t\t}\n\t\t\tfor (const h of slide.hyperlinks) {\n\t\t\t\trels.addWithId(`rId${h.rId}`, HYPERLINK_REL, h.target, 'External')\n\t\t\t}\n\t\t\tif (slide.notes) {\n\t\t\t\t// Speaker notes. The notes part carries its own rel namespace, independent of\n\t\t\t\t// the slide's: rId1 = notesMaster, rId2 = the slide it annotates, hyperlinks\n\t\t\t\t// from rId3 — the order the generator's body was serialized against, so these\n\t\t\t\t// are added by explicit id rather than left to auto-numbering.\n\t\t\t\tconst notesPartName = this.opc.reservePartNameLike('/ppt/notesSlides/notesSlide1.xml')\n\t\t\t\tthis.opc.addPart(notesPartName, NOTES_SLIDE_CONTENT_TYPE, textEncoder.encode(slide.notes.xml))\n\t\t\t\trels.add(NOTES_SLIDE_REL, relativePartName(partName, notesPartName))\n\n\t\t\t\tconst notesRels = this.opc.relationshipsFor(notesPartName)\n\t\t\t\tconst notesMasterPartName = extracted.notesMaster ? ensureNotesMasterFromXml(this, extracted.notesMaster) : null\n\t\t\t\tif (notesMasterPartName) {\n\t\t\t\t\tnotesRels.addWithId('rId1', NOTES_MASTER_REL, relativePartName(notesPartName, notesMasterPartName))\n\t\t\t\t}\n\t\t\t\tnotesRels.addWithId('rId2', SLIDE_REL, relativePartName(notesPartName, partName))\n\t\t\t\tfor (const h of slide.notes.hyperlinks) {\n\t\t\t\t\tnotesRels.addWithId(`rId${h.rId}`, HYPERLINK_REL, h.target, 'External')\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor (const c of slide.charts) {\n\t\t\t\t// Chart part + its embedded workbook, each under a fresh name. The chart\n\t\t\t\t// XML references the workbook through the chart part's own rId1, so the\n\t\t\t\t// chart .rels is rebuilt here against the reserved workbook partname.\n\t\t\t\tconst chartPartName = this.opc.reservePartNameLike('/ppt/charts/chart1.xml')\n\t\t\t\tthis.opc.addPart(chartPartName, CHART_CONTENT_TYPE, textEncoder.encode(c.chartXml))\n\t\t\t\tconst embeddingPartName = this.opc.reservePartNameLike('/ppt/embeddings/Microsoft_Excel_Worksheet1.xlsx')\n\t\t\t\tthis.opc.contentTypes.ensureDefault('xlsx', XLSX_CONTENT_TYPE)\n\t\t\t\tthis.opc.addPart(embeddingPartName, XLSX_CONTENT_TYPE, c.embeddingBytes)\n\t\t\t\tthis.opc\n\t\t\t\t\t.relationshipsFor(chartPartName)\n\t\t\t\t\t.addWithId('rId1', PACKAGE_REL, relativePartName(chartPartName, embeddingPartName))\n\t\t\t\trels.addWithId(`rId${c.rId}`, CHART_REL, relativePartName(partName, chartPartName))\n\t\t\t}\n\t\t\tfor (const link of slide.slideLinks) {\n\t\t\t\tconst targetPartName = partBySourceNumber.get(link.sourceSlideNumber)\n\t\t\t\tif (!targetPartName) {\n\t\t\t\t\tthrow new InvalidOptionError(\n\t\t\t\t\t\t'import/unresolved-slide-link',\n\t\t\t\t\t\t`appendSlides: slide ${i} links to source slide ${link.sourceSlideNumber}, which is not among the appended slides`\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\trels.addWithId(`rId${link.rId}`, SLIDE_REL, relativePartName(partName, targetPartName))\n\t\t\t}\n\t\t\trels.add(SLIDE_LAYOUT_REL, relativePartName(partName, target.partName))\n\n\t\t\t// Wire into presentation.xml (rel + p:sldId) at the requested position.\n\t\t\tconst at = options.at === undefined ? undefined : options.at + i\n\t\t\tadded.push(this.#insertSlidePart(part, at))\n\t\t})\n\n\t\t// Carry the generator's presentation-level embedded fonts (pptx.embedFont) into\n\t\t// this deck, so author-side embedded fonts survive the append onto a template.\n\t\tcarryGeneratedEmbeddedFonts(this, extracted.embeddedFonts || [])\n\n\t\treturn added\n\t}\n\n\t/**\n\t * Copy one shape — an autoshape, picture, table/chart graphic frame, connector,\n\t * or group — from `source.shapes[shapeIndex]` onto `target`, returning the new\n\t * {@link Shape}. `target` must be a slide of *this* presentation; `source` may\n\t * belong to any open presentation.\n\t *\n\t * The lifted subtree is copied self-consistently: every media/chart/embedding it\n\t * depends on is dragged into this package (deduped against earlier imports from\n\t * the same source), its `r:embed`/`r:id`/… are rewritten to fresh host-slide\n\t * relationships, and its drawing ids (including a group's children) are reassigned\n\t * so they cannot collide with the host. With `theme: 'preserve'` (default) the\n\t * shape's theme references are baked to literals against the *source* theme so it\n\t * renders the same on a foreign host; `restyle` leaves them symbolic to re-brand;\n\t * `copy` brings the XML across untouched — see {@link ImportShapeOptions}.\n\t *\n\t * Differing slide sizes need `{ rescale }` (see {@link ImportShapeOptions.rescale});\n\t * a lifted `preserve` placeholder is baked self-contained and demoted to a plain\n\t * shape (see {@link ImportShapeOptions.theme}), so it neither re-inherits from nor\n\t * collides with the host. A shape's build animation lives in the slide-scoped\n\t * `p:timing`, not in its subtree, so the shape lands static unless\n\t * `{ carryAnimation: true }` opts in (see {@link ImportShapeOptions.carryAnimation}).\n\t */\n\timportShape(target: Slide, source: Slide, shapeIndex: number, options: ImportShapeOptions = {}): AnyShape {\n\t\tconst [shape] = this.importShapes(target, source, [shapeIndex], options)\n\t\tif (!shape)\n\t\t\tthrow new InvalidOptionError(\n\t\t\t\t'shape/index-out-of-range',\n\t\t\t\t`importShape: source slide has no shape at index ${shapeIndex}`\n\t\t\t)\n\t\treturn shape\n\t}\n\n\t/**\n\t * Batch form of {@link importShape}: copy several shapes from one source slide\n\t * onto `target` in the given order. Media/chart/embedding parts shared by the\n\t * lifted shapes (and by earlier imports from the same source deck) are copied\n\t * once via the copy registry, and shared images resolve to a single host-slide\n\t * relationship. Returns the new {@link Shape}s in `shapeIndices` order.\n\t */\n\timportShapes(target: Slide, source: Slide, shapeIndices: number[], options: ImportShapeOptions = {}): AnyShape[] {\n\t\tif (target.presentation !== this)\n\t\t\tthrow new InvalidOptionError('slide/foreign-target', 'importShape: target slide must belong to this presentation')\n\n\t\t// Pre-flight: slide sizes must match unless { rescale } opts into scaling the\n\t\t// lifted geometry onto this canvas (computed once, applied per shape below).\n\t\tconst targetSize = this.slideSize\n\t\tconst sourceSize = source.presentation.slideSize\n\t\tconst sizesMatch =\n\t\t\t!!targetSize &&\n\t\t\t!!sourceSize &&\n\t\t\ttargetSize.widthEmu === sourceSize.widthEmu &&\n\t\t\ttargetSize.heightEmu === sourceSize.heightEmu\n\t\tlet transform: RescaleTransform | null = null\n\t\tif (!sizesMatch) {\n\t\t\tif (!options.rescale || !targetSize || !sourceSize) {\n\t\t\t\tconst fmt = (s: SlideSize | null): string => (s ? `${s.widthEmu}×${s.heightEmu} EMU` : 'unknown')\n\t\t\t\tthrow new InvalidOptionError(\n\t\t\t\t\t'import/slide-size-mismatch',\n\t\t\t\t\t`importShape requires equal slide sizes (or { rescale }); target is ${fmt(targetSize)}, source is ${fmt(sourceSize)}`\n\t\t\t\t)\n\t\t\t}\n\t\t\ttransform = computeRescale(sourceSize, targetSize, options.rescale === 'stretch' ? 'stretch' : 'fit')\n\t\t}\n\n\t\t// Resolve + validate every index up front so a bad batch throws before mutating.\n\t\tconst sourceShapes = source.shapes\n\t\tconst sourceElements = shapeIndices.map((i) => {\n\t\t\tconst shape = sourceShapes[i]\n\t\t\tif (!shape)\n\t\t\t\tthrow new InvalidOptionError(\n\t\t\t\t\t'shape/index-out-of-range',\n\t\t\t\t\t`No shape at index ${i} on the source slide (it has ${sourceShapes.length})`\n\t\t\t\t)\n\t\t\treturn shape.element_\n\t\t})\n\n\t\tconst spTree = target.shapeTree()\n\t\tif (!spTree)\n\t\t\tthrow new PackageReadError(\n\t\t\t\t'slide/no-shape-tree',\n\t\t\t\t`importShape: target slide ${target.partName} has no shape tree`\n\t\t\t)\n\t\tconst targetDoc = spTree.ownerDocument\n\t\tif (!targetDoc)\n\t\t\tthrow new InternalError('oxml/node-has-no-document', 'importShape: target slide DOM has no owner document')\n\n\t\tconst theme = options.theme ?? 'preserve'\n\t\tconst sourceOpc = source.presentation.opc\n\t\tconst sourceRels = sourceOpc.relationshipsFor(source.partName)\n\t\tconst targetRels = this.opc.relationshipsFor(target.partName)\n\t\t// One rel-id map across the batch so shapes sharing a source image share a rel.\n\t\tconst relIdMap = new Map<string, string>()\n\t\t// preserve: build the source theme context once; copy/restyle need none.\n\t\tconst ctx = theme === 'preserve' ? sourceFlattenContext(sourceOpc, source.partName) : null\n\t\tconst importCtx = this.#importContext(sourceOpc)\n\n\t\t// Anchor for z-order: the existing shape currently at `at` (insert before it,\n\t\t// preserving batch order), else append before any trailing p:extLst.\n\t\tconst extLst = firstChild(spTree, 'p:extLst')\n\t\tconst anchor = options.at == null ? extLst : (nthShapeChild(spTree, options.at) ?? extLst)\n\n\t\tconst result: AnyShape[] = []\n\t\tfor (const shapeEl of sourceElements) {\n\t\t\tconst imported = targetDoc.importNode(shapeEl, true)\n\n\t\t\t// Drag media/charts/embeddings across and rewrite refs to fresh host rels.\n\t\t\trewriteCarriedRels(imported, importCtx, sourceRels, target.partName, targetRels, relIdMap)\n\n\t\t\t// preserve: bake the source theme onto the subtree. The flatten passes match\n\t\t\t// descendants (not the root), so wrap the shape in a throwaway container.\n\t\t\tif (ctx) {\n\t\t\t\tconst holder = createElement(targetDoc, 'p:spTree')\n\t\t\t\tholder.appendChild(imported)\n\t\t\t\tflattenShape(holder, ctx)\n\t\t\t}\n\n\t\t\t// Rescale geometry onto this canvas (after flatten, so a placeholder's just-baked\n\t\t\t// inherited a:xfrm is scaled too). rescaleSpTree wants a p:spTree, so wrap the shape.\n\t\t\tif (transform) {\n\t\t\t\tconst holder = createElement(targetDoc, 'p:spTree')\n\t\t\t\tholder.appendChild(imported)\n\t\t\t\trescaleSpTree(holder, transform)\n\t\t\t}\n\n\t\t\t// Give the shape and any group children collision-free host ids, recording the\n\t\t\t// source id → new id map so a carried build animation can be remapped onto it.\n\t\t\tlet nextId = target.nextShapeId()\n\t\t\tconst spidMap = new Map<number, number>()\n\t\t\tfor (const cNvPr of imported.getElementsByTagNameNS(OOXML_NS.p, 'cNvPr')) {\n\t\t\t\tconst oldId = intValue(attr(cNvPr, 'id'))\n\t\t\t\tif (oldId !== null) spidMap.set(oldId, nextId)\n\t\t\t\tsetAttr(cNvPr, 'id', String(nextId++))\n\t\t\t}\n\n\t\t\t// Insert into the host tree (this reparents it out of any holder).\n\t\t\tspTree.insertBefore(imported, anchor)\n\n\t\t\t// Carry the shape's slide-scoped build animation (opt-in): append its effect\n\t\t\t// click-group(s) + <p:bldP> into the destination timing, remapped to the new id.\n\t\t\tif (options.carryAnimation) {\n\t\t\t\tconst sourceRoot = source.part.dom.documentElement\n\t\t\t\tconst targetRoot = target.part.dom.documentElement\n\t\t\t\tif (sourceRoot && targetRoot) carryShapeAnimations(sourceRoot, targetRoot, spidMap)\n\t\t\t}\n\n\t\t\tconst shape = wrapShapeElement(imported, target)\n\t\t\tif (!shape)\n\t\t\t\tthrow new UnsupportedFeatureError(\n\t\t\t\t\t'shape/element-unsupported',\n\t\t\t\t\t`importShape: unsupported shape element <${imported.localName}>`\n\t\t\t\t)\n\t\t\tif (options.left != null) shape.left = options.left\n\t\t\tif (options.top != null) shape.top = options.top\n\t\t\tif (options.width != null) shape.width = options.width\n\t\t\tif (options.height != null) shape.height = options.height\n\t\t\tresult.push(shape)\n\t\t}\n\n\t\ttarget.part.markDirty()\n\t\treturn result\n\t}\n\n\t/**\n\t * Open an import out of `source`: this deck as the destination, paired with the\n\t * copy registry for that package (created on first use). The registry is held on\n\t * the class rather than in the context because it must outlive any one call —\n\t * that is what makes a second import from the same source reuse the layout,\n\t * master, theme, and media it already copied instead of duplicating them.\n\t */\n\t#importContext(source: OpcPackage): ImportContext {\n\t\tlet registry = this.#importRegistry.get(source)\n\t\tif (!registry) {\n\t\t\tregistry = new Map()\n\t\t\tthis.#importRegistry.set(source, registry)\n\t\t}\n\t\treturn { dest: this, source, registry }\n\t}\n\n\t/**\n\t * Wire a new slide part into `p:sldIdLst` (rel + `p:sldId`) at zero-based\n\t * position `at` and return it. `p:sldIdLst` order *is* deck order, so the\n\t * insertion point is the only bookkeeping needed. An `at` that is omitted,\n\t * negative, or `>=` the current slide count appends (the prior behaviour).\n\t */\n\t#insertSlidePart(newPart: Part, at?: number): Slide {\n\t\tconst presPart = this.presentationPart\n\t\tconst presRels = this.opc.relationshipsFor(presPart.partName)\n\t\tconst relId = presRels.add(SLIDE_REL, relativePartName(presPart.partName, newPart.partName)).id\n\n\t\tconst root = presPart.dom.documentElement\n\t\tif (!root)\n\t\t\tthrow new PackageReadError(\n\t\t\t\t'package/part-has-no-root',\n\t\t\t\t'presentation.xml has no document element to append a slide to'\n\t\t\t)\n\t\t// A template with zero slides omits p:sldIdLst entirely; create it in\n\t\t// CT_Presentation document order (after the *IdLst children, before p:sldSz).\n\t\tconst sldIdLst = getOrAddChild(root, 'p:sldIdLst', PRESENTATION_SLD_ID_LST_SUCCESSORS)\n\t\tconst existing = getElements(sldIdLst, 'p:sldId')\n\t\tconst newSlideId = this.#nextSlideId(existing)\n\t\tconst sldId = createElement(presPart.dom, 'p:sldId')\n\t\tsetAttr(sldId, 'id', String(newSlideId))\n\t\tsetAttr(sldId, 'r:id', relId)\n\n\t\tconst inRange = at !== undefined && at >= 0 && at < existing.length\n\t\tconst newIndex = inRange ? at : existing.length\n\t\tconst before = inRange ? existing[at] : null\n\t\tif (before) sldIdLst.insertBefore(sldId, before)\n\t\telse sldIdLst.appendChild(sldId)\n\t\tpresPart.markDirty()\n\n\t\treturn new Slide(this, newPart, newSlideId, newIndex)\n\t}\n\n\t/** A slide id one past the highest existing, but at least ST_SlideId's minimum. */\n\t#nextSlideId(sldIds: ReturnType<typeof getElements>): number {\n\t\tlet max = MIN_SLIDE_ID - 1\n\t\tfor (const sldId of sldIds) {\n\t\t\tconst id = intValue(attr(sldId, 'id'))\n\t\t\tif (id !== null && id > max) max = id\n\t\t}\n\t\treturn max + 1\n\t}\n\n\t/** Re-emit the package; untouched parts stay byte-identical (see `OpcPackage.save`). */\n\tasync save(): Promise<Uint8Array> {\n\t\treturn this.opc.save()\n\t}\n}\n"],"mappings":";;;;;;;;;;;;;AAUA,IAAa,eAAb,MAAa,aAAa;CACzB,4BAAY,IAAI,IAAoB;CACpC,6BAAa,IAAI,IAAoB;CACrC,SAAS;CAET,OAAO,MAAM,KAA2B;EACvC,MAAM,eAAe,IAAI,aAAa;EACtC,MAAM,QAAQ,SAAS,GAAG,CAAC,CAAC;EAC5B,IAAI,CAAC,SAAS,MAAM,cAAc,SACjC,MAAM,IAAI,iBACT,sCACA,oDACD;EACD,KAAK,MAAM,WAAW,YAAY,OAAO,YAAY,GAAG;GACvD,MAAM,YAAY,QAAQ,aAAa,WAAW;GAClD,MAAM,cAAc,QAAQ,aAAa,aAAa;GACtD,IAAI,CAAC,aAAa,CAAC,aAClB,MAAM,IAAI,iBACT,0CACA,iEACD;GACD,aAAaA,UAAU,IAAI,UAAU,YAAY,GAAG,WAAW;EAChE;EACA,KAAK,MAAM,WAAW,YAAY,OAAO,aAAa,GAAG;GACxD,MAAM,WAAW,QAAQ,aAAa,UAAU;GAChD,MAAM,cAAc,QAAQ,aAAa,aAAa;GACtD,IAAI,CAAC,YAAY,CAAC,aACjB,MAAM,IAAI,iBACT,0CACA,iEACD;GACD,aAAaC,WAAW,IAAI,UAAU,WAAW;EAClD;EACA,OAAO;CACR;;CAGA,eAAe,UAAsC;EACpD,OAAO,KAAKA,WAAW,IAAI,QAAQ,KAAK,KAAKD,UAAU,IAAI,kBAAkB,QAAQ,CAAC;CACvF;;CAGA,IAAI,UAAmB;EACtB,OAAO,KAAKE;CACb;;;;;;;CAQA,iBAAiB,UAAkB,aAA2B;EAC7D,IAAI,KAAK,eAAe,QAAQ,MAAM,aAAa;EACnD,KAAKD,WAAW,IAAI,UAAU,WAAW;EACzC,KAAKC,SAAS;CACf;;;;;;CAOA,eAAe,UAAwB;EACtC,IAAI,KAAKD,WAAW,OAAO,QAAQ,GAAG,KAAKC,SAAS;CACrD;;CAGA,cAAc,WAAmB,aAA2B;EAC3D,MAAM,MAAM,UAAU,YAAY;EAClC,IAAI,KAAKF,UAAU,IAAI,GAAG,MAAM,aAAa;EAC7C,KAAKA,UAAU,IAAI,KAAK,WAAW;EACnC,KAAKE,SAAS;CACf;CAEA,YAAoB;EACnB,MAAM,QAAkB,CACvB,iEACA,gFACD;EACA,KAAK,MAAM,CAAC,WAAW,gBAAgB,KAAKF,WAC3C,MAAM,KACL,uBAAuB,mBAAmB,SAAS,EAAE,iBAAiB,mBAAmB,WAAW,EAAE,IACvG;EAED,KAAK,MAAM,CAAC,UAAU,gBAAgB,KAAKC,YAC1C,MAAM,KACL,uBAAuB,mBAAmB,QAAQ,EAAE,iBAAiB,mBAAmB,WAAW,EAAE,IACtG;EAED,MAAM,KAAK,UAAU;EACrB,OAAO,MAAM,KAAK,EAAE;CACrB;AACD;;;ACpGA,MAAME,gBAAc,IAAI,YAAY,OAAO;AAC3C,MAAMC,gBAAc,IAAI,YAAY;AAEpC,MAAM,qBAAqB;;;;;;;;AAS3B,IAAa,OAAb,MAAkB;CACjB;CACA;CACA;CACA,OAAwB;CACxB,SAAS;CAET,YAAY,UAAkB,aAAqB,OAAmB;EACrE,KAAK,WAAW;EAChB,KAAK,cAAc;EACnB,KAAKC,SAAS;CACf;;CAGA,IAAI,YAAqB;EACxB,OACC,KAAK,YAAY,SAAS,MAAM,KAAK,KAAK,gBAAgB,qBAAqB,KAAK,gBAAgB;CAEtG;;CAGA,IAAI,WAAoB;EACvB,OAAO,KAAKC,SAAS;CACtB;;CAGA,IAAI,QAAoB;EACvB,OAAO,KAAKD;CACb;;;;;CAMA,IAAI,MAAgB;EACnB,IAAI,CAAC,KAAK,WACT,MAAM,IAAI,mBACT,gBACA,QAAQ,KAAK,SAAS,IAAI,KAAK,YAAY,oCAC5C;EACD,IAAI,CAAC,KAAKC,MAAM,KAAKA,OAAO,SAASH,cAAY,OAAO,KAAKE,MAAM,CAAC;EACpE,OAAO,KAAKC;CACb;;CAGA,YAAkB;EACjB,IAAI,CAAC,KAAK,WACT,MAAM,IAAI,mBACT,gBACA,QAAQ,KAAK,SAAS,IAAI,KAAK,YAAY,gDAC5C;EACD,KAAKC,SAAS;CACf;CAEA,IAAI,UAAmB;EACtB,OAAO,KAAKA;CACb;;;;;CAMA,YAAwB;EACvB,IAAI,CAAC,KAAKA,QAAQ,OAAO,KAAKF;EAC9B,IAAI,MAAM,aAAa,KAAK,GAAG;EAC/B,IAAI,CAAC,IAAI,WAAW,OAAO,GAE1B,OADoB,mBAAmB,KAAKF,cAAY,OAAO,KAAKE,MAAM,CAAC,CAAC,GAAG,MACzD,uEAAiE;EAExF,OAAOD,cAAY,OAAO,GAAG;CAC9B;AACD;;;;;;;;;ACrEA,IAAa,gBAAb,MAAa,cAAc;;CAE1B;CACA,wBAAQ,IAAI,IAA0B;CACtC,SAAS;CAET,YAAoB,gBAAwB;EAC3C,KAAK,iBAAiB;CACvB;;;;;CAMA,OAAO,MAAM,KAAa,gBAAuC;EAChE,MAAM,gBAAgB,IAAI,cAAc,cAAc;EACtD,MAAM,OAAO,SAAS,GAAG,CAAC,CAAC;EAC3B,IAAI,CAAC,QAAQ,KAAK,cAAc,iBAC/B,MAAM,IAAI,iBACT,sCACA,oBAAoB,eAAe,wCACpC;EACD,KAAK,MAAM,WAAW,YAAY,MAAM,iBAAiB,GAAG;GAC3D,MAAM,KAAK,QAAQ,aAAa,IAAI;GACpC,MAAM,OAAO,QAAQ,aAAa,MAAM;GACxC,MAAM,SAAS,QAAQ,aAAa,QAAQ;GAC5C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QACpB,MAAM,IAAI,iBACT,mCACA,oBAAoB,eAAe,6CACpC;GACD,MAAM,sBAAsB,QAAQ,aAAa,YAAY;GAC7D,MAAM,aACL,wBAAwB,cAAc,wBAAwB,aAAa,sBAAsB,KAAA;GAClG,IAAI,wBAAwB,QAAQ,eAAe,KAAA,GAClD,MAAM,IAAI,iBACT,4CACA,oBAAoB,eAAe,wBAAwB,oBAAoB,OAAO,IACvF;GAED,MAAM,eAA6B;IAAE;IAAI;IAAM;GAAO;GACtD,IAAI,YAAY,aAAa,aAAa;GAC1C,IAAI,cAAcI,MAAM,IAAI,EAAE,GAC7B,MAAM,IAAI,iBACT,qCACA,oBAAoB,eAAe,8BAA8B,IAClE;GACD,cAAcA,MAAM,IAAI,IAAI,YAAY;EACzC;EACA,OAAO;CACR;;CAGA,OAAO,MAAM,gBAAuC;EACnD,OAAO,IAAI,cAAc,cAAc;CACxC;CAEA,IAAI,OAAe;EAClB,OAAO,KAAKA,MAAM;CACnB;;CAGA,IAAI,UAAmB;EACtB,OAAO,KAAKC;CACb;;;;;;;CAQA,IAAI,MAAc,QAAgB,YAAoD;EACrF,IAAI,MAAM;EACV,KAAK,MAAM,MAAM,KAAKD,MAAM,KAAK,GAAG;GACnC,MAAM,QAAQ,aAAa,KAAK,EAAE;GAClC,IAAI,OAAO,MAAM,KAAK,IAAI,KAAK,OAAO,MAAM,EAAE,CAAC;EAChD;EACA,MAAM,KAAK,MAAM,MAAM;EACvB,MAAM,eAA6B;GAAE;GAAI;GAAM;EAAO;EACtD,IAAI,YAAY,aAAa,aAAa;EAC1C,KAAKA,MAAM,IAAI,IAAI,YAAY;EAC/B,KAAKC,SAAS;EACd,OAAO;CACR;;;;;;;;CASA,UAAU,IAAY,MAAc,QAAgB,YAAoD;EACvG,IAAI,KAAKD,MAAM,IAAI,EAAE,GACpB,MAAM,IAAI,mBACT,6BACA,oBAAoB,KAAK,eAAe,8BAA8B,IACvE;EACD,MAAM,eAA6B;GAAE;GAAI;GAAM;EAAO;EACtD,IAAI,YAAY,aAAa,aAAa;EAC1C,KAAKA,MAAM,IAAI,IAAI,YAAY;EAC/B,KAAKC,SAAS;EACd,OAAO;CACR;;;;;;CAOA,OAAO,IAAqB;EAC3B,MAAM,UAAU,KAAKD,MAAM,OAAO,EAAE;EACpC,IAAI,SAAS,KAAKC,SAAS;EAC3B,OAAO;CACR;CAEA,IAAI,IAAsC;EACzC,OAAO,KAAKD,MAAM,IAAI,EAAE;CACzB;CAEA,OAAO,MAA8B;EACpC,OAAO,CAAC,GAAG,KAAKA,MAAM,OAAO,CAAC,CAAC,CAAC,QAAQ,iBAAiB,aAAa,SAAS,IAAI;CACpF;CAEA,CAAC,OAAO,YAA4C;EACnD,OAAO,KAAKA,MAAM,OAAO;CAC1B;;CAGA,cAAc,IAAoB;EACjC,MAAM,eAAe,KAAKA,MAAM,IAAI,EAAE;EACtC,IAAI,CAAC,cACJ,MAAM,IAAI,mBACT,0BACA,oBAAoB,KAAK,eAAe,4BAA4B,IACrE;EACD,IAAI,aAAa,eAAe,YAC/B,MAAM,IAAI,mBACT,yCACA,oBAAoB,KAAK,eAAe,IAAI,GAAG,gBAAgB,aAAa,OAAO,sBACpF;EAED,OAAO,wBAAwB,KAAK,gBAAgB,aAAa,MAAM;CACxE;CAEA,YAAoB;EACnB,MAAM,QAAkB,CACvB,iEACA,wFACD;EACA,KAAK,MAAM,EAAE,IAAI,MAAM,QAAQ,gBAAgB,KAAKA,MAAM,OAAO,GAAG;GACnE,MAAM,OAAO,aAAa,gBAAgB,WAAW,KAAK;GAC1D,MAAM,KACL,qBAAqB,mBAAmB,EAAE,EAAE,UAAU,mBAAmB,IAAI,EAAE,YAAY,mBAAmB,MAAM,EAAE,GAAG,KAAK,GAC/H;EACD;EACA,MAAM,KAAK,kBAAkB;EAC7B,OAAO,MAAM,KAAK,EAAE;CACrB;AACD;;;ACnKA,MAAM,yBAAyB;AAC/B,MAAM,6BAA6B;AAEnC,MAAM,cAAc,IAAI,YAAY,OAAO;AAC3C,MAAME,gBAAc,IAAI,YAAY;;;;;;;;;AAUpC,IAAa,aAAb,MAAa,WAAW;;CAEvB;;CAEA;CACA;CACA,sCAAsB,IAAI,IAA2B;CAErD,YAAoB,OAA0B,cAA4B,mBAA+B;EACxG,KAAKC,SAAS;EACd,KAAK,eAAe;EACpB,KAAKC,qBAAqB;CAC3B;;CAGA,IAAI,QAAmC;EACtC,OAAO,KAAKD;CACb;CAEA,aAAa,KAAK,OAAsC;EACvD,MAAM,UAAU,MAAM,QAAQ,KAAK;EACnC,MAAM,oBAAoB,QAAQ,IAAI,sBAAsB;EAC5D,IAAI,CAAC,mBACJ,MAAM,IAAI,iBAAiB,8BAA8B,iDAAiD;EAC3G,MAAM,eAAe,aAAa,MAAM,YAAY,OAAO,iBAAiB,CAAC;EAE7E,MAAM,wBAAQ,IAAI,IAAkB;EACpC,KAAK,MAAM,CAAC,SAAS,UAAU,SAAS;GACvC,IAAI,YAAY,wBAAwB;GACxC,MAAM,WAAW,kBAAkB,OAAO;GAK1C,IAAI,SAAS,WAAW,WAAW,GAAG;GACtC,MAAM,cAAc,aAAa,eAAe,QAAQ;GACxD,IAAI,CAAC,aACJ,MAAM,IAAI,iBACT,qCACA,4BAA4B,SAAS,0DACtC;GAED,MAAM,IAAI,UAAU,IAAI,KAAK,UAAU,aAAa,KAAK,CAAC;EAC3D;EACA,OAAO,IAAI,WAAW,OAAO,cAAc,iBAAiB;CAC7D;CAEA,KAAK,UAAoC;EACxC,OAAO,KAAK,MAAM,IAAI,QAAQ;CAC/B;CAEA,mBAAmB,aAA6B;EAC/C,OAAO,CAAC,GAAG,KAAK,MAAM,OAAO,CAAC,CAAC,CAAC,QAAQ,SAAS,KAAK,gBAAgB,WAAW;CAClF;;;;;CAMA,iBAAiB,iBAAiB,KAAoB;EACrD,MAAM,SAAS,KAAKE,oBAAoB,IAAI,cAAc;EAC1D,IAAI,QAAQ,OAAO;EACnB,MAAM,WAAW,KAAK,MAAM,IAAI,gBAAgB,cAAc,CAAC;EAC/D,MAAM,gBAAgB,WACnB,cAAc,MAAM,YAAY,OAAO,SAAS,KAAK,GAAG,cAAc,IACtE,cAAc,MAAM,cAAc;EACrC,KAAKA,oBAAoB,IAAI,gBAAgB,aAAa;EAC1D,OAAO;CACR;;;;;CAMA,QAAQ,UAAkB,aAAqB,OAAyB;EACvE,IAAI,KAAKF,OAAO,IAAI,QAAQ,GAC3B,MAAM,IAAI,mBACT,+BACA,mBAAmB,SAAS,uCAC7B;EACD,KAAK,aAAa,iBAAiB,UAAU,WAAW;EACxD,MAAM,OAAO,IAAI,KAAK,UAAU,aAAa,KAAK;EAClD,KAAKA,OAAO,IAAI,UAAU,IAAI;EAC9B,OAAO;CACR;;;;;;;;;CAUA,WAAW,UAA2B;EACrC,IAAI,CAAC,KAAKA,OAAO,OAAO,QAAQ,GAAG,OAAO;EAC1C,KAAK,aAAa,eAAe,QAAQ;EAEzC,KAAKE,oBAAoB,OAAO,QAAQ;EACxC,OAAO;CACR;;;;;CAMA,qBAAqB,WAAmB,OAAO,SAAiB;EAC/D,MAAM,MAAM,UAAU,YAAY,CAAC,CAAC,QAAQ,OAAO,EAAE;EACrD,MAAM,KAAK,IAAI,OAAO,eAAe,KAAK,WAAW,IAAI,IAAI,GAAG;EAChE,IAAI,MAAM;EACV,KAAK,MAAM,YAAY,KAAKF,OAAO,KAAK,GAAG;GAC1C,MAAM,QAAQ,GAAG,KAAK,QAAQ;GAC9B,IAAI,OAAO,MAAM,KAAK,IAAI,KAAK,OAAO,MAAM,EAAE,CAAC;EAChD;EACA,OAAO,cAAc,OAAO,MAAM,EAAE,GAAG;CACxC;;;;;;;;;;CAWA,oBAAoB,kBAAkC;EACrD,MAAM,QAAQ,iBAAiB,YAAY,GAAG;EAC9C,MAAM,MAAM,iBAAiB,MAAM,GAAG,KAAK;EAC3C,MAAM,WAAW,iBAAiB,MAAM,QAAQ,CAAC;EACjD,MAAM,MAAM,SAAS,YAAY,GAAG;EACpC,MAAM,MAAM,MAAM,IAAI,SAAS,MAAM,GAAG,IAAI;EAE5C,MAAM,QADO,MAAM,IAAI,SAAS,MAAM,GAAG,GAAG,IAAI,SAAA,CAC9B,QAAQ,QAAQ,EAAE;EACpC,MAAM,UAAU,MAAsB,EAAE,QAAQ,uBAAuB,MAAM;EAC7E,MAAM,KAAK,IAAI,OAAO,IAAI,OAAO,GAAG,IAAI,GAAG,MAAM,EAAE,QAAQ,OAAO,GAAG,EAAE,EAAE;EACzE,IAAI,MAAM;EACV,KAAK,MAAM,YAAY,KAAKA,OAAO,KAAK,GAAG;GAC1C,MAAM,QAAQ,GAAG,KAAK,QAAQ;GAC9B,IAAI,OAAO,MAAM,KAAK,IAAI,KAAK,OAAO,MAAM,EAAE,CAAC;EAChD;EACA,OAAO,GAAG,IAAI,GAAG,OAAO,MAAM,IAAI;CACnC;;;;;;CAOA,MAAM,OAA4B;EACjC,KAAKG,oBAAoB;EACzB,MAAM,MAAM,IAAI,UAAU;EAC1B,IAAI,IAAI,wBAAwB,KAAK,aAAa,UAAU,KAAK,aAAa,UAAU,IAAI,KAAKF,kBAAkB;EACnH,KAAK,MAAM,QAAQ,KAAKD,OAAO,OAAO,GACrC,IAAI,IAAI,kBAAkB,KAAK,QAAQ,GAAG,KAAK,UAAU,CAAC;EAE3D,OAAO,IAAI,QAAQ;CACpB;;CAGA,sBAA4B;EAC3B,KAAK,MAAM,iBAAiB,KAAKE,oBAAoB,OAAO,GAAG;GAC9D,IAAI,CAAC,cAAc,SAAS;GAC5B,MAAM,eAAe,gBAAgB,cAAc,cAAc;GACjE,MAAM,QAAQH,cAAY,OAAO,cAAc,UAAU,CAAC;GAE1D,KAAKC,OAAO,IAAI,cAAc,IAAI,KAAK,cAAc,4BAA4B,KAAK,CAAC;EACxF;CACD;AACD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACnEA,SAAgB,aAAa,WAAoB,KAA2B;CAC3E,yBAAyB,WAAW,GAAG;CACvC,sBAAsB,WAAW,GAAG;CACpC,qBAAqB,WAAW,GAAG;CACnC,2BAA2B,WAAW,GAAG;CACzC,4BAA4B,WAAW,GAAG;CAC1C,2BAA2B,WAAW,GAAG;CACzC,oBAAoB,WAAW,GAAG;AACnC;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BA,SAAgB,aAAa,WAAoB,KAA2B;CAC3E,qBAAqB,WAAW,GAAG;CACnC,2BAA2B,WAAW,GAAG;CACzC,4BAA4B,WAAW,GAAG;CAC1C,2BAA2B,WAAW,GAAG;CACzC,yBAAyB,WAAW,GAAG;CACvC,4BAA4B,WAAW,GAAG;CAC1C,oBAAoB,WAAW,GAAG;CAClC,mBAAmB,SAAS;AAC7B;;;;;;;;;;;;;;;AAgBA,SAAgB,aAAa,WAA0B;CACtD,sBAAsB,WAAW,CAAC,aAAa,CAAC;AACjD;;;;;;;;;;;;;;;;;;AAmBA,SAAgB,mBAAmB,WAAoB,KAAyB;CAC/E,MAAM,YAAY,iBAAiB,IAAI,SAAS;CAChD,IAAI,UAAU,SAAS,GAAG;CAC1B,MAAM,cAAc,cAAc,IAAI,MAAM;CAC5C,MAAM,MAAM,gBAAgB,SAAS;CACrC,KAAK,MAAM,QAAQ,iBAAiB,WAAW,SAAS,GAAG,SAAS,GAAG;EACtE,MAAM,MAAM,KAAK,MAAM,KAAK;EAC5B,MAAM,OAAO,MAAM,UAAU,IAAI,IAAI,YAAY,CAAC,IAAI,KAAA;EACtD,IAAI,CAAC,MAAM;EACX,MAAM,SAAS,cAAc,KAAK,aAAa;EAC/C,QAAQ,QAAQ,OAAO,YAAY,IAAI,IAAI,KAAK,IAAI;EACpD,OAAO,KAAK,YAAY,OAAO,YAAY,KAAK,UAAU;EAC1D,gBAAgB,MAAM,MAAM;CAC7B;AACD;;AAGA,SAAS,iBAAiB,WAAqD;CAC9E,MAAM,sBAAM,IAAI,IAAoB;CACpC,KAAK,MAAM,QAAQ,cAAc;EAChC,MAAM,MAAM,UAAU,IAAI,IAAI;EAC9B,IAAI,OAAO,CAAC,IAAI,IAAI,IAAI,YAAY,CAAC,GAAG,IAAI,IAAI,IAAI,YAAY,GAAG,IAAI;CACxE;CACA,OAAO;AACR;;AAGA,SAAS,cAAc,QAAkD;CACxE,MAAM,sBAAM,IAAI,IAAoB;CACpC,KAAK,MAAM,CAAC,OAAO,SAAS,QAAQ,IAAI,CAAC,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,MAAM,KAAK;CAC3E,OAAO;AACR;;;;;;AAOA,SAAS,yBAAyB,WAAoB,KAA2B;CAChF,MAAM,YAAY,IAAI;CACtB,IAAI,CAAC,WAAW;CAChB,MAAM,OAAO,WAAW,WAAW,QAAQ;CAC3C,IAAI,CAAC,QAAQ,WAAW,MAAM,MAAM,GAAG;CAEvC,MAAM,KADM,gBAAgB,SACf,CAAC,CAAC,WAAW,WAAW,IAAI;CACzC,cAAc,MAAM,IAAI;EAAC;EAAY;EAAiB;EAAc;CAAU,CAAC;AAChF;;;;;;AAOA,SAAS,sBAAsB,WAAoB,KAA2B;CAC7E,MAAM,MAAM,gBAAgB,SAAS;CACrC,KAAK,MAAM,MAAM,iBAAiB,WAAW,SAAS,GAAG,IAAI,GAAG;EAC/D,MAAM,QAAQ,WAAW,IAAI,SAAS;EACtC,IAAI,CAAC,OAAO;EAIZ,MAAM,OAAO,aAAa,OAAO,GAAG;EACpC,MAAM,OAAO,cAAc,KAAK,QAAQ;EACxC,KAAK,YAAY,QAAQ,cAAc,KAAK,UAAU,CAAC;EACvD,GAAG,aAAa,MAAM,KAAK;CAC5B;AACD;;AAGA,SAAS,oBAAoB,MAAe,KAA2B;CACtE,MAAM,MAAM,gBAAgB,IAAI;CAChC,KAAK,MAAM,aAAa,iBAAiB,MAAM,SAAS,GAAG,WAAW,GAAG;EACxE,MAAM,QAAQ,KAAK,WAAW,KAAK;EACnC,MAAM,MAAM,QAAQ,mBAAmB,OAAO,GAAG,IAAI;EACrD,IAAI,CAAC,KAAK;EACV,MAAM,OAAO,cAAc,KAAK,WAAW;EAC3C,QAAQ,MAAM,OAAO,GAAG;EACxB,OAAO,UAAU,YAAY,KAAK,YAAY,UAAU,UAAU;EAClE,gBAAgB,WAAW,IAAI;CAChC;AACD;;;;;;;;;;;AAYA,SAAS,4BAA4B,WAAoB,KAA2B;CACnF,IAAI,CAAC,IAAI,cAAc,CAAC,IAAI,YAAY;CACxC,KAAK,MAAM,MAAM,iBAAiB,WAAW,SAAS,GAAG,IAAI,GAAG;EAC/D,MAAM,KAAK,cAAc,EAAE;EAC3B,IAAI,CAAC,IAAI;EACT,MAAM,SAAS,WAAW,IAAI,UAAU;EACxC,IAAI,CAAC,QAAQ;EACb,MAAM,OAAO,KAAK,IAAI,MAAM;EAC5B,MAAM,MAAM,KAAK,IAAI,KAAK,KAAK;EAC/B,MAAM,WAAW,WAAW,QAAQ,YAAY;EAChD,MAAM,0BAAU,IAAI,IAAkC;EACtD,KAAK,MAAM,KAAK,YAAY,QAAQ,KAAK,GAAG;GAC3C,MAAM,MAAM,WAAW,GAAG,OAAO;GACjC,MAAM,SAAS,OAAO,SAAS,KAAK,KAAK,KAAK,CAAC,MAAM;GACrD,MAAM,OAAO,CAAC,GAAG,YAAY,GAAG,KAAK,GAAG,GAAG,YAAY,GAAG,OAAO,CAAC;GAClE,IAAI,KAAK,WAAW,GAAG;GACvB,IAAI,QAAQ,QAAQ,IAAI,KAAK;GAC7B,IAAI,UAAU,KAAA,GAAW;IACxB,QAAQ,0BAA0B,MAAM,KAAK,OAAO,GAAG;IACvD,QAAQ,IAAI,OAAO,KAAK;GACzB;GACA,IAAI,CAAC,OAAO;GACZ,KAAK,MAAM,OAAO,MAAM;IACvB,IAAI,kBAAkB,KAAK,KAAK,UAAU,KAAK,GAAG;IAClD,cAAc,KAAK,KAAK;GACzB;EACD;CACD;AACD;;AAGA,SAAS,cAAc,KAAc,OAA4B;CAChE,MAAM,MAAM,gBAAgB,GAAG;CAC/B,MAAM,MAAM,cAAc,KAAK,SAAS,CAAC,KAAK,CAAC;CAC/C,MAAM,OAAO,cAAc,KAAK,aAAa;CAC7C,MAAM,OAAO,cAAc,KAAK,WAAW;CAC3C,QAAQ,MAAM,OAAO,MAAM,GAAG;CAC9B,KAAK,MAAM,KAAK,MAAM,YAAY,KAAK,YAAY,EAAE,UAAU,IAAI,CAAC;CACpE,KAAK,YAAY,IAAI;CACrB,cAAc,KAAK,MAAM,cAAc;AACxC;;;;;;;;;;;AAYA,SAAS,2BAA2B,WAAoB,KAA2B;CAClF,IAAI,CAAC,IAAI,cAAc,CAAC,IAAI,YAAY;CACxC,KAAK,MAAM,MAAM,iBAAiB,WAAW,SAAS,GAAG,IAAI,GAAG;EAC/D,MAAM,KAAK,cAAc,EAAE;EAC3B,IAAI,CAAC,IAAI;EACT,MAAM,OAAO,WAAW,IAAI,QAAQ;EACpC,IAAI,QAAQ,WAAW,MAAM,QAAQ,GAAG;EACxC,MAAM,QAAQ,yBAAyB,KAAK,IAAI,MAAM,GAAG,KAAK,IAAI,KAAK,KAAK,KAAK,GAAG;EACpF,IAAI,CAAC,OAAO;EACZ,MAAM,SAAS,cAAc,IAAI,UAAU,gBAAgB;EAC3D,cAAc,QAAQ,MAAM,KAAK,UAAU,IAAI,GAAG,eAAe;CAClE;AACD;;;;;;;;;;;;AAaA,SAAS,yBAAyB,WAAoB,KAA2B;CAChF,IAAI,CAAC,IAAI,cAAc,CAAC,IAAI,YAAY;CACxC,KAAK,MAAM,MAAM,iBAAiB,WAAW,SAAS,GAAG,IAAI,GAAG;EAC/D,MAAM,KAAK,cAAc,EAAE;EAC3B,IAAI,CAAC,IAAI;EACT,MAAM,SAAS,WAAW,IAAI,UAAU;EACxC,IAAI,CAAC,QAAQ;EACb,MAAM,SAAS,WAAW,QAAQ,UAAU;EAC5C,IAAI,UAAU,KAAK,QAAQ,QAAQ,KAAK,MAAM;EAC9C,MAAM,SAAS,2BAA2B,KAAK,IAAI,MAAM,GAAG,KAAK,IAAI,KAAK,KAAK,KAAK,GAAG;EACvF,IAAI,CAAC,QAAQ;EACb,QAAQ,UAAU,cAAc,QAAQ,YAAY,CAAC,cAAc,KAAK,CAAC,GAAG,UAAU,MAAM;CAC7F;AACD;;;;;;;;;;;;;;;;;;;;;;AAuBA,SAAS,4BAA4B,WAAoB,KAA2B;CACnF,IAAI,CAAC,IAAI,cAAc,CAAC,IAAI,YAAY;CACxC,KAAK,MAAM,MAAM,iBAAiB,WAAW,SAAS,GAAG,IAAI,GAAG;EAC/D,MAAM,KAAK,cAAc,EAAE;EAC3B,IAAI,CAAC,IAAI;EACT,MAAM,SAAS,WAAW,IAAI,UAAU;EACxC,IAAI,CAAC,QAAQ;EACb,MAAM,QAAQ,+BAA+B,KAAK,IAAI,MAAM,GAAG,KAAK,IAAI,KAAK,KAAK,KAAK,GAAG;EAC1F,IAAI,MAAM,WAAW,GAAG;EACxB,MAAM,WAAW,WAAW,QAAQ,YAAY;EAChD,MAAM,SAAS,cAAc,gBAAgB,MAAM,GAAG,YAAY;EAClE,IAAI,MAAM;EACV,KAAK,MAAM,SAAS,kBAAkB;GAGrC,MAAM,OADM,YAAY,WAAW,UAAU,KAAK,MAC/B,MAAM,KAAK,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,MAAM,MAAoB,CAAC,CAAC,CAAC,KAAK;GAC5F,IAAI,CAAC,KAAK;GACV,OAAO,YAAY,IAAI,UAAU,IAAI,CAAC;GACtC,MAAM;EACP;EACA,IAAI,CAAC,KAAK;EACV,IAAI,UAAU,OAAO,aAAa,QAAQ,QAAQ;OAC7C,cAAc,QAAQ,QAAQ,CAAC,KAAK,CAAC;CAC3C;AACD;;;;;;;;;;;;AAaA,SAAS,mBAAmB,WAA0B;CACrD,KAAK,MAAM,MAAM,iBAAiB,WAAW,SAAS,GAAG,IAAI,GAAG;EAC/D,MAAM,SAAS,WAAW,IAAI,UAAU;EACxC,MAAM,OAAO,UAAU,WAAW,QAAQ,QAAQ;EAClD,IAAI,MAAM,sBAAsB,MAAM,CAAC,MAAM,CAAC;CAC/C;AACD;;;;;;;;;;AAWA,SAAS,2BAA2B,WAAoB,KAA2B;CAClF,IAAI,CAAC,IAAI,cAAc,CAAC,IAAI,YAAY;CACxC,KAAK,MAAM,MAAM,iBAAiB,WAAW,SAAS,GAAG,IAAI,GAAG;EAC/D,MAAM,KAAK,cAAc,EAAE;EAC3B,IAAI,CAAC,IAAI;EACT,MAAM,SAAS,WAAW,IAAI,UAAU;EACxC,IAAI,CAAC,QAAQ;EACb,MAAM,OAAO,KAAK,IAAI,MAAM;EAC5B,MAAM,MAAM,KAAK,IAAI,KAAK,KAAK;EAC/B,MAAM,WAAW,WAAW,QAAQ,YAAY;EAChD,MAAM,0BAAU,IAAI,IAA6B;EACjD,KAAK,MAAM,KAAK,YAAY,QAAQ,KAAK,GAAG;GAC3C,MAAM,MAAM,WAAW,GAAG,OAAO;GACjC,MAAM,SAAS,OAAO,SAAS,KAAK,KAAK,KAAK,CAAC,MAAM;GACrD,MAAM,OAAO,CAAC,GAAG,YAAY,GAAG,KAAK,GAAG,GAAG,YAAY,GAAG,OAAO,CAAC;GAClE,IAAI,KAAK,WAAW,GAAG;GACvB,IAAI,QAAQ,QAAQ,IAAI,KAAK;GAC7B,IAAI,UAAU,KAAA,GAAW;IACxB,QAAQ,6BAA6B,MAAM,KAAK,OAAO,GAAG;IAC1D,QAAQ,IAAI,OAAO,KAAK;GACzB;GACA,IAAI,CAAC,OAAO;GACZ,KAAK,MAAM,OAAO,MAAM,cAAc,KAAK,OAAO,KAAK,UAAU,KAAK;EACvE;CACD;AACD;;AAGA,SAAS,cACR,KACA,OACA,KACA,UACA,OACO;CACP,IAAI,MAAsB;CAC1B,KAAK,MAAM,QAAQ,gBAAgB;EAClC,MAAM,QAAQ,MAAM;EACpB,IAAI,SAAS,MAAM;EACnB,IAAI,iBAAiB,MAAM,KAAK,KAAK,UAAU,KAAK,GAAG;EACvD,QAAQ,cAAc,KAAK,SAAS,CAAC,KAAK,CAAC;EAC3C,QAAQ,KAAK,MAAM,KAAK;CACzB;AACD;;;;;;AAOA,SAAS,qBAAqB,MAAe,KAA2B;CACvE,IAAI,CAAC,IAAI,WAAW;CACpB,KAAK,MAAM,SAAS,iBAAiB,MAAM,SAAS,GAAG,OAAO,GAAG;EAChE,MAAM,QAAQ,MAAM;EACpB,IAAI,CAAC,OAAO;EACZ,MAAM,OAAO,cAAc,OAAO,UAAU,gBAAgB;EAC5D,gBAAgB,MAAM,WAAW,OAAO,WAAW,GAAG,GAAG;EACzD,gBAAgB,MAAM,WAAW,OAAO,SAAS,GAAG,GAAG;EACvD,kBAAkB,MAAM,WAAW,OAAO,aAAa,GAAG,GAAG;CAC9D;AACD;AAEA,SAAS,gBAAgB,MAAe,SAAyB,KAA2B;CAC3F,IAAI,CAAC,SAAS;CACd,IAAI,CAAC,aAAa,MAAM,MAAM,WAAW,MAAM,CAAC,CAAC,GAAG;EACnD,MAAM,OAAO,aAAa,SAAS,GAAG;EACtC,IAAI,MAAM,cAAc,MAAM,MAAM,eAAe;CACpD;CACA,cAAc,OAAO;AACtB;AAEA,SAAS,gBAAgB,MAAe,OAAuB,KAA2B;CACzF,IAAI,CAAC,OAAO;CACZ,IAAI,CAAC,WAAW,MAAM,MAAM,GAAG;EAC9B,MAAM,KAAK,aAAa,OAAO,GAAG;EAClC,IAAI,IAAI,cAAc,MAAM,IAAI,aAAa;CAC9C;CACA,cAAc,KAAK;AACpB;AAEA,SAAS,kBAAkB,MAAe,WAA2B,KAA2B;CAC/F,IAAI,CAAC,WAAW;CAChB,MAAM,MAAM,QAAQ,WAAW,KAAK;CACpC,IAAI,QAAQ,QAAQ,MAAM,KAAK,CAAC,WAAW,MAAM,aAAa,KAAK,CAAC,WAAW,MAAM,aAAa,GAAG;EACpG,MAAM,QAAQ,SAAS,KAAK,oBAAoB,GAAG;EACnD,MAAM,MAAM,aAAa,kBAAkB,SAAS,GAAG,GAAG;EAC1D,IAAI,SAAS,KAAK;GACjB,gBAAgB,OAAO,GAAG;GAE1B,KAAK,MAAM,SAAS,cAAc,KAAK,GACtC,IAAI,IAAI,OAAO,WAAW,KAAK,IAAI,OAAO,WAAW,GAAG,cAAc,MAAM,OAAO,iBAAiB;QAC/F,IAAI,IAAI,OAAO,SAAS,GAAG,cAAc,MAAM,OAAO,kBAAkB;QACxE,IAAI,IAAI,OAAO,MAAM,GAAG,cAAc,MAAM,OAAO,eAAe;EAEzE;CACD;CACA,cAAc,SAAS;AACxB;;AAGA,SAAS,cAAc,KAAoB;CAC1C,QAAQ,KAAK,OAAO,GAAG;CACvB,KAAK,MAAM,SAAS,cAAc,GAAG,GAAG,IAAI,YAAY,KAAK;AAC9D;;;;;;;;;;;;;;;;AC/eA,SAAgB,oBAAoB,MAAsC;CACzE,MAAM,OAAO,QAAQ,WAAW,MAAM,QAAQ;CAC9C,OAAO,OAAO,WAAW,MAAM,MAAM,IAAI;AAC1C;;;;;;AAOA,SAAS,qBAAqB,WAAoB,KAAmB,MAA4C;CAChH,MAAM,QAAQ,WAAW,WAAW,aAAa;CACjD,IAAI,OAAO,OAAO;EAAE,MAAM;EAAS,OAAO,oBAAoB,kBAAkB,KAAK,GAAG,GAAG;CAAE;CAG7F,IADa,WAAW,WAAW,YAC5B,GAAG,OAAO;EAAE,MAAM;EAAY,UAAU,iBAAiB,WAAW,GAAG;CAAkB;CAEhG,MAAM,UAAU,gBAAgB,WAAW,IAAI;CAC/C,IAAI,SAAS,OAAO;EAAE,MAAM;EAAS;EAAS,OAAO,QAAQ;EAAO,UAAU,QAAQ;CAAS;CAE/F,MAAM,OAAO,gBAAgB,WAAW,GAAG;CAC3C,IAAI,MAAM,OAAO;EAAE,MAAM;EAAW,QAAQ,KAAK;EAAQ,YAAY,KAAK;EAAY,YAAY,KAAK;CAAW;CAElH,OAAO,EAAE,MAAM,OAAO;AACvB;;;;;;;;;;;;;;;;AAiBA,SAAS,oBACR,OACA,KACA,WACwB;CACxB,MAAM,OAAO,aAAa,OAAO,GAAG;CACpC,IAAI,CAAC,MAAM,OAAO;CAGlB,MAAM,UAAU,cAAc,gBAAgB,KAAK,GAAG,QAAQ;CAC9D,QAAQ,YAAY,IAAI;CACxB,OAAO,qBAAqB,SAAS,KAAK,SAAS;AACpD;;;;;;;;;;AAWA,SAAgB,oBACf,IACA,QACA,KACA,MACA,WACkB;CAElB,MAAM,QAAQ,WAAW,IAAI,SAAS;CACtC,IAAI,OACH,OAAO;EACN,MAAM;EACN;EACA,KAAK,SAAS,KAAK,OAAO,KAAK,CAAC;EAChC,OAAO,oBAAoB,kBAAkB,KAAK,GAAG,GAAG;EACxD,cAAc,oBAAoB,OAAO,KAAK,SAAS;CACxD;CAGD,MAAM,OAAO,WAAW,IAAI,QAAQ;CACpC,IAAI,CAAC,MAAM,OAAO;EAAE,MAAM;EAAQ;CAAO;CAIzC,OAAO;EAAE,GADI,qBAAqB,MAAM,KAAK,IAC9B;EAAG;CAAO;AAC1B;;;;;;;;;;AC/HA,IAAa,mBAAb,MAA8B;CAEX;CACA;CAEA;CAEA;CANlB,YACC,IACA,MAEA,cAEA,eACC;EANgB,KAAA,KAAA;EACA,KAAA,OAAA;EAEA,KAAA,eAAA;EAEA,KAAA,gBAAA;CACf;CAEH,MAAsB;EACrB,MAAM,SAAS,WAAW,KAAK,IAAI,UAAU;EAC7C,MAAM,OAAO,UAAU,WAAW,QAAQ,QAAQ;EAClD,OAAO,OAAO,WAAW,MAAM,MAAM,IAAI;CAC1C;CAEA,SAAyB;EACxB,MAAM,SAAS,WAAW,KAAK,IAAI,UAAU;EAC7C,OAAO,SAAS,WAAW,QAAQ,SAAS,IAAI;CACjD;;CAGA,IAAI,OAAsB;EACzB,MAAM,KAAK,KAAKI,IAAI;EACpB,OAAO,KAAK,KAAK,IAAI,MAAM,IAAI;CAChC;;CAGA,IAAI,MAAqB;EACxB,MAAM,KAAK,KAAKA,IAAI;EACpB,OAAO,KAAK,KAAK,IAAI,KAAK,IAAI;CAC/B;;CAGA,IAAI,OAAe;EAClB,MAAM,QAAQ,KAAKC,OAAO;EAC1B,QAAQ,SAAS,KAAK,OAAO,MAAM,MAAM;CAC1C;;CAGA,IAAI,KAAoB;EACvB,MAAM,QAAQ,KAAKA,OAAO;EAC1B,OAAO,QAAQ,SAAS,KAAK,OAAO,IAAI,CAAC,IAAI;CAC9C;;CAGA,IAAI,OAAsB;EACzB,OAAO,YAAY,KAAK,IAAI,SAAS,GAAG;CACzC;;CAGA,IAAI,MAAqB;EACxB,OAAO,YAAY,KAAK,IAAI,SAAS,GAAG;CACzC;;CAGA,IAAI,QAAuB;EAC1B,OAAO,YAAY,KAAK,IAAI,SAAS,IAAI;CAC1C;;CAGA,IAAI,SAAwB;EAC3B,OAAO,YAAY,KAAK,IAAI,SAAS,IAAI;CAC1C;;;;;;;CAQA,IAAI,YAA8B;EACjC,MAAM,SAAS,WAAW,KAAK,IAAI,UAAU;EAC7C,IAAI,CAAC,QAAQ,OAAO;EAKpB,MAAM,cACL,KAAK,SAAS,SAAS;GAAE,IAAI;IAAE,MAAM,KAAK;IAAM,KAAK,KAAK,OAAO;GAAI;GAAG,SAAS,KAAK;EAAa,IAAI,KAAA;EACxG,OAAO,IAAI,UAAU,QAAQ,KAAK,MAAM,KAAK,cAAc,aAAa,KAAK,aAAa;CAC3F;;CAGA,IAAI,OAAe;EAClB,OAAO,KAAK,WAAW,QAAQ;CAChC;;CAGA,IAAI,WAAoB;EACvB,OAAO,KAAK;CACb;;CAGA,YAAkB;EACjB,KAAK,KAAK,UAAU;CACrB;AACD;;;;;;;;;;AAWA,IAAa,aAAb,MAAwB;CAIL;CAER;CALV;CAEA,YACC,KAEA,MACC;EAHgB,KAAA,MAAA;EAER,KAAA,OAAA;CACP;;CAGH,IAAI,WAAmB;EACtB,OAAO,KAAK,KAAK;CAClB;;;;;CAMA,eAA6B;EAC5B,OAAQ,KAAKC,kBAAkB,yBAAyB,KAAK,KAAK,KAAK,QAAQ;CAChF;;CAGA,IAAI,eAAmC;EACtC,MAAM,SAAS,KAAKC,QAAQ;EAC5B,IAAI,CAAC,QAAQ,OAAO,CAAC;EACrB,MAAM,MAAM,KAAK,aAAa;EAC9B,MAAM,OAAO,KAAK,IAAI,iBAAiB,KAAK,QAAQ;EACpD,OAAO,YAAY,QAAQ,MAAM,CAAC,CAAC,KAAK,OAAO,IAAI,iBAAiB,IAAI,KAAK,MAAM,KAAK,IAAI,CAAC;CAC9F;;CAGA,IAAI,OAAgC;EACnC,OAAO,KAAKC,QAAQ,MAAM;CAC3B;;CAGA,IAAI,aAAsC;EACzC,OAAO,KAAKA,QAAQ,QAAQ;CAC7B;;CAGA,IAAI,cAAuC;EAC1C,OAAO,KAAKA,QAAQ,QAAQ;CAC7B;;CAGA,IAAI,YAA8B;EACjC,OAAO,KAAK,MAAM,aAAa;CAChC;;CAGA,IAAI,OAAe;EAClB,OAAO,KAAK,MAAM,QAAQ;CAC3B;CAEA,QAAQ,MAAuC;EAC9C,OAAO,KAAK,aAAa,MAAM,OAAO,GAAG,SAAS,IAAI,KAAK;CAC5D;CAEA,UAA0B;EACzB,MAAM,OAAO,KAAK,KAAK,IAAI;EAC3B,MAAM,OAAO,QAAQ,WAAW,MAAM,QAAQ;EAC9C,OAAO,OAAO,WAAW,MAAM,UAAU,IAAI;CAC9C;AACD;;;;AClMA,MAAM,oBAAoB;;AAE1B,MAAM,2BAA2B;;AAGjC,MAAM,+BAA+B;;AAErC,MAAM,2BAA2B;;AAEjC,MAAM,0BAA0B;;AAEhC,MAAM,+BAA+B;;AAqCrC,SAAS,oBAAoB,MAAuC;CACnE,IAAI,CAAC,MAAM,OAAO,CAAC;CACnB,OAAO,YAAY,MAAM,YAAY,CAAC,CAAC,KAAK,QAAQ;EACnD,IAAI,SAAS,KAAK,IAAI,IAAI,CAAC;EAC3B,MAAM,KAAK,IAAI,MAAM,KAAK;EAC1B,UAAU,KAAK,IAAI,UAAU,KAAK;EAClC,SAAS,SAAS,KAAK,IAAI,SAAS,CAAC;EACrC,QAAQ,SAAS,KAAK,IAAI,QAAQ,CAAC;CACpC,EAAE;AACH;;;;;AAMA,SAAgB,mBAAmB,KAAiB,sBAA+C;CAClG,MAAM,OAAO,IAAI,iBAAiB,oBAAoB;CACtD,MAAM,MAAM,KAAK,OAAO,wBAAwB,CAAC,CAAC;CAClD,IAAI,CAAC,KAAK,OAAO,CAAC;CAElB,OAAO,oBADM,IAAI,KAAK,KAAK,cAAc,IAAI,EAAE,CACjB,CAAC,EAAE,IAAI,mBAAmB,IAAI;AAC7D;;;;;;;AAQA,SAAgB,kBAAkB,KAAiB,WAAiB,SAAqC;CACxG,MAAM,OAAO,IAAI,iBAAiB,UAAU,QAAQ;CACpD,MAAM,MAAM,KAAK,OAAO,iBAAiB,CAAC,CAAC;CAC3C,IAAI,CAAC,KAAK,OAAO,CAAC;CAElB,MAAM,OADO,IAAI,KAAK,KAAK,cAAc,IAAI,EAAE,CAC/B,CAAC,EAAE,IAAI;CACvB,IAAI,CAAC,MAAM,OAAO,CAAC;CAEnB,MAAM,OAAO,IAAI,IAAI,QAAQ,KAAK,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;CAClD,OAAO,YAAY,MAAM,MAAM,CAAC,CAAC,KAAK,OAAO;EAC5C,MAAM,WAAW,SAAS,KAAK,IAAI,UAAU,CAAC;EAC9C,MAAM,SAAS,aAAa,OAAQ,KAAK,IAAI,QAAQ,KAAK,OAAQ;EAClE,MAAM,MAAM,WAAW,IAAI,OAAO;EAClC,MAAM,SAAS,WAAW,IAAI,QAAQ;EACtC,OAAO;GACN,QAAQ,SAAS,OAAO,OAAO;GAC/B,gBAAgB,SAAS,OAAO,WAAW;GAC3C;GACA,KAAK,SAAS,KAAK,IAAI,KAAK,CAAC;GAC7B,MAAM,QAAQ,eAAe;GAC7B,GAAG,MAAM,SAAS,KAAK,KAAK,GAAG,CAAC,IAAI;GACpC,GAAG,MAAM,SAAS,KAAK,KAAK,GAAG,CAAC,IAAI;GACpC,MAAM,KAAK,IAAI,IAAI,KAAK;EACzB;CACD,CAAC;AACF;;AAmDA,SAAS,kBAAkB,IAAqB;CAC/C,MAAM,SAAS,WAAW,IAAI,aAAa;CAC3C,IAAI,CAAC,QAAQ,OAAO;CACpB,MAAM,QAAQ,YAAY,QAAQ,KAAK;CACvC,IAAI,MAAM,WAAW,GAAG,OAAO,OAAO,eAAe;CACrD,OAAO,MAAM,KAAK,MAAM,EAAE,eAAe,EAAE,CAAC,CAAC,KAAK,IAAI;AACvD;;;;;;AAOA,SAAS,mBACR,IACA,MACA,YACgB;CAChB,MAAM,WAAW,KAAK,IAAI,UAAU;CACpC,MAAM,SAAS,aAAa,OAAQ,KAAK,IAAI,QAAQ,KAAK,OAAQ;CAClE,MAAM,MAAM,aAAa,WAAW,IAAI,UAAU,IAAI;CACtD,MAAM,WAAW,aAAa,WAAW,IAAI,eAAe,IAAI;CAChE,OAAO;EACN,IAAI,KAAK,IAAI,IAAI;EACjB,QAAQ,SAAS,OAAO,OAAO;EAC/B,gBAAgB,SAAS,OAAO,WAAW;EAC3C;EACA,SAAS,KAAK,IAAI,SAAS;EAC3B,MAAM,kBAAkB,EAAE;EAC1B,GAAG,MAAM,SAAS,KAAK,KAAK,GAAG,CAAC,IAAI;EACpC,GAAG,MAAM,SAAS,KAAK,KAAK,GAAG,CAAC,IAAI;EACpC,SAAS,WAAW,YAAY,UAAU,YAAY,CAAC,CAAC,KAAK,MAAM,mBAAmB,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC;CAC3G;AACD;;;;;;AAOA,SAAgB,yBAAyB,KAAiB,sBAAqD;CAC9G,MAAM,OAAO,IAAI,iBAAiB,oBAAoB;CACtD,MAAM,MAAM,KAAK,OAAO,uBAAuB,CAAC,CAAC;CACjD,IAAI,CAAC,KAAK,OAAO,CAAC;CAElB,MAAM,OADO,IAAI,KAAK,KAAK,cAAc,IAAI,EAAE,CAC/B,CAAC,EAAE,IAAI;CACvB,IAAI,CAAC,MAAM,OAAO,CAAC;CACnB,OAAO,YAAY,MAAM,aAAa,CAAC,CAAC,KAAK,QAAQ;EACpD,IAAI,KAAK,IAAI,IAAI;EACjB,MAAM,KAAK,IAAI,MAAM,KAAK;EAC1B,UAAU,KAAK,IAAI,UAAU,KAAK;EAClC,QAAQ,KAAK,IAAI,QAAQ;EACzB,YAAY,KAAK,IAAI,YAAY;CAClC,EAAE;AACH;;;;;;;;AASA,SAAgB,wBACf,KACA,WACA,SACkB;CAClB,MAAM,OAAO,IAAI,iBAAiB,UAAU,QAAQ;CACpD,MAAM,MAAM,KAAK,OAAO,wBAAwB,CAAC,CAAC;CAClD,IAAI,CAAC,KAAK,OAAO,CAAC;CAClB,MAAM,OAAO,IAAI,KAAK,KAAK,cAAc,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI;CACvD,IAAI,CAAC,MAAM,OAAO,CAAC;CACnB,MAAM,OAAO,IAAI,IAAI,QAAQ,KAAK,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;CAClD,OAAO,YAAY,MAAM,SAAS,CAAC,CAAC,KAAK,OAAO,mBAAmB,IAAI,MAAM,IAAI,CAAC;AACnF;;;;;;;;AASA,SAAgB,cAAc,KAAgC;CAC7D,IAAI,IAAI,mBAAmB,4BAA4B,CAAC,CAAC,SAAS,GAAG,OAAO;CAC5E,IAAI,IAAI,mBAAmB,4BAA4B,CAAC,CAAC,SAAS,GAAG,OAAO;CAC5E,OAAO;AACR;;;;ACpPA,MAAM,gBAAgB;;;;;;;;AAiBtB,SAAgB,gBAAgB,KAAiB,eAA8B;CAC9E,MAAM,OAAO,IAAI,iBAAiB,aAAa;CAC/C,MAAM,MAAa,CAAC;CACpB,KAAK,MAAM,OAAO,KAAK,OAAO,aAAa,GAAG;EAC7C,MAAM,OAAO,IAAI,KAAK,KAAK,cAAc,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI;EACvD,IAAI,CAAC,MAAM;EACX,KAAK,MAAM,OAAO,YAAY,MAAM,OAAO,GAC1C,IAAI,KAAK;GAAE,MAAM,KAAK,KAAK,MAAM,KAAK;GAAI,KAAK,KAAK,KAAK,KAAK,KAAK;EAAG,CAAC;CAEzE;CACA,OAAO;AACR;;;ACYA,MAAM,oBAA+C;CACpD;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACD;AAiBA,MAAM,mBAA6C;CAClD;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACD;;AA4BA,SAAS,kBAAkB,MAAqC;CAC/D,MAAM,QAAQ,UAAiC;EAC9C,MAAM,KAAK,QAAQ,WAAW,MAAM,KAAK;EACzC,OAAQ,MAAM,KAAK,IAAI,UAAU,KAAM;CACxC;CACA,OAAO;EAAE,OAAO,KAAK,SAAS;EAAG,IAAI,KAAK,MAAM;EAAG,IAAI,KAAK,MAAM;CAAE;AACrE;;;;;;;;AASA,IAAa,QAAb,MAAmB;CAGR;CAFV,YAEC,MACC;EADQ,KAAA,OAAA;CACP;;CAGH,IAAI,WAAmB;EACtB,OAAO,KAAK,KAAK;CAClB;;CAGA,IAAI,OAAsB;EACzB,MAAM,OAAO,KAAK,KAAK,IAAI;EAC3B,OAAO,OAAO,KAAK,MAAM,MAAM,IAAI;CACpC;;CAGA,IAAI,kBAAiC;EACpC,MAAM,YAAY,KAAKC,WAAW;EAClC,OAAO,YAAY,KAAK,WAAW,MAAM,IAAI;CAC9C;;;;;;CAOA,IAAI,cAAqD;EACxD,MAAM,SAAS,eAAe,KAAKA,WAAW,CAAC;EAC/C,MAAM,MAAM,CAAC;EACb,KAAK,MAAM,QAAQ,mBAAmB,IAAI,QAAQ,OAAO,IAAI,IAAI,KAAK;EACtE,OAAO;CACR;;CAGA,MAAM,MAAqC;EAC1C,OAAO,eAAe,KAAKA,WAAW,CAAC,CAAC,CAAC,IAAI,IAAI,KAAK;CACvD;;CAGA,IAAI,aAAqC;EACxC,MAAM,gBAAgB,KAAKC,eAAe;EAC1C,MAAM,aAAa,iBAAiB,WAAW,eAAe,cAAc;EAC5E,IAAI,CAAC,YAAY,OAAO;EACxB,OAAO;GACN,MAAM,KAAK,YAAY,MAAM;GAC7B,OAAO,kBAAkB,WAAW,YAAY,aAAa,CAAC;GAC9D,OAAO,kBAAkB,WAAW,YAAY,aAAa,CAAC;EAC/D;CACD;;CAGA,IAAI,WAA2B;EAC9B,OAAO,KAAK,KAAK,IAAI;CACtB;;CAGA,YAAkB;EACjB,KAAK,KAAK,UAAU;CACrB;CAEA,iBAAiC;EAChC,MAAM,OAAO,KAAK,KAAK,IAAI;EAC3B,OAAO,OAAO,WAAW,MAAM,iBAAiB,IAAI;CACrD;CAEA,aAA6B;EAC5B,MAAM,gBAAgB,KAAKA,eAAe;EAC1C,OAAO,gBAAgB,WAAW,eAAe,aAAa,IAAI;CACnE;AACD;;AAGA,SAAS,kBAAkB,QAAmC;CAC7D,IAAI,CAAC,QAAQ,OAAO,CAAC;CACrB,OAAO,YAAY,QAAQ,MAAM,CAAC,CAAC,QAAQ,OAAO,cAAc,EAAE,MAAM,IAAI;AAC7E;;;;;;;;;;;;;;;AAgBA,IAAa,cAAb,MAAyB;CAEN;CACA;CAEA;CAEA;CANlB,YACC,IACA,MAEA,cAEA,eACC;EANgB,KAAA,KAAA;EACA,KAAA,OAAA;EAEA,KAAA,eAAA;EAEA,KAAA,gBAAA;CACf;CAEH,SAAyB;EACxB,MAAM,SAAS,WAAW,KAAK,IAAI,UAAU;EAC7C,OAAO,SAAS,WAAW,QAAQ,SAAS,IAAI;CACjD;;CAGA,IAAI,OAAsB;EACzB,MAAM,KAAK,cAAc,KAAK,EAAE;EAChC,OAAO,KAAK,KAAK,IAAI,MAAM,IAAI;CAChC;;CAGA,IAAI,MAAqB;EACxB,MAAM,KAAK,cAAc,KAAK,EAAE;EAChC,OAAO,KAAK,KAAK,IAAI,KAAK,IAAI;CAC/B;;CAGA,IAAI,OAAe;EAClB,MAAM,QAAQ,KAAKC,OAAO;EAC1B,QAAQ,SAAS,KAAK,OAAO,MAAM,MAAM;CAC1C;;CAGA,IAAI,KAAoB;EACvB,MAAM,QAAQ,KAAKA,OAAO;EAC1B,OAAO,QAAQ,SAAS,KAAK,OAAO,IAAI,CAAC,IAAI;CAC9C;;CAGA,IAAI,OAAsB;EACzB,OAAO,YAAY,KAAK,IAAI,SAAS,GAAG;CACzC;;CAGA,IAAI,MAAqB;EACxB,OAAO,YAAY,KAAK,IAAI,SAAS,GAAG;CACzC;;CAGA,IAAI,QAAuB;EAC1B,OAAO,YAAY,KAAK,IAAI,SAAS,IAAI;CAC1C;;CAGA,IAAI,SAAwB;EAC3B,OAAO,YAAY,KAAK,IAAI,SAAS,IAAI;CAC1C;;;;;;CAOA,IAAI,YAA8B;EACjC,MAAM,SAAS,WAAW,KAAK,IAAI,UAAU;EAC7C,OAAO,SAAS,IAAI,UAAU,QAAQ,KAAK,MAAM,KAAK,cAAc,KAAA,GAAW,KAAK,aAAa,IAAI;CACtG;;CAGA,IAAI,WAAoB;EACvB,OAAO,KAAK;CACb;;CAGA,YAAkB;EACjB,KAAK,KAAK,UAAU;CACrB;AACD;;;;;;;;AASA,IAAa,cAAb,MAA8C;CAKnC;CAEA;CANV;CAEA,YAEC,KAEA,MACC;EAHQ,KAAA,MAAA;EAEA,KAAA,OAAA;CACP;;CAGH,IAAI,WAAmB;EACtB,OAAO,KAAK,KAAK;CAClB;;CAGA,IAAI,gBAA+B;EAClC,OAAO,KAAK,IAAI,iBAAiB,KAAK,QAAQ;CAC/C;;CAGA,IAAI,OAAe;EAClB,MAAM,OAAO,KAAKC,MAAM;EACxB,QAAQ,QAAQ,KAAK,MAAM,MAAM,MAAM;CACxC;;CAGA,IAAI,QAAsB;EACzB,MAAM,YAAY,KAAKC,WAAW,SAAS;EAC3C,OAAO,YAAY,IAAI,MAAM,SAAS,IAAI;CAC3C;;;;;;;CAQA,IAAI,WAAiD;EACpD,MAAM,OAAO,KAAK,KAAK,IAAI;EAC3B,MAAM,SAAS,YAAY,OAAO,WAAW,MAAM,UAAU,IAAI,IAAI;EACrE,MAAM,MAAM,CAAC;EACb,KAAK,MAAM,SAAS,kBAAkB,IAAI,SAAS,OAAO,IAAI,KAAK,KAAK;EACxE,OAAO;CACR;;;;;;;;;;CAWA,IAAI,SAAqB;EACxB,MAAM,SAAS,KAAKC,QAAQ;EAC5B,OAAO,SAAS,YAAY,QAAQ,IAAI,IAAI,CAAC;CAC9C;;CAGA,cAAc,IAAkC;EAC/C,OAAO,kBAAkB,KAAK,QAAQ,EAAE;CACzC;;CAGA,IAAI,eAA8B;EACjC,MAAM,MAAM,KAAK,aAAa;EAC9B,MAAM,OAAO,KAAK;EAClB,OAAO,kBAAkB,KAAKA,QAAQ,CAAC,CAAC,CAAC,KAAK,OAAO,IAAI,YAAY,IAAI,KAAK,MAAM,KAAK,IAAI,CAAC;CAC/F;;CAGA,IAAI,UAAyB;EAC5B,MAAM,OAAO,KAAK,KAAK,IAAI;EAC3B,MAAM,MAAM,QAAQ,WAAW,MAAM,kBAAkB;EACvD,IAAI,CAAC,KAAK,OAAO,CAAC;EAClB,MAAM,OAAO,KAAK;EAClB,MAAM,MAAqB,CAAC;EAC5B,KAAK,MAAM,SAAS,YAAY,KAAK,eAAe,GAAG;GACtD,MAAM,QAAQ,KAAK,OAAO,MAAM;GAChC,MAAM,OAAO,QAAQ,KAAK,IAAI,KAAK,KAAK,cAAc,KAAK,CAAC,IAAI;GAChE,IAAI,MAAM,IAAI,KAAK,IAAI,YAAY,KAAK,KAAK,IAAI,CAAC;EACnD;EACA,OAAO;CACR;;;;;;CAOA,IAAI,aAAqC;EACxC,MAAM,KAAK,oBAAoB,KAAK,KAAK,IAAI,eAAe;EAC5D,IAAI,CAAC,IAAI,OAAO;EAChB,MAAM,YAAY,KAAKD,WAAW,SAAS;EAC3C,OAAO,oBACN,IACA,UACA,KAAK,aAAa,GAClB,KAAK,eACL,YAAY,KAAK,IAAI,iBAAiB,UAAU,QAAQ,IAAI,IAC7D;CACD;;;;;CAMA,eAA6B;EAC5B,OAAQ,KAAKE,kBAAkB,0BAA0B,KAAK,KAAK,KAAK,QAAQ;CACjF;CAEA,WAAW,MAA2B;EACrC,MAAM,OAAO,KAAK;EAClB,MAAM,MAAM,KAAK,OAAO,IAAI,CAAC,CAAC;EAC9B,OAAO,MAAO,KAAK,IAAI,KAAK,KAAK,cAAc,IAAI,EAAE,CAAC,KAAK,OAAQ;CACpE;CAEA,QAAwB;EACvB,MAAM,OAAO,KAAK,KAAK,IAAI;EAC3B,OAAO,OAAO,WAAW,MAAM,QAAQ,IAAI;CAC5C;CAEA,UAA0B;EACzB,MAAM,OAAO,KAAKH,MAAM;EACxB,OAAO,OAAO,WAAW,MAAM,UAAU,IAAI;CAC9C;AACD;;;;;;;;AASA,IAAa,cAAb,MAA8C;CAKnC;CAEA;CANV;CAEA,YAEC,KAEA,MACC;EAHQ,KAAA,MAAA;EAEA,KAAA,OAAA;CACP;;CAGH,IAAI,WAAmB;EACtB,OAAO,KAAK,KAAK;CAClB;;CAGA,IAAI,gBAA+B;EAClC,OAAO,KAAK,IAAI,iBAAiB,KAAK,QAAQ;CAC/C;;CAGA,IAAI,OAAe;EAClB,MAAM,OAAO,KAAKA,MAAM;EACxB,QAAQ,QAAQ,KAAK,MAAM,MAAM,MAAM;CACxC;;;;;;CAOA,IAAI,OAAsB;EACzB,MAAM,OAAO,KAAK,KAAK,IAAI;EAC3B,OAAO,OAAO,KAAK,MAAM,MAAM,IAAI;CACpC;;;;;;;;;CAUA,IAAI,eAAwB;EAC3B,MAAM,OAAO,KAAK,KAAK,IAAI;EAC3B,OAAO,UAAU,QAAQ,KAAK,MAAM,cAAc,CAAC,MAAM;CAC1D;;CAGA,IAAI,SAA6B;EAChC,MAAM,OAAO,KAAK;EAClB,MAAM,MAAM,KAAK,OAAO,gBAAgB,CAAC,CAAC;EAC1C,MAAM,OAAO,MAAM,KAAK,IAAI,KAAK,KAAK,cAAc,IAAI,EAAE,CAAC,IAAI;EAC/D,OAAO,OAAO,IAAI,YAAY,KAAK,KAAK,IAAI,IAAI;CACjD;;CAGA,IAAI,QAAsB;EACzB,OAAO,KAAK,QAAQ,SAAS;CAC9B;;;;;;;;;;CAWA,IAAI,SAAqB;EACxB,MAAM,SAAS,KAAKE,QAAQ;EAC5B,OAAO,SAAS,YAAY,QAAQ,IAAI,IAAI,CAAC;CAC9C;;CAGA,cAAc,IAAkC;EAC/C,OAAO,kBAAkB,KAAK,QAAQ,EAAE;CACzC;;CAGA,IAAI,eAA8B;EACjC,MAAM,MAAM,KAAK,aAAa;EAC9B,MAAM,OAAO,KAAK;EAClB,OAAO,kBAAkB,KAAKA,QAAQ,CAAC,CAAC,CAAC,KAAK,OAAO,IAAI,YAAY,IAAI,KAAK,MAAM,KAAK,IAAI,CAAC;CAC/F;;;;;;;CAQA,IAAI,aAAqC;EACxC,MAAM,KAAK,oBAAoB,KAAK,KAAK,IAAI,eAAe;EAC5D,IAAI,CAAC,IAAI,OAAO;EAChB,MAAM,YAAY,KAAK,QAAQ,OAAO,QAAQ;EAC9C,OAAO,oBACN,IACA,UACA,KAAK,aAAa,GAClB,KAAK,eACL,YAAY,KAAK,IAAI,iBAAiB,UAAU,QAAQ,IAAI,IAC7D;CACD;;;;;CAMA,eAA6B;EAC5B,OAAQ,KAAKC,kBAAkB,0BAA0B,KAAK,KAAK,KAAK,QAAQ;CACjF;CAEA,QAAwB;EACvB,MAAM,OAAO,KAAK,KAAK,IAAI;EAC3B,OAAO,OAAO,WAAW,MAAM,QAAQ,IAAI;CAC5C;CAEA,UAA0B;EACzB,MAAM,OAAO,KAAKH,MAAM;EACxB,OAAO,OAAO,WAAW,MAAM,UAAU,IAAI;CAC9C;AACD;;;;;;;;;;;;;;;;;;;;ACtfA,MAAM,oCAAoB,IAAI,IAAI,CAAC,SAAS,QAAQ,CAAC;;AAGrD,SAAS,YAAY,YAAqC;CACzD,KAAK,MAAM,SAAS,cAAc,UAAU,GAC3C,IAAI,CAAC,kBAAkB,IAAI,MAAM,aAAa,EAAE,GAAG,OAAO;CAE3D,OAAO;AACR;;AAGA,SAAS,UAAU,KAA4B;CAC9C,IAAI,CAAC,KAAK,OAAO;CACjB,KAAK,MAAM,CAAC,QAAQ,OAAO,OAAO,QAAQ,QAAQ,GACjD,IAAI,OAAO,KAAK,OAAO;CAGxB,IAAI,QAAQ,4DAA4D,OAAO;CAC/E,IAAI,QAAQ,8DAA8D,OAAO;CACjF,OAAO;AACR;;AAGA,SAAS,aAAa,SAA0C;CAC/D,MAAM,MAA8B,CAAC;CACrC,MAAM,QAAQ,QAAQ;CACtB,KAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;EACtC,MAAM,IAAI,MAAM;EAChB,IAAI,CAAC,KAAK,EAAE,WAAW,WAAW,EAAE,SAAS,SAAS;EACtD,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE;CAChC;CACA,OAAO;AACR;;;;;;;AAQA,SAAgB,eAAe,MAA+D;CAC7F,MAAM,OAAO,WAAW,MAAM,cAAc;CAC5C,IAAI,MAAM,OAAO;EAAE,YAAY;EAAM,OAAO;CAAK;CAEjD,MAAM,aAAa,WAAW,MAAM,qBAAqB;CACzD,IAAI,YAAY;EACf,MAAM,SAAS,WAAW,YAAY,WAAW;EACjD,MAAM,aAAa,SAAS,WAAW,QAAQ,cAAc,IAAI;EACjE,IAAI,YAAY,OAAO;GAAE;GAAY,OAAO;EAAW;EAEvD,MAAM,WAAW,WAAW,YAAY,aAAa;EACrD,MAAM,eAAe,WAAW,WAAW,UAAU,cAAc,IAAI;EACvE,IAAI,cAAc,OAAO;GAAE,YAAY;GAAc,OAAO;EAAW;CACxE;CACA,OAAO;AACR;;AAGA,SAAgB,gBAAgB,MAAsC;CACrE,MAAM,QAAQ,eAAe,IAAI;CACjC,IAAI,CAAC,OAAO,OAAO;CACnB,MAAM,EAAE,eAAe;CACvB,MAAM,OAAO,YAAY,UAAU;CACnC,IAAI,CAAC,MAAM,OAAO;CAElB,MAAM,WAAW,UAAU,KAAK,YAAY,UAAU,CAAC;CACvD,MAAM,QAAQ,SAAS,KAAK,YAAY,OAAO,CAAC;CAChD,MAAM,MAAM,KAAK,YAAY,KAAK;CAClC,OAAO;EACN,MAAM,KAAK,aAAa;EACxB,WAAW,UAAU,KAAK,YAAY;EACtC,OAAO,QAAQ,UAAU,QAAQ,SAAS,QAAQ,SAAS,MAAM;EACjE,YAAY,SAAS,KAAK,YAAY,SAAS,CAAC;EAChD,gBAAgB,YAAY;EAC5B,gBAAgB;EAChB,SAAS,aAAa,IAAI;EAC1B,OAAO,WAAW,UAAU;CAC7B;AACD;;AAGA,SAAS,WAAW,YAAiD;CACpE,MAAM,QAAQ,WAAW,YAAY,SAAS;CAC9C,IAAI,CAAC,OAAO,OAAO;CACnB,MAAM,QAAQ,WAAW,OAAO,SAAS;CACzC,IAAI,OAAO;EACV,MAAM,MAAM,WAAW,OAAO,OAAO;EACrC,OAAO;GACN,MAAM;GACN,MAAM,UAAU,KAAK,OAAO,MAAM,CAAC,KAAK;GACxC,UAAU,MAAM,KAAK,KAAK,SAAS,IAAI;GACvC,MAAM,MAAM,KAAK,KAAK,MAAM,IAAI;EACjC;CACD;CACA,IAAI,WAAW,OAAO,UAAU,GAAG,OAAO;EAAE,MAAM;EAAQ,MAAM;EAAO,UAAU;EAAM,MAAM;CAAK;CAClG,OAAO;AACR;;AAGA,SAAS,iBAAiB,YAAqC;CAC9D,IAAI,cAAc,KAAK,OAAO;CAC9B,IAAI,cAAc,KAAM,OAAO;CAC/B,OAAO;AACR;;AAGA,SAAS,uBACR,KACA,OACA,OACA,SACU;CACV,MAAM,aAAa,cAAc,KAAK,cAAc;CACpD,IAAI,OAAO,QAAQ,YAAY,OAAO,KAAK;CAC3C,IAAI,WAAW,OAAO,MAAM,eAAe,UAC1C,QAAQ,YAAY,WAAW,OAAO,KAAK,MAAM,MAAM,UAAU,CAAC,CAAC;CACpE,IAAI,MAAM,mBAAmB,OAAO,QAAQ,YAAY,YAAY,GAAG;CACvE,IAAI,OAAO,MAAM,mBAAmB,UAAU,QAAQ,YAAY,SAAS,OAAO,KAAK,MAAM,MAAM,cAAc,CAAC,CAAC;CAEnH,MAAM,SAAS,MAAM,aAAa;CAClC,MAAM,OAAO,cAAc,KAAK,GAAG,OAAO,GAAG,MAAM,MAAM;CACzD,KAAK,MAAM,CAAC,MAAM,UAAU,OAAO,QAAQ,MAAM,WAAW,CAAC,CAAC,GAAG,QAAQ,MAAM,MAAM,KAAK;CAC1F,WAAW,YAAY,IAAI;CAC3B,OAAO;AACR;;;;;;AAOA,SAAgB,gBAAgB,KAAe,OAAiC;CAC/E,MAAM,cAAc,OAAO,MAAM,eAAe;CAChD,MAAM,QAAQ,MAAM,UAAU,cAAc,iBAAiB,MAAM,UAAoB,IAAI;CAE3F,IAAI,CAAC,aAAa,OAAO,uBAAuB,KAAK,OAAO,OAAO,KAAK;CAExE,MAAM,MAAM,cAAc,KAAK,qBAAqB;CACpD,MAAM,SAAS,cAAc,KAAK,WAAW;CAC7C,QAAQ,QAAQ,YAAY,KAAK;CACjC,OAAO,YAAY,uBAAuB,KAAK,OAAO,OAAO,IAAI,CAAC;CAClE,IAAI,YAAY,MAAM;CACtB,MAAM,WAAW,cAAc,KAAK,aAAa;CACjD,SAAS,YAAY,uBAAuB,KAAK,OAAO,OAAO,KAAK,CAAC;CACrE,IAAI,YAAY,QAAQ;CACxB,OAAO;AACR;;AAGA,SAAgB,iBAAiB,MAAqB;CACrD,MAAM,QAAQ,eAAe,IAAI;CACjC,IAAI,OAAO,KAAK,YAAY,MAAM,KAAK;AACxC;;;;;;;;;;;;;;;AC9MA,MAAM,OAAO,SAAS;;AAGtB,SAAS,aAAa,MAA0B;CAC/C,MAAM,MAAiB,CAAC;CACxB,KAAK,MAAM,MAAM,KAAK,uBAAuB,SAAS,GAAG,OAAO,GAAG,IAAI,KAAK,EAAE;CAC9E,KAAK,MAAM,MAAM,KAAK,uBAAuB,SAAS,GAAG,MAAM,GAAG,IAAI,KAAK,EAAE;CAC7E,OAAO;AACR;;;;;;AAOA,SAAgB,cAAc,MAAwB;CACrD,IAAI,KAAK,uBAAuB,SAAS,GAAG,MAAM,CAAC,CAAC,SAAS,GAAG,OAAO;CACvE,KAAK,MAAM,OAAO,KAAK,uBAAuB,SAAS,GAAG,KAAK,GAC9D,IAAI,KAAK,KAAK,UAAU,MAAM,MAAM,OAAO;CAE5C,OAAO;AACR;;AAGA,SAAgB,eAAe,MAAyB;CACvD,MAAM,uBAAO,IAAI,IAAY;CAC7B,KAAK,MAAM,WAAW,aAAa,IAAI,GAAG;EACzC,MAAM,OAAO,SAAS,KAAK,SAAS,MAAM,CAAC;EAC3C,IAAI,SAAS,MAAM,KAAK,IAAI,IAAI;CACjC;CACA,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,MAAM,GAAG,MAAM,IAAI,CAAC;AACtC;;;;;;AAOA,SAAgB,WAAW,MAAe,SAAuC;CAChF,IAAI,UAAU;CACd,KAAK,MAAM,WAAW,aAAa,IAAI,GAAG;EACzC,MAAM,OAAO,SAAS,KAAK,SAAS,MAAM,CAAC;EAC3C,IAAI,SAAS,MAAM;EACnB,MAAM,OAAO,QAAQ,IAAI,IAAI;EAC7B,IAAI,SAAS,KAAA,KAAa,SAAS,MAAM;GACxC,QAAQ,SAAS,QAAQ,OAAO,IAAI,CAAC;GACrC,UAAU;EACX;CACD;CACA,OAAO;AACR;;AAGA,SAAS,aAAa,OAAgC;CACrD,KAAK,IAAI,OAAuB,MAAM,YAA8B,MAAM,OAAO,KAAK,YACrF,IAAI,KAAK,cAAc,SAAS,KAAK,iBAAiB,SAAS,GAAG;EACjE,MAAM,MAAM,WAAW,MAAM,OAAO;EACpC,IAAI,OAAO,KAAK,KAAK,UAAU,MAAM,MAAM,OAAO;CACnD;CAED,OAAO;AACR;;AAGA,SAAS,kBAAkB,KAAuB;CACjD,IAAI,IAAI,cAAc,SAAS,IAAI,iBAAiB,SAAS,GAAG,OAAO;CACvE,MAAM,MAAM,WAAW,KAAK,OAAO;CACnC,IAAI,CAAC,OAAO,KAAK,KAAK,UAAU,MAAM,MAAM,OAAO;CACnD,MAAM,aAAa,WAAW,KAAK,cAAc;CACjD,OAAO,CAAC,cAAc,cAAc,UAAU,CAAC,CAAC,WAAW;AAC5D;;;;;;;;AASA,SAAgB,WAAW,MAAe,OAAkC;CAC3E,MAAM,uBAAO,IAAI,IAAY;CAC7B,KAAK,MAAM,KAAK,OAAO,KAAK,IAAI,CAAC;CACjC,IAAI,KAAK,SAAS,GAAG,OAAO;CAE5B,IAAI,UAAU;CACd,MAAM,kCAAkB,IAAI,IAAa;CAGzC,MAAM,SAAS,MAAM,KAAK,KAAK,uBAAuB,SAAS,GAAG,OAAO,CAAC;CAC1E,MAAM,6BAAa,IAAI,IAAa;CACpC,KAAK,MAAM,SAAS,QAAQ;EAC3B,MAAM,OAAO,SAAS,KAAK,OAAO,MAAM,CAAC;EACzC,IAAI,SAAS,QAAQ,CAAC,KAAK,IAAI,IAAI,GAAG;EACtC,MAAM,YAAY,aAAa,KAAK;EACpC,IAAI,WAAW,WAAW,IAAI,SAAS;CACxC;CACA,KAAK,MAAM,aAAa,YAAY;EACnC,MAAM,SAAS,UAAU;EACzB,UAAU,YAAY,YAAY,SAAS;EAC3C,UAAU;EAGV,MAAM,aAAaI,QAAY,YAAY;EAC3C,IAAI,YAAY,gBAAgB,IAAI,UAAU;CAC/C;CAGA,IAAI,WAAW;CACf,OAAO,UAAU;EAChB,WAAW;EAKX,KAAK,MAAM,WAAW,CAAC,GAAG,eAAe,GACxC,IAAI,kBAAkB,OAAO,GAAG;GAC/B,MAAM,eAAe,QAAQ,YAAY,YAAY;GACrD,QAAQ,YAAY,YAAY,OAAO;GACvC,gBAAgB,OAAO,OAAO;GAC9B,IAAI,cAAc,gBAAgB,IAAI,YAAY;GAClD,WAAW;GACX,UAAU;EACX;CAEF;CAGA,MAAM,QAAQ,MAAM,KAAK,KAAK,uBAAuB,SAAS,GAAG,MAAM,CAAC;CACxE,KAAK,MAAM,QAAQ,OAAO;EACzB,MAAM,OAAO,SAAS,KAAK,MAAM,MAAM,CAAC;EACxC,IAAI,SAAS,QAAQ,KAAK,IAAI,IAAI,GAAG;GACpC,KAAK,YAAY,YAAY,IAAI;GACjC,UAAU;EACX;CACD;CAGA,MAAM,UAAU,MAAM,KAAK,KAAK,uBAAuB,SAAS,GAAG,QAAQ,CAAC;CAC5E,KAAK,MAAM,UAAU,SACpB,IAAI,cAAc,MAAM,CAAC,CAAC,WAAW,GAAG,OAAO,YAAY,YAAY,MAAM;CAG9E,OAAO;AACR;;;;;;;;;;;;;;;AAgBA,SAAgB,kBAAkB,MAAwB;CACzD,IAAI,CAAC,cAAc,IAAI,GAAG,OAAO;CACjC,MAAM,SAAS,WAAW,MAAM,UAAU;CAC1C,IAAI,CAAC,QAAQ,OAAO;CACpB,OAAO,YAAY,YAAY,MAAM;CACrC,OAAO;AACR;AAIA,MAAM,UAAU,YAAY,KAAK;;AAEjC,MAAM,kBAAkB,aAAa,QAAQ;;AAE7C,MAAM,oBACL,UAAU,QAAQ;;AAKnB,SAAS,SAAS,OAAwB;CACzC,IAAI,MAAM;CACV,KAAK,MAAM,OAAO,MAAM,uBAAuB,MAAM,KAAK,GAAG;EAC5D,MAAM,KAAK,SAAS,KAAK,KAAK,IAAI,CAAC;EACnC,IAAI,OAAO,QAAQ,KAAK,KAAK,MAAM;CACpC;CACA,OAAO;AACR;;AAGA,SAAS,eAAe,MAAe,OAAuB;CAC7D,IAAI,KAAK;CACT,KAAK,MAAM,OAAO,KAAK,uBAAuB,MAAM,KAAK,GAAG,QAAQ,KAAK,MAAM,OAAO,IAAI,CAAC;CAC3F,OAAO;AACR;;AAGA,SAAS,eAAe,KAAc,OAA6B;CAClE,KAAK,MAAM,SAAS,IAAI,uBAAuB,MAAM,OAAO,GAAG;EAC9D,MAAM,OAAO,SAAS,KAAK,OAAO,MAAM,CAAC;EACzC,IAAI,SAAS,QAAQ,MAAM,IAAI,IAAI,GAAG,OAAO;CAC9C;CACA,OAAO;AACR;;AAGA,SAAS,eAAe,KAAe,KAAsB;CAC5D,OAAO,IAAI,WAAW,SAAS,GAAG,CAAC,CAAC,iBAA4B,IAAI;AACrE;;AAGA,SAAS,6BAA6B,MAAe,KAAwB;CAC5E,IAAI,SAAS,WAAW,MAAM,UAAU;CACxC,IAAI,CAAC,QAAQ;EACZ,SAAS,eAAe,KAAK,eAAe;EAC5C,cAAc,MAAM,QAAQ,CAAC,UAAU,CAAC;CACzC;CAEA,MAAM,cAAc,OAAO,uBAAuB,MAAM,KAAK,CAAC,CAAC;CAC/D,IAAI,aAAa;EAChB,MAAM,SAAS,WAAW,aAAa,OAAO;EAC9C,IAAI,QAAQ;GACX,IAAI,WAAW,WAAW,QAAQ,cAAc;GAChD,IAAI,CAAC,UAAU;IACd,WAAW,cAAc,KAAK,cAAc;IAC5C,OAAO,YAAY,QAAQ;GAC5B;GACA,OAAO;EACR;CACD;CAEA,IAAI,iBAAiB,OAAO,uBAAuB,MAAM,YAAY,CAAC,CAAC;CACvE,IAAI,CAAC,gBAAgB;EAEpB,MAAM,QAAQ,eAAe,KAAK,eAAe;EACjD,MAAM,aAAa,WAAW,OAAO,SAAS;EAC9C,IAAI,YAAY,cAAc,QAAQ,YAAY,CAAC,YAAY,UAAU,CAAC;EAC1E,iBAAiB,OAAO,uBAAuB,MAAM,YAAY,CAAC,CAAC;CACpE;CACA,IAAI,CAAC,gBACJ,MAAM,IAAI,cACT,oCACA,iFACD;CACD,MAAM,MAAM,eAAe,KAAK,iBAAiB;CACjD,QAAQ,WAAW,KAAK,OAAO,GAAc,MAAM,OAAO,SAAS,MAAM,IAAI,CAAC,CAAC;CAC/E,eAAe,aAAa,KAAK,eAAe,UAAU;CAC1D,OAAO,WAAW,WAAW,KAAK,OAAO,GAAc,cAAc;AACtE;;AAGA,SAAS,kBAAkB,QAAiB,KAAwB;CACnE,IAAI,SAAS,WAAW,QAAQ,UAAU;CAC1C,IAAI,CAAC,QAAQ;EACZ,SAAS,cAAc,KAAK,UAAU;EACtC,cAAc,QAAQ,QAAQ,CAAC,UAAU,CAAC;CAC3C;CACA,OAAO;AACR;;;;;;;;;;;AAYA,SAAgB,qBAAqB,YAAqB,YAAqB,SAAuC;CACrH,MAAM,eAAe,WAAW,YAAY,UAAU;CACtD,IAAI,CAAC,cAAc,OAAO;CAC1B,MAAM,eAAe,IAAI,IAAI,QAAQ,KAAK,CAAC;CAG3C,MAAM,YAAY,aAAa,uBAAuB,MAAM,KAAK,CAAC,CAAC;CACnE,MAAM,SAAoB,CAAC;CAC3B,IAAI,WAAW;EACd,MAAM,SAAS,WAAW,WAAW,OAAO;EAC5C,MAAM,cAAc,SAAS,WAAW,QAAQ,cAAc,IAAI;EAClE,IAAI,aACE;QAAA,MAAM,OAAO,cAAc,WAAW,GAC1C,IAAI,eAAe,KAAK,YAAY,GAAG,OAAO,KAAK,GAAG;EAAA;CAGzD;CAEA,MAAM,eAAe,WAAW,cAAc,UAAU;CACxD,MAAM,QAAmB,CAAC;CAC1B,IAAI,cACH,KAAK,MAAM,QAAQ,cAAc,YAAY,GAAG;EAC/C,MAAM,OAAO,SAAS,KAAK,MAAM,MAAM,CAAC;EACxC,IAAI,SAAS,QAAQ,aAAa,IAAI,IAAI,GAAG,MAAM,KAAK,IAAI;CAC7D;CAED,IAAI,OAAO,WAAW,KAAK,MAAM,WAAW,GAAG,OAAO;CAEtD,MAAM,MAAM,WAAW;CACvB,MAAM,eAAe,6BAA6B,YAAY,GAAG;CACjE,MAAM,aAAa,WAAW,YAAY,UAAU;CACpD,IAAI,SAAS,SAAS,UAAU,IAAI;CAEpC,KAAK,MAAM,OAAO,QAAQ;EACzB,MAAM,QAAQ,IAAI,WAAW,KAAK,IAAI;EACtC,WAAW,OAAO,OAAO;EACzB,SAAS,eAAe,OAAO,MAAM;EACrC,aAAa,YAAY,KAAK;CAC/B;CACA,IAAI,MAAM,SAAS,GAAG;EACrB,MAAM,aAAa,kBAAkB,YAAY,GAAG;EACpD,KAAK,MAAM,QAAQ,OAAO;GACzB,MAAM,QAAQ,IAAI,WAAW,MAAM,IAAI;GACvC,MAAM,OAAO,SAAS,KAAK,OAAO,MAAM,CAAC;GACzC,IAAI,SAAS,QAAQ,QAAQ,IAAI,IAAI,GAAG,QAAQ,OAAO,QAAQ,OAAO,QAAQ,IAAI,IAAI,CAAC,CAAC;GACxF,WAAW,YAAY,KAAK;EAC7B;CACD;CACA,OAAO;AACR;;;;AC3PA,SAAS,eAAe,OAAqC;CAC5D,MAAM,IAAI;CACV,IAAI,EAAE,UAAU,KAAK,EAAE,OAAO,OAAQ,EAAE,OAAO,MAAQ,EAAE,OAAO,MAAQ,EAAE,OAAO,IAChF,OAAO;EAAE,WAAW;EAAO,aAAa;CAAY;CACrD,IAAI,EAAE,UAAU,KAAK,EAAE,OAAO,OAAQ,EAAE,OAAO,OAAQ,EAAE,OAAO,KAC/D,OAAO;EAAE,WAAW;EAAQ,aAAa;CAAa;CACvD,IAAI,EAAE,UAAU,KAAK,EAAE,OAAO,MAAQ,EAAE,OAAO,MAAQ,EAAE,OAAO,MAAQ,EAAE,OAAO,IAChF,OAAO;EAAE,WAAW;EAAO,aAAa;CAAY;CACrD,IAAI,EAAE,UAAU,KAAK,EAAE,OAAO,MAAQ,EAAE,OAAO,IAAM,OAAO;EAAE,WAAW;EAAO,aAAa;CAAY;CACzG,IACC,EAAE,UAAU,MACV,EAAE,OAAO,MAAQ,EAAE,OAAO,MAAQ,EAAE,OAAO,MAAQ,EAAE,OAAO,KAC5D,EAAE,OAAO,MAAQ,EAAE,OAAO,MAAQ,EAAE,OAAO,KAAQ,EAAE,OAAO,KAE9D,OAAO;EAAE,WAAW;EAAQ,aAAa;CAAa;CACvD,IACC,EAAE,UAAU,MACZ,EAAE,OAAO,MACT,EAAE,OAAO,MACT,EAAE,OAAO,MACT,EAAE,OAAO,MACT,EAAE,OAAO,MACT,EAAE,OAAO,MACT,EAAE,QAAQ,MACV,EAAE,QAAQ,IAEV,OAAO;EAAE,WAAW;EAAQ,aAAa;CAAa;CACvD,OAAO;AACR;AAEA,IAAa,QAAb,MAAwC;CAE7B;CAEA;CAEA;CAEA;CAPV,YACC,cAEA,MAEA,SAEA,OACC;EAPQ,KAAA,eAAA;EAEA,KAAA,OAAA;EAEA,KAAA,UAAA;EAEA,KAAA,QAAA;CACP;;CAGH,IAAI,WAAmB;EACtB,OAAO,KAAK,KAAK;CAClB;;;;;;;CAQA,IAAI,WAAoB;EACvB,MAAM,OAAO,KAAK,KAAK,IAAI;EAC3B,IAAI,CAAC,MACJ,MAAM,IAAI,iBAAiB,4BAA4B,SAAS,KAAK,SAAS,6BAA6B;EAC5G,OAAO;CACR;;CAGA,YAAkB;EACjB,KAAK,KAAK,UAAU;CACrB;;CAGA,IAAI,gBAA+B;EAClC,OAAO,KAAK,aAAa,IAAI,iBAAiB,KAAK,QAAQ;CAC5D;;;;;;CAOA,IAAI,MAAkB;EACrB,OAAO,KAAK,aAAa;CAC1B;CAEA;;;;;;;;;;;;CAaA,eAA6B;EAC5B,OAAQ,KAAKC,iBAAiB,yBAAyB,KAAK,aAAa,KAAK,KAAK,QAAQ;CAC5F;;CAGA,IAAI,OAAsB;EACzB,MAAM,OAAO,KAAKC,MAAM;EACxB,OAAO,OAAO,KAAK,MAAM,MAAM,IAAI;CACpC;;;;;;;;CASA,IAAI,SAAkB;EACrB,MAAM,OAAO,KAAK,KAAK,IAAI;EAC3B,MAAM,OAAO,OAAO,KAAK,MAAM,MAAM,IAAI;EACzC,OAAO,SAAS,OAAO,SAAS;CACjC;;;;;;CAOA,IAAI,OAAO,OAAgB;EAC1B,MAAM,OAAO,KAAK,KAAK,IAAI;EAC3B,IAAI,CAAC,MACJ,MAAM,IAAI,iBAAiB,4BAA4B,SAAS,KAAK,SAAS,6BAA6B;EAC5G,IAAI,OAAO,QAAQ,MAAM,QAAQ,GAAG;OAC/B,WAAW,MAAM,MAAM;EAC5B,KAAK,KAAK,UAAU;CACrB;;;;;;;;;;;;;CAcA,IAAI,eAAwB;EAC3B,MAAM,OAAO,KAAK,KAAK,IAAI;EAC3B,OAAO,UAAU,QAAQ,KAAK,MAAM,cAAc,CAAC,MAAM;CAC1D;;;;;;;CAQA,IAAI,aAAoC;EACvC,MAAM,OAAO,KAAK,KAAK,IAAI;EAC3B,OAAO,OAAO,gBAAgB,IAAI,IAAI;CACvC;;;;;;;;CASA,IAAI,WAAW,OAA+B;EAC7C,MAAM,OAAO,KAAK,KAAK,IAAI;EAC3B,IAAI,CAAC,MACJ,MAAM,IAAI,iBAAiB,4BAA4B,SAAS,KAAK,SAAS,6BAA6B;EAC5G,iBAAiB,IAAI;EACrB,IAAI,OAAO;GACV,MAAM,MAAM,KAAK,KAAK;GACtB,cAAc,MAAM,gBAAgB,KAAK,KAAK,GAAG,CAAC,YAAY,UAAU,CAAC;EAC1E;EACA,KAAK,KAAK,UAAU;CACrB;;;;;;CAOA,IAAI,gBAAyB;EAC5B,MAAM,OAAO,KAAK,KAAK,IAAI;EAC3B,OAAO,OAAO,cAAc,IAAI,IAAI;CACrC;;;;;;CAOA,iBAA2B;EAC1B,MAAM,OAAO,KAAK,KAAK,IAAI;EAC3B,OAAO,OAAO,eAAe,IAAI,IAAI,CAAC;CACvC;;;;;;CAOA,oBAAoB,SAAoC;EACvD,MAAM,OAAO,KAAK,KAAK,IAAI;EAC3B,IAAI,QAAQ,WAAW,MAAM,OAAO,GAAG,KAAK,KAAK,UAAU;CAC5D;;;;;;CAOA,oBAAoB,OAA+B;EAClD,MAAM,OAAO,KAAK,KAAK,IAAI;EAC3B,IAAI,QAAQ,WAAW,MAAM,KAAK,GAAG,KAAK,KAAK,UAAU;CAC1D;;;;;;;;;;;;;CAcA,oBAA6B;EAC5B,MAAM,OAAO,KAAK,KAAK,IAAI;EAC3B,IAAI,QAAQ,kBAAkB,IAAI,GAAG;GACpC,KAAK,KAAK,UAAU;GACpB,OAAO;EACR;EACA,OAAO;CACR;;CAGA,IAAI,SAAqB;EACxB,MAAM,SAAS,KAAKC,QAAQ;EAC5B,OAAO,SAAS,YAAY,QAAQ,IAAI,IAAI,CAAC;CAC9C;;;;;;;;;;;;;;;CAgBA,IAAI,OAAe;EAClB,MAAM,SAAmB,CAAC;EAC1B,MAAM,QAAQ,WAA6B;GAC1C,KAAK,MAAM,SAAS,QACnB,IAAI,iBAAiB,YACpB,KAAK,MAAM,MAAM;QACX,IAAI,iBAAiB,cAAc;IACzC,MAAM,QAAQ,MAAM;IACpB,IAAI,CAAC,OAAO;IACZ,KAAK,MAAM,OAAO,MAAM,MAAM;KAC7B,MAAM,QAAQ,IAAI,MAAM,KAAK,SAAS,KAAK,IAAI;KAC/C,IAAI,MAAM,MAAM,SAAS,KAAK,SAAS,CAAC,GAAG,OAAO,KAAK,MAAM,KAAK,GAAI,CAAC;IACxE;GACD,OAAO;IACN,MAAM,OAAO,MAAM;IACnB,IAAI,KAAK,SAAS,GAAG,OAAO,KAAK,IAAI;GACtC;EAEF;EACA,KAAK,KAAK,MAAM;EAChB,OAAO,OAAO,KAAK,IAAI;CACxB;;;;;;;;;;;;;CAcA,IAAI,YAA2B;EAC9B,MAAM,QAAQ,KAAK;EACnB,OAAO,QAAQ,MAAM,OAAO;CAC7B;;;;;;;;;;;;;;CAeA,IAAI,iBAAmC;EACtC,OAAO,KAAK,YAAY,aAAa;CACtC;;;;;;;;;;;;;;CAeA,IAAI,aAAgC;EACnC,MAAM,WAAW,KAAK,cAAc,OAAO,eAAe,CAAC,CAAC;EAC5D,IAAI,CAAC,UAAU,OAAO;EACtB,MAAM,YAAY,KAAK,aAAa,IAAI,KAAK,KAAK,cAAc,cAAc,SAAS,EAAE,CAAC;EAC1F,IAAI,CAAC,WAAW,OAAO;EACvB,OAAO,IAAI,WAAW,KAAK,aAAa,KAAK,SAAS;CACvD;;;;;;;CAQA,IAAI,SAA6B;EAChC,MAAM,MAAM,KAAK,cAAc,OAAO,gBAAgB,CAAC,CAAC;EACxD,IAAI,CAAC,KAAK,OAAO;EACjB,MAAM,OAAO,KAAK,aAAa,IAAI,KAAK,KAAK,cAAc,cAAc,IAAI,EAAE,CAAC;EAChF,OAAO,OAAO,IAAI,YAAY,KAAK,aAAa,KAAK,IAAI,IAAI;CAC9D;;;;;;;CAQA,IAAI,SAA6B;EAChC,OAAO,KAAK,QAAQ,UAAU;CAC/B;;;;;;;CAQA,IAAI,QAAsB;EACzB,OAAO,KAAK,QAAQ,QAAQ,SAAS;CACtC;;;;;;;;;CAUA,IAAI,WAAsB;EACzB,OAAO,kBAAkB,KAAK,aAAa,KAAK,KAAK,MAAM,KAAK,aAAa,cAAc;CAC5F;;;;;;;;;;CAWA,IAAI,iBAAkC;EACrC,OAAO,wBAAwB,KAAK,aAAa,KAAK,KAAK,MAAM,KAAK,aAAa,oBAAoB;CACxG;;;;;;;;CASA,IAAI,OAAc;EACjB,OAAO,gBAAgB,KAAK,aAAa,KAAK,KAAK,QAAQ;CAC5D;;;;;;;;;;;;;;CAeA,IAAI,aAAqC;EACxC,MAAM,MAAM,KAAK,aAAa;EAC9B,MAAM,QAAQ,uBAAuB,KAAK,KAAK,QAAQ;EACvD,MAAM,MAAM,KAAK,aAAa;EAC9B,MAAM,aAAyG;GAC9G;IAAE,MAAM,MAAM;IAAW,QAAQ;IAAS,UAAU,KAAK;GAAS;GAClE;IAAE,MAAM,MAAM;IAAY,QAAQ;IAAU,UAAU,MAAM;GAAe;GAC3E;IAAE,MAAM,MAAM;IAAY,QAAQ;IAAU,UAAU,MAAM;GAAe;EAC5E;EACA,MAAM,YAAY,MAAM,gBAAgB,IAAI,iBAAiB,MAAM,aAAa,IAAI;EACpF,KAAK,MAAM,EAAE,MAAM,QAAQ,cAAc,YAAY;GACpD,MAAM,KAAK,oBAAoB,IAAI;GACnC,IAAI,CAAC,IAAI;GAET,OAAO,oBAAoB,IAAI,QAAQ,KAD1B,WAAW,IAAI,iBAAiB,QAAQ,IAAI,MACP,SAAS;EAC5D;EACA,OAAO;CACR;;;;;;;;;;;;CAaA,IAAI,yBAA2C;EAC9C,OAAO,KAAK,YAAY,QAAQ,KAAK;CACtC;;CAGA,UAAU,IAAkC;EAC3C,OAAO,KAAK,OAAO,MAAM,UAAU,MAAM,OAAO,EAAE;CACnD;;;;;;;;;;;;CAaA,cAAc,IAAkC;EAC/C,OAAO,kBAAkB,KAAK,QAAQ,EAAE;CACzC;;CAGA,YAAY,MAAoC;EAC/C,OAAO,KAAK,OAAO,MAAM,UAAU,MAAM,SAAS,IAAI;CACvD;;;;;;;CAQA,YAAY,MAAc,KAAqC;EAC9D,OAAO,KAAK,OAAO,MAAM,UAA8B;GACtD,MAAM,KAAK,iBAAiB,YAAY,MAAM,cAAc;GAC5D,OAAO,OAAO,QAAQ,GAAG,SAAS,SAAS,QAAQ,KAAA,KAAa,GAAG,QAAQ;EAC5E,CAAC;CACF;;;;;;CAOA,WAAW,SAAuC;EACjD,MAAM,EAAE,MAAM,KAAK,OAAO,WAAW;EACrC,cAAc,MAAM,MAAM;EAC1B,cAAc,KAAK,KAAK;EACxB,gBAAgB,OAAO,OAAO;EAC9B,gBAAgB,QAAQ,QAAQ;EAEhC,MAAM,SAAS,KAAKA,QAAQ;EAC5B,IAAI,CAAC,QACJ,MAAM,IAAI,iBAAiB,uBAAuB,SAAS,KAAK,SAAS,iCAAiC;EAC3G,MAAM,MAAM,OAAO;EACnB,IAAI,CAAC,KAAK,MAAM,IAAI,cAAc,6BAA6B,iCAAiC;EAEhG,MAAM,KAAK,KAAKC,aAAa;EAC7B,MAAM,KAAK,aAAa,KAAK;GAC5B;GACA,MAAM,QAAQ,QAAQ,WAAW;GACjC,MAAM,QAAQ,QAAQ;GACtB,MAAM,KAAK,MAAM,IAAI;GACrB,KAAK,KAAK,MAAM,GAAG;GACnB,OAAO,KAAK,MAAM,KAAK;GACvB,QAAQ,KAAK,MAAM,MAAM;EAC1B,CAAC;EACD,KAAKC,aAAa,QAAQ,EAAE;EAC5B,OAAO,IAAI,UAAU,IAAI,IAAI;CAC9B;;;;;;;;CASA,WAAW,OAAmB,SAAqC;EAClE,MAAM,EAAE,MAAM,KAAK,OAAO,WAAW;EACrC,cAAc,MAAM,MAAM;EAC1B,cAAc,KAAK,KAAK;EACxB,gBAAgB,OAAO,OAAO;EAC9B,gBAAgB,QAAQ,QAAQ;EAEhC,MAAM,UAAU,eAAe,KAAK;EACpC,MAAM,aAAa,QAAQ,aAAa,SAAS,UAAA,EAAY,YAAY,CAAC,CAAC,QAAQ,OAAO,EAAE;EAC5F,MAAM,cAAc,QAAQ,eAAe,SAAS;EACpD,IAAI,CAAC,aAAa,CAAC,aAClB,MAAM,IAAI,mBACT,6BACA,+EACD;EAGD,MAAM,SAAS,KAAKF,QAAQ;EAC5B,IAAI,CAAC,QACJ,MAAM,IAAI,iBAAiB,uBAAuB,SAAS,KAAK,SAAS,mCAAmC;EAC7G,MAAM,MAAM,OAAO;EACnB,IAAI,CAAC,KAAK,MAAM,IAAI,cAAc,6BAA6B,iCAAiC;EAEhG,MAAM,MAAM,KAAK,aAAa;EAC9B,MAAM,gBAAgB,IAAI,qBAAqB,SAAS;EACxD,IAAI,QAAQ,eAAe,aAAa,KAAK;EAC7C,MAAM,QAAQ,KAAK,cAAc,IAAI,WAAW,iBAAiB,KAAK,UAAU,aAAa,CAAC,CAAC,CAAC;EAEhG,MAAM,KAAK,KAAKC,aAAa;EAC7B,MAAM,MAAM,aAAa,KAAK;GAC7B;GACA,MAAM,QAAQ,QAAQ,WAAW;GACjC;GACA,MAAM,KAAK,MAAM,IAAI;GACrB,KAAK,KAAK,MAAM,GAAG;GACnB,OAAO,KAAK,MAAM,KAAK;GACvB,QAAQ,KAAK,MAAM,MAAM;EAC1B,CAAC;EACD,KAAKC,aAAa,QAAQ,GAAG;EAC7B,OAAO,IAAI,QAAQ,KAAK,IAAI;CAC7B;;;;;CAMA,YAA4B;EAC3B,OAAO,KAAKF,QAAQ;CACrB;;;;;;CAOA,cAAsB;EACrB,OAAO,KAAKC,aAAa;CAC1B;;CAGA,aAAa,QAAiB,OAAsB;EACnD,OAAO,aAAa,OAAO,WAAW,QAAQ,UAAU,CAAC;EACzD,KAAK,KAAK,UAAU;CACrB;;CAGA,eAAuB;EACtB,MAAM,OAAO,KAAK,KAAK,IAAI;EAC3B,IAAI,MAAM;EACV,IAAI,MACH,KAAK,MAAM,SAAS,KAAK,uBAAuB,SAAS,GAAG,OAAO,GAAG;GACrE,MAAM,KAAK,SAAS,KAAK,OAAO,IAAI,CAAC;GACrC,IAAI,OAAO,QAAQ,KAAK,KAAK,MAAM;EACpC;EAED,OAAO,MAAM;CACd;CAEA,QAAwB;EACvB,MAAM,OAAO,KAAK,KAAK,IAAI;EAC3B,OAAO,OAAO,WAAW,MAAM,QAAQ,IAAI;CAC5C;CAEA,UAA0B;EACzB,MAAM,OAAO,KAAKF,MAAM;EACxB,OAAO,OAAO,WAAW,MAAM,UAAU,IAAI;CAC9C;AACD;AAEA,SAAS,cAAc,OAAe,MAAoB;CACzD,IAAI,CAAC,OAAO,SAAS,KAAK,GACzB,MAAM,IAAI,mBAAmB,oBAAoB,GAAG,KAAK,uCAAuC,OAAO;AACzG;AAEA,SAAS,gBAAgB,OAAe,MAAoB;CAC3D,cAAc,OAAO,IAAI;CACzB,IAAI,SAAS,GAAG,MAAM,IAAI,mBAAmB,sBAAsB,GAAG,KAAK,yBAAyB,OAAO;AAC5G;;AAaA,SAAS,aAAa,KAAe,MAA4B;CAChE,MAAM,QAAQ,UAA2B,cAAc,KAAK,KAAK;CACjE,MAAM,UAAU,QAAiB,UAA2B;EAC3D,MAAM,QAAQ,KAAK,KAAK;EACxB,OAAO,YAAY,KAAK;EACxB,OAAO;CACR;CAEA,MAAM,KAAK,KAAK,MAAM;CAEtB,MAAM,SAAS,OAAO,IAAI,UAAU;CACpC,MAAM,QAAQ,OAAO,QAAQ,SAAS;CACtC,QAAQ,OAAO,MAAM,OAAO,KAAK,EAAE,CAAC;CACpC,QAAQ,OAAO,QAAQ,KAAK,IAAI;CAChC,MAAM,UAAU,OAAO,QAAQ,WAAW;CAC1C,QAAQ,SAAS,SAAS,GAAG;CAC7B,OAAO,QAAQ,QAAQ;CAEvB,MAAM,OAAO,OAAO,IAAI,QAAQ;CAChC,MAAM,OAAO,OAAO,MAAM,QAAQ;CAClC,MAAM,MAAM,OAAO,MAAM,OAAO;CAChC,QAAQ,KAAK,KAAK,OAAO,KAAK,IAAI,CAAC;CACnC,QAAQ,KAAK,KAAK,OAAO,KAAK,GAAG,CAAC;CAClC,MAAM,MAAM,OAAO,MAAM,OAAO;CAChC,QAAQ,KAAK,MAAM,OAAO,KAAK,KAAK,CAAC;CACrC,QAAQ,KAAK,MAAM,OAAO,KAAK,MAAM,CAAC;CACtC,MAAM,WAAW,OAAO,MAAM,YAAY;CAC1C,QAAQ,UAAU,QAAQ,MAAM;CAChC,OAAO,UAAU,SAAS;CAE1B,MAAM,SAAS,OAAO,IAAI,UAAU;CACpC,OAAO,QAAQ,UAAU;CACzB,OAAO,QAAQ,YAAY;CAC3B,MAAM,IAAI,OAAO,QAAQ,KAAK;CAC9B,IAAI,KAAK,SAAS,IAAI;EAErB,MAAM,IAAI,OADA,OAAO,GAAG,KACH,GAAG,KAAK;EACzB,EAAE,cAAc,KAAK;EACrB,IAAI,KAAK,SAAS,KAAK,KAAK,KAAK,GAAG,QAAQ,GAAG,aAAa,UAAU;CACvE;CAEA,OAAO;AACR;;AAaA,SAAS,aAAa,KAAe,MAA4B;CAChE,MAAM,QAAQ,UAA2B,cAAc,KAAK,KAAK;CACjE,MAAM,UAAU,QAAiB,UAA2B;EAC3D,MAAM,QAAQ,KAAK,KAAK;EACxB,OAAO,YAAY,KAAK;EACxB,OAAO;CACR;CAEA,MAAM,MAAM,KAAK,OAAO;CAExB,MAAM,UAAU,OAAO,KAAK,WAAW;CACvC,MAAM,QAAQ,OAAO,SAAS,SAAS;CACvC,QAAQ,OAAO,MAAM,OAAO,KAAK,EAAE,CAAC;CACpC,QAAQ,OAAO,QAAQ,KAAK,IAAI;CAEhC,MAAM,WAAW,OADA,OAAO,SAAS,YACF,GAAG,YAAY;CAC9C,QAAQ,UAAU,kBAAkB,GAAG;CACvC,OAAO,SAAS,QAAQ;CAExB,MAAM,WAAW,OAAO,KAAK,YAAY;CACzC,MAAM,OAAO,OAAO,UAAU,QAAQ;CACtC,QAAQ,MAAM,WAAW,KAAK,KAAK;CAEnC,OADgB,OAAO,UAAU,WACpB,GAAG,YAAY;CAE5B,MAAM,OAAO,OAAO,KAAK,QAAQ;CACjC,MAAM,OAAO,OAAO,MAAM,QAAQ;CAClC,MAAM,MAAM,OAAO,MAAM,OAAO;CAChC,QAAQ,KAAK,KAAK,OAAO,KAAK,IAAI,CAAC;CACnC,QAAQ,KAAK,KAAK,OAAO,KAAK,GAAG,CAAC;CAClC,MAAM,MAAM,OAAO,MAAM,OAAO;CAChC,QAAQ,KAAK,MAAM,OAAO,KAAK,KAAK,CAAC;CACrC,QAAQ,KAAK,MAAM,OAAO,KAAK,MAAM,CAAC;CACtC,MAAM,WAAW,OAAO,MAAM,YAAY;CAC1C,QAAQ,UAAU,QAAQ,MAAM;CAChC,OAAO,UAAU,SAAS;CAE1B,OAAO;AACR;;;;ACvyBA,MAAM,sBAAsB;;AAE5B,MAAM,0BAA0B;;AAEhC,MAAM,wBAAwB;;AAE9B,MAAM,4BAA4B;;AA4ClC,MAAM,cAA6D;CAClE,CAAC,SAAS,UAAU;CACpB,CAAC,WAAW,YAAY;CACxB,CAAC,WAAW,YAAY;CACxB,CAAC,YAAY,aAAa;CAC1B,CAAC,eAAe,gBAAgB;CAChC,CAAC,kBAAkB,mBAAmB;CACtC,CAAC,YAAY,aAAa;CAC1B,CAAC,YAAY,aAAa;CAC1B,CAAC,iBAAiB,kBAAkB;CACpC,CAAC,WAAW,iBAAiB;CAC7B,CAAC,YAAY,kBAAkB;CAC/B,CAAC,eAAe,gBAAgB;AACjC;;;;;;;AAQA,SAAgB,mBAAmB,KAAiC;CACnE,MAAM,OAAO,IAAI,iBAAiB,GAAG;CACrC,MAAM,MAAM,KAAK,OAAO,mBAAmB,CAAC,CAAC;CAE7C,MAAM,QADO,MAAM,IAAI,KAAK,KAAK,cAAc,IAAI,EAAE,CAAC,IAAI,IAAI,mBAAmB,uBAAuB,CAAC,CAAC,GAAA,EACvF,IAAI;CACvB,IAAI,CAAC,MAAM,OAAO,CAAC;CACnB,MAAM,MAAsB,CAAC;CAC7B,KAAK,MAAM,CAAC,OAAO,UAAU,aAAa;EACzC,MAAM,KAAK,WAAW,MAAM,KAAK;EACjC,IAAI,IAAI,IAAI,SAAS,GAAG,eAAe;CACxC;CACA,OAAO;AACR;;;;;;;;;AAUA,SAAS,YAAY,IAAkC;CACtD,MAAM,OAAO,GAAG,eAAe;CAC/B,QAAQ,GAAG,WAAX;EACC,KAAK;EACL,KAAK;EACL,KAAK,QACJ,OAAO;EACR,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK,QACJ,OAAO,SAAS,IAAI,KAAK;EAC1B,KAAK;EACL,KAAK;EACL,KAAK,WAAW;GACf,MAAM,IAAI,OAAO,WAAW,IAAI;GAChC,OAAO,OAAO,SAAS,CAAC,IAAI,IAAI;EACjC;EACA,KAAK,QACJ,OAAO,KAAK,KAAK,CAAC,CAAC,YAAY,MAAM,UAAU,KAAK,KAAK,MAAM;EAChE,KAAK;EACL,KAAK,QACJ,OAAO;EACR,SAEC,OAAO;CACT;AACD;;;;;;;;;;;;AAaA,SAAgB,qBAAqB,KAAmC;CACvE,MAAM,OAAO,IAAI,iBAAiB,GAAG;CACrC,MAAM,MAAM,KAAK,OAAO,qBAAqB,CAAC,CAAC;CAE/C,MAAM,QADO,MAAM,IAAI,KAAK,KAAK,cAAc,IAAI,EAAE,CAAC,IAAI,IAAI,mBAAmB,yBAAyB,CAAC,CAAC,GAAA,EACzF,IAAI;CACvB,IAAI,CAAC,MAAM,OAAO,CAAC;CACnB,MAAM,MAAwB,CAAC;CAC/B,KAAK,MAAM,YAAY,cAAc,IAAI,GAAG;EAC3C,IAAI,SAAS,cAAc,YAAY;EACvC,MAAM,OAAO,KAAK,UAAU,MAAM;EAClC,MAAM,KAAK,kBAAkB,QAAQ;EACrC,IAAI,SAAS,QAAQ,CAAC,IAAI;EAC1B,IAAI,KAAK;GAAE;GAAM,OAAO,YAAY,EAAE;EAAE,CAAC;CAC1C;CACA,OAAO;AACR;;;;AChKA,SAAgB,SAAS,MAAgC;CACxD,MAAM,OAAO,MAAM,IAAI;CACvB,MAAM,OAAO,QAAQ,WAAW,MAAM,QAAQ;CAC9C,QAAQ,QAAQ,KAAK,MAAM,MAAM,MAAM;AACxC;;AAGA,SAAS,iBAAiB,IAAsB;CAC/C,OAAO,GAAG,iBAAiB,SAAS,MAAM,GAAG,cAAc,eAAe,GAAG,cAAc;AAC5F;;AAGA,SAAS,mBAAmB,OAAyB;CACpD,MAAM,KAAK,kBAAkB,KAAK;CAClC,MAAM,OAAO,MAAM,WAAW,IAAI,QAAQ;CAC1C,OAAO,CAAC,EAAE,QAAQ,WAAW,MAAM,MAAM;AAC1C;;AAGA,SAAgB,mBAAmB,MAAiC;CACnE,IAAI,CAAC,MAAM,OAAO,CAAC;CACnB,MAAM,OAAO,WAAW,MAAM,QAAQ;CACtC,MAAM,SAAS,QAAQ,WAAW,MAAM,UAAU;CAClD,IAAI,CAAC,QAAQ,OAAO,CAAC;CACrB,MAAM,MAAiB,CAAC;CACxB,KAAK,IAAI,OAAO,OAAO,YAAY,MAAM,OAAO,KAAK,aAAa;EACjE,IAAI,KAAK,aAAA,GAA2B;EACpC,MAAM,KAAK;EACX,IAAI,iBAAiB,EAAE,KAAK,mBAAmB,EAAE,GAAG;EACpD,IAAI,KAAK,EAAE;CACZ;CACA,OAAO;AACR;;;;;;AAOA,SAAgB,cAAc,QAAiB,GAA2B;CACzE,IAAI,IAAI;CACR,KAAK,IAAI,OAAO,OAAO,YAAY,MAAM,OAAO,KAAK,aAAa;EACjE,IAAI,KAAK,aAAA,GAA2B;EACpC,MAAM,KAAK;EACX,IAAI,iBAAiB,EAAE,GAAG;EAC1B,IAAI,GAAG,iBAAiB,SAAS,KAAK,GAAG,cAAc,UAAU;EACjE,IAAI,MAAM,GAAG,OAAO;EACpB;CACD;CACA,OAAO;AACR;;AAGA,SAAgB,gBAAgB,QAAiC;CAChE,KAAK,IAAI,OAAO,OAAO,YAAY,MAAM,OAAO,KAAK,aAAa;EACjE,IAAI,KAAK,aAAA,GAA2B;EACpC,MAAM,KAAK;EACX,IAAI,CAAC,iBAAiB,EAAE,GAAG,OAAO;CACnC;CACA,OAAO;AACR;;AAGA,SAAgB,gBAAgB,MAAe,KAAsB;CACpE,IAAI,KAAK,IAAI;CACb,KAAK,IAAI,QAAQ,KAAK,YAAY,OAAO,QAAQ,MAAM,aACtD,IAAI,MAAM,aAAA,GAA2B,gBAAgB,OAAkB,GAAG;AAE5E;;;;ACjDA,SAAgB,eAAe,QAAmB,QAAmB,MAA2C;CAC/G,IAAI,SAAS,WACZ,OAAO;EAAE,IAAI,OAAO,WAAW,OAAO;EAAU,IAAI,OAAO,YAAY,OAAO;EAAW,IAAI;EAAG,IAAI;CAAE;CAGvG,MAAM,QAAQ,KAAK,IAAI,OAAO,WAAW,OAAO,UAAU,OAAO,YAAY,OAAO,SAAS;CAC7F,OAAO;EACN,IAAI;EACJ,IAAI;EACJ,KAAK,OAAO,WAAW,OAAO,WAAW,SAAS;EAClD,KAAK,OAAO,YAAY,OAAO,YAAY,SAAS;CACrD;AACD;;;;;;;;;AAUA,SAAgB,cAAc,QAAiB,GAA2B;CACzE,KAAK,IAAI,OAAO,OAAO,YAAY,MAAM,OAAO,KAAK,aAAa;EACjE,IAAI,KAAK,aAAA,GAA2B;EACpC,MAAM,KAAK;EACX,IAAI,GAAG,iBAAiB,SAAS,GAAG;EACpC,QAAQ,GAAG,WAAX;GACC,KAAK;GACL,KAAK;GACL,KAAK,SAAS;IACb,MAAM,OAAO,WAAW,IAAI,QAAQ;IACpC,YAAY,QAAQ,WAAW,MAAM,QAAQ,GAAG,CAAC;IACjD;GACD;GACA,KAAK,SAAS;IACb,MAAM,UAAU,WAAW,IAAI,WAAW;IAC1C,YAAY,WAAW,WAAW,SAAS,QAAQ,GAAG,CAAC;IACvD;GACD;GACA,KAAK;IACJ,YAAY,WAAW,IAAI,QAAQ,GAAG,CAAC;IACvC,iBAAiB,IAAI,CAAC;EAGxB;CACD;AACD;;AAGA,SAAS,YAAY,MAAsB,GAA2B;CACrE,IAAI,CAAC,MAAM;CACX,MAAM,MAAM,WAAW,MAAM,OAAO;CACpC,IAAI,KAAK;EACR,MAAM,IAAI,SAAS,KAAK,KAAK,GAAG,CAAC;EACjC,MAAM,IAAI,SAAS,KAAK,KAAK,GAAG,CAAC;EACjC,IAAI,MAAM,MAAM,QAAQ,KAAK,KAAK,OAAO,KAAK,MAAM,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;EACrE,IAAI,MAAM,MAAM,QAAQ,KAAK,KAAK,OAAO,KAAK,MAAM,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;CACtE;CACA,MAAM,MAAM,WAAW,MAAM,OAAO;CACpC,IAAI,KAAK;EACR,MAAM,KAAK,SAAS,KAAK,KAAK,IAAI,CAAC;EACnC,MAAM,KAAK,SAAS,KAAK,KAAK,IAAI,CAAC;EACnC,IAAI,OAAO,MAAM,QAAQ,KAAK,MAAM,OAAO,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;EAC9E,IAAI,OAAO,MAAM,QAAQ,KAAK,MAAM,OAAO,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;CAC/E;AACD;;;;;;AAOA,SAAS,iBAAiB,cAAuB,GAA2B;CAC3E,MAAM,UAAU,WAAW,cAAc,WAAW;CACpD,MAAM,cAAc,WAAW,WAAW,SAAS,eAAe;CAClE,MAAM,MAAM,eAAe,WAAW,aAAa,OAAO;CAC1D,IAAI,CAAC,KAAK;CACV,MAAM,OAAO,WAAW,KAAK,WAAW;CACxC,IAAI,MACH,KAAK,MAAM,OAAO,YAAY,MAAM,WAAW,GAAG;EACjD,MAAM,IAAI,SAAS,KAAK,KAAK,GAAG,CAAC;EACjC,IAAI,MAAM,MAAM,QAAQ,KAAK,KAAK,OAAO,KAAK,IAAI,GAAG,KAAK,MAAM,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;CAC5E;CAED,KAAK,MAAM,MAAM,YAAY,KAAK,MAAM,GAAG;EAC1C,MAAM,IAAI,SAAS,KAAK,IAAI,GAAG,CAAC;EAChC,IAAI,MAAM,MAAM,QAAQ,IAAI,KAAK,OAAO,KAAK,IAAI,GAAG,KAAK,MAAM,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;CAC3E;AACD;;;ACrGA,MAAM,mBAAmB;AACzB,MAAM,4BAA4B;AAElC,MAAM,4BAA4B;AAElC,MAAMI,gBAAc,IAAI,YAAY;;;;;;;;;;;;AAapC,SAAgB,sBAAsB,MAAkB,WAAuB,WAA0B;CACxG,MAAM,sBAAM,IAAI,IAAY;CAC5B,KAAK,MAAM,QAAQ,UAAU,uBAAuB,SAAS,GAAG,cAAc,GAAG;EAChF,MAAM,KAAK,KAAK,aAAa,KAAK;EAClC,IAAI,IAAI,IAAI,IAAI,EAAE;CACnB;CACA,IAAI,IAAI,SAAS,GAAG;CAEpB,MAAM,aAAa,eAAe,SAAS;CAC3C,IAAI,CAAC,YAAY;CACjB,MAAM,eAAe,IAAI,IAAI,YAAY,YAAY,YAAY,CAAC,CAAC,KAAK,OAAO,CAAC,KAAK,IAAI,SAAS,GAAG,EAAE,CAAU,CAAC;CAElH,MAAM,WAAW,sBAAsB,IAAI;CAC3C,MAAM,WAAW,SAAS,IAAI;CAC9B,IAAI,CAAC,UAAU;CAEf,MAAM,aAAwB,CAAC;CAC/B,KAAK,MAAM,MAAM,KAAK;EACrB,MAAM,MAAM,aAAa,IAAI,EAAE;EAC/B,IAAI,KAAK,WAAW,KAAK,GAAG;CAC7B;CACA,IAAI,eAAe,UAAU,UAAU,GAAG,SAAS,UAAU;AAC9D;;;;;;;;;AAUA,SAAS,eAAe,UAAmB,QAAoC;CAC9E,MAAM,UAAU,IAAI,IAAI,YAAY,UAAU,YAAY,CAAC,CAAC,KAAK,OAAO,KAAK,IAAI,SAAS,CAAC,CAAC;CAC5F,IAAI,QAAQ;CACZ,KAAK,MAAM,SAAS,QAAQ;EAC3B,MAAM,KAAK,KAAK,OAAO,SAAS;EAChC,IAAI,CAAC,MAAM,QAAQ,IAAI,EAAE,GAAG;EAC5B,SAAS,YAAY,gBAAgB,QAAQ,CAAC,CAAC,WAAW,OAAO,IAAI,CAAC;EACtE,QAAQ,IAAI,EAAE;EACd,QAAQ;CACT;CACA,OAAO;AACR;;;;;;;;;;;;;;;;;AAkBA,SAAgB,iBAAiB,MAAkB,WAA6B;CAC/E,MAAM,aAAa,eAAe,SAAS;CAC3C,IAAI,CAAC,YAAY;CAEjB,MAAM,WAAW,sBAAsB,IAAI;CAC3C,MAAM,WAAW,SAAS,IAAI;CAC9B,IAAI,CAAC,UAAU;CAEf,IAAI,UAAU,eAAe,UAAU,YAAY,YAAY,YAAY,CAAC;CAE5E,MAAM,YAAY,KAAK,YAAY,KAAK;CACxC,IAAI,aAAa,KAAK,UAAU,KAAK,MAAM,WAAW;EACrD,SAAS,aAAa,OAAO,SAAS;EACtC,UAAU;CACX;CACA,IAAI,SAAS,SAAS,UAAU;AACjC;;AAGA,SAAS,eAAe,KAAiC;CACxD,MAAM,OAAO,IAAI,mBAAmB,yBAAyB,CAAC,CAAC;CAC/D,OAAO,OAAO,KAAK,IAAI,kBAAkB;AAC1C;;;;;AAMA,SAAS,sBAAsB,MAAwB;CACtD,MAAM,WAAW,KAAK,IAAI,mBAAmB,yBAAyB,CAAC,CAAC;CACxE,IAAI,UAAU,OAAO;CACrB,MAAM,WAAW,KAAK,IAAI,oBAAoB,sBAAsB;CACpE,MAAM,MAAM,sFAAsF,SAAS,EAAE,SAAS,0BAA0B;CAChJ,MAAM,OAAO,KAAK,IAAI,QAAQ,UAAU,2BAA2BA,cAAY,OAAO,GAAG,CAAC;CAE1F,KADsB,IAAI,iBAAiB,KAAK,iBAAiB,QAC1D,CAAC,CAAC,IAAI,kBAAkB,iBAAiB,KAAK,iBAAiB,UAAU,QAAQ,CAAC;CACzF,OAAO;AACR;;;;;;;;;;;;;;;;;;;;;;AC/FA,SAAgB,eAAe,MAAkB,gBAA8B;CAC9E,MAAM,WAAW,KAAK;CACtB,MAAM,WAAW,KAAK,IAAI,iBAAiB,SAAS,QAAQ;CAC5D,KAAK,MAAM,OAAO,SAAS,OAAO,gBAAgB,GACjD,IAAI,SAAS,cAAc,IAAI,EAAE,MAAM,gBAAgB;CAExD,MAAM,QAAQ,SAAS,IAAI,kBAAkB,iBAAiB,SAAS,UAAU,cAAc,CAAC,CAAC,CAAC;CAElG,MAAM,OAAO,SAAS,IAAI;CAC1B,IAAI,CAAC,MACJ,MAAM,IAAI,iBACT,4BACA,kEACD;CAGD,MAAM,MAAM,cAAc,MAAM,oBAAoB;EACnD;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACD,CAAC;CACD,MAAM,QAAQ,cAAc,SAAS,KAAK,eAAe;CACzD,QAAQ,OAAO,MAAM,OAAO,mBAAmB,IAAI,CAAC,CAAC;CACrD,QAAQ,OAAO,QAAQ,KAAK;CAC5B,IAAI,YAAY,KAAK;CACrB,SAAS,UAAU;AACpB;;;;;;;;AASA,SAAgB,eAAe,MAAkB,iBAAiC;CACjF,IAAI,gBAAgB,WAAW,GAAG;CAClC,MAAM,WAAW,KAAK;CACtB,MAAM,OAAO,SAAS,IAAI;CAC1B,MAAM,MAAM,QAAQ,WAAW,MAAM,kBAAkB;CACvD,IAAI,CAAC,KAAK;CACV,MAAM,OAAO,KAAK,IAAI,iBAAiB,SAAS,QAAQ;CACxD,MAAM,UAAU,IAAI,IAAI,eAAe;CACvC,MAAM,UAAU,YAAY,KAAK,eAAe;CAGhD,MAAM,cAAc,UAA4B;EAC/C,MAAM,QAAQ,KAAK,OAAO,MAAM;EAChC,OAAO,QAAQ,QAAQ,IAAI,KAAK,cAAc,KAAK,CAAC,IAAI;CACzD;CACA,MAAM,UAAU,CAAC,GAAG,QAAQ,OAAO,UAAU,GAAG,GAAG,QAAQ,QAAQ,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC;CACxF,IAAI,QAAQ,OAAO,OAAO,MAAM,UAAU,QAAQ,EAAE,GAAG;CACvD,KAAK,MAAM,SAAS,SAAS,IAAI,YAAY,KAAK;CAClD,SAAS,UAAU;AACpB;;;;;;;;;;;;;AAcA,SAAS,mBAAmB,MAA0B;CACrD,IAAI,MAAM;CACV,MAAM,WAAW,KAAK;CACtB,MAAM,OAAO,SAAS,IAAI;CAC1B,MAAM,YAAY,QAAQ,WAAW,MAAM,kBAAkB;CAC7D,IAAI,WACH,KAAK,MAAM,SAAS,YAAY,WAAW,eAAe,GAAG;EAC5D,MAAM,KAAK,SAAS,KAAK,OAAO,IAAI,CAAC;EACrC,IAAI,OAAO,QAAQ,KAAK,KAAK,MAAM;CACpC;CAGD,MAAM,WAAW,KAAK,IAAI,iBAAiB,SAAS,QAAQ;CAC5D,KAAK,MAAM,OAAO,SAAS,OAAO,gBAAgB,GAAG;EAEpD,MAAM,aADa,KAAK,IAAI,KAAK,SAAS,cAAc,IAAI,EAAE,CAClC,CAAC,EAAE,IAAI;EACnC,MAAM,YAAY,cAAc,WAAW,YAAY,kBAAkB;EACzE,IAAI,CAAC,WAAW;EAChB,KAAK,MAAM,SAAS,YAAY,WAAW,eAAe,GAAG;GAC5D,MAAM,KAAK,SAAS,KAAK,OAAO,IAAI,CAAC;GACrC,IAAI,OAAO,QAAQ,KAAK,KAAK,MAAM;EACpC;CACD;CACA,OAAO,MAAM;AACd;;AAGA,SAAgB,kBAAkB,MAAkB,gBAA8B;CACjF,MAAM,aAAa,KAAK,IAAI,KAAK,cAAc;CAC/C,MAAM,OAAO,YAAY,IAAI;CAC7B,MAAM,MAAM,QAAQ,WAAW,MAAM,kBAAkB;CACvD,IAAI,CAAC,cAAc,CAAC,KAAK;CACzB,sBAAsB,KAAK,CAAC,eAAe,CAAC;CAC5C,WAAW,UAAU;AACtB;;;;;;;AAQA,SAAgB,kBAAkB,MAAkB,gBAAwB,gBAA8B;CACzG,MAAM,aAAa,KAAK,IAAI,KAAK,cAAc;CAC/C,MAAM,OAAO,YAAY,IAAI;CAC7B,IAAI,CAAC,cAAc,CAAC,MAAM;CAG1B,MAAM,QADa,KAAK,IAAI,iBAAiB,cACtB,CAAC,CAAC,IAAI,kBAAkB,iBAAiB,gBAAgB,cAAc,CAAC,CAAC,CAAC;CACjG,MAAM,MAAM,cAAc,MAAM,oBAAoB;EAAC;EAAgB;EAAY;EAAQ;EAAc;CAAU,CAAC;CAClH,MAAM,QAAQ,cAAc,WAAW,KAAK,eAAe;CAC3D,QAAQ,OAAO,MAAM,OAAO,mBAAmB,IAAI,CAAC,CAAC;CACrD,QAAQ,OAAO,QAAQ,KAAK;CAC5B,IAAI,YAAY,KAAK;CACrB,WAAW,UAAU;AACtB;;;AC1JA,MAAM,4BAA4B;AAClC,MAAM,4BAA4B;;;;;;;;;;;AAgClC,SAAgB,SAAS,KAAoB,gBAAgC;CAC5E,MAAM,WAAW,IAAI,SAAS,IAAI,cAAc;CAChD,IAAI,UAAU,OAAO;CAErB,MAAM,aAAa,IAAI,OAAO,KAAK,cAAc;CACjD,IAAI,CAAC,YACJ,MAAM,IAAI,iBAAiB,wBAAwB,2CAA2C,gBAAgB;CAE/G,MAAM,cAAc,IAAI,KAAK,IAAI,oBAAoB,cAAc;CACnE,IAAI,KAAK,IAAI,QAAQ,aAAa,WAAW,aAAa,WAAW,KAAK;CAE1E,IAAI,SAAS,IAAI,gBAAgB,WAAW;CAE5C,MAAM,WAAW,WAAW,gBAAgB;CAC5C,MAAM,aAAa,IAAI,OAAO,iBAAiB,cAAc;CAC7D,MAAM,aAAa,IAAI,KAAK,IAAI,iBAAiB,WAAW;CAC5D,KAAK,MAAM,OAAO,YAAY;EAE7B,IAAI,IAAI,SAAA,kFAA0B;EAElC,IAAI,YAAY,IAAI,SAAA,mFAA2B;EAC/C,IAAI,IAAI,eAAe,YAAY;GAClC,WAAW,UAAU,IAAI,IAAI,IAAI,MAAM,IAAI,QAAQ,UAAU;GAC7D;EACD;EACA,MAAM,oBAAoB,SAAS,KAAK,WAAW,cAAc,IAAI,EAAE,CAAC;EACxE,WAAW,UAAU,IAAI,IAAI,IAAI,MAAM,iBAAiB,aAAa,iBAAiB,CAAC;CACxF;CAEA,IAAI,UAAU;EACb,kBAAkB,IAAI,MAAM,WAAW;EAOvC,eAAe,IAAI,MAAM,WAAW;CACrC;CACA,IAAI,WAAW,gBAAgB,2BAC9B,qBAAqB,KAAK,YAAY,WAAW;CAGlD,OAAO;AACR;;;;;;;;AASA,SAAS,qBACR,KACA,kBACA,gBACO;CACP,MAAM,YAAY,iBAAiB,OAAO,gBAAgB,CAAC,CAAC;CAC5D,IAAI,CAAC,WAAW;CAChB,MAAM,iBAAiB,IAAI,SAAS,IAAI,iBAAiB,cAAc,UAAU,EAAE,CAAC;CACpF,IAAI,CAAC,gBAAgB;CACrB,kBAAkB,IAAI,MAAM,gBAAgB,cAAc;AAC3D;;;;;;;;;;;;;;;;;;;;;;;;;;ACnFA,SAAgB,mBACf,MACA,KACA,YACA,cACA,UACA,UACO;CACP,MAAM,WAAsB,CAAC;CAC7B,gBAAgB,MAAM,QAAQ;CAC9B,KAAK,MAAM,MAAM,UAAU;EAC1B,MAAM,OAAwC,CAAC;EAC/C,MAAM,QAAQ,GAAG;EACjB,KAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;GACtC,MAAM,IAAI,MAAM,KAAK,CAAC;GACtB,IAAI,CAAC,KAAK,EAAE,iBAAiB,SAAS,KAAK,CAAC,EAAE,OAAO;GACrD,IAAI,CAAC,WAAW,IAAI,EAAE,KAAK,GAAG;GAC9B,KAAK,KAAK;IAAE,OAAO,EAAE,aAAa,EAAE;IAAM,IAAI,EAAE;GAAM,CAAC;EACxD;EACA,KAAK,MAAM,EAAE,OAAO,QAAQ,MAC3B,QAAQ,IAAI,KAAK,SAAS,SAAS,KAAK,YAAY,IAAI,cAAc,UAAU,QAAQ,CAAC;CAE3F;AACD;;;;;;;;;;;AAYA,SAAS,SACR,KACA,YACA,IACA,cACA,UACA,UACS;CACT,MAAM,MAAM,GAAG,WAAW,eAAe,GAAG;CAC5C,MAAM,SAAS,SAAS,IAAI,GAAG;CAC/B,IAAI,QAAQ,OAAO;CACnB,MAAM,MAAM,WAAW,IAAI,EAAE;CAC7B,IAAI,CAAC,KACJ,MAAM,IAAI,mBACT,0BACA,oBAAoB,WAAW,eAAe,4BAA4B,IAC3E;CACD,MAAM,QACL,IAAI,eAAe,aAChB,SAAS,IAAI,IAAI,MAAM,IAAI,QAAQ,UAAU,CAAC,CAAC,KAC/C,SAAS,IAAI,IAAI,MAAM,iBAAiB,cAAc,SAAS,KAAK,WAAW,cAAc,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;CACxG,SAAS,IAAI,KAAK,KAAK;CACvB,OAAO;AACR;;;;;;;;;;;;;;;;;ACnDA,MAAM,4CAA4C;CACjD;CACA;CACA;CACA;CACA;CACA;CACA;AACD;;;;;;AAOA,MAAM,gCAAoE;CACzE,SAAS;EAAC;EAAU;EAAY;CAAc;CAC9C,MAAM,CAAC,YAAY,cAAc;CACjC,QAAQ,CAAC,cAAc;CACvB,YAAY,CAAC;AACd;;;;;;;;;AA0BA,SAAgB,mBAAmB,MAAoB,QAAsB,KAA0B;CACtG,MAAM,aAAa,OAAO,iBAAiB,IAAI;CAC/C,MAAM,YAAY,cAAc,WAAW,YAAY,mBAAmB;CAC1E,MAAM,gBAAgB,YAAY,YAAY,WAAW,gBAAgB,IAAI,CAAC;CAC9E,IAAI,cAAc,WAAW,GAAG;CAEhC,MAAM,iBAAiB,OAAO,IAAI,iBAAiB,OAAO,iBAAiB,QAAQ;CACnF,MAAM,WAAmC,CAAC;CAC1C,KAAK,MAAM,YAAY,eAAe;EACrC,MAAM,UAAU,WAAW,UAAU,QAAQ;EAC7C,MAAM,WAAW,UAAU,KAAK,SAAS,UAAU,IAAI;EACvD,IAAI,CAAC,WAAW,CAAC,UAAU;EAG3B,MAAM,WAA6C,CAAC;EACpD,KAAK,MAAM,QAAQ;GAAC;GAAU;GAAe;EAAS,GAAG;GACxD,MAAM,QAAQ,KAAK,SAAS,IAAI;GAChC,IAAI,UAAU,MAAM,SAAS,KAAK;IAAE;IAAM;GAAM,CAAC;EAClD;EAEA,MAAM,QAAuC,CAAC;EAC9C,KAAK,MAAM,QAAQ,qBAAqB;GACvC,MAAM,UAAU,WAAW,UAAU,KAAK,MAAM;GAChD,MAAM,SAAS,WAAW,KAAK,SAAS,MAAM;GAC9C,IAAI,CAAC,WAAW,CAAC,QAAQ;GAGzB,MAAM,KAAK;IAAE;IAAM,kBAAkB,SAAS,KAAK,eAAe,cAAc,MAAM,CAAC;GAAE,CAAC;EAC3F;EACA,SAAS,KAAK;GAAE;GAAU;GAAU;EAAM,CAAC;CAC5C;CACA,yBAAyB,MAAM,QAAQ;AACxC;;;;;;;;AASA,SAAgB,4BAA4B,MAAoB,OAA6B;CAC5F,MAAM,WAAmC,CAAC;CAC1C,KAAK,MAAM,QAAQ,OAAO;EACzB,IAAI,CAAC,KAAK,UAAU;EACpB,MAAM,WAA6C,CAAC;EACpD,IAAI,KAAK,WAAW,KAAA,GAAW,SAAS,KAAK;GAAE,MAAM;GAAU,OAAO,KAAK;EAAO,CAAC;EACnF,IAAI,KAAK,gBAAgB,KAAA,GAAW,SAAS,KAAK;GAAE,MAAM;GAAe,OAAO,OAAO,KAAK,WAAW;EAAE,CAAC;EAC1G,IAAI,KAAK,YAAY,KAAA,GAAW,SAAS,KAAK;GAAE,MAAM;GAAW,OAAO,OAAO,KAAK,OAAO;EAAE,CAAC;EAE9F,MAAM,QAAuC,CAAC;EAC9C,KAAK,MAAM,QAAQ,qBAAqB;GACvC,MAAM,OAAO,KAAK,MAAM,MAAM,MAAM,EAAE,SAAS,IAAI;GACnD,IAAI,CAAC,MAAM,OAAO;GAClB,MAAM,QAAQ,KAAK;GACnB,MAAM,KAAK;IACV;IACA,kBAAkB;KACjB,MAAM,WAAW,KAAK,IAAI,oBAAoB,0BAA0B;KACxE,KAAK,IAAI,QAAQ,UAAU,wBAAwB,KAAK;KACxD,OAAO;IACR;GACD,CAAC;EACF;EACA,IAAI,MAAM,SAAS,GAAG,SAAS,KAAK;GAAE,UAAU,KAAK;GAAU;GAAU;EAAM,CAAC;CACjF;CACA,yBAAyB,MAAM,QAAQ;AACxC;;;;;;;;;;;AAYA,SAAS,yBAAyB,MAAoB,SAAuC;CAC5F,IAAI,QAAQ,WAAW,GAAG;CAE1B,MAAM,WAAW,KAAK;CACtB,MAAM,WAAW,SAAS,IAAI;CAC9B,IAAI,CAAC,UACJ,MAAM,IAAI,iBACT,4BACA,uEACD;CACD,MAAM,WAAW,KAAK,IAAI,iBAAiB,SAAS,QAAQ;CAE5D,MAAM,YAAY,cAAc,UAAU,qBAAqB,yCAAyC;CACxG,MAAM,mCAAmB,IAAI,IAAqB;CAClD,KAAK,MAAM,SAAS,YAAY,WAAW,gBAAgB,GAAG;EAC7D,MAAM,OAAO,WAAW,OAAO,QAAQ;EACvC,MAAM,WAAW,QAAQ,KAAK,MAAM,UAAU;EAC9C,IAAI,UAAU,iBAAiB,IAAI,UAAU,KAAK;CACnD;CAEA,IAAI,YAAY;CAChB,KAAK,MAAM,YAAY,SAAS;EAG/B,IAAI,cAAc,iBAAiB,IAAI,SAAS,QAAQ;EACxD,IAAI,CAAC,aAAa;GACjB,cAAc,cAAc,SAAS,KAAK,gBAAgB;GAC1D,MAAM,aAAa,cAAc,SAAS,KAAK,QAAQ;GACvD,QAAQ,YAAY,YAAY,SAAS,QAAQ;GACjD,KAAK,MAAM,EAAE,MAAM,WAAW,SAAS,UAAU,QAAQ,YAAY,MAAM,KAAK;GAChF,YAAY,YAAY,UAAU;GAClC,UAAU,YAAY,WAAW;GACjC,iBAAiB,IAAI,SAAS,UAAU,WAAW;EACpD;EAEA,KAAK,MAAM,QAAQ,SAAS,OAAO;GAClC,IAAI,WAAW,aAAa,KAAK,KAAK,MAAM,GAAG;GAI/C,KAAK,IAAI,aAAa,cAAc,qBAAqB,sBAAsB;GAC/E,MAAM,cAAc,KAAK,WAAW;GACpC,MAAM,QAAQ,SAAS,IAAI,eAAe,iBAAiB,SAAS,UAAU,WAAW,CAAC,CAAC,CAAC;GAE5F,MAAM,aAAa,cAAc,SAAS,KAAK,KAAK,KAAK,MAAM;GAC/D,QAAQ,YAAY,QAAQ,KAAK;GACjC,cAAc,aAAa,YAAY,8BAA8B,KAAK,KAAK;GAC/E,YAAY;EACb;CACD;CAEA,IAAI,WAAW,SAAS,UAAU;AACnC;;;;;;;;;;;;;;;;ACpMA,SAAS,aAAa,MAA+B;CACpD,MAAM,OAAO,WAAW,MAAM,QAAQ;CACtC,OAAO,OAAO,WAAW,MAAM,MAAM,IAAI;AAC1C;;;;;;AAOA,SAAS,oBACR,WACA,WACA,gBACA,gBACiB;CACjB,IAAI,aAAa,aAAa,SAAS,GAAG,OAAO;CACjD,MAAM,aAAa,iBAAkB,UAAU,KAAK,cAAc,CAAC,EAAE,IAAI,mBAAmB,OAAQ;CACpG,MAAM,aAAa,iBAAkB,UAAU,KAAK,cAAc,CAAC,EAAE,IAAI,mBAAmB,OAAQ;CACpG,QAAQ,cAAc,aAAa,UAAU,OAAO,cAAc,aAAa,UAAU,MAAM;AAChG;;;;;;;;;AAUA,SAAgB,qBAAqB,WAAuB,eAAuC;CAGlG,MAAM,QAAQ,uBAAuB,WAAW,aAAa;CAC7D,MAAM,gBAAgB,MAAM;CAC5B,OAAO;EACN,QAAQ,MAAM;EACd,WAAW,MAAM;EACjB,WAAW,gBAAgB,WAAW,eAAe,aAAa,IAAI;EACtE,qBAAqB,oBAAoB,WAAW,MAAM,WAAW,MAAM,gBAAgB,MAAM,cAAc;EAC/G,YAAY,MAAM;EAClB,YAAY,MAAM;CACnB;AACD;;;;;;;;;;;;AC7CA,SAAgB,qBAAqB,MAA8B;CAClE,MAAM,OAAO,KAAK,iBAAiB,IAAI;CACvC,MAAM,MAAM,QAAQ,WAAW,MAAM,kBAAkB;CACvD,IAAI,CAAC,KAAK,OAAO,CAAC;CAClB,MAAM,OAAO,KAAK,IAAI,iBAAiB,KAAK,iBAAiB,QAAQ;CACrE,MAAM,MAAgB,CAAC;CACvB,KAAK,MAAM,SAAS,YAAY,KAAK,eAAe,GAAG;EACtD,MAAM,QAAQ,KAAK,OAAO,MAAM;EAChC,IAAI,OAAO,IAAI,KAAK,KAAK,cAAc,KAAK,CAAC;CAC9C;CACA,OAAO;AACR;;AAGA,SAAgB,kBAAkB,MAAoB,gBAAkC;CACvF,MAAM,OAAO,KAAK,IAAI,KAAK,cAAc,CAAC,EAAE,IAAI;CAChD,MAAM,MAAM,QAAQ,WAAW,MAAM,kBAAkB;CACvD,IAAI,CAAC,KAAK,OAAO,CAAC;CAClB,MAAM,OAAO,KAAK,IAAI,iBAAiB,cAAc;CACrD,MAAM,MAAgB,CAAC;CACvB,KAAK,MAAM,SAAS,YAAY,KAAK,eAAe,GAAG;EACtD,MAAM,QAAQ,KAAK,OAAO,MAAM;EAChC,IAAI,OAAO,IAAI,KAAK,KAAK,cAAc,KAAK,CAAC;CAC9C;CACA,OAAO;AACR;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACqBA,SAAgB,oBACf,MACA,KACA,QACA,aACA,eACS;CACT,MAAM,aAAa,qBAAqB,OAAO,KAAK,YAAY,QAAQ;CACxE,MAAM,EAAE,aAAa,WAAW,YAAY,kBAAkB,MAAM,KAAK,QAAQ,aAAa,aAAa;CAC3G,aAAa,WAAW,UAAU;CAClC,QAAQ,UAAU;CAClB,OAAO;AACR;;;;;;;;;;;;;;;;;;;;;;AAuBA,SAAgB,mBACf,MACA,KACA,QACA,aACA,eACA,eACS;CACT,MAAM,EAAE,aAAa,WAAW,YAAY,kBAAkB,MAAM,KAAK,QAAQ,aAAa,aAAa;CAC3G,aAAa,SAAS;CACtB,IAAI,eAAe;EAElB,MAAM,QAAQ,uBAAuB,OAAO,KAAK,YAAY,QAAQ;EACrE,mBAAmB,WAAW;GAAE,QAAQ,MAAM;GAAQ,WAAW,MAAM;EAAU,CAAC;EAClF,sBAAsB,MAAM,OAAO,KAAK,SAAS;CAClD;CACA,QAAQ,UAAU;CAClB,OAAO;AACR;;;;;;;;;;;;;;;;;;AAmBA,SAAgB,kBACf,MACA,KACA,QACA,aACA,eACe;CACf,MAAM,aAAa,0BAA0B,IAAI;CAIjD,MAAM,aAAa,OAAO,IAAI,KAAK,YAAY,QAAQ;CACvD,IAAI,CAAC,YACJ,MAAM,IAAI,iBACT,wBACA,2CAA2C,YAAY,UACxD;CACD,MAAM,cAAc,KAAK,IAAI,oBAAoB,YAAY,QAAQ;CACrE,MAAM,UAAU,KAAK,IAAI,QAAQ,aAAa,WAAW,aAAa,WAAW,KAAK;CACtF,MAAM,YAAY,QAAQ,IAAI;CAC9B,IAAI,CAAC,WACJ,MAAM,IAAI,iBAAiB,4BAA4B,kBAAkB,YAAY,qBAAqB;CAI3G,MAAM,aAAa,OAAO,IAAI,iBAAiB,YAAY,QAAQ;CACnE,MAAM,aAAa,KAAK,IAAI,iBAAiB,WAAW;CACxD,KAAK,MAAM,OAAO,YAAY;EAC7B,IAAI,IAAI,SAAA,kFAA0B;EAClC,IAAI,IAAI,SAAA,mFAA2B;GAClC,WAAW,UAAU,IAAI,IAAI,kBAAkB,iBAAiB,aAAa,UAAU,CAAC;GACxF;EACD;EACA,IAAI,IAAI,eAAe,YAAY;GAClC,WAAW,UAAU,IAAI,IAAI,IAAI,MAAM,IAAI,QAAQ,UAAU;GAC7D;EACD;EACA,MAAM,YAAY,SAAS,KAAK,WAAW,cAAc,IAAI,EAAE,CAAC;EAChE,WAAW,UAAU,IAAI,IAAI,IAAI,MAAM,iBAAiB,aAAa,SAAS,CAAC;CAChF;CAMA,IAAI,eAAe,oBAAoB,MAAM,KAAK,WAAW,aAAa,YAAY,QAAQ;CAE9F,OAAO;EAAE;EAAa;EAAW;CAAQ;AAC1C;;;;;;;;;;;;;;;;AAiBA,SAAS,oBACR,MACA,KACA,WACA,aACA,eACO;CACP,MAAM,YAAY,IAAI;CACtB,MAAM,iBAAiB,iBAAiB,WAAW,eAAe,gBAAgB;CAClF,MAAM,iBAAiB,iBAAiB,iBAAiB,WAAW,gBAAgB,gBAAgB,IAAI;CACxG,MAAM,OAAO,WAAW,WAAW,QAAQ;CAC3C,MAAM,SAAS,QAAQ,WAAW,MAAM,UAAU;CAClD,IAAI,CAAC,QAAQ;CAEb,MAAM,MAAM,gBAAgB,SAAS;CACrC,MAAM,YAAY,KAAK,IAAI,iBAAiB,WAAW;CACvD,MAAM,2BAAW,IAAI,IAAoB;CAEzC,MAAM,SAAS,gBAAgB,MAAM;CAErC,KAAK,MAAM,YAAY,CAAC,gBAAgB,cAAc,GAAG;EACxD,IAAI,CAAC,UAAU;EACf,MAAM,cAAc,mBAAmB,UAAU,KAAK,QAAQ,CAAC,EAAE,IAAI,mBAAmB,IAAI;EAC5F,IAAI,YAAY,WAAW,GAAG;EAC9B,MAAM,aAAa,UAAU,iBAAiB,QAAQ;EACtD,KAAK,MAAM,QAAQ,aAAa;GAC/B,MAAM,WAAW,IAAI,WAAW,MAAM,IAAI;GAC1C,mBAAmB,UAAU,KAAK,YAAY,aAAa,WAAW,QAAQ;GAC9E,OAAO,aAAa,UAAU,MAAM;EACrC;CACD;AACD;;;;;;;;AASA,SAAS,0BAA0B,MAA4B;CAC9D,MAAM,WAAW,KAAK,IAAI,iBAAiB,KAAK,iBAAiB,QAAQ;CACzE,MAAM,YAAY,SAAS,OAAO,gBAAgB,CAAC,CAAC;CACpD,IAAI,CAAC,WACJ,MAAM,IAAI,mBACT,qCACA,2EACD;CACD,MAAM,iBAAiB,SAAS,cAAc,UAAU,EAAE;CAC1D,MAAM,aAAa,KAAK,IAAI,iBAAiB,cAAc;CAC3D,MAAM,YAAY,WAAW,OAAO,gBAAgB,CAAC,CAAC;CACtD,IAAI,CAAC,WACJ,MAAM,IAAI,mBACT,qCACA,2EACD;CACD,OAAO,WAAW,cAAc,UAAU,EAAE;AAC7C;;;;;;;;;;;;;AC/OA,MAAM,4BAA4B;AAClC,MAAM,qBAAqB;AAE3B,MAAMC,gBAAc,IAAI,YAAY;;;;;;;;;;;;;;;;;;AAmBpC,SAAgB,WACf,MACA,QACA,KACA,qBACA,kBACO;CACP,MAAM,kBAAkB,OAAO,IAAI,iBAAiB,mBAAmB;CACvE,MAAM,WAAW,gBAAgB,OAAO,eAAe,CAAC,CAAC;CACzD,IAAI,CAAC,UAAU;CACf,MAAM,sBAAsB,gBAAgB,cAAc,SAAS,EAAE;CACrE,MAAM,kBAAkB,OAAO,IAAI,KAAK,mBAAmB;CAC3D,IAAI,CAAC,iBAAiB;CAGtB,MAAM,mBAAmB,KAAK,IAAI,oBAAoB,mBAAmB;CACzE,KAAK,IAAI,QAAQ,kBAAkB,gBAAgB,aAAa,gBAAgB,KAAK;CACrF,KAAK,IAAI,iBAAiB,gBAAgB,CAAC,CAAC,IAAI,iBAAiB,iBAAiB,kBAAkB,gBAAgB,CAAC;CAIrH,MAAM,kBAAkB,OAAO,IAAI,iBAAiB,mBAAmB;CACvE,MAAM,kBAAkB,KAAK,IAAI,iBAAiB,gBAAgB;CAClE,KAAK,MAAM,OAAO,iBAAiB;EAClC,IAAI,IAAI,SAAA,6EAAoB;GAE3B,gBAAgB,UAAU,IAAI,IAAI,WAAW,iBAAiB,kBAAkB,gBAAgB,CAAC;GACjG;EACD;EACA,IAAI,IAAI,SAAA,mFAA2B;GAClC,MAAM,cAAc,kBAAkB,MAAM,KAAK,gBAAgB,cAAc,IAAI,EAAE,CAAC;GACtF,gBAAgB,UAAU,IAAI,IAAI,kBAAkB,iBAAiB,kBAAkB,WAAW,CAAC;GACnG;EACD;EACA,IAAI,IAAI,eAAe,YAAY;GAClC,gBAAgB,UAAU,IAAI,IAAI,IAAI,MAAM,IAAI,QAAQ,UAAU;GAClE;EACD;EACA,MAAM,YAAY,SAAS,KAAK,gBAAgB,cAAc,IAAI,EAAE,CAAC;EACrE,gBAAgB,UAAU,IAAI,IAAI,IAAI,MAAM,iBAAiB,kBAAkB,SAAS,CAAC;CAC1F;AACD;;;;;;;;;AAUA,SAAS,kBAAkB,MAAoB,KAAoB,2BAA2C;CAC7G,MAAM,WAAW,KAAK;CACtB,MAAM,WAAW,KAAK,IAAI,iBAAiB,SAAS,QAAQ;CAC5D,MAAM,WAAW,SAAS,OAAO,gBAAgB,CAAC,CAAC;CACnD,IAAI,UAAU,OAAO,SAAS,cAAc,SAAS,EAAE;CAGvD,OAAO,oBAAoB,MAAM,SAAS,KAAK,yBAAyB,CAAC;AAC1E;;;;;;;;;;;AAYA,SAAS,oBAAoB,MAAoB,qBAAqC;CACrF,MAAM,WAAW,KAAK;CAEtB,MAAM,QADW,KAAK,IAAI,iBAAiB,SAAS,QAC/B,CAAC,CAAC,IAAI,kBAAkB,iBAAiB,SAAS,UAAU,mBAAmB,CAAC,CAAC,CAAC;CAEvG,MAAM,OAAO,SAAS,IAAI;CAC1B,IAAI,CAAC,MACJ,MAAM,IAAI,iBACT,4BACA,wEACD;CAED,MAAM,MAAM,cAAc,MAAM,sBAAsB;EACrD;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACD,CAAC;CAED,sBAAsB,KAAK,CAAC,iBAAiB,CAAC;CAC9C,MAAM,QAAQ,cAAc,SAAS,KAAK,iBAAiB;CAC3D,QAAQ,OAAO,QAAQ,KAAK;CAC5B,IAAI,YAAY,KAAK;CACrB,SAAS,UAAU;CACnB,OAAO;AACR;;;;;;;;AASA,SAAgB,yBAAyB,MAAoB,QAAmD;CAC/G,MAAM,WAAW,KAAK;CACtB,MAAM,WAAW,KAAK,IAAI,iBAAiB,SAAS,QAAQ;CAC5D,MAAM,WAAW,SAAS,OAAO,gBAAgB,CAAC,CAAC;CACnD,IAAI,UAAU,OAAO,SAAS,cAAc,SAAS,EAAE;CAEvD,MAAM,iBAAiB,KAAK,IAAI,oBAAoB,oCAAoC;CACxF,KAAK,IAAI,QAAQ,gBAAgB,2BAA2BA,cAAY,OAAO,OAAO,GAAG,CAAC;CAI1F,MAAM,gBAAgB,KAAK,IAAI,oBAAoB,uBAAuB;CAC1E,KAAK,IAAI,QAAQ,eAAe,oBAAoBA,cAAY,OAAO,OAAO,QAAQ,CAAC;CACvF,KAAK,IAAI,iBAAiB,cAAc,CAAC,CAAC,IAAI,WAAW,iBAAiB,gBAAgB,aAAa,CAAC;CAExG,OAAO,oBAAoB,MAAM,cAAc;AAChD;;;;;;;;;;;;;;;;;;AC/IA,MAAM,8CAA8B,IAAI,IAAI;CAC3C;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACD,CAAC;;;;;;AAOD,SAAgB,cAAc,MAAoB,UAAwB;CACzE,MAAM,OAAO,KAAK,IAAI,KAAK,QAAQ;CACnC,IAAI,CAAC,QAAQ,4BAA4B,IAAI,KAAK,WAAW,GAAG;CAChE,IAAI,aAAa,MAAM,QAAQ,GAAG;CAClC,MAAM,OAAO,KAAK,IAAI,iBAAiB,QAAQ;CAC/C,MAAM,eAAe,CAAC,GAAG,IAAI,CAAC,CAAC,QAAQ,QAAQ,IAAI,eAAe,UAAU,CAAC,CAAC,KAAK,QAAQ,KAAK,cAAc,IAAI,EAAE,CAAC;CACrH,KAAK,IAAI,WAAW,gBAAgB,QAAQ,CAAC;CAC7C,KAAK,IAAI,WAAW,QAAQ;CAC5B,KAAK,MAAM,SAAS,cAAc,cAAc,MAAM,KAAK;AAC5D;;AAGA,SAAS,aAAa,MAAoB,UAA2B;CACpE,KAAK,MAAM,SAAS,CAAC,GAAG,KAAK,IAAI,MAAM,KAAK,GAAG,GAAG,GAAG;EACpD,IAAI,MAAM,SAAS,OAAO,GAAG;EAC7B,MAAM,OAAO,KAAK,IAAI,iBAAiB,KAAK;EAC5C,KAAK,MAAM,OAAO,MAAM;GACvB,IAAI,IAAI,eAAe,YAAY;GACnC,IAAI,KAAK,cAAc,IAAI,EAAE,MAAM,UAAU,OAAO;EACrD;CACD;CACA,OAAO;AACR;;;;;;;;;;;;;;;;;;;;;ACxCA,SAAgB,wBACf,MACA,eACA,eACA,OACA,QACA,QACA,MACO;CACP,MAAM,YAAY,eAAe,QAAQ,QAAQ,IAAI;CACrD,oBAAoB,MAAM,eAAe,eAAe,SAAS;CACjE,IAAI,UAAU,KAAA,KAAa,UAAU,QAAQ;EAC5C,MAAM,SAAS,iBAAiB,KAAK,KAAK,eAAe,gBAAgB;EACzE,MAAM,SAAS,SAAS,iBAAiB,KAAK,KAAK,QAAQ,gBAAgB,IAAI;EAC/E,IAAI,QAAQ,oBAAoB,MAAM,eAAe,QAAQ,SAAS;EACtE,IAAI,QAAQ,oBAAoB,MAAM,eAAe,QAAQ,SAAS;CACvE;AACD;;;;;;AAOA,SAAS,oBACR,MACA,eACA,UACA,WACO;CACP,IAAI,cAAc,IAAI,QAAQ,GAAG;CACjC,cAAc,IAAI,QAAQ;CAC1B,MAAM,OAAO,KAAK,IAAI,KAAK,QAAQ;CACnC,MAAM,OAAO,MAAM,IAAI;CACvB,MAAM,OAAO,QAAQ,WAAW,MAAM,QAAQ;CAC9C,MAAM,SAAS,QAAQ,WAAW,MAAM,UAAU;CAClD,IAAI,CAAC,QAAQ,CAAC,QAAQ;CACtB,cAAc,QAAQ,SAAS;CAC/B,KAAK,UAAU;AAChB;;;;;;;;;;;;;;;ACqBA,MAAM,gBAAgB;AACtB,MAAM,YAAY;AAClB,MAAM,cAAc;AACpB,MAAM,YAAY;AAClB,MAAM,YAAY;AAGlB,MAAM,eAAe;AAErB,MAAM,qBAAqB;AAC3B,MAAM,2BAA2B;AACjC,MAAM,qBAAqB;AAC3B,MAAM,oBAAoB;;AAG1B,MAAM,iCACL;;AAED,MAAM,0CACL;AAED,MAAM,cAAc,IAAI,YAAY;;;;;;AAOpC,MAAM,qCAAqC;CAC1C;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACD;AAIA,IAAa,eAAb,MAAa,aAAa;CAeI;CAd7B;;;;;;;CAOA,kCAAkB,IAAI,IAAqC;;;;;CAK3D,iCAAiB,IAAI,IAAY;CAEjC,YAAoB,KAA0B;EAAjB,KAAA,MAAA;CAAkB;;CAG/C,aAAa,KAAK,OAAwC;EACzD,OAAO,IAAI,aAAa,MAAM,WAAW,KAAK,KAAK,CAAC;CACrD;;CAGA,OAAO,YAAY,KAA+B;EACjD,OAAO,IAAI,aAAa,GAAG;CAC5B;;;;;;;;;;;;;;;;;;;;;;;;;;CA2BA,aAAa,aAAa,OAAiB,UAA+B,CAAC,GAA0B;EACpG,MAAM,OAAO,IAAI,aAAa,MAAM,WAAW,KAAK,KAAK,CAAC;EAM1D,IAAI,CAAC,QAAQ,yBAAyB;GACrC,MAAM,WAAW,KAAK;GACtB,IAAI,SAAS,gBAAgB,yCAC5B,KAAK,IAAI,aAAa,iBAAiB,SAAS,UAAU,8BAA8B;EAE1F;EAIA,OAAO,KAAK,OAAO,SAAS,GAAG,KAAK,YAAY,CAAC;EAEjD,OAAO;CACR;;CAGA,IAAI,mBAAyB;EAC5B,IAAI,KAAKC,mBAAmB,OAAO,KAAKA;EACxC,MAAM,cAAc,KAAK,IAAI,iBAAiB,GAAG;EACjD,MAAM,iBAAiB,YAAY,OAAO,mBAAmB;EAC7D,MAAM,oBAAoB,eAAe;EACzC,IAAI,eAAe,WAAW,KAAK,CAAC,mBACnC,MAAM,IAAI,iBACT,gDACA,2DAA2D,eAAe,QAC3E;EAED,MAAM,WAAW,YAAY,cAAc,kBAAkB,EAAE;EAC/D,MAAM,OAAO,KAAK,IAAI,KAAK,QAAQ;EACnC,IAAI,CAAC,MACJ,MAAM,IAAI,iBACT,uCACA,uDAAuD,UACxD;EACD,KAAKA,oBAAoB;EACzB,OAAO;CACR;;CAGA,IAAI,SAAkB;EACrB,MAAM,OAAO,KAAK,iBAAiB,IAAI;EACvC,MAAM,WAAW,QAAQ,WAAW,MAAM,YAAY;EACtD,IAAI,CAAC,UAAU,OAAO,CAAC;EACvB,MAAM,OAAO,KAAK,IAAI,iBAAiB,KAAK,iBAAiB,QAAQ;EACrE,MAAM,SAAkB,CAAC;EACzB,IAAI,QAAQ;EACZ,KAAK,MAAM,SAAS,YAAY,UAAU,SAAS,GAAG;GACrD,MAAM,QAAQ,KAAK,OAAO,MAAM;GAChC,IAAI,CAAC,OAAO;GACZ,MAAM,WAAW,KAAK,cAAc,KAAK;GACzC,MAAM,OAAO,KAAK,IAAI,KAAK,QAAQ;GACnC,IAAI,CAAC,MACJ,MAAM,IAAI,iBACT,uCACA,sBAAsB,MAAM,2BAA2B,UACxD;GACD,OAAO,KAAK,IAAI,MAAM,MAAM,MAAM,SAAS,KAAK,OAAO,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC;EAC7E;EACA,OAAO;CACR;;CAGA,IAAI,YAA8B;EACjC,MAAM,OAAO,KAAK,iBAAiB,IAAI;EACvC,MAAM,QAAQ,QAAQ,WAAW,MAAM,SAAS;EAChD,IAAI,CAAC,OAAO,OAAO;EACnB,MAAM,WAAW,SAAS,KAAK,OAAO,IAAI,CAAC;EAC3C,MAAM,YAAY,SAAS,KAAK,OAAO,IAAI,CAAC;EAC5C,IAAI,aAAa,QAAQ,cAAc,MAAM,OAAO;EACpD,OAAO;GAAE;GAAU;GAAW,SAAS,YAAY,QAAQ;GAAG,UAAU,YAAY,SAAS;EAAE;CAChG;;;;;;;;;CAUA,IAAI,gBAAoC;EACvC,MAAM,OAAO,KAAK,iBAAiB,IAAI;EACvC,MAAM,MAAM,QAAQ,WAAW,MAAM,mBAAmB;EACxD,IAAI,CAAC,KAAK,OAAO,CAAC;EAClB,MAAM,OAAO,KAAK,IAAI,iBAAiB,KAAK,iBAAiB,QAAQ;EACrE,MAAM,QAA4B,CAAC;EACnC,KAAK,MAAM,SAAS,YAAY,KAAK,gBAAgB,GAAG;GACvD,MAAM,OAAO,WAAW,OAAO,QAAQ;GACvC,MAAM,WAAW,QAAQ,KAAK,MAAM,UAAU;GAC9C,IAAI,CAAC,UAAU;GACf,MAAM,QAAmC,CAAC;GAC1C,KAAK,MAAM,QAAQ,qBAAqB;IACvC,MAAM,OAAO,WAAW,OAAO,KAAK,MAAM;IAC1C,MAAM,QAAQ,QAAQ,KAAK,MAAM,MAAM;IACvC,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,KAAK,GAAG;IAChC,MAAM,KAAK;KAAE;KAAM,UAAU,KAAK,cAAc,KAAK;IAAE,CAAC;GACzD;GACA,MAAM,KAAK;IAAE;IAAU,QAAQ,OAAO,KAAK,MAAM,QAAQ,IAAI;IAAM;GAAM,CAAC;EAC3E;EACA,OAAO;CACR;;;;;;;CAQA,IAAI,iBAAkC;EACrC,OAAO,mBAAmB,KAAK,KAAK,KAAK,iBAAiB,QAAQ;CACnE;;;;;;;;CASA,IAAI,uBAA8C;EACjD,OAAO,yBAAyB,KAAK,KAAK,KAAK,iBAAiB,QAAQ;CACzE;;;;;;;;;CAUA,IAAI,gBAA+B;EAClC,OAAO,cAAc,KAAK,GAAG;CAC9B;;;;;;;;CASA,IAAI,iBAAiC;EACpC,OAAO,mBAAmB,KAAK,GAAG;CACnC;;;;;;;CAQA,IAAI,mBAAqC;EACxC,OAAO,qBAAqB,KAAK,GAAG;CACrC;;;;;;;;CASA,IAAI,OAAc;EACjB,OAAO,gBAAgB,KAAK,KAAK,KAAK,iBAAiB,QAAQ;CAChE;;;;;;;;;;;;CAaA,WAAW,OAAe,UAA2B,CAAC,GAAU;EAC/D,MAAM,SAAS,KAAK,OAAO;EAC3B,IAAI,CAAC,QAAQ,MAAM,IAAI,mBAAmB,4BAA4B,qBAAqB,MAAM,UAAU;EAC3G,MAAM,MAAM,KAAK;EACjB,MAAM,aAAa,OAAO;EAG1B,MAAM,cAAc,IAAI,oBAAoB,WAAW,QAAQ;EAC/D,MAAM,UAAU,IAAI,QAAQ,aAAa,WAAW,aAAa,WAAW,KAAK;EAGjF,MAAM,aAAa,IAAI,KAAK,gBAAgB,WAAW,QAAQ,CAAC;EAChE,IAAI,YAAY,IAAI,QAAQ,gBAAgB,WAAW,GAAG,WAAW,aAAa,WAAW,KAAK;EAGlG,OAAO,KAAKC,iBAAiB,SAAS,QAAQ,EAAE;CACjD;;;;;;;;;;;;;CAcA,YAAY,OAAuB;EAClC,MAAM,QAAQ,KAAK,OAAO;EAC1B,IAAI,CAAC,OAAO,MAAM,IAAI,mBAAmB,4BAA4B,qBAAqB,MAAM,WAAW;EAC3G,MAAM,WAAW,MAAM;EAIvB,MAAM,YAAY,KAAK,IAAI,iBAAiB,QAAQ;EACpD,MAAM,gBAAgB,CAAC,GAAG,SAAS,CAAC,CAClC,QAAQ,QAAQ,IAAI,eAAe,UAAU,CAAC,CAC9C,KAAK,QAAQ,UAAU,cAAc,IAAI,EAAE,CAAC;EAG9C,MAAM,WAAW,KAAK;EACtB,MAAM,WAAW,KAAK,IAAI,iBAAiB,SAAS,QAAQ;EAC5D,MAAM,OAAO,SAAS,IAAI;EAC1B,MAAM,WAAW,QAAQ,WAAW,MAAM,YAAY;EACtD,IAAI,UACH,KAAK,MAAM,SAAS,YAAY,UAAU,SAAS,GAAG;GACrD,MAAM,QAAQ,KAAK,OAAO,MAAM;GAChC,IAAI,SAAS,SAAS,IAAI,KAAK,KAAK,SAAS,cAAc,KAAK,MAAM,UAAU;IAC/E,SAAS,YAAY,KAAK;IAC1B,SAAS,OAAO,KAAK;IACrB;GACD;EACD;EAED,SAAS,UAAU;EAGnB,KAAK,IAAI,WAAW,gBAAgB,QAAQ,CAAC;EAC7C,KAAK,IAAI,WAAW,QAAQ;EAC5B,KAAK,MAAM,UAAU,eAAe,cAAc,MAAM,MAAM;EAE9D,OAAO;CACR;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6BA,YAAY,QAAsB,OAAe,UAA8B,CAAC,GAAU;EACzF,MAAM,cAAc,OAAO,OAAO;EAClC,IAAI,CAAC,aAAa,MAAM,IAAI,mBAAmB,4BAA4B,qBAAqB,MAAM,WAAW;EAGjH,MAAM,SAAS,KAAK;EACpB,MAAM,WAAW,OAAO;EACxB,MAAM,cACL,CAAC,UAAU,CAAC,YAAY,OAAO,aAAa,SAAS,YAAY,OAAO,cAAc,SAAS;EAChG,IAAI,eAAe,CAAC,QAAQ,SAAS;GACpC,MAAM,OAAO,MAAiC,IAAI,GAAG,EAAE,SAAS,GAAG,EAAE,UAAU,QAAQ;GACvF,MAAM,IAAI,mBACT,8BACA,sGAAsG,IAAI,MAAM,EAAE,cAAc,IAAI,QAAQ,GAC7I;EACD;EACA,IAAI,eAAe,QAAQ,YAAY,CAAC,UAAU,CAAC,WAClD,MAAM,IAAI,mBACT,6BACA,2EACD;EAOD,MAAM,YAAY,KAAKC,eAAe,OAAO,GAAG;EAChD,MAAM,cACL,QAAQ,UAAU,aACf,oBAAoB,MAAM,WAAW,QAAQ,aAAa,QAAQ,wBAAwB,IAAI,IAC9F,QAAQ,UAAU,YACjB,mBACA,MACA,WACA,QACA,aACA,QAAQ,wBAAwB,MAChC,QAAQ,kBAAkB,IAC3B,IACC,SAAS,WAAW,YAAY,QAAQ;EAC7C,MAAM,UAAU,KAAK,IAAI,KAAK,WAAW;EACzC,IAAI,CAAC,SACJ,MAAM,IAAI,cAAc,4BAA4B,qCAAqC,aAAa;EAGvG,IAAI,eAAe,QAAQ,WAAW,UAAU,UAC/C,wBACC,MACA,KAAKC,gBACL,aACA,QAAQ,OACR,UACA,QACA,QAAQ,YAAY,OAAO,QAAQ,QAAQ,OAC5C;EAID,MAAM,QAAQ,KAAKF,iBAAiB,SAAS,QAAQ,EAAE;EAKvD,IAAI,QAAQ,aAAa,WAAW,MAAM,QAAQ,WAAW,YAAY,UAAU,WAAW;EAI9F,IAAI,QAAQ,YAAY,mBAAmB,MAAM,QAAQ,SAAS;EAElE,OAAO;CACR;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgCA,mBAAmB,QAAsB,UAAqC,CAAC,GAA0B;EACxG,IAAI,QAAQ,qBAAqB,OAAO;GACvC,MAAM,SAAS,KAAK;GACpB,MAAM,WAAW,OAAO;GACxB,IAAI,CAAC,UAAU,CAAC,YAAY,OAAO,aAAa,SAAS,YAAY,OAAO,cAAc,SAAS,WAAW;IAC7G,MAAM,OAAO,MAAiC,IAAI,GAAG,EAAE,SAAS,GAAG,EAAE,UAAU,QAAQ;IACvF,MAAM,IAAI,mBACT,8BACA,2GAA2G,IAAI,MAAM,EAAE,cAAc,IAAI,QAAQ,GAClJ;GACD;EACD;EAEA,MAAM,aAAa,QAAQ,kBAAkB;EAC7C,MAAM,aAAa,QAAQ,kBAAkB;EAE7C,MAAM,MAAM,KAAKC,eAAe,OAAO,GAAG;EAC1C,MAAM,WAAkC,CAAC;EACzC,qBAAqB,MAAM,CAAC,CAAC,SAAS,gBAAgB,gBAAgB;GACrE,IAAI,CAAC,WAAW,SAAS,OAAO,IAAI,KAAK,cAAc,CAAC,GAAG,WAAW,GAAG;GAIzE,MAAM,oBAAoB,SAAS,KAAK,cAAc;GAEtD,MAAM,kBAA4B,CAAC;GACnC,kBAAkB,QAAQ,cAAc,CAAC,CAAC,SAAS,gBAAgB,gBAAgB;IAClF,IAAI,CAAC,WAAW,SAAS,OAAO,IAAI,KAAK,cAAc,CAAC,GAAG,WAAW,GAAG;IACzE,gBAAgB,KAAK,SAAS,KAAK,cAAc,CAAC;GACnD,CAAC;GAED,SAAS,KAAK;IAAE,UAAU;IAAmB;GAAgB,CAAC;EAC/D,CAAC;EAKD,IAAI,QAAQ,YAAY,mBAAmB,MAAM,QAAQ,KAAKA,eAAe,OAAO,GAAG,CAAC;EACxF,IAAI,QAAQ,aAAa,iBAAiB,MAAM,OAAO,GAAG;EAC1D,IAAI,QAAQ,SACX,eACC,MACA,SAAS,KAAK,MAAM,EAAE,QAAQ,CAC/B;EAED,OAAO;CACR;;;;;;;;;CAUA,UAAyB;EACxB,OAAO,qBAAqB,IAAI,CAAC,CAC/B,KAAK,aAAa,KAAK,IAAI,KAAK,QAAQ,CAAC,CAAC,CAC1C,QAAQ,SAAuB,SAAS,KAAA,CAAS,CAAC,CAClD,KAAK,SAAS,IAAI,YAAY,KAAK,KAAK,IAAI,CAAC;CAChD;;;;;;;CAQA,UAA0B;EACzB,MAAM,MAAsB,CAAC;EAC7B,qBAAqB,IAAI,CAAC,CAAC,SAAS,gBAAgB,gBAAgB;GACnE,kBAAkB,MAAM,cAAc,CAAC,CAAC,SAAS,gBAAgB,gBAAgB;IAChF,IAAI,KAAK;KACR,UAAU;KACV,MAAM,SAAS,KAAK,IAAI,KAAK,cAAc,CAAC;KAC5C;KACA;KACA;IACD,CAAC;GACF,CAAC;EACF,CAAC;EACD,OAAO;CACR;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8CA,MAAM,aAAa,QAAqB,SAAgD;EAEvF,MAAM,UAAU,KAAK,QAAQ;EAC7B,IAAI;EACJ,IAAI,OAAO,QAAQ,WAAW,UAAU;GACvC,MAAM,UAAU,QAAQ,QAAQ,MAAM,EAAE,SAAS,QAAQ,MAAM;GAC/D,IAAI,QAAQ,SAAS,GACpB,MAAM,IAAI,mBACT,yBACA,6BAA6B,KAAK,UAAU,QAAQ,MAAM,EAAE,iBAAiB,QAAQ,OAAO,+DAC7F;GAED,MAAM,CAAC,QAAQ;GACf,IAAI,CAAC,MAAM;IACV,MAAM,QAAQ,QAAQ,KAAK,MAAM,KAAK,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI;IAClE,MAAM,IAAI,mBACT,oBACA,iCAAiC,KAAK,UAAU,QAAQ,MAAM,EAAE,eAAe,SAAS,UACzF;GACD;GACA,SAAS;EACV,OAAO;GACN,MAAM,SAAS,QAAQ;GACvB,IAAI,CAAC,QAAQ,MAAM,MAAM,EAAE,aAAa,OAAO,QAAQ,GACtD,MAAM,IAAI,mBACT,yBACA,wBAAwB,OAAO,SAAS,sCACzC;GAED,SAAS;EACV;EAGA,MAAM,YAAY,MAAM,OAAO,cAAc,EAAE,cAAc,QAAQ,aAAa,CAAC;EACnF,MAAM,OAAO,KAAK;EAClB,IAAI,CAAC,QAAQ,KAAK,aAAa,UAAU,YAAY,KAAK,cAAc,UAAU,WAAW;GAC5F,MAAM,OAAO,GAAW,MAAsB,GAAG,EAAE,GAAG,EAAE;GACxD,MAAM,IAAI,mBACT,8BACA,sDAAsD,OAAO,IAAI,KAAK,UAAU,KAAK,SAAS,IAAI,UAAU,cAAc,IAAI,UAAU,UAAU,UAAU,SAAS,GACtK;EACD;EAKA,MAAM,gBAAgB,KAAK,OAAO,EAAE,EAAE,YAAY;EAOlD,MAAM,SAAS,UAAU,OAAO,KAAK,UAAU;GAC9C,MAAM,WAAW,KAAK,IAAI,oBAAoB,aAAa;GAE3D,OAAO;IAAE;IAAO,MADH,KAAK,IAAI,QAAQ,UAAU,oBAAoB,YAAY,OAAO,MAAM,GAAG,CACrE;IAAG;GAAS;EAChC,CAAC;EAGD,MAAM,qBAAqB,IAAI,IAAoB,OAAO,KAAK,GAAG,MAAM,CAAC,IAAI,GAAG,EAAE,QAAQ,CAAC,CAAC;EAK5F,MAAM,QAAiB,CAAC;EACxB,OAAO,SAAS,EAAE,OAAO,MAAM,YAAY,MAAM;GAChD,MAAM,OAAO,KAAK,IAAI,iBAAiB,QAAQ;GAC/C,KAAK,MAAM,KAAK,MAAM,OAAO;IAC5B,MAAM,gBAAgB,KAAK,IAAI,qBAAqB,EAAE,IAAI;IAC1D,KAAK,IAAI,QAAQ,eAAe,EAAE,aAAa,EAAE,KAAK;IACtD,KAAK,UAAU,MAAM,EAAE,OAAO,WAAW,iBAAiB,UAAU,aAAa,CAAC;GACnF;GACA,KAAK,MAAM,MAAM,MAAM,SAAS;IAK/B,MAAM,gBAAgB,KAAK,IAAI,qBAAqB,GAAG,WAAW,OAAO;IACzE,KAAK,IAAI,aAAa,cAAc,GAAG,WAAW,GAAG,gBAAgB;IACrE,KAAK,IAAI,QAAQ,eAAe,GAAG,kBAAkB,GAAG,UAAU;IAClE,MAAM,cAAc,iBAAiB,UAAU,aAAa;IAC5D,KAAK,UAAU,MAAM,GAAG,YAAY,GAAG,UAAU,UAAU,YAAY,WAAW,WAAW;IAC7F,KAAK,UAAU,MAAM,GAAG,cAAc,cAAc,WAAW;IAE/D,MAAM,kBAAkB,KAAK,IAAI,qBAAqB,GAAG,WAAW;IACpE,KAAK,IAAI,aAAa,cAAc,GAAG,aAAa,GAAG,kBAAkB;IACzE,KAAK,IAAI,QAAQ,iBAAiB,GAAG,oBAAoB,GAAG,YAAY;IACxE,KAAK,UAAU,MAAM,GAAG,cAAc,WAAW,iBAAiB,UAAU,eAAe,CAAC;GAC7F;GACA,KAAK,MAAM,MAAM,MAAM,aAAa;IAInC,KAAK,UAAU,MAAM,GAAG,YAAY,WAAW,GAAG,MAAM,UAAU;IAClE,KAAK,UAAU,MAAM,GAAG,cAAc,cAAc,GAAG,MAAM,UAAU;GACxE;GACA,KAAK,MAAM,KAAK,MAAM,YACrB,KAAK,UAAU,MAAM,EAAE,OAAO,eAAe,EAAE,QAAQ,UAAU;GAElE,IAAI,MAAM,OAAO;IAKhB,MAAM,gBAAgB,KAAK,IAAI,oBAAoB,kCAAkC;IACrF,KAAK,IAAI,QAAQ,eAAe,0BAA0B,YAAY,OAAO,MAAM,MAAM,GAAG,CAAC;IAC7F,KAAK,IAAI,iBAAiB,iBAAiB,UAAU,aAAa,CAAC;IAEnE,MAAM,YAAY,KAAK,IAAI,iBAAiB,aAAa;IACzD,MAAM,sBAAsB,UAAU,cAAc,yBAAyB,MAAM,UAAU,WAAW,IAAI;IAC5G,IAAI,qBACH,UAAU,UAAU,QAAQ,kBAAkB,iBAAiB,eAAe,mBAAmB,CAAC;IAEnG,UAAU,UAAU,QAAQ,WAAW,iBAAiB,eAAe,QAAQ,CAAC;IAChF,KAAK,MAAM,KAAK,MAAM,MAAM,YAC3B,UAAU,UAAU,MAAM,EAAE,OAAO,eAAe,EAAE,QAAQ,UAAU;GAExE;GACA,KAAK,MAAM,KAAK,MAAM,QAAQ;IAI7B,MAAM,gBAAgB,KAAK,IAAI,oBAAoB,wBAAwB;IAC3E,KAAK,IAAI,QAAQ,eAAe,oBAAoB,YAAY,OAAO,EAAE,QAAQ,CAAC;IAClF,MAAM,oBAAoB,KAAK,IAAI,oBAAoB,iDAAiD;IACxG,KAAK,IAAI,aAAa,cAAc,QAAQ,iBAAiB;IAC7D,KAAK,IAAI,QAAQ,mBAAmB,mBAAmB,EAAE,cAAc;IACvE,KAAK,IACH,iBAAiB,aAAa,CAAC,CAC/B,UAAU,QAAQ,aAAa,iBAAiB,eAAe,iBAAiB,CAAC;IACnF,KAAK,UAAU,MAAM,EAAE,OAAO,WAAW,iBAAiB,UAAU,aAAa,CAAC;GACnF;GACA,KAAK,MAAM,QAAQ,MAAM,YAAY;IACpC,MAAM,iBAAiB,mBAAmB,IAAI,KAAK,iBAAiB;IACpE,IAAI,CAAC,gBACJ,MAAM,IAAI,mBACT,gCACA,uBAAuB,EAAE,yBAAyB,KAAK,kBAAkB,yCAC1E;IAED,KAAK,UAAU,MAAM,KAAK,OAAO,WAAW,iBAAiB,UAAU,cAAc,CAAC;GACvF;GACA,KAAK,IAAI,kBAAkB,iBAAiB,UAAU,OAAO,QAAQ,CAAC;GAGtE,MAAM,KAAK,QAAQ,OAAO,KAAA,IAAY,KAAA,IAAY,QAAQ,KAAK;GAC/D,MAAM,KAAK,KAAKD,iBAAiB,MAAM,EAAE,CAAC;EAC3C,CAAC;EAID,4BAA4B,MAAM,UAAU,iBAAiB,CAAC,CAAC;EAE/D,OAAO;CACR;;;;;;;;;;;;;;;;;;;;;;;CAwBA,YAAY,QAAe,QAAe,YAAoB,UAA8B,CAAC,GAAa;EACzG,MAAM,CAAC,SAAS,KAAK,aAAa,QAAQ,QAAQ,CAAC,UAAU,GAAG,OAAO;EACvE,IAAI,CAAC,OACJ,MAAM,IAAI,mBACT,4BACA,mDAAmD,YACpD;EACD,OAAO;CACR;;;;;;;;CASA,aAAa,QAAe,QAAe,cAAwB,UAA8B,CAAC,GAAe;EAChH,IAAI,OAAO,iBAAiB,MAC3B,MAAM,IAAI,mBAAmB,wBAAwB,4DAA4D;EAIlH,MAAM,aAAa,KAAK;EACxB,MAAM,aAAa,OAAO,aAAa;EACvC,MAAM,aACL,CAAC,CAAC,cACF,CAAC,CAAC,cACF,WAAW,aAAa,WAAW,YACnC,WAAW,cAAc,WAAW;EACrC,IAAI,YAAqC;EACzC,IAAI,CAAC,YAAY;GAChB,IAAI,CAAC,QAAQ,WAAW,CAAC,cAAc,CAAC,YAAY;IACnD,MAAM,OAAO,MAAiC,IAAI,GAAG,EAAE,SAAS,GAAG,EAAE,UAAU,QAAQ;IACvF,MAAM,IAAI,mBACT,8BACA,sEAAsE,IAAI,UAAU,EAAE,cAAc,IAAI,UAAU,GACnH;GACD;GACA,YAAY,eAAe,YAAY,YAAY,QAAQ,YAAY,YAAY,YAAY,KAAK;EACrG;EAGA,MAAM,eAAe,OAAO;EAC5B,MAAM,iBAAiB,aAAa,KAAK,MAAM;GAC9C,MAAM,QAAQ,aAAa;GAC3B,IAAI,CAAC,OACJ,MAAM,IAAI,mBACT,4BACA,qBAAqB,EAAE,+BAA+B,aAAa,OAAO,EAC3E;GACD,OAAO,MAAM;EACd,CAAC;EAED,MAAM,SAAS,OAAO,UAAU;EAChC,IAAI,CAAC,QACJ,MAAM,IAAI,iBACT,uBACA,6BAA6B,OAAO,SAAS,mBAC9C;EACD,MAAM,YAAY,OAAO;EACzB,IAAI,CAAC,WACJ,MAAM,IAAI,cAAc,6BAA6B,qDAAqD;EAE3G,MAAM,QAAQ,QAAQ,SAAS;EAC/B,MAAM,YAAY,OAAO,aAAa;EACtC,MAAM,aAAa,UAAU,iBAAiB,OAAO,QAAQ;EAC7D,MAAM,aAAa,KAAK,IAAI,iBAAiB,OAAO,QAAQ;EAE5D,MAAM,2BAAW,IAAI,IAAoB;EAEzC,MAAM,MAAM,UAAU,aAAa,qBAAqB,WAAW,OAAO,QAAQ,IAAI;EACtF,MAAM,YAAY,KAAKC,eAAe,SAAS;EAI/C,MAAM,SAAS,WAAW,QAAQ,UAAU;EAC5C,MAAM,SAAS,QAAQ,MAAM,OAAO,SAAU,cAAc,QAAQ,QAAQ,EAAE,KAAK;EAEnF,MAAM,SAAqB,CAAC;EAC5B,KAAK,MAAM,WAAW,gBAAgB;GACrC,MAAM,WAAW,UAAU,WAAW,SAAS,IAAI;GAGnD,mBAAmB,UAAU,WAAW,YAAY,OAAO,UAAU,YAAY,QAAQ;GAIzF,IAAI,KAAK;IACR,MAAM,SAAS,cAAc,WAAW,UAAU;IAClD,OAAO,YAAY,QAAQ;IAC3B,aAAa,QAAQ,GAAG;GACzB;GAIA,IAAI,WAAW;IACd,MAAM,SAAS,cAAc,WAAW,UAAU;IAClD,OAAO,YAAY,QAAQ;IAC3B,cAAc,QAAQ,SAAS;GAChC;GAIA,IAAI,SAAS,OAAO,YAAY;GAChC,MAAM,0BAAU,IAAI,IAAoB;GACxC,KAAK,MAAM,SAAS,SAAS,uBAAuB,SAAS,GAAG,OAAO,GAAG;IACzE,MAAM,QAAQ,SAAS,KAAK,OAAO,IAAI,CAAC;IACxC,IAAI,UAAU,MAAM,QAAQ,IAAI,OAAO,MAAM;IAC7C,QAAQ,OAAO,MAAM,OAAO,QAAQ,CAAC;GACtC;GAGA,OAAO,aAAa,UAAU,MAAM;GAIpC,IAAI,QAAQ,gBAAgB;IAC3B,MAAM,aAAa,OAAO,KAAK,IAAI;IACnC,MAAM,aAAa,OAAO,KAAK,IAAI;IACnC,IAAI,cAAc,YAAY,qBAAqB,YAAY,YAAY,OAAO;GACnF;GAEA,MAAM,QAAQ,iBAAiB,UAAU,MAAM;GAC/C,IAAI,CAAC,OACJ,MAAM,IAAI,wBACT,6BACA,2CAA2C,SAAS,UAAU,EAC/D;GACD,IAAI,QAAQ,QAAQ,MAAM,MAAM,OAAO,QAAQ;GAC/C,IAAI,QAAQ,OAAO,MAAM,MAAM,MAAM,QAAQ;GAC7C,IAAI,QAAQ,SAAS,MAAM,MAAM,QAAQ,QAAQ;GACjD,IAAI,QAAQ,UAAU,MAAM,MAAM,SAAS,QAAQ;GACnD,OAAO,KAAK,KAAK;EAClB;EAEA,OAAO,KAAK,UAAU;EACtB,OAAO;CACR;;;;;;;;CASA,eAAe,QAAmC;EACjD,IAAI,WAAW,KAAKE,gBAAgB,IAAI,MAAM;EAC9C,IAAI,CAAC,UAAU;GACd,2BAAW,IAAI,IAAI;GACnB,KAAKA,gBAAgB,IAAI,QAAQ,QAAQ;EAC1C;EACA,OAAO;GAAE,MAAM;GAAM;GAAQ;EAAS;CACvC;;;;;;;CAQA,iBAAiB,SAAe,IAAoB;EACnD,MAAM,WAAW,KAAK;EAEtB,MAAM,QADW,KAAK,IAAI,iBAAiB,SAAS,QAC/B,CAAC,CAAC,IAAI,WAAW,iBAAiB,SAAS,UAAU,QAAQ,QAAQ,CAAC,CAAC,CAAC;EAE7F,MAAM,OAAO,SAAS,IAAI;EAC1B,IAAI,CAAC,MACJ,MAAM,IAAI,iBACT,4BACA,+DACD;EAGD,MAAM,WAAW,cAAc,MAAM,cAAc,kCAAkC;EACrF,MAAM,WAAW,YAAY,UAAU,SAAS;EAChD,MAAM,aAAa,KAAKC,aAAa,QAAQ;EAC7C,MAAM,QAAQ,cAAc,SAAS,KAAK,SAAS;EACnD,QAAQ,OAAO,MAAM,OAAO,UAAU,CAAC;EACvC,QAAQ,OAAO,QAAQ,KAAK;EAE5B,MAAM,UAAU,OAAO,KAAA,KAAa,MAAM,KAAK,KAAK,SAAS;EAC7D,MAAM,WAAW,UAAU,KAAK,SAAS;EACzC,MAAM,SAAS,UAAU,SAAS,MAAM;EACxC,IAAI,QAAQ,SAAS,aAAa,OAAO,MAAM;OAC1C,SAAS,YAAY,KAAK;EAC/B,SAAS,UAAU;EAEnB,OAAO,IAAI,MAAM,MAAM,SAAS,YAAY,QAAQ;CACrD;;CAGA,aAAa,QAAgD;EAC5D,IAAI,MAAM;EACV,KAAK,MAAM,SAAS,QAAQ;GAC3B,MAAM,KAAK,SAAS,KAAK,OAAO,IAAI,CAAC;GACrC,IAAI,OAAO,QAAQ,KAAK,KAAK,MAAM;EACpC;EACA,OAAO,MAAM;CACd;;CAGA,MAAM,OAA4B;EACjC,OAAO,KAAK,IAAI,KAAK;CACtB;AACD"}
|