@beyondwork/docx-react-component 1.0.28 → 1.0.29
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/canonical-document-BLEbzL2J.d.cts +844 -0
- package/dist/canonical-document-BLEbzL2J.d.ts +844 -0
- package/dist/chunk-2FJS5GZM.js +763 -0
- package/dist/chunk-2FJS5GZM.js.map +1 -0
- package/{src/core/commands/section-layout-commands.ts → dist/chunk-2OQBZS3F.js} +106 -340
- package/dist/chunk-2OQBZS3F.js.map +1 -0
- package/dist/chunk-2S7W4KFO.js +127 -0
- package/dist/chunk-2S7W4KFO.js.map +1 -0
- package/dist/chunk-2TG72QSW.js +3874 -0
- package/dist/chunk-2TG72QSW.js.map +1 -0
- package/{src/core/commands/table-structure-commands.ts → dist/chunk-36QNIZBO.js} +126 -315
- package/dist/chunk-36QNIZBO.js.map +1 -0
- package/dist/chunk-4AQOYAW4.js +3069 -0
- package/dist/chunk-4AQOYAW4.js.map +1 -0
- package/dist/chunk-4D5EWJ3P.js +77 -0
- package/dist/chunk-4D5EWJ3P.js.map +1 -0
- package/dist/chunk-5FN54NDH.js +2257 -0
- package/dist/chunk-5FN54NDH.js.map +1 -0
- package/dist/chunk-BOYGQYRQ.js +7306 -0
- package/dist/chunk-BOYGQYRQ.js.map +1 -0
- package/dist/chunk-CN3XMECL.js +212 -0
- package/dist/chunk-CN3XMECL.js.map +1 -0
- package/dist/chunk-EBI3BX6U.js +164 -0
- package/dist/chunk-EBI3BX6U.js.map +1 -0
- package/dist/chunk-EILUG3VB.js +1275 -0
- package/dist/chunk-EILUG3VB.js.map +1 -0
- package/dist/chunk-FUDY333O.js +70 -0
- package/dist/chunk-FUDY333O.js.map +1 -0
- package/dist/chunk-GBVOWFIK.js +1237 -0
- package/dist/chunk-GBVOWFIK.js.map +1 -0
- package/dist/chunk-H4TQ3H3Y.js +262 -0
- package/dist/chunk-H4TQ3H3Y.js.map +1 -0
- package/{src/core/commands/style-commands.ts → dist/chunk-JGB3IXZO.js} +40 -113
- package/dist/chunk-JGB3IXZO.js.map +1 -0
- package/dist/chunk-KD2QRQPY.js +4342 -0
- package/dist/chunk-KD2QRQPY.js.map +1 -0
- package/dist/chunk-KLMXQVYK.js +369 -0
- package/dist/chunk-KLMXQVYK.js.map +1 -0
- package/dist/chunk-KZUG5KFQ.js +214 -0
- package/dist/chunk-KZUG5KFQ.js.map +1 -0
- package/{src/core/state/text-transaction.ts → dist/chunk-QDAQ4CJU.js} +79 -236
- package/dist/chunk-QDAQ4CJU.js.map +1 -0
- package/{src/legal/bookmarks.ts → dist/chunk-RMH72RZI.js} +44 -130
- package/dist/chunk-RMH72RZI.js.map +1 -0
- package/dist/chunk-SWKWQZXM.js +117 -0
- package/dist/chunk-SWKWQZXM.js.map +1 -0
- package/{src/core/commands/formatting-commands.ts → dist/chunk-TJBP2K4T.js} +196 -536
- package/dist/chunk-TJBP2K4T.js.map +1 -0
- package/dist/chunk-TLCEAQDQ.js +542 -0
- package/dist/chunk-TLCEAQDQ.js.map +1 -0
- package/{src/core/commands/text-commands.ts → dist/chunk-UZXBISGO.js} +86 -142
- package/dist/chunk-UZXBISGO.js.map +1 -0
- package/dist/chunk-WGBAKP3Q.js +3220 -0
- package/dist/chunk-WGBAKP3Q.js.map +1 -0
- package/dist/compare/index.cjs +5475 -0
- package/dist/compare/index.cjs.map +1 -0
- package/dist/compare/index.d.cts +114 -0
- package/dist/compare/index.d.ts +114 -0
- package/dist/compare/index.js +731 -0
- package/dist/compare/index.js.map +1 -0
- package/dist/core/commands/formatting-commands.cjs +828 -0
- package/dist/core/commands/formatting-commands.cjs.map +1 -0
- package/dist/core/commands/formatting-commands.d.cts +63 -0
- package/dist/core/commands/formatting-commands.d.ts +63 -0
- package/dist/core/commands/formatting-commands.js +37 -0
- package/dist/core/commands/formatting-commands.js.map +1 -0
- package/dist/core/commands/image-commands.cjs +2023 -0
- package/dist/core/commands/image-commands.cjs.map +1 -0
- package/dist/core/commands/image-commands.d.cts +58 -0
- package/dist/core/commands/image-commands.d.ts +58 -0
- package/dist/core/commands/image-commands.js +18 -0
- package/dist/core/commands/image-commands.js.map +1 -0
- package/dist/core/commands/section-layout-commands.cjs +477 -0
- package/dist/core/commands/section-layout-commands.cjs.map +1 -0
- package/dist/core/commands/section-layout-commands.d.cts +62 -0
- package/dist/core/commands/section-layout-commands.d.ts +62 -0
- package/dist/core/commands/section-layout-commands.js +21 -0
- package/dist/core/commands/section-layout-commands.js.map +1 -0
- package/dist/core/commands/style-commands.cjs +214 -0
- package/dist/core/commands/style-commands.cjs.map +1 -0
- package/dist/core/commands/style-commands.d.cts +13 -0
- package/dist/core/commands/style-commands.d.ts +13 -0
- package/dist/core/commands/style-commands.js +9 -0
- package/dist/core/commands/style-commands.js.map +1 -0
- package/dist/core/commands/table-structure-commands.cjs +1883 -0
- package/dist/core/commands/table-structure-commands.cjs.map +1 -0
- package/dist/core/commands/table-structure-commands.d.cts +59 -0
- package/dist/core/commands/table-structure-commands.d.ts +59 -0
- package/dist/core/commands/table-structure-commands.js +12 -0
- package/dist/core/commands/table-structure-commands.js.map +1 -0
- package/dist/core/commands/text-commands.cjs +2391 -0
- package/dist/core/commands/text-commands.cjs.map +1 -0
- package/dist/core/commands/text-commands.d.cts +24 -0
- package/dist/core/commands/text-commands.d.ts +24 -0
- package/dist/core/commands/text-commands.js +28 -0
- package/dist/core/commands/text-commands.js.map +1 -0
- package/dist/core/selection/mapping.cjs +200 -0
- package/dist/core/selection/mapping.cjs.map +1 -0
- package/dist/core/selection/mapping.d.cts +2 -0
- package/dist/core/selection/mapping.d.ts +2 -0
- package/dist/core/selection/mapping.js +31 -0
- package/dist/core/selection/mapping.js.map +1 -0
- package/dist/core/state/editor-state.cjs +2278 -0
- package/dist/core/state/editor-state.cjs.map +1 -0
- package/dist/core/state/editor-state.d.cts +2 -0
- package/dist/core/state/editor-state.d.ts +2 -0
- package/dist/core/state/editor-state.js +26 -0
- package/dist/core/state/editor-state.js.map +1 -0
- package/dist/index.cjs +38553 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +15 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.js +7856 -0
- package/dist/index.js.map +1 -0
- package/dist/io/docx-session.cjs +16236 -0
- package/dist/io/docx-session.cjs.map +1 -0
- package/dist/io/docx-session.d.cts +21 -0
- package/dist/io/docx-session.d.ts +21 -0
- package/dist/io/docx-session.js +18 -0
- package/dist/io/docx-session.js.map +1 -0
- package/dist/legal/index.cjs +3900 -0
- package/dist/legal/index.cjs.map +1 -0
- package/dist/legal/index.d.cts +86 -0
- package/dist/legal/index.d.ts +86 -0
- package/dist/legal/index.js +616 -0
- package/dist/legal/index.js.map +1 -0
- package/dist/public-types-7ZL_94cz.d.ts +1573 -0
- package/dist/public-types-CeMaDueh.d.cts +1573 -0
- package/dist/public-types.cjs +19 -0
- package/dist/public-types.cjs.map +1 -0
- package/dist/public-types.d.cts +2 -0
- package/dist/public-types.d.ts +2 -0
- package/dist/public-types.js +1 -0
- package/dist/public-types.js.map +1 -0
- package/dist/runtime/document-runtime.cjs +11140 -0
- package/dist/runtime/document-runtime.cjs.map +1 -0
- package/dist/runtime/document-runtime.d.cts +231 -0
- package/dist/runtime/document-runtime.d.ts +231 -0
- package/dist/runtime/document-runtime.js +21 -0
- package/dist/runtime/document-runtime.js.map +1 -0
- package/dist/structural-helpers-CilgOVhh.d.cts +10 -0
- package/dist/structural-helpers-q0Gd-eBN.d.ts +10 -0
- package/dist/ui-tailwind/editor-surface/search-plugin.cjs +313 -0
- package/dist/ui-tailwind/editor-surface/search-plugin.cjs.map +1 -0
- package/dist/ui-tailwind/editor-surface/search-plugin.d.cts +67 -0
- package/dist/ui-tailwind/editor-surface/search-plugin.d.ts +67 -0
- package/dist/ui-tailwind/editor-surface/search-plugin.js +23 -0
- package/dist/ui-tailwind/editor-surface/search-plugin.js.map +1 -0
- package/dist/ui-tailwind/index.cjs +4833 -0
- package/dist/ui-tailwind/index.cjs.map +1 -0
- package/dist/ui-tailwind/index.d.cts +617 -0
- package/dist/ui-tailwind/index.d.ts +617 -0
- package/dist/ui-tailwind/index.js +575 -0
- package/dist/ui-tailwind/index.js.map +1 -0
- package/package.json +61 -41
- package/src/README.md +0 -85
- package/src/api/README.md +0 -26
- package/src/api/public-types.ts +0 -1421
- package/src/api/session-state.ts +0 -60
- package/src/compare/diff-engine.ts +0 -623
- package/src/compare/export-redlines.ts +0 -280
- package/src/compare/index.ts +0 -25
- package/src/compare/snapshot.ts +0 -97
- package/src/component-inventory.md +0 -99
- package/src/core/README.md +0 -10
- package/src/core/commands/README.md +0 -3
- package/src/core/commands/image-commands.ts +0 -373
- package/src/core/commands/index.ts +0 -1757
- package/src/core/commands/list-commands.ts +0 -565
- package/src/core/commands/paragraph-layout-commands.ts +0 -339
- package/src/core/commands/review-commands.ts +0 -108
- package/src/core/commands/structural-helpers.ts +0 -309
- package/src/core/schema/README.md +0 -3
- package/src/core/schema/text-schema.ts +0 -516
- package/src/core/search/search-text.ts +0 -357
- package/src/core/selection/README.md +0 -3
- package/src/core/selection/mapping.ts +0 -289
- package/src/core/selection/review-anchors.ts +0 -183
- package/src/core/state/README.md +0 -3
- package/src/core/state/editor-state.ts +0 -892
- package/src/formats/xlsx/io/parse-shared-strings.ts +0 -41
- package/src/formats/xlsx/io/parse-sheet.ts +0 -459
- package/src/formats/xlsx/io/parse-styles.ts +0 -59
- package/src/formats/xlsx/io/parse-workbook.ts +0 -75
- package/src/formats/xlsx/io/serialize-shared-strings.ts +0 -72
- package/src/formats/xlsx/io/serialize-sheet.ts +0 -333
- package/src/formats/xlsx/io/serialize-styles.ts +0 -98
- package/src/formats/xlsx/io/serialize-workbook.ts +0 -429
- package/src/formats/xlsx/io/xlsx-session.ts +0 -314
- package/src/formats/xlsx/model/cell.ts +0 -189
- package/src/formats/xlsx/model/sheet.ts +0 -326
- package/src/formats/xlsx/model/styles.ts +0 -118
- package/src/formats/xlsx/model/workbook.ts +0 -453
- package/src/formats/xlsx/runtime/cell-commands.ts +0 -567
- package/src/formats/xlsx/runtime/sheet-commands.ts +0 -206
- package/src/formats/xlsx/runtime/workbook-runtime.ts +0 -177
- package/src/formats/xlsx/runtime/workbook-transaction.ts +0 -822
- package/src/index.ts +0 -101
- package/src/io/README.md +0 -10
- package/src/io/docx-session.ts +0 -2882
- package/src/io/export/README.md +0 -3
- package/src/io/export/export-session.ts +0 -220
- package/src/io/export/minimal-docx.ts +0 -115
- package/src/io/export/reattach-preserved-parts.ts +0 -54
- package/src/io/export/serialize-comments.ts +0 -947
- package/src/io/export/serialize-footnotes.ts +0 -399
- package/src/io/export/serialize-headers-footers.ts +0 -372
- package/src/io/export/serialize-main-document.ts +0 -1376
- package/src/io/export/serialize-numbering.ts +0 -118
- package/src/io/export/serialize-revisions.ts +0 -389
- package/src/io/export/serialize-runtime-revisions.ts +0 -269
- package/src/io/export/serialize-tables.ts +0 -174
- package/src/io/export/split-review-boundaries.ts +0 -356
- package/src/io/normalize/README.md +0 -3
- package/src/io/normalize/normalize-text.ts +0 -639
- package/src/io/ooxml/README.md +0 -3
- package/src/io/ooxml/highlight-colors.ts +0 -39
- package/src/io/ooxml/numbering-sentinels.ts +0 -44
- package/src/io/ooxml/parse-comments.ts +0 -846
- package/src/io/ooxml/parse-complex-content.ts +0 -287
- package/src/io/ooxml/parse-fields.ts +0 -834
- package/src/io/ooxml/parse-footnotes.ts +0 -896
- package/src/io/ooxml/parse-headers-footers.ts +0 -1169
- package/src/io/ooxml/parse-inline-media.ts +0 -461
- package/src/io/ooxml/parse-main-document.ts +0 -2877
- package/src/io/ooxml/parse-numbering.ts +0 -432
- package/src/io/ooxml/parse-revisions.ts +0 -931
- package/src/io/ooxml/parse-settings.ts +0 -184
- package/src/io/ooxml/parse-shapes.ts +0 -296
- package/src/io/ooxml/parse-styles.ts +0 -463
- package/src/io/ooxml/parse-tables.ts +0 -618
- package/src/io/ooxml/parse-theme.ts +0 -346
- package/src/io/ooxml/part-manifest.ts +0 -136
- package/src/io/ooxml/revision-boundaries.ts +0 -351
- package/src/io/opc/README.md +0 -3
- package/src/io/opc/corrupt-package.ts +0 -166
- package/src/io/opc/docx-package.ts +0 -74
- package/src/io/opc/package-reader.ts +0 -325
- package/src/io/opc/package-writer.ts +0 -273
- package/src/io/source-package-provenance.ts +0 -241
- package/src/legal/cross-references.ts +0 -414
- package/src/legal/defined-terms.ts +0 -203
- package/src/legal/index.ts +0 -32
- package/src/legal/signature-blocks.ts +0 -259
- package/src/model/README.md +0 -3
- package/src/model/canonical-document.ts +0 -2632
- package/src/model/cds-1.0.0.ts +0 -212
- package/src/model/snapshot.ts +0 -649
- package/src/preservation/README.md +0 -3
- package/src/preservation/markup-compatibility.ts +0 -48
- package/src/preservation/opaque-fragment-store.ts +0 -89
- package/src/preservation/opaque-region.ts +0 -233
- package/src/preservation/package-preservation.ts +0 -113
- package/src/preservation/preserved-part-manifest.ts +0 -56
- package/src/preservation/relationship-retention.ts +0 -57
- package/src/preservation/store.ts +0 -185
- package/src/review/README.md +0 -16
- package/src/review/store/README.md +0 -3
- package/src/review/store/comment-anchors.ts +0 -70
- package/src/review/store/comment-remapping.ts +0 -154
- package/src/review/store/comment-store.ts +0 -331
- package/src/review/store/comment-thread.ts +0 -109
- package/src/review/store/revision-actions.ts +0 -394
- package/src/review/store/revision-store.ts +0 -312
- package/src/review/store/revision-types.ts +0 -171
- package/src/review/store/runtime-comment-store.ts +0 -43
- package/src/runtime/README.md +0 -3
- package/src/runtime/ai-action-policy.ts +0 -764
- package/src/runtime/document-layout.ts +0 -332
- package/src/runtime/document-navigation.ts +0 -603
- package/src/runtime/document-runtime.ts +0 -3159
- package/src/runtime/document-search.ts +0 -145
- package/src/runtime/numbering-prefix.ts +0 -216
- package/src/runtime/page-layout-estimation.ts +0 -212
- package/src/runtime/read-only-diagnostics-runtime.ts +0 -241
- package/src/runtime/review-runtime.ts +0 -44
- package/src/runtime/revision-runtime.ts +0 -107
- package/src/runtime/session-capabilities.ts +0 -192
- package/src/runtime/story-context.ts +0 -164
- package/src/runtime/story-targeting.ts +0 -162
- package/src/runtime/surface-projection.ts +0 -1357
- package/src/runtime/table-commands.ts +0 -173
- package/src/runtime/table-schema.ts +0 -309
- package/src/runtime/view-state.ts +0 -477
- package/src/runtime/virtualized-rendering.ts +0 -258
- package/src/runtime/workflow-markup.ts +0 -353
- package/src/ui/README.md +0 -30
- package/src/ui/WordReviewEditor.tsx +0 -4086
- package/src/ui/browser-export.ts +0 -52
- package/src/ui/comments/README.md +0 -3
- package/src/ui/compatibility/README.md +0 -3
- package/src/ui/editor-command-bag.ts +0 -120
- package/src/ui/editor-runtime-boundary.ts +0 -1457
- package/src/ui/editor-shell-view.tsx +0 -142
- package/src/ui/editor-surface/README.md +0 -3
- package/src/ui/editor-surface-controller.tsx +0 -61
- package/src/ui/headless/comment-decoration-model.ts +0 -124
- package/src/ui/headless/preserve-editor-selection.ts +0 -5
- package/src/ui/headless/revision-decoration-model.ts +0 -128
- package/src/ui/headless/selection-helpers.ts +0 -54
- package/src/ui/headless/selection-toolbar-model.ts +0 -34
- package/src/ui/headless/use-editor-keyboard.ts +0 -103
- package/src/ui/review/README.md +0 -3
- package/src/ui/runtime-snapshot-selectors.ts +0 -197
- package/src/ui/shared/revision-filters.ts +0 -31
- package/src/ui/status/README.md +0 -3
- package/src/ui/theme/README.md +0 -3
- package/src/ui/toolbar/README.md +0 -3
- package/src/ui/workflow-surface-blocked-rails.ts +0 -94
- package/src/ui-tailwind/chrome/tw-alert-banner.tsx +0 -64
- package/src/ui-tailwind/chrome/tw-image-context-toolbar.tsx +0 -129
- package/src/ui-tailwind/chrome/tw-layout-panel.tsx +0 -114
- package/src/ui-tailwind/chrome/tw-object-context-toolbar.tsx +0 -34
- package/src/ui-tailwind/chrome/tw-page-ruler.tsx +0 -386
- package/src/ui-tailwind/chrome/tw-selection-toolbar.tsx +0 -186
- package/src/ui-tailwind/chrome/tw-suggestion-card.tsx +0 -139
- package/src/ui-tailwind/chrome/tw-table-context-toolbar.tsx +0 -128
- package/src/ui-tailwind/chrome/tw-unsaved-modal.tsx +0 -58
- package/src/ui-tailwind/chrome/use-before-unload.ts +0 -20
- package/src/ui-tailwind/editor-surface/perf-probe.ts +0 -179
- package/src/ui-tailwind/editor-surface/pm-command-bridge.ts +0 -184
- package/src/ui-tailwind/editor-surface/pm-contextual-ui.ts +0 -31
- package/src/ui-tailwind/editor-surface/pm-decorations.ts +0 -427
- package/src/ui-tailwind/editor-surface/pm-position-map.ts +0 -123
- package/src/ui-tailwind/editor-surface/pm-schema.ts +0 -876
- package/src/ui-tailwind/editor-surface/pm-state-from-snapshot.ts +0 -504
- package/src/ui-tailwind/editor-surface/search-plugin.ts +0 -168
- package/src/ui-tailwind/editor-surface/surface-build-keys.ts +0 -61
- package/src/ui-tailwind/editor-surface/tw-caret.tsx +0 -12
- package/src/ui-tailwind/editor-surface/tw-editor-surface.tsx +0 -150
- package/src/ui-tailwind/editor-surface/tw-inline-token.tsx +0 -129
- package/src/ui-tailwind/editor-surface/tw-opaque-block.tsx +0 -58
- package/src/ui-tailwind/editor-surface/tw-paragraph-block.tsx +0 -151
- package/src/ui-tailwind/editor-surface/tw-prosemirror-surface.tsx +0 -944
- package/src/ui-tailwind/editor-surface/tw-segment-view.tsx +0 -111
- package/src/ui-tailwind/editor-surface/tw-table-node-view.tsx +0 -436
- package/src/ui-tailwind/index.ts +0 -62
- package/src/ui-tailwind/page-chrome-model.ts +0 -27
- package/src/ui-tailwind/review/tw-comment-sidebar.tsx +0 -406
- package/src/ui-tailwind/review/tw-health-panel.tsx +0 -149
- package/src/ui-tailwind/review/tw-review-rail.tsx +0 -120
- package/src/ui-tailwind/review/tw-revision-sidebar.tsx +0 -164
- package/src/ui-tailwind/status/tw-status-bar.tsx +0 -61
- package/src/ui-tailwind/toolbar/tw-toolbar-icon-button.tsx +0 -52
- package/src/ui-tailwind/toolbar/tw-toolbar.tsx +0 -1064
- package/src/ui-tailwind/tw-review-workspace.tsx +0 -1417
- package/src/validation/README.md +0 -3
- package/src/validation/compatibility-engine.ts +0 -634
- package/src/validation/compatibility-report.ts +0 -161
- package/src/validation/diagnostics.ts +0 -204
- package/src/validation/docx-comment-proof.ts +0 -707
- package/src/validation/import-diagnostics.ts +0 -128
- package/src/validation/low-priority-word-surfaces.ts +0 -373
- /package/{src → dist}/ui-tailwind/theme/editor-theme.css +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/compare/index.ts","../../src/model/cds-1.0.0.ts","../../src/model/canonical-document.ts","../../src/compare/diff-engine.ts","../../src/preservation/store.ts","../../src/preservation/relationship-retention.ts","../../src/io/ooxml/numbering-sentinels.ts","../../src/io/export/serialize-numbering.ts","../../src/io/export/serialize-main-document.ts","../../src/io/ooxml/revision-boundaries.ts","../../src/io/export/serialize-runtime-revisions.ts","../../src/io/export/split-review-boundaries.ts","../../src/io/export/serialize-comments.ts","../../src/io/ooxml/part-manifest.ts","../../src/io/opc/package-writer.ts","../../src/io/export/reattach-preserved-parts.ts","../../src/io/export/export-session.ts","../../src/io/opc/docx-package.ts","../../src/io/opc/package-reader.ts","../../src/core/selection/mapping.ts","../../src/core/state/editor-state.ts","../../src/review/store/comment-store.ts","../../src/review/store/runtime-comment-store.ts","../../src/compare/export-redlines.ts","../../src/compare/snapshot.ts"],"sourcesContent":["export {\n compareDocumentSnapshots,\n type CompareChange,\n type CompareChangeKind,\n type CompareDocumentVersionsOptions,\n type CompareVersionRef,\n type VersionCompareResult,\n} from \"./diff-engine.ts\";\n\nexport {\n exportComparedDocumentRedlines,\n type ExportComparedDocumentOptions,\n type ExportComparedDocumentResult,\n} from \"./export-redlines.ts\";\n\nexport {\n buildVersionAuditTrail,\n createDocumentVersionSnapshot,\n createDocumentVersionSnapshotId,\n lockDocumentVersionSnapshot,\n saveDocumentVersionSnapshot,\n type CreateDocumentVersionSnapshotOptions,\n type DocumentVersionSnapshot,\n type VersionAuditEntry,\n} from \"./snapshot.ts\";\n","export const CDS_SCHEMA_VERSION = \"cds/1.0.0\" as const;\nexport const LEGACY_PERSISTED_EDITOR_SNAPSHOT_VERSION =\n \"persisted-editor-snapshot/1\" as const;\nexport const PERSISTED_EDITOR_SNAPSHOT_VERSION =\n \"persisted-editor-snapshot/2\" as const;\nexport const COMPATIBILITY_REPORT_VERSION = \"compatibility-report/1\" as const;\n\nexport type CDS_SchemaVersion = typeof CDS_SCHEMA_VERSION;\nexport type PersistedEditorSnapshotVersion =\n | typeof LEGACY_PERSISTED_EDITOR_SNAPSHOT_VERSION\n | typeof PERSISTED_EDITOR_SNAPSHOT_VERSION;\nexport type CompatibilityReportVersion = typeof COMPATIBILITY_REPORT_VERSION;\n\nexport type Id = string;\nexport type UUID = string;\nexport type ISO8601DateTime = string;\nexport type Base64 = string;\nexport type PartName = string;\nexport type RelationshipId = string;\n\nexport type JsonPrimitive = string | number | boolean | null;\nexport type JsonValue = JsonPrimitive | JsonObject | JsonValue[];\n\nexport interface JsonObject {\n [key: string]: JsonValue | undefined;\n}\n\nexport interface ModelValidationIssue {\n path: string;\n message: string;\n}\n\nexport class ModelValidationError extends Error {\n readonly issues: readonly ModelValidationIssue[];\n\n constructor(message: string, issues: readonly ModelValidationIssue[]) {\n super(message);\n this.name = \"ModelValidationError\";\n this.issues = issues;\n }\n}\n\nconst UUID_PATTERN =\n /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\nconst ISO_8601_UTC_PATTERN =\n /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{3})?Z$/;\n\nexport function isPlainObject(value: unknown): value is Record<string, unknown> {\n if (value === null || typeof value !== \"object\" || Array.isArray(value)) {\n return false;\n }\n\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n\nexport function isNonEmptyString(value: unknown): value is string {\n return typeof value === \"string\" && value.trim().length > 0;\n}\n\nexport function isUuid(value: unknown): value is UUID {\n return typeof value === \"string\" && UUID_PATTERN.test(value);\n}\n\nexport function isIso8601UtcTimestamp(\n value: unknown,\n): value is ISO8601DateTime {\n return (\n typeof value === \"string\" &&\n ISO_8601_UTC_PATTERN.test(value) &&\n !Number.isNaN(Date.parse(value))\n );\n}\n\nexport function asPlainObject(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): Record<string, unknown> | null {\n if (!isPlainObject(value)) {\n issues.push({ path, message: \"Expected a plain object.\" });\n return null;\n }\n\n return value;\n}\n\nexport function expectString(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): string | null {\n if (!isNonEmptyString(value)) {\n issues.push({ path, message: \"Expected a non-empty string.\" });\n return null;\n }\n\n return value;\n}\n\nexport function expectStringAllowEmpty(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): string | null {\n if (typeof value !== \"string\") {\n issues.push({ path, message: \"Expected a string.\" });\n return null;\n }\n\n return value;\n}\n\nexport function expectExactString<T extends string>(\n value: unknown,\n expected: T,\n path: string,\n issues: ModelValidationIssue[],\n): T | null {\n if (value !== expected) {\n issues.push({\n path,\n message: `Expected ${JSON.stringify(expected)}.`,\n });\n return null;\n }\n\n return expected;\n}\n\nexport function expectIso8601UtcTimestamp(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): ISO8601DateTime | null {\n if (!isIso8601UtcTimestamp(value)) {\n issues.push({\n path,\n message: \"Expected an ISO 8601 UTC timestamp string.\",\n });\n return null;\n }\n\n return value;\n}\n\nexport function expectUuid(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): UUID | null {\n if (!isUuid(value)) {\n issues.push({\n path,\n message: \"Expected an RFC 4122 UUID string.\",\n });\n return null;\n }\n\n return value;\n}\n\nexport function sortRecordKeys<T>(\n record: Record<string, T>,\n): Array<[string, T]> {\n return Object.entries(record).sort(([left], [right]) =>\n left.localeCompare(right),\n );\n}\n\nexport function assertValid(\n issues: readonly ModelValidationIssue[],\n message: string,\n): void {\n if (issues.length > 0) {\n throw new ModelValidationError(message, issues);\n }\n}\n\nfunction toStableJsonValue(value: unknown): JsonValue {\n if (\n value === null ||\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n return value;\n }\n\n if (Array.isArray(value)) {\n return value.map((item) => toStableJsonValue(item));\n }\n\n if (!isPlainObject(value)) {\n throw new TypeError(\"Cannot serialize non-JSON value.\");\n }\n\n const sortedEntries = sortRecordKeys(value).filter(\n ([, entryValue]) => entryValue !== undefined,\n );\n const result: JsonObject = {};\n\n for (const [key, entryValue] of sortedEntries) {\n result[key] = toStableJsonValue(entryValue);\n }\n\n return result;\n}\n\nexport function stableStringify(value: unknown): string {\n return JSON.stringify(toStableJsonValue(value));\n}\n","import {\n CDS_SCHEMA_VERSION,\n type ISO8601DateTime,\n type ModelValidationIssue,\n type UUID,\n asPlainObject,\n assertValid,\n expectExactString,\n expectIso8601UtcTimestamp,\n expectString,\n expectStringAllowEmpty,\n expectUuid,\n stableStringify,\n} from \"./cds-1.0.0.ts\";\n\nconst CANONICAL_DOCUMENT_TOP_LEVEL_KEYS = [\n \"schemaVersion\",\n \"docId\",\n \"createdAt\",\n \"updatedAt\",\n \"metadata\",\n \"styles\",\n \"numbering\",\n \"media\",\n \"content\",\n \"review\",\n \"preservation\",\n \"diagnostics\",\n] as const;\n\nconst CANONICAL_DOCUMENT_OPTIONAL_KEYS = [\"subParts\", \"fieldRegistry\"] as const;\n\nconst ID_PATTERNS = {\n styleId: /^[A-Za-z_][A-Za-z0-9._-]{0,127}$/,\n abstractNumberingId: /^abstract-num:[A-Za-z0-9._-]{1,120}$/,\n numberingInstanceId: /^num:[A-Za-z0-9._-]{1,120}$/,\n mediaId: /^media:[A-Za-z0-9._/-]{1,120}$/,\n commentId:\n /^(?:comment:[A-Za-z0-9._-]{1,120}|comment-[A-Za-z0-9._-]{1,120}|[0-9]{1,18})$/,\n revisionId:\n /^(?:revision:[A-Za-z0-9._-]{1,120}|change-[A-Za-z0-9._-]{1,120})$/,\n fragmentId: /^fragment:[A-Za-z0-9._-]{1,120}$/,\n warningId: /^warning:[A-Za-z0-9._:-]{1,120}$/,\n diagnosticId: /^diagnostic:[A-Za-z0-9._-]{1,120}$/,\n packagePartName: /^\\/[A-Za-z0-9_.\\-\\/]+\\.[A-Za-z0-9]+$/,\n relationshipId: /^rId[A-Za-z0-9._-]{1,120}$/,\n} as const;\n\ntype StableIdDomain = keyof typeof ID_PATTERNS;\n\nexport interface CanonicalDocument {\n schemaVersion: typeof CDS_SCHEMA_VERSION;\n docId: UUID;\n createdAt: ISO8601DateTime;\n updatedAt: ISO8601DateTime;\n metadata: DocumentMetadata;\n styles: StylesCatalog;\n numbering: NumberingCatalog;\n media: MediaCatalog;\n content: DocumentRootNode;\n review: ReviewStore;\n preservation: PreservationStore;\n diagnostics: DiagnosticStore;\n subParts?: SubPartsCatalog;\n /** Package-backed field registry for supported field families. */\n fieldRegistry?: FieldRegistry;\n}\n\nexport interface DocumentMetadata {\n title?: string;\n subject?: string;\n description?: string;\n language?: string;\n keywords?: string[];\n category?: string;\n importMode?: string;\n customProperties: Record<string, string>;\n}\n\nexport interface StylesCatalog {\n paragraphs: Record<string, ParagraphStyleDefinition>;\n characters: Record<string, CharacterStyleDefinition>;\n tables: Record<string, TableStyleDefinition>;\n latentStyles?: Record<string, LatentStyleDefinition>;\n fromPackage?: boolean;\n}\n\nexport interface ParagraphStyleDefinition {\n styleId: string;\n basedOn?: string;\n nextStyle?: string;\n outlineLevel?: number;\n displayName: string;\n kind: \"paragraph\";\n isDefault: boolean;\n}\n\nexport interface CharacterStyleDefinition {\n styleId: string;\n basedOn?: string;\n displayName: string;\n kind: \"character\";\n isDefault: boolean;\n}\n\nexport interface TableStyleDefinition {\n styleId: string;\n basedOn?: string;\n displayName: string;\n kind: \"table\";\n isDefault: boolean;\n}\n\nexport interface LatentStyleDefinition {\n name: string;\n locked?: boolean;\n semiHidden?: boolean;\n unhideWhenUsed?: boolean;\n qFormat?: boolean;\n uiPriority?: number;\n}\n\nexport interface NumberingCatalog {\n abstractDefinitions: Record<string, AbstractNumberingDefinition>;\n instances: Record<string, NumberingInstance>;\n}\n\nexport interface AbstractNumberingDefinition {\n abstractNumberingId: string;\n levels: NumberingLevelDefinition[];\n}\n\nexport interface NumberingLevelDefinition {\n level: number;\n format: string;\n text: string;\n startAt?: number;\n paragraphStyleId?: string;\n isLegalNumbering?: boolean;\n suffix?: \"tab\" | \"space\" | \"nothing\";\n}\n\nexport interface NumberingInstance {\n numberingInstanceId: string;\n abstractNumberingId: string;\n overrides: NumberingLevelOverride[];\n}\n\nexport interface NumberingLevelOverride {\n level: number;\n startAt?: number;\n}\n\nexport interface MediaCatalog {\n items: Record<string, MediaItem>;\n}\n\nexport interface MediaItem {\n mediaId: string;\n contentType: string;\n filename: string;\n relationshipId?: string;\n packagePartName: string;\n altText?: string;\n display?: \"inline\" | \"floating\";\n widthEmu?: number;\n heightEmu?: number;\n}\n\n// ---- Sub-part canonical types ----\n\nexport type HeaderFooterVariant = \"default\" | \"first\" | \"even\";\n\nexport interface HeaderDocument {\n variant: HeaderFooterVariant;\n partPath: string;\n relationshipId: string;\n blocks: BlockNode[];\n sectionIndex?: number;\n}\n\nexport interface FooterDocument {\n variant: HeaderFooterVariant;\n partPath: string;\n relationshipId: string;\n blocks: BlockNode[];\n sectionIndex?: number;\n}\n\nexport interface FootnoteDefinition {\n noteId: string;\n kind: \"footnote\" | \"endnote\";\n blocks: BlockNode[];\n}\n\nexport interface FootnoteCollection {\n footnotes: Record<string, FootnoteDefinition>;\n endnotes: Record<string, FootnoteDefinition>;\n}\n\nexport interface ThemeColorScheme {\n name: string;\n colors: Record<string, string>;\n}\n\nexport interface ThemeFontScheme {\n name: string;\n majorFont?: string;\n minorFont?: string;\n}\n\nexport interface ThemeDefinition {\n name?: string;\n colorScheme?: ThemeColorScheme;\n fontScheme?: ThemeFontScheme;\n}\n\nexport interface DocumentSettings {\n evenAndOddHeaders?: boolean;\n zoomLevel?: \"pageWidth\" | \"onePage\" | number;\n}\n\nexport interface SubPartsCatalog {\n headers: HeaderDocument[];\n footers: FooterDocument[];\n footnoteCollection?: FootnoteCollection;\n theme?: ThemeDefinition;\n finalSectionProperties?: SectionProperties;\n resolvedTheme?: ResolvedTheme;\n settings?: DocumentSettings;\n}\n\nexport interface ResolvedTheme {\n colors: Record<string, string>;\n majorFont?: string;\n minorFont?: string;\n}\n\n// ---- Inline footnote reference node ----\n\nexport interface FootnoteRefNode {\n type: \"footnote_ref\";\n noteId: string;\n noteKind: \"footnote\" | \"endnote\";\n}\n\nexport type DocumentNode =\n | DocumentRootNode\n | ParagraphNode\n | TableNode\n | TableRowNode\n | TableCellNode\n | SdtNode\n | CustomXmlNode\n | AltChunkNode\n | TextNode\n | HardBreakNode\n | TabNode\n | ColumnBreakNode\n | SymbolNode\n | HyperlinkNode\n | ImageNode\n | FieldNode\n | BookmarkStartNode\n | BookmarkEndNode\n | SectionBreakNode\n | OpaqueInlineNode\n | OpaqueBlockNode\n | FootnoteRefNode\n | ChartPreviewNode\n | SmartArtPreviewNode\n | ShapeNode\n | WordArtNode\n | VmlShapeNode;\n\nexport interface DocumentRootNode {\n type: \"doc\";\n children: BlockNode[];\n}\n\nexport type BlockNode =\n | ParagraphNode\n | TableNode\n | SdtNode\n | CustomXmlNode\n | AltChunkNode\n | SectionBreakNode\n | OpaqueBlockNode;\n\nexport interface ParagraphSpacing {\n before?: number;\n after?: number;\n line?: number;\n lineRule?: \"auto\" | \"exact\" | \"atLeast\";\n}\n\nexport interface ParagraphIndentation {\n left?: number;\n right?: number;\n firstLine?: number;\n hanging?: number;\n}\n\nexport interface TabStop {\n position: number;\n align: \"left\" | \"center\" | \"right\" | \"decimal\" | \"bar\" | \"clear\";\n leader?: \"none\" | \"dot\" | \"hyphen\" | \"underscore\" | \"heavy\" | \"middleDot\";\n}\n\nexport interface ParagraphBorders {\n top?: BorderSpec;\n left?: BorderSpec;\n bottom?: BorderSpec;\n right?: BorderSpec;\n bar?: BorderSpec;\n between?: BorderSpec;\n}\n\nexport interface ParagraphShading {\n fill?: string;\n color?: string;\n val?: string;\n}\n\nexport interface ParagraphNode {\n type: \"paragraph\";\n styleId?: string;\n numbering?: {\n numberingInstanceId: string;\n level: number;\n };\n alignment?: \"left\" | \"center\" | \"right\" | \"both\" | \"distribute\";\n spacing?: ParagraphSpacing;\n contextualSpacing?: boolean;\n indentation?: ParagraphIndentation;\n tabStops?: TabStop[];\n keepNext?: boolean;\n keepLines?: boolean;\n outlineLevel?: number;\n pageBreakBefore?: boolean;\n widowControl?: boolean;\n borders?: ParagraphBorders;\n shading?: ParagraphShading;\n bidi?: boolean;\n suppressLineNumbers?: boolean;\n cnfStyle?: string;\n children: InlineNode[];\n}\n\nexport interface BorderSpec {\n value?: string;\n size?: number;\n space?: number;\n color?: string;\n}\n\nexport interface TableBorders {\n top?: BorderSpec;\n left?: BorderSpec;\n bottom?: BorderSpec;\n right?: BorderSpec;\n insideH?: BorderSpec;\n insideV?: BorderSpec;\n}\n\nexport interface TableCellBorders {\n top?: BorderSpec;\n left?: BorderSpec;\n bottom?: BorderSpec;\n right?: BorderSpec;\n insideH?: BorderSpec;\n insideV?: BorderSpec;\n}\n\nexport interface TableWidth {\n value: number;\n type: \"dxa\" | \"auto\" | \"pct\" | \"nil\";\n}\n\nexport interface CellShading {\n fill?: string;\n color?: string;\n val?: string;\n}\n\nexport interface TableCellMargins {\n top?: number;\n left?: number;\n bottom?: number;\n right?: number;\n}\n\nexport interface TableLook {\n val?: string;\n firstRow?: boolean;\n lastRow?: boolean;\n firstColumn?: boolean;\n lastColumn?: boolean;\n noHBand?: boolean;\n noVBand?: boolean;\n}\n\nexport interface TableNode {\n type: \"table\";\n styleId?: string;\n propertiesXml?: string;\n gridColumns: number[];\n rows: TableRowNode[];\n width?: TableWidth;\n alignment?: \"left\" | \"center\" | \"right\";\n borders?: TableBorders;\n cellMargins?: TableCellMargins;\n tblLook?: TableLook;\n}\n\nexport interface TableRowNode {\n type: \"table_row\";\n propertiesXml?: string;\n cells: TableCellNode[];\n gridBefore?: number;\n widthBefore?: TableWidth;\n gridAfter?: number;\n widthAfter?: TableWidth;\n height?: number;\n heightRule?: \"auto\" | \"atLeast\" | \"exact\";\n isHeader?: boolean;\n}\n\nexport interface TableCellNode {\n type: \"table_cell\";\n propertiesXml?: string;\n gridSpan?: number;\n verticalMerge?: \"restart\" | \"continue\";\n children: BlockNode[];\n width?: TableWidth;\n borders?: TableCellBorders;\n shading?: CellShading;\n verticalAlign?: \"top\" | \"center\" | \"bottom\";\n}\n\nexport interface SdtCheckboxState {\n checked: boolean;\n checkedChar?: string;\n uncheckedChar?: string;\n}\n\nexport interface SdtDatePickerState {\n fullDate?: string;\n dateFormat?: string;\n lid?: string;\n}\n\nexport interface SdtDropdownListItem {\n displayText?: string;\n value: string;\n}\n\nexport interface SdtNode {\n type: \"sdt\";\n properties: {\n sdtType?: string;\n alias?: string;\n tag?: string;\n lock?: string;\n propertiesXml?: string;\n checkbox?: SdtCheckboxState;\n datePicker?: SdtDatePickerState;\n dropdownList?: SdtDropdownListItem[];\n comboBox?: SdtDropdownListItem[];\n showingPlcHdr?: boolean;\n };\n children: BlockNode[];\n}\n\nexport interface CustomXmlNode {\n type: \"custom_xml\";\n uri?: string;\n element?: string;\n children: BlockNode[];\n}\n\nexport interface AltChunkNode {\n type: \"alt_chunk\";\n relationshipId: string;\n}\n\n/**\n * Supported field families that receive first-class canonical treatment.\n * These families have stable registry IDs, dependency metadata, and\n * runtime-owned refresh behavior.\n */\nexport type SupportedFieldFamily = \"REF\" | \"PAGEREF\" | \"NOTEREF\" | \"TOC\";\n\n/**\n * Unsupported field families that remain preserve-only.\n * They survive round-trip but do not participate in runtime refresh.\n */\nexport type PreserveOnlyFieldFamily =\n | \"PAGE\"\n | \"NUMPAGES\"\n | \"DATE\"\n | \"TIME\"\n | \"AUTHOR\"\n | \"FILENAME\"\n | \"MERGEFIELD\"\n | \"IF\"\n | \"SEQ\"\n | \"INDEX\"\n | \"TC\"\n | \"STYLEREF\"\n | \"FORMULA\"\n | \"UNKNOWN\";\n\nexport type FieldFamily = SupportedFieldFamily | PreserveOnlyFieldFamily;\n\n/** Runtime refresh status for a field instance. */\nexport type FieldRefreshStatus =\n | \"current\"\n | \"stale\"\n | \"unresolvable\"\n | \"preserve-only\";\n\nexport interface FieldNode {\n type: \"field\";\n fieldType: \"simple\" | \"complex\";\n instruction: string;\n children: InlineNode[];\n /** Classified field family. Undefined for legacy snapshots. */\n fieldFamily?: FieldFamily;\n /** Target bookmark name for REF/PAGEREF/NOTEREF fields. */\n fieldTarget?: string;\n /** Runtime refresh status. Undefined for legacy or preserve-only fields. */\n refreshStatus?: FieldRefreshStatus;\n}\n\n// ─── Field registry ─────────────────────────────────────────────────────────\n\n/**\n * Package-backed field registry that catalogs every field instance in the\n * document, grouped by supported vs preserve-only families.\n *\n * Supported field entries carry dependency metadata (bookmark targets) and\n * participate in deterministic refresh. Preserve-only entries survive\n * round-trip but are not refreshable.\n */\nexport interface FieldRegistry {\n /** Supported field instances that participate in refresh. */\n supported: FieldRegistryEntry[];\n /** Preserve-only field instances cataloged for round-trip safety. */\n preserveOnly: FieldRegistryEntry[];\n /** Generated TOC structure extracted from heading-driven TOC fields. */\n tocStructure?: TocStructure;\n}\n\nexport interface FieldRegistryEntry {\n /** Stable document-order index of this field (0-based). */\n fieldIndex: number;\n /** Classified field family. */\n fieldFamily: FieldFamily;\n /** Whether the field is in the supported refresh slice. */\n supported: boolean;\n /** Field instruction text. */\n instruction: string;\n /** Target bookmark name for REF/PAGEREF/NOTEREF fields. */\n fieldTarget?: string;\n /** Current display text extracted from field content. */\n displayText: string;\n /** Paragraph index in document order where this field appears. */\n paragraphIndex: number;\n /** Runtime refresh status. */\n refreshStatus: FieldRefreshStatus;\n}\n\n/**\n * Generated table-of-contents structure extracted from TOC fields and\n * heading-styled paragraphs in the document.\n */\nexport interface TocStructure {\n /** The raw TOC field instruction (e.g. \"TOC \\\\o \\\"1-3\\\" \\\\h\"). */\n instruction: string;\n /** Heading level range the TOC covers. */\n levelRange: { from: number; to: number };\n /** Ordered TOC entries derived from heading paragraphs. */\n entries: TocEntry[];\n /** Whether the TOC content is current with the heading structure. */\n status: \"current\" | \"stale\";\n}\n\nexport interface TocEntry {\n /** Heading text. */\n text: string;\n /** Heading outline level (1-9). */\n level: number;\n /** Paragraph index of the heading in document order. */\n paragraphIndex: number;\n /** Style ID of the heading paragraph, if available. */\n styleId?: string;\n /** Bookmark name anchoring this heading, if present. */\n bookmarkName?: string;\n}\n\nexport interface BookmarkStartNode {\n type: \"bookmark_start\";\n bookmarkId: string;\n name: string;\n}\n\nexport interface BookmarkEndNode {\n type: \"bookmark_end\";\n bookmarkId: string;\n}\n\nexport interface SectionBreakNode {\n type: \"section_break\";\n sectionPropertiesXml?: string;\n /**\n * @deprecated Legacy field from older snapshots. New exports should use\n * sectionPropertiesXml and only contain raw <w:sectPr> content.\n */\n propertiesXml?: string;\n sectionProperties?: SectionProperties;\n}\n\nexport interface SectionProperties {\n pageSize?: PageSize;\n pageMargins?: PageMargins;\n columns?: ColumnProperties;\n pageNumbering?: PageNumbering;\n lineNumbering?: SectionLineNumbering;\n pageBorders?: SectionPageBorders;\n documentGrid?: SectionDocumentGrid;\n headerReferences?: HeaderFooterReference[];\n footerReferences?: HeaderFooterReference[];\n sectionType?: \"continuous\" | \"nextPage\" | \"evenPage\" | \"oddPage\" | \"nextColumn\";\n titlePage?: boolean;\n}\n\nexport interface PageSize {\n width: number;\n height: number;\n orientation?: \"portrait\" | \"landscape\";\n}\n\nexport interface PageMargins {\n top: number;\n right: number;\n bottom: number;\n left: number;\n header?: number;\n footer?: number;\n gutter?: number;\n}\n\nexport interface ColumnProperties {\n count?: number;\n space?: number;\n equalWidth?: boolean;\n columns?: Array<{ width: number; space?: number }>;\n separator?: boolean;\n}\n\nexport interface PageNumbering {\n format?: string;\n start?: number;\n chapStyle?: string;\n chapSep?: string;\n}\n\nexport interface SectionLineNumbering {\n countBy?: number;\n start?: number;\n distance?: number;\n restart?: \"newPage\" | \"newSection\" | \"continuous\";\n}\n\nexport interface SectionPageBorders {\n top?: BorderSpec;\n left?: BorderSpec;\n bottom?: BorderSpec;\n right?: BorderSpec;\n offsetFrom?: \"page\" | \"text\";\n display?: \"allPages\" | \"firstPage\" | \"notFirstPage\";\n zOrder?: \"front\" | \"back\";\n}\n\nexport interface SectionDocumentGrid {\n type?: \"default\" | \"lines\" | \"linesAndChars\" | \"snapToChars\";\n linePitch?: number;\n charSpace?: number;\n}\n\nexport interface HeaderFooterReference {\n variant: HeaderFooterVariant;\n relationshipId: string;\n}\n\nexport type InlineNode =\n | TextNode\n | HardBreakNode\n | ColumnBreakNode\n | TabNode\n | SymbolNode\n | HyperlinkNode\n | ImageNode\n | FieldNode\n | BookmarkStartNode\n | BookmarkEndNode\n | OpaqueInlineNode\n | FootnoteRefNode\n | ChartPreviewNode\n | SmartArtPreviewNode\n | ShapeNode\n | WordArtNode\n | VmlShapeNode;\n\nexport interface TextNode {\n type: \"text\";\n text: string;\n marks?: TextMark[];\n}\n\nexport type TextMark =\n | { type: \"bold\" }\n | { type: \"italic\" }\n | { type: \"underline\" }\n | { type: \"strikethrough\" }\n | { type: \"doubleStrikethrough\" }\n | { type: \"vanish\" }\n | { type: \"lang\"; val: string }\n | { type: \"highlight\"; color: string; val: string }\n | { type: \"backgroundColor\"; color: string }\n | { type: \"charSpacing\"; val: number }\n | { type: \"kerning\"; val: number }\n | { type: \"emboss\" }\n | { type: \"imprint\" }\n | { type: \"shadow\" }\n | { type: \"position\"; val: number }\n | { type: \"textFill\"; xml: string }\n | { type: \"fontFamily\"; val: string }\n | { type: \"fontSize\"; val: number }\n | { type: \"textColor\"; color: string }\n | { type: \"smallCaps\" }\n | { type: \"allCaps\" };\n\nexport interface HardBreakNode {\n type: \"hard_break\";\n}\n\nexport interface ColumnBreakNode {\n type: \"column_break\";\n}\n\nexport interface TabNode {\n type: \"tab\";\n}\n\nexport interface SymbolNode {\n type: \"symbol\";\n char: string;\n font?: string;\n marks?: TextMark[];\n}\n\nexport interface HyperlinkNode {\n type: \"hyperlink\";\n href: string;\n children: Array<TextNode | HardBreakNode | ColumnBreakNode | TabNode | SymbolNode>;\n}\n\nexport interface ImageNode {\n type: \"image\";\n mediaId: string;\n altText?: string;\n placementXml?: string;\n display?: \"inline\" | \"floating\";\n floating?: FloatingImageProperties;\n}\n\nexport interface FloatingImageProperties {\n horizontalPosition?: FloatingAxisPosition;\n verticalPosition?: FloatingAxisPosition;\n wrap?: \"none\" | \"square\" | \"tight\" | \"through\" | \"topAndBottom\";\n behindDoc?: boolean;\n layoutInCell?: boolean;\n allowOverlap?: boolean;\n}\n\nexport interface FloatingAxisPosition {\n relativeFrom?: string;\n align?: string;\n offset?: number;\n}\n\nexport interface OpaqueInlineNode {\n type: \"opaque_inline\";\n fragmentId: string;\n warningId: string;\n}\n\n// ---- Complex rendering inline nodes (read-only previews) ----\n\n/**\n * Read-only preview of a chart (c:chart). The original drawing XML is stored in\n * rawXml for lossless round-trip export. If a fallback image was present in\n * mc:AlternateContent it is referenced by previewMediaId.\n */\nexport interface ChartPreviewNode {\n type: \"chart_preview\";\n previewMediaId?: string;\n rawXml: string;\n}\n\n/**\n * Read-only preview of a SmartArt diagram (dgm:*). The original drawing XML is\n * stored in rawXml for lossless round-trip export.\n */\nexport interface SmartArtPreviewNode {\n type: \"smartart_preview\";\n previewMediaId?: string;\n rawXml: string;\n}\n\n/**\n * Read-only rendering of a wps:wsp WordprocessingShape. Text content is\n * extracted for display. The original drawing XML is preserved in rawXml.\n */\nexport interface ShapeNode {\n type: \"shape\";\n text?: string;\n geometry?: string;\n isTextBox?: boolean;\n rawXml: string;\n}\n\n/**\n * Read-only rendering of WordArt — a wps:wsp shape with a text-geometry preset.\n * Text is extracted for display. The original drawing XML is preserved in rawXml.\n */\nexport interface WordArtNode {\n type: \"wordart\";\n text: string;\n geometry?: string;\n rawXml: string;\n}\n\n/**\n * Read-only rendering of a VML shape (v:shape, v:rect, v:textbox) from a w:pict\n * element. Text is extracted for display. The original w:pict XML is preserved\n * in rawXml for lossless round-trip export.\n */\nexport interface VmlShapeNode {\n type: \"vml_shape\";\n text?: string;\n shapeType?: string;\n rawXml: string;\n}\n\nexport interface OpaqueBlockNode {\n type: \"opaque_block\";\n fragmentId: string;\n warningId: string;\n rawXml?: string;\n}\n\nexport interface DocRange {\n from: number;\n to: number;\n}\n\nexport interface BoundaryAssoc {\n start: -1 | 1;\n end: -1 | 1;\n}\n\nexport type CanonicalAnchor =\n | {\n kind: \"range\";\n range: DocRange;\n assoc: BoundaryAssoc;\n }\n | {\n kind: \"node\";\n at: number;\n assoc: -1 | 1;\n }\n | {\n kind: \"detached\";\n lastKnownRange: DocRange;\n reason: \"deleted\" | \"invalidatedByStructureChange\" | \"importAmbiguity\";\n };\n\nexport interface ReviewStore {\n comments: Record<string, CommentThread>;\n revisions: Record<string, RevisionRecord>;\n}\n\nexport interface CommentThread {\n commentId: string;\n status: \"open\" | \"resolved\" | \"detached\";\n anchor: CanonicalAnchor;\n createdAt: ISO8601DateTime;\n createdBy?: string;\n authorId?: string;\n body?: string;\n entries?: CommentEntry[];\n resolution?: CommentResolution;\n resolvedAt?: ISO8601DateTime;\n warningIds: string[];\n isResolved?: boolean;\n metadata?: CommentThreadMetadata;\n}\n\nexport interface CommentEntry {\n entryId: string;\n authorId: string;\n createdAt: ISO8601DateTime;\n body: string;\n metadata?: CommentEntryMetadata;\n}\n\nexport interface CommentEntryMetadata {\n ooxmlCommentId?: string;\n paraId?: string;\n parentParaId?: string;\n durableId?: string;\n initials?: string;\n}\n\nexport interface CommentResolution {\n resolvedAt: ISO8601DateTime;\n resolvedBy: string;\n}\n\nexport interface CommentThreadMetadata {\n source?: \"runtime\" | \"import\";\n rootOoxmlCommentId?: string;\n rootParaId?: string;\n}\n\nexport interface RevisionPropertyChangeData {\n xmlTag: \"pPrChange\" | \"sectPrChange\" | \"tblPrChange\" | \"rPrChange\";\n beforeXml: string;\n}\n\nexport interface RevisionMoveData {\n moveId: string;\n direction: \"from\" | \"to\";\n}\n\nexport type RevisionStoryTargetRecord =\n | { kind: \"main\" }\n | {\n kind: \"header\";\n relationshipId: string;\n variant: \"default\" | \"first\" | \"even\";\n sectionIndex?: number;\n }\n | {\n kind: \"footer\";\n relationshipId: string;\n variant: \"default\" | \"first\" | \"even\";\n sectionIndex?: number;\n }\n | { kind: \"footnote\"; noteId: string }\n | { kind: \"endnote\"; noteId: string };\n\nexport interface RevisionRecord {\n changeId: string;\n kind: \"insertion\" | \"deletion\" | \"formatting\" | \"move\" | \"property-change\";\n anchor: CanonicalAnchor;\n authorId?: string;\n createdAt: ISO8601DateTime;\n warningIds?: string[];\n metadata?: RevisionMetadataRecord;\n status: \"open\" | \"accepted\" | \"rejected\" | \"detached\";\n}\n\nexport interface RevisionMetadataRecord {\n source?: \"runtime\" | \"import\";\n storyTarget?: RevisionStoryTargetRecord;\n preserveOnlyReason?: string;\n importedRevisionForm?:\n | \"run-insertion\"\n | \"run-deletion\"\n | \"paragraph-insertion\"\n | \"paragraph-deletion\";\n originalRevisionType?: string;\n ooxmlRevisionId?: string;\n propertyChangeData?: RevisionPropertyChangeData;\n moveData?: RevisionMoveData;\n}\n\nexport interface PreservationStore {\n opaqueFragments: Record<string, OpaqueFragmentRecord>;\n packageParts: Record<string, PreservedPackagePart>;\n}\n\nexport interface OpaqueFragmentRecord {\n fragmentId: string;\n payloadKind: \"xml-subtree\" | \"package-part\";\n payloadReference: string;\n featureClass: \"preserve-only\";\n lastKnownRange: DocRange;\n warningId: string;\n packagePartName?: string;\n relationshipId?: string;\n}\n\nexport interface PreservedPackagePart {\n packagePartName: string;\n contentType: string;\n relationshipIds: string[];\n}\n\nexport interface DiagnosticStore {\n warnings: DiagnosticWarningEntry[];\n errors: DiagnosticErrorEntry[];\n}\n\nexport interface DiagnosticWarningEntry {\n diagnosticId: string;\n warningId: string;\n source:\n | \"import\"\n | \"runtime\"\n | \"review\"\n | \"preservation\"\n | \"validation\"\n | \"export\";\n message: string;\n}\n\nexport interface DiagnosticErrorEntry {\n diagnosticId: string;\n code:\n | \"load_failed\"\n | \"import_failed\"\n | \"export_failed\"\n | \"package_corrupt\"\n | \"validation_failed\"\n | \"datastore_failed\"\n | \"internal_invariant\";\n message: string;\n isFatal: boolean;\n source: \"import\" | \"runtime\" | \"validation\" | \"datastore\" | \"host\" | \"export\";\n details?: unknown;\n}\n\nexport function createCanonicalDocument(\n input: Omit<CanonicalDocument, \"schemaVersion\">,\n): CanonicalDocument {\n const document: CanonicalDocument = {\n schemaVersion: CDS_SCHEMA_VERSION,\n ...input,\n };\n\n assertCanonicalDocument(document);\n return document;\n}\n\nexport function serializeCanonicalDocument(document: CanonicalDocument): string {\n assertCanonicalDocument(document);\n return stableStringify(document);\n}\n\nexport function createCanonicalDocumentSignature(document: unknown): string {\n return stableStringify(document);\n}\n\nexport function parseCanonicalDocument(json: string): CanonicalDocument {\n const parsed = JSON.parse(json) as unknown;\n assertCanonicalDocument(parsed);\n return parsed;\n}\n\nexport function projectCanonicalDocument(\n document: CanonicalDocument,\n): CanonicalDocument {\n assertCanonicalDocument(document);\n return JSON.parse(stableStringify(document)) as CanonicalDocument;\n}\n\nexport function assertCanonicalDocument(\n value: unknown,\n): asserts value is CanonicalDocument {\n const issues = validateCanonicalDocument(value);\n assertValid(issues, \"Invalid canonical document.\");\n}\n\nexport function validateCanonicalDocument(\n value: unknown,\n): ModelValidationIssue[] {\n const issues: ModelValidationIssue[] = [];\n const record = asPlainObject(value, \"$\", issues);\n if (!record) {\n return issues;\n }\n\n validateExactObjectKeys(record, CANONICAL_DOCUMENT_TOP_LEVEL_KEYS, \"$\", issues, CANONICAL_DOCUMENT_OPTIONAL_KEYS);\n expectExactString(record.schemaVersion, CDS_SCHEMA_VERSION, \"$.schemaVersion\", issues);\n expectUuid(record.docId, \"$.docId\", issues);\n expectIso8601UtcTimestamp(record.createdAt, \"$.createdAt\", issues);\n expectIso8601UtcTimestamp(record.updatedAt, \"$.updatedAt\", issues);\n\n validateMetadata(record.metadata, \"$.metadata\", issues);\n validateStylesCatalog(record.styles, \"$.styles\", issues);\n validateNumberingCatalog(record.numbering, \"$.numbering\", issues);\n validateMediaCatalog(record.media, \"$.media\", issues);\n validateDocumentNode(record.content, \"$.content\", issues);\n validateReviewStore(record.review, \"$.review\", issues);\n validatePreservationStore(record.preservation, \"$.preservation\", issues);\n validateDiagnosticStore(record.diagnostics, \"$.diagnostics\", issues);\n if (record.subParts !== undefined) {\n validateSubPartsCatalog(record.subParts, \"$.subParts\", issues);\n }\n validateDocumentReferences(record, issues);\n\n return issues;\n}\n\nfunction validateMetadata(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n const customProperties = asPlainObject(record.customProperties, `${path}.customProperties`, issues);\n if (!customProperties) {\n return;\n }\n\n for (const [propertyKey, propertyValue] of Object.entries(customProperties)) {\n if (typeof propertyValue !== \"string\") {\n issues.push({\n path: `${path}.customProperties.${propertyKey}`,\n message: \"customProperties values must be strings.\",\n });\n }\n }\n}\n\nfunction validateStylesCatalog(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n validateStyleMap(record.paragraphs, `${path}.paragraphs`, issues);\n validateStyleMap(record.characters, `${path}.characters`, issues);\n validateStyleMap(record.tables, `${path}.tables`, issues);\n if (record.latentStyles !== undefined) {\n validateLatentStyleMap(record.latentStyles, `${path}.latentStyles`, issues);\n }\n}\n\nfunction validateStyleMap(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n for (const [styleId, definition] of Object.entries(record)) {\n expectDomainString(styleId, \"styleId\", `${path}.${styleId}`, issues);\n const definitionRecord = asPlainObject(definition, `${path}.${styleId}`, issues);\n if (!definitionRecord) {\n continue;\n }\n if (definitionRecord.styleId !== styleId) {\n issues.push({\n path: `${path}.${styleId}.styleId`,\n message: \"styleId must match the map key.\",\n });\n }\n }\n}\n\nfunction validateLatentStyleMap(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n for (const [styleName, definition] of Object.entries(record)) {\n const definitionRecord = asPlainObject(definition, `${path}.${styleName}`, issues);\n if (!definitionRecord) {\n continue;\n }\n if (definitionRecord.name !== styleName) {\n issues.push({\n path: `${path}.${styleName}.name`,\n message: \"name must match the map key.\",\n });\n }\n if (definitionRecord.uiPriority !== undefined && typeof definitionRecord.uiPriority !== \"number\") {\n issues.push({\n path: `${path}.${styleName}.uiPriority`,\n message: \"uiPriority must be a number.\",\n });\n }\n }\n}\n\nfunction validateNumberingCatalog(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n const abstractDefinitions = asPlainObject(\n record.abstractDefinitions,\n `${path}.abstractDefinitions`,\n issues,\n );\n if (abstractDefinitions) {\n for (const [abstractId, definition] of Object.entries(abstractDefinitions)) {\n expectDomainString(\n abstractId,\n \"abstractNumberingId\",\n `${path}.abstractDefinitions.${abstractId}`,\n issues,\n );\n const definitionRecord = asPlainObject(\n definition,\n `${path}.abstractDefinitions.${abstractId}`,\n issues,\n );\n if (definitionRecord && definitionRecord.abstractNumberingId !== abstractId) {\n issues.push({\n path: `${path}.abstractDefinitions.${abstractId}.abstractNumberingId`,\n message: \"abstractNumberingId must match the map key.\",\n });\n }\n }\n }\n\n const instances = asPlainObject(record.instances, `${path}.instances`, issues);\n if (instances) {\n for (const [instanceId, instance] of Object.entries(instances)) {\n expectDomainString(\n instanceId,\n \"numberingInstanceId\",\n `${path}.instances.${instanceId}`,\n issues,\n );\n const instanceRecord = asPlainObject(\n instance,\n `${path}.instances.${instanceId}`,\n issues,\n );\n if (!instanceRecord) {\n continue;\n }\n if (instanceRecord.numberingInstanceId !== instanceId) {\n issues.push({\n path: `${path}.instances.${instanceId}.numberingInstanceId`,\n message: \"numberingInstanceId must match the map key.\",\n });\n }\n expectDomainString(\n instanceRecord.abstractNumberingId,\n \"abstractNumberingId\",\n `${path}.instances.${instanceId}.abstractNumberingId`,\n issues,\n );\n }\n }\n}\n\nfunction validateMediaCatalog(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n const items = asPlainObject(record.items, `${path}.items`, issues);\n if (!items) {\n return;\n }\n\n for (const [mediaId, item] of Object.entries(items)) {\n expectDomainString(mediaId, \"mediaId\", `${path}.items.${mediaId}`, issues);\n const itemRecord = asPlainObject(item, `${path}.items.${mediaId}`, issues);\n if (!itemRecord) {\n continue;\n }\n if (itemRecord.mediaId !== mediaId) {\n issues.push({\n path: `${path}.items.${mediaId}.mediaId`,\n message: \"mediaId must match the map key.\",\n });\n }\n expectDomainString(\n itemRecord.packagePartName,\n \"packagePartName\",\n `${path}.items.${mediaId}.packagePartName`,\n issues,\n );\n if (itemRecord.relationshipId !== undefined) {\n expectDomainString(\n itemRecord.relationshipId,\n \"relationshipId\",\n `${path}.items.${mediaId}.relationshipId`,\n issues,\n );\n }\n }\n}\n\nfunction validateDocumentNode(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n const type = expectString(record.type, `${path}.type`, issues);\n if (!type) {\n return;\n }\n\n switch (type) {\n case \"doc\":\n case \"paragraph\":\n case \"sdt\":\n case \"custom_xml\":\n case \"hyperlink\":\n if (!Array.isArray(record.children)) {\n issues.push({ path: `${path}.children`, message: \"children must be an array.\" });\n } else {\n record.children.forEach((child, index) =>\n validateDocumentNode(child, `${path}.children[${index}]`, issues),\n );\n }\n if (type === \"paragraph\" && record.styleId !== undefined) {\n expectDomainString(record.styleId, \"styleId\", `${path}.styleId`, issues);\n }\n if (type === \"paragraph\" && record.numbering !== undefined) {\n const numbering = asPlainObject(record.numbering, `${path}.numbering`, issues);\n if (numbering) {\n expectDomainString(\n numbering.numberingInstanceId,\n \"numberingInstanceId\",\n `${path}.numbering.numberingInstanceId`,\n issues,\n );\n if (typeof numbering.level !== \"number\") {\n issues.push({\n path: `${path}.numbering.level`,\n message: \"level must be a number.\",\n });\n }\n }\n }\n if (type === \"hyperlink\") {\n expectString(record.href, `${path}.href`, issues);\n }\n return;\n case \"alt_chunk\":\n expectDomainString(record.relationshipId, \"relationshipId\", `${path}.relationshipId`, issues);\n return;\n case \"image\":\n expectDomainString(record.mediaId, \"mediaId\", `${path}.mediaId`, issues);\n if (record.placementXml !== undefined) {\n expectString(record.placementXml, `${path}.placementXml`, issues);\n }\n if (record.display !== undefined) {\n const display = expectString(record.display, `${path}.display`, issues);\n if (display && display !== \"inline\" && display !== \"floating\") {\n issues.push({\n path: `${path}.display`,\n message: \"display must be 'inline' or 'floating'.\",\n });\n }\n }\n if (record.floating !== undefined) {\n validateFloatingImageProperties(record.floating, `${path}.floating`, issues);\n }\n return;\n case \"opaque_inline\":\n case \"opaque_block\":\n expectDomainString(record.fragmentId, \"fragmentId\", `${path}.fragmentId`, issues);\n expectDomainString(record.warningId, \"warningId\", `${path}.warningId`, issues);\n if (record.rawXml !== undefined) {\n expectString(record.rawXml, `${path}.rawXml`, issues);\n }\n return;\n case \"table\":\n if (!Array.isArray(record.gridColumns)) {\n issues.push({ path: `${path}.gridColumns`, message: \"gridColumns must be an array.\" });\n }\n if (!Array.isArray(record.rows)) {\n issues.push({ path: `${path}.rows`, message: \"rows must be an array.\" });\n } else {\n record.rows.forEach((row, rowIndex) =>\n validateDocumentNode(row, `${path}.rows[${rowIndex}]`, issues),\n );\n }\n return;\n case \"table_row\":\n if (!Array.isArray(record.cells)) {\n issues.push({ path: `${path}.cells`, message: \"cells must be an array.\" });\n } else {\n record.cells.forEach((cell, cellIndex) =>\n validateDocumentNode(cell, `${path}.cells[${cellIndex}]`, issues),\n );\n }\n return;\n case \"table_cell\":\n if (!Array.isArray(record.children)) {\n issues.push({ path: `${path}.children`, message: \"children must be an array.\" });\n } else {\n record.children.forEach((child, childIndex) =>\n validateDocumentNode(child, `${path}.children[${childIndex}]`, issues),\n );\n }\n return;\n case \"field\":\n expectString(record.fieldType, `${path}.fieldType`, issues);\n expectString(record.instruction, `${path}.instruction`, issues);\n if (!Array.isArray(record.children)) {\n issues.push({ path: `${path}.children`, message: \"children must be an array.\" });\n } else {\n record.children.forEach((child, index) =>\n validateDocumentNode(child, `${path}.children[${index}]`, issues),\n );\n }\n return;\n case \"bookmark_start\":\n expectString(record.bookmarkId, `${path}.bookmarkId`, issues);\n expectString(record.name, `${path}.name`, issues);\n return;\n case \"bookmark_end\":\n expectString(record.bookmarkId, `${path}.bookmarkId`, issues);\n return;\n case \"section_break\":\n return;\n case \"text\":\n if (typeof record.text !== \"string\") {\n issues.push({\n path: `${path}.text`,\n message: \"text must be a string.\",\n });\n }\n return;\n case \"hard_break\":\n case \"column_break\":\n case \"tab\":\n return;\n case \"symbol\":\n expectString(record.char, `${path}.char`, issues);\n if (record.font !== undefined) {\n expectString(record.font, `${path}.font`, issues);\n }\n return;\n case \"footnote_ref\":\n expectString(record.noteId, `${path}.noteId`, issues);\n if (record.noteKind !== \"footnote\" && record.noteKind !== \"endnote\") {\n issues.push({\n path: `${path}.noteKind`,\n message: \"noteKind must be 'footnote' or 'endnote'.\",\n });\n }\n return;\n case \"chart_preview\":\n case \"smartart_preview\":\n case \"shape\":\n case \"wordart\":\n case \"vml_shape\":\n expectString(record.rawXml, `${path}.rawXml`, issues);\n return;\n default:\n issues.push({\n path: `${path}.type`,\n message: `Unsupported node type ${JSON.stringify(type)}.`,\n });\n }\n}\n\nfunction validateFloatingImageProperties(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n if (record.horizontalPosition !== undefined) {\n validateFloatingAxisPosition(record.horizontalPosition, `${path}.horizontalPosition`, issues);\n }\n if (record.verticalPosition !== undefined) {\n validateFloatingAxisPosition(record.verticalPosition, `${path}.verticalPosition`, issues);\n }\n if (record.wrap !== undefined) {\n const wrap = expectString(record.wrap, `${path}.wrap`, issues);\n if (\n wrap &&\n wrap !== \"none\" &&\n wrap !== \"square\" &&\n wrap !== \"tight\" &&\n wrap !== \"through\" &&\n wrap !== \"topAndBottom\"\n ) {\n issues.push({\n path: `${path}.wrap`,\n message: \"wrap must be one of none, square, tight, through, or topAndBottom.\",\n });\n }\n }\n}\n\nfunction validateFloatingAxisPosition(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n if (record.relativeFrom !== undefined) {\n expectString(record.relativeFrom, `${path}.relativeFrom`, issues);\n }\n if (record.align !== undefined) {\n expectString(record.align, `${path}.align`, issues);\n }\n if (record.offset !== undefined && typeof record.offset !== \"number\") {\n issues.push({\n path: `${path}.offset`,\n message: \"offset must be a number.\",\n });\n }\n}\n\nfunction validateReviewStore(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n const comments = asPlainObject(record.comments, `${path}.comments`, issues);\n if (comments) {\n for (const [commentId, thread] of Object.entries(comments)) {\n expectDomainString(commentId, \"commentId\", `${path}.comments.${commentId}`, issues);\n const threadRecord = asPlainObject(thread, `${path}.comments.${commentId}`, issues);\n if (!threadRecord) {\n continue;\n }\n if (threadRecord.commentId !== commentId) {\n issues.push({\n path: `${path}.comments.${commentId}.commentId`,\n message: \"commentId must match the map key.\",\n });\n }\n validateAnchor(threadRecord.anchor, `${path}.comments.${commentId}.anchor`, issues);\n expectIso8601UtcTimestamp(\n threadRecord.createdAt,\n `${path}.comments.${commentId}.createdAt`,\n issues,\n );\n validateCommentStatus(threadRecord.status, `${path}.comments.${commentId}.status`, issues);\n if (threadRecord.createdBy !== undefined) {\n expectString(\n threadRecord.createdBy,\n `${path}.comments.${commentId}.createdBy`,\n issues,\n );\n }\n if (threadRecord.authorId !== undefined) {\n expectString(\n threadRecord.authorId,\n `${path}.comments.${commentId}.authorId`,\n issues,\n );\n }\n if (threadRecord.body !== undefined) {\n expectStringAllowEmpty(\n threadRecord.body,\n `${path}.comments.${commentId}.body`,\n issues,\n );\n }\n if (!Array.isArray(threadRecord.warningIds)) {\n issues.push({\n path: `${path}.comments.${commentId}.warningIds`,\n message: \"warningIds must be an array.\",\n });\n } else {\n threadRecord.warningIds.forEach((warningId, index) =>\n expectDomainString(\n warningId,\n \"warningId\",\n `${path}.comments.${commentId}.warningIds[${index}]`,\n issues,\n ),\n );\n }\n if (threadRecord.entries !== undefined) {\n validateCommentEntries(\n threadRecord.entries,\n `${path}.comments.${commentId}.entries`,\n issues,\n );\n }\n if (threadRecord.resolution !== undefined) {\n validateCommentResolution(\n threadRecord.resolution,\n `${path}.comments.${commentId}.resolution`,\n issues,\n );\n }\n if (threadRecord.resolvedAt !== undefined) {\n expectIso8601UtcTimestamp(\n threadRecord.resolvedAt,\n `${path}.comments.${commentId}.resolvedAt`,\n issues,\n );\n }\n if (\n threadRecord.isResolved !== undefined &&\n typeof threadRecord.isResolved !== \"boolean\"\n ) {\n issues.push({\n path: `${path}.comments.${commentId}.isResolved`,\n message: \"isResolved must be a boolean.\",\n });\n }\n if (threadRecord.metadata !== undefined) {\n validateCommentThreadMetadata(\n threadRecord.metadata,\n `${path}.comments.${commentId}.metadata`,\n issues,\n );\n }\n }\n }\n\n const revisions = asPlainObject(record.revisions, `${path}.revisions`, issues);\n if (revisions) {\n for (const [revisionId, revision] of Object.entries(revisions)) {\n expectDomainString(revisionId, \"revisionId\", `${path}.revisions.${revisionId}`, issues);\n const revisionRecord = asPlainObject(\n revision,\n `${path}.revisions.${revisionId}`,\n issues,\n );\n if (!revisionRecord) {\n continue;\n }\n if (revisionRecord.changeId !== revisionId) {\n issues.push({\n path: `${path}.revisions.${revisionId}.changeId`,\n message: \"changeId must match the map key.\",\n });\n }\n validateAnchor(revisionRecord.anchor, `${path}.revisions.${revisionId}.anchor`, issues);\n validateRevisionKind(revisionRecord.kind, `${path}.revisions.${revisionId}.kind`, issues);\n validateRevisionStatus(\n revisionRecord.status,\n `${path}.revisions.${revisionId}.status`,\n issues,\n );\n expectIso8601UtcTimestamp(\n revisionRecord.createdAt,\n `${path}.revisions.${revisionId}.createdAt`,\n issues,\n );\n if (revisionRecord.authorId !== undefined) {\n expectString(\n revisionRecord.authorId,\n `${path}.revisions.${revisionId}.authorId`,\n issues,\n );\n }\n if (revisionRecord.warningIds !== undefined) {\n validateWarningIds(\n revisionRecord.warningIds,\n `${path}.revisions.${revisionId}.warningIds`,\n issues,\n );\n }\n if (revisionRecord.metadata !== undefined) {\n validateRevisionMetadata(\n revisionRecord.metadata,\n `${path}.revisions.${revisionId}.metadata`,\n issues,\n );\n }\n }\n }\n}\n\nfunction validateCommentStatus(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n if (value === \"open\" || value === \"resolved\" || value === \"detached\") {\n return;\n }\n issues.push({\n path,\n message: \"status must be one of open, resolved, or detached.\",\n });\n}\n\nfunction validateCommentEntries(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n if (!Array.isArray(value)) {\n issues.push({\n path,\n message: \"entries must be an array.\",\n });\n return;\n }\n\n value.forEach((entry, index) => {\n const record = asPlainObject(entry, `${path}[${index}]`, issues);\n if (!record) {\n return;\n }\n expectString(record.entryId, `${path}[${index}].entryId`, issues);\n expectString(record.authorId, `${path}[${index}].authorId`, issues);\n expectStringAllowEmpty(record.body, `${path}[${index}].body`, issues);\n expectIso8601UtcTimestamp(record.createdAt, `${path}[${index}].createdAt`, issues);\n if (record.metadata !== undefined) {\n validateCommentEntryMetadata(record.metadata, `${path}[${index}].metadata`, issues);\n }\n });\n}\n\nfunction validateCommentEntryMetadata(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n for (const field of [\n \"ooxmlCommentId\",\n \"paraId\",\n \"parentParaId\",\n \"durableId\",\n \"initials\",\n ] as const) {\n if (record[field] !== undefined) {\n expectString(record[field], `${path}.${field}`, issues);\n }\n }\n}\n\nfunction validateCommentResolution(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n expectIso8601UtcTimestamp(record.resolvedAt, `${path}.resolvedAt`, issues);\n expectString(record.resolvedBy, `${path}.resolvedBy`, issues);\n}\n\nfunction validateCommentThreadMetadata(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n if (\n record.source !== undefined &&\n record.source !== \"runtime\" &&\n record.source !== \"import\"\n ) {\n issues.push({\n path: `${path}.source`,\n message: \"source must be either runtime or import.\",\n });\n }\n if (record.rootOoxmlCommentId !== undefined) {\n expectString(record.rootOoxmlCommentId, `${path}.rootOoxmlCommentId`, issues);\n }\n if (record.rootParaId !== undefined) {\n expectString(record.rootParaId, `${path}.rootParaId`, issues);\n }\n}\n\nfunction validateRevisionKind(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n if (\n value === \"insertion\" ||\n value === \"deletion\" ||\n value === \"formatting\" ||\n value === \"move\" ||\n value === \"property-change\"\n ) {\n return;\n }\n issues.push({\n path,\n message: \"kind must be insertion, deletion, formatting, move, or property-change.\",\n });\n}\n\nfunction validateRevisionStatus(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n if (\n value === \"open\" ||\n value === \"accepted\" ||\n value === \"rejected\" ||\n value === \"detached\"\n ) {\n return;\n }\n issues.push({\n path,\n message: \"status must be one of open, accepted, rejected, or detached.\",\n });\n}\n\nfunction validateWarningIds(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n if (!Array.isArray(value)) {\n issues.push({\n path,\n message: \"warningIds must be an array.\",\n });\n return;\n }\n\n value.forEach((warningId, index) =>\n expectDomainString(warningId, \"warningId\", `${path}[${index}]`, issues),\n );\n}\n\nfunction validateRevisionMetadata(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n if (\n record.source !== undefined &&\n record.source !== \"runtime\" &&\n record.source !== \"import\"\n ) {\n issues.push({\n path: `${path}.source`,\n message: \"source must be either runtime or import.\",\n });\n }\n for (const field of [\n \"preserveOnlyReason\",\n \"importedRevisionForm\",\n \"originalRevisionType\",\n \"ooxmlRevisionId\",\n ] as const) {\n if (record[field] !== undefined) {\n expectString(record[field], `${path}.${field}`, issues);\n }\n }\n\n if (record.propertyChangeData !== undefined) {\n const pcd = asPlainObject(record.propertyChangeData, `${path}.propertyChangeData`, issues);\n if (pcd) {\n expectString(pcd.xmlTag, `${path}.propertyChangeData.xmlTag`, issues);\n expectString(pcd.beforeXml, `${path}.propertyChangeData.beforeXml`, issues);\n }\n }\n\n if (record.moveData !== undefined) {\n const md = asPlainObject(record.moveData, `${path}.moveData`, issues);\n if (md) {\n expectString(md.moveId, `${path}.moveData.moveId`, issues);\n expectString(md.direction, `${path}.moveData.direction`, issues);\n }\n }\n}\n\nfunction validatePreservationStore(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n const opaqueFragments = asPlainObject(\n record.opaqueFragments,\n `${path}.opaqueFragments`,\n issues,\n );\n if (opaqueFragments) {\n for (const [fragmentId, fragment] of Object.entries(opaqueFragments)) {\n expectDomainString(fragmentId, \"fragmentId\", `${path}.opaqueFragments.${fragmentId}`, issues);\n const fragmentRecord = asPlainObject(\n fragment,\n `${path}.opaqueFragments.${fragmentId}`,\n issues,\n );\n if (!fragmentRecord) {\n continue;\n }\n if (fragmentRecord.fragmentId !== fragmentId) {\n issues.push({\n path: `${path}.opaqueFragments.${fragmentId}.fragmentId`,\n message: \"fragmentId must match the map key.\",\n });\n }\n validateRange(\n fragmentRecord.lastKnownRange,\n `${path}.opaqueFragments.${fragmentId}.lastKnownRange`,\n issues,\n );\n expectDomainString(\n fragmentRecord.warningId,\n \"warningId\",\n `${path}.opaqueFragments.${fragmentId}.warningId`,\n issues,\n );\n if (fragmentRecord.packagePartName !== undefined) {\n expectDomainString(\n fragmentRecord.packagePartName,\n \"packagePartName\",\n `${path}.opaqueFragments.${fragmentId}.packagePartName`,\n issues,\n );\n }\n if (fragmentRecord.relationshipId !== undefined) {\n expectDomainString(\n fragmentRecord.relationshipId,\n \"relationshipId\",\n `${path}.opaqueFragments.${fragmentId}.relationshipId`,\n issues,\n );\n }\n }\n }\n\n const packageParts = asPlainObject(record.packageParts, `${path}.packageParts`, issues);\n if (packageParts) {\n for (const [packagePartName, packagePart] of Object.entries(packageParts)) {\n expectDomainString(\n packagePartName,\n \"packagePartName\",\n `${path}.packageParts.${packagePartName}`,\n issues,\n );\n const packagePartRecord = asPlainObject(\n packagePart,\n `${path}.packageParts.${packagePartName}`,\n issues,\n );\n if (!packagePartRecord) {\n continue;\n }\n if (packagePartRecord.packagePartName !== packagePartName) {\n issues.push({\n path: `${path}.packageParts.${packagePartName}.packagePartName`,\n message: \"packagePartName must match the map key.\",\n });\n }\n if (Array.isArray(packagePartRecord.relationshipIds)) {\n packagePartRecord.relationshipIds.forEach((relationshipId, index) =>\n expectDomainString(\n relationshipId,\n \"relationshipId\",\n `${path}.packageParts.${packagePartName}.relationshipIds[${index}]`,\n issues,\n ),\n );\n }\n }\n }\n}\n\nfunction validateDiagnosticStore(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n if (Array.isArray(record.warnings)) {\n record.warnings.forEach((warning, index) => {\n const warningRecord = asPlainObject(warning, `${path}.warnings[${index}]`, issues);\n if (!warningRecord) {\n return;\n }\n expectDomainString(\n warningRecord.diagnosticId,\n \"diagnosticId\",\n `${path}.warnings[${index}].diagnosticId`,\n issues,\n );\n expectDomainString(\n warningRecord.warningId,\n \"warningId\",\n `${path}.warnings[${index}].warningId`,\n issues,\n );\n });\n }\n\n if (Array.isArray(record.errors)) {\n record.errors.forEach((error, index) => {\n const errorRecord = asPlainObject(error, `${path}.errors[${index}]`, issues);\n if (!errorRecord) {\n return;\n }\n expectDomainString(\n errorRecord.diagnosticId,\n \"diagnosticId\",\n `${path}.errors[${index}].diagnosticId`,\n issues,\n );\n });\n }\n}\n\nfunction validateAnchor(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n const kind = expectString(record.kind, `${path}.kind`, issues);\n if (!kind) {\n return;\n }\n\n if (kind === \"range\") {\n validateRange(record.range, `${path}.range`, issues);\n validateBoundaryAssoc(record.assoc, `${path}.assoc`, issues);\n } else if (kind === \"node\") {\n if (typeof record.at !== \"number\") {\n issues.push({\n path: `${path}.at`,\n message: \"node anchors must contain a numeric at value.\",\n });\n }\n if (record.assoc !== -1 && record.assoc !== 1) {\n issues.push({\n path: `${path}.assoc`,\n message: \"node anchor assoc must be -1 or 1.\",\n });\n }\n } else if (kind === \"detached\") {\n validateRange(record.lastKnownRange, `${path}.lastKnownRange`, issues);\n if (\n record.reason !== \"deleted\" &&\n record.reason !== \"invalidatedByStructureChange\" &&\n record.reason !== \"importAmbiguity\"\n ) {\n issues.push({\n path: `${path}.reason`,\n message: \"detached anchor reason must be deleted, invalidatedByStructureChange, or importAmbiguity.\",\n });\n }\n } else {\n issues.push({\n path: `${path}.kind`,\n message: \"anchor kind must be range, node, or detached.\",\n });\n }\n}\n\nfunction validateBoundaryAssoc(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n if (record.start !== -1 && record.start !== 1) {\n issues.push({\n path: `${path}.start`,\n message: \"assoc.start must be -1 or 1.\",\n });\n }\n if (record.end !== -1 && record.end !== 1) {\n issues.push({\n path: `${path}.end`,\n message: \"assoc.end must be -1 or 1.\",\n });\n }\n}\n\nfunction validateDocumentReferences(\n record: Record<string, unknown>,\n issues: ModelValidationIssue[],\n): void {\n const paragraphStyleIds = new Set(\n Object.keys(asPlainObject(asPlainObject(record.styles, \"$.styles\", [])?.paragraphs, \"$.styles.paragraphs\", []) ?? {}),\n );\n const numberingInstanceIds = new Set(\n Object.keys(asPlainObject(asPlainObject(record.numbering, \"$.numbering\", [])?.instances, \"$.numbering.instances\", []) ?? {}),\n );\n const abstractNumberingIds = new Set(\n Object.keys(asPlainObject(asPlainObject(record.numbering, \"$.numbering\", [])?.abstractDefinitions, \"$.numbering.abstractDefinitions\", []) ?? {}),\n );\n const mediaIds = new Set(\n Object.keys(asPlainObject(asPlainObject(record.media, \"$.media\", [])?.items, \"$.media.items\", []) ?? {}),\n );\n const warningIds = new Set(\n (Array.isArray(asPlainObject(record.diagnostics, \"$.diagnostics\", [])?.warnings)\n ? (asPlainObject(record.diagnostics, \"$.diagnostics\", [])?.warnings as Array<Record<string, unknown>>)\n : []\n ).flatMap((warning) => typeof warning.warningId === \"string\" ? [warning.warningId] : []),\n );\n const fragmentIds = new Set(\n Object.keys(asPlainObject(asPlainObject(record.preservation, \"$.preservation\", [])?.opaqueFragments, \"$.preservation.opaqueFragments\", []) ?? {}),\n );\n const noteIds = collectNoteIds(record);\n\n const numberingInstances = asPlainObject(\n asPlainObject(record.numbering, \"$.numbering\", [])?.instances,\n \"$.numbering.instances\",\n [],\n );\n if (numberingInstances) {\n for (const [instanceId, instance] of Object.entries(numberingInstances)) {\n const instanceRecord = asPlainObject(instance, `$.numbering.instances.${instanceId}`, []);\n if (\n instanceRecord &&\n typeof instanceRecord.abstractNumberingId === \"string\" &&\n !abstractNumberingIds.has(instanceRecord.abstractNumberingId)\n ) {\n issues.push({\n path: `$.numbering.instances.${instanceId}.abstractNumberingId`,\n message: \"abstractNumberingId must reference an existing abstract numbering definition.\",\n });\n }\n }\n }\n\n validateDocumentNodeReferences(record.content, \"$.content\", issues, {\n paragraphStyleIds,\n numberingInstanceIds,\n mediaIds,\n warningIds,\n fragmentIds,\n noteIds,\n });\n validateSubPartReferences(record.subParts, \"$.subParts\", issues, {\n paragraphStyleIds,\n numberingInstanceIds,\n mediaIds,\n warningIds,\n fragmentIds,\n noteIds,\n });\n validateReviewReferences(record.review, \"$.review\", issues, warningIds);\n}\n\nfunction validateDocumentNodeReferences(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n references: {\n paragraphStyleIds: ReadonlySet<string>;\n numberingInstanceIds: ReadonlySet<string>;\n mediaIds: ReadonlySet<string>;\n warningIds: ReadonlySet<string>;\n fragmentIds: ReadonlySet<string>;\n noteIds: ReadonlySet<string>;\n },\n): void {\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n const type = typeof record.type === \"string\" ? record.type : undefined;\n if (type === \"paragraph\") {\n if (\n typeof record.styleId === \"string\" &&\n !references.paragraphStyleIds.has(record.styleId)\n ) {\n issues.push({\n path: `${path}.styleId`,\n message: \"styleId must reference an existing paragraph style definition.\",\n });\n }\n const numbering = asPlainObject(record.numbering, `${path}.numbering`, []);\n if (\n numbering &&\n typeof numbering.numberingInstanceId === \"string\" &&\n !references.numberingInstanceIds.has(numbering.numberingInstanceId)\n ) {\n issues.push({\n path: `${path}.numbering.numberingInstanceId`,\n message: \"numberingInstanceId must reference an existing numbering instance.\",\n });\n }\n } else if (type === \"image\") {\n if (typeof record.mediaId === \"string\" && !references.mediaIds.has(record.mediaId)) {\n issues.push({\n path: `${path}.mediaId`,\n message: \"mediaId must reference an existing media catalog item.\",\n });\n }\n } else if (type === \"opaque_inline\" || type === \"opaque_block\") {\n if (typeof record.fragmentId === \"string\" && !references.fragmentIds.has(record.fragmentId)) {\n issues.push({\n path: `${path}.fragmentId`,\n message: \"fragmentId must reference an existing opaque fragment.\",\n });\n }\n if (typeof record.warningId === \"string\" && !references.warningIds.has(record.warningId)) {\n issues.push({\n path: `${path}.warningId`,\n message: \"warningId must reference an existing diagnostic warning.\",\n });\n }\n } else if (type === \"footnote_ref\") {\n if (typeof record.noteId === \"string\" && !references.noteIds.has(`${record.noteKind}:${record.noteId}`)) {\n issues.push({\n path: `${path}.noteId`,\n message: \"noteId must reference an existing footnote or endnote definition.\",\n });\n }\n }\n\n if (Array.isArray(record.children)) {\n record.children.forEach((child, index) =>\n validateDocumentNodeReferences(child, `${path}.children[${index}]`, issues, references),\n );\n }\n if (Array.isArray(record.rows)) {\n record.rows.forEach((row, index) =>\n validateDocumentNodeReferences(row, `${path}.rows[${index}]`, issues, references),\n );\n }\n if (Array.isArray(record.cells)) {\n record.cells.forEach((cell, index) =>\n validateDocumentNodeReferences(cell, `${path}.cells[${index}]`, issues, references),\n );\n }\n}\n\nfunction validateReviewReferences(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n warningIds: ReadonlySet<string>,\n): void {\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n const comments = asPlainObject(record.comments, `${path}.comments`, []);\n if (comments) {\n for (const [commentId, thread] of Object.entries(comments)) {\n const threadRecord = asPlainObject(thread, `${path}.comments.${commentId}`, []);\n if (!threadRecord || !Array.isArray(threadRecord.warningIds)) {\n continue;\n }\n threadRecord.warningIds.forEach((warningId, index) => {\n if (typeof warningId === \"string\" && !warningIds.has(warningId)) {\n issues.push({\n path: `${path}.comments.${commentId}.warningIds[${index}]`,\n message: \"warningIds must reference existing diagnostic warnings.\",\n });\n }\n });\n }\n }\n\n const revisions = asPlainObject(record.revisions, `${path}.revisions`, []);\n if (revisions) {\n for (const [revisionId, revision] of Object.entries(revisions)) {\n const revisionRecord = asPlainObject(revision, `${path}.revisions.${revisionId}`, []);\n if (!revisionRecord || !Array.isArray(revisionRecord.warningIds)) {\n continue;\n }\n revisionRecord.warningIds.forEach((warningId, index) => {\n if (typeof warningId === \"string\" && !warningIds.has(warningId)) {\n issues.push({\n path: `${path}.revisions.${revisionId}.warningIds[${index}]`,\n message: \"warningIds must reference existing diagnostic warnings.\",\n });\n }\n });\n }\n }\n}\n\nfunction validateSubPartReferences(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n references: {\n paragraphStyleIds: ReadonlySet<string>;\n numberingInstanceIds: ReadonlySet<string>;\n mediaIds: ReadonlySet<string>;\n warningIds: ReadonlySet<string>;\n fragmentIds: ReadonlySet<string>;\n noteIds: ReadonlySet<string>;\n },\n): void {\n if (value === undefined) {\n return;\n }\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n const headers = Array.isArray(record.headers) ? record.headers : [];\n headers.forEach((header, index) => {\n const headerRecord = asPlainObject(header, `${path}.headers[${index}]`, []);\n if (!headerRecord || !Array.isArray(headerRecord.blocks)) {\n return;\n }\n headerRecord.blocks.forEach((block, blockIndex) =>\n validateDocumentNodeReferences(block, `${path}.headers[${index}].blocks[${blockIndex}]`, issues, references),\n );\n });\n\n const footers = Array.isArray(record.footers) ? record.footers : [];\n footers.forEach((footer, index) => {\n const footerRecord = asPlainObject(footer, `${path}.footers[${index}]`, []);\n if (!footerRecord || !Array.isArray(footerRecord.blocks)) {\n return;\n }\n footerRecord.blocks.forEach((block, blockIndex) =>\n validateDocumentNodeReferences(block, `${path}.footers[${index}].blocks[${blockIndex}]`, issues, references),\n );\n });\n\n if (record.footnoteCollection !== undefined) {\n const footnoteCollection = asPlainObject(record.footnoteCollection, `${path}.footnoteCollection`, []);\n const footnotes = asPlainObject(footnoteCollection?.footnotes, `${path}.footnoteCollection.footnotes`, []);\n if (footnotes) {\n for (const [noteId, note] of Object.entries(footnotes)) {\n const noteRecord = asPlainObject(note, `${path}.footnoteCollection.footnotes.${noteId}`, []);\n if (!noteRecord || !Array.isArray(noteRecord.blocks)) {\n continue;\n }\n noteRecord.blocks.forEach((block, blockIndex) =>\n validateDocumentNodeReferences(\n block,\n `${path}.footnoteCollection.footnotes.${noteId}.blocks[${blockIndex}]`,\n issues,\n references,\n ),\n );\n }\n }\n\n const endnotes = asPlainObject(footnoteCollection?.endnotes, `${path}.footnoteCollection.endnotes`, []);\n if (endnotes) {\n for (const [noteId, note] of Object.entries(endnotes)) {\n const noteRecord = asPlainObject(note, `${path}.footnoteCollection.endnotes.${noteId}`, []);\n if (!noteRecord || !Array.isArray(noteRecord.blocks)) {\n continue;\n }\n noteRecord.blocks.forEach((block, blockIndex) =>\n validateDocumentNodeReferences(\n block,\n `${path}.footnoteCollection.endnotes.${noteId}.blocks[${blockIndex}]`,\n issues,\n references,\n ),\n );\n }\n }\n }\n}\n\nfunction collectNoteIds(record: Record<string, unknown>): Set<string> {\n const noteIds = new Set<string>();\n const subParts = asPlainObject(record.subParts, \"$.subParts\", []);\n const footnoteCollection = asPlainObject(subParts?.footnoteCollection, \"$.subParts.footnoteCollection\", []);\n const footnotes = asPlainObject(footnoteCollection?.footnotes, \"$.subParts.footnoteCollection.footnotes\", []);\n if (footnotes) {\n Object.keys(footnotes).forEach((noteId) => noteIds.add(`footnote:${noteId}`));\n }\n const endnotes = asPlainObject(footnoteCollection?.endnotes, \"$.subParts.footnoteCollection.endnotes\", []);\n if (endnotes) {\n Object.keys(endnotes).forEach((noteId) => noteIds.add(`endnote:${noteId}`));\n }\n return noteIds;\n}\n\nfunction validateRange(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n if (typeof record.from !== \"number\" || typeof record.to !== \"number\") {\n issues.push({\n path,\n message: \"Range must contain numeric from and to values.\",\n });\n }\n}\n\nfunction validateExactObjectKeys(\n record: Record<string, unknown>,\n expectedKeys: readonly string[],\n path: string,\n issues: ModelValidationIssue[],\n allowedOptionalKeys?: readonly string[],\n): void {\n const actualKeys = new Set(Object.keys(record));\n const expected = new Set(expectedKeys);\n const optional = new Set(allowedOptionalKeys ?? []);\n\n for (const expectedKey of expectedKeys) {\n if (!actualKeys.has(expectedKey)) {\n issues.push({\n path,\n message: `Missing required key ${JSON.stringify(expectedKey)}.`,\n });\n }\n }\n\n for (const actualKey of actualKeys) {\n if (!expected.has(actualKey) && !optional.has(actualKey)) {\n issues.push({\n path: `${path}.${actualKey}`,\n message:\n \"Unexpected canonical document key. Render/UI state is not part of the canonical envelope.\",\n });\n }\n }\n}\n\nfunction validateSubPartsCatalog(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n if (value === undefined) {\n return;\n }\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n if (record.headers !== undefined) {\n if (!Array.isArray(record.headers)) {\n issues.push({ path: `${path}.headers`, message: \"headers must be an array.\" });\n } else {\n record.headers.forEach((header, index) => {\n const headerRecord = asPlainObject(header, `${path}.headers[${index}]`, issues);\n if (headerRecord) {\n expectString(headerRecord.variant, `${path}.headers[${index}].variant`, issues);\n expectString(headerRecord.partPath, `${path}.headers[${index}].partPath`, issues);\n expectString(headerRecord.relationshipId, `${path}.headers[${index}].relationshipId`, issues);\n if (!Array.isArray(headerRecord.blocks)) {\n issues.push({ path: `${path}.headers[${index}].blocks`, message: \"blocks must be an array.\" });\n } else {\n headerRecord.blocks.forEach((block, blockIndex) =>\n validateDocumentNode(block, `${path}.headers[${index}].blocks[${blockIndex}]`, issues),\n );\n }\n }\n });\n }\n }\n\n if (record.footers !== undefined) {\n if (!Array.isArray(record.footers)) {\n issues.push({ path: `${path}.footers`, message: \"footers must be an array.\" });\n } else {\n record.footers.forEach((footer, index) => {\n const footerRecord = asPlainObject(footer, `${path}.footers[${index}]`, issues);\n if (footerRecord) {\n expectString(footerRecord.variant, `${path}.footers[${index}].variant`, issues);\n expectString(footerRecord.partPath, `${path}.footers[${index}].partPath`, issues);\n expectString(footerRecord.relationshipId, `${path}.footers[${index}].relationshipId`, issues);\n if (!Array.isArray(footerRecord.blocks)) {\n issues.push({ path: `${path}.footers[${index}].blocks`, message: \"blocks must be an array.\" });\n } else {\n footerRecord.blocks.forEach((block, blockIndex) =>\n validateDocumentNode(block, `${path}.footers[${index}].blocks[${blockIndex}]`, issues),\n );\n }\n }\n });\n }\n }\n\n if (record.footnoteCollection !== undefined) {\n const footnoteCollection = asPlainObject(record.footnoteCollection, `${path}.footnoteCollection`, issues);\n if (footnoteCollection) {\n validateSubPartNoteMap(footnoteCollection.footnotes, \"footnote\", `${path}.footnoteCollection.footnotes`, issues);\n validateSubPartNoteMap(footnoteCollection.endnotes, \"endnote\", `${path}.footnoteCollection.endnotes`, issues);\n }\n }\n}\n\nfunction validateSubPartNoteMap(\n value: unknown,\n expectedKind: \"footnote\" | \"endnote\",\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n for (const [noteId, note] of Object.entries(record)) {\n const noteRecord = asPlainObject(note, `${path}.${noteId}`, issues);\n if (!noteRecord) {\n continue;\n }\n expectString(noteRecord.noteId, `${path}.${noteId}.noteId`, issues);\n if (noteRecord.noteId !== noteId) {\n issues.push({\n path: `${path}.${noteId}.noteId`,\n message: \"noteId must match the map key.\",\n });\n }\n if (noteRecord.kind !== expectedKind) {\n issues.push({\n path: `${path}.${noteId}.kind`,\n message: `kind must be ${expectedKind}.`,\n });\n }\n if (!Array.isArray(noteRecord.blocks)) {\n issues.push({ path: `${path}.${noteId}.blocks`, message: \"blocks must be an array.\" });\n } else {\n noteRecord.blocks.forEach((block, blockIndex) =>\n validateDocumentNode(block, `${path}.${noteId}.blocks[${blockIndex}]`, issues),\n );\n }\n }\n}\n\nfunction expectDomainString(\n value: unknown,\n domain: StableIdDomain,\n path: string,\n issues: ModelValidationIssue[],\n): string | null {\n const stableId = expectString(value, path, issues);\n if (!stableId) {\n return null;\n }\n\n if (!ID_PATTERNS[domain].test(stableId)) {\n issues.push({\n path,\n message: `Expected a valid ${domain}.`,\n });\n return null;\n }\n\n return stableId;\n}\n","import {\n createCanonicalDocumentSignature,\n projectCanonicalDocument,\n type BlockNode,\n type CanonicalDocument,\n type HyperlinkNode,\n type InlineNode,\n type ParagraphNode,\n type RevisionRecord,\n type TextNode,\n} from \"../model/canonical-document.ts\";\nimport type { DocumentVersionSnapshot } from \"./snapshot.ts\";\n\nexport interface CompareVersionRef {\n versionId: string;\n name: string;\n signature: string;\n}\n\nexport type CompareChangeKind =\n | \"paragraph-insertion\"\n | \"paragraph-deletion\"\n | \"paragraph-modification\"\n | \"structural-insertion\"\n | \"structural-deletion\";\n\nexport interface CompareChange {\n changeId: string;\n kind: CompareChangeKind;\n tracked: boolean;\n blockType: BlockNode[\"type\"];\n beforeText?: string;\n afterText?: string;\n targetIndex: number;\n}\n\nexport interface VersionCompareResult {\n compareVersion: \"version-compare-result/1\";\n comparedAt: string;\n base: CompareVersionRef;\n target: CompareVersionRef;\n changes: CompareChange[];\n comparedDocument: CanonicalDocument;\n}\n\nexport interface CompareDocumentVersionsOptions {\n comparedAt?: string;\n authorId?: string;\n}\n\ninterface BuildEntry {\n changeId?: string;\n block: BlockNode;\n trackChange?: \"insertion\" | \"deletion\";\n tracked: boolean;\n blockType: BlockNode[\"type\"];\n beforeText?: string;\n afterText?: string;\n}\n\ninterface PendingRevision {\n changeId: string;\n kind: \"insertion\" | \"deletion\";\n paragraphIndex: number;\n}\n\ninterface LcsMatch {\n baseIndex: number;\n targetIndex: number;\n}\n\nexport function compareDocumentSnapshots(\n base: DocumentVersionSnapshot,\n target: DocumentVersionSnapshot,\n options: CompareDocumentVersionsOptions = {},\n): VersionCompareResult {\n const comparedAt = options.comparedAt ?? target.createdAt;\n const authorId = options.authorId ?? \"Version Compare\";\n const baseDocument = base.canonicalDocument;\n const targetDocument = target.canonicalDocument;\n const baseBlocks = baseDocument.content.children;\n const targetBlocks = targetDocument.content.children;\n const matches = computeLcs(\n baseBlocks.map(getComparableBlockKey),\n targetBlocks.map(getComparableBlockKey),\n );\n\n const buildEntries: BuildEntry[] = [];\n const changes: CompareChange[] = [];\n let nextBaseIndex = 0;\n let nextTargetIndex = 0;\n let nextChangeNumber = 1;\n\n for (const match of [...matches, { baseIndex: baseBlocks.length, targetIndex: targetBlocks.length }]) {\n while (nextBaseIndex < match.baseIndex || nextTargetIndex < match.targetIndex) {\n const deleteBlock = nextBaseIndex < match.baseIndex ? baseBlocks[nextBaseIndex] : undefined;\n const insertBlock = nextTargetIndex < match.targetIndex ? targetBlocks[nextTargetIndex] : undefined;\n\n if (deleteBlock && insertBlock) {\n if (deleteBlock.type === \"paragraph\" && insertBlock.type === \"paragraph\") {\n const modificationId = `change-${nextChangeNumber}`;\n nextChangeNumber += 1;\n addParagraphModificationEntry(\n buildEntries,\n changes,\n modificationId,\n deleteBlock,\n insertBlock,\n nextTargetIndex,\n );\n nextBaseIndex += 1;\n nextTargetIndex += 1;\n continue;\n }\n\n const deletionId = `change-${nextChangeNumber}`;\n nextChangeNumber += 1;\n addTrackedOrStructuralEntry(\n buildEntries,\n changes,\n deletionId,\n deleteBlock,\n \"deletion\",\n nextTargetIndex,\n );\n\n const insertionId = `change-${nextChangeNumber}`;\n nextChangeNumber += 1;\n addTrackedOrStructuralEntry(\n buildEntries,\n changes,\n insertionId,\n insertBlock,\n \"insertion\",\n nextTargetIndex,\n );\n nextBaseIndex += 1;\n nextTargetIndex += 1;\n continue;\n }\n\n if (deleteBlock) {\n const changeId = `change-${nextChangeNumber}`;\n nextChangeNumber += 1;\n addTrackedOrStructuralEntry(\n buildEntries,\n changes,\n changeId,\n deleteBlock,\n \"deletion\",\n nextTargetIndex,\n );\n nextBaseIndex += 1;\n continue;\n }\n\n if (insertBlock) {\n const changeId = `change-${nextChangeNumber}`;\n nextChangeNumber += 1;\n addTrackedOrStructuralEntry(\n buildEntries,\n changes,\n changeId,\n insertBlock,\n \"insertion\",\n nextTargetIndex,\n );\n nextTargetIndex += 1;\n }\n }\n\n if (match.baseIndex < baseBlocks.length && match.targetIndex < targetBlocks.length) {\n const baseText = getBlockDisplayText(baseBlocks[match.baseIndex]);\n const targetText = getBlockDisplayText(targetBlocks[match.targetIndex]);\n const isModified =\n baseBlocks[match.baseIndex].type === \"paragraph\" &&\n targetBlocks[match.targetIndex].type === \"paragraph\" &&\n baseText !== targetText;\n\n if (isModified) {\n const modChangeId = `change-${nextChangeNumber}`;\n nextChangeNumber += 1;\n addParagraphModificationEntry(\n buildEntries,\n changes,\n modChangeId,\n baseBlocks[match.baseIndex] as ParagraphNode,\n targetBlocks[match.targetIndex] as ParagraphNode,\n match.targetIndex,\n );\n } else {\n buildEntries.push({\n block: cloneBlock(targetBlocks[match.targetIndex]),\n tracked: false,\n blockType: targetBlocks[match.targetIndex].type,\n beforeText: baseText,\n afterText: targetText,\n });\n }\n\n nextBaseIndex = match.baseIndex + 1;\n nextTargetIndex = match.targetIndex + 1;\n }\n }\n\n const built = buildComparedDocument(baseDocument, targetDocument, buildEntries, comparedAt, authorId);\n return {\n compareVersion: \"version-compare-result/1\",\n comparedAt,\n base: {\n versionId: base.versionId,\n name: base.name,\n signature: base.documentSignature,\n },\n target: {\n versionId: target.versionId,\n name: target.name,\n signature: target.documentSignature,\n },\n changes,\n comparedDocument: built,\n };\n}\n\nfunction addTrackedOrStructuralEntry(\n buildEntries: BuildEntry[],\n changes: CompareChange[],\n changeId: string,\n block: BlockNode,\n direction: \"insertion\" | \"deletion\",\n targetIndex: number,\n): void {\n const tracked = block.type === \"paragraph\";\n const cloned = cloneBlock(block);\n const text = getBlockDisplayText(block);\n\n buildEntries.push({\n ...(tracked ? { changeId } : {}),\n block: cloned,\n ...(tracked ? { trackChange: direction } : {}),\n tracked,\n blockType: cloned.type,\n ...(direction === \"deletion\" ? { beforeText: text } : { afterText: text }),\n });\n\n changes.push({\n changeId,\n kind:\n block.type === \"paragraph\"\n ? direction === \"insertion\"\n ? \"paragraph-insertion\"\n : \"paragraph-deletion\"\n : direction === \"insertion\"\n ? \"structural-insertion\"\n : \"structural-deletion\",\n tracked,\n blockType: cloned.type,\n ...(direction === \"deletion\" ? { beforeText: text } : { afterText: text }),\n targetIndex,\n });\n}\n\nfunction addParagraphModificationEntry(\n buildEntries: BuildEntry[],\n changes: CompareChange[],\n changeId: string,\n baseParagraph: ParagraphNode,\n targetParagraph: ParagraphNode,\n targetIndex: number,\n): void {\n const beforeText = getBlockDisplayText(baseParagraph);\n const afterText = getBlockDisplayText(targetParagraph);\n\n buildEntries.push({\n changeId: `${changeId}-before`,\n block: cloneBlock(baseParagraph),\n trackChange: \"deletion\",\n tracked: true,\n blockType: \"paragraph\",\n beforeText,\n });\n buildEntries.push({\n changeId: `${changeId}-after`,\n block: cloneBlock(targetParagraph),\n trackChange: \"insertion\",\n tracked: true,\n blockType: \"paragraph\",\n afterText,\n });\n\n changes.push({\n changeId,\n kind: \"paragraph-modification\",\n tracked: true,\n blockType: \"paragraph\",\n beforeText,\n afterText,\n targetIndex,\n });\n}\n\nfunction buildComparedDocument(\n base: CanonicalDocument,\n target: CanonicalDocument,\n entries: readonly BuildEntry[],\n comparedAt: string,\n authorId: string,\n): CanonicalDocument {\n const contentChildren: BlockNode[] = [];\n const pendingRevisions: PendingRevision[] = [];\n const diagnosticsWarnings = [...target.diagnostics.warnings];\n let paragraphIndex = 0;\n let warningNumber = 1;\n\n for (let index = 0; index < entries.length; index += 1) {\n const entry = entries[index];\n if (!entry) {\n continue;\n }\n\n contentChildren.push(entry.block);\n if (entry.block.type === \"paragraph\") {\n if (entry.trackChange) {\n pendingRevisions.push({\n changeId: entry.changeId ?? `change-${pendingRevisions.length + 1}`,\n kind: entry.trackChange,\n paragraphIndex,\n });\n }\n paragraphIndex += 1;\n continue;\n }\n\n if (!entry.tracked) {\n diagnosticsWarnings.push({\n diagnosticId: `diagnostic:compare-structural-${warningNumber}`,\n warningId: `warning:compare-structural-${warningNumber}`,\n source: \"review\",\n message: `Version compare preserved a ${entry.blockType} ${entry.beforeText ? \"deletion\" : \"insertion\"} without a Word revision wrapper.`,\n });\n warningNumber += 1;\n }\n }\n\n const revisions = createParagraphRevisionRecords(\n contentChildren,\n pendingRevisions,\n comparedAt,\n authorId,\n );\n\n return {\n ...projectCanonicalDocument(target),\n updatedAt: comparedAt,\n styles: mergeStyleCatalogs(base.styles, target.styles),\n numbering: mergeRecordCatalog(base.numbering, target.numbering),\n media: mergeRecordCatalog(base.media, target.media),\n content: {\n type: \"doc\",\n children: contentChildren,\n },\n review: {\n comments: projectValue(target.review.comments),\n revisions,\n },\n preservation: mergePreservationStores(base.preservation, target.preservation),\n diagnostics: {\n warnings: diagnosticsWarnings,\n errors: [...target.diagnostics.errors],\n },\n ...(target.subParts ?? base.subParts ? { subParts: projectValue(target.subParts ?? base.subParts) } : {}),\n };\n}\n\nfunction createParagraphRevisionRecords(\n children: readonly BlockNode[],\n pendingRevisions: readonly PendingRevision[],\n createdAt: string,\n authorId: string,\n): CanonicalDocument[\"review\"][\"revisions\"] {\n const positionByParagraphIndex = new Map<number, number>();\n let cursor = 0;\n let paragraphIndex = 0;\n let previousWasParagraph = false;\n\n for (const block of children) {\n if (block.type === \"paragraph\") {\n if (previousWasParagraph) {\n cursor += 1;\n }\n cursor += getParagraphLength(block);\n positionByParagraphIndex.set(paragraphIndex, cursor);\n paragraphIndex += 1;\n previousWasParagraph = true;\n continue;\n }\n\n cursor += 1;\n previousWasParagraph = false;\n }\n\n const entries: Array<[string, RevisionRecord]> = [];\n pendingRevisions.forEach((revision) => {\n const position = positionByParagraphIndex.get(revision.paragraphIndex);\n if (position === undefined) {\n return;\n }\n\n const record: RevisionRecord = {\n changeId: revision.changeId,\n kind: revision.kind,\n anchor: {\n kind: \"range\",\n range: { from: position, to: position },\n assoc: { start: -1, end: 1 },\n },\n authorId,\n createdAt,\n status: \"open\",\n warningIds: [],\n metadata: {\n source: \"runtime\",\n importedRevisionForm:\n revision.kind === \"insertion\" ? \"paragraph-insertion\" : \"paragraph-deletion\",\n },\n };\n entries.push([revision.changeId, record]);\n });\n return Object.fromEntries(entries);\n}\n\nfunction getComparableBlockKey(block: BlockNode): string {\n if (block.type === \"paragraph\") {\n return `paragraph:${createCanonicalDocumentSignature({\n ...block,\n children: normalizeInlineChildren(block.children),\n })}`;\n }\n\n return `${block.type}:${createCanonicalDocumentSignature(block)}`;\n}\n\nfunction normalizeInlineChildren(children: readonly InlineNode[]): InlineNode[] {\n return children.map((child) => {\n if (child.type === \"hyperlink\") {\n return {\n ...child,\n children: normalizeInlineChildren(child.children) as HyperlinkNode[\"children\"],\n };\n }\n if (child.type === \"field\") {\n return {\n ...child,\n children: normalizeInlineChildren(child.children),\n };\n }\n return projectValue(child);\n });\n}\n\nfunction computeLcs(baseKeys: readonly string[], targetKeys: readonly string[]): LcsMatch[] {\n const widths = targetKeys.length + 1;\n const matrix = Array.from({ length: baseKeys.length + 1 }, () =>\n Array.from({ length: widths }, () => 0),\n );\n\n for (let baseIndex = baseKeys.length - 1; baseIndex >= 0; baseIndex -= 1) {\n for (let targetIndex = targetKeys.length - 1; targetIndex >= 0; targetIndex -= 1) {\n matrix[baseIndex][targetIndex] =\n baseKeys[baseIndex] === targetKeys[targetIndex]\n ? matrix[baseIndex + 1][targetIndex + 1] + 1\n : Math.max(matrix[baseIndex + 1][targetIndex], matrix[baseIndex][targetIndex + 1]);\n }\n }\n\n const matches: LcsMatch[] = [];\n let baseIndex = 0;\n let targetIndex = 0;\n while (baseIndex < baseKeys.length && targetIndex < targetKeys.length) {\n if (baseKeys[baseIndex] === targetKeys[targetIndex]) {\n matches.push({ baseIndex, targetIndex });\n baseIndex += 1;\n targetIndex += 1;\n continue;\n }\n\n if (matrix[baseIndex + 1][targetIndex] >= matrix[baseIndex][targetIndex + 1]) {\n baseIndex += 1;\n } else {\n targetIndex += 1;\n }\n }\n\n return matches;\n}\n\nfunction getParagraphLength(paragraph: ParagraphNode): number {\n return paragraph.children.reduce((length, child) => length + getInlineLength(child), 0);\n}\n\nfunction getInlineLength(node: InlineNode): number {\n switch (node.type) {\n case \"text\":\n return Array.from(node.text).length;\n case \"hyperlink\":\n return node.children.reduce((length, child) => length + getInlineLength(child), 0);\n case \"field\":\n return node.children.reduce((length, child) => length + getInlineLength(child), 0);\n case \"tab\":\n case \"hard_break\":\n case \"column_break\":\n case \"symbol\":\n case \"image\":\n case \"opaque_inline\":\n case \"footnote_ref\":\n case \"bookmark_start\":\n case \"bookmark_end\":\n case \"chart_preview\":\n case \"smartart_preview\":\n case \"shape\":\n case \"wordart\":\n case \"vml_shape\":\n return 1;\n }\n}\n\nfunction getBlockDisplayText(block: BlockNode): string {\n switch (block.type) {\n case \"paragraph\":\n return block.children.map(getInlineDisplayText).join(\"\");\n case \"table\":\n return \"[Table]\";\n case \"sdt\":\n return \"[Structured content]\";\n case \"custom_xml\":\n return \"[Custom XML block]\";\n case \"alt_chunk\":\n return \"[Alt chunk]\";\n case \"section_break\":\n return \"[Section break]\";\n case \"opaque_block\":\n return \"[Preserved block]\";\n }\n}\n\nfunction getInlineDisplayText(node: InlineNode): string {\n switch (node.type) {\n case \"text\":\n return node.text;\n case \"tab\":\n return \"\\t\";\n case \"hard_break\":\n case \"column_break\":\n return \"\\n\";\n case \"symbol\":\n return node.char;\n case \"hyperlink\":\n return node.children.map(getInlineDisplayText).join(\"\");\n case \"field\":\n return node.children.map(getInlineDisplayText).join(\"\");\n case \"image\":\n return node.altText ?? \"[Image]\";\n case \"opaque_inline\":\n return \"[Preserved]\";\n case \"footnote_ref\":\n return \"[Footnote]\";\n case \"bookmark_start\":\n case \"bookmark_end\":\n return \"\";\n case \"chart_preview\":\n return \"[Chart]\";\n case \"smartart_preview\":\n return \"[SmartArt]\";\n case \"shape\":\n return node.text ?? \"[Shape]\";\n case \"wordart\":\n return node.text;\n case \"vml_shape\":\n return node.text ?? \"[VML Shape]\";\n }\n}\n\nfunction mergeStyleCatalogs(\n base: CanonicalDocument[\"styles\"],\n target: CanonicalDocument[\"styles\"],\n): CanonicalDocument[\"styles\"] {\n return {\n paragraphs: { ...base.paragraphs, ...target.paragraphs },\n characters: { ...base.characters, ...target.characters },\n tables: { ...base.tables, ...target.tables },\n ...((base.latentStyles || target.latentStyles)\n ? { latentStyles: { ...(base.latentStyles ?? {}), ...(target.latentStyles ?? {}) } }\n : {}),\n };\n}\n\nfunction mergePreservationStores(\n base: CanonicalDocument[\"preservation\"],\n target: CanonicalDocument[\"preservation\"],\n): CanonicalDocument[\"preservation\"] {\n return {\n opaqueFragments: {\n ...base.opaqueFragments,\n ...target.opaqueFragments,\n },\n packageParts: {\n ...base.packageParts,\n ...target.packageParts,\n },\n };\n}\n\nfunction mergeRecordCatalog<T extends object>(base: T, target: T): T {\n return projectValue({ ...base, ...target });\n}\n\nfunction cloneBlock<T extends BlockNode>(block: T): T {\n return projectValue(block);\n}\n\nfunction projectValue<T>(value: T): T {\n return structuredClone(value);\n}\n","import type {\n DocRange,\n OpaqueFragmentRecord,\n PreservationStore,\n PreservedPackagePart,\n} from \"../model/canonical-document.ts\";\n\nexport interface OpaqueFragmentDescriptor {\n featureKey:\n | \"sections\"\n | \"tables\"\n | \"headers-footers\"\n | \"fields\"\n | \"content-controls\"\n | \"custom-xml\"\n | \"alt-chunk\"\n | \"embedded-objects\"\n | \"alternate-content\"\n | \"unknown-ooxml\";\n label: string;\n detail: string;\n}\n\nexport function createPreservationStore(\n seed?: Partial<PreservationStore>,\n): PreservationStore {\n return {\n opaqueFragments: { ...(seed?.opaqueFragments ?? {}) },\n packageParts: { ...(seed?.packageParts ?? {}) },\n };\n}\n\nexport function getOpaqueFragment(\n store: PreservationStore,\n fragmentId: string,\n): OpaqueFragmentRecord | undefined {\n return normalizeOpaqueFragmentMap(store)[fragmentId];\n}\n\nexport function listOpaqueFragments(\n store: PreservationStore,\n): OpaqueFragmentRecord[] {\n return Object.values(normalizeOpaqueFragmentMap(store)).sort((left, right) => {\n return (\n left.lastKnownRange.from - right.lastKnownRange.from ||\n left.fragmentId.localeCompare(right.fragmentId)\n );\n });\n}\n\nexport function listPreservedPackageParts(\n store: PreservationStore,\n): PreservedPackagePart[] {\n return Object.values(normalizePackagePartMap(store)).sort((left, right) =>\n left.packagePartName.localeCompare(right.packagePartName),\n );\n}\n\nexport function findOpaqueFragmentsIntersectingRange(\n store: PreservationStore,\n range: DocRange,\n): OpaqueFragmentRecord[] {\n return listOpaqueFragments(store).filter((fragment) =>\n rangesIntersect(fragment.lastKnownRange, range),\n );\n}\n\nexport function describeOpaqueFragment(\n fragment: OpaqueFragmentRecord,\n): OpaqueFragmentDescriptor {\n const xml = fragment.payloadReference;\n const detail = createDetail(fragment);\n\n if (/\\b(?:w:)?sectPr\\b/u.test(xml)) {\n return {\n featureKey: \"sections\",\n label: \"Section properties\",\n detail,\n };\n }\n\n if (/\\b(?:w:)?tbl\\b/u.test(xml)) {\n return {\n featureKey: \"tables\",\n label: \"Preserved table structure\",\n detail,\n };\n }\n\n if (/\\b(?:w:)?hdr\\b|\\b(?:w:)?ftr\\b/u.test(xml)) {\n return {\n featureKey: \"headers-footers\",\n label: \"Header or footer content\",\n detail,\n };\n }\n\n if (/\\b(?:w:)?fldSimple\\b|\\b(?:w:)?fldChar\\b|\\b(?:w:)?instrText\\b/u.test(xml)) {\n return {\n featureKey: \"fields\",\n label: \"Word field content\",\n detail,\n };\n }\n\n if (/\\b(?:w:)?sdt\\b/u.test(xml)) {\n return {\n featureKey: \"content-controls\",\n label: \"Content control\",\n detail,\n };\n }\n\n if (/\\b(?:w:)?customXml\\b/u.test(xml)) {\n return {\n featureKey: \"custom-xml\",\n label: \"Custom XML wrapper\",\n detail,\n };\n }\n\n if (/\\b(?:w:)?altChunk\\b/u.test(xml)) {\n return {\n featureKey: \"alt-chunk\",\n label: \"Alternate content import\",\n detail,\n };\n }\n\n if (/\\b(?:w:)?object\\b|\\b(?:o:)?OLEObject\\b/u.test(xml)) {\n return {\n featureKey: \"embedded-objects\",\n label: \"Embedded object\",\n detail,\n };\n }\n\n if (/\\b(?:mc:)?AlternateContent\\b/u.test(xml)) {\n return {\n featureKey: \"alternate-content\",\n label: \"Markup compatibility block\",\n detail,\n };\n }\n\n return {\n featureKey: \"unknown-ooxml\",\n label: \"Unsupported OOXML fragment\",\n detail,\n };\n}\n\nfunction createDetail(fragment: OpaqueFragmentRecord): string {\n const detail = [\n `Preserved whole-unit from ${fragment.lastKnownRange.from}-${fragment.lastKnownRange.to}.`,\n fragment.packagePartName ? `Part ${fragment.packagePartName}.` : null,\n fragment.relationshipId ? `Relationship ${fragment.relationshipId}.` : null,\n ]\n .filter(Boolean)\n .join(\" \");\n\n return detail.length > 0\n ? detail\n : \"Preserved whole-unit to keep unsupported OOXML intact.\";\n}\n\nfunction rangesIntersect(left: DocRange, right: DocRange): boolean {\n return left.from < right.to && right.from < left.to;\n}\n\nfunction normalizeOpaqueFragmentMap(\n store: PreservationStore,\n): Record<string, OpaqueFragmentRecord> {\n return store && typeof store === \"object\" && store.opaqueFragments && typeof store.opaqueFragments === \"object\"\n ? (store.opaqueFragments as Record<string, OpaqueFragmentRecord>)\n : {};\n}\n\nfunction normalizePackagePartMap(\n store: PreservationStore,\n): Record<string, PreservedPackagePart> {\n return store && typeof store === \"object\" && store.packageParts && typeof store.packageParts === \"object\"\n ? (store.packageParts as Record<string, PreservedPackagePart>)\n : {};\n}\n","import type { OpaqueFragmentRecord, PreservationStore } from \"../model/canonical-document.ts\";\nimport type { OpcRelationship } from \"../io/ooxml/part-manifest.ts\";\n\nexport function retainRelationshipsForFragment(\n fragment: OpaqueFragmentRecord | undefined,\n relationships: OpcRelationship[],\n existingRelationshipMap: Map<string, OpcRelationship>,\n retainedRelationshipIds: Set<string>,\n): void {\n if (!fragment || fragment.payloadKind !== \"xml-subtree\") {\n return;\n }\n\n for (const relationshipId of extractReferencedRelationshipIds(fragment.payloadReference)) {\n if (retainedRelationshipIds.has(relationshipId)) {\n continue;\n }\n\n const relationship = existingRelationshipMap.get(relationshipId);\n if (!relationship) {\n continue;\n }\n\n relationships.push({ ...relationship });\n retainedRelationshipIds.add(relationshipId);\n }\n}\n\nexport function retainRelationshipsForStore(\n store: PreservationStore,\n relationships: OpcRelationship[],\n existingRelationshipMap: Map<string, OpcRelationship>,\n retainedRelationshipIds: Set<string>,\n): void {\n for (const fragment of Object.values(store.opaqueFragments)) {\n retainRelationshipsForFragment(\n fragment,\n relationships,\n existingRelationshipMap,\n retainedRelationshipIds,\n );\n }\n}\n\nexport function extractReferencedRelationshipIds(xml: string): Set<string> {\n const relationshipIds = new Set<string>();\n const relationshipPattern = /\\br:id=([\"'])([^\"']+)\\1/gu;\n\n for (const match of xml.matchAll(relationshipPattern)) {\n const relationshipId = match[2];\n if (relationshipId) {\n relationshipIds.add(relationshipId);\n }\n }\n\n return relationshipIds;\n}\n","import type { NumberingCatalog } from \"../../model/canonical-document.ts\";\n\nexport const DOCX_NULL_NUMBERING_INSTANCE_ID = \"num:0\";\nexport const DOCX_NULL_ABSTRACT_NUMBERING_ID = \"abstract-num:__docx-import-null__\";\n\nexport function createSyntheticDocxNullNumberingCatalog(): Pick<\n NumberingCatalog,\n \"abstractDefinitions\" | \"instances\"\n> {\n return {\n abstractDefinitions: {\n [DOCX_NULL_ABSTRACT_NUMBERING_ID]: {\n abstractNumberingId: DOCX_NULL_ABSTRACT_NUMBERING_ID,\n levels: Array.from({ length: 9 }, (_unused, level) => ({\n level,\n format: \"none\",\n text: \"\",\n })),\n },\n },\n instances: {\n [DOCX_NULL_NUMBERING_INSTANCE_ID]: {\n numberingInstanceId: DOCX_NULL_NUMBERING_INSTANCE_ID,\n abstractNumberingId: DOCX_NULL_ABSTRACT_NUMBERING_ID,\n overrides: [],\n },\n },\n };\n}\n\nexport function isSyntheticDocxNullAbstractDefinition(\n definition: NumberingCatalog[\"abstractDefinitions\"][string],\n): boolean {\n return definition.abstractNumberingId === DOCX_NULL_ABSTRACT_NUMBERING_ID;\n}\n\nexport function isSyntheticDocxNullNumberingInstance(\n instance: NumberingCatalog[\"instances\"][string],\n): boolean {\n return (\n instance.numberingInstanceId === DOCX_NULL_NUMBERING_INSTANCE_ID &&\n instance.abstractNumberingId === DOCX_NULL_ABSTRACT_NUMBERING_ID\n );\n}\n","import type { NumberingCatalog, ParagraphNode } from \"../../model/canonical-document.ts\";\nimport {\n isSyntheticDocxNullAbstractDefinition,\n isSyntheticDocxNullNumberingInstance,\n} from \"../ooxml/numbering-sentinels.ts\";\n\nexport const WORD_NUMBERING_CONTENT_TYPE =\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml\";\n\nexport function serializeNumberingXml(catalog: NumberingCatalog): string {\n const abstractDefinitions = Object.values(catalog.abstractDefinitions)\n .filter((definition) => !isSyntheticDocxNullAbstractDefinition(definition))\n .sort((left, right) =>\n compareSerializedIds(left.abstractNumberingId, right.abstractNumberingId),\n );\n const instances = Object.values(catalog.instances)\n .filter((instance) => !isSyntheticDocxNullNumberingInstance(instance))\n .sort((left, right) =>\n compareSerializedIds(left.numberingInstanceId, right.numberingInstanceId),\n );\n\n const body = [\n ...abstractDefinitions.map((definition) => serializeAbstractDefinition(definition)),\n ...instances.map((instance) => serializeInstance(instance)),\n ].join(\"\");\n\n return [\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>`,\n `<w:numbering xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\">${body}</w:numbering>`,\n ].join(\"\\n\");\n}\n\nexport function hasSerializableNumberingEntries(catalog: NumberingCatalog): boolean {\n return (\n Object.values(catalog.abstractDefinitions).some(\n (definition) => !isSyntheticDocxNullAbstractDefinition(definition),\n ) ||\n Object.values(catalog.instances).some(\n (instance) => !isSyntheticDocxNullNumberingInstance(instance),\n )\n );\n}\n\nexport function serializeParagraphNumberingProperties(\n numbering: ParagraphNode[\"numbering\"],\n): string {\n if (!numbering) {\n return \"\";\n }\n\n return `<w:numPr><w:ilvl w:val=\"${numbering.level}\"/><w:numId w:val=\"${escapeAttribute(\n stripCanonicalPrefix(numbering.numberingInstanceId, \"num:\"),\n )}\"/></w:numPr>`;\n}\n\nfunction serializeAbstractDefinition(definition: NumberingCatalog[\"abstractDefinitions\"][string]): string {\n const abstractNumId = escapeAttribute(\n stripCanonicalPrefix(definition.abstractNumberingId, \"abstract-num:\"),\n );\n const levels = [...definition.levels]\n .sort((left, right) => left.level - right.level)\n .map((level) => serializeLevel(level))\n .join(\"\");\n\n return `<w:abstractNum w:abstractNumId=\"${abstractNumId}\">${levels}</w:abstractNum>`;\n}\n\nfunction serializeLevel(level: NumberingCatalog[\"abstractDefinitions\"][string][\"levels\"][number]): string {\n const start = level.startAt !== undefined ? `<w:start w:val=\"${level.startAt}\"/>` : \"\";\n const paragraphStyle = level.paragraphStyleId\n ? `<w:pStyle w:val=\"${escapeAttribute(level.paragraphStyleId)}\"/>`\n : \"\";\n const isLegal = level.isLegalNumbering ? \"<w:isLgl/>\" : \"\";\n const suffix = level.suffix ? `<w:suff w:val=\"${escapeAttribute(level.suffix)}\"/>` : \"\";\n\n return `<w:lvl w:ilvl=\"${level.level}\">${start}<w:numFmt w:val=\"${escapeAttribute(\n level.format,\n )}\"/><w:lvlText w:val=\"${escapeAttribute(level.text)}\"/>${paragraphStyle}${isLegal}${suffix}</w:lvl>`;\n}\n\nfunction serializeInstance(instance: NumberingCatalog[\"instances\"][string]): string {\n const numId = escapeAttribute(stripCanonicalPrefix(instance.numberingInstanceId, \"num:\"));\n const abstractNumId = escapeAttribute(\n stripCanonicalPrefix(instance.abstractNumberingId, \"abstract-num:\"),\n );\n const overrides = [...instance.overrides]\n .sort((left, right) => left.level - right.level)\n .map((override) => serializeOverride(override))\n .join(\"\");\n\n return `<w:num w:numId=\"${numId}\"><w:abstractNumId w:val=\"${abstractNumId}\"/>${overrides}</w:num>`;\n}\n\nfunction serializeOverride(override: NumberingCatalog[\"instances\"][string][\"overrides\"][number]): string {\n const startOverride =\n override.startAt !== undefined ? `<w:startOverride w:val=\"${override.startAt}\"/>` : \"\";\n return `<w:lvlOverride w:ilvl=\"${override.level}\">${startOverride}</w:lvlOverride>`;\n}\n\nfunction compareSerializedIds(left: string, right: string): number {\n return stripKnownPrefix(left).localeCompare(stripKnownPrefix(right), \"en\", { numeric: true });\n}\n\nfunction stripKnownPrefix(value: string): string {\n return value.replace(/^abstract-num:|^num:/, \"\");\n}\n\nfunction stripCanonicalPrefix(value: string, prefix: \"abstract-num:\" | \"num:\"): string {\n return value.startsWith(prefix) ? value.slice(prefix.length) : value;\n}\n\nfunction escapeAttribute(value: string): string {\n return value\n .replace(/&/g, \"&\")\n .replace(/\"/g, \""\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\");\n}\n","import type {\n AltChunkNode,\n BorderSpec,\n CustomXmlNode,\n DocumentRootNode,\n InlineNode,\n MediaCatalog,\n ParagraphNode,\n PreservationStore,\n SdtNode,\n SectionProperties,\n TableNode,\n TableCellNode,\n TextMark,\n} from \"../../model/canonical-document.ts\";\nimport type { OpcRelationship } from \"../ooxml/part-manifest.ts\";\nimport type { RevisionParagraphBoundary } from \"../ooxml/revision-boundaries.ts\";\nimport { getOpaqueFragment } from \"../../preservation/store.ts\";\nimport { retainRelationshipsForFragment } from \"../../preservation/relationship-retention.ts\";\nimport { serializeParagraphNumberingProperties } from \"./serialize-numbering.ts\";\n\nconst HYPERLINK_RELATIONSHIP_TYPE =\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink\";\n\nexport interface SerializedMainDocument {\n documentXml: string;\n relationships: OpcRelationship[];\n paragraphBoundaries: RevisionParagraphBoundary[];\n}\n\nexport interface SerializeMainDocumentOptions {\n documentAttributes?: Record<string, string>;\n media?: MediaCatalog;\n finalSectionProperties?: SectionProperties;\n}\n\ninterface SerializationState {\n nextHyperlinkRelationshipIndex: number;\n relationships: OpcRelationship[];\n existingRelationshipMap: Map<string, OpcRelationship>;\n retainedRelationshipIds: Set<string>;\n media: MediaCatalog;\n preservation: PreservationStore;\n}\n\ninterface InlineSerializationResult {\n xml: string;\n cursor: number;\n boundaries: Map<number, number>;\n}\n\ninterface ParagraphSerializationResult {\n xml: string;\n nextCursor: number;\n boundary: RevisionParagraphBoundary;\n}\n\nexport function serializeMainDocument(\n content: DocumentRootNode,\n preservation: PreservationStore = { opaqueFragments: {}, packageParts: {} },\n existingRelationships: readonly OpcRelationship[] = [],\n options: SerializeMainDocumentOptions = {},\n): SerializedMainDocument {\n const nextRelationshipIndex =\n existingRelationships.reduce((maxIndex, relationship) => {\n const match = /^rIdHyperlink(\\d+)$/.exec(relationship.id);\n return match ? Math.max(maxIndex, Number.parseInt(match[1] ?? \"0\", 10)) : maxIndex;\n }, 0) + 1;\n const state: SerializationState = {\n nextHyperlinkRelationshipIndex: nextRelationshipIndex,\n relationships: existingRelationships.filter(\n (relationship) => relationship.type !== HYPERLINK_RELATIONSHIP_TYPE,\n ).map(cloneRelationship),\n existingRelationshipMap: new Map(\n existingRelationships.map((relationship) => [relationship.id, cloneRelationship(relationship)]),\n ),\n retainedRelationshipIds: new Set(\n existingRelationships\n .filter((relationship) => relationship.type !== HYPERLINK_RELATIONSHIP_TYPE)\n .map((relationship) => relationship.id),\n ),\n media: options.media ?? { items: {} },\n preservation,\n };\n const documentOpen = `<w:document${serializeDocumentAttributes(options.documentAttributes, content)}>`;\n const prefix = [\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>`,\n documentOpen,\n ` <w:body>`,\n ].join(\"\\n\");\n const suffix = `</w:body>\\n</w:document>`;\n const bodyPieces: string[] = [];\n const paragraphBoundaries: RevisionParagraphBoundary[] = [];\n let bodyLength = 0;\n let sectionPropertiesXml = options.finalSectionProperties\n ? serializeSectionPropertiesXml(options.finalSectionProperties)\n : \"<w:sectPr/>\";\n let cursor = 0;\n let paragraphIndex = -1;\n let previousWasParagraph = false;\n\n for (const block of content.children) {\n if (block.type === \"paragraph\") {\n if (previousWasParagraph) {\n cursor += 1;\n }\n\n paragraphIndex += 1;\n const serializedParagraph = serializeParagraph(\n block,\n state,\n cursor,\n paragraphIndex,\n );\n const paragraphOffset = prefix.length + bodyLength;\n bodyPieces.push(serializedParagraph.xml);\n bodyLength += serializedParagraph.xml.length;\n paragraphBoundaries.push(\n offsetParagraphBoundary(serializedParagraph.boundary, paragraphOffset),\n );\n cursor = serializedParagraph.nextCursor;\n previousWasParagraph = true;\n continue;\n }\n\n if (block.type === \"table\") {\n const tableXml = serializeTableNode(block, state);\n bodyPieces.push(tableXml);\n bodyLength += tableXml.length;\n cursor += 1;\n previousWasParagraph = false;\n continue;\n }\n\n if (block.type === \"sdt\") {\n const sdtXml = serializeSdtNode(block, state);\n bodyPieces.push(sdtXml);\n bodyLength += sdtXml.length;\n previousWasParagraph = false;\n continue;\n }\n\n if (block.type === \"custom_xml\") {\n const customXml = serializeCustomXmlNode(block, state);\n bodyPieces.push(customXml);\n bodyLength += customXml.length;\n previousWasParagraph = false;\n continue;\n }\n\n if (block.type === \"alt_chunk\") {\n const altChunkXml = serializeAltChunkNode(block);\n bodyPieces.push(altChunkXml);\n bodyLength += altChunkXml.length;\n cursor += 1;\n previousWasParagraph = false;\n continue;\n }\n\n if (block.type === \"section_break\") {\n // Inline section breaks must be emitted as a paragraph with <w:sectPr>\n // in its <w:pPr> element (OOXML compliance). The body-level <w:sectPr>\n // is reserved for the final section only.\n let inlineSectPr: string;\n if (block.sectionPropertiesXml ?? block.propertiesXml) {\n inlineSectPr = block.sectionPropertiesXml ?? block.propertiesXml!;\n } else if (block.sectionProperties) {\n inlineSectPr = serializeSectionPropertiesXml(block.sectionProperties);\n } else {\n inlineSectPr = \"<w:sectPr/>\";\n }\n const sectionParagraphXml = `<w:p><w:pPr>${inlineSectPr}</w:pPr></w:p>`;\n bodyPieces.push(sectionParagraphXml);\n bodyLength += sectionParagraphXml.length;\n cursor += 1;\n previousWasParagraph = false;\n continue;\n }\n\n const blockXml = serializeOpaqueBlock(block, state);\n if (looksLikeSectionPropertiesXml(blockXml)) {\n sectionPropertiesXml = blockXml;\n } else {\n bodyPieces.push(blockXml);\n bodyLength += blockXml.length;\n }\n cursor += 1;\n previousWasParagraph = false;\n }\n\n const bodyXml = bodyPieces.join(\"\");\n const documentXml = `${prefix}${bodyXml || \"<w:p><w:r><w:t></w:t></w:r></w:p>\"}${sectionPropertiesXml}${suffix}`;\n\n return {\n documentXml,\n relationships: state.relationships,\n paragraphBoundaries,\n };\n}\n\nfunction serializeOpaqueBlock(\n block: Extract<DocumentRootNode[\"children\"][number], { type: \"opaque_block\" }>,\n state: SerializationState,\n): string {\n return lookupOpaqueXml(block.fragmentId, state);\n}\n\nfunction serializeTableNode(\n table: TableNode,\n state: SerializationState,\n): string {\n const propertiesXml = table.propertiesXml ?? buildTablePropertiesXml(table);\n const gridXml =\n table.gridColumns.length > 0\n ? `<w:tblGrid>${table.gridColumns\n .map((width) => `<w:gridCol w:w=\"${width}\"/>`)\n .join(\"\")}</w:tblGrid>`\n : \"\";\n const rowsXml = table.rows\n .map((row) => {\n const rowPropertiesXml = row.propertiesXml ?? buildTableRowPropertiesXml(row);\n const cellsXml = row.cells\n .map((cell) => serializeTableCellNode(cell, state))\n .join(\"\");\n return `<w:tr>${rowPropertiesXml}${cellsXml}</w:tr>`;\n })\n .join(\"\");\n return `<w:tbl>${propertiesXml}${gridXml}${rowsXml}</w:tbl>`;\n}\n\nfunction serializeTableCellNode(\n cell: TableCellNode,\n state: SerializationState,\n): string {\n const propertiesXml = cell.propertiesXml ?? buildCellPropertiesXml(cell);\n const blocksXml = cell.children\n .map((child) => serializeBlockNode(child, state))\n .join(\"\");\n return `<w:tc>${propertiesXml}${blocksXml || \"<w:p/>\"}</w:tc>`;\n}\n\nfunction serializeBlockNode(\n block: DocumentRootNode[\"children\"][number],\n state: SerializationState,\n): string {\n switch (block.type) {\n case \"paragraph\":\n return serializeTableCellParagraph(block, state);\n case \"table\":\n return serializeTableNode(block, state);\n case \"sdt\":\n return serializeSdtNode(block, state);\n case \"custom_xml\":\n return serializeCustomXmlNode(block, state);\n case \"alt_chunk\":\n return serializeAltChunkNode(block);\n case \"opaque_block\":\n return lookupOpaqueXml(block.fragmentId, state);\n case \"section_break\":\n if (block.sectionPropertiesXml ?? block.propertiesXml) {\n return block.sectionPropertiesXml ?? block.propertiesXml!;\n }\n if (block.sectionProperties) return serializeSectionPropertiesXml(block.sectionProperties);\n return \"<w:sectPr/>\";\n }\n}\n\nfunction buildCellPropertiesXml(cell: TableCellNode): string {\n const children: string[] = [];\n if (cell.gridSpan && cell.gridSpan > 1) {\n children.push(`<w:gridSpan w:val=\"${cell.gridSpan}\"/>`);\n }\n if (cell.verticalMerge) {\n children.push(\n cell.verticalMerge === \"restart\"\n ? `<w:vMerge w:val=\"restart\"/>`\n : `<w:vMerge/>`,\n );\n }\n return children.length > 0 ? `<w:tcPr>${children.join(\"\")}</w:tcPr>` : \"\";\n}\n\nfunction buildTableRowPropertiesXml(row: TableNode[\"rows\"][number]): string {\n const children: string[] = [];\n if (row.gridBefore !== undefined) {\n children.push(`<w:gridBefore w:val=\"${row.gridBefore}\"/>`);\n }\n if (row.widthBefore) {\n children.push(`<w:wBefore w:w=\"${row.widthBefore.value}\" w:type=\"${row.widthBefore.type}\"/>`);\n }\n if (row.gridAfter !== undefined) {\n children.push(`<w:gridAfter w:val=\"${row.gridAfter}\"/>`);\n }\n if (row.widthAfter) {\n children.push(`<w:wAfter w:w=\"${row.widthAfter.value}\" w:type=\"${row.widthAfter.type}\"/>`);\n }\n if (children.length === 0) {\n return \"\";\n }\n return `<w:trPr>${children.join(\"\")}</w:trPr>`;\n}\n\nfunction serializeSdtNode(\n block: SdtNode,\n state: SerializationState,\n): string {\n const propertiesXml = block.properties.propertiesXml ?? buildSdtPropertiesXml(block);\n const childrenXml = block.children.map((child) => serializeBlockNode(child, state)).join(\"\") || \"<w:p/>\";\n return `<w:sdt>${propertiesXml}<w:sdtContent>${childrenXml}</w:sdtContent></w:sdt>`;\n}\n\nfunction serializeCustomXmlNode(\n block: CustomXmlNode,\n state: SerializationState,\n): string {\n const attrs: string[] = [];\n if (block.uri) {\n attrs.push(`w:uri=\"${escapeAttribute(block.uri)}\"`);\n }\n if (block.element) {\n attrs.push(`w:element=\"${escapeAttribute(block.element)}\"`);\n }\n const attrXml = attrs.length > 0 ? ` ${attrs.join(\" \")}` : \"\";\n const childrenXml = block.children.map((child) => serializeBlockNode(child, state)).join(\"\");\n return `<w:customXml${attrXml}>${childrenXml || \"<w:p/>\"}</w:customXml>`;\n}\n\nfunction serializeAltChunkNode(\n block: AltChunkNode,\n): string {\n return `<w:altChunk r:id=\"${escapeAttribute(block.relationshipId)}\"/>`;\n}\n\nfunction buildSdtPropertiesXml(block: SdtNode): string {\n const children: string[] = [];\n if (block.properties.alias) {\n children.push(`<w:alias w:val=\"${escapeAttribute(block.properties.alias)}\"/>`);\n }\n if (block.properties.tag) {\n children.push(`<w:tag w:val=\"${escapeAttribute(block.properties.tag)}\"/>`);\n }\n if (block.properties.lock) {\n children.push(`<w:lock w:val=\"${escapeAttribute(block.properties.lock)}\"/>`);\n }\n if (block.properties.showingPlcHdr) {\n children.push(`<w:showingPlcHdr/>`);\n }\n if (block.properties.checkbox) {\n const cb = block.properties.checkbox;\n const cbParts: string[] = [];\n cbParts.push(`<w14:checked w14:val=\"${cb.checked ? \"1\" : \"0\"}\"/>`);\n if (cb.checkedChar) cbParts.push(`<w14:checkedState w14:val=\"${escapeAttribute(cb.checkedChar)}\"/>`);\n if (cb.uncheckedChar) cbParts.push(`<w14:uncheckedState w14:val=\"${escapeAttribute(cb.uncheckedChar)}\"/>`);\n children.push(`<w14:checkbox>${cbParts.join(\"\")}</w14:checkbox>`);\n } else if (block.properties.datePicker) {\n const dp = block.properties.datePicker;\n const dateAttrs = dp.fullDate ? ` w:fullDate=\"${escapeAttribute(dp.fullDate)}\"` : \"\";\n const dpParts: string[] = [];\n if (dp.dateFormat) dpParts.push(`<w:dateFormat w:val=\"${escapeAttribute(dp.dateFormat)}\"/>`);\n if (dp.lid) dpParts.push(`<w:lid w:val=\"${escapeAttribute(dp.lid)}\"/>`);\n children.push(dpParts.length > 0 ? `<w:date${dateAttrs}>${dpParts.join(\"\")}</w:date>` : `<w:date${dateAttrs}/>`);\n } else if (block.properties.dropdownList) {\n const items = block.properties.dropdownList.map((item) => {\n const dt = item.displayText ? ` w:displayText=\"${escapeAttribute(item.displayText)}\"` : \"\";\n return `<w:listItem${dt} w:value=\"${escapeAttribute(item.value)}\"/>`;\n }).join(\"\");\n children.push(`<w:dropDownList>${items}</w:dropDownList>`);\n } else if (block.properties.comboBox) {\n const items = block.properties.comboBox.map((item) => {\n const dt = item.displayText ? ` w:displayText=\"${escapeAttribute(item.displayText)}\"` : \"\";\n return `<w:listItem${dt} w:value=\"${escapeAttribute(item.value)}\"/>`;\n }).join(\"\");\n children.push(`<w:comboBox>${items}</w:comboBox>`);\n } else if (block.properties.sdtType === \"plainText\") {\n children.push(`<w:text/>`);\n } else if (block.properties.sdtType === \"richText\") {\n children.push(`<w:richText/>`);\n } else if (block.properties.sdtType) {\n children.push(`<w:${block.properties.sdtType}/>`);\n }\n return children.length > 0 ? `<w:sdtPr>${children.join(\"\")}</w:sdtPr>` : \"<w:sdtPr/>\";\n}\n\nfunction serializeTableCellParagraph(\n paragraph: ParagraphNode,\n state: SerializationState,\n): string {\n let xml = \"<w:p>\";\n const paragraphPropertiesXml = buildParagraphPropertiesXml(paragraph);\n if (paragraphPropertiesXml.length > 0) {\n xml += paragraphPropertiesXml;\n }\n const childrenXml = paragraph.children.map((child) => serializeTableInlineNode(child, state)).join(\"\");\n xml += childrenXml || \"<w:r><w:t></w:t></w:r>\";\n xml += \"</w:p>\";\n return xml;\n}\n\nfunction serializeTableInlineNode(\n node: InlineNode,\n state: SerializationState,\n): string {\n switch (node.type) {\n case \"text\": {\n const marks = node.marks;\n const properties = serializeRunPropertiesFromMarks(marks);\n const preserve = requiresPreservedSpace(node.text) ? ` xml:space=\"preserve\"` : \"\";\n return `<w:r>${properties}<w:t${preserve}>${escapeXml(node.text)}</w:t></w:r>`;\n }\n case \"tab\":\n return \"<w:r><w:tab/></w:r>\";\n case \"column_break\":\n return \"<w:r><w:br w:type=\\\"column\\\"/></w:r>\";\n case \"hard_break\":\n return \"<w:r><w:br/></w:r>\";\n case \"symbol\": {\n const properties = serializeRunPropertiesFromMarks(node.marks);\n const fontAttribute = node.font ? ` w:font=\"${escapeAttribute(node.font)}\"` : \"\";\n return `<w:r>${properties}<w:sym${fontAttribute} w:char=\"${escapeAttribute(node.char)}\"/></w:r>`;\n }\n case \"image\":\n return serializeImageNode(node, state);\n case \"opaque_inline\":\n return lookupOpaqueXml(node.fragmentId, state);\n case \"chart_preview\":\n case \"smartart_preview\":\n case \"shape\":\n case \"wordart\":\n case \"vml_shape\":\n return wrapInlineRawXml(node.rawXml);\n case \"hyperlink\": {\n const hyperlinkOpen = node.href.startsWith(\"#\")\n ? `<w:hyperlink w:anchor=\"${escapeAttribute(node.href.slice(1))}\">`\n : (() => {\n const relationshipId = `rIdHyperlink${state.nextHyperlinkRelationshipIndex}`;\n state.nextHyperlinkRelationshipIndex += 1;\n state.relationships.push({\n id: relationshipId,\n type: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink\",\n target: node.href,\n targetMode: \"external\",\n });\n state.retainedRelationshipIds.add(relationshipId);\n return `<w:hyperlink r:id=\"${relationshipId}\">`;\n })();\n const childrenXml = node.children.map((child) => serializeTableInlineNode(child, state)).join(\"\");\n return `${hyperlinkOpen}${childrenXml}</w:hyperlink>`;\n }\n case \"field\": {\n if (node.children && node.children.length > 0) {\n const childrenXml = node.children\n .map((child) => serializeTableInlineNode(child, state))\n .join(\"\");\n if (node.fieldType === \"complex\") {\n return (\n `<w:r><w:fldChar w:fldCharType=\"begin\"/></w:r>` +\n `<w:r><w:instrText xml:space=\"preserve\"> ${escapeXml(node.instruction)} </w:instrText></w:r>` +\n `<w:r><w:fldChar w:fldCharType=\"separate\"/></w:r>` +\n childrenXml +\n `<w:r><w:fldChar w:fldCharType=\"end\"/></w:r>`\n );\n }\n return `<w:fldSimple w:instr=\"${escapeAttribute(node.instruction)}\">${childrenXml}</w:fldSimple>`;\n }\n return `<w:fldSimple w:instr=\"${escapeAttribute(node.instruction)}\"/>`;\n }\n case \"bookmark_start\":\n return (\n `<w:bookmarkStart w:id=\"${escapeAttribute(node.bookmarkId)}\"` +\n ` w:name=\"${escapeAttribute(node.name)}\"/>`\n );\n case \"bookmark_end\":\n return `<w:bookmarkEnd w:id=\"${escapeAttribute(node.bookmarkId)}\"/>`;\n case \"footnote_ref\": {\n const refElement =\n node.noteKind === \"footnote\"\n ? `<w:footnoteReference w:id=\"${escapeAttribute(node.noteId)}\"/>`\n : `<w:endnoteReference w:id=\"${escapeAttribute(node.noteId)}\"/>`;\n const styleVal =\n node.noteKind === \"footnote\"\n ? \"FootnoteReference\"\n : \"EndnoteReference\";\n return `<w:r><w:rPr><w:rStyle w:val=\"${styleVal}\"/></w:rPr>${refElement}</w:r>`;\n }\n default:\n return \"\";\n }\n}\n\nfunction buildParagraphPropertiesXml(paragraph: ParagraphNode): string {\n const children: string[] = [];\n\n if (paragraph.styleId) {\n children.push(`<w:pStyle w:val=\"${escapeAttribute(paragraph.styleId)}\"/>`);\n }\n if (paragraph.keepNext) {\n children.push(\"<w:keepNext/>\");\n }\n if (paragraph.keepLines) {\n children.push(\"<w:keepLines/>\");\n }\n if (paragraph.pageBreakBefore) {\n children.push(\"<w:pageBreakBefore/>\");\n }\n if (paragraph.widowControl) {\n children.push(\"<w:widowControl/>\");\n }\n if (paragraph.outlineLevel !== undefined) {\n children.push(`<w:outlineLvl w:val=\"${paragraph.outlineLevel}\"/>`);\n }\n if (paragraph.numbering) {\n children.push(serializeParagraphNumberingProperties(paragraph.numbering));\n }\n if (paragraph.spacing) {\n const s = paragraph.spacing;\n const attrs: string[] = [];\n if (s.before !== undefined) attrs.push(`w:before=\"${s.before}\"`);\n if (s.after !== undefined) attrs.push(`w:after=\"${s.after}\"`);\n if (s.line !== undefined) attrs.push(`w:line=\"${s.line}\"`);\n if (s.lineRule !== undefined) attrs.push(`w:lineRule=\"${s.lineRule}\"`);\n if (attrs.length > 0) children.push(`<w:spacing ${attrs.join(\" \")}/>`);\n }\n if (paragraph.contextualSpacing !== undefined) {\n children.push(\n paragraph.contextualSpacing\n ? \"<w:contextualSpacing/>\"\n : `<w:contextualSpacing w:val=\"0\"/>`,\n );\n }\n if (paragraph.indentation) {\n const ind = paragraph.indentation;\n const attrs: string[] = [];\n if (ind.left !== undefined) attrs.push(`w:left=\"${ind.left}\"`);\n if (ind.right !== undefined) attrs.push(`w:right=\"${ind.right}\"`);\n if (ind.firstLine !== undefined) attrs.push(`w:firstLine=\"${ind.firstLine}\"`);\n if (ind.hanging !== undefined) attrs.push(`w:hanging=\"${ind.hanging}\"`);\n if (attrs.length > 0) children.push(`<w:ind ${attrs.join(\" \")}/>`);\n }\n if (paragraph.alignment) {\n children.push(`<w:jc w:val=\"${paragraph.alignment}\"/>`);\n }\n if (paragraph.borders) {\n const bordersXml = serializeParagraphBorders(paragraph.borders);\n if (bordersXml) {\n children.push(bordersXml);\n }\n }\n if (paragraph.shading) {\n const shadingXml = serializeParagraphShading(paragraph.shading);\n if (shadingXml) {\n children.push(shadingXml);\n }\n }\n if (paragraph.bidi) {\n children.push(\"<w:bidi/>\");\n }\n if (paragraph.suppressLineNumbers) {\n children.push(\"<w:suppressLineNumbers/>\");\n }\n if (paragraph.cnfStyle) {\n children.push(`<w:cnfStyle w:val=\"${escapeAttribute(paragraph.cnfStyle)}\"/>`);\n }\n if (paragraph.tabStops && paragraph.tabStops.length > 0) {\n const tabsXml = paragraph.tabStops.map((tab) => {\n const leaderAttr = tab.leader ? ` w:leader=\"${tab.leader}\"` : \"\";\n return `<w:tab w:val=\"${tab.align}\" w:pos=\"${tab.position}\"${leaderAttr}/>`;\n }).join(\"\");\n children.push(`<w:tabs>${tabsXml}</w:tabs>`);\n }\n\n if (children.length === 0) return \"\";\n return `<w:pPr>${children.join(\"\")}</w:pPr>`;\n}\n\nfunction buildTablePropertiesXml(table: TableNode): string {\n const children: string[] = [];\n if (table.styleId) {\n children.push(`<w:tblStyle w:val=\"${escapeAttribute(table.styleId)}\"/>`);\n }\n if (table.tblLook) {\n const attrs: string[] = [];\n if (table.tblLook.val) {\n attrs.push(`w:val=\"${escapeAttribute(table.tblLook.val)}\"`);\n }\n for (const [key, attr] of [\n [\"firstRow\", \"w:firstRow\"],\n [\"lastRow\", \"w:lastRow\"],\n [\"firstColumn\", \"w:firstColumn\"],\n [\"lastColumn\", \"w:lastColumn\"],\n [\"noHBand\", \"w:noHBand\"],\n [\"noVBand\", \"w:noVBand\"],\n ] as const) {\n const value = table.tblLook[key];\n if (value !== undefined) {\n attrs.push(`${attr}=\"${value ? \"1\" : \"0\"}\"`);\n }\n }\n if (attrs.length > 0) {\n children.push(`<w:tblLook ${attrs.join(\" \")}/>`);\n }\n }\n return children.length > 0 ? `<w:tblPr>${children.join(\"\")}</w:tblPr>` : \"\";\n}\n\nfunction serializeParagraphBorders(borders: ParagraphNode[\"borders\"]): string {\n if (!borders) {\n return \"\";\n }\n const parts: string[] = [];\n for (const [name, border] of [\n [\"top\", borders.top],\n [\"left\", borders.left],\n [\"bottom\", borders.bottom],\n [\"right\", borders.right],\n [\"bar\", borders.bar],\n [\"between\", borders.between],\n ] as const) {\n const xml = serializeBorder(name, border);\n if (xml) {\n parts.push(xml);\n }\n }\n return parts.length > 0 ? `<w:pBdr>${parts.join(\"\")}</w:pBdr>` : \"\";\n}\n\nfunction serializeBorder(name: string, border: BorderSpec | undefined): string {\n if (!border) {\n return \"\";\n }\n const attrs: string[] = [];\n if (border.value) attrs.push(`w:val=\"${escapeAttribute(border.value)}\"`);\n if (border.size !== undefined) attrs.push(`w:sz=\"${border.size}\"`);\n if (border.space !== undefined) attrs.push(`w:space=\"${border.space}\"`);\n if (border.color) attrs.push(`w:color=\"${escapeAttribute(border.color)}\"`);\n return attrs.length > 0 ? `<w:${name} ${attrs.join(\" \")}/>` : \"\";\n}\n\nfunction serializeParagraphShading(shading: ParagraphNode[\"shading\"]): string {\n if (!shading) {\n return \"\";\n }\n const attrs: string[] = [];\n if (shading.val) attrs.push(`w:val=\"${escapeAttribute(shading.val)}\"`);\n if (shading.color) attrs.push(`w:color=\"${escapeAttribute(shading.color)}\"`);\n if (shading.fill) attrs.push(`w:fill=\"${escapeAttribute(shading.fill)}\"`);\n return attrs.length > 0 ? `<w:shd ${attrs.join(\" \")}/>` : \"\";\n}\n\nfunction serializeRunPropertiesFromMarks(marks: TextMark[] | undefined): string {\n return serializeRunProperties(marks);\n}\n\nfunction serializeParagraph(\n paragraph: ParagraphNode,\n state: SerializationState,\n cursor: number,\n paragraphIndex: number,\n): ParagraphSerializationResult {\n let xml = \"<w:p>\";\n const boundaries = new Map<number, number>();\n const paragraphStart = 0;\n const paragraphStartTagEnd = xml.length;\n boundaries.set(cursor, paragraphStartTagEnd);\n\n let paragraphPropertiesStart: number | undefined;\n let paragraphPropertiesEnd: number | undefined;\n\n const paragraphPropertiesXml = buildParagraphPropertiesXml(paragraph);\n if (paragraphPropertiesXml.length > 0) {\n paragraphPropertiesStart = xml.length;\n xml += paragraphPropertiesXml;\n paragraphPropertiesEnd = xml.length;\n }\n\n const children = serializeParagraphChildren(paragraph.children, state, cursor, xml.length);\n xml += children.xml;\n const contentEmpty = children.xml.length === 0;\n if (contentEmpty) {\n xml += \"<w:r><w:t></w:t></w:r>\";\n }\n const paragraphEndTagStart = xml.length;\n xml += \"</w:p>\";\n\n if (!children.boundaries.has(children.cursor)) {\n children.boundaries.set(children.cursor, paragraphEndTagStart);\n }\n\n return {\n xml,\n nextCursor: children.cursor,\n boundary: {\n paragraphIndex,\n start: cursor,\n end: children.cursor,\n boundaries: children.boundaries,\n paragraphStart,\n paragraphStartTagEnd,\n paragraphEndTagStart,\n paragraphEnd: xml.length,\n ...(paragraphPropertiesStart !== undefined\n ? { paragraphPropertiesStart }\n : {}),\n ...(paragraphPropertiesEnd !== undefined ? { paragraphPropertiesEnd } : {}),\n },\n };\n}\n\nfunction serializeParagraphChildren(\n children: InlineNode[],\n state: SerializationState,\n cursor: number,\n xmlOffset: number,\n): InlineSerializationResult {\n const pieces: string[] = [];\n const boundaries = new Map<number, number>();\n let nextCursor = cursor;\n let nextOffset = xmlOffset;\n boundaries.set(nextCursor, nextOffset);\n\n for (const child of children) {\n const result = serializeInlineNode(child, state, nextCursor, nextOffset);\n pieces.push(result.xml);\n for (const [position, index] of result.boundaries) {\n boundaries.set(position, index);\n }\n nextCursor = result.cursor;\n nextOffset += result.xml.length;\n }\n\n return {\n xml: pieces.join(\"\"),\n cursor: nextCursor,\n boundaries,\n };\n}\n\ntype RunPiece =\n | { kind: \"text\"; text: string; marks?: TextMark[] }\n | { kind: \"tab\" }\n | { kind: \"hard_break\" };\n\nfunction serializeRunPiece(piece: RunPiece): string {\n switch (piece.kind) {\n case \"text\":\n return serializeText(piece.text);\n case \"tab\":\n return \"<w:tab/>\";\n case \"hard_break\":\n return \"<w:br/>\";\n }\n}\n\nfunction serializeText(text: string): string {\n const preserve = requiresPreservedSpace(text) ? ` xml:space=\"preserve\"` : \"\";\n return `<w:t${preserve}>${escapeXml(text)}</w:t>`;\n}\n\nfunction serializeInlineNode(\n node: InlineNode,\n state: SerializationState,\n cursor: number,\n xmlOffset: number,\n): InlineSerializationResult {\n switch (node.type) {\n case \"text\": {\n const xml = serializeRun({\n kind: \"text\",\n text: node.text,\n ...(node.marks && node.marks.length > 0 ? { marks: node.marks } : {}),\n });\n const boundaries = new Map<number, number>();\n boundaries.set(cursor, xmlOffset);\n boundaries.set(cursor + Array.from(node.text).length, xmlOffset + xml.length);\n return {\n xml,\n cursor: cursor + Array.from(node.text).length,\n boundaries,\n };\n }\n case \"tab\": {\n const xml = serializeRun({ kind: \"tab\" });\n const boundaries = new Map<number, number>();\n boundaries.set(cursor, xmlOffset);\n boundaries.set(cursor + 1, xmlOffset + xml.length);\n return {\n xml,\n cursor: cursor + 1,\n boundaries,\n };\n }\n case \"column_break\": {\n const xml = `<w:r><w:br w:type=\"column\"/></w:r>`;\n const boundaries = new Map<number, number>();\n boundaries.set(cursor, xmlOffset);\n boundaries.set(cursor + 1, xmlOffset + xml.length);\n return {\n xml,\n cursor: cursor + 1,\n boundaries,\n };\n }\n case \"hard_break\": {\n const xml = serializeRun({ kind: \"hard_break\" });\n const boundaries = new Map<number, number>();\n boundaries.set(cursor, xmlOffset);\n boundaries.set(cursor + 1, xmlOffset + xml.length);\n return {\n xml,\n cursor: cursor + 1,\n boundaries,\n };\n }\n case \"symbol\": {\n const xml = serializeTableInlineNode(node, state);\n const boundaries = new Map<number, number>();\n boundaries.set(cursor, xmlOffset);\n boundaries.set(cursor + 1, xmlOffset + xml.length);\n return {\n xml,\n cursor: cursor + 1,\n boundaries,\n };\n }\n case \"image\": {\n const xml = serializeImageNode(node, state);\n const boundaries = new Map<number, number>();\n boundaries.set(cursor, xmlOffset);\n boundaries.set(cursor + 1, xmlOffset + xml.length);\n return {\n xml,\n cursor: cursor + 1,\n boundaries,\n };\n }\n case \"opaque_inline\": {\n const xml = lookupOpaqueXml(node.fragmentId, state);\n const boundaries = new Map<number, number>();\n boundaries.set(cursor, xmlOffset);\n boundaries.set(cursor + 1, xmlOffset + xml.length);\n return {\n xml,\n cursor: cursor + 1,\n boundaries,\n };\n }\n case \"chart_preview\":\n case \"smartart_preview\":\n case \"shape\":\n case \"wordart\":\n case \"vml_shape\": {\n // Reattach original XML unchanged for lossless round-trip.\n const xml = wrapInlineRawXml(node.rawXml);\n const boundaries = new Map<number, number>();\n boundaries.set(cursor, xmlOffset);\n boundaries.set(cursor + 1, xmlOffset + xml.length);\n return {\n xml,\n cursor: cursor + 1,\n boundaries,\n };\n }\n case \"hyperlink\": {\n const hyperlinkOpen = node.href.startsWith(\"#\")\n ? `<w:hyperlink w:anchor=\"${escapeAttribute(node.href.slice(1))}\">`\n : (() => {\n const relationshipId = `rIdHyperlink${state.nextHyperlinkRelationshipIndex}`;\n state.nextHyperlinkRelationshipIndex += 1;\n state.relationships.push({\n id: relationshipId,\n type: HYPERLINK_RELATIONSHIP_TYPE,\n target: node.href,\n targetMode: \"external\",\n });\n state.retainedRelationshipIds.add(relationshipId);\n return `<w:hyperlink r:id=\"${relationshipId}\">`;\n })();\n const hyperlinkClose = \"</w:hyperlink>\";\n const boundaries = new Map<number, number>();\n let nextCursor = cursor;\n let nextOffset = xmlOffset + hyperlinkOpen.length;\n boundaries.set(cursor, nextOffset);\n const children: string[] = [];\n\n for (const child of node.children) {\n const result = serializeInlineNode(child, state, nextCursor, nextOffset);\n children.push(result.xml);\n for (const [position, index] of result.boundaries) {\n boundaries.set(position, index);\n }\n nextCursor = result.cursor;\n nextOffset += result.xml.length;\n }\n\n boundaries.set(nextCursor, nextOffset);\n return {\n xml: `${hyperlinkOpen}${children.join(\"\")}${hyperlinkClose}`,\n cursor: nextCursor,\n boundaries,\n };\n }\n case \"field\": {\n if (node.children && node.children.length > 0) {\n const boundaries = new Map<number, number>();\n boundaries.set(cursor, xmlOffset);\n let nextCursor = cursor;\n let nextOffset = xmlOffset;\n\n if (node.fieldType === \"complex\") {\n const beginXml =\n `<w:r><w:fldChar w:fldCharType=\"begin\"/></w:r>` +\n `<w:r><w:instrText xml:space=\"preserve\"> ${escapeXml(node.instruction)} </w:instrText></w:r>` +\n `<w:r><w:fldChar w:fldCharType=\"separate\"/></w:r>`;\n nextOffset += beginXml.length;\n\n const children: string[] = [beginXml];\n for (const child of node.children) {\n const result = serializeInlineNode(child, state, nextCursor, nextOffset);\n children.push(result.xml);\n for (const [position, index] of result.boundaries) {\n boundaries.set(position, index);\n }\n nextCursor = result.cursor;\n nextOffset += result.xml.length;\n }\n const endXml = `<w:r><w:fldChar w:fldCharType=\"end\"/></w:r>`;\n children.push(endXml);\n nextOffset += endXml.length;\n boundaries.set(nextCursor, nextOffset);\n return { xml: children.join(\"\"), cursor: nextCursor, boundaries };\n }\n\n // Simple field with children\n const openXml = `<w:fldSimple w:instr=\"${escapeAttribute(node.instruction)}\">`;\n nextOffset += openXml.length;\n const children: string[] = [openXml];\n for (const child of node.children) {\n const result = serializeInlineNode(child, state, nextCursor, nextOffset);\n children.push(result.xml);\n for (const [position, index] of result.boundaries) {\n boundaries.set(position, index);\n }\n nextCursor = result.cursor;\n nextOffset += result.xml.length;\n }\n children.push(\"</w:fldSimple>\");\n nextOffset += \"</w:fldSimple>\".length;\n boundaries.set(nextCursor, nextOffset);\n return { xml: children.join(\"\"), cursor: nextCursor, boundaries };\n }\n\n const xml = `<w:fldSimple w:instr=\"${escapeAttribute(node.instruction)}\"/>`;\n const boundaries = new Map<number, number>();\n boundaries.set(cursor, xmlOffset);\n boundaries.set(cursor + 1, xmlOffset + xml.length);\n return {\n xml,\n cursor: cursor + 1,\n boundaries,\n };\n }\n case \"bookmark_start\": {\n const xml =\n `<w:bookmarkStart w:id=\"${escapeAttribute(node.bookmarkId)}\"` +\n ` w:name=\"${escapeAttribute(node.name)}\"/>`;\n const boundaries = new Map<number, number>();\n boundaries.set(cursor, xmlOffset);\n boundaries.set(cursor, xmlOffset + xml.length);\n return { xml, cursor, boundaries };\n }\n case \"bookmark_end\": {\n const xml = `<w:bookmarkEnd w:id=\"${escapeAttribute(node.bookmarkId)}\"/>`;\n const boundaries = new Map<number, number>();\n boundaries.set(cursor, xmlOffset);\n boundaries.set(cursor, xmlOffset + xml.length);\n return { xml, cursor, boundaries };\n }\n case \"footnote_ref\": {\n const refElement =\n node.noteKind === \"footnote\"\n ? `<w:footnoteReference w:id=\"${escapeAttribute(node.noteId)}\"/>`\n : `<w:endnoteReference w:id=\"${escapeAttribute(node.noteId)}\"/>`;\n const styleVal =\n node.noteKind === \"footnote\"\n ? \"FootnoteReference\"\n : \"EndnoteReference\";\n const xml = `<w:r><w:rPr><w:rStyle w:val=\"${styleVal}\"/></w:rPr>${refElement}</w:r>`;\n const boundaries = new Map<number, number>();\n boundaries.set(cursor, xmlOffset);\n boundaries.set(cursor + 1, xmlOffset + xml.length);\n return {\n xml,\n cursor: cursor + 1,\n boundaries,\n };\n }\n default: {\n const boundaries = new Map<number, number>();\n boundaries.set(cursor, xmlOffset);\n return { xml: \"\", cursor, boundaries };\n }\n }\n}\n\nfunction serializeImageNode(\n node: Extract<InlineNode, { type: \"image\" }>,\n state: SerializationState,\n): string {\n const placementXml = typeof node.placementXml === \"string\" ? node.placementXml.trim() : \"\";\n if (placementXml.length > 0) {\n return placementXml.startsWith(\"<w:r\") ? placementXml : `<w:r>${placementXml}</w:r>`;\n }\n\n const mediaItem = state.media.items[node.mediaId];\n if (mediaItem?.relationshipId && state.existingRelationshipMap.has(mediaItem.relationshipId)) {\n const altText = node.altText ?? mediaItem.altText ?? mediaItem.filename;\n return `<w:r><w:drawing><wp:inline xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" xmlns:pic=\"http://schemas.openxmlformats.org/drawingml/2006/picture\" xmlns:wp=\"http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing\"><wp:extent cx=\"9525\" cy=\"9525\"/><wp:docPr id=\"1\" name=\"${escapeAttribute(mediaItem.filename)}\" descr=\"${escapeAttribute(altText ?? \"\")}\"/><wp:cNvGraphicFramePr/><a:graphic><a:graphicData uri=\"http://schemas.openxmlformats.org/drawingml/2006/picture\"><pic:pic><pic:nvPicPr><pic:cNvPr id=\"0\" name=\"${escapeAttribute(mediaItem.filename)}\"/><pic:cNvPicPr/></pic:nvPicPr><pic:blipFill><a:blip r:embed=\"${escapeAttribute(mediaItem.relationshipId)}\"/><a:stretch><a:fillRect/></a:stretch></pic:blipFill><pic:spPr><a:xfrm><a:off x=\"0\" y=\"0\"/><a:ext cx=\"9525\" cy=\"9525\"/></a:xfrm><a:prstGeom prst=\"rect\"><a:avLst/></a:prstGeom></pic:spPr></pic:pic></a:graphicData></a:graphic></wp:inline></w:drawing></w:r>`;\n }\n\n return serializeRun({\n kind: \"text\",\n text: node.altText ?? \"[Image]\",\n });\n}\n\nfunction serializeRun(piece: RunPiece): string {\n const marks = piece.kind === \"text\" ? piece.marks : undefined;\n const properties = serializeRunProperties(marks);\n const content = serializeRunPiece(piece);\n return `<w:r>${properties}${content}</w:r>`;\n}\n\nfunction serializeRunProperties(marks: TextMark[] | undefined): string {\n if (!marks || marks.length === 0) {\n return \"\";\n }\n\n const markParts: string[] = [];\n for (const mark of marks) {\n switch (mark.type) {\n case \"bold\":\n markParts.push(\"<w:b/>\");\n break;\n case \"italic\":\n markParts.push(\"<w:i/>\");\n break;\n case \"underline\":\n markParts.push(`<w:u w:val=\"single\"/>`);\n break;\n case \"strikethrough\":\n markParts.push(\"<w:strike/>\");\n break;\n case \"doubleStrikethrough\":\n markParts.push(\"<w:dstrike/>\");\n break;\n case \"vanish\":\n markParts.push(\"<w:vanish/>\");\n break;\n case \"lang\":\n markParts.push(`<w:lang w:val=\"${escapeAttribute(mark.val)}\"/>`);\n break;\n case \"highlight\":\n markParts.push(`<w:highlight w:val=\"${escapeAttribute(mark.val)}\"/>`);\n break;\n case \"backgroundColor\":\n markParts.push(\n `<w:shd w:val=\"clear\" w:color=\"auto\" w:fill=\"${escapeAttribute(mark.color)}\"/>`,\n );\n break;\n case \"charSpacing\":\n markParts.push(`<w:spacing w:val=\"${mark.val}\"/>`);\n break;\n case \"kerning\":\n markParts.push(`<w:kern w:val=\"${mark.val}\"/>`);\n break;\n case \"emboss\":\n markParts.push(\"<w:emboss/>\");\n break;\n case \"imprint\":\n markParts.push(\"<w:imprint/>\");\n break;\n case \"shadow\":\n markParts.push(\"<w:shadow/>\");\n break;\n case \"position\":\n markParts.push(`<w:position w:val=\"${mark.val}\"/>`);\n break;\n case \"textFill\":\n markParts.push(mark.xml);\n break;\n case \"fontFamily\":\n markParts.push(`<w:rFonts w:ascii=\"${escapeAttribute(mark.val)}\" w:hAnsi=\"${escapeAttribute(mark.val)}\"/>`);\n break;\n case \"fontSize\":\n markParts.push(`<w:sz w:val=\"${mark.val}\"/>`);\n break;\n case \"textColor\":\n markParts.push(`<w:color w:val=\"${escapeAttribute(mark.color)}\"/>`);\n break;\n case \"smallCaps\":\n markParts.push(\"<w:smallCaps/>\");\n break;\n case \"allCaps\":\n markParts.push(\"<w:caps/>\");\n break;\n }\n }\n\n const children = markParts.join(\"\");\n return children.length > 0 ? `<w:rPr>${children}</w:rPr>` : \"\";\n}\n\nfunction requiresPreservedSpace(text: string): boolean {\n return /^\\s/.test(text) || /\\s$/.test(text) || text.includes(\" \");\n}\n\nfunction lookupOpaqueXml(fragmentId: string, state: SerializationState): string {\n const fragment = getOpaqueFragment(state.preservation, fragmentId);\n if (!fragment || fragment.payloadKind !== \"xml-subtree\") {\n throw new Error(`Missing preserved OOXML fragment ${fragmentId} during serialization.`);\n }\n\n retainRelationshipsForFragment(\n fragment,\n state.relationships,\n state.existingRelationshipMap,\n state.retainedRelationshipIds,\n );\n return fragment.payloadReference;\n}\n\nfunction cloneRelationship(relationship: OpcRelationship): OpcRelationship {\n return { ...relationship };\n}\n\nfunction looksLikeSectionPropertiesXml(xml: string): boolean {\n return /^<[^>]*:?sectPr(?:\\s|>|\\/)/.test(xml.trim());\n}\n\nfunction escapeXml(value: string): string {\n return value\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\");\n}\n\nfunction escapeAttribute(value: string): string {\n return escapeXml(value).replace(/\"/g, \""\");\n}\n\nfunction offsetParagraphBoundary(\n boundary: RevisionParagraphBoundary,\n offset: number,\n): RevisionParagraphBoundary {\n return {\n ...boundary,\n boundaries: new Map(\n [...boundary.boundaries.entries()].map(([position, index]) => [\n position,\n index + offset,\n ]),\n ),\n paragraphStart: boundary.paragraphStart + offset,\n paragraphStartTagEnd: boundary.paragraphStartTagEnd + offset,\n paragraphEndTagStart: boundary.paragraphEndTagStart + offset,\n paragraphEnd: boundary.paragraphEnd + offset,\n ...(boundary.paragraphPropertiesStart !== undefined\n ? { paragraphPropertiesStart: boundary.paragraphPropertiesStart + offset }\n : {}),\n ...(boundary.paragraphPropertiesEnd !== undefined\n ? { paragraphPropertiesEnd: boundary.paragraphPropertiesEnd + offset }\n : {}),\n ...(boundary.paragraphRunPropertiesStart !== undefined\n ? { paragraphRunPropertiesStart: boundary.paragraphRunPropertiesStart + offset }\n : {}),\n ...(boundary.paragraphRunPropertiesEnd !== undefined\n ? { paragraphRunPropertiesEnd: boundary.paragraphRunPropertiesEnd + offset }\n : {}),\n };\n}\n\nfunction serializeDocumentAttributes(\n attributes: Record<string, string> | undefined,\n content?: DocumentRootNode,\n): string {\n const merged = {\n \"xmlns:r\": \"http://schemas.openxmlformats.org/officeDocument/2006/relationships\",\n \"xmlns:w\": \"http://schemas.openxmlformats.org/wordprocessingml/2006/main\",\n ...(content && documentNeedsW14Namespace(content)\n ? { \"xmlns:w14\": \"http://schemas.microsoft.com/office/word/2010/wordml\" }\n : {}),\n ...(attributes ?? {}),\n };\n\n return Object.entries(merged)\n .map(([name, value]) => ` ${name}=\"${escapeAttribute(value)}\"`)\n .join(\"\");\n}\n\nexport function serializeSectionPropertiesXml(props: SectionProperties): string {\n const children: string[] = [];\n\n // Header references\n if (props.headerReferences) {\n for (const ref of props.headerReferences) {\n children.push(`<w:headerReference w:type=\"${escapeAttribute(ref.variant)}\" r:id=\"${escapeAttribute(ref.relationshipId)}\"/>`);\n }\n }\n\n // Footer references\n if (props.footerReferences) {\n for (const ref of props.footerReferences) {\n children.push(`<w:footerReference w:type=\"${escapeAttribute(ref.variant)}\" r:id=\"${escapeAttribute(ref.relationshipId)}\"/>`);\n }\n }\n\n // Section type\n if (props.sectionType) {\n children.push(`<w:type w:val=\"${escapeAttribute(props.sectionType)}\"/>`);\n }\n\n // Page size\n if (props.pageSize) {\n let pgSz = `<w:pgSz w:w=\"${props.pageSize.width}\" w:h=\"${props.pageSize.height}\"`;\n if (props.pageSize.orientation) {\n pgSz += ` w:orient=\"${props.pageSize.orientation}\"`;\n }\n pgSz += \"/>\";\n children.push(pgSz);\n }\n\n // Page margins\n if (props.pageMargins) {\n let pgMar = `<w:pgMar w:top=\"${props.pageMargins.top}\" w:right=\"${props.pageMargins.right}\" w:bottom=\"${props.pageMargins.bottom}\" w:left=\"${props.pageMargins.left}\"`;\n if (props.pageMargins.header !== undefined) pgMar += ` w:header=\"${props.pageMargins.header}\"`;\n if (props.pageMargins.footer !== undefined) pgMar += ` w:footer=\"${props.pageMargins.footer}\"`;\n if (props.pageMargins.gutter !== undefined) pgMar += ` w:gutter=\"${props.pageMargins.gutter}\"`;\n pgMar += \"/>\";\n children.push(pgMar);\n }\n\n // Columns\n if (props.columns) {\n let cols = \"<w:cols\";\n if (props.columns.count !== undefined) cols += ` w:num=\"${props.columns.count}\"`;\n if (props.columns.space !== undefined) cols += ` w:space=\"${props.columns.space}\"`;\n if (props.columns.equalWidth !== undefined) cols += ` w:equalWidth=\"${props.columns.equalWidth ? \"1\" : \"0\"}\"`;\n if (props.columns.separator) cols += ` w:sep=\"1\"`;\n if (props.columns.columns && props.columns.columns.length > 0) {\n cols += \">\";\n for (const col of props.columns.columns) {\n let colXml = `<w:col w:w=\"${col.width}\"`;\n if (col.space !== undefined) colXml += ` w:space=\"${col.space}\"`;\n colXml += \"/>\";\n cols += colXml;\n }\n cols += \"</w:cols>\";\n } else {\n cols += \"/>\";\n }\n children.push(cols);\n }\n\n // Page numbering\n if (props.pageNumbering) {\n let pgNum = \"<w:pgNumType\";\n if (props.pageNumbering.format) pgNum += ` w:fmt=\"${escapeAttribute(props.pageNumbering.format)}\"`;\n if (props.pageNumbering.start !== undefined) pgNum += ` w:start=\"${props.pageNumbering.start}\"`;\n if (props.pageNumbering.chapStyle) pgNum += ` w:chapStyle=\"${escapeAttribute(props.pageNumbering.chapStyle)}\"`;\n if (props.pageNumbering.chapSep) pgNum += ` w:chapSep=\"${escapeAttribute(props.pageNumbering.chapSep)}\"`;\n pgNum += \"/>\";\n children.push(pgNum);\n }\n\n if (props.lineNumbering) {\n let lineNumbering = \"<w:lnNumType\";\n if (props.lineNumbering.countBy !== undefined) {\n lineNumbering += ` w:countBy=\"${props.lineNumbering.countBy}\"`;\n }\n if (props.lineNumbering.start !== undefined) {\n lineNumbering += ` w:start=\"${props.lineNumbering.start}\"`;\n }\n if (props.lineNumbering.distance !== undefined) {\n lineNumbering += ` w:distance=\"${props.lineNumbering.distance}\"`;\n }\n if (props.lineNumbering.restart) {\n lineNumbering += ` w:restart=\"${escapeAttribute(props.lineNumbering.restart)}\"`;\n }\n lineNumbering += \"/>\";\n children.push(lineNumbering);\n }\n\n if (props.pageBorders) {\n const attrs: string[] = [];\n if (props.pageBorders.offsetFrom) {\n attrs.push(`w:offsetFrom=\"${escapeAttribute(props.pageBorders.offsetFrom)}\"`);\n }\n if (props.pageBorders.display) {\n attrs.push(`w:display=\"${escapeAttribute(props.pageBorders.display)}\"`);\n }\n if (props.pageBorders.zOrder) {\n attrs.push(`w:zOrder=\"${escapeAttribute(props.pageBorders.zOrder)}\"`);\n }\n const borderXml = [\n serializeBorder(\"top\", props.pageBorders.top),\n serializeBorder(\"left\", props.pageBorders.left),\n serializeBorder(\"bottom\", props.pageBorders.bottom),\n serializeBorder(\"right\", props.pageBorders.right),\n ].filter((entry) => entry.length > 0);\n if (attrs.length > 0 || borderXml.length > 0) {\n children.push(\n `<w:pgBorders${attrs.length > 0 ? ` ${attrs.join(\" \")}` : \"\"}>${borderXml.join(\"\")}</w:pgBorders>`,\n );\n }\n }\n\n // Title page\n if (props.titlePage) {\n children.push(\"<w:titlePg/>\");\n }\n\n if (props.documentGrid) {\n const attrs: string[] = [];\n if (props.documentGrid.type) {\n attrs.push(`w:type=\"${escapeAttribute(props.documentGrid.type)}\"`);\n }\n if (props.documentGrid.linePitch !== undefined) {\n attrs.push(`w:linePitch=\"${props.documentGrid.linePitch}\"`);\n }\n if (props.documentGrid.charSpace !== undefined) {\n attrs.push(`w:charSpace=\"${props.documentGrid.charSpace}\"`);\n }\n if (attrs.length > 0) {\n children.push(`<w:docGrid ${attrs.join(\" \")}/>`);\n }\n }\n\n if (children.length === 0) {\n return \"<w:sectPr/>\";\n }\n\n return `<w:sectPr>${children.join(\"\")}</w:sectPr>`;\n}\n\nfunction wrapInlineRawXml(rawXml: string): string {\n const trimmed = rawXml.trimStart();\n return trimmed.startsWith(\"<w:r\") ? rawXml : `<w:r>${rawXml}</w:r>`;\n}\n\nfunction documentNeedsW14Namespace(content: DocumentRootNode): boolean {\n const blockQueue = [...content.children];\n while (blockQueue.length > 0) {\n const block = blockQueue.shift();\n if (!block) {\n continue;\n }\n if (block.type === \"paragraph\") {\n for (const child of block.children) {\n if (\n (child.type === \"text\" || child.type === \"symbol\") &&\n child.marks?.some((mark) => mark.type === \"textFill\")\n ) {\n return true;\n }\n }\n continue;\n }\n if (block.type === \"table\") {\n for (const row of block.rows) {\n for (const cell of row.cells) {\n blockQueue.push(...cell.children);\n }\n }\n }\n }\n return false;\n}\n","export interface XmlElementNode {\n type: \"element\";\n name: string;\n attributes: Record<string, string>;\n children: XmlNode[];\n start: number;\n end: number;\n openingTagEnd: number;\n closingTagStart: number;\n}\n\nexport interface XmlTextNode {\n type: \"text\";\n text: string;\n start: number;\n end: number;\n}\n\nexport type XmlNode = XmlElementNode | XmlTextNode;\n\nexport interface RevisionParagraphBoundary {\n paragraphIndex: number;\n start: number;\n end: number;\n boundaries: Map<number, number>;\n paragraphStart: number;\n paragraphStartTagEnd: number;\n paragraphEndTagStart: number;\n paragraphEnd: number;\n paragraphPropertiesStart?: number;\n paragraphPropertiesEnd?: number;\n paragraphRunPropertiesStart?: number;\n paragraphRunPropertiesEnd?: number;\n}\n\nexport function mapRevisionBoundaries(\n documentXml: string,\n): RevisionParagraphBoundary[] {\n const root = parseXmlWithPositions(documentXml);\n const documentElement = findRequiredChildElement(root, \"document\");\n const bodyElement = findRequiredChildElement(documentElement, \"body\");\n const paragraphs: RevisionParagraphBoundary[] = [];\n let cursor = 0;\n let paragraphIndex = -1;\n let previousWasParagraph = false;\n\n for (const child of bodyElement.children) {\n if (child.type !== \"element\") {\n continue;\n }\n\n if (localName(child.name) !== \"p\") {\n cursor += 1;\n previousWasParagraph = false;\n continue;\n }\n\n if (previousWasParagraph) {\n cursor += 1;\n }\n paragraphIndex += 1;\n const boundaries = new Map<number, number>();\n boundaries.set(cursor, child.openingTagEnd);\n\n const paragraphProperties = findChildElement(child, \"pPr\");\n const paragraphRunProperties = paragraphProperties\n ? findChildElement(paragraphProperties, \"rPr\")\n : undefined;\n\n walkStoryNodesForBoundaries(\n child.children,\n boundaries,\n () => cursor,\n (next) => {\n cursor = next;\n },\n );\n\n boundaries.set(cursor, child.closingTagStart);\n paragraphs.push({\n paragraphIndex,\n start: Math.min(...boundaries.keys()),\n end: Math.max(...boundaries.keys()),\n boundaries,\n paragraphStart: child.start,\n paragraphStartTagEnd: child.openingTagEnd,\n paragraphEndTagStart: child.closingTagStart,\n paragraphEnd: child.end,\n ...(paragraphProperties\n ? {\n paragraphPropertiesStart: paragraphProperties.start,\n paragraphPropertiesEnd: paragraphProperties.end,\n }\n : {}),\n ...(paragraphRunProperties\n ? {\n paragraphRunPropertiesStart: paragraphRunProperties.start,\n paragraphRunPropertiesEnd: paragraphRunProperties.end,\n }\n : {}),\n });\n previousWasParagraph = true;\n }\n\n return paragraphs;\n}\n\nfunction walkStoryNodesForBoundaries(\n nodes: XmlNode[],\n boundaries: Map<number, number>,\n getCursor: () => number,\n setCursor: (next: number) => void,\n): void {\n for (const node of nodes) {\n walkStoryNodeForBoundaries(node, boundaries, getCursor, setCursor);\n }\n}\n\nfunction walkStoryNodeForBoundaries(\n node: XmlNode,\n boundaries: Map<number, number>,\n getCursor: () => number,\n setCursor: (next: number) => void,\n): void {\n if (node.type !== \"element\") {\n return;\n }\n\n switch (localName(node.name)) {\n case \"pPr\":\n return;\n case \"r\":\n boundaries.set(getCursor(), node.start);\n for (const child of node.children) {\n walkStoryNodeForBoundaries(child, boundaries, getCursor, setCursor);\n }\n boundaries.set(getCursor(), node.end);\n return;\n case \"ins\":\n case \"del\":\n case \"moveFrom\":\n case \"moveTo\":\n case \"hyperlink\":\n case \"smartTag\":\n case \"sdtContent\":\n case \"customXml\":\n for (const child of node.children) {\n walkStoryNodeForBoundaries(child, boundaries, getCursor, setCursor);\n }\n return;\n case \"t\":\n case \"delText\":\n case \"instrText\":\n case \"delInstrText\": {\n const text = node.children\n .filter((child): child is XmlTextNode => child.type === \"text\")\n .map((child) => child.text)\n .join(\"\");\n if (text.length === 0) {\n return;\n }\n\n if (!boundaries.has(getCursor())) {\n boundaries.set(getCursor(), node.start);\n }\n setCursor(getCursor() + text.length);\n boundaries.set(getCursor(), node.end);\n return;\n }\n case \"tab\":\n case \"br\":\n case \"cr\":\n if (!boundaries.has(getCursor())) {\n boundaries.set(getCursor(), node.start);\n }\n setCursor(getCursor() + 1);\n boundaries.set(getCursor(), node.end);\n return;\n default:\n for (const child of node.children) {\n walkStoryNodeForBoundaries(child, boundaries, getCursor, setCursor);\n }\n }\n}\n\nexport function parseXmlWithPositions(xml: string): XmlElementNode {\n const root: XmlElementNode = {\n type: \"element\",\n name: \"__root__\",\n attributes: {},\n children: [],\n start: 0,\n end: xml.length,\n openingTagEnd: 0,\n closingTagStart: xml.length,\n };\n const stack: XmlElementNode[] = [root];\n let cursor = 0;\n\n while (cursor < xml.length) {\n if (xml.startsWith(\"<!--\", cursor)) {\n const end = xml.indexOf(\"-->\", cursor);\n cursor = end >= 0 ? end + 3 : xml.length;\n continue;\n }\n\n if (xml.startsWith(\"<?\", cursor)) {\n const end = xml.indexOf(\"?>\", cursor);\n cursor = end >= 0 ? end + 2 : xml.length;\n continue;\n }\n\n if (xml.startsWith(\"<![CDATA[\", cursor)) {\n const end = xml.indexOf(\"]]>\", cursor);\n const textEnd = end >= 0 ? end : xml.length;\n stack[stack.length - 1]?.children.push({\n type: \"text\",\n text: xml.slice(cursor + 9, textEnd),\n start: cursor,\n end: textEnd,\n });\n cursor = end >= 0 ? end + 3 : xml.length;\n continue;\n }\n\n if (xml[cursor] !== \"<\") {\n const nextTag = xml.indexOf(\"<\", cursor);\n const end = nextTag >= 0 ? nextTag : xml.length;\n const text = decodeXmlEntities(xml.slice(cursor, end));\n if (text.length > 0) {\n stack[stack.length - 1]?.children.push({\n type: \"text\",\n text,\n start: cursor,\n end,\n });\n }\n cursor = end;\n continue;\n }\n\n if (xml[cursor + 1] === \"/\") {\n const tagEnd = xml.indexOf(\">\", cursor);\n if (tagEnd < 0) {\n throw new Error(\"Malformed XML: unterminated closing tag.\");\n }\n\n const node = stack.pop();\n if (!node || stack.length === 0) {\n throw new Error(\"Malformed XML: unexpected closing tag.\");\n }\n\n node.closingTagStart = cursor;\n node.end = tagEnd + 1;\n cursor = tagEnd + 1;\n continue;\n }\n\n const tagEnd = xml.indexOf(\">\", cursor);\n if (tagEnd < 0) {\n throw new Error(\"Malformed XML: unterminated opening tag.\");\n }\n\n const rawTag = xml.slice(cursor + 1, tagEnd);\n const selfClosing = /\\/\\s*$/.test(rawTag);\n const normalizedTag = selfClosing ? rawTag.replace(/\\/\\s*$/, \"\") : rawTag;\n const parts = normalizedTag.trim().split(/\\s+/, 1);\n const name = parts[0];\n if (!name) {\n throw new Error(\"Malformed XML: empty tag name.\");\n }\n\n const attributes = parseAttributes(normalizedTag.slice(name.length));\n const node: XmlElementNode = {\n type: \"element\",\n name,\n attributes,\n children: [],\n start: cursor,\n end: selfClosing ? tagEnd + 1 : xml.length,\n openingTagEnd: tagEnd + 1,\n closingTagStart: tagEnd + 1,\n };\n\n stack[stack.length - 1]?.children.push(node);\n cursor = tagEnd + 1;\n\n if (!selfClosing) {\n stack.push(node);\n }\n }\n\n if (stack.length !== 1) {\n throw new Error(\"Malformed XML: unclosed element.\");\n }\n\n return root;\n}\n\nexport function findRequiredChildElement(\n node: XmlElementNode,\n childLocalName: string,\n): XmlElementNode {\n const child = findChildElement(node, childLocalName);\n if (!child) {\n throw new Error(`Expected <${childLocalName}> element.`);\n }\n\n return child;\n}\n\nexport function findChildElement(\n node: XmlElementNode,\n childLocalName: string,\n): XmlElementNode | undefined {\n return node.children.find(\n (entry): entry is XmlElementNode =>\n entry.type === \"element\" && localName(entry.name) === childLocalName,\n );\n}\n\nexport function localName(name: string): string {\n const separatorIndex = name.indexOf(\":\");\n return separatorIndex >= 0 ? name.slice(separatorIndex + 1) : name;\n}\n\nfunction parseAttributes(source: string): Record<string, string> {\n const attributes: Record<string, string> = {};\n const attributePattern = /([A-Za-z_][A-Za-z0-9:._-]*)\\s*=\\s*(\"([^\"]*)\"|'([^']*)')/g;\n\n for (const match of source.matchAll(attributePattern)) {\n const key = match[1];\n if (!key) {\n continue;\n }\n\n const rawValue = match[3] ?? match[4] ?? \"\";\n attributes[key] = decodeXmlEntities(rawValue);\n }\n\n return attributes;\n}\n\nfunction decodeXmlEntities(value: string): string {\n return value\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/"/g, \"\\\"\")\n .replace(/'/g, \"'\")\n .replace(/&/g, \"&\");\n}\n","import type { RevisionRecord } from \"../../review/store/revision-types.ts\";\nimport {\n mapRevisionBoundaries,\n type RevisionParagraphBoundary,\n} from \"../ooxml/revision-boundaries.ts\";\n\ninterface XmlReplacement {\n start: number;\n end: number;\n replacement: string;\n}\n\nexport interface SerializedRuntimeRevisionsResult {\n documentXml: string;\n serializedRevisionIds: string[];\n skippedRevisionIds: string[];\n}\n\nexport function serializeRuntimeRevisionsIntoDocumentXml(\n documentXml: string,\n revisions: readonly RevisionRecord[],\n boundaries: readonly RevisionParagraphBoundary[] = mapRevisionBoundaries(documentXml),\n): SerializedRuntimeRevisionsResult {\n const replacements: XmlReplacement[] = [];\n const serializedRevisionIds: string[] = [];\n const skippedRevisionIds: string[] = [];\n const paragraphMarkers = new Map<\n number,\n { boundary: RevisionParagraphBoundary; markers: string[]; revisionIds: string[] }\n >();\n\n for (const revision of revisions) {\n if (revision.status !== \"active\" || revision.anchor.kind !== \"range\") {\n continue;\n }\n\n if (revision.kind !== \"insertion\" && revision.kind !== \"deletion\") {\n continue;\n }\n\n const form = revision.metadata.importedRevisionForm;\n if (form === \"paragraph-insertion\" || form === \"paragraph-deletion\") {\n const paragraphBoundary = findParagraphBoundaryForAnchor(boundaries, revision);\n if (!paragraphBoundary) {\n skippedRevisionIds.push(revision.revisionId);\n continue;\n }\n\n const entry = paragraphMarkers.get(paragraphBoundary.paragraphIndex) ?? {\n boundary: paragraphBoundary,\n markers: [],\n revisionIds: [],\n };\n entry.markers.push(createParagraphRevisionMarker(revision));\n entry.revisionIds.push(revision.revisionId);\n paragraphMarkers.set(paragraphBoundary.paragraphIndex, entry);\n serializedRevisionIds.push(revision.revisionId);\n continue;\n }\n\n const rangeReplacement = createRangeRevisionReplacement(documentXml, boundaries, revision);\n if (!rangeReplacement) {\n skippedRevisionIds.push(revision.revisionId);\n continue;\n }\n\n replacements.push(rangeReplacement);\n serializedRevisionIds.push(revision.revisionId);\n }\n\n for (const { boundary, markers, revisionIds } of paragraphMarkers.values()) {\n const paragraphInsertion = createParagraphRevisionInsertion(\n documentXml,\n boundary,\n markers,\n );\n if (!paragraphInsertion) {\n skippedRevisionIds.push(...revisionIds);\n continue;\n }\n\n replacements.push(paragraphInsertion);\n }\n\n return {\n documentXml: applyReplacements(documentXml, replacements),\n serializedRevisionIds,\n skippedRevisionIds,\n };\n}\n\nfunction createRangeRevisionReplacement(\n documentXml: string,\n boundaries: readonly RevisionParagraphBoundary[],\n revision: RevisionRecord,\n): XmlReplacement | undefined {\n const { anchor } = revision;\n if (anchor.kind !== \"range\") {\n return undefined;\n }\n const paragraphBoundary = findParagraphBoundaryForRange(boundaries, anchor.range.from, anchor.range.to);\n if (!paragraphBoundary) {\n return undefined;\n }\n\n const startIndex = paragraphBoundary.boundaries.get(anchor.range.from);\n const endIndex = paragraphBoundary.boundaries.get(anchor.range.to);\n if (startIndex === undefined || endIndex === undefined || endIndex < startIndex) {\n return undefined;\n }\n\n const xml = documentXml.slice(startIndex, endIndex);\n const attributes = serializeRevisionAttributes(revision);\n return {\n start: startIndex,\n end: endIndex,\n replacement:\n revision.kind === \"insertion\"\n ? `<w:ins${attributes}>${xml}</w:ins>`\n : `<w:del${attributes}>${convertRunsToDeletedContent(xml)}</w:del>`,\n };\n}\n\nfunction createParagraphRevisionMarker(revision: RevisionRecord): string {\n const markerName = revision.kind === \"insertion\" ? \"w:ins\" : \"w:del\";\n return `<${markerName}${serializeRevisionAttributes(revision)}/>`;\n}\n\nfunction createParagraphRevisionInsertion(\n documentXml: string,\n paragraphBoundary: RevisionParagraphBoundary,\n markers: readonly string[],\n): XmlReplacement | undefined {\n const paragraphXml = documentXml.slice(\n paragraphBoundary.paragraphStart,\n paragraphBoundary.paragraphEnd,\n );\n const markerXml = markers.join(\"\");\n const paragraphRunPropertiesInsertionIndex = findClosingTagInsertionIndex(\n documentXml,\n paragraphBoundary.paragraphRunPropertiesStart,\n paragraphBoundary.paragraphRunPropertiesEnd,\n \"w:rPr\",\n );\n if (paragraphRunPropertiesInsertionIndex !== undefined) {\n return {\n start: paragraphRunPropertiesInsertionIndex,\n end: paragraphRunPropertiesInsertionIndex,\n replacement: markerXml,\n };\n }\n\n const paragraphPropertiesInsertionIndex = findClosingTagInsertionIndex(\n documentXml,\n paragraphBoundary.paragraphPropertiesStart,\n paragraphBoundary.paragraphPropertiesEnd,\n \"w:pPr\",\n );\n if (paragraphPropertiesInsertionIndex !== undefined) {\n return {\n start: paragraphPropertiesInsertionIndex,\n end: paragraphPropertiesInsertionIndex,\n replacement: `<w:rPr>${markerXml}</w:rPr>`,\n };\n }\n\n if (!/<w:p[\\s>]/u.test(paragraphXml)) {\n return undefined;\n }\n\n return {\n start: paragraphBoundary.paragraphStartTagEnd,\n end: paragraphBoundary.paragraphStartTagEnd,\n replacement: `<w:pPr><w:rPr>${markerXml}</w:rPr></w:pPr>`,\n };\n}\n\nfunction findParagraphBoundaryForRange(\n boundaries: readonly RevisionParagraphBoundary[],\n from: number,\n to: number,\n): RevisionParagraphBoundary | undefined {\n return boundaries.find(\n (boundary) => from >= boundary.start && to <= boundary.end,\n );\n}\n\nfunction findParagraphBoundaryForAnchor(\n boundaries: readonly RevisionParagraphBoundary[],\n revision: RevisionRecord,\n): RevisionParagraphBoundary | undefined {\n const anchor = revision.anchor.kind === \"range\" ? revision.anchor.range.from : undefined;\n if (anchor === undefined) {\n return undefined;\n }\n\n return boundaries.find(\n (boundary) =>\n boundary.end === anchor ||\n (anchor >= boundary.start && anchor <= boundary.end),\n );\n}\n\nfunction serializeRevisionAttributes(revision: RevisionRecord): string {\n const attributes = {\n \"w:id\": revision.metadata.ooxmlRevisionId ?? sanitizeRevisionId(revision.revisionId),\n \"w:author\": revision.authorId,\n \"w:date\": revision.createdAt,\n };\n\n return Object.entries(attributes)\n .filter(([, value]) => value && value.length > 0)\n .map(([name, value]) => ` ${name}=\"${escapeAttribute(value)}\"`)\n .join(\"\");\n}\n\nfunction findClosingTagInsertionIndex(\n documentXml: string,\n start: number | undefined,\n end: number | undefined,\n tagName: string,\n): number | undefined {\n if (start === undefined || end === undefined) {\n return undefined;\n }\n\n const closingTag = `</${tagName}>`;\n const closingIndex = documentXml.lastIndexOf(closingTag, end);\n if (closingIndex < start) {\n return undefined;\n }\n\n return closingIndex;\n}\n\nfunction sanitizeRevisionId(revisionId: string): string {\n const numericTail = /(\\d+)$/.exec(revisionId)?.[1];\n return numericTail ?? revisionId.replace(/[^A-Za-z0-9._-]/g, \"-\");\n}\n\nfunction convertRunsToDeletedContent(xml: string): string {\n return xml\n .replace(/<(\\/?)w:t\\b/g, \"<$1w:delText\")\n .replace(/<(\\/?)w:instrText\\b/g, \"<$1w:delInstrText\");\n}\n\nfunction applyReplacements(documentXml: string, replacements: readonly XmlReplacement[]): string {\n const sorted = replacements\n .slice()\n .sort((left, right) => right.start - left.start || right.end - left.end);\n let output = documentXml;\n\n for (const replacement of sorted) {\n output =\n output.slice(0, replacement.start) +\n replacement.replacement +\n output.slice(replacement.end);\n }\n\n return output;\n}\n\nfunction escapeAttribute(value: string): string {\n return value\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\");\n}\n","import type {\n DocumentRootNode,\n HyperlinkNode,\n InlineNode,\n ParagraphNode,\n TextNode,\n} from \"../../model/canonical-document.ts\";\nimport type { CommentThread } from \"../../review/store/comment-store.ts\";\nimport type { RevisionRecord } from \"../../review/store/revision-types.ts\";\n\nexport function splitDocumentAtReviewBoundaries(\n content: DocumentRootNode,\n comments: readonly CommentThread[],\n revisions: readonly RevisionRecord[],\n): DocumentRootNode {\n const splitPositions = collectSplitPositions(comments, revisions);\n if (splitPositions.size === 0) {\n return content;\n }\n\n return {\n type: \"doc\",\n children: splitBlockNodes(content.children, splitPositions, 0, true).children,\n };\n}\n\nfunction collectSplitPositions(\n comments: readonly CommentThread[],\n revisions: readonly RevisionRecord[],\n): Set<number> {\n const positions = new Set<number>();\n\n for (const thread of comments) {\n if (thread.anchor.kind !== \"range\") {\n continue;\n }\n\n positions.add(thread.anchor.range.from);\n positions.add(thread.anchor.range.to);\n }\n\n for (const revision of revisions) {\n if (revision.status !== \"active\" || revision.anchor.kind !== \"range\") {\n continue;\n }\n\n if (\n revision.metadata.importedRevisionForm === \"paragraph-insertion\" ||\n revision.metadata.importedRevisionForm === \"paragraph-deletion\"\n ) {\n continue;\n }\n\n positions.add(revision.anchor.range.from);\n positions.add(revision.anchor.range.to);\n }\n\n return positions;\n}\n\nfunction splitParagraph(\n paragraph: ParagraphNode,\n splitPositions: ReadonlySet<number>,\n cursor: number,\n): { paragraph: ParagraphNode; cursor: number } {\n const children: InlineNode[] = [];\n let nextCursor = cursor;\n\n for (const child of paragraph.children) {\n if (child.type === \"text\") {\n const split = splitTextNode(child, splitPositions, nextCursor);\n children.push(...split.children);\n nextCursor = split.cursor;\n continue;\n }\n\n if (child.type === \"hyperlink\") {\n const split = splitHyperlinkNode(child, splitPositions, nextCursor);\n children.push(...split.children);\n nextCursor = split.cursor;\n continue;\n }\n\n children.push(child);\n nextCursor += measureInlineNodeForReviewBoundaries(child);\n }\n\n return {\n paragraph: {\n ...paragraph,\n children,\n },\n cursor: nextCursor,\n };\n}\n\nfunction splitBlockNodes(\n blocks: readonly DocumentRootNode[\"children\"][number][],\n splitPositions: ReadonlySet<number>,\n cursor: number,\n useSurfaceParagraphSeparators: boolean,\n): {\n children: DocumentRootNode[\"children\"];\n cursor: number;\n} {\n const children: DocumentRootNode[\"children\"] = [];\n let nextCursor = cursor;\n for (const [index, block] of blocks.entries()) {\n if (block.type === \"paragraph\") {\n if (useSurfaceParagraphSeparators && index > 0) {\n nextCursor += 1;\n }\n const next = splitParagraph(block, splitPositions, nextCursor);\n children.push(next.paragraph);\n nextCursor = next.cursor;\n continue;\n }\n\n if (block.type === \"table\") {\n const next = splitTableAtReviewBoundaries(block, splitPositions, nextCursor);\n children.push(next.table);\n nextCursor = next.cursor;\n continue;\n }\n\n if (block.type === \"sdt\") {\n const next = splitBlockNodes(block.children, splitPositions, nextCursor, false);\n children.push({\n ...block,\n children: next.children,\n });\n nextCursor = next.cursor;\n continue;\n }\n\n if (block.type === \"custom_xml\") {\n children.push(block);\n nextCursor += 1;\n continue;\n }\n\n children.push(block);\n nextCursor += 1;\n }\n\n return {\n children,\n cursor: nextCursor,\n };\n}\n\nfunction splitTableAtReviewBoundaries(\n table: Extract<DocumentRootNode[\"children\"][number], { type: \"table\" }>,\n splitPositions: ReadonlySet<number>,\n cursor: number,\n): {\n table: Extract<DocumentRootNode[\"children\"][number], { type: \"table\" }>;\n cursor: number;\n} {\n let nextCursor = cursor;\n const rows = table.rows.map((row) => ({\n ...row,\n cells: row.cells.map((cell) => {\n const next = splitBlockNodes(cell.children, splitPositions, nextCursor, false);\n nextCursor = next.cursor;\n return {\n ...cell,\n children: next.children,\n };\n }),\n }));\n\n return {\n table: {\n ...table,\n rows,\n },\n cursor: nextCursor,\n };\n}\n\nfunction advanceCursorThroughTable(\n table: Extract<DocumentRootNode[\"children\"][number], { type: \"table\" }>,\n cursor: number,\n): number {\n let nextCursor = cursor;\n for (const row of table.rows) {\n for (const cell of row.cells) {\n nextCursor = measureBlockNodesForReviewBoundaries(cell.children, nextCursor, false);\n }\n }\n return nextCursor;\n}\n\nfunction measureBlockNodesForReviewBoundaries(\n blocks: readonly DocumentRootNode[\"children\"][number][],\n cursor: number,\n useSurfaceParagraphSeparators: boolean,\n): number {\n let nextCursor = cursor;\n for (const [index, block] of blocks.entries()) {\n if (block.type === \"paragraph\") {\n if (useSurfaceParagraphSeparators && index > 0) {\n nextCursor += 1;\n }\n nextCursor += block.children.reduce(\n (size, child) => size + measureInlineNodeForReviewBoundaries(child),\n 0,\n );\n continue;\n }\n\n if (block.type === \"table\") {\n nextCursor = advanceCursorThroughTable(block, nextCursor);\n continue;\n }\n\n if (block.type === \"sdt\") {\n nextCursor = measureBlockNodesForReviewBoundaries(\n block.children,\n nextCursor,\n false,\n );\n continue;\n }\n\n if (block.type === \"custom_xml\") {\n nextCursor += 1;\n continue;\n }\n\n nextCursor += 1;\n }\n\n return nextCursor;\n}\n\nfunction splitHyperlinkNode(\n node: HyperlinkNode,\n splitPositions: ReadonlySet<number>,\n cursor: number,\n): { children: HyperlinkNode[]; cursor: number } {\n let nextCursor = cursor;\n const groups: Array<HyperlinkNode[\"children\"]> = [[]];\n\n for (const child of node.children) {\n if (child.type === \"text\") {\n const split = splitTextNode(child, splitPositions, nextCursor);\n for (const piece of split.children) {\n groups[groups.length - 1]?.push(piece);\n nextCursor += Array.from(piece.text).length;\n if (splitPositions.has(nextCursor)) {\n groups.push([]);\n }\n }\n continue;\n }\n\n groups[groups.length - 1]?.push(child);\n nextCursor += measureInlineNodeForReviewBoundaries(child);\n if (splitPositions.has(nextCursor)) {\n groups.push([]);\n }\n }\n\n const hyperlinks = groups\n .filter((children) => children.length > 0)\n .map((children) => ({\n type: \"hyperlink\" as const,\n href: node.href,\n children,\n }));\n\n return {\n children: hyperlinks.length > 0 ? hyperlinks : [node],\n cursor: nextCursor,\n };\n}\n\nfunction splitTextNode(\n node: TextNode,\n splitPositions: ReadonlySet<number>,\n cursor: number,\n): { children: TextNode[]; cursor: number } {\n const codepoints = Array.from(node.text);\n if (codepoints.length === 0) {\n return { children: [], cursor };\n }\n\n const boundaries = new Set<number>([0, codepoints.length]);\n for (let index = 1; index < codepoints.length; index += 1) {\n if (splitPositions.has(cursor + index)) {\n boundaries.add(index);\n }\n }\n\n const ordered = [...boundaries].sort((left, right) => left - right);\n const children: TextNode[] = [];\n\n for (let index = 0; index < ordered.length - 1; index += 1) {\n const start = ordered[index] ?? 0;\n const end = ordered[index + 1] ?? codepoints.length;\n const text = codepoints.slice(start, end).join(\"\");\n if (text.length === 0) {\n continue;\n }\n\n children.push({\n type: \"text\",\n text,\n ...(node.marks && node.marks.length > 0 ? { marks: node.marks } : {}),\n });\n }\n\n return {\n children: children.length > 0 ? children : [node],\n cursor: cursor + codepoints.length,\n };\n}\n\nfunction measureInlineNodeForReviewBoundaries(node: InlineNode): number {\n switch (node.type) {\n case \"text\":\n return Array.from(node.text).length;\n case \"bookmark_start\":\n case \"bookmark_end\":\n return 0;\n case \"hyperlink\":\n return node.children.reduce(\n (size, child) => size + measureInlineNodeForReviewBoundaries(child),\n 0,\n );\n case \"field\": {\n const childWidth = node.children.reduce(\n (size, child) => size + measureInlineNodeForReviewBoundaries(child),\n 0,\n );\n return childWidth > 0 ? childWidth : 1;\n }\n case \"tab\":\n case \"hard_break\":\n case \"column_break\":\n case \"footnote_ref\":\n case \"image\":\n case \"opaque_inline\":\n case \"chart_preview\":\n case \"smartart_preview\":\n case \"shape\":\n case \"wordart\":\n case \"vml_shape\":\n case \"symbol\":\n return 1;\n default:\n return 1;\n }\n}\n","import type { CommentEntry, CommentThread } from \"../../review/store/comment-store.ts\";\nimport type { RevisionParagraphBoundary } from \"../ooxml/revision-boundaries.ts\";\nimport type { ImportedCommentDefinition } from \"../ooxml/parse-comments.ts\";\n\ninterface XmlElementNode {\n type: \"element\";\n name: string;\n attributes: Record<string, string>;\n children: XmlNode[];\n start: number;\n end: number;\n}\n\ninterface XmlTextNode {\n type: \"text\";\n text: string;\n start: number;\n end: number;\n}\n\ntype XmlNode = XmlElementNode | XmlTextNode;\n\ninterface ParagraphBoundaryMap {\n paragraphIndex: number;\n start: number;\n end: number;\n boundaries: Map<number, number>;\n}\n\ninterface SerializableCommentEntry {\n thread: CommentThread;\n entry: CommentEntry;\n exportCommentId: string;\n paraId: string;\n durableId?: string;\n isRoot: boolean;\n}\n\nexport interface SerializedCommentsResult {\n commentsXml: string;\n serializedCommentIds: string[];\n commentsExtendedXml?: string;\n commentsIdsXml?: string;\n peopleXml?: string;\n}\n\nexport interface SerializeMergedCommentsXmlOptions {\n preservedDefinitions?: readonly ImportedCommentDefinition[];\n sourceRootTag?: string;\n sourceExtendedRootTag?: string;\n sourceIdsRootTag?: string;\n sourcePeopleRootTag?: string;\n peopleAuthors?: readonly string[];\n exportCommentIds?: ReadonlyMap<string, string>;\n}\n\nexport interface SerializeCommentAnchorsOptions {\n exportCommentIds?: ReadonlyMap<string, string>;\n}\n\nexport interface SerializedCommentDocumentResult {\n documentXml: string;\n serializedCommentIds: string[];\n skippedCommentIds: string[];\n}\n\nconst DEFAULT_COMMENTS_ROOT_TAG =\n `<w:comments xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" xmlns:w14=\"http://schemas.microsoft.com/office/word/2010/wordml\" xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" mc:Ignorable=\"w14\">`;\nconst DEFAULT_COMMENTS_EXTENDED_ROOT_TAG =\n `<w15:commentsEx xmlns:w15=\"http://schemas.microsoft.com/office/word/2012/wordml\">`;\nconst DEFAULT_COMMENTS_IDS_ROOT_TAG =\n `<w16cid:commentsIds xmlns:w16cid=\"http://schemas.microsoft.com/office/word/2016/wordml/cid\">`;\nconst DEFAULT_PEOPLE_ROOT_TAG =\n `<w15:people xmlns:w15=\"http://schemas.microsoft.com/office/word/2012/wordml\">`;\n\nexport function serializeCommentsXml(\n threads: readonly CommentThread[],\n options: {\n exportCommentIds?: ReadonlyMap<string, string>;\n } = {},\n): SerializedCommentsResult {\n return serializeMergedCommentsXml(threads, {\n exportCommentIds: options.exportCommentIds,\n });\n}\n\nexport function serializeMergedCommentsXml(\n threads: readonly CommentThread[],\n options: SerializeMergedCommentsXmlOptions = {},\n): SerializedCommentsResult {\n const serializableThreads = threads.filter((thread) => thread.entries.length > 0);\n const preservedDefinitions = (options.preservedDefinitions ?? [])\n .slice()\n .sort((left, right) => left.order - right.order);\n const runtimeThreadById = new Map(\n serializableThreads.map((thread) => [thread.commentId, thread]),\n );\n const exportCommentIds =\n options.exportCommentIds ??\n createCommentExportIdMap(serializableThreads, preservedDefinitions);\n const serializableEntries = createSerializableEntries(\n serializableThreads,\n preservedDefinitions,\n exportCommentIds,\n );\n const serializedEntryByOoxmlId = new Map(\n serializableEntries.map((entry) => [entry.exportCommentId, entry]),\n );\n const emittedThreadIds = new Set<string>();\n const mergedComments: string[] = [];\n\n for (const definition of preservedDefinitions) {\n const ownedThread = runtimeThreadById.get(definition.commentId);\n if (ownedThread) {\n if (emittedThreadIds.has(ownedThread.commentId)) {\n continue;\n }\n mergedComments.push(\n ...serializeThreadEntries(\n serializableEntries.filter((entry) => entry.thread.commentId === ownedThread.commentId),\n ),\n );\n emittedThreadIds.add(ownedThread.commentId);\n continue;\n }\n\n if (serializedEntryByOoxmlId.has(definition.commentId)) {\n continue;\n }\n\n mergedComments.push(definition.rawXml);\n }\n\n for (const thread of serializableThreads) {\n if (emittedThreadIds.has(thread.commentId)) {\n continue;\n }\n\n mergedComments.push(\n ...serializeThreadEntries(\n serializableEntries.filter((entry) => entry.thread.commentId === thread.commentId),\n ),\n );\n emittedThreadIds.add(thread.commentId);\n }\n\n const mergedExtendedEntries = [\n ...serializePreservedCommentExtensions(\n preservedDefinitions.filter((definition) => !serializedEntryByOoxmlId.has(definition.commentId)),\n ),\n ...serializableEntries\n .map((entry) => serializeCommentExtension(entry))\n .filter((xml): xml is string => Boolean(xml)),\n ];\n const mergedDurableIds = [\n ...serializePreservedCommentIds(\n preservedDefinitions.filter((definition) => !serializedEntryByOoxmlId.has(definition.commentId)),\n ),\n ...serializableEntries\n .map((entry) => serializeCommentDurableId(entry))\n .filter((xml): xml is string => Boolean(xml)),\n ];\n const peopleAuthors = new Set([\n ...(options.peopleAuthors ?? []),\n ...preservedDefinitions\n .map((definition) => definition.authorId)\n .filter((authorId): authorId is string => typeof authorId === \"string\" && authorId.length > 0),\n ...serializableEntries\n .map((entry) => entry.entry.authorId)\n .filter((authorId): authorId is string => typeof authorId === \"string\" && authorId.length > 0),\n ]);\n\n return {\n commentsXml: [\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>`,\n normalizeCommentsRootTag(options.sourceRootTag ?? DEFAULT_COMMENTS_ROOT_TAG),\n ...mergedComments,\n `</w:comments>`,\n ].join(\"\\n\"),\n serializedCommentIds: serializableThreads.map((thread) => thread.commentId),\n commentsExtendedXml:\n mergedExtendedEntries.length > 0\n ? [\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>`,\n options.sourceExtendedRootTag ?? DEFAULT_COMMENTS_EXTENDED_ROOT_TAG,\n ...mergedExtendedEntries,\n `</w15:commentsEx>`,\n ].join(\"\\n\")\n : undefined,\n commentsIdsXml:\n mergedDurableIds.length > 0\n ? [\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>`,\n options.sourceIdsRootTag ?? DEFAULT_COMMENTS_IDS_ROOT_TAG,\n ...mergedDurableIds,\n `</w16cid:commentsIds>`,\n ].join(\"\\n\")\n : undefined,\n peopleXml:\n peopleAuthors.size > 0\n ? [\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>`,\n options.sourcePeopleRootTag ?? DEFAULT_PEOPLE_ROOT_TAG,\n ...[...peopleAuthors]\n .sort((left, right) => left.localeCompare(right))\n .map(\n (authorId) =>\n `<w15:person w15:author=\"${escapeAttribute(authorId)}\" />`,\n ),\n `</w15:people>`,\n ].join(\"\\n\")\n : undefined,\n };\n}\n\nfunction normalizeCommentsRootTag(rootTag: string): string {\n let normalized = rootTag;\n if (!/\\bxmlns:w14=/u.test(normalized)) {\n normalized = normalized.replace(\n />$/u,\n ` xmlns:w14=\"http://schemas.microsoft.com/office/word/2010/wordml\">`,\n );\n }\n if (!/\\bxmlns:mc=/u.test(normalized)) {\n normalized = normalized.replace(\n />$/u,\n ` xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\">`,\n );\n }\n if (!/\\bmc:Ignorable=/u.test(normalized)) {\n normalized = normalized.replace(/>$/u, ` mc:Ignorable=\"w14\">`);\n } else if (!/\\bmc:Ignorable=\"[^\"]*\\bw14\\b/u.test(normalized)) {\n normalized = normalized.replace(\n /\\bmc:Ignorable=\"([^\"]*)\"/u,\n (_match, value: string) =>\n `mc:Ignorable=\"${`${value} w14`.trim().replace(/\\s+/gu, \" \")}\"`,\n );\n }\n return normalized;\n}\n\nexport function serializeCommentAnchorsIntoDocumentXml(\n documentXml: string,\n threads: readonly CommentThread[],\n paragraphs: readonly Pick<\n RevisionParagraphBoundary,\n \"paragraphIndex\" | \"start\" | \"end\" | \"boundaries\"\n >[] = mapParagraphBoundaries(documentXml),\n options: SerializeCommentAnchorsOptions = {},\n): SerializedCommentDocumentResult {\n const insertions = new Map<number, string[]>();\n const serializedCommentIds: string[] = [];\n const skippedCommentIds: string[] = [];\n const exportCommentIds =\n options.exportCommentIds ?? createCommentExportIdMap(threads);\n\n for (const thread of threads) {\n const { anchor } = thread;\n if (anchor.kind !== \"range\") {\n skippedCommentIds.push(thread.commentId);\n continue;\n }\n\n const paragraph = paragraphs.find(\n (candidate) =>\n anchor.range.from >= candidate.start &&\n anchor.range.to <= candidate.end,\n );\n\n if (!paragraph) {\n skippedCommentIds.push(thread.commentId);\n continue;\n }\n\n const startIndex = paragraph.boundaries.get(anchor.range.from);\n const endIndex = paragraph.boundaries.get(anchor.range.to);\n\n if (startIndex === undefined || endIndex === undefined) {\n skippedCommentIds.push(thread.commentId);\n continue;\n }\n\n const exportCommentId = exportCommentIds.get(thread.commentId) ?? thread.commentId;\n pushInsertion(\n insertions,\n startIndex,\n `<w:commentRangeStart w:id=\"${escapeAttribute(exportCommentId)}\"/>`,\n );\n pushInsertion(\n insertions,\n endIndex,\n `<w:commentRangeEnd w:id=\"${escapeAttribute(exportCommentId)}\"/>`,\n );\n pushInsertion(\n insertions,\n endIndex,\n `<w:r><w:commentReference w:id=\"${escapeAttribute(exportCommentId)}\"/></w:r>`,\n );\n serializedCommentIds.push(thread.commentId);\n }\n\n const sortedInsertions = [...insertions.entries()].sort((left, right) => left[0] - right[0]);\n let cursor = 0;\n let output = \"\";\n\n for (const [index, snippets] of sortedInsertions) {\n output += documentXml.slice(cursor, index);\n output += snippets.join(\"\");\n cursor = index;\n }\n\n output += documentXml.slice(cursor);\n\n return {\n documentXml: output,\n serializedCommentIds,\n skippedCommentIds,\n };\n}\n\nexport function createCommentExportIdMap(\n threads: readonly CommentThread[],\n preservedDefinitions: readonly ImportedCommentDefinition[] = [],\n): ReadonlyMap<string, string> {\n const exportIds = new Map<string, string>();\n const reservedNumericIds = new Set<number>();\n\n for (const definition of preservedDefinitions) {\n const numericId = parseOoxmlNumericId(definition.commentId);\n if (numericId !== undefined) {\n reservedNumericIds.add(numericId);\n }\n }\n\n for (const thread of threads) {\n const rootEntry = getRootEntry(thread);\n const preferredValue =\n thread.metadata?.rootOoxmlCommentId ??\n rootEntry?.metadata?.ooxmlCommentId ??\n thread.commentId;\n const numericId = parseOoxmlNumericId(preferredValue);\n if (numericId !== undefined && !reservedNumericIds.has(numericId)) {\n exportIds.set(thread.commentId, String(numericId));\n reservedNumericIds.add(numericId);\n }\n }\n\n let nextGeneratedId =\n reservedNumericIds.size > 0 ? Math.max(...reservedNumericIds) + 1 : 1;\n\n for (const thread of threads) {\n if (exportIds.has(thread.commentId)) {\n continue;\n }\n\n while (reservedNumericIds.has(nextGeneratedId)) {\n nextGeneratedId += 1;\n }\n\n exportIds.set(thread.commentId, String(nextGeneratedId));\n reservedNumericIds.add(nextGeneratedId);\n nextGeneratedId += 1;\n }\n\n return exportIds;\n}\n\nfunction createSerializableEntries(\n threads: readonly CommentThread[],\n preservedDefinitions: readonly ImportedCommentDefinition[],\n exportCommentIds: ReadonlyMap<string, string>,\n): SerializableCommentEntry[] {\n const entries: SerializableCommentEntry[] = [];\n const reservedNumericIds = new Set<number>();\n\n for (const definition of preservedDefinitions) {\n const numericId = parseOoxmlNumericId(definition.commentId);\n if (numericId !== undefined) {\n reservedNumericIds.add(numericId);\n }\n }\n\n for (const thread of threads) {\n const rootEntry = getRootEntry(thread);\n if (!rootEntry) {\n continue;\n }\n\n const rootExportCommentId = exportCommentIds.get(thread.commentId) ?? thread.commentId;\n const rootNumericId = parseOoxmlNumericId(rootExportCommentId);\n if (rootNumericId !== undefined) {\n reservedNumericIds.add(rootNumericId);\n }\n\n const rootParaId =\n rootEntry.metadata?.paraId ??\n thread.metadata?.rootParaId ??\n generateParaId(thread.commentId, 0);\n const rootDurableId =\n rootEntry.metadata?.durableId ??\n createDurableId(rootEntry, rootExportCommentId, 0);\n\n entries.push({\n thread,\n entry: rootEntry,\n exportCommentId: rootExportCommentId,\n paraId: rootParaId,\n durableId: rootDurableId,\n isRoot: true,\n });\n\n for (let index = 1; index < thread.entries.length; index += 1) {\n const entry = thread.entries[index];\n if (!entry) {\n continue;\n }\n\n const preferredCommentId = entry.metadata?.ooxmlCommentId;\n let exportCommentId: string | undefined;\n const preferredNumericId = preferredCommentId\n ? parseOoxmlNumericId(preferredCommentId)\n : undefined;\n if (\n preferredNumericId !== undefined &&\n !reservedNumericIds.has(preferredNumericId)\n ) {\n exportCommentId = String(preferredNumericId);\n reservedNumericIds.add(preferredNumericId);\n } else {\n let nextGeneratedId =\n reservedNumericIds.size > 0 ? Math.max(...reservedNumericIds) + 1 : 1;\n while (reservedNumericIds.has(nextGeneratedId)) {\n nextGeneratedId += 1;\n }\n exportCommentId = String(nextGeneratedId);\n reservedNumericIds.add(nextGeneratedId);\n }\n\n entries.push({\n thread,\n entry,\n exportCommentId,\n paraId: entry.metadata?.paraId ?? generateParaId(thread.commentId, index),\n durableId:\n entry.metadata?.durableId ??\n createDurableId(entry, exportCommentId, index),\n isRoot: false,\n });\n }\n }\n\n return entries;\n}\n\nfunction serializeThreadEntries(entries: readonly SerializableCommentEntry[]): string[] {\n return entries.map((entry) => serializeCommentEntry(entry));\n}\n\nfunction serializeCommentEntry(entry: SerializableCommentEntry): string {\n const author = escapeAttribute(entry.entry.authorId);\n const createdAt = escapeAttribute(entry.entry.createdAt);\n const initials = entry.entry.metadata?.initials;\n const paragraphXml = serializeCommentParagraphs(entry.entry.body, entry.paraId);\n\n return `<w:comment w:id=\"${escapeAttribute(entry.exportCommentId)}\"${initials ? ` w:initials=\"${escapeAttribute(initials)}\"` : \"\"} w:author=\"${author}\" w:date=\"${createdAt}\">${paragraphXml}</w:comment>`;\n}\n\nfunction serializeCommentParagraphs(body: string, paraId: string): string {\n const paragraphs = body.length > 0 ? body.split(\"\\n\") : [\"\"];\n const textId = deriveTextIdFromParaId(paraId);\n return paragraphs\n .map((paragraph, index) => {\n const attributes =\n index === 0\n ? ` w14:paraId=\"${escapeAttribute(paraId)}\" w14:textId=\"${escapeAttribute(textId)}\"`\n : \"\";\n return `<w:p${attributes}><w:r>${serializeText(paragraph)}</w:r></w:p>`;\n })\n .join(\"\");\n}\n\nfunction serializePreservedCommentExtensions(\n definitions: readonly ImportedCommentDefinition[],\n): string[] {\n return definitions\n .map((definition) =>\n definition.paraId\n ? serializePreservedCommentExtension(definition)\n : undefined,\n )\n .filter((xml): xml is string => Boolean(xml));\n}\n\nfunction serializePreservedCommentExtension(\n definition: ImportedCommentDefinition,\n): string {\n const doneValue = definition.isDone ? \"true\" : \"false\";\n return `<w15:commentEx w15:paraId=\"${escapeAttribute(definition.paraId!)}\"${definition.parentParaId ? ` w15:paraIdParent=\"${escapeAttribute(definition.parentParaId)}\"` : \"\"} w15:done=\"${doneValue}\" />`;\n}\n\nfunction serializeCommentExtension(\n entry: SerializableCommentEntry,\n): string | undefined {\n return `<w15:commentEx w15:paraId=\"${escapeAttribute(entry.paraId)}\"${entry.isRoot ? \"\" : ` w15:paraIdParent=\"${escapeAttribute(findRootParaId(entry.thread, entry.paraId))}\"`} w15:done=\"${entry.isRoot && entry.thread.status === \"resolved\" ? \"true\" : \"false\"}\" />`;\n}\n\nfunction serializePreservedCommentIds(\n definitions: readonly ImportedCommentDefinition[],\n): string[] {\n return definitions\n .map((definition) =>\n definition.paraId && definition.durableId\n ? `<w16cid:commentId w16cid:paraId=\"${escapeAttribute(definition.paraId)}\" w16cid:durableId=\"${escapeAttribute(definition.durableId)}\" />`\n : undefined,\n )\n .filter((xml): xml is string => Boolean(xml));\n}\n\nfunction serializeCommentDurableId(\n entry: SerializableCommentEntry,\n): string | undefined {\n if (!entry.durableId) {\n return undefined;\n }\n\n return `<w16cid:commentId w16cid:paraId=\"${escapeAttribute(entry.paraId)}\" w16cid:durableId=\"${escapeAttribute(entry.durableId)}\" />`;\n}\n\nfunction getRootEntry(thread: CommentThread): CommentEntry | undefined {\n return thread.entries[0];\n}\n\nfunction findRootParaId(thread: CommentThread, fallback: string): string {\n return (\n thread.entries[0]?.metadata?.paraId ??\n thread.metadata?.rootParaId ??\n fallback\n );\n}\n\nfunction generateParaId(seed: string, index: number): string {\n const normalized = `${seed}:${index}`;\n let hash = 0;\n\n for (let cursor = 0; cursor < normalized.length; cursor += 1) {\n hash = (hash * 31 + normalized.charCodeAt(cursor)) >>> 0;\n }\n\n return hash.toString(16).toUpperCase().padStart(8, \"0\").slice(-8);\n}\n\nfunction createDurableId(\n entry: CommentEntry,\n exportCommentId: string,\n index: number,\n): string {\n const seed = `${entry.entryId}:${exportCommentId}:${index}`;\n let hash = 0n;\n\n for (let cursor = 0; cursor < seed.length; cursor += 1) {\n hash = (hash * 131n + BigInt(seed.charCodeAt(cursor))) & 0xffffffffffffffffn;\n }\n\n return hash.toString(16).toUpperCase().padStart(16, \"0\").slice(-16);\n}\n\nfunction deriveTextIdFromParaId(paraId: string): string {\n return paraId.slice(-8).padStart(8, \"0\");\n}\n\nfunction parseOoxmlNumericId(value: string): number | undefined {\n if (!/^-?\\d+$/u.test(value)) {\n return undefined;\n }\n\n const numericId = Number.parseInt(value, 10);\n return Number.isFinite(numericId) ? numericId : undefined;\n}\n\nexport function mapParagraphBoundaries(documentXml: string): ParagraphBoundaryMap[] {\n const root = parseXml(documentXml);\n const documentElement = findChildElement(root, \"document\");\n const bodyElement = findChildElement(documentElement, \"body\");\n const paragraphs: ParagraphBoundaryMap[] = [];\n walkBlockNodesForParagraphBoundaries(\n bodyElement.children,\n documentXml,\n paragraphs,\n 0,\n -1,\n true,\n );\n\n return paragraphs;\n}\n\nfunction walkBlockNodesForParagraphBoundaries(\n nodes: readonly XmlNode[],\n documentXml: string,\n paragraphs: ParagraphBoundaryMap[],\n globalCursor: number,\n paragraphIndex: number,\n useSurfaceParagraphSeparators: boolean,\n): {\n globalCursor: number;\n paragraphIndex: number;\n} {\n let nextCursor = globalCursor;\n let nextParagraphIndex = paragraphIndex;\n let elementIndex = -1;\n\n for (const node of nodes) {\n if (node.type !== \"element\") {\n continue;\n }\n elementIndex += 1;\n\n const name = localName(node.name);\n if (name === \"p\") {\n if (useSurfaceParagraphSeparators && elementIndex > 0) {\n nextCursor += 1;\n }\n nextParagraphIndex += 1;\n const boundaries = new Map<number, number>();\n boundaries.set(nextCursor, node.start + openingTagLength(documentXml, node.start));\n\n walkParagraphForBoundaries(\n node,\n documentXml,\n boundaries,\n () => nextCursor,\n (next) => {\n nextCursor = next;\n },\n );\n\n if (!boundaries.has(nextCursor)) {\n boundaries.set(nextCursor, node.end - 4);\n }\n paragraphs.push({\n paragraphIndex: nextParagraphIndex,\n start: Math.min(...boundaries.keys()),\n end: Math.max(...boundaries.keys()),\n boundaries,\n });\n continue;\n }\n\n if (name === \"tbl\") {\n for (const child of node.children) {\n if (child.type !== \"element\" || localName(child.name) !== \"tr\") {\n continue;\n }\n for (const rowChild of child.children) {\n if (rowChild.type !== \"element\" || localName(rowChild.name) !== \"tc\") {\n continue;\n }\n const result = walkBlockNodesForParagraphBoundaries(\n rowChild.children,\n documentXml,\n paragraphs,\n nextCursor,\n nextParagraphIndex,\n false,\n );\n nextCursor = result.globalCursor;\n nextParagraphIndex = result.paragraphIndex;\n }\n }\n continue;\n }\n\n if (name === \"sdt\") {\n const sdtContent = findChildElement(node, \"sdtContent\");\n const result = walkBlockNodesForParagraphBoundaries(\n sdtContent.children,\n documentXml,\n paragraphs,\n nextCursor,\n nextParagraphIndex,\n false,\n );\n nextCursor = result.globalCursor;\n nextParagraphIndex = result.paragraphIndex;\n continue;\n }\n\n if (name === \"customXml\") {\n nextCursor += 1;\n continue;\n }\n\n nextCursor += 0;\n }\n\n return {\n globalCursor: nextCursor,\n paragraphIndex: nextParagraphIndex,\n };\n}\n\nfunction walkParagraphForBoundaries(\n paragraph: XmlElementNode,\n sourceXml: string,\n boundaries: Map<number, number>,\n getCursor: () => number,\n setCursor: (next: number) => void,\n): void {\n for (const child of paragraph.children) {\n walkInlineNodeForBoundaries(child, sourceXml, boundaries, getCursor, setCursor);\n }\n}\n\nfunction walkInlineNodeForBoundaries(\n node: XmlNode,\n sourceXml: string,\n boundaries: Map<number, number>,\n getCursor: () => number,\n setCursor: (next: number) => void,\n): void {\n if (node.type !== \"element\") {\n return;\n }\n\n switch (localName(node.name)) {\n case \"r\": {\n if (!boundaries.has(getCursor())) {\n boundaries.set(getCursor(), node.start);\n }\n\n for (const child of node.children) {\n walkInlineNodeForBoundaries(child, sourceXml, boundaries, getCursor, setCursor);\n }\n\n boundaries.set(getCursor(), node.end);\n return;\n }\n case \"t\": {\n const text = node.children\n .filter((child): child is XmlTextNode => child.type === \"text\")\n .map((child) => child.text)\n .join(\"\");\n setCursor(getCursor() + Array.from(text).length);\n return;\n }\n case \"tab\":\n case \"br\": {\n const startCursor = getCursor();\n boundaries.set(startCursor, node.start);\n const nextCursor = startCursor + 1;\n boundaries.set(nextCursor, node.end);\n setCursor(nextCursor);\n return;\n }\n default:\n for (const child of node.children) {\n walkInlineNodeForBoundaries(child, sourceXml, boundaries, getCursor, setCursor);\n }\n }\n}\n\nfunction pushInsertion(\n insertions: Map<number, string[]>,\n index: number,\n xml: string,\n): void {\n const bucket = insertions.get(index);\n if (bucket) {\n bucket.push(xml);\n return;\n }\n\n insertions.set(index, [xml]);\n}\n\nfunction serializeText(text: string): string {\n const preserve = requiresPreservedSpace(text) ? ` xml:space=\"preserve\"` : \"\";\n return `<w:t${preserve}>${escapeXml(text)}</w:t>`;\n}\n\nfunction requiresPreservedSpace(text: string): boolean {\n return /^\\s/u.test(text) || /\\s$/u.test(text) || /\\s{2,}/u.test(text);\n}\n\nfunction escapeXml(value: string): string {\n return value\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\");\n}\n\nfunction escapeAttribute(value: string): string {\n return escapeXml(value).replace(/\"/g, \""\");\n}\n\nfunction openingTagLength(xml: string, start: number): number {\n const end = xml.indexOf(\">\", start);\n if (end < 0) {\n throw new Error(\"Malformed XML: missing tag close.\");\n }\n\n return end - start + 1;\n}\n\nfunction parseXml(xml: string): XmlElementNode {\n const root: XmlElementNode = {\n type: \"element\",\n name: \"#document\",\n attributes: {},\n children: [],\n start: 0,\n end: xml.length,\n };\n const stack: XmlElementNode[] = [root];\n const tokenPattern =\n /<!--[\\s\\S]*?-->|<\\?[\\s\\S]*?\\?>|<!DOCTYPE[\\s\\S]*?>|<!\\[CDATA\\[[\\s\\S]*?\\]\\]>|<[^>]+>|[^<]+/gu;\n\n for (const match of xml.matchAll(tokenPattern)) {\n const token = match[0] ?? \"\";\n const start = match.index ?? 0;\n const end = start + token.length;\n\n if (token.startsWith(\"<?\") || token.startsWith(\"<!DOCTYPE\") || token.startsWith(\"<!--\")) {\n continue;\n }\n\n if (token.startsWith(\"<![CDATA[\")) {\n const text = token.slice(9, -3);\n stack[stack.length - 1]?.children.push({\n type: \"text\",\n text,\n start,\n end,\n });\n continue;\n }\n\n if (token.startsWith(\"</\")) {\n const node = stack.pop();\n if (!node) {\n throw new Error(\"Malformed XML: unexpected closing tag.\");\n }\n node.end = end;\n continue;\n }\n\n if (token.startsWith(\"<\")) {\n const selfClosing = /\\/>$/.test(token);\n const tagBody = token.slice(1, token.length - (selfClosing ? 2 : 1)).trim();\n const { name, attributes } = parseTag(tagBody);\n const node: XmlElementNode = {\n type: \"element\",\n name,\n attributes,\n children: [],\n start,\n end,\n };\n stack[stack.length - 1]?.children.push(node);\n if (!selfClosing) {\n stack.push(node);\n }\n continue;\n }\n\n const text = decodeXmlText(token);\n if (text.length > 0) {\n stack[stack.length - 1]?.children.push({\n type: \"text\",\n text,\n start,\n end,\n });\n }\n }\n\n if (stack.length !== 1) {\n throw new Error(\"Malformed XML: unclosed tag.\");\n }\n\n return root;\n}\n\nfunction parseTag(tagBody: string): { name: string; attributes: Record<string, string> } {\n const whitespaceIndex = tagBody.search(/\\s/u);\n const name = whitespaceIndex === -1 ? tagBody : tagBody.slice(0, whitespaceIndex);\n const rawAttributes = whitespaceIndex === -1 ? \"\" : tagBody.slice(whitespaceIndex + 1);\n const attributes: Record<string, string> = {};\n const pattern = /([A-Za-z_][A-Za-z0-9:._-]*)\\s*=\\s*(\"([^\"]*)\"|'([^']*)')/gu;\n\n for (const match of rawAttributes.matchAll(pattern)) {\n const key = match[1];\n const value = match[3] ?? match[4] ?? \"\";\n if (key) {\n attributes[key] = decodeXmlText(value);\n }\n }\n\n return { name, attributes };\n}\n\nfunction findChildElement(node: XmlElementNode, name: string): XmlElementNode {\n const match = node.children.find(\n (child): child is XmlElementNode =>\n child.type === \"element\" && localName(child.name) === name,\n );\n\n if (!match) {\n throw new Error(`Expected XML element ${name}.`);\n }\n\n return match;\n}\n\nfunction localName(name: string): string {\n const index = name.indexOf(\":\");\n return index === -1 ? name : name.slice(index + 1);\n}\n\nfunction decodeXmlText(text: string): string {\n return text.replace(\n /&(?:#x([0-9A-Fa-f]+)|#([0-9]+)|([A-Za-z]+));/gu,\n (_, hex, dec, named) => {\n if (hex) {\n return String.fromCodePoint(Number.parseInt(hex, 16));\n }\n if (dec) {\n return String.fromCodePoint(Number.parseInt(dec, 10));\n }\n\n switch (named) {\n case \"amp\":\n return \"&\";\n case \"lt\":\n return \"<\";\n case \"gt\":\n return \">\";\n case \"quot\":\n return \"\\\"\";\n case \"apos\":\n return \"'\";\n default:\n return `&${named};`;\n }\n },\n );\n}\n","export const CONTENT_TYPES_PATH = \"/[Content_Types].xml\";\nexport const PACKAGE_RELATIONSHIPS_PATH = \"/_rels/.rels\";\n\nexport type OpcCompressionMethod = \"store\" | \"deflate\";\nexport type OpcSurfaceKind = \"content\" | \"relationships\" | \"content-types\";\nexport type OpcRelationshipTargetMode = \"internal\" | \"external\";\n\nexport interface OpcRelationship {\n id: string;\n type: string;\n target: string;\n targetMode: OpcRelationshipTargetMode;\n}\n\nexport interface OpcPartManifestEntry {\n path: string;\n surfaceKind: OpcSurfaceKind;\n contentType: string | null;\n relationshipsPartPath: string | null;\n relationships: OpcRelationship[];\n compression: OpcCompressionMethod;\n byteLength: number;\n}\n\nexport interface OpcContentTypesManifest {\n defaults: Record<string, string>;\n overrides: Record<string, string>;\n}\n\nexport interface OpcPackageManifest {\n contentTypes: OpcContentTypesManifest;\n packageRelationships: OpcRelationship[];\n parts: OpcPartManifestEntry[];\n}\n\nexport interface OpcPackagePart {\n path: string;\n surfaceKind: OpcSurfaceKind;\n contentType: string | null;\n relationshipsPartPath: string | null;\n relationships: OpcRelationship[];\n compression: OpcCompressionMethod;\n bytes: Uint8Array;\n crc32: number;\n}\n\nexport function normalizePartPath(path: string): string {\n const normalized = path.replace(/\\\\/g, \"/\").trim();\n if (normalized.length === 0) {\n throw new Error(\"OPC part path must not be empty.\");\n }\n\n const withLeadingSlash = normalized.startsWith(\"/\") ? normalized : `/${normalized}`;\n const segments = withLeadingSlash.split(\"/\");\n const resolved: string[] = [];\n\n for (const segment of segments) {\n if (segment === \"\" || segment === \".\") {\n continue;\n }\n\n if (segment === \"..\") {\n if (resolved.length === 0) {\n throw new Error(`OPC part path escapes package root: ${path}`);\n }\n\n resolved.pop();\n continue;\n }\n\n resolved.push(segment);\n }\n\n return `/${resolved.join(\"/\")}`;\n}\n\nexport function getExtension(partPath: string): string {\n const normalized = normalizePartPath(partPath);\n const lastSlash = normalized.lastIndexOf(\"/\");\n const lastDot = normalized.lastIndexOf(\".\");\n if (lastDot <= lastSlash) {\n return \"\";\n }\n\n return normalized.slice(lastDot + 1).toLowerCase();\n}\n\nexport function getRelationshipsPartPath(partPath?: string | null): string {\n if (!partPath) {\n return PACKAGE_RELATIONSHIPS_PATH;\n }\n\n const normalized = normalizePartPath(partPath);\n const lastSlash = normalized.lastIndexOf(\"/\");\n const directory = lastSlash <= 0 ? \"\" : normalized.slice(0, lastSlash);\n const filename = normalized.slice(lastSlash + 1);\n return `${directory}/_rels/${filename}.rels`;\n}\n\nexport function getSourcePartPathFromRelationshipsPart(path: string): string | null {\n const normalized = normalizePartPath(path);\n if (normalized === PACKAGE_RELATIONSHIPS_PATH) {\n return null;\n }\n\n const marker = \"/_rels/\";\n const markerIndex = normalized.lastIndexOf(marker);\n if (markerIndex === -1 || !normalized.endsWith(\".rels\")) {\n throw new Error(`Invalid OPC relationships part path: ${path}`);\n }\n\n return normalizePartPath(\n `${normalized.slice(0, markerIndex)}${normalized.slice(markerIndex + marker.length, -\".rels\".length)}`,\n );\n}\n\nexport function resolveRelationshipTarget(\n sourcePartPath: string | null,\n relationship: Pick<OpcRelationship, \"target\" | \"targetMode\">,\n): string {\n if (relationship.targetMode === \"external\") {\n return relationship.target;\n }\n\n if (relationship.target.startsWith(\"/\")) {\n return normalizePartPath(relationship.target);\n }\n\n const basePath = sourcePartPath ? normalizePartPath(sourcePartPath) : \"/\";\n const baseDir = basePath === \"/\" ? \"/\" : basePath.slice(0, basePath.lastIndexOf(\"/\") + 1);\n return normalizePartPath(`${baseDir}${relationship.target}`);\n}\n\nexport function comparePartPaths(a: string, b: string): number {\n return normalizePartPath(a).localeCompare(normalizePartPath(b));\n}\n","import {\n CONTENT_TYPES_PATH,\n OpcCompressionMethod,\n OpcPackageManifest,\n OpcPackagePart,\n OpcRelationship,\n PACKAGE_RELATIONSHIPS_PATH,\n comparePartPaths,\n getExtension,\n getRelationshipsPartPath,\n normalizePartPath,\n} from \"../ooxml/part-manifest.ts\";\nimport type { OpcPackage } from \"./package-reader.ts\";\n\ninterface ZipEntryPayload {\n path: string;\n compression: OpcCompressionMethod;\n uncompressedBytes: Uint8Array;\n compressedBytes: Uint8Array;\n crc32: number;\n}\n\nexport function writeOpcPackage(input: OpcPackage | { manifest: OpcPackageManifest; parts: Map<string, OpcPackagePart> }): Uint8Array {\n const entries = collectZipEntries(input.manifest, input.parts);\n return buildZipArchive(entries);\n}\n\nfunction collectZipEntries(\n manifest: OpcPackageManifest,\n parts: Map<string, OpcPackagePart>,\n): ZipEntryPayload[] {\n const entries: ZipEntryPayload[] = [];\n const contentParts = [...parts.values()]\n .filter((part) => part.surfaceKind === \"content\")\n .sort((left, right) => comparePartPaths(left.path, right.path));\n\n entries.push(createZipPayload(CONTENT_TYPES_PATH, \"deflate\", encodeXml(buildContentTypesXml(manifest, contentParts))));\n entries.push(\n createZipPayload(\n PACKAGE_RELATIONSHIPS_PATH,\n \"deflate\",\n encodeXml(buildRelationshipsXml(manifest.packageRelationships)),\n ),\n );\n\n for (const part of contentParts) {\n entries.push(createZipPayload(part.path, part.compression, part.bytes));\n\n if (part.relationships.length > 0) {\n entries.push(\n createZipPayload(\n getRelationshipsPartPath(part.path),\n \"deflate\",\n encodeXml(buildRelationshipsXml(part.relationships)),\n ),\n );\n }\n }\n\n return entries.sort((left, right) => comparePartPaths(left.path, right.path));\n}\n\nfunction buildContentTypesXml(\n manifest: OpcPackageManifest,\n parts: OpcPackagePart[],\n): string {\n const defaults: Record<string, string> = {\n ...manifest.contentTypes.defaults,\n rels: manifest.contentTypes.defaults.rels ?? \"application/vnd.openxmlformats-package.relationships+xml\",\n xml: manifest.contentTypes.defaults.xml ?? \"application/xml\",\n };\n\n const overrides = { ...manifest.contentTypes.overrides };\n\n for (const part of parts) {\n if (!part.contentType) {\n throw new Error(`Cannot write OPC package: missing content type for ${part.path}.`);\n }\n\n const extension = getExtension(part.path);\n if (!extension) {\n overrides[part.path] = part.contentType;\n continue;\n }\n\n const defaultContentType = defaults[extension];\n if (!defaultContentType) {\n defaults[extension] = part.contentType;\n delete overrides[part.path];\n continue;\n }\n\n if (defaultContentType === part.contentType) {\n delete overrides[part.path];\n continue;\n }\n\n overrides[part.path] = part.contentType;\n }\n\n const defaultEntries = Object.entries(defaults).sort(([left], [right]) => left.localeCompare(right));\n const overrideEntries = Object.entries(overrides).sort(([left], [right]) => comparePartPaths(left, right));\n\n const defaultXml = defaultEntries\n .map(([extension, contentType]) => ` <Default Extension=\"${escapeXml(extension)}\" ContentType=\"${escapeXml(contentType)}\"/>`)\n .join(\"\\n\");\n const overrideXml = overrideEntries\n .map(([partName, contentType]) => ` <Override PartName=\"${escapeXml(partName)}\" ContentType=\"${escapeXml(contentType)}\"/>`)\n .join(\"\\n\");\n const body = [defaultXml, overrideXml].filter((value) => value.length > 0).join(\"\\n\");\n\n return [\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>`,\n `<Types xmlns=\"http://schemas.openxmlformats.org/package/2006/content-types\">`,\n body,\n `</Types>`,\n ].join(\"\\n\");\n}\n\nfunction buildRelationshipsXml(relationships: OpcRelationship[]): string {\n const relationshipXml = [...relationships]\n .sort((left, right) => left.id.localeCompare(right.id))\n .map((relationship) => {\n const targetMode =\n relationship.targetMode === \"external\"\n ? ` TargetMode=\"External\"`\n : \"\";\n return ` <Relationship Id=\"${escapeXml(relationship.id)}\" Type=\"${escapeXml(relationship.type)}\" Target=\"${escapeXml(relationship.target)}\"${targetMode}/>`;\n })\n .join(\"\\n\");\n\n return [\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>`,\n `<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">`,\n relationshipXml,\n `</Relationships>`,\n ].join(\"\\n\");\n}\n\nfunction createZipPayload(\n path: string,\n compression: OpcCompressionMethod,\n bytes: Uint8Array,\n): ZipEntryPayload {\n const normalizedPath = normalizePartPath(path).slice(1);\n const uncompressedBytes = new Uint8Array(bytes);\n // Keep export browser-safe by storing entries without Node-only compression primitives.\n const compressedBytes = uncompressedBytes;\n const effectiveCompression: OpcCompressionMethod = \"store\";\n\n return {\n path: normalizedPath,\n compression: effectiveCompression,\n uncompressedBytes,\n compressedBytes,\n crc32: calculateCrc32(uncompressedBytes),\n };\n}\n\nfunction buildZipArchive(entries: ZipEntryPayload[]): Uint8Array {\n const localChunks: Uint8Array[] = [];\n const centralChunks: Uint8Array[] = [];\n let localOffset = 0;\n\n for (const entry of entries) {\n const fileName = encodeUtf8(entry.path);\n const localHeader = createByteBuffer(30 + fileName.length);\n const localHeaderView = new DataView(localHeader.buffer);\n localHeaderView.setUint32(0, 0x04034b50, true);\n localHeaderView.setUint16(4, 20, true);\n localHeaderView.setUint16(6, 0, true);\n localHeaderView.setUint16(8, entry.compression === \"store\" ? 0 : 8, true);\n localHeaderView.setUint16(10, 0, true);\n localHeaderView.setUint16(12, 0, true);\n localHeaderView.setUint32(14, entry.crc32 >>> 0, true);\n localHeaderView.setUint32(18, entry.compressedBytes.byteLength, true);\n localHeaderView.setUint32(22, entry.uncompressedBytes.byteLength, true);\n localHeaderView.setUint16(26, fileName.length, true);\n localHeaderView.setUint16(28, 0, true);\n localHeader.set(fileName, 30);\n\n localChunks.push(localHeader, entry.compressedBytes);\n\n const centralHeader = createByteBuffer(46 + fileName.length);\n const centralHeaderView = new DataView(centralHeader.buffer);\n centralHeaderView.setUint32(0, 0x02014b50, true);\n centralHeaderView.setUint16(4, 20, true);\n centralHeaderView.setUint16(6, 20, true);\n centralHeaderView.setUint16(8, 0, true);\n centralHeaderView.setUint16(10, entry.compression === \"store\" ? 0 : 8, true);\n centralHeaderView.setUint16(12, 0, true);\n centralHeaderView.setUint16(14, 0, true);\n centralHeaderView.setUint32(16, entry.crc32 >>> 0, true);\n centralHeaderView.setUint32(20, entry.compressedBytes.byteLength, true);\n centralHeaderView.setUint32(24, entry.uncompressedBytes.byteLength, true);\n centralHeaderView.setUint16(28, fileName.length, true);\n centralHeaderView.setUint16(30, 0, true);\n centralHeaderView.setUint16(32, 0, true);\n centralHeaderView.setUint16(34, 0, true);\n centralHeaderView.setUint16(36, 0, true);\n centralHeaderView.setUint32(38, 0, true);\n centralHeaderView.setUint32(42, localOffset, true);\n centralHeader.set(fileName, 46);\n centralChunks.push(centralHeader);\n\n localOffset += localHeader.byteLength + entry.compressedBytes.byteLength;\n }\n\n const centralDirectoryOffset = localOffset;\n const centralDirectory = concatByteArrays(centralChunks);\n const endOfCentralDirectory = createByteBuffer(22);\n const endOfCentralDirectoryView = new DataView(endOfCentralDirectory.buffer);\n endOfCentralDirectoryView.setUint32(0, 0x06054b50, true);\n endOfCentralDirectoryView.setUint16(4, 0, true);\n endOfCentralDirectoryView.setUint16(6, 0, true);\n endOfCentralDirectoryView.setUint16(8, entries.length, true);\n endOfCentralDirectoryView.setUint16(10, entries.length, true);\n endOfCentralDirectoryView.setUint32(12, centralDirectory.byteLength, true);\n endOfCentralDirectoryView.setUint32(16, centralDirectoryOffset, true);\n endOfCentralDirectoryView.setUint16(20, 0, true);\n\n return concatByteArrays([...localChunks, centralDirectory, endOfCentralDirectory]);\n}\n\nfunction encodeXml(xml: string): Uint8Array {\n return encodeUtf8(xml);\n}\n\nfunction escapeXml(value: string): string {\n return value\n .replace(/&/g, \"&\")\n .replace(/\"/g, \""\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/'/g, \"'\");\n}\n\nfunction calculateCrc32(bytes: Uint8Array): number {\n let crc = 0xffffffff;\n\n for (const byte of bytes) {\n crc ^= byte;\n for (let bit = 0; bit < 8; bit += 1) {\n const mask = -(crc & 1);\n crc = (crc >>> 1) ^ (0xedb88320 & mask);\n }\n }\n\n return (crc ^ 0xffffffff) >>> 0;\n}\n\nfunction createByteBuffer(size: number): Uint8Array {\n return new Uint8Array(size);\n}\n\nfunction concatByteArrays(chunks: readonly Uint8Array[]): Uint8Array {\n const totalLength = chunks.reduce((sum, chunk) => sum + chunk.byteLength, 0);\n const combined = new Uint8Array(totalLength);\n let offset = 0;\n\n for (const chunk of chunks) {\n combined.set(chunk, offset);\n offset += chunk.byteLength;\n }\n\n return combined;\n}\n\nfunction encodeUtf8(value: string): Uint8Array {\n return new TextEncoder().encode(value);\n}\n\nexport { buildContentTypesXml, buildRelationshipsXml, calculateCrc32 };\n","import type { OpcPackage } from \"../opc/package-reader.ts\";\nimport type { OpcPackagePart, OpcRelationship } from \"../ooxml/part-manifest.ts\";\n\nexport function reattachPreservedParts(\n sourcePackage: OpcPackage,\n workingParts: Map<string, OpcPackagePart>,\n packageRelationships: OpcRelationship[],\n ownedPaths: ReadonlySet<string>,\n): void {\n for (const [path, sourcePart] of sourcePackage.parts.entries()) {\n if (ownedPaths.has(path) || sourcePart.surfaceKind !== \"content\") {\n continue;\n }\n\n if (!workingParts.has(path)) {\n workingParts.set(path, clonePart(sourcePart));\n continue;\n }\n\n const currentPart = workingParts.get(path);\n if (!currentPart) {\n continue;\n }\n\n currentPart.contentType = sourcePart.contentType;\n currentPart.relationships = sourcePart.relationships.map(cloneRelationship);\n currentPart.relationshipsPartPath = sourcePart.relationshipsPartPath;\n currentPart.compression = sourcePart.compression;\n currentPart.bytes = new Uint8Array(sourcePart.bytes);\n currentPart.crc32 = sourcePart.crc32;\n }\n\n const knownPackageRelationshipIds = new Set(packageRelationships.map((relationship) => relationship.id));\n for (const relationship of sourcePackage.manifest.packageRelationships) {\n if (knownPackageRelationshipIds.has(relationship.id)) {\n continue;\n }\n\n packageRelationships.push(cloneRelationship(relationship));\n knownPackageRelationshipIds.add(relationship.id);\n }\n}\n\nfunction clonePart(part: OpcPackagePart): OpcPackagePart {\n return {\n ...part,\n relationships: part.relationships.map(cloneRelationship),\n bytes: new Uint8Array(part.bytes),\n };\n}\n\nfunction cloneRelationship(relationship: OpcRelationship): OpcRelationship {\n return { ...relationship };\n}\n","import {\n CONTENT_TYPES_PATH,\n PACKAGE_RELATIONSHIPS_PATH,\n OpcCompressionMethod,\n OpcPackagePart,\n OpcRelationship,\n comparePartPaths,\n getRelationshipsPartPath,\n normalizePartPath,\n resolveRelationshipTarget,\n} from \"../ooxml/part-manifest.ts\";\nimport type { OpcPackage } from \"../opc/package-reader.ts\";\nimport { writeOpcPackage } from \"../opc/package-writer.ts\";\nimport { reattachPreservedParts } from \"./reattach-preserved-parts.ts\";\n\nexport interface ExportPartReplacement {\n path: string;\n bytes: Uint8Array;\n contentType: string;\n relationships?: OpcRelationship[];\n compression?: OpcCompressionMethod;\n}\n\nexport interface ExportSessionSnapshot {\n manifest: OpcPackage[\"manifest\"];\n parts: Map<string, OpcPackagePart>;\n}\n\nexport class ExportSession {\n private readonly ownedPaths: Set<string>;\n private readonly workingParts: Map<string, OpcPackagePart>;\n private readonly packageRelationships: OpcRelationship[];\n\n public constructor(private readonly sourcePackage: OpcPackage, ownedOutputPaths: Iterable<string>) {\n this.ownedPaths = new Set(\n [...ownedOutputPaths].map((path) => {\n const normalized = normalizePartPath(path);\n if (normalized === CONTENT_TYPES_PATH || normalized.endsWith(\".rels\") || normalized === PACKAGE_RELATIONSHIPS_PATH) {\n throw new Error(`ExportSession cannot directly own reserved OPC manifest path ${normalized}.`);\n }\n\n return normalized;\n }),\n );\n this.workingParts = cloneParts(sourcePackage.parts);\n this.packageRelationships = sourcePackage.manifest.packageRelationships.map(cloneRelationship);\n }\n\n public replaceOwnedPart(replacement: ExportPartReplacement): void {\n const normalizedPath = normalizePartPath(replacement.path);\n if (!this.ownedPaths.has(normalizedPath)) {\n throw new Error(`Attempted to rewrite non-owned OPC path ${normalizedPath}.`);\n }\n\n const existing = this.workingParts.get(normalizedPath);\n const nextPart: OpcPackagePart = {\n path: normalizedPath,\n surfaceKind: \"content\",\n contentType: replacement.contentType,\n relationshipsPartPath: getRelationshipsPartPath(normalizedPath),\n relationships: (replacement.relationships ?? existing?.relationships ?? []).map(cloneRelationship),\n compression: replacement.compression ?? existing?.compression ?? \"deflate\",\n bytes: new Uint8Array(replacement.bytes),\n crc32: 0,\n };\n\n this.workingParts.set(normalizedPath, nextPart);\n }\n\n public withOwnedPart(replacement: ExportPartReplacement): ExportSession {\n this.replaceOwnedPart(replacement);\n return this;\n }\n\n public ensurePackageRelationship(input: {\n type: string;\n target: string;\n targetMode?: OpcRelationship[\"targetMode\"];\n preferredId?: string;\n }): void {\n const targetMode = input.targetMode ?? \"internal\";\n const normalizedTarget =\n targetMode === \"internal\" ? normalizePartPath(input.target) : input.target;\n const existing = this.packageRelationships.find((relationship) => {\n if (relationship.type !== input.type || relationship.targetMode !== targetMode) {\n return false;\n }\n\n return targetMode === \"internal\"\n ? resolveRelationshipTarget(null, relationship) === normalizedTarget\n : relationship.target === normalizedTarget;\n });\n if (existing) {\n return;\n }\n\n const relationshipId = createUniqueRelationshipId(\n new Set(this.packageRelationships.map((relationship) => relationship.id)),\n input.preferredId ?? \"rIdPackage1\",\n );\n this.packageRelationships.push({\n id: relationshipId,\n type: input.type,\n target:\n targetMode === \"internal\"\n ? toPackageRelationshipTarget(normalizedTarget)\n : normalizedTarget,\n targetMode,\n });\n }\n\n public toPackage(): OpcPackage {\n reattachPreservedParts(\n this.sourcePackage,\n this.workingParts,\n this.packageRelationships,\n this.ownedPaths,\n );\n const parts = pruneReservedManifestParts(this.workingParts);\n const manifest = buildManifest(parts, this.packageRelationships, this.sourcePackage.manifest.contentTypes);\n return {\n manifest,\n parts,\n sourceByteLength: this.sourcePackage.sourceByteLength,\n };\n }\n\n public serialize(): Uint8Array {\n return writeOpcPackage(this.toPackage());\n }\n}\n\nexport function createExportSession(\n sourcePackage: OpcPackage,\n ownedOutputPaths: Iterable<string>,\n): ExportSession {\n return new ExportSession(sourcePackage, ownedOutputPaths);\n}\n\nfunction cloneParts(parts: Map<string, OpcPackagePart>): Map<string, OpcPackagePart> {\n return new Map(\n [...parts.entries()].map(([path, part]) => [\n path,\n {\n ...part,\n relationships: part.relationships.map(cloneRelationship),\n bytes: new Uint8Array(part.bytes),\n },\n ]),\n );\n}\n\nfunction pruneReservedManifestParts(parts: Map<string, OpcPackagePart>): Map<string, OpcPackagePart> {\n return new Map(\n [...parts.entries()].filter(([path]) => path !== CONTENT_TYPES_PATH && path !== PACKAGE_RELATIONSHIPS_PATH && !path.includes(\"/_rels/\")),\n );\n}\n\nfunction buildManifest(\n parts: Map<string, OpcPackagePart>,\n packageRelationships: OpcRelationship[],\n contentTypesSeed: OpcPackage[\"manifest\"][\"contentTypes\"],\n): OpcPackage[\"manifest\"] {\n const partsList = [...parts.values()].sort((left, right) => comparePartPaths(left.path, right.path));\n\n const overrides = { ...contentTypesSeed.overrides };\n for (const key of Object.keys(overrides)) {\n if (!parts.has(normalizePartPath(key))) {\n delete overrides[key];\n }\n }\n\n for (const part of partsList) {\n if (!part.contentType) {\n throw new Error(`Cannot export part without content type: ${part.path}`);\n }\n\n overrides[part.path] = part.contentType;\n }\n\n return {\n contentTypes: {\n defaults: { ...contentTypesSeed.defaults },\n overrides,\n },\n packageRelationships: packageRelationships.map(cloneRelationship),\n parts: partsList.map((part) => ({\n path: part.path,\n surfaceKind: part.surfaceKind,\n contentType: part.contentType,\n relationshipsPartPath: part.relationshipsPartPath,\n relationships: part.relationships.map(cloneRelationship),\n compression: part.compression,\n byteLength: part.bytes.byteLength,\n })),\n };\n}\n\nfunction cloneRelationship(relationship: OpcRelationship): OpcRelationship {\n return { ...relationship };\n}\n\nfunction createUniqueRelationshipId(existingIds: ReadonlySet<string>, preferredId: string): string {\n if (!existingIds.has(preferredId)) {\n return preferredId;\n }\n\n let nextIndex = 2;\n while (existingIds.has(`${preferredId}-${nextIndex}`)) {\n nextIndex += 1;\n }\n\n return `${preferredId}-${nextIndex}`;\n}\n\nfunction toPackageRelationshipTarget(partPath: string): string {\n return normalizePartPath(partPath).slice(1);\n}\n\nexport { buildManifest };\n","import {\n getRelationshipsPartPath,\n type OpcPackageManifest,\n type OpcPackagePart,\n} from \"../ooxml/part-manifest.ts\";\nimport { writeOpcPackage } from \"./package-writer.ts\";\n\nexport const DOCX_MIME_TYPE =\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\";\nexport const DOCX_DOCUMENT_CONTENT_TYPE =\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml\";\nexport const DOCX_DOCUMENT_RELATIONSHIP_TYPE =\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument\";\n\ninterface WriteDocxPackageInput {\n documentXml: string;\n documentContentType?: string;\n packageRelationshipType?: string;\n}\n\nexport function writeDocxPackage(input: WriteDocxPackageInput): Uint8Array {\n const documentPath = \"/word/document.xml\";\n const contentType = input.documentContentType ?? DOCX_DOCUMENT_CONTENT_TYPE;\n const relationshipType =\n input.packageRelationshipType ?? DOCX_DOCUMENT_RELATIONSHIP_TYPE;\n const documentBytes = new TextEncoder().encode(input.documentXml);\n\n const documentPart: OpcPackagePart = {\n path: documentPath,\n surfaceKind: \"content\",\n contentType,\n relationshipsPartPath: getRelationshipsPartPath(documentPath),\n relationships: [],\n compression: \"deflate\",\n bytes: documentBytes,\n crc32: 0,\n };\n\n const manifest: OpcPackageManifest = {\n contentTypes: {\n defaults: {\n rels: \"application/vnd.openxmlformats-package.relationships+xml\",\n xml: \"application/xml\",\n },\n overrides: {\n [documentPath]: contentType,\n },\n },\n packageRelationships: [\n {\n id: \"rId1\",\n type: relationshipType,\n target: \"word/document.xml\",\n targetMode: \"internal\",\n },\n ],\n parts: [\n {\n path: documentPart.path,\n surfaceKind: documentPart.surfaceKind,\n contentType: documentPart.contentType,\n relationshipsPartPath: documentPart.relationshipsPartPath,\n relationships: documentPart.relationships,\n compression: documentPart.compression,\n byteLength: documentPart.bytes.byteLength,\n },\n ],\n };\n\n return writeOpcPackage({\n manifest,\n parts: new Map([[documentPart.path, documentPart]]),\n });\n}\n","import { inflateSync } from \"fflate\";\n\nimport {\n CONTENT_TYPES_PATH,\n OpcCompressionMethod,\n OpcPackageManifest,\n OpcPackagePart,\n OpcPartManifestEntry,\n OpcRelationship,\n PACKAGE_RELATIONSHIPS_PATH,\n getRelationshipsPartPath,\n getSourcePartPathFromRelationshipsPart,\n normalizePartPath,\n} from \"../ooxml/part-manifest.ts\";\n\ninterface ZipCentralDirectoryEntry {\n path: string;\n compression: OpcCompressionMethod;\n crc32: number;\n compressedSize: number;\n uncompressedSize: number;\n localHeaderOffset: number;\n generalPurposeBitFlag: number;\n}\n\nexport interface OpcPackage {\n manifest: OpcPackageManifest;\n parts: Map<string, OpcPackagePart>;\n sourceByteLength: number;\n}\n\nconst EOCD_SIGNATURE = 0x06054b50;\nconst CENTRAL_DIRECTORY_SIGNATURE = 0x02014b50;\nconst LOCAL_FILE_HEADER_SIGNATURE = 0x04034b50;\n\nexport function readOpcPackage(source: Uint8Array | ArrayBuffer): OpcPackage {\n const bytes = source instanceof Uint8Array ? source : new Uint8Array(source);\n const centralDirectory = readCentralDirectory(bytes);\n const parts = new Map<string, OpcPackagePart>();\n\n for (const entry of centralDirectory) {\n if (entry.path.endsWith(\"/\")) {\n continue;\n }\n\n const storedBytes = readZipEntry(bytes, entry);\n const normalizedPath = normalizePartPath(entry.path);\n const surfaceKind = getSurfaceKind(normalizedPath);\n\n parts.set(normalizedPath, {\n path: normalizedPath,\n surfaceKind,\n contentType: null,\n relationshipsPartPath:\n surfaceKind === \"content\" ? getRelationshipsPartPath(normalizedPath) : null,\n relationships: [],\n compression: entry.compression,\n bytes: storedBytes,\n crc32: entry.crc32 >>> 0,\n });\n }\n\n const contentTypesPart = parts.get(CONTENT_TYPES_PATH);\n if (!contentTypesPart) {\n throw new Error(\"Invalid OPC package: missing /[Content_Types].xml.\");\n }\n\n const contentTypes = parseContentTypesXml(decodeXml(contentTypesPart.bytes));\n const packageRelationshipsPart = parts.get(PACKAGE_RELATIONSHIPS_PATH);\n const packageRelationships = packageRelationshipsPart\n ? parseRelationshipsXml(decodeXml(packageRelationshipsPart.bytes))\n : [];\n\n const manifestParts: OpcPartManifestEntry[] = [];\n\n for (const [path, part] of [...parts.entries()].sort(([left], [right]) => left.localeCompare(right))) {\n const contentType = resolveContentType(path, contentTypes);\n const relationshipsPartPath = part.surfaceKind === \"content\" ? getRelationshipsPartPath(path) : null;\n const relationshipsPart = relationshipsPartPath ? parts.get(relationshipsPartPath) : undefined;\n const relationships = relationshipsPart\n ? parseRelationshipsXml(decodeXml(relationshipsPart.bytes))\n : [];\n\n const nextPart: OpcPackagePart = {\n ...part,\n contentType,\n relationshipsPartPath,\n relationships,\n };\n\n parts.set(path, nextPart);\n manifestParts.push({\n path,\n surfaceKind: nextPart.surfaceKind,\n contentType,\n relationshipsPartPath,\n relationships,\n compression: nextPart.compression,\n byteLength: nextPart.bytes.byteLength,\n });\n }\n\n return {\n manifest: {\n contentTypes,\n packageRelationships,\n parts: manifestParts,\n },\n parts,\n sourceByteLength: bytes.byteLength,\n };\n}\n\nfunction readCentralDirectory(archive: Uint8Array): ZipCentralDirectoryEntry[] {\n const view = new DataView(archive.buffer, archive.byteOffset, archive.byteLength);\n const eocdOffset = findEndOfCentralDirectory(archive, view);\n const entryCount = view.getUint16(eocdOffset + 10, true);\n const centralDirectoryOffset = view.getUint32(eocdOffset + 16, true);\n const entries: ZipCentralDirectoryEntry[] = [];\n let offset = centralDirectoryOffset;\n\n for (let index = 0; index < entryCount; index += 1) {\n const signature = view.getUint32(offset, true);\n if (signature !== CENTRAL_DIRECTORY_SIGNATURE) {\n throw new Error(`Invalid ZIP central directory signature at offset ${offset}.`);\n }\n\n const generalPurposeBitFlag = view.getUint16(offset + 8, true);\n const compressionMethod = view.getUint16(offset + 10, true);\n const crc32 = view.getUint32(offset + 16, true);\n const compressedSize = view.getUint32(offset + 20, true);\n const uncompressedSize = view.getUint32(offset + 24, true);\n const fileNameLength = view.getUint16(offset + 28, true);\n const extraFieldLength = view.getUint16(offset + 30, true);\n const fileCommentLength = view.getUint16(offset + 32, true);\n const localHeaderOffset = view.getUint32(offset + 42, true);\n const fileNameOffset = offset + 46;\n const fileName = decodeUtf8(archive.subarray(fileNameOffset, fileNameOffset + fileNameLength));\n\n entries.push({\n path: fileName,\n compression: mapCompressionMethod(compressionMethod),\n crc32,\n compressedSize,\n uncompressedSize,\n localHeaderOffset,\n generalPurposeBitFlag,\n });\n\n offset += 46 + fileNameLength + extraFieldLength + fileCommentLength;\n }\n\n return entries;\n}\n\nfunction findEndOfCentralDirectory(archive: Uint8Array, view: DataView): number {\n const minimumEocdSize = 22;\n const maximumCommentSize = 0xffff;\n const searchStart = Math.max(0, archive.length - minimumEocdSize - maximumCommentSize);\n\n for (let offset = archive.length - minimumEocdSize; offset >= searchStart; offset -= 1) {\n if (view.getUint32(offset, true) === EOCD_SIGNATURE) {\n return offset;\n }\n }\n\n throw new Error(\"Invalid ZIP archive: end of central directory not found.\");\n}\n\nfunction readZipEntry(archive: Uint8Array, entry: ZipCentralDirectoryEntry): Uint8Array {\n const view = new DataView(archive.buffer, archive.byteOffset, archive.byteLength);\n const headerOffset = entry.localHeaderOffset;\n const signature = view.getUint32(headerOffset, true);\n if (signature !== LOCAL_FILE_HEADER_SIGNATURE) {\n throw new Error(`Invalid ZIP local file header signature at offset ${headerOffset}.`);\n }\n\n const fileNameLength = view.getUint16(headerOffset + 26, true);\n const extraFieldLength = view.getUint16(headerOffset + 28, true);\n const dataOffset = headerOffset + 30 + fileNameLength + extraFieldLength;\n const compressed = archive.subarray(dataOffset, dataOffset + entry.compressedSize);\n\n switch (entry.compression) {\n case \"store\":\n return new Uint8Array(compressed);\n case \"deflate\":\n return inflateSync(compressed);\n default:\n throw new Error(`Unsupported ZIP compression for ${entry.path}.`);\n }\n}\n\nfunction mapCompressionMethod(method: number): OpcCompressionMethod {\n switch (method) {\n case 0:\n return \"store\";\n case 8:\n return \"deflate\";\n default:\n throw new Error(`Unsupported ZIP compression method ${method}.`);\n }\n}\n\nfunction getSurfaceKind(path: string): OpcPartManifestEntry[\"surfaceKind\"] {\n if (path === CONTENT_TYPES_PATH) {\n return \"content-types\";\n }\n\n if (path === PACKAGE_RELATIONSHIPS_PATH || path.includes(\"/_rels/\")) {\n return \"relationships\";\n }\n\n return \"content\";\n}\n\nfunction decodeXml(bytes: Uint8Array): string {\n return new TextDecoder(\"utf-8\").decode(bytes);\n}\n\nfunction decodeUtf8(bytes: Uint8Array): string {\n return new TextDecoder(\"utf-8\").decode(bytes);\n}\n\nfunction parseContentTypesXml(xml: string): OpcPackageManifest[\"contentTypes\"] {\n const defaults: Record<string, string> = {};\n const overrides: Record<string, string> = {};\n\n for (const attributes of findTagAttributes(xml, \"Default\")) {\n const extension = attributes.Extension?.toLowerCase();\n const contentType = attributes.ContentType;\n if (!extension || !contentType) {\n continue;\n }\n\n defaults[extension] = contentType;\n }\n\n for (const attributes of findTagAttributes(xml, \"Override\")) {\n const partName = attributes.PartName;\n const contentType = attributes.ContentType;\n if (!partName || !contentType) {\n continue;\n }\n\n overrides[normalizePartPath(partName)] = contentType;\n }\n\n return { defaults, overrides };\n}\n\nfunction parseRelationshipsXml(xml: string): OpcRelationship[] {\n const relationships: OpcRelationship[] = [];\n\n for (const attributes of findTagAttributes(xml, \"Relationship\")) {\n const id = attributes.Id;\n const type = attributes.Type;\n const target = attributes.Target;\n if (!id || !type || !target) {\n continue;\n }\n\n relationships.push({\n id,\n type,\n target,\n targetMode: attributes.TargetMode === \"External\" ? \"external\" : \"internal\",\n });\n }\n\n return relationships;\n}\n\nfunction findTagAttributes(xml: string, tagName: string): Record<string, string>[] {\n const tagPattern = new RegExp(`<(?:[A-Za-z_][\\\\w.-]*:)?${tagName}\\\\b([^>]*)\\\\/?>`, \"g\");\n const results: Record<string, string>[] = [];\n let tagMatch: RegExpExecArray | null = tagPattern.exec(xml);\n\n while (tagMatch) {\n results.push(parseAttributes(tagMatch[1] ?? \"\"));\n tagMatch = tagPattern.exec(xml);\n }\n\n return results;\n}\n\nfunction parseAttributes(rawAttributes: string): Record<string, string> {\n const attributes: Record<string, string> = {};\n const attributePattern = /([A-Za-z_][\\w:.-]*)\\s*=\\s*([\"'])([\\s\\S]*?)\\2/g;\n let match: RegExpExecArray | null = attributePattern.exec(rawAttributes);\n\n while (match) {\n attributes[match[1]] = decodeXmlEntities(match[3]);\n match = attributePattern.exec(rawAttributes);\n }\n\n return attributes;\n}\n\nfunction decodeXmlEntities(value: string): string {\n return value\n .replace(/"/g, '\"')\n .replace(/'/g, \"'\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/&/g, \"&\");\n}\n\nfunction resolveContentType(\n path: string,\n contentTypes: OpcPackageManifest[\"contentTypes\"],\n): string | null {\n if (path === CONTENT_TYPES_PATH) {\n return \"application/xml\";\n }\n\n const override = contentTypes.overrides[path];\n if (override) {\n return override;\n }\n\n const extension = path.includes(\".\") ? path.slice(path.lastIndexOf(\".\") + 1).toLowerCase() : \"\";\n return extension ? contentTypes.defaults[extension] ?? null : null;\n}\n\nexport { parseContentTypesXml, parseRelationshipsXml };\n","import type { EditorStoryTarget } from \"../../api/public-types\";\n\nexport type Position = number;\nexport type Assoc = -1 | 1;\n\nexport interface DocRange {\n from: Position;\n to: Position;\n}\n\nexport interface BoundaryAssoc {\n start: Assoc;\n end: Assoc;\n}\n\nexport interface RangeAnchor {\n kind: \"range\";\n range: DocRange;\n assoc: BoundaryAssoc;\n}\n\nexport interface NodeAnchor {\n kind: \"node\";\n at: Position;\n assoc: Assoc;\n}\n\nexport interface DetachedAnchor {\n kind: \"detached\";\n lastKnownRange: DocRange;\n reason: \"deleted\" | \"invalidatedByStructureChange\" | \"importAmbiguity\";\n}\n\nexport type EditorAnchorProjection = RangeAnchor | NodeAnchor | DetachedAnchor;\n\nexport interface MappingStep {\n from: Position;\n to: Position;\n insertSize: number;\n}\n\nexport interface MappingResult {\n position: Position;\n deleted: boolean;\n}\n\nexport interface TransactionMapping {\n steps: MappingStep[];\n metadata?: {\n invalidatesStructures?: boolean;\n affectsComments?: boolean;\n affectsRevisions?: boolean;\n affectsOpaqueFragments?: boolean;\n [key: string]: unknown;\n };\n}\n\nexport const DEFAULT_BOUNDARY_ASSOC: BoundaryAssoc = {\n start: 1,\n end: -1,\n};\n\nexport function createRangeAnchor(\n from: Position,\n to = from,\n assoc: BoundaryAssoc = DEFAULT_BOUNDARY_ASSOC,\n): RangeAnchor {\n return {\n kind: \"range\",\n range: normalizeRange({ from, to }),\n assoc,\n };\n}\n\nexport function createNodeAnchor(at: Position, assoc: Assoc = 1): NodeAnchor {\n return {\n kind: \"node\",\n at,\n assoc,\n };\n}\n\nexport function createDetachedAnchor(\n lastKnownRange: DocRange,\n reason: DetachedAnchor[\"reason\"],\n): DetachedAnchor {\n return {\n kind: \"detached\",\n lastKnownRange: normalizeRange(lastKnownRange),\n reason,\n };\n}\n\nexport function createEmptyMapping(): TransactionMapping {\n return {\n steps: [],\n };\n}\n\nexport function normalizeRange(range: DocRange): DocRange {\n return range.from <= range.to\n ? { from: range.from, to: range.to }\n : { from: range.to, to: range.from };\n}\n\nexport function getEffectiveRange(anchor: EditorAnchorProjection): DocRange {\n if (anchor.kind === \"range\") {\n return anchor.range;\n }\n if (anchor.kind === \"node\") {\n return { from: anchor.at, to: anchor.at };\n }\n return anchor.lastKnownRange;\n}\n\nexport function mapPosition(\n position: Position,\n assoc: Assoc,\n mapping: TransactionMapping,\n): MappingResult {\n let mappedPosition = position;\n let deleted = false;\n\n for (const step of mapping.steps) {\n const next = mapPositionThroughStep(mappedPosition, assoc, step);\n mappedPosition = next.position;\n deleted = deleted || next.deleted;\n }\n\n return {\n position: mappedPosition,\n deleted,\n };\n}\n\nexport function mapAnchor(\n anchor: EditorAnchorProjection,\n mapping: TransactionMapping,\n): EditorAnchorProjection {\n if (anchor.kind === \"detached\") {\n return anchor;\n }\n\n if (anchor.kind === \"node\") {\n const mapped = mapPosition(anchor.at, anchor.assoc, mapping);\n\n if (mapped.deleted) {\n return createDetachedAnchor(\n { from: anchor.at, to: anchor.at + 1 },\n mapping.metadata?.invalidatesStructures\n ? \"invalidatedByStructureChange\"\n : \"deleted\",\n );\n }\n\n return createNodeAnchor(mapped.position, anchor.assoc);\n }\n\n const from = mapPosition(anchor.range.from, anchor.assoc.start, mapping);\n const to = mapPosition(anchor.range.to, anchor.assoc.end, mapping);\n const mappedRange = normalizeRange({ from: from.position, to: to.position });\n\n if (from.deleted && to.deleted && mappedRange.from === mappedRange.to) {\n return createDetachedAnchor(\n anchor.range,\n mapping.metadata?.invalidatesStructures\n ? \"invalidatedByStructureChange\"\n : \"deleted\",\n );\n }\n\n return createRangeAnchor(mappedRange.from, mappedRange.to, anchor.assoc);\n}\n\nexport function mapRange(\n range: DocRange,\n assoc: BoundaryAssoc,\n mapping: TransactionMapping,\n): RangeAnchor | DetachedAnchor {\n const mapped = mapAnchor(createRangeAnchor(range.from, range.to, assoc), mapping);\n return mapped.kind === \"node\" ? createRangeAnchor(mapped.at, mapped.at, assoc) : mapped;\n}\n\nexport function areAnchorsEqual(\n left: EditorAnchorProjection,\n right: EditorAnchorProjection,\n): boolean {\n if (left.kind !== right.kind) {\n return false;\n }\n\n if (left.kind === \"detached\" && right.kind === \"detached\") {\n return (\n left.reason === right.reason &&\n left.lastKnownRange.from === right.lastKnownRange.from &&\n left.lastKnownRange.to === right.lastKnownRange.to\n );\n }\n\n if (left.kind === \"node\" && right.kind === \"node\") {\n return left.at === right.at && left.assoc === right.assoc;\n }\n\n if (left.kind === \"range\" && right.kind === \"range\") {\n return (\n left.range.from === right.range.from &&\n left.range.to === right.range.to &&\n left.assoc.start === right.assoc.start &&\n left.assoc.end === right.assoc.end\n );\n }\n\n return false;\n}\n\nexport function storyTargetsEqual(\n left: EditorStoryTarget | undefined,\n right: EditorStoryTarget | undefined,\n): boolean {\n if (left === right) return true;\n if (!left || !right) return left === right;\n if (left.kind !== right.kind) return false;\n if (left.kind === \"main\") return true;\n if (left.kind === \"header\" && right.kind === \"header\") {\n return (\n left.relationshipId === right.relationshipId &&\n left.variant === right.variant &&\n (left.sectionIndex === undefined ||\n right.sectionIndex === undefined\n ? true\n : left.sectionIndex === right.sectionIndex)\n );\n }\n if (left.kind === \"footer\" && right.kind === \"footer\") {\n return (\n left.relationshipId === right.relationshipId &&\n left.variant === right.variant &&\n (left.sectionIndex === undefined ||\n right.sectionIndex === undefined\n ? true\n : left.sectionIndex === right.sectionIndex)\n );\n }\n if (left.kind === \"footnote\" && right.kind === \"footnote\") {\n return left.noteId === right.noteId;\n }\n if (left.kind === \"endnote\" && right.kind === \"endnote\") {\n return left.noteId === right.noteId;\n }\n return false;\n}\n\nexport const MAIN_STORY_TARGET: EditorStoryTarget = { kind: \"main\" };\n\nfunction mapPositionThroughStep(\n position: Position,\n assoc: Assoc,\n step: MappingStep,\n): MappingResult {\n if (position < step.from) {\n return { position, deleted: false };\n }\n\n if (position > step.to) {\n return {\n position: position + step.insertSize - (step.to - step.from),\n deleted: false,\n };\n }\n\n if (position === step.from) {\n return {\n position: assoc < 0 ? step.from : step.from + step.insertSize,\n deleted: false,\n };\n }\n\n if (position === step.to) {\n return {\n position: assoc < 0 ? step.from : step.from + step.insertSize,\n deleted: false,\n };\n }\n\n return {\n position: assoc < 0 ? step.from : step.from + step.insertSize,\n deleted: true,\n };\n}\n","import {\n DEFAULT_BOUNDARY_ASSOC,\n createDetachedAnchor,\n createNodeAnchor,\n createRangeAnchor,\n type EditorAnchorProjection,\n} from \"../selection/mapping.ts\";\nimport { isUuid } from \"../../model/cds-1.0.0.ts\";\nimport {\n assertPersistedEditorSnapshot as assertModelPersistedEditorSnapshot,\n createPersistedEditorSnapshot as createModelPersistedEditorSnapshot,\n validatePersistedEditorSnapshot as validateModelPersistedEditorSnapshot,\n type ProtectionSnapshotRecord as ModelProtectionSnapshotRecord,\n type PersistedEditorSnapshot as ModelPersistedEditorSnapshot,\n} from \"../../model/snapshot.ts\";\nimport {\n assertCanonicalDocument,\n type CanonicalDocument,\n type CommentEntry as ModelCommentEntry,\n type CommentResolution as ModelCommentResolution,\n type CommentThread as ModelCommentThread,\n type RevisionMetadataRecord as ModelRevisionMetadataRecord,\n type RevisionRecord as ModelRevisionRecord,\n} from \"../../model/canonical-document.ts\";\n\nexport type RuntimePhase = \"loading\" | \"ready\" | \"error\";\nexport type EditorWarningCode =\n | \"unsupported_ooxml_preserved\"\n | \"unsupported_ooxml_locked\"\n | \"import_normalized\"\n | \"export_roundtrip_risk\"\n | \"comment_anchor_detached\"\n | \"revision_anchor_detached\"\n | \"large_document_degraded\"\n | \"font_substitution\"\n | \"image_missing\";\n\nexport interface EditorWarning {\n warningId: string;\n code: EditorWarningCode;\n severity: \"info\" | \"warning\";\n message: string;\n source:\n | \"import\"\n | \"runtime\"\n | \"review\"\n | \"preservation\"\n | \"validation\"\n | \"export\";\n affectedAnchor?: EditorAnchorProjection;\n featureEntryId?: string;\n details?: Record<string, unknown>;\n}\n\nexport interface EditorError {\n errorId: string;\n code:\n | \"import_failed\"\n | \"export_failed\"\n | \"package_corrupt\"\n | \"validation_failed\"\n | \"datastore_failed\"\n | \"internal_invariant\";\n message: string;\n isFatal: boolean;\n source: \"import\" | \"runtime\" | \"validation\" | \"datastore\" | \"host\" | \"export\";\n details?: Record<string, unknown>;\n}\n\nexport type CompatibilityFeatureClass =\n | \"supported-roundtrip\"\n | \"preserve-only\"\n | \"unsupported-fatal\";\n\nexport interface CompatibilityFeatureEntry {\n featureEntryId: string;\n featureKey: string;\n featureClass: CompatibilityFeatureClass;\n message: string;\n affectedAnchor?: EditorAnchorProjection;\n details?: Record<string, unknown>;\n}\n\nexport interface CompatibilityReport {\n reportVersion: \"compatibility-report/1\";\n generatedAt: string;\n blockExport: boolean;\n featureEntries: CompatibilityFeatureEntry[];\n warnings: EditorWarning[];\n errors: EditorError[];\n}\n\nexport type CommentEntryRecord = ModelCommentEntry;\nexport type CommentResolutionRecord = ModelCommentResolution;\nexport type CommentThreadRecord = ModelCommentThread;\nexport type RevisionMetadataRecord = ModelRevisionMetadataRecord;\nexport type RevisionRecord = ModelRevisionRecord;\nexport type ReviewStore = CanonicalDocument[\"review\"];\nexport type CanonicalDocumentEnvelope = CanonicalDocument;\n\nexport interface SelectionSnapshot {\n anchor: number;\n head: number;\n isCollapsed: boolean;\n activeRange: EditorAnchorProjection;\n}\n\nexport interface DocumentStats {\n paragraphCount: number;\n wordCount: number;\n characterCount: number;\n commentCount: number;\n revisionCount: number;\n}\n\nexport interface CommentSidebarSnapshot {\n activeCommentId?: string;\n openThreadCount: number;\n resolvedThreadCount: number;\n threads: CommentThreadRecord[];\n}\n\nexport interface TrackedChangesSnapshot {\n totalCount: number;\n pendingCount: number;\n acceptedCount: number;\n rejectedCount: number;\n}\n\nexport interface CompatibilityPanelSnapshot {\n report: CompatibilityReport;\n blockExport: boolean;\n totalEntries: number;\n}\n\nexport interface CommandStateSnapshot {\n canUndo: boolean;\n canRedo: boolean;\n canAddComment: boolean;\n canAcceptAllChanges: boolean;\n canRejectAllChanges: boolean;\n}\n\nexport interface RuntimeRenderSnapshot {\n documentId: string;\n sessionId: string;\n sourceLabel?: string;\n revisionToken: string;\n isReady: boolean;\n isDirty: boolean;\n readOnly: boolean;\n selection: SelectionSnapshot;\n documentStats: DocumentStats;\n comments: CommentSidebarSnapshot;\n trackedChanges: TrackedChangesSnapshot;\n compatibility: CompatibilityPanelSnapshot;\n warnings: EditorWarning[];\n fatalError?: EditorError;\n commandState: CommandStateSnapshot;\n}\n\nexport interface PersistedEditorSnapshot\n extends Omit<\n ModelPersistedEditorSnapshot,\n \"canonicalDocument\" | \"compatibility\" | \"warningLog\"\n > {\n canonicalDocument: CanonicalDocumentEnvelope;\n compatibility: CompatibilityReport;\n warningLog: EditorWarning[];\n}\n\nexport interface EditorRuntimeState {\n hasFocus: boolean;\n activeCommentId?: string;\n}\n\nexport interface EditorState {\n phase: RuntimePhase;\n documentId: string;\n sessionId: string;\n sourceLabel?: string;\n sourcePackage?: ModelPersistedEditorSnapshot[\"sourcePackage\"];\n revision: number;\n revisionToken: string;\n isDirty: boolean;\n readOnly: boolean;\n document: CanonicalDocumentEnvelope;\n selection: SelectionSnapshot;\n warnings: EditorWarning[];\n compatibility: CompatibilityReport;\n fatalError?: EditorError;\n runtime: EditorRuntimeState;\n}\n\nexport interface CreateEditorStateOptions {\n documentId: string;\n sessionId: string;\n sourceLabel?: string;\n readOnly?: boolean;\n canonicalDocument?: CanonicalDocumentEnvelope;\n persistedSnapshot?: PersistedEditorSnapshot;\n compatibility?: CompatibilityReport;\n warnings?: EditorWarning[];\n fatalError?: EditorError;\n}\n\nexport function createEmptyReviewStore(): ReviewStore {\n return {\n comments: {},\n revisions: {},\n };\n}\n\nexport function createDefaultCanonicalDocument(\n documentId: string,\n timestamp: string,\n): CanonicalDocumentEnvelope {\n return {\n schemaVersion: \"cds/1.0.0\",\n docId: createCanonicalDocumentId(documentId),\n createdAt: timestamp,\n updatedAt: timestamp,\n metadata: {\n customProperties: {},\n },\n styles: {\n paragraphs: {},\n characters: {},\n tables: {},\n },\n numbering: {\n abstractDefinitions: {},\n instances: {},\n },\n media: {\n items: {},\n },\n content: {\n type: \"doc\",\n children: [{ type: \"paragraph\", children: [] }],\n },\n review: createEmptyReviewStore(),\n preservation: {\n opaqueFragments: {},\n packageParts: {},\n },\n diagnostics: {\n warnings: [],\n errors: [],\n },\n };\n}\n\nexport function createSelectionSnapshot(anchor = 0, head = anchor): SelectionSnapshot {\n return {\n anchor,\n head,\n isCollapsed: anchor === head,\n activeRange: createRangeAnchor(anchor, head, DEFAULT_BOUNDARY_ASSOC),\n };\n}\n\nexport function createEmptyCompatibilityReport(generatedAt: string): CompatibilityReport {\n return {\n reportVersion: \"compatibility-report/1\",\n generatedAt,\n blockExport: false,\n featureEntries: [],\n warnings: [],\n errors: [],\n };\n}\n\nexport function createEditorState(options: CreateEditorStateOptions): EditorState {\n const timestamp = new Date(0).toISOString();\n const normalizedSnapshot = options.persistedSnapshot\n ? normalizePersistedSnapshotForRuntime(options.persistedSnapshot, options.documentId, timestamp)\n : undefined;\n if (options.canonicalDocument) {\n assertCanonicalDocument(options.canonicalDocument as unknown);\n }\n\n const normalizedDocument = normalizedSnapshot\n ? structuredClone(normalizedSnapshot.canonicalDocument)\n : options.canonicalDocument\n ? structuredClone(options.canonicalDocument)\n : createDefaultCanonicalDocument(options.documentId, timestamp);\n const warnings = normalizedSnapshot\n ? normalizeWarningLog(normalizedSnapshot.warningLog)\n : options.warnings ?? [];\n const compatibility =\n normalizedSnapshot\n ? normalizeCompatibilityReport(normalizedSnapshot.compatibility)\n : options.compatibility ?? createEmptyCompatibilityReport(normalizedDocument.updatedAt);\n\n return {\n phase: options.fatalError ? \"error\" : \"ready\",\n documentId: options.documentId,\n sessionId: options.sessionId,\n sourceLabel: options.sourceLabel,\n sourcePackage: normalizedSnapshot?.sourcePackage,\n revision: 0,\n revisionToken: `${options.sessionId}:0`,\n isDirty: false,\n readOnly: options.readOnly ?? false,\n document: normalizedDocument,\n selection: createSelectionSnapshot(),\n warnings,\n compatibility,\n fatalError: options.fatalError,\n runtime: {\n hasFocus: false,\n },\n };\n}\n\nfunction normalizePersistedSnapshotForRuntime(\n snapshot: PersistedEditorSnapshot,\n documentId: string,\n timestamp: string,\n): PersistedEditorSnapshot {\n const issues = validateModelPersistedEditorSnapshot(snapshot as unknown);\n if (issues.length === 0) {\n return snapshot;\n }\n\n if (!isRecord(snapshot) || !isRecord(snapshot.canonicalDocument)) {\n assertModelPersistedEditorSnapshot(snapshot as unknown);\n }\n\n const normalizedDocument = normalizeCanonicalDocumentEnvelope(\n snapshot.canonicalDocument,\n documentId,\n timestamp,\n );\n try {\n assertCanonicalDocument(normalizedDocument as unknown);\n } catch {\n assertModelPersistedEditorSnapshot(snapshot as unknown);\n }\n const repairWarning = createSnapshotRepairWarning(issues.length);\n const compatibility = coerceCompatibilityReport(\n snapshot.compatibility,\n normalizedDocument.updatedAt,\n repairWarning,\n );\n\n return {\n snapshotVersion:\n snapshot.snapshotVersion === \"persisted-editor-snapshot/1\" ||\n snapshot.snapshotVersion === \"persisted-editor-snapshot/2\"\n ? snapshot.snapshotVersion\n : \"persisted-editor-snapshot/2\",\n schemaVersion: \"cds/1.0.0\",\n documentId:\n typeof snapshot.documentId === \"string\" && snapshot.documentId.length > 0\n ? snapshot.documentId\n : documentId,\n docId: normalizedDocument.docId,\n createdAt: normalizedDocument.createdAt,\n updatedAt: normalizedDocument.updatedAt,\n savedAt:\n typeof snapshot.savedAt === \"string\" && snapshot.savedAt.length > 0\n ? snapshot.savedAt\n : normalizedDocument.updatedAt,\n editorBuild:\n typeof snapshot.editorBuild === \"string\" && snapshot.editorBuild.length > 0\n ? snapshot.editorBuild\n : \"dev\",\n canonicalDocument: normalizedDocument,\n compatibility,\n warningLog: dedupeWarnings([\n ...coerceWarnings(snapshot.warningLog),\n repairWarning,\n ]),\n sourcePackage: snapshot.sourcePackage,\n };\n}\n\nfunction normalizeCanonicalDocumentEnvelope(\n value: unknown,\n documentId: string,\n timestamp: string,\n): CanonicalDocumentEnvelope {\n const base = createDefaultCanonicalDocument(documentId, timestamp);\n const record = isRecord(value) ? value : {};\n const metadata = isRecord(record.metadata) ? record.metadata : {};\n\n return {\n ...base,\n ...record,\n schemaVersion: \"cds/1.0.0\",\n docId: isUuid(record.docId) ? record.docId : createCanonicalDocumentId(documentId),\n createdAt:\n typeof record.createdAt === \"string\" && record.createdAt.length > 0\n ? record.createdAt\n : base.createdAt,\n updatedAt:\n typeof record.updatedAt === \"string\" && record.updatedAt.length > 0\n ? record.updatedAt\n : base.updatedAt,\n metadata: {\n ...base.metadata,\n ...metadata,\n customProperties: isRecord(metadata.customProperties)\n ? (Object.fromEntries(\n Object.entries(metadata.customProperties).filter(([, entry]) => typeof entry === \"string\"),\n ) as Record<string, string>)\n : {},\n },\n styles:\n record.styles === undefined\n ? base.styles\n : (record.styles as CanonicalDocumentEnvelope[\"styles\"]),\n numbering:\n record.numbering === undefined\n ? base.numbering\n : (record.numbering as CanonicalDocumentEnvelope[\"numbering\"]),\n media:\n record.media === undefined\n ? base.media\n : (record.media as CanonicalDocumentEnvelope[\"media\"]),\n content: isRecord(record.content)\n ? (record.content as unknown as CanonicalDocumentEnvelope[\"content\"])\n : base.content,\n review:\n record.review === undefined\n ? base.review\n : (record.review as CanonicalDocumentEnvelope[\"review\"]),\n preservation:\n record.preservation === undefined\n ? base.preservation\n : (record.preservation as CanonicalDocumentEnvelope[\"preservation\"]),\n diagnostics:\n record.diagnostics === undefined\n ? base.diagnostics\n : (record.diagnostics as CanonicalDocumentEnvelope[\"diagnostics\"]),\n ...(isRecord(record.subParts)\n ? { subParts: record.subParts as unknown as CanonicalDocumentEnvelope[\"subParts\"] }\n : {}),\n };\n}\n\nfunction coerceCompatibilityReport(\n value: unknown,\n generatedAt: string,\n repairWarning: EditorWarning,\n): CompatibilityReport {\n const record = isRecord(value) ? value : {};\n const warnings = dedupeWarnings([\n ...coerceWarnings(record.warnings),\n repairWarning,\n ]);\n\n return {\n reportVersion: \"compatibility-report/1\",\n generatedAt:\n typeof record.generatedAt === \"string\" && record.generatedAt.length > 0\n ? record.generatedAt\n : generatedAt,\n blockExport: typeof record.blockExport === \"boolean\" ? record.blockExport : false,\n featureEntries: Array.isArray(record.featureEntries)\n ? record.featureEntries.flatMap((entry) => {\n if (!isRecord(entry)) {\n return [];\n }\n if (\n typeof entry.featureEntryId !== \"string\" ||\n typeof entry.featureKey !== \"string\" ||\n typeof entry.featureClass !== \"string\" ||\n typeof entry.message !== \"string\"\n ) {\n return [];\n }\n return [{\n featureEntryId: entry.featureEntryId,\n featureKey: entry.featureKey,\n featureClass: entry.featureClass as CompatibilityFeatureEntry[\"featureClass\"],\n message: entry.message,\n ...(entry.affectedAnchor && isRecord(entry.affectedAnchor)\n ? { affectedAnchor: entry.affectedAnchor as unknown as EditorAnchorProjection }\n : {}),\n ...(isRecord(entry.details) ? { details: entry.details } : {}),\n }];\n })\n : [],\n warnings,\n errors: Array.isArray(record.errors)\n ? record.errors.flatMap((entry) => {\n if (!isRecord(entry)) {\n return [];\n }\n if (\n typeof entry.errorId !== \"string\" ||\n typeof entry.code !== \"string\" ||\n typeof entry.message !== \"string\" ||\n typeof entry.source !== \"string\" ||\n typeof entry.isFatal !== \"boolean\"\n ) {\n return [];\n }\n return [{\n errorId: entry.errorId,\n code: entry.code as EditorError[\"code\"],\n message: entry.message,\n source: entry.source as EditorError[\"source\"],\n isFatal: entry.isFatal,\n ...(isRecord(entry.details) ? { details: entry.details } : {}),\n }];\n })\n : [],\n };\n}\n\nfunction coerceWarnings(value: unknown): EditorWarning[] {\n if (!Array.isArray(value)) {\n return [];\n }\n\n return value.flatMap((warning) => {\n if (!isRecord(warning)) {\n return [];\n }\n if (\n typeof warning.warningId !== \"string\" ||\n typeof warning.code !== \"string\" ||\n typeof warning.severity !== \"string\" ||\n typeof warning.message !== \"string\" ||\n typeof warning.source !== \"string\"\n ) {\n return [];\n }\n\n return [{\n warningId: warning.warningId,\n code: warning.code as EditorWarning[\"code\"],\n severity: warning.severity as EditorWarning[\"severity\"],\n message: warning.message,\n source: warning.source as EditorWarning[\"source\"],\n ...(warning.affectedAnchor && isRecord(warning.affectedAnchor)\n ? { affectedAnchor: warning.affectedAnchor as unknown as EditorAnchorProjection }\n : {}),\n ...(typeof warning.featureEntryId === \"string\"\n ? { featureEntryId: warning.featureEntryId }\n : {}),\n ...(isRecord(warning.details) ? { details: warning.details } : {}),\n }];\n });\n}\n\nfunction createSnapshotRepairWarning(issueCount: number): EditorWarning {\n return {\n warningId: `warning:snapshot-repair:${issueCount}`,\n code: \"import_normalized\",\n severity: \"warning\",\n message: `Loaded a persisted snapshot after repairing ${issueCount} validation issue${issueCount === 1 ? \"\" : \"s\"}.`,\n source: \"validation\",\n };\n}\n\nfunction dedupeWarnings(warnings: EditorWarning[]): EditorWarning[] {\n const seen = new Set<string>();\n const result: EditorWarning[] = [];\n\n for (const warning of warnings) {\n if (!warning.warningId || seen.has(warning.warningId)) {\n continue;\n }\n seen.add(warning.warningId);\n result.push(warning);\n }\n\n return result;\n}\n\nexport function deriveDocumentStats(state: Pick<EditorState, \"document\">): DocumentStats {\n const serializedContent = extractText(state.document.content);\n\n return {\n paragraphCount: estimateParagraphCount(state.document.content),\n wordCount: serializedContent.trim().length === 0 ? 0 : serializedContent.trim().split(/\\s+/u).length,\n characterCount: Array.from(serializedContent).length,\n commentCount: Object.keys(state.document.review.comments).length,\n revisionCount: Object.keys(state.document.review.revisions).length,\n };\n}\n\nexport function deriveRenderSnapshot(\n state: EditorState,\n history: { canUndo: boolean; canRedo: boolean },\n): RuntimeRenderSnapshot {\n const comments = Object.values(state.document.review.comments).sort((left, right) =>\n left.createdAt.localeCompare(right.createdAt),\n );\n const revisions = Object.values(state.document.review.revisions);\n\n return {\n documentId: state.documentId,\n sessionId: state.sessionId,\n sourceLabel: state.sourceLabel,\n revisionToken: state.revisionToken,\n isReady: state.phase === \"ready\",\n isDirty: state.isDirty,\n readOnly: state.readOnly,\n selection: state.selection,\n documentStats: deriveDocumentStats(state),\n comments: {\n activeCommentId: state.runtime.activeCommentId,\n openThreadCount: comments.filter((comment) => comment.status === \"open\").length,\n resolvedThreadCount: comments.filter((comment) => comment.status === \"resolved\").length,\n threads: comments,\n },\n trackedChanges: {\n totalCount: revisions.length,\n pendingCount: revisions.filter((revision) => revision.status === \"open\").length,\n acceptedCount: revisions.filter((revision) => revision.status === \"accepted\").length,\n rejectedCount: revisions.filter((revision) => revision.status === \"rejected\").length,\n },\n compatibility: {\n report: state.compatibility,\n blockExport: state.compatibility.blockExport,\n totalEntries: state.compatibility.featureEntries.length,\n },\n warnings: state.warnings,\n fatalError: state.fatalError,\n commandState: {\n canUndo: history.canUndo,\n canRedo: history.canRedo,\n canAddComment: !state.readOnly,\n canAcceptAllChanges: revisions.some((revision) => revision.status === \"open\"),\n canRejectAllChanges: revisions.some((revision) => revision.status === \"open\"),\n },\n };\n}\n\nexport function createPersistedEditorSnapshot(\n state: EditorState,\n options: {\n editorBuild: string;\n savedAt: string;\n compatibility?: CompatibilityReport;\n protectionSnapshot?: ModelProtectionSnapshotRecord;\n },\n): PersistedEditorSnapshot {\n const snapshot = createModelPersistedEditorSnapshot({\n documentId: state.documentId,\n savedAt: options.savedAt,\n editorBuild: options.editorBuild,\n canonicalDocument: state.document,\n compatibility: (options.compatibility ?? state.compatibility) as never,\n warningLog: state.warnings as never,\n protectionSnapshot: options.protectionSnapshot,\n sourcePackage: state.sourcePackage,\n });\n return snapshot as PersistedEditorSnapshot;\n}\n\nfunction estimateParagraphCount(content: unknown): number {\n if (Array.isArray(content)) {\n return content.length;\n }\n\n if (content && typeof content === \"object\" && Array.isArray((content as { blocks?: unknown[] }).blocks)) {\n return ((content as { blocks: unknown[] }).blocks).length;\n }\n\n return extractText(content).length > 0 ? 1 : 0;\n}\n\nfunction normalizeWarningLog(warnings: EditorWarning[]): EditorWarning[] {\n return warnings.map((warning) => ({\n ...warning,\n affectedAnchor: warning.affectedAnchor\n ? normalizeAnchorProjection(warning.affectedAnchor)\n : undefined,\n }));\n}\n\nfunction normalizeCompatibilityReport(report: CompatibilityReport): CompatibilityReport {\n return {\n ...report,\n featureEntries: report.featureEntries.map((entry) => ({\n ...entry,\n affectedAnchor: entry.affectedAnchor\n ? normalizeAnchorProjection(entry.affectedAnchor)\n : undefined,\n })),\n warnings: normalizeWarningLog(report.warnings),\n };\n}\n\nfunction normalizeAnchorProjection(anchor: EditorAnchorProjection): EditorAnchorProjection {\n switch (anchor.kind) {\n case \"range\": {\n const rangeAnchor = anchor as EditorAnchorProjection & {\n range?: { from: number; to: number };\n from?: number;\n to?: number;\n assoc: { start: -1 | 1; end: -1 | 1 };\n };\n return rangeAnchor.range\n ? createRangeAnchor(rangeAnchor.range.from, rangeAnchor.range.to, rangeAnchor.assoc)\n : createRangeAnchor(rangeAnchor.from ?? 0, rangeAnchor.to ?? 0, rangeAnchor.assoc);\n }\n case \"node\":\n return createNodeAnchor(anchor.at, anchor.assoc);\n case \"detached\":\n return createDetachedAnchor(anchor.lastKnownRange, anchor.reason);\n }\n}\n\nfunction extractText(value: unknown): string {\n if (typeof value === \"string\") {\n return value;\n }\n\n if (Array.isArray(value)) {\n return value.map((item) => extractText(item)).join(\" \");\n }\n\n if (!value || typeof value !== \"object\") {\n return \"\";\n }\n\n return Object.values(value as Record<string, unknown>)\n .map((item) => extractText(item))\n .filter(Boolean)\n .join(\" \");\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nexport function createCanonicalDocumentId(documentId: string): string {\n const hashWord = (seed: string): string => {\n let hash = 0x811c9dc5;\n for (const char of seed) {\n hash ^= char.charCodeAt(0);\n hash = Math.imul(hash, 0x01000193);\n }\n return (hash >>> 0).toString(16).padStart(8, \"0\");\n };\n\n const raw =\n hashWord(`${documentId}:0`) +\n hashWord(`${documentId}:1`) +\n hashWord(`${documentId}:2`) +\n hashWord(`${documentId}:3`);\n\n return [\n raw.slice(0, 8),\n raw.slice(8, 12),\n `4${raw.slice(13, 16)}`,\n `8${raw.slice(17, 20)}`,\n raw.slice(20, 32),\n ].join(\"-\");\n}\n\nexport function normalizeCommentThreadRecord(value: unknown): CommentThreadRecord {\n const record = isRecord(value) ? value : {};\n const authorId =\n typeof record.createdBy === \"string\" && record.createdBy.length > 0\n ? record.createdBy\n : typeof record.authorId === \"string\" && record.authorId.length > 0\n ? record.authorId\n : \"unknown\";\n const createdAt =\n typeof record.createdAt === \"string\" && record.createdAt.length > 0\n ? record.createdAt\n : new Date(0).toISOString();\n const entries = Array.isArray(record.entries)\n ? record.entries\n .filter((entry): entry is Record<string, unknown> => isRecord(entry))\n .map((entry, index) => ({\n entryId:\n typeof entry.entryId === \"string\" && entry.entryId.length > 0\n ? entry.entryId\n : `${String(record.commentId ?? \"comment\")}-entry-${index + 1}`,\n authorId:\n typeof entry.authorId === \"string\" && entry.authorId.length > 0\n ? entry.authorId\n : authorId,\n body: typeof entry.body === \"string\" ? entry.body : \"\",\n createdAt:\n typeof entry.createdAt === \"string\" && entry.createdAt.length > 0\n ? entry.createdAt\n : createdAt,\n metadata: isRecord(entry.metadata)\n ? {\n ooxmlCommentId:\n typeof entry.metadata.ooxmlCommentId === \"string\"\n ? entry.metadata.ooxmlCommentId\n : undefined,\n paraId:\n typeof entry.metadata.paraId === \"string\"\n ? entry.metadata.paraId\n : undefined,\n parentParaId:\n typeof entry.metadata.parentParaId === \"string\"\n ? entry.metadata.parentParaId\n : undefined,\n durableId:\n typeof entry.metadata.durableId === \"string\"\n ? entry.metadata.durableId\n : undefined,\n initials:\n typeof entry.metadata.initials === \"string\"\n ? entry.metadata.initials\n : undefined,\n }\n : undefined,\n }))\n : [\n {\n entryId: `${String(record.commentId ?? \"comment\")}-entry-1`,\n authorId,\n body: typeof record.body === \"string\" ? record.body : \"\",\n createdAt,\n },\n ];\n const resolution = isRecord(record.resolution)\n ? {\n resolvedAt:\n typeof record.resolution.resolvedAt === \"string\"\n ? record.resolution.resolvedAt\n : typeof record.resolvedAt === \"string\"\n ? record.resolvedAt\n : createdAt,\n resolvedBy:\n typeof record.resolution.resolvedBy === \"string\" &&\n record.resolution.resolvedBy.length > 0\n ? record.resolution.resolvedBy\n : authorId,\n }\n : typeof record.resolvedAt === \"string\"\n ? {\n resolvedAt: record.resolvedAt,\n resolvedBy: authorId,\n }\n : undefined;\n const normalizedStatus =\n typeof record.status === \"string\"\n ? record.status\n : record.anchor && isRecord(record.anchor) && record.anchor.kind === \"detached\"\n ? \"detached\"\n : resolution || record.isResolved\n ? \"resolved\"\n : \"open\";\n\n return {\n commentId:\n typeof record.commentId === \"string\" && record.commentId.length > 0\n ? record.commentId\n : \"comment-generated\",\n anchor:\n isRecord(record.anchor) && typeof record.anchor.kind === \"string\"\n ? (record.anchor as unknown as EditorAnchorProjection)\n : createDetachedAnchor({ from: 0, to: 0 }, \"importAmbiguity\"),\n createdAt,\n createdBy: authorId,\n authorId,\n body: entries.map((entry) => entry.body).join(\"\\n\"),\n entries,\n status:\n normalizedStatus === \"resolved\" || normalizedStatus === \"detached\"\n ? normalizedStatus\n : \"open\",\n resolution,\n resolvedAt: resolution?.resolvedAt,\n warningIds: Array.isArray(record.warningIds)\n ? record.warningIds.filter((warningId): warningId is string => typeof warningId === \"string\")\n : [],\n isResolved: normalizedStatus === \"resolved\",\n metadata: isRecord(record.metadata)\n ? {\n source:\n record.metadata.source === \"import\" || record.metadata.source === \"runtime\"\n ? record.metadata.source\n : undefined,\n rootOoxmlCommentId:\n typeof record.metadata.rootOoxmlCommentId === \"string\"\n ? record.metadata.rootOoxmlCommentId\n : undefined,\n rootParaId:\n typeof record.metadata.rootParaId === \"string\"\n ? record.metadata.rootParaId\n : undefined,\n }\n : undefined,\n };\n}\n","import type { TransactionMapping } from \"../../core/selection/mapping.ts\";\nimport {\n isDetachedCommentAnchor,\n remapCommentAnchor,\n summarizeCommentAnchor,\n type CommentAnchor,\n} from \"./comment-anchors.ts\";\n\nexport interface CommentEntry {\n entryId: string;\n authorId: string;\n body: string;\n createdAt: string;\n metadata?: CommentEntryMetadata;\n}\n\nexport interface CommentEntryMetadata {\n ooxmlCommentId?: string;\n paraId?: string;\n parentParaId?: string;\n durableId?: string;\n initials?: string;\n}\n\nexport interface CommentResolution {\n resolvedAt: string;\n resolvedBy: string;\n}\n\nexport type CommentThreadStatus = \"open\" | \"resolved\" | \"detached\";\n\nexport interface CommentThread {\n commentId: string;\n anchor: CommentAnchor;\n status: CommentThreadStatus;\n entries: CommentEntry[];\n createdBy: string;\n createdAt: string;\n resolution?: CommentResolution;\n warningIds: string[];\n metadata?: CommentThreadMetadata;\n}\n\nexport interface CommentThreadMetadata {\n source?: \"runtime\" | \"import\";\n rootOoxmlCommentId?: string;\n rootParaId?: string;\n}\n\nexport interface CommentStore {\n version: \"comment-store/1\";\n threads: Record<string, CommentThread>;\n}\n\nexport interface CreateCommentThreadParams {\n commentId: string;\n anchor: CommentAnchor;\n createdBy: string;\n createdAt: string;\n body: string;\n entryId?: string;\n warningIds?: string[];\n}\n\nexport interface AppendCommentEntryParams {\n commentId: string;\n entry: CommentEntry;\n}\n\nexport interface ResolveCommentThreadParams {\n commentId: string;\n resolvedAt: string;\n resolvedBy: string;\n}\n\nexport interface CommentSidebarThread {\n commentId: string;\n status: CommentThreadStatus;\n excerpt: string;\n entryCount: number;\n createdAt: string;\n createdBy: string;\n warningCount: number;\n anchorLabel: string;\n isActive: boolean;\n resolvedAt?: string;\n resolvedBy?: string;\n}\n\nexport interface CommentSidebarProjection {\n totalCount: number;\n openCommentIds: string[];\n resolvedCommentIds: string[];\n detachedCommentIds: string[];\n threads: CommentSidebarThread[];\n}\n\nexport function createCommentStore(\n threads: Record<string, CommentThread> = {},\n): CommentStore {\n return {\n version: \"comment-store/1\",\n threads,\n };\n}\n\nexport function createCommentThread(\n params: CreateCommentThreadParams,\n): CommentThread {\n return {\n commentId: params.commentId,\n anchor: params.anchor,\n status: isDetachedCommentAnchor(params.anchor) ? \"detached\" : \"open\",\n entries: [\n {\n entryId: params.entryId ?? `${params.commentId}-entry-1`,\n authorId: params.createdBy,\n body: params.body,\n createdAt: params.createdAt,\n },\n ],\n createdBy: params.createdBy,\n createdAt: params.createdAt,\n warningIds: [...(params.warningIds ?? [])],\n };\n}\n\nexport function upsertCommentThread(\n store: CommentStore,\n thread: CommentThread,\n): CommentStore {\n return {\n ...store,\n threads: {\n ...store.threads,\n [thread.commentId]: normalizeThread(thread),\n },\n };\n}\n\nexport function appendCommentEntry(\n store: CommentStore,\n params: AppendCommentEntryParams,\n): CommentStore {\n const existing = store.threads[params.commentId];\n if (!existing) {\n return store;\n }\n\n return upsertCommentThread(store, {\n ...existing,\n entries: [...existing.entries, params.entry],\n });\n}\n\nexport function resolveCommentThread(\n store: CommentStore,\n params: ResolveCommentThreadParams,\n): CommentStore {\n const existing = store.threads[params.commentId];\n if (!existing) {\n return store;\n }\n\n return upsertCommentThread(store, {\n ...existing,\n status: existing.status === \"detached\" ? \"detached\" : \"resolved\",\n resolution: {\n resolvedAt: params.resolvedAt,\n resolvedBy: params.resolvedBy,\n },\n });\n}\n\nexport function reopenCommentThread(\n store: CommentStore,\n commentId: string,\n): CommentStore {\n const existing = store.threads[commentId];\n if (!existing) {\n return store;\n }\n\n return upsertCommentThread(store, {\n ...existing,\n status: isDetachedCommentAnchor(existing.anchor) ? \"detached\" : \"open\",\n resolution: undefined,\n });\n}\n\nexport function setCommentThreadWarnings(\n store: CommentStore,\n commentId: string,\n warningIds: string[],\n): CommentStore {\n const existing = store.threads[commentId];\n if (!existing) {\n return store;\n }\n\n return upsertCommentThread(store, {\n ...existing,\n warningIds: [...warningIds],\n });\n}\n\nexport function remapCommentStore(\n store: CommentStore,\n mapping: TransactionMapping,\n): CommentStore {\n return createCommentStore(\n Object.fromEntries(\n Object.entries(store.threads).map(([commentId, thread]) => {\n const anchor = remapCommentAnchor(thread.anchor, mapping);\n const nextStatus =\n anchor.kind === \"detached\"\n ? \"detached\"\n : thread.status === \"resolved\"\n ? \"resolved\"\n : \"open\";\n\n return [\n commentId,\n normalizeThread({\n ...thread,\n anchor,\n status: nextStatus,\n }),\n ];\n }),\n ),\n );\n}\n\nexport function createCommentSidebarProjection(\n store: CommentStore,\n activeCommentId?: string,\n): CommentSidebarProjection {\n const threads = Object.values(store.threads)\n .map((thread) => toSidebarThread(thread, activeCommentId))\n .sort(compareSidebarThreads);\n\n return {\n totalCount: threads.length,\n openCommentIds: threads\n .filter((thread) => thread.status === \"open\")\n .map((thread) => thread.commentId),\n resolvedCommentIds: threads\n .filter((thread) => thread.status === \"resolved\")\n .map((thread) => thread.commentId),\n detachedCommentIds: threads\n .filter((thread) => thread.status === \"detached\")\n .map((thread) => thread.commentId),\n threads,\n };\n}\n\nfunction toSidebarThread(\n thread: CommentThread,\n activeCommentId?: string,\n): CommentSidebarThread {\n const firstEntry = thread.entries[0];\n const anchorSummary = summarizeCommentAnchor(thread.anchor);\n\n return {\n commentId: thread.commentId,\n status: thread.status,\n excerpt: firstEntry ? summarizeBody(firstEntry.body) : \"Empty thread\",\n entryCount: thread.entries.length,\n createdAt: thread.createdAt,\n createdBy: thread.createdBy,\n warningCount: thread.warningIds.length,\n anchorLabel:\n anchorSummary.state === \"detached\"\n ? `Detached ${anchorSummary.range.from}-${anchorSummary.range.to}`\n : `Range ${anchorSummary.range.from}-${anchorSummary.range.to}`,\n isActive: activeCommentId === thread.commentId,\n resolvedAt: thread.resolution?.resolvedAt,\n resolvedBy: thread.resolution?.resolvedBy,\n };\n}\n\nfunction normalizeThread(thread: CommentThread): CommentThread {\n if (isDetachedCommentAnchor(thread.anchor)) {\n return {\n ...thread,\n status: \"detached\",\n };\n }\n\n if (thread.status === \"detached\") {\n return {\n ...thread,\n status: thread.resolution ? \"resolved\" : \"open\",\n };\n }\n\n return thread;\n}\n\nfunction compareSidebarThreads(\n left: CommentSidebarThread,\n right: CommentSidebarThread,\n): number {\n const statusDelta = priorityForStatus(left.status) - priorityForStatus(right.status);\n if (statusDelta !== 0) {\n return statusDelta;\n }\n\n return left.createdAt.localeCompare(right.createdAt);\n}\n\nfunction priorityForStatus(status: CommentThreadStatus): number {\n switch (status) {\n case \"open\":\n return 0;\n case \"detached\":\n return 1;\n case \"resolved\":\n return 2;\n }\n}\n\nfunction summarizeBody(body: string): string {\n const collapsed = body.replace(/\\s+/g, \" \").trim();\n if (!collapsed) {\n return \"Empty thread\";\n }\n\n return collapsed.length > 80 ? `${collapsed.slice(0, 77)}...` : collapsed;\n}\n","import {\n normalizeCommentThreadRecord,\n type CommentThreadRecord,\n} from \"../../core/state/editor-state.ts\";\nimport {\n createCommentStore,\n type CommentStore,\n type CommentThread,\n} from \"./comment-store.ts\";\n\nexport function createCommentStoreFromRuntimeComments(\n comments: Record<string, CommentThreadRecord>,\n): CommentStore {\n const threads = Object.fromEntries(\n Object.values(comments).map((comment) => [\n comment.commentId,\n toCommentThread(comment),\n ]),\n );\n\n return createCommentStore(threads);\n}\n\nfunction toCommentThread(comment: CommentThreadRecord): CommentThread {\n const normalized = normalizeCommentThreadRecord(comment);\n\n return {\n commentId: normalized.commentId,\n anchor: normalized.anchor,\n status:\n normalized.anchor.kind === \"detached\"\n ? \"detached\"\n : normalized.status === \"resolved\"\n ? \"resolved\"\n : \"open\",\n entries: normalized.entries ?? [],\n createdBy: normalized.createdBy ?? normalized.authorId ?? \"unknown\",\n createdAt: normalized.createdAt,\n resolution: normalized.resolution,\n warningIds: [...(normalized.warningIds ?? [])],\n metadata: normalized.metadata,\n };\n}\n","import type { OpcRelationship } from \"../io/ooxml/part-manifest.ts\";\nimport { serializeMainDocument } from \"../io/export/serialize-main-document.ts\";\nimport {\n WORD_NUMBERING_CONTENT_TYPE,\n serializeNumberingXml,\n} from \"../io/export/serialize-numbering.ts\";\nimport { serializeRuntimeRevisionsIntoDocumentXml } from \"../io/export/serialize-runtime-revisions.ts\";\nimport { splitDocumentAtReviewBoundaries } from \"../io/export/split-review-boundaries.ts\";\nimport {\n createCommentExportIdMap,\n serializeCommentAnchorsIntoDocumentXml,\n serializeMergedCommentsXml,\n} from \"../io/export/serialize-comments.ts\";\nimport { createExportSession } from \"../io/export/export-session.ts\";\nimport {\n DOCX_DOCUMENT_CONTENT_TYPE,\n DOCX_MIME_TYPE,\n writeDocxPackage,\n} from \"../io/opc/docx-package.ts\";\nimport type { OpcPackage } from \"../io/opc/package-reader.ts\";\nimport { readOpcPackage } from \"../io/opc/package-reader.ts\";\nimport { createCommentStoreFromRuntimeComments } from \"../review/store/runtime-comment-store.ts\";\nimport type { RevisionRecord as ReviewRevisionRecord } from \"../review/store/revision-types.ts\";\nimport type { VersionCompareResult } from \"./diff-engine.ts\";\n\nconst MAIN_DOCUMENT_PATH = \"/word/document.xml\";\nconst NUMBERING_PART_PATH = \"/word/numbering.xml\";\nconst COMMENTS_PART_PATH = \"/word/comments.xml\";\nconst COMMENTS_EXTENDED_PART_PATH = \"/word/commentsExtended.xml\";\nconst COMMENTS_IDS_PART_PATH = \"/word/commentsIds.xml\";\nconst PEOPLE_PART_PATH = \"/word/people.xml\";\nconst NUMBERING_RELATIONSHIP_TYPE =\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/numbering\";\nconst COMMENTS_RELATIONSHIP_TYPE =\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments\";\nconst COMMENTS_EXTENDED_RELATIONSHIP_TYPE =\n \"http://schemas.microsoft.com/office/2011/relationships/commentsExtended\";\nconst COMMENTS_IDS_RELATIONSHIP_TYPE =\n \"http://schemas.microsoft.com/office/2016/09/relationships/commentsIds\";\nconst PEOPLE_RELATIONSHIP_TYPE =\n \"http://schemas.microsoft.com/office/2011/relationships/people\";\nconst COMMENTS_CONTENT_TYPE =\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml\";\nconst COMMENTS_EXTENDED_CONTENT_TYPE =\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.commentsExtended+xml\";\nconst COMMENTS_IDS_CONTENT_TYPE =\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.commentsIds+xml\";\nconst PEOPLE_CONTENT_TYPE =\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.people+xml\";\n\nexport interface ExportComparedDocumentOptions {\n fileName?: string;\n sourcePackage?: OpcPackage;\n}\n\nexport interface ExportComparedDocumentResult {\n bytes: Uint8Array;\n mimeType: string;\n fileName: string;\n}\n\nexport function exportComparedDocumentRedlines(\n result: VersionCompareResult,\n options: ExportComparedDocumentOptions = {},\n): ExportComparedDocumentResult {\n const sourcePackage =\n options.sourcePackage ??\n readOpcPackage(\n writeDocxPackage({\n documentXml: `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><w:document xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\"><w:body><w:p/><w:sectPr/></w:body></w:document>`,\n }),\n );\n const existingRelationships =\n sourcePackage.parts.get(MAIN_DOCUMENT_PATH)?.relationships ?? [];\n\n const commentThreads = Object.values(\n createCommentStoreFromRuntimeComments(result.comparedDocument.review.comments).threads,\n );\n const actionableRevisions = toReviewRevisionRecords(result.comparedDocument.review.revisions);\n const serialized = serializeMainDocument(\n splitDocumentAtReviewBoundaries(\n result.comparedDocument.content as never,\n commentThreads,\n actionableRevisions,\n ) as never,\n result.comparedDocument.preservation,\n existingRelationships,\n {\n media: result.comparedDocument.media,\n },\n );\n const revisionDocument = serializeRuntimeRevisionsIntoDocumentXml(\n serialized.documentXml,\n actionableRevisions,\n serialized.paragraphBoundaries,\n );\n if (revisionDocument.skippedRevisionIds.length > 0) {\n throw new Error(\n `Compare export skipped ${revisionDocument.skippedRevisionIds.length} revision markers.`,\n );\n }\n const exportCommentIds = createCommentExportIdMap(commentThreads);\n const serializedComments = serializeMergedCommentsXml(commentThreads, {\n exportCommentIds,\n });\n const annotatedDocument = serializeCommentAnchorsIntoDocumentXml(\n revisionDocument.documentXml,\n commentThreads,\n undefined,\n {\n exportCommentIds,\n },\n );\n if (annotatedDocument.skippedCommentIds.length > 0) {\n throw new Error(\n `Compare export skipped ${annotatedDocument.skippedCommentIds.length} comment anchors.`,\n );\n }\n\n const numberingXml = hasNumberingEntries(result.comparedDocument.numbering)\n ? serializeNumberingXml(result.comparedDocument.numbering)\n : undefined;\n const relationships = withOptionalRelatedPart(\n withOptionalRelatedPart(\n withOptionalRelatedPart(\n withOptionalRelatedPart(\n withOptionalRelatedPart(\n serialized.relationships,\n existingRelationships,\n NUMBERING_RELATIONSHIP_TYPE,\n \"numbering.xml\",\n Boolean(numberingXml),\n ),\n existingRelationships,\n COMMENTS_RELATIONSHIP_TYPE,\n \"comments.xml\",\n serializedComments.serializedCommentIds.length > 0,\n ),\n existingRelationships,\n COMMENTS_EXTENDED_RELATIONSHIP_TYPE,\n \"commentsExtended.xml\",\n Boolean(serializedComments.commentsExtendedXml),\n ),\n existingRelationships,\n COMMENTS_IDS_RELATIONSHIP_TYPE,\n \"commentsIds.xml\",\n Boolean(serializedComments.commentsIdsXml),\n ),\n existingRelationships,\n PEOPLE_RELATIONSHIP_TYPE,\n \"people.xml\",\n Boolean(serializedComments.peopleXml),\n );\n const exportSession = createExportSession(sourcePackage, [\n MAIN_DOCUMENT_PATH,\n ...(numberingXml ? [NUMBERING_PART_PATH] : []),\n ...(serializedComments.serializedCommentIds.length > 0 ? [COMMENTS_PART_PATH] : []),\n ...(serializedComments.commentsExtendedXml ? [COMMENTS_EXTENDED_PART_PATH] : []),\n ...(serializedComments.commentsIdsXml ? [COMMENTS_IDS_PART_PATH] : []),\n ...(serializedComments.peopleXml ? [PEOPLE_PART_PATH] : []),\n ]);\n\n exportSession.replaceOwnedPart({\n path: MAIN_DOCUMENT_PATH,\n bytes: new TextEncoder().encode(annotatedDocument.documentXml),\n contentType: DOCX_DOCUMENT_CONTENT_TYPE,\n relationships,\n });\n\n if (numberingXml) {\n exportSession.replaceOwnedPart({\n path: NUMBERING_PART_PATH,\n bytes: new TextEncoder().encode(numberingXml),\n contentType:\n sourcePackage.parts.get(NUMBERING_PART_PATH)?.contentType ?? WORD_NUMBERING_CONTENT_TYPE,\n });\n }\n\n if (serializedComments.serializedCommentIds.length > 0) {\n exportSession.replaceOwnedPart({\n path: COMMENTS_PART_PATH,\n bytes: new TextEncoder().encode(serializedComments.commentsXml),\n contentType:\n sourcePackage.parts.get(COMMENTS_PART_PATH)?.contentType ?? COMMENTS_CONTENT_TYPE,\n });\n }\n\n if (serializedComments.commentsExtendedXml) {\n exportSession.replaceOwnedPart({\n path: COMMENTS_EXTENDED_PART_PATH,\n bytes: new TextEncoder().encode(serializedComments.commentsExtendedXml),\n contentType:\n sourcePackage.parts.get(COMMENTS_EXTENDED_PART_PATH)?.contentType ??\n COMMENTS_EXTENDED_CONTENT_TYPE,\n });\n }\n\n if (serializedComments.commentsIdsXml) {\n exportSession.replaceOwnedPart({\n path: COMMENTS_IDS_PART_PATH,\n bytes: new TextEncoder().encode(serializedComments.commentsIdsXml),\n contentType:\n sourcePackage.parts.get(COMMENTS_IDS_PART_PATH)?.contentType ?? COMMENTS_IDS_CONTENT_TYPE,\n });\n }\n\n if (serializedComments.peopleXml) {\n exportSession.replaceOwnedPart({\n path: PEOPLE_PART_PATH,\n bytes: new TextEncoder().encode(serializedComments.peopleXml),\n contentType:\n sourcePackage.parts.get(PEOPLE_PART_PATH)?.contentType ?? PEOPLE_CONTENT_TYPE,\n });\n }\n\n return {\n bytes: exportSession.serialize(),\n mimeType: DOCX_MIME_TYPE,\n fileName: options.fileName ?? `${result.target.name}-compared.docx`,\n };\n}\n\nfunction toReviewRevisionRecords(\n revisions: VersionCompareResult[\"comparedDocument\"][\"review\"][\"revisions\"],\n): ReviewRevisionRecord[] {\n return Object.values(revisions).map((revision) => ({\n revisionId: revision.changeId,\n kind: revision.kind,\n anchor: revision.anchor,\n authorId: revision.authorId ?? \"Version Compare\",\n createdAt: revision.createdAt,\n warningIds: [...(revision.warningIds ?? [])],\n metadata: {\n source: revision.metadata?.source ?? \"runtime\",\n preserveOnlyReason: revision.metadata?.preserveOnlyReason,\n importedRevisionForm: revision.metadata?.importedRevisionForm,\n originalRevisionType: revision.metadata?.originalRevisionType,\n ooxmlRevisionId: revision.metadata?.ooxmlRevisionId,\n },\n status: revision.status === \"open\" ? \"active\" : revision.status,\n }));\n}\n\nfunction hasNumberingEntries(\n numbering: VersionCompareResult[\"comparedDocument\"][\"numbering\"],\n): boolean {\n return (\n Object.keys(numbering.abstractDefinitions).length > 0 ||\n Object.keys(numbering.instances).length > 0\n );\n}\n\nfunction withOptionalRelatedPart(\n relationships: readonly OpcRelationship[],\n existingRelationships: readonly OpcRelationship[],\n relationshipType: string,\n target: string,\n includePart: boolean,\n): OpcRelationship[] {\n const next = relationships.map((relationship) => ({ ...relationship }));\n if (!includePart) {\n return next;\n }\n\n const existing = next.find((relationship) => relationship.type === relationshipType);\n if (existing) {\n return next;\n }\n\n const fallbackId =\n existingRelationships.find((relationship) => relationship.type === relationshipType)?.id ??\n `rId${next.length + 1}`;\n next.push({\n id: fallbackId,\n type: relationshipType,\n target,\n targetMode: \"internal\",\n });\n return next;\n}\n","import {\n createCanonicalDocumentSignature,\n projectCanonicalDocument,\n type CanonicalDocument,\n} from \"../model/canonical-document.ts\";\n\nexport interface DocumentVersionSnapshot {\n snapshotVersion: \"document-version-snapshot/1\";\n versionId: string;\n name: string;\n createdAt: string;\n documentId: string;\n documentSignature: string;\n canonicalDocument: CanonicalDocument;\n}\n\nexport interface CreateDocumentVersionSnapshotOptions {\n versionId?: string;\n name: string;\n createdAt?: string;\n}\n\nexport function createDocumentVersionSnapshotId(\n document: Pick<CanonicalDocument, \"docId\">,\n name: string,\n): string {\n return `${document.docId}:${name}`;\n}\n\nexport function createDocumentVersionSnapshot(\n document: CanonicalDocument,\n options: CreateDocumentVersionSnapshotOptions,\n): DocumentVersionSnapshot {\n const canonicalDocument = projectCanonicalDocument(document);\n return {\n snapshotVersion: \"document-version-snapshot/1\",\n versionId:\n options.versionId ?? createDocumentVersionSnapshotId(canonicalDocument, options.name),\n name: options.name,\n createdAt: options.createdAt ?? canonicalDocument.updatedAt,\n documentId: canonicalDocument.docId,\n documentSignature: createCanonicalDocumentSignature(canonicalDocument),\n canonicalDocument,\n };\n}\n\nexport function saveDocumentVersionSnapshot(\n snapshots: readonly DocumentVersionSnapshot[],\n snapshot: DocumentVersionSnapshot,\n): DocumentVersionSnapshot[] {\n const next = snapshots.filter((entry) => entry.versionId !== snapshot.versionId);\n next.push(snapshot);\n return next.sort(compareDocumentVersionSnapshots);\n}\n\nexport interface VersionAuditEntry {\n versionId: string;\n name: string;\n createdAt: string;\n documentSignature: string;\n action: \"created\" | \"compared\" | \"locked\";\n}\n\nexport function buildVersionAuditTrail(\n snapshots: readonly DocumentVersionSnapshot[],\n): VersionAuditEntry[] {\n return snapshots.map((snapshot) => ({\n versionId: snapshot.versionId,\n name: snapshot.name,\n createdAt: snapshot.createdAt,\n documentSignature: snapshot.documentSignature,\n action: \"created\",\n }));\n}\n\nexport function lockDocumentVersionSnapshot(\n snapshot: DocumentVersionSnapshot,\n): DocumentVersionSnapshot {\n return {\n ...snapshot,\n name: snapshot.name.startsWith(\"[locked] \")\n ? snapshot.name\n : `[locked] ${snapshot.name}`,\n };\n}\n\nfunction compareDocumentVersionSnapshots(\n left: DocumentVersionSnapshot,\n right: DocumentVersionSnapshot,\n): number {\n const createdAtComparison = right.createdAt.localeCompare(left.createdAt);\n if (createdAtComparison !== 0) {\n return createdAtComparison;\n }\n\n return left.versionId.localeCompare(right.versionId);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAO,IAAM,qBAAqB;AAgC3B,IAAM,uBAAN,cAAmC,MAAM;AAAA,EACrC;AAAA,EAET,YAAY,SAAiB,QAAyC;AACpE,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,SAAS;AAAA,EAChB;AACF;AAEA,IAAM,eACJ;AACF,IAAM,uBACJ;AAEK,SAAS,cAAc,OAAkD;AAC9E,MAAI,UAAU,QAAQ,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,GAAG;AACvE,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,OAAO,eAAe,KAAK;AAC7C,SAAO,cAAc,OAAO,aAAa,cAAc;AACzD;AAEO,SAAS,iBAAiB,OAAiC;AAChE,SAAO,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,SAAS;AAC5D;AAEO,SAAS,OAAO,OAA+B;AACpD,SAAO,OAAO,UAAU,YAAY,aAAa,KAAK,KAAK;AAC7D;AAEO,SAAS,sBACd,OAC0B;AAC1B,SACE,OAAO,UAAU,YACjB,qBAAqB,KAAK,KAAK,KAC/B,CAAC,OAAO,MAAM,KAAK,MAAM,KAAK,CAAC;AAEnC;AAEO,SAAS,cACd,OACA,MACA,QACgC;AAChC,MAAI,CAAC,cAAc,KAAK,GAAG;AACzB,WAAO,KAAK,EAAE,MAAM,SAAS,2BAA2B,CAAC;AACzD,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEO,SAAS,aACd,OACA,MACA,QACe;AACf,MAAI,CAAC,iBAAiB,KAAK,GAAG;AAC5B,WAAO,KAAK,EAAE,MAAM,SAAS,+BAA+B,CAAC;AAC7D,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEO,SAAS,uBACd,OACA,MACA,QACe;AACf,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,KAAK,EAAE,MAAM,SAAS,qBAAqB,CAAC;AACnD,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEO,SAAS,kBACd,OACA,UACA,MACA,QACU;AACV,MAAI,UAAU,UAAU;AACtB,WAAO,KAAK;AAAA,MACV;AAAA,MACA,SAAS,YAAY,KAAK,UAAU,QAAQ,CAAC;AAAA,IAC/C,CAAC;AACD,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEO,SAAS,0BACd,OACA,MACA,QACwB;AACxB,MAAI,CAAC,sBAAsB,KAAK,GAAG;AACjC,WAAO,KAAK;AAAA,MACV;AAAA,MACA,SAAS;AAAA,IACX,CAAC;AACD,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEO,SAAS,WACd,OACA,MACA,QACa;AACb,MAAI,CAAC,OAAO,KAAK,GAAG;AAClB,WAAO,KAAK;AAAA,MACV;AAAA,MACA,SAAS;AAAA,IACX,CAAC;AACD,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEO,SAAS,eACd,QACoB;AACpB,SAAO,OAAO,QAAQ,MAAM,EAAE;AAAA,IAAK,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,MAChD,KAAK,cAAc,KAAK;AAAA,EAC1B;AACF;AAEO,SAAS,YACd,QACA,SACM;AACN,MAAI,OAAO,SAAS,GAAG;AACrB,UAAM,IAAI,qBAAqB,SAAS,MAAM;AAAA,EAChD;AACF;AAEA,SAAS,kBAAkB,OAA2B;AACpD,MACE,UAAU,QACV,OAAO,UAAU,YACjB,OAAO,UAAU,YACjB,OAAO,UAAU,WACjB;AACA,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,MAAM,IAAI,CAAC,SAAS,kBAAkB,IAAI,CAAC;AAAA,EACpD;AAEA,MAAI,CAAC,cAAc,KAAK,GAAG;AACzB,UAAM,IAAI,UAAU,kCAAkC;AAAA,EACxD;AAEA,QAAM,gBAAgB,eAAe,KAAK,EAAE;AAAA,IAC1C,CAAC,CAAC,EAAE,UAAU,MAAM,eAAe;AAAA,EACrC;AACA,QAAM,SAAqB,CAAC;AAE5B,aAAW,CAAC,KAAK,UAAU,KAAK,eAAe;AAC7C,WAAO,GAAG,IAAI,kBAAkB,UAAU;AAAA,EAC5C;AAEA,SAAO;AACT;AAEO,SAAS,gBAAgB,OAAwB;AACtD,SAAO,KAAK,UAAU,kBAAkB,KAAK,CAAC;AAChD;;;ACpMA,IAAM,oCAAoC;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,mCAAmC,CAAC,YAAY,eAAe;AAErE,IAAM,cAAc;AAAA,EAClB,SAAS;AAAA,EACT,qBAAqB;AAAA,EACrB,qBAAqB;AAAA,EACrB,SAAS;AAAA,EACT,WACE;AAAA,EACF,YACE;AAAA,EACF,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,cAAc;AAAA,EACd,iBAAiB;AAAA,EACjB,gBAAgB;AAClB;AA2/BO,SAAS,iCAAiC,UAA2B;AAC1E,SAAO,gBAAgB,QAAQ;AACjC;AAQO,SAAS,yBACd,UACmB;AACnB,0BAAwB,QAAQ;AAChC,SAAO,KAAK,MAAM,gBAAgB,QAAQ,CAAC;AAC7C;AAEO,SAAS,wBACd,OACoC;AACpC,QAAM,SAAS,0BAA0B,KAAK;AAC9C,cAAY,QAAQ,6BAA6B;AACnD;AAEO,SAAS,0BACd,OACwB;AACxB,QAAM,SAAiC,CAAC;AACxC,QAAM,SAAS,cAAc,OAAO,KAAK,MAAM;AAC/C,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,EACT;AAEA,0BAAwB,QAAQ,mCAAmC,KAAK,QAAQ,gCAAgC;AAChH,oBAAkB,OAAO,eAAe,oBAAoB,mBAAmB,MAAM;AACrF,aAAW,OAAO,OAAO,WAAW,MAAM;AAC1C,4BAA0B,OAAO,WAAW,eAAe,MAAM;AACjE,4BAA0B,OAAO,WAAW,eAAe,MAAM;AAEjE,mBAAiB,OAAO,UAAU,cAAc,MAAM;AACtD,wBAAsB,OAAO,QAAQ,YAAY,MAAM;AACvD,2BAAyB,OAAO,WAAW,eAAe,MAAM;AAChE,uBAAqB,OAAO,OAAO,WAAW,MAAM;AACpD,uBAAqB,OAAO,SAAS,aAAa,MAAM;AACxD,sBAAoB,OAAO,QAAQ,YAAY,MAAM;AACrD,4BAA0B,OAAO,cAAc,kBAAkB,MAAM;AACvE,0BAAwB,OAAO,aAAa,iBAAiB,MAAM;AACnE,MAAI,OAAO,aAAa,QAAW;AACjC,4BAAwB,OAAO,UAAU,cAAc,MAAM;AAAA,EAC/D;AACA,6BAA2B,QAAQ,MAAM;AAEzC,SAAO;AACT;AAEA,SAAS,iBACP,OACA,MACA,QACM;AACN,QAAM,SAAS,cAAc,OAAO,MAAM,MAAM;AAChD,MAAI,CAAC,QAAQ;AACX;AAAA,EACF;AAEA,QAAM,mBAAmB,cAAc,OAAO,kBAAkB,GAAG,IAAI,qBAAqB,MAAM;AAClG,MAAI,CAAC,kBAAkB;AACrB;AAAA,EACF;AAEA,aAAW,CAAC,aAAa,aAAa,KAAK,OAAO,QAAQ,gBAAgB,GAAG;AAC3E,QAAI,OAAO,kBAAkB,UAAU;AACrC,aAAO,KAAK;AAAA,QACV,MAAM,GAAG,IAAI,qBAAqB,WAAW;AAAA,QAC7C,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAEA,SAAS,sBACP,OACA,MACA,QACM;AACN,QAAM,SAAS,cAAc,OAAO,MAAM,MAAM;AAChD,MAAI,CAAC,QAAQ;AACX;AAAA,EACF;AAEA,mBAAiB,OAAO,YAAY,GAAG,IAAI,eAAe,MAAM;AAChE,mBAAiB,OAAO,YAAY,GAAG,IAAI,eAAe,MAAM;AAChE,mBAAiB,OAAO,QAAQ,GAAG,IAAI,WAAW,MAAM;AACxD,MAAI,OAAO,iBAAiB,QAAW;AACrC,2BAAuB,OAAO,cAAc,GAAG,IAAI,iBAAiB,MAAM;AAAA,EAC5E;AACF;AAEA,SAAS,iBACP,OACA,MACA,QACM;AACN,QAAM,SAAS,cAAc,OAAO,MAAM,MAAM;AAChD,MAAI,CAAC,QAAQ;AACX;AAAA,EACF;AAEA,aAAW,CAAC,SAAS,UAAU,KAAK,OAAO,QAAQ,MAAM,GAAG;AAC1D,uBAAmB,SAAS,WAAW,GAAG,IAAI,IAAI,OAAO,IAAI,MAAM;AACnE,UAAM,mBAAmB,cAAc,YAAY,GAAG,IAAI,IAAI,OAAO,IAAI,MAAM;AAC/E,QAAI,CAAC,kBAAkB;AACrB;AAAA,IACF;AACA,QAAI,iBAAiB,YAAY,SAAS;AACxC,aAAO,KAAK;AAAA,QACV,MAAM,GAAG,IAAI,IAAI,OAAO;AAAA,QACxB,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAEA,SAAS,uBACP,OACA,MACA,QACM;AACN,QAAM,SAAS,cAAc,OAAO,MAAM,MAAM;AAChD,MAAI,CAAC,QAAQ;AACX;AAAA,EACF;AAEA,aAAW,CAAC,WAAW,UAAU,KAAK,OAAO,QAAQ,MAAM,GAAG;AAC5D,UAAM,mBAAmB,cAAc,YAAY,GAAG,IAAI,IAAI,SAAS,IAAI,MAAM;AACjF,QAAI,CAAC,kBAAkB;AACrB;AAAA,IACF;AACA,QAAI,iBAAiB,SAAS,WAAW;AACvC,aAAO,KAAK;AAAA,QACV,MAAM,GAAG,IAAI,IAAI,SAAS;AAAA,QAC1B,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AACA,QAAI,iBAAiB,eAAe,UAAa,OAAO,iBAAiB,eAAe,UAAU;AAChG,aAAO,KAAK;AAAA,QACV,MAAM,GAAG,IAAI,IAAI,SAAS;AAAA,QAC1B,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAEA,SAAS,yBACP,OACA,MACA,QACM;AACN,QAAM,SAAS,cAAc,OAAO,MAAM,MAAM;AAChD,MAAI,CAAC,QAAQ;AACX;AAAA,EACF;AAEA,QAAM,sBAAsB;AAAA,IAC1B,OAAO;AAAA,IACP,GAAG,IAAI;AAAA,IACP;AAAA,EACF;AACA,MAAI,qBAAqB;AACvB,eAAW,CAAC,YAAY,UAAU,KAAK,OAAO,QAAQ,mBAAmB,GAAG;AAC1E;AAAA,QACE;AAAA,QACA;AAAA,QACA,GAAG,IAAI,wBAAwB,UAAU;AAAA,QACzC;AAAA,MACF;AACA,YAAM,mBAAmB;AAAA,QACvB;AAAA,QACA,GAAG,IAAI,wBAAwB,UAAU;AAAA,QACzC;AAAA,MACF;AACA,UAAI,oBAAoB,iBAAiB,wBAAwB,YAAY;AAC3E,eAAO,KAAK;AAAA,UACV,MAAM,GAAG,IAAI,wBAAwB,UAAU;AAAA,UAC/C,SAAS;AAAA,QACX,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,QAAM,YAAY,cAAc,OAAO,WAAW,GAAG,IAAI,cAAc,MAAM;AAC7E,MAAI,WAAW;AACb,eAAW,CAAC,YAAY,QAAQ,KAAK,OAAO,QAAQ,SAAS,GAAG;AAC9D;AAAA,QACE;AAAA,QACA;AAAA,QACA,GAAG,IAAI,cAAc,UAAU;AAAA,QAC/B;AAAA,MACF;AACA,YAAM,iBAAiB;AAAA,QACrB;AAAA,QACA,GAAG,IAAI,cAAc,UAAU;AAAA,QAC/B;AAAA,MACF;AACA,UAAI,CAAC,gBAAgB;AACnB;AAAA,MACF;AACA,UAAI,eAAe,wBAAwB,YAAY;AACrD,eAAO,KAAK;AAAA,UACV,MAAM,GAAG,IAAI,cAAc,UAAU;AAAA,UACrC,SAAS;AAAA,QACX,CAAC;AAAA,MACH;AACA;AAAA,QACE,eAAe;AAAA,QACf;AAAA,QACA,GAAG,IAAI,cAAc,UAAU;AAAA,QAC/B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,qBACP,OACA,MACA,QACM;AACN,QAAM,SAAS,cAAc,OAAO,MAAM,MAAM;AAChD,MAAI,CAAC,QAAQ;AACX;AAAA,EACF;AAEA,QAAM,QAAQ,cAAc,OAAO,OAAO,GAAG,IAAI,UAAU,MAAM;AACjE,MAAI,CAAC,OAAO;AACV;AAAA,EACF;AAEA,aAAW,CAAC,SAAS,IAAI,KAAK,OAAO,QAAQ,KAAK,GAAG;AACnD,uBAAmB,SAAS,WAAW,GAAG,IAAI,UAAU,OAAO,IAAI,MAAM;AACzE,UAAM,aAAa,cAAc,MAAM,GAAG,IAAI,UAAU,OAAO,IAAI,MAAM;AACzE,QAAI,CAAC,YAAY;AACf;AAAA,IACF;AACA,QAAI,WAAW,YAAY,SAAS;AAClC,aAAO,KAAK;AAAA,QACV,MAAM,GAAG,IAAI,UAAU,OAAO;AAAA,QAC9B,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AACA;AAAA,MACE,WAAW;AAAA,MACX;AAAA,MACA,GAAG,IAAI,UAAU,OAAO;AAAA,MACxB;AAAA,IACF;AACA,QAAI,WAAW,mBAAmB,QAAW;AAC3C;AAAA,QACE,WAAW;AAAA,QACX;AAAA,QACA,GAAG,IAAI,UAAU,OAAO;AAAA,QACxB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,qBACP,OACA,MACA,QACM;AACN,QAAM,SAAS,cAAc,OAAO,MAAM,MAAM;AAChD,MAAI,CAAC,QAAQ;AACX;AAAA,EACF;AAEA,QAAM,OAAO,aAAa,OAAO,MAAM,GAAG,IAAI,SAAS,MAAM;AAC7D,MAAI,CAAC,MAAM;AACT;AAAA,EACF;AAEA,UAAQ,MAAM;AAAA,IACZ,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,UAAI,CAAC,MAAM,QAAQ,OAAO,QAAQ,GAAG;AACnC,eAAO,KAAK,EAAE,MAAM,GAAG,IAAI,aAAa,SAAS,6BAA6B,CAAC;AAAA,MACjF,OAAO;AACL,eAAO,SAAS;AAAA,UAAQ,CAAC,OAAO,UAC9B,qBAAqB,OAAO,GAAG,IAAI,aAAa,KAAK,KAAK,MAAM;AAAA,QAClE;AAAA,MACF;AACA,UAAI,SAAS,eAAe,OAAO,YAAY,QAAW;AACxD,2BAAmB,OAAO,SAAS,WAAW,GAAG,IAAI,YAAY,MAAM;AAAA,MACzE;AACA,UAAI,SAAS,eAAe,OAAO,cAAc,QAAW;AAC1D,cAAM,YAAY,cAAc,OAAO,WAAW,GAAG,IAAI,cAAc,MAAM;AAC7E,YAAI,WAAW;AACb;AAAA,YACE,UAAU;AAAA,YACV;AAAA,YACA,GAAG,IAAI;AAAA,YACP;AAAA,UACF;AACA,cAAI,OAAO,UAAU,UAAU,UAAU;AACvC,mBAAO,KAAK;AAAA,cACV,MAAM,GAAG,IAAI;AAAA,cACb,SAAS;AAAA,YACX,CAAC;AAAA,UACH;AAAA,QACF;AAAA,MACF;AACA,UAAI,SAAS,aAAa;AACxB,qBAAa,OAAO,MAAM,GAAG,IAAI,SAAS,MAAM;AAAA,MAClD;AACA;AAAA,IACF,KAAK;AACH,yBAAmB,OAAO,gBAAgB,kBAAkB,GAAG,IAAI,mBAAmB,MAAM;AAC5F;AAAA,IACF,KAAK;AACH,yBAAmB,OAAO,SAAS,WAAW,GAAG,IAAI,YAAY,MAAM;AACvE,UAAI,OAAO,iBAAiB,QAAW;AACrC,qBAAa,OAAO,cAAc,GAAG,IAAI,iBAAiB,MAAM;AAAA,MAClE;AACA,UAAI,OAAO,YAAY,QAAW;AAChC,cAAM,UAAU,aAAa,OAAO,SAAS,GAAG,IAAI,YAAY,MAAM;AACtE,YAAI,WAAW,YAAY,YAAY,YAAY,YAAY;AAC7D,iBAAO,KAAK;AAAA,YACV,MAAM,GAAG,IAAI;AAAA,YACb,SAAS;AAAA,UACX,CAAC;AAAA,QACH;AAAA,MACF;AACA,UAAI,OAAO,aAAa,QAAW;AACjC,wCAAgC,OAAO,UAAU,GAAG,IAAI,aAAa,MAAM;AAAA,MAC7E;AACA;AAAA,IACF,KAAK;AAAA,IACL,KAAK;AACH,yBAAmB,OAAO,YAAY,cAAc,GAAG,IAAI,eAAe,MAAM;AAChF,yBAAmB,OAAO,WAAW,aAAa,GAAG,IAAI,cAAc,MAAM;AAC7E,UAAI,OAAO,WAAW,QAAW;AAC/B,qBAAa,OAAO,QAAQ,GAAG,IAAI,WAAW,MAAM;AAAA,MACtD;AACA;AAAA,IACF,KAAK;AACH,UAAI,CAAC,MAAM,QAAQ,OAAO,WAAW,GAAG;AACtC,eAAO,KAAK,EAAE,MAAM,GAAG,IAAI,gBAAgB,SAAS,gCAAgC,CAAC;AAAA,MACvF;AACA,UAAI,CAAC,MAAM,QAAQ,OAAO,IAAI,GAAG;AAC/B,eAAO,KAAK,EAAE,MAAM,GAAG,IAAI,SAAS,SAAS,yBAAyB,CAAC;AAAA,MACzE,OAAO;AACL,eAAO,KAAK;AAAA,UAAQ,CAAC,KAAK,aACxB,qBAAqB,KAAK,GAAG,IAAI,SAAS,QAAQ,KAAK,MAAM;AAAA,QAC/D;AAAA,MACF;AACA;AAAA,IACF,KAAK;AACH,UAAI,CAAC,MAAM,QAAQ,OAAO,KAAK,GAAG;AAChC,eAAO,KAAK,EAAE,MAAM,GAAG,IAAI,UAAU,SAAS,0BAA0B,CAAC;AAAA,MAC3E,OAAO;AACL,eAAO,MAAM;AAAA,UAAQ,CAAC,MAAM,cAC1B,qBAAqB,MAAM,GAAG,IAAI,UAAU,SAAS,KAAK,MAAM;AAAA,QAClE;AAAA,MACF;AACA;AAAA,IACF,KAAK;AACH,UAAI,CAAC,MAAM,QAAQ,OAAO,QAAQ,GAAG;AACnC,eAAO,KAAK,EAAE,MAAM,GAAG,IAAI,aAAa,SAAS,6BAA6B,CAAC;AAAA,MACjF,OAAO;AACL,eAAO,SAAS;AAAA,UAAQ,CAAC,OAAO,eAC9B,qBAAqB,OAAO,GAAG,IAAI,aAAa,UAAU,KAAK,MAAM;AAAA,QACvE;AAAA,MACF;AACA;AAAA,IACF,KAAK;AACH,mBAAa,OAAO,WAAW,GAAG,IAAI,cAAc,MAAM;AAC1D,mBAAa,OAAO,aAAa,GAAG,IAAI,gBAAgB,MAAM;AAC9D,UAAI,CAAC,MAAM,QAAQ,OAAO,QAAQ,GAAG;AACnC,eAAO,KAAK,EAAE,MAAM,GAAG,IAAI,aAAa,SAAS,6BAA6B,CAAC;AAAA,MACjF,OAAO;AACL,eAAO,SAAS;AAAA,UAAQ,CAAC,OAAO,UAC9B,qBAAqB,OAAO,GAAG,IAAI,aAAa,KAAK,KAAK,MAAM;AAAA,QAClE;AAAA,MACF;AACA;AAAA,IACF,KAAK;AACH,mBAAa,OAAO,YAAY,GAAG,IAAI,eAAe,MAAM;AAC5D,mBAAa,OAAO,MAAM,GAAG,IAAI,SAAS,MAAM;AAChD;AAAA,IACF,KAAK;AACH,mBAAa,OAAO,YAAY,GAAG,IAAI,eAAe,MAAM;AAC5D;AAAA,IACF,KAAK;AACH;AAAA,IACF,KAAK;AACH,UAAI,OAAO,OAAO,SAAS,UAAU;AACnC,eAAO,KAAK;AAAA,UACV,MAAM,GAAG,IAAI;AAAA,UACb,SAAS;AAAA,QACX,CAAC;AAAA,MACH;AACA;AAAA,IACF,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH;AAAA,IACF,KAAK;AACH,mBAAa,OAAO,MAAM,GAAG,IAAI,SAAS,MAAM;AAChD,UAAI,OAAO,SAAS,QAAW;AAC7B,qBAAa,OAAO,MAAM,GAAG,IAAI,SAAS,MAAM;AAAA,MAClD;AACA;AAAA,IACF,KAAK;AACH,mBAAa,OAAO,QAAQ,GAAG,IAAI,WAAW,MAAM;AACpD,UAAI,OAAO,aAAa,cAAc,OAAO,aAAa,WAAW;AACnE,eAAO,KAAK;AAAA,UACV,MAAM,GAAG,IAAI;AAAA,UACb,SAAS;AAAA,QACX,CAAC;AAAA,MACH;AACA;AAAA,IACF,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,mBAAa,OAAO,QAAQ,GAAG,IAAI,WAAW,MAAM;AACpD;AAAA,IACF;AACE,aAAO,KAAK;AAAA,QACV,MAAM,GAAG,IAAI;AAAA,QACb,SAAS,yBAAyB,KAAK,UAAU,IAAI,CAAC;AAAA,MACxD,CAAC;AAAA,EACL;AACF;AAEA,SAAS,gCACP,OACA,MACA,QACM;AACN,QAAM,SAAS,cAAc,OAAO,MAAM,MAAM;AAChD,MAAI,CAAC,QAAQ;AACX;AAAA,EACF;AAEA,MAAI,OAAO,uBAAuB,QAAW;AAC3C,iCAA6B,OAAO,oBAAoB,GAAG,IAAI,uBAAuB,MAAM;AAAA,EAC9F;AACA,MAAI,OAAO,qBAAqB,QAAW;AACzC,iCAA6B,OAAO,kBAAkB,GAAG,IAAI,qBAAqB,MAAM;AAAA,EAC1F;AACA,MAAI,OAAO,SAAS,QAAW;AAC7B,UAAM,OAAO,aAAa,OAAO,MAAM,GAAG,IAAI,SAAS,MAAM;AAC7D,QACE,QACA,SAAS,UACT,SAAS,YACT,SAAS,WACT,SAAS,aACT,SAAS,gBACT;AACA,aAAO,KAAK;AAAA,QACV,MAAM,GAAG,IAAI;AAAA,QACb,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAEA,SAAS,6BACP,OACA,MACA,QACM;AACN,QAAM,SAAS,cAAc,OAAO,MAAM,MAAM;AAChD,MAAI,CAAC,QAAQ;AACX;AAAA,EACF;AAEA,MAAI,OAAO,iBAAiB,QAAW;AACrC,iBAAa,OAAO,cAAc,GAAG,IAAI,iBAAiB,MAAM;AAAA,EAClE;AACA,MAAI,OAAO,UAAU,QAAW;AAC9B,iBAAa,OAAO,OAAO,GAAG,IAAI,UAAU,MAAM;AAAA,EACpD;AACA,MAAI,OAAO,WAAW,UAAa,OAAO,OAAO,WAAW,UAAU;AACpE,WAAO,KAAK;AAAA,MACV,MAAM,GAAG,IAAI;AAAA,MACb,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AACF;AAEA,SAAS,oBACP,OACA,MACA,QACM;AACN,QAAM,SAAS,cAAc,OAAO,MAAM,MAAM;AAChD,MAAI,CAAC,QAAQ;AACX;AAAA,EACF;AAEA,QAAM,WAAW,cAAc,OAAO,UAAU,GAAG,IAAI,aAAa,MAAM;AAC1E,MAAI,UAAU;AACZ,eAAW,CAAC,WAAW,MAAM,KAAK,OAAO,QAAQ,QAAQ,GAAG;AAC1D,yBAAmB,WAAW,aAAa,GAAG,IAAI,aAAa,SAAS,IAAI,MAAM;AAClF,YAAM,eAAe,cAAc,QAAQ,GAAG,IAAI,aAAa,SAAS,IAAI,MAAM;AAClF,UAAI,CAAC,cAAc;AACjB;AAAA,MACF;AACA,UAAI,aAAa,cAAc,WAAW;AACxC,eAAO,KAAK;AAAA,UACV,MAAM,GAAG,IAAI,aAAa,SAAS;AAAA,UACnC,SAAS;AAAA,QACX,CAAC;AAAA,MACH;AACA,qBAAe,aAAa,QAAQ,GAAG,IAAI,aAAa,SAAS,WAAW,MAAM;AAClF;AAAA,QACE,aAAa;AAAA,QACb,GAAG,IAAI,aAAa,SAAS;AAAA,QAC7B;AAAA,MACF;AACA,4BAAsB,aAAa,QAAQ,GAAG,IAAI,aAAa,SAAS,WAAW,MAAM;AACzF,UAAI,aAAa,cAAc,QAAW;AACxC;AAAA,UACE,aAAa;AAAA,UACb,GAAG,IAAI,aAAa,SAAS;AAAA,UAC7B;AAAA,QACF;AAAA,MACF;AACA,UAAI,aAAa,aAAa,QAAW;AACvC;AAAA,UACE,aAAa;AAAA,UACb,GAAG,IAAI,aAAa,SAAS;AAAA,UAC7B;AAAA,QACF;AAAA,MACF;AACA,UAAI,aAAa,SAAS,QAAW;AACnC;AAAA,UACE,aAAa;AAAA,UACb,GAAG,IAAI,aAAa,SAAS;AAAA,UAC7B;AAAA,QACF;AAAA,MACF;AACA,UAAI,CAAC,MAAM,QAAQ,aAAa,UAAU,GAAG;AAC3C,eAAO,KAAK;AAAA,UACV,MAAM,GAAG,IAAI,aAAa,SAAS;AAAA,UACnC,SAAS;AAAA,QACX,CAAC;AAAA,MACH,OAAO;AACL,qBAAa,WAAW;AAAA,UAAQ,CAAC,WAAW,UAC1C;AAAA,YACE;AAAA,YACA;AAAA,YACA,GAAG,IAAI,aAAa,SAAS,eAAe,KAAK;AAAA,YACjD;AAAA,UACF;AAAA,QACF;AAAA,MACF;AACA,UAAI,aAAa,YAAY,QAAW;AACtC;AAAA,UACE,aAAa;AAAA,UACb,GAAG,IAAI,aAAa,SAAS;AAAA,UAC7B;AAAA,QACF;AAAA,MACF;AACA,UAAI,aAAa,eAAe,QAAW;AACzC;AAAA,UACE,aAAa;AAAA,UACb,GAAG,IAAI,aAAa,SAAS;AAAA,UAC7B;AAAA,QACF;AAAA,MACF;AACA,UAAI,aAAa,eAAe,QAAW;AACzC;AAAA,UACE,aAAa;AAAA,UACb,GAAG,IAAI,aAAa,SAAS;AAAA,UAC7B;AAAA,QACF;AAAA,MACF;AACA,UACE,aAAa,eAAe,UAC5B,OAAO,aAAa,eAAe,WACnC;AACA,eAAO,KAAK;AAAA,UACV,MAAM,GAAG,IAAI,aAAa,SAAS;AAAA,UACnC,SAAS;AAAA,QACX,CAAC;AAAA,MACH;AACA,UAAI,aAAa,aAAa,QAAW;AACvC;AAAA,UACE,aAAa;AAAA,UACb,GAAG,IAAI,aAAa,SAAS;AAAA,UAC7B;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,YAAY,cAAc,OAAO,WAAW,GAAG,IAAI,cAAc,MAAM;AAC7E,MAAI,WAAW;AACb,eAAW,CAAC,YAAY,QAAQ,KAAK,OAAO,QAAQ,SAAS,GAAG;AAC9D,yBAAmB,YAAY,cAAc,GAAG,IAAI,cAAc,UAAU,IAAI,MAAM;AACtF,YAAM,iBAAiB;AAAA,QACrB;AAAA,QACA,GAAG,IAAI,cAAc,UAAU;AAAA,QAC/B;AAAA,MACF;AACA,UAAI,CAAC,gBAAgB;AACnB;AAAA,MACF;AACA,UAAI,eAAe,aAAa,YAAY;AAC1C,eAAO,KAAK;AAAA,UACV,MAAM,GAAG,IAAI,cAAc,UAAU;AAAA,UACrC,SAAS;AAAA,QACX,CAAC;AAAA,MACH;AACA,qBAAe,eAAe,QAAQ,GAAG,IAAI,cAAc,UAAU,WAAW,MAAM;AACtF,2BAAqB,eAAe,MAAM,GAAG,IAAI,cAAc,UAAU,SAAS,MAAM;AACxF;AAAA,QACE,eAAe;AAAA,QACf,GAAG,IAAI,cAAc,UAAU;AAAA,QAC/B;AAAA,MACF;AACA;AAAA,QACE,eAAe;AAAA,QACf,GAAG,IAAI,cAAc,UAAU;AAAA,QAC/B;AAAA,MACF;AACA,UAAI,eAAe,aAAa,QAAW;AACzC;AAAA,UACE,eAAe;AAAA,UACf,GAAG,IAAI,cAAc,UAAU;AAAA,UAC/B;AAAA,QACF;AAAA,MACF;AACA,UAAI,eAAe,eAAe,QAAW;AAC3C;AAAA,UACE,eAAe;AAAA,UACf,GAAG,IAAI,cAAc,UAAU;AAAA,UAC/B;AAAA,QACF;AAAA,MACF;AACA,UAAI,eAAe,aAAa,QAAW;AACzC;AAAA,UACE,eAAe;AAAA,UACf,GAAG,IAAI,cAAc,UAAU;AAAA,UAC/B;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,sBACP,OACA,MACA,QACM;AACN,MAAI,UAAU,UAAU,UAAU,cAAc,UAAU,YAAY;AACpE;AAAA,EACF;AACA,SAAO,KAAK;AAAA,IACV;AAAA,IACA,SAAS;AAAA,EACX,CAAC;AACH;AAEA,SAAS,uBACP,OACA,MACA,QACM;AACN,MAAI,CAAC,MAAM,QAAQ,KAAK,GAAG;AACzB,WAAO,KAAK;AAAA,MACV;AAAA,MACA,SAAS;AAAA,IACX,CAAC;AACD;AAAA,EACF;AAEA,QAAM,QAAQ,CAAC,OAAO,UAAU;AAC9B,UAAM,SAAS,cAAc,OAAO,GAAG,IAAI,IAAI,KAAK,KAAK,MAAM;AAC/D,QAAI,CAAC,QAAQ;AACX;AAAA,IACF;AACA,iBAAa,OAAO,SAAS,GAAG,IAAI,IAAI,KAAK,aAAa,MAAM;AAChE,iBAAa,OAAO,UAAU,GAAG,IAAI,IAAI,KAAK,cAAc,MAAM;AAClE,2BAAuB,OAAO,MAAM,GAAG,IAAI,IAAI,KAAK,UAAU,MAAM;AACpE,8BAA0B,OAAO,WAAW,GAAG,IAAI,IAAI,KAAK,eAAe,MAAM;AACjF,QAAI,OAAO,aAAa,QAAW;AACjC,mCAA6B,OAAO,UAAU,GAAG,IAAI,IAAI,KAAK,cAAc,MAAM;AAAA,IACpF;AAAA,EACF,CAAC;AACH;AAEA,SAAS,6BACP,OACA,MACA,QACM;AACN,QAAM,SAAS,cAAc,OAAO,MAAM,MAAM;AAChD,MAAI,CAAC,QAAQ;AACX;AAAA,EACF;AAEA,aAAW,SAAS;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAAY;AACV,QAAI,OAAO,KAAK,MAAM,QAAW;AAC/B,mBAAa,OAAO,KAAK,GAAG,GAAG,IAAI,IAAI,KAAK,IAAI,MAAM;AAAA,IACxD;AAAA,EACF;AACF;AAEA,SAAS,0BACP,OACA,MACA,QACM;AACN,QAAM,SAAS,cAAc,OAAO,MAAM,MAAM;AAChD,MAAI,CAAC,QAAQ;AACX;AAAA,EACF;AAEA,4BAA0B,OAAO,YAAY,GAAG,IAAI,eAAe,MAAM;AACzE,eAAa,OAAO,YAAY,GAAG,IAAI,eAAe,MAAM;AAC9D;AAEA,SAAS,8BACP,OACA,MACA,QACM;AACN,QAAM,SAAS,cAAc,OAAO,MAAM,MAAM;AAChD,MAAI,CAAC,QAAQ;AACX;AAAA,EACF;AAEA,MACE,OAAO,WAAW,UAClB,OAAO,WAAW,aAClB,OAAO,WAAW,UAClB;AACA,WAAO,KAAK;AAAA,MACV,MAAM,GAAG,IAAI;AAAA,MACb,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AACA,MAAI,OAAO,uBAAuB,QAAW;AAC3C,iBAAa,OAAO,oBAAoB,GAAG,IAAI,uBAAuB,MAAM;AAAA,EAC9E;AACA,MAAI,OAAO,eAAe,QAAW;AACnC,iBAAa,OAAO,YAAY,GAAG,IAAI,eAAe,MAAM;AAAA,EAC9D;AACF;AAEA,SAAS,qBACP,OACA,MACA,QACM;AACN,MACE,UAAU,eACV,UAAU,cACV,UAAU,gBACV,UAAU,UACV,UAAU,mBACV;AACA;AAAA,EACF;AACA,SAAO,KAAK;AAAA,IACV;AAAA,IACA,SAAS;AAAA,EACX,CAAC;AACH;AAEA,SAAS,uBACP,OACA,MACA,QACM;AACN,MACE,UAAU,UACV,UAAU,cACV,UAAU,cACV,UAAU,YACV;AACA;AAAA,EACF;AACA,SAAO,KAAK;AAAA,IACV;AAAA,IACA,SAAS;AAAA,EACX,CAAC;AACH;AAEA,SAAS,mBACP,OACA,MACA,QACM;AACN,MAAI,CAAC,MAAM,QAAQ,KAAK,GAAG;AACzB,WAAO,KAAK;AAAA,MACV;AAAA,MACA,SAAS;AAAA,IACX,CAAC;AACD;AAAA,EACF;AAEA,QAAM;AAAA,IAAQ,CAAC,WAAW,UACxB,mBAAmB,WAAW,aAAa,GAAG,IAAI,IAAI,KAAK,KAAK,MAAM;AAAA,EACxE;AACF;AAEA,SAAS,yBACP,OACA,MACA,QACM;AACN,QAAM,SAAS,cAAc,OAAO,MAAM,MAAM;AAChD,MAAI,CAAC,QAAQ;AACX;AAAA,EACF;AAEA,MACE,OAAO,WAAW,UAClB,OAAO,WAAW,aAClB,OAAO,WAAW,UAClB;AACA,WAAO,KAAK;AAAA,MACV,MAAM,GAAG,IAAI;AAAA,MACb,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AACA,aAAW,SAAS;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAAY;AACV,QAAI,OAAO,KAAK,MAAM,QAAW;AAC/B,mBAAa,OAAO,KAAK,GAAG,GAAG,IAAI,IAAI,KAAK,IAAI,MAAM;AAAA,IACxD;AAAA,EACF;AAEA,MAAI,OAAO,uBAAuB,QAAW;AAC3C,UAAM,MAAM,cAAc,OAAO,oBAAoB,GAAG,IAAI,uBAAuB,MAAM;AACzF,QAAI,KAAK;AACP,mBAAa,IAAI,QAAQ,GAAG,IAAI,8BAA8B,MAAM;AACpE,mBAAa,IAAI,WAAW,GAAG,IAAI,iCAAiC,MAAM;AAAA,IAC5E;AAAA,EACF;AAEA,MAAI,OAAO,aAAa,QAAW;AACjC,UAAM,KAAK,cAAc,OAAO,UAAU,GAAG,IAAI,aAAa,MAAM;AACpE,QAAI,IAAI;AACN,mBAAa,GAAG,QAAQ,GAAG,IAAI,oBAAoB,MAAM;AACzD,mBAAa,GAAG,WAAW,GAAG,IAAI,uBAAuB,MAAM;AAAA,IACjE;AAAA,EACF;AACF;AAEA,SAAS,0BACP,OACA,MACA,QACM;AACN,QAAM,SAAS,cAAc,OAAO,MAAM,MAAM;AAChD,MAAI,CAAC,QAAQ;AACX;AAAA,EACF;AAEA,QAAM,kBAAkB;AAAA,IACtB,OAAO;AAAA,IACP,GAAG,IAAI;AAAA,IACP;AAAA,EACF;AACA,MAAI,iBAAiB;AACnB,eAAW,CAAC,YAAY,QAAQ,KAAK,OAAO,QAAQ,eAAe,GAAG;AACpE,yBAAmB,YAAY,cAAc,GAAG,IAAI,oBAAoB,UAAU,IAAI,MAAM;AAC5F,YAAM,iBAAiB;AAAA,QACrB;AAAA,QACA,GAAG,IAAI,oBAAoB,UAAU;AAAA,QACrC;AAAA,MACF;AACA,UAAI,CAAC,gBAAgB;AACnB;AAAA,MACF;AACA,UAAI,eAAe,eAAe,YAAY;AAC5C,eAAO,KAAK;AAAA,UACV,MAAM,GAAG,IAAI,oBAAoB,UAAU;AAAA,UAC3C,SAAS;AAAA,QACX,CAAC;AAAA,MACH;AACA;AAAA,QACE,eAAe;AAAA,QACf,GAAG,IAAI,oBAAoB,UAAU;AAAA,QACrC;AAAA,MACF;AACA;AAAA,QACE,eAAe;AAAA,QACf;AAAA,QACA,GAAG,IAAI,oBAAoB,UAAU;AAAA,QACrC;AAAA,MACF;AACA,UAAI,eAAe,oBAAoB,QAAW;AAChD;AAAA,UACE,eAAe;AAAA,UACf;AAAA,UACA,GAAG,IAAI,oBAAoB,UAAU;AAAA,UACrC;AAAA,QACF;AAAA,MACF;AACA,UAAI,eAAe,mBAAmB,QAAW;AAC/C;AAAA,UACE,eAAe;AAAA,UACf;AAAA,UACA,GAAG,IAAI,oBAAoB,UAAU;AAAA,UACrC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,eAAe,cAAc,OAAO,cAAc,GAAG,IAAI,iBAAiB,MAAM;AACtF,MAAI,cAAc;AAChB,eAAW,CAAC,iBAAiB,WAAW,KAAK,OAAO,QAAQ,YAAY,GAAG;AACzE;AAAA,QACE;AAAA,QACA;AAAA,QACA,GAAG,IAAI,iBAAiB,eAAe;AAAA,QACvC;AAAA,MACF;AACA,YAAM,oBAAoB;AAAA,QACxB;AAAA,QACA,GAAG,IAAI,iBAAiB,eAAe;AAAA,QACvC;AAAA,MACF;AACA,UAAI,CAAC,mBAAmB;AACtB;AAAA,MACF;AACA,UAAI,kBAAkB,oBAAoB,iBAAiB;AACzD,eAAO,KAAK;AAAA,UACV,MAAM,GAAG,IAAI,iBAAiB,eAAe;AAAA,UAC7C,SAAS;AAAA,QACX,CAAC;AAAA,MACH;AACA,UAAI,MAAM,QAAQ,kBAAkB,eAAe,GAAG;AACpD,0BAAkB,gBAAgB;AAAA,UAAQ,CAAC,gBAAgB,UACzD;AAAA,YACE;AAAA,YACA;AAAA,YACA,GAAG,IAAI,iBAAiB,eAAe,oBAAoB,KAAK;AAAA,YAChE;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,wBACP,OACA,MACA,QACM;AACN,QAAM,SAAS,cAAc,OAAO,MAAM,MAAM;AAChD,MAAI,CAAC,QAAQ;AACX;AAAA,EACF;AAEA,MAAI,MAAM,QAAQ,OAAO,QAAQ,GAAG;AAClC,WAAO,SAAS,QAAQ,CAAC,SAAS,UAAU;AAC1C,YAAM,gBAAgB,cAAc,SAAS,GAAG,IAAI,aAAa,KAAK,KAAK,MAAM;AACjF,UAAI,CAAC,eAAe;AAClB;AAAA,MACF;AACA;AAAA,QACE,cAAc;AAAA,QACd;AAAA,QACA,GAAG,IAAI,aAAa,KAAK;AAAA,QACzB;AAAA,MACF;AACA;AAAA,QACE,cAAc;AAAA,QACd;AAAA,QACA,GAAG,IAAI,aAAa,KAAK;AAAA,QACzB;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAEA,MAAI,MAAM,QAAQ,OAAO,MAAM,GAAG;AAChC,WAAO,OAAO,QAAQ,CAAC,OAAO,UAAU;AACtC,YAAM,cAAc,cAAc,OAAO,GAAG,IAAI,WAAW,KAAK,KAAK,MAAM;AAC3E,UAAI,CAAC,aAAa;AAChB;AAAA,MACF;AACA;AAAA,QACE,YAAY;AAAA,QACZ;AAAA,QACA,GAAG,IAAI,WAAW,KAAK;AAAA,QACvB;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAEA,SAAS,eACP,OACA,MACA,QACM;AACN,QAAM,SAAS,cAAc,OAAO,MAAM,MAAM;AAChD,MAAI,CAAC,QAAQ;AACX;AAAA,EACF;AAEA,QAAM,OAAO,aAAa,OAAO,MAAM,GAAG,IAAI,SAAS,MAAM;AAC7D,MAAI,CAAC,MAAM;AACT;AAAA,EACF;AAEA,MAAI,SAAS,SAAS;AACpB,kBAAc,OAAO,OAAO,GAAG,IAAI,UAAU,MAAM;AACnD,0BAAsB,OAAO,OAAO,GAAG,IAAI,UAAU,MAAM;AAAA,EAC7D,WAAW,SAAS,QAAQ;AAC1B,QAAI,OAAO,OAAO,OAAO,UAAU;AACjC,aAAO,KAAK;AAAA,QACV,MAAM,GAAG,IAAI;AAAA,QACb,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AACA,QAAI,OAAO,UAAU,MAAM,OAAO,UAAU,GAAG;AAC7C,aAAO,KAAK;AAAA,QACV,MAAM,GAAG,IAAI;AAAA,QACb,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAAA,EACF,WAAW,SAAS,YAAY;AAC9B,kBAAc,OAAO,gBAAgB,GAAG,IAAI,mBAAmB,MAAM;AACrE,QACE,OAAO,WAAW,aAClB,OAAO,WAAW,kCAClB,OAAO,WAAW,mBAClB;AACA,aAAO,KAAK;AAAA,QACV,MAAM,GAAG,IAAI;AAAA,QACb,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAAA,EACF,OAAO;AACL,WAAO,KAAK;AAAA,MACV,MAAM,GAAG,IAAI;AAAA,MACb,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AACF;AAEA,SAAS,sBACP,OACA,MACA,QACM;AACN,QAAM,SAAS,cAAc,OAAO,MAAM,MAAM;AAChD,MAAI,CAAC,QAAQ;AACX;AAAA,EACF;AAEA,MAAI,OAAO,UAAU,MAAM,OAAO,UAAU,GAAG;AAC7C,WAAO,KAAK;AAAA,MACV,MAAM,GAAG,IAAI;AAAA,MACb,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AACA,MAAI,OAAO,QAAQ,MAAM,OAAO,QAAQ,GAAG;AACzC,WAAO,KAAK;AAAA,MACV,MAAM,GAAG,IAAI;AAAA,MACb,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AACF;AAEA,SAAS,2BACP,QACA,QACM;AACN,QAAM,oBAAoB,IAAI;AAAA,IAC5B,OAAO,KAAK,cAAc,cAAc,OAAO,QAAQ,YAAY,CAAC,CAAC,GAAG,YAAY,uBAAuB,CAAC,CAAC,KAAK,CAAC,CAAC;AAAA,EACtH;AACA,QAAM,uBAAuB,IAAI;AAAA,IAC/B,OAAO,KAAK,cAAc,cAAc,OAAO,WAAW,eAAe,CAAC,CAAC,GAAG,WAAW,yBAAyB,CAAC,CAAC,KAAK,CAAC,CAAC;AAAA,EAC7H;AACA,QAAM,uBAAuB,IAAI;AAAA,IAC/B,OAAO,KAAK,cAAc,cAAc,OAAO,WAAW,eAAe,CAAC,CAAC,GAAG,qBAAqB,mCAAmC,CAAC,CAAC,KAAK,CAAC,CAAC;AAAA,EACjJ;AACA,QAAM,WAAW,IAAI;AAAA,IACnB,OAAO,KAAK,cAAc,cAAc,OAAO,OAAO,WAAW,CAAC,CAAC,GAAG,OAAO,iBAAiB,CAAC,CAAC,KAAK,CAAC,CAAC;AAAA,EACzG;AACA,QAAM,aAAa,IAAI;AAAA,KACpB,MAAM,QAAQ,cAAc,OAAO,aAAa,iBAAiB,CAAC,CAAC,GAAG,QAAQ,IAC1E,cAAc,OAAO,aAAa,iBAAiB,CAAC,CAAC,GAAG,WACzD,CAAC,GACH,QAAQ,CAAC,YAAY,OAAO,QAAQ,cAAc,WAAW,CAAC,QAAQ,SAAS,IAAI,CAAC,CAAC;AAAA,EACzF;AACA,QAAM,cAAc,IAAI;AAAA,IACtB,OAAO,KAAK,cAAc,cAAc,OAAO,cAAc,kBAAkB,CAAC,CAAC,GAAG,iBAAiB,kCAAkC,CAAC,CAAC,KAAK,CAAC,CAAC;AAAA,EAClJ;AACA,QAAM,UAAU,eAAe,MAAM;AAErC,QAAM,qBAAqB;AAAA,IACzB,cAAc,OAAO,WAAW,eAAe,CAAC,CAAC,GAAG;AAAA,IACpD;AAAA,IACA,CAAC;AAAA,EACH;AACA,MAAI,oBAAoB;AACtB,eAAW,CAAC,YAAY,QAAQ,KAAK,OAAO,QAAQ,kBAAkB,GAAG;AACvE,YAAM,iBAAiB,cAAc,UAAU,yBAAyB,UAAU,IAAI,CAAC,CAAC;AACxF,UACE,kBACA,OAAO,eAAe,wBAAwB,YAC9C,CAAC,qBAAqB,IAAI,eAAe,mBAAmB,GAC5D;AACA,eAAO,KAAK;AAAA,UACV,MAAM,yBAAyB,UAAU;AAAA,UACzC,SAAS;AAAA,QACX,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,iCAA+B,OAAO,SAAS,aAAa,QAAQ;AAAA,IAClE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACD,4BAA0B,OAAO,UAAU,cAAc,QAAQ;AAAA,IAC/D;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACD,2BAAyB,OAAO,QAAQ,YAAY,QAAQ,UAAU;AACxE;AAEA,SAAS,+BACP,OACA,MACA,QACA,YAQM;AACN,QAAM,SAAS,cAAc,OAAO,MAAM,MAAM;AAChD,MAAI,CAAC,QAAQ;AACX;AAAA,EACF;AAEA,QAAM,OAAO,OAAO,OAAO,SAAS,WAAW,OAAO,OAAO;AAC7D,MAAI,SAAS,aAAa;AACxB,QACE,OAAO,OAAO,YAAY,YAC1B,CAAC,WAAW,kBAAkB,IAAI,OAAO,OAAO,GAChD;AACA,aAAO,KAAK;AAAA,QACV,MAAM,GAAG,IAAI;AAAA,QACb,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AACA,UAAM,YAAY,cAAc,OAAO,WAAW,GAAG,IAAI,cAAc,CAAC,CAAC;AACzE,QACE,aACA,OAAO,UAAU,wBAAwB,YACzC,CAAC,WAAW,qBAAqB,IAAI,UAAU,mBAAmB,GAClE;AACA,aAAO,KAAK;AAAA,QACV,MAAM,GAAG,IAAI;AAAA,QACb,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAAA,EACF,WAAW,SAAS,SAAS;AAC3B,QAAI,OAAO,OAAO,YAAY,YAAY,CAAC,WAAW,SAAS,IAAI,OAAO,OAAO,GAAG;AAClF,aAAO,KAAK;AAAA,QACV,MAAM,GAAG,IAAI;AAAA,QACb,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAAA,EACF,WAAW,SAAS,mBAAmB,SAAS,gBAAgB;AAC9D,QAAI,OAAO,OAAO,eAAe,YAAY,CAAC,WAAW,YAAY,IAAI,OAAO,UAAU,GAAG;AAC3F,aAAO,KAAK;AAAA,QACV,MAAM,GAAG,IAAI;AAAA,QACb,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AACA,QAAI,OAAO,OAAO,cAAc,YAAY,CAAC,WAAW,WAAW,IAAI,OAAO,SAAS,GAAG;AACxF,aAAO,KAAK;AAAA,QACV,MAAM,GAAG,IAAI;AAAA,QACb,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAAA,EACF,WAAW,SAAS,gBAAgB;AAClC,QAAI,OAAO,OAAO,WAAW,YAAY,CAAC,WAAW,QAAQ,IAAI,GAAG,OAAO,QAAQ,IAAI,OAAO,MAAM,EAAE,GAAG;AACvG,aAAO,KAAK;AAAA,QACV,MAAM,GAAG,IAAI;AAAA,QACb,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAAA,EACF;AAEA,MAAI,MAAM,QAAQ,OAAO,QAAQ,GAAG;AAClC,WAAO,SAAS;AAAA,MAAQ,CAAC,OAAO,UAC9B,+BAA+B,OAAO,GAAG,IAAI,aAAa,KAAK,KAAK,QAAQ,UAAU;AAAA,IACxF;AAAA,EACF;AACA,MAAI,MAAM,QAAQ,OAAO,IAAI,GAAG;AAC9B,WAAO,KAAK;AAAA,MAAQ,CAAC,KAAK,UACxB,+BAA+B,KAAK,GAAG,IAAI,SAAS,KAAK,KAAK,QAAQ,UAAU;AAAA,IAClF;AAAA,EACF;AACA,MAAI,MAAM,QAAQ,OAAO,KAAK,GAAG;AAC/B,WAAO,MAAM;AAAA,MAAQ,CAAC,MAAM,UAC1B,+BAA+B,MAAM,GAAG,IAAI,UAAU,KAAK,KAAK,QAAQ,UAAU;AAAA,IACpF;AAAA,EACF;AACF;AAEA,SAAS,yBACP,OACA,MACA,QACA,YACM;AACN,QAAM,SAAS,cAAc,OAAO,MAAM,MAAM;AAChD,MAAI,CAAC,QAAQ;AACX;AAAA,EACF;AAEA,QAAM,WAAW,cAAc,OAAO,UAAU,GAAG,IAAI,aAAa,CAAC,CAAC;AACtE,MAAI,UAAU;AACZ,eAAW,CAAC,WAAW,MAAM,KAAK,OAAO,QAAQ,QAAQ,GAAG;AAC1D,YAAM,eAAe,cAAc,QAAQ,GAAG,IAAI,aAAa,SAAS,IAAI,CAAC,CAAC;AAC9E,UAAI,CAAC,gBAAgB,CAAC,MAAM,QAAQ,aAAa,UAAU,GAAG;AAC5D;AAAA,MACF;AACA,mBAAa,WAAW,QAAQ,CAAC,WAAW,UAAU;AACpD,YAAI,OAAO,cAAc,YAAY,CAAC,WAAW,IAAI,SAAS,GAAG;AAC/D,iBAAO,KAAK;AAAA,YACV,MAAM,GAAG,IAAI,aAAa,SAAS,eAAe,KAAK;AAAA,YACvD,SAAS;AAAA,UACX,CAAC;AAAA,QACH;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,YAAY,cAAc,OAAO,WAAW,GAAG,IAAI,cAAc,CAAC,CAAC;AACzE,MAAI,WAAW;AACb,eAAW,CAAC,YAAY,QAAQ,KAAK,OAAO,QAAQ,SAAS,GAAG;AAC9D,YAAM,iBAAiB,cAAc,UAAU,GAAG,IAAI,cAAc,UAAU,IAAI,CAAC,CAAC;AACpF,UAAI,CAAC,kBAAkB,CAAC,MAAM,QAAQ,eAAe,UAAU,GAAG;AAChE;AAAA,MACF;AACA,qBAAe,WAAW,QAAQ,CAAC,WAAW,UAAU;AACtD,YAAI,OAAO,cAAc,YAAY,CAAC,WAAW,IAAI,SAAS,GAAG;AAC/D,iBAAO,KAAK;AAAA,YACV,MAAM,GAAG,IAAI,cAAc,UAAU,eAAe,KAAK;AAAA,YACzD,SAAS;AAAA,UACX,CAAC;AAAA,QACH;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAEA,SAAS,0BACP,OACA,MACA,QACA,YAQM;AACN,MAAI,UAAU,QAAW;AACvB;AAAA,EACF;AACA,QAAM,SAAS,cAAc,OAAO,MAAM,MAAM;AAChD,MAAI,CAAC,QAAQ;AACX;AAAA,EACF;AAEA,QAAM,UAAU,MAAM,QAAQ,OAAO,OAAO,IAAI,OAAO,UAAU,CAAC;AAClE,UAAQ,QAAQ,CAAC,QAAQ,UAAU;AACjC,UAAM,eAAe,cAAc,QAAQ,GAAG,IAAI,YAAY,KAAK,KAAK,CAAC,CAAC;AAC1E,QAAI,CAAC,gBAAgB,CAAC,MAAM,QAAQ,aAAa,MAAM,GAAG;AACxD;AAAA,IACF;AACA,iBAAa,OAAO;AAAA,MAAQ,CAAC,OAAO,eAClC,+BAA+B,OAAO,GAAG,IAAI,YAAY,KAAK,YAAY,UAAU,KAAK,QAAQ,UAAU;AAAA,IAC7G;AAAA,EACF,CAAC;AAED,QAAM,UAAU,MAAM,QAAQ,OAAO,OAAO,IAAI,OAAO,UAAU,CAAC;AAClE,UAAQ,QAAQ,CAAC,QAAQ,UAAU;AACjC,UAAM,eAAe,cAAc,QAAQ,GAAG,IAAI,YAAY,KAAK,KAAK,CAAC,CAAC;AAC1E,QAAI,CAAC,gBAAgB,CAAC,MAAM,QAAQ,aAAa,MAAM,GAAG;AACxD;AAAA,IACF;AACA,iBAAa,OAAO;AAAA,MAAQ,CAAC,OAAO,eAClC,+BAA+B,OAAO,GAAG,IAAI,YAAY,KAAK,YAAY,UAAU,KAAK,QAAQ,UAAU;AAAA,IAC7G;AAAA,EACF,CAAC;AAED,MAAI,OAAO,uBAAuB,QAAW;AAC3C,UAAM,qBAAqB,cAAc,OAAO,oBAAoB,GAAG,IAAI,uBAAuB,CAAC,CAAC;AACpG,UAAM,YAAY,cAAc,oBAAoB,WAAW,GAAG,IAAI,iCAAiC,CAAC,CAAC;AACzG,QAAI,WAAW;AACb,iBAAW,CAAC,QAAQ,IAAI,KAAK,OAAO,QAAQ,SAAS,GAAG;AACtD,cAAM,aAAa,cAAc,MAAM,GAAG,IAAI,iCAAiC,MAAM,IAAI,CAAC,CAAC;AAC3F,YAAI,CAAC,cAAc,CAAC,MAAM,QAAQ,WAAW,MAAM,GAAG;AACpD;AAAA,QACF;AACA,mBAAW,OAAO;AAAA,UAAQ,CAAC,OAAO,eAChC;AAAA,YACE;AAAA,YACA,GAAG,IAAI,iCAAiC,MAAM,WAAW,UAAU;AAAA,YACnE;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,UAAM,WAAW,cAAc,oBAAoB,UAAU,GAAG,IAAI,gCAAgC,CAAC,CAAC;AACtG,QAAI,UAAU;AACZ,iBAAW,CAAC,QAAQ,IAAI,KAAK,OAAO,QAAQ,QAAQ,GAAG;AACrD,cAAM,aAAa,cAAc,MAAM,GAAG,IAAI,gCAAgC,MAAM,IAAI,CAAC,CAAC;AAC1F,YAAI,CAAC,cAAc,CAAC,MAAM,QAAQ,WAAW,MAAM,GAAG;AACpD;AAAA,QACF;AACA,mBAAW,OAAO;AAAA,UAAQ,CAAC,OAAO,eAChC;AAAA,YACE;AAAA,YACA,GAAG,IAAI,gCAAgC,MAAM,WAAW,UAAU;AAAA,YAClE;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,eAAe,QAA8C;AACpE,QAAM,UAAU,oBAAI,IAAY;AAChC,QAAM,WAAW,cAAc,OAAO,UAAU,cAAc,CAAC,CAAC;AAChE,QAAM,qBAAqB,cAAc,UAAU,oBAAoB,iCAAiC,CAAC,CAAC;AAC1G,QAAM,YAAY,cAAc,oBAAoB,WAAW,2CAA2C,CAAC,CAAC;AAC5G,MAAI,WAAW;AACb,WAAO,KAAK,SAAS,EAAE,QAAQ,CAAC,WAAW,QAAQ,IAAI,YAAY,MAAM,EAAE,CAAC;AAAA,EAC9E;AACA,QAAM,WAAW,cAAc,oBAAoB,UAAU,0CAA0C,CAAC,CAAC;AACzG,MAAI,UAAU;AACZ,WAAO,KAAK,QAAQ,EAAE,QAAQ,CAAC,WAAW,QAAQ,IAAI,WAAW,MAAM,EAAE,CAAC;AAAA,EAC5E;AACA,SAAO;AACT;AAEA,SAAS,cACP,OACA,MACA,QACM;AACN,QAAM,SAAS,cAAc,OAAO,MAAM,MAAM;AAChD,MAAI,CAAC,QAAQ;AACX;AAAA,EACF;AAEA,MAAI,OAAO,OAAO,SAAS,YAAY,OAAO,OAAO,OAAO,UAAU;AACpE,WAAO,KAAK;AAAA,MACV;AAAA,MACA,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AACF;AAEA,SAAS,wBACP,QACA,cACA,MACA,QACA,qBACM;AACN,QAAM,aAAa,IAAI,IAAI,OAAO,KAAK,MAAM,CAAC;AAC9C,QAAM,WAAW,IAAI,IAAI,YAAY;AACrC,QAAM,WAAW,IAAI,IAAI,uBAAuB,CAAC,CAAC;AAElD,aAAW,eAAe,cAAc;AACtC,QAAI,CAAC,WAAW,IAAI,WAAW,GAAG;AAChC,aAAO,KAAK;AAAA,QACV;AAAA,QACA,SAAS,wBAAwB,KAAK,UAAU,WAAW,CAAC;AAAA,MAC9D,CAAC;AAAA,IACH;AAAA,EACF;AAEA,aAAW,aAAa,YAAY;AAClC,QAAI,CAAC,SAAS,IAAI,SAAS,KAAK,CAAC,SAAS,IAAI,SAAS,GAAG;AACxD,aAAO,KAAK;AAAA,QACV,MAAM,GAAG,IAAI,IAAI,SAAS;AAAA,QAC1B,SACE;AAAA,MACJ,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAEA,SAAS,wBACP,OACA,MACA,QACM;AACN,MAAI,UAAU,QAAW;AACvB;AAAA,EACF;AACA,QAAM,SAAS,cAAc,OAAO,MAAM,MAAM;AAChD,MAAI,CAAC,QAAQ;AACX;AAAA,EACF;AAEA,MAAI,OAAO,YAAY,QAAW;AAChC,QAAI,CAAC,MAAM,QAAQ,OAAO,OAAO,GAAG;AAClC,aAAO,KAAK,EAAE,MAAM,GAAG,IAAI,YAAY,SAAS,4BAA4B,CAAC;AAAA,IAC/E,OAAO;AACL,aAAO,QAAQ,QAAQ,CAAC,QAAQ,UAAU;AACxC,cAAM,eAAe,cAAc,QAAQ,GAAG,IAAI,YAAY,KAAK,KAAK,MAAM;AAC9E,YAAI,cAAc;AAChB,uBAAa,aAAa,SAAS,GAAG,IAAI,YAAY,KAAK,aAAa,MAAM;AAC9E,uBAAa,aAAa,UAAU,GAAG,IAAI,YAAY,KAAK,cAAc,MAAM;AAChF,uBAAa,aAAa,gBAAgB,GAAG,IAAI,YAAY,KAAK,oBAAoB,MAAM;AAC5F,cAAI,CAAC,MAAM,QAAQ,aAAa,MAAM,GAAG;AACvC,mBAAO,KAAK,EAAE,MAAM,GAAG,IAAI,YAAY,KAAK,YAAY,SAAS,2BAA2B,CAAC;AAAA,UAC/F,OAAO;AACL,yBAAa,OAAO;AAAA,cAAQ,CAAC,OAAO,eAClC,qBAAqB,OAAO,GAAG,IAAI,YAAY,KAAK,YAAY,UAAU,KAAK,MAAM;AAAA,YACvF;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,MAAI,OAAO,YAAY,QAAW;AAChC,QAAI,CAAC,MAAM,QAAQ,OAAO,OAAO,GAAG;AAClC,aAAO,KAAK,EAAE,MAAM,GAAG,IAAI,YAAY,SAAS,4BAA4B,CAAC;AAAA,IAC/E,OAAO;AACL,aAAO,QAAQ,QAAQ,CAAC,QAAQ,UAAU;AACxC,cAAM,eAAe,cAAc,QAAQ,GAAG,IAAI,YAAY,KAAK,KAAK,MAAM;AAC9E,YAAI,cAAc;AAChB,uBAAa,aAAa,SAAS,GAAG,IAAI,YAAY,KAAK,aAAa,MAAM;AAC9E,uBAAa,aAAa,UAAU,GAAG,IAAI,YAAY,KAAK,cAAc,MAAM;AAChF,uBAAa,aAAa,gBAAgB,GAAG,IAAI,YAAY,KAAK,oBAAoB,MAAM;AAC5F,cAAI,CAAC,MAAM,QAAQ,aAAa,MAAM,GAAG;AACvC,mBAAO,KAAK,EAAE,MAAM,GAAG,IAAI,YAAY,KAAK,YAAY,SAAS,2BAA2B,CAAC;AAAA,UAC/F,OAAO;AACL,yBAAa,OAAO;AAAA,cAAQ,CAAC,OAAO,eAClC,qBAAqB,OAAO,GAAG,IAAI,YAAY,KAAK,YAAY,UAAU,KAAK,MAAM;AAAA,YACvF;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,MAAI,OAAO,uBAAuB,QAAW;AAC3C,UAAM,qBAAqB,cAAc,OAAO,oBAAoB,GAAG,IAAI,uBAAuB,MAAM;AACxG,QAAI,oBAAoB;AACtB,6BAAuB,mBAAmB,WAAW,YAAY,GAAG,IAAI,iCAAiC,MAAM;AAC/G,6BAAuB,mBAAmB,UAAU,WAAW,GAAG,IAAI,gCAAgC,MAAM;AAAA,IAC9G;AAAA,EACF;AACF;AAEA,SAAS,uBACP,OACA,cACA,MACA,QACM;AACN,QAAM,SAAS,cAAc,OAAO,MAAM,MAAM;AAChD,MAAI,CAAC,QAAQ;AACX;AAAA,EACF;AAEA,aAAW,CAAC,QAAQ,IAAI,KAAK,OAAO,QAAQ,MAAM,GAAG;AACnD,UAAM,aAAa,cAAc,MAAM,GAAG,IAAI,IAAI,MAAM,IAAI,MAAM;AAClE,QAAI,CAAC,YAAY;AACf;AAAA,IACF;AACA,iBAAa,WAAW,QAAQ,GAAG,IAAI,IAAI,MAAM,WAAW,MAAM;AAClE,QAAI,WAAW,WAAW,QAAQ;AAChC,aAAO,KAAK;AAAA,QACV,MAAM,GAAG,IAAI,IAAI,MAAM;AAAA,QACvB,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AACA,QAAI,WAAW,SAAS,cAAc;AACpC,aAAO,KAAK;AAAA,QACV,MAAM,GAAG,IAAI,IAAI,MAAM;AAAA,QACvB,SAAS,gBAAgB,YAAY;AAAA,MACvC,CAAC;AAAA,IACH;AACA,QAAI,CAAC,MAAM,QAAQ,WAAW,MAAM,GAAG;AACrC,aAAO,KAAK,EAAE,MAAM,GAAG,IAAI,IAAI,MAAM,WAAW,SAAS,2BAA2B,CAAC;AAAA,IACvF,OAAO;AACL,iBAAW,OAAO;AAAA,QAAQ,CAAC,OAAO,eAChC,qBAAqB,OAAO,GAAG,IAAI,IAAI,MAAM,WAAW,UAAU,KAAK,MAAM;AAAA,MAC/E;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,mBACP,OACA,QACA,MACA,QACe;AACf,QAAM,WAAW,aAAa,OAAO,MAAM,MAAM;AACjD,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,YAAY,MAAM,EAAE,KAAK,QAAQ,GAAG;AACvC,WAAO,KAAK;AAAA,MACV;AAAA,MACA,SAAS,oBAAoB,MAAM;AAAA,IACrC,CAAC;AACD,WAAO;AAAA,EACT;AAEA,SAAO;AACT;;;AChgFO,SAAS,yBACd,MACA,QACA,UAA0C,CAAC,GACrB;AACtB,QAAM,aAAa,QAAQ,cAAc,OAAO;AAChD,QAAM,WAAW,QAAQ,YAAY;AACrC,QAAM,eAAe,KAAK;AAC1B,QAAM,iBAAiB,OAAO;AAC9B,QAAM,aAAa,aAAa,QAAQ;AACxC,QAAM,eAAe,eAAe,QAAQ;AAC5C,QAAM,UAAU;AAAA,IACd,WAAW,IAAI,qBAAqB;AAAA,IACpC,aAAa,IAAI,qBAAqB;AAAA,EACxC;AAEA,QAAM,eAA6B,CAAC;AACpC,QAAM,UAA2B,CAAC;AAClC,MAAI,gBAAgB;AACpB,MAAI,kBAAkB;AACtB,MAAI,mBAAmB;AAEvB,aAAW,SAAS,CAAC,GAAG,SAAS,EAAE,WAAW,WAAW,QAAQ,aAAa,aAAa,OAAO,CAAC,GAAG;AACpG,WAAO,gBAAgB,MAAM,aAAa,kBAAkB,MAAM,aAAa;AAC7E,YAAM,cAAc,gBAAgB,MAAM,YAAY,WAAW,aAAa,IAAI;AAClF,YAAM,cAAc,kBAAkB,MAAM,cAAc,aAAa,eAAe,IAAI;AAE1F,UAAI,eAAe,aAAa;AAC9B,YAAI,YAAY,SAAS,eAAe,YAAY,SAAS,aAAa;AACxE,gBAAM,iBAAiB,UAAU,gBAAgB;AACjD,8BAAoB;AACpB;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AACA,2BAAiB;AACjB,6BAAmB;AACnB;AAAA,QACF;AAEA,cAAM,aAAa,UAAU,gBAAgB;AAC7C,4BAAoB;AACpB;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAEA,cAAM,cAAc,UAAU,gBAAgB;AAC9C,4BAAoB;AACpB;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AACA,yBAAiB;AACjB,2BAAmB;AACnB;AAAA,MACF;AAEA,UAAI,aAAa;AACf,cAAM,WAAW,UAAU,gBAAgB;AAC3C,4BAAoB;AACpB;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AACA,yBAAiB;AACjB;AAAA,MACF;AAEA,UAAI,aAAa;AACf,cAAM,WAAW,UAAU,gBAAgB;AAC3C,4BAAoB;AACpB;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AACA,2BAAmB;AAAA,MACrB;AAAA,IACF;AAEA,QAAI,MAAM,YAAY,WAAW,UAAU,MAAM,cAAc,aAAa,QAAQ;AAClF,YAAM,WAAW,oBAAoB,WAAW,MAAM,SAAS,CAAC;AAChE,YAAM,aAAa,oBAAoB,aAAa,MAAM,WAAW,CAAC;AACtE,YAAM,aACJ,WAAW,MAAM,SAAS,EAAE,SAAS,eACrC,aAAa,MAAM,WAAW,EAAE,SAAS,eACzC,aAAa;AAEf,UAAI,YAAY;AACd,cAAM,cAAc,UAAU,gBAAgB;AAC9C,4BAAoB;AACpB;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA,WAAW,MAAM,SAAS;AAAA,UAC1B,aAAa,MAAM,WAAW;AAAA,UAC9B,MAAM;AAAA,QACR;AAAA,MACF,OAAO;AACL,qBAAa,KAAK;AAAA,UAChB,OAAO,WAAW,aAAa,MAAM,WAAW,CAAC;AAAA,UACjD,SAAS;AAAA,UACT,WAAW,aAAa,MAAM,WAAW,EAAE;AAAA,UAC3C,YAAY;AAAA,UACZ,WAAW;AAAA,QACb,CAAC;AAAA,MACH;AAEA,sBAAgB,MAAM,YAAY;AAClC,wBAAkB,MAAM,cAAc;AAAA,IACxC;AAAA,EACF;AAEA,QAAM,QAAQ,sBAAsB,cAAc,gBAAgB,cAAc,YAAY,QAAQ;AACpG,SAAO;AAAA,IACL,gBAAgB;AAAA,IAChB;AAAA,IACA,MAAM;AAAA,MACJ,WAAW,KAAK;AAAA,MAChB,MAAM,KAAK;AAAA,MACX,WAAW,KAAK;AAAA,IAClB;AAAA,IACA,QAAQ;AAAA,MACN,WAAW,OAAO;AAAA,MAClB,MAAM,OAAO;AAAA,MACb,WAAW,OAAO;AAAA,IACpB;AAAA,IACA;AAAA,IACA,kBAAkB;AAAA,EACpB;AACF;AAEA,SAAS,4BACP,cACA,SACA,UACA,OACA,WACA,aACM;AACN,QAAM,UAAU,MAAM,SAAS;AAC/B,QAAM,SAAS,WAAW,KAAK;AAC/B,QAAM,OAAO,oBAAoB,KAAK;AAEtC,eAAa,KAAK;AAAA,IAChB,GAAI,UAAU,EAAE,SAAS,IAAI,CAAC;AAAA,IAC9B,OAAO;AAAA,IACP,GAAI,UAAU,EAAE,aAAa,UAAU,IAAI,CAAC;AAAA,IAC5C;AAAA,IACA,WAAW,OAAO;AAAA,IAClB,GAAI,cAAc,aAAa,EAAE,YAAY,KAAK,IAAI,EAAE,WAAW,KAAK;AAAA,EAC1E,CAAC;AAED,UAAQ,KAAK;AAAA,IACX;AAAA,IACA,MACE,MAAM,SAAS,cACX,cAAc,cACZ,wBACA,uBACF,cAAc,cACZ,yBACA;AAAA,IACR;AAAA,IACA,WAAW,OAAO;AAAA,IAClB,GAAI,cAAc,aAAa,EAAE,YAAY,KAAK,IAAI,EAAE,WAAW,KAAK;AAAA,IACxE;AAAA,EACF,CAAC;AACH;AAEA,SAAS,8BACP,cACA,SACA,UACA,eACA,iBACA,aACM;AACN,QAAM,aAAa,oBAAoB,aAAa;AACpD,QAAM,YAAY,oBAAoB,eAAe;AAErD,eAAa,KAAK;AAAA,IAChB,UAAU,GAAG,QAAQ;AAAA,IACrB,OAAO,WAAW,aAAa;AAAA,IAC/B,aAAa;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA,IACX;AAAA,EACF,CAAC;AACD,eAAa,KAAK;AAAA,IAChB,UAAU,GAAG,QAAQ;AAAA,IACrB,OAAO,WAAW,eAAe;AAAA,IACjC,aAAa;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA,IACX;AAAA,EACF,CAAC;AAED,UAAQ,KAAK;AAAA,IACX;AAAA,IACA,MAAM;AAAA,IACN,SAAS;AAAA,IACT,WAAW;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACH;AAEA,SAAS,sBACP,MACA,QACA,SACA,YACA,UACmB;AACnB,QAAM,kBAA+B,CAAC;AACtC,QAAM,mBAAsC,CAAC;AAC7C,QAAM,sBAAsB,CAAC,GAAG,OAAO,YAAY,QAAQ;AAC3D,MAAI,iBAAiB;AACrB,MAAI,gBAAgB;AAEpB,WAAS,QAAQ,GAAG,QAAQ,QAAQ,QAAQ,SAAS,GAAG;AACtD,UAAM,QAAQ,QAAQ,KAAK;AAC3B,QAAI,CAAC,OAAO;AACV;AAAA,IACF;AAEA,oBAAgB,KAAK,MAAM,KAAK;AAChC,QAAI,MAAM,MAAM,SAAS,aAAa;AACpC,UAAI,MAAM,aAAa;AACrB,yBAAiB,KAAK;AAAA,UACpB,UAAU,MAAM,YAAY,UAAU,iBAAiB,SAAS,CAAC;AAAA,UACjE,MAAM,MAAM;AAAA,UACZ;AAAA,QACF,CAAC;AAAA,MACH;AACA,wBAAkB;AAClB;AAAA,IACF;AAEA,QAAI,CAAC,MAAM,SAAS;AAClB,0BAAoB,KAAK;AAAA,QACvB,cAAc,iCAAiC,aAAa;AAAA,QAC5D,WAAW,8BAA8B,aAAa;AAAA,QACtD,QAAQ;AAAA,QACR,SAAS,+BAA+B,MAAM,SAAS,IAAI,MAAM,aAAa,aAAa,WAAW;AAAA,MACxG,CAAC;AACD,uBAAiB;AAAA,IACnB;AAAA,EACF;AAEA,QAAM,YAAY;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,SAAO;AAAA,IACL,GAAG,yBAAyB,MAAM;AAAA,IAClC,WAAW;AAAA,IACX,QAAQ,mBAAmB,KAAK,QAAQ,OAAO,MAAM;AAAA,IACrD,WAAW,mBAAmB,KAAK,WAAW,OAAO,SAAS;AAAA,IAC9D,OAAO,mBAAmB,KAAK,OAAO,OAAO,KAAK;AAAA,IAClD,SAAS;AAAA,MACP,MAAM;AAAA,MACN,UAAU;AAAA,IACZ;AAAA,IACA,QAAQ;AAAA,MACN,UAAU,aAAa,OAAO,OAAO,QAAQ;AAAA,MAC7C;AAAA,IACF;AAAA,IACA,cAAc,wBAAwB,KAAK,cAAc,OAAO,YAAY;AAAA,IAC5E,aAAa;AAAA,MACX,UAAU;AAAA,MACV,QAAQ,CAAC,GAAG,OAAO,YAAY,MAAM;AAAA,IACvC;AAAA,IACA,GAAI,OAAO,YAAY,KAAK,WAAW,EAAE,UAAU,aAAa,OAAO,YAAY,KAAK,QAAQ,EAAE,IAAI,CAAC;AAAA,EACzG;AACF;AAEA,SAAS,+BACP,UACA,kBACA,WACA,UAC0C;AAC1C,QAAM,2BAA2B,oBAAI,IAAoB;AACzD,MAAI,SAAS;AACb,MAAI,iBAAiB;AACrB,MAAI,uBAAuB;AAE3B,aAAW,SAAS,UAAU;AAC5B,QAAI,MAAM,SAAS,aAAa;AAC9B,UAAI,sBAAsB;AACxB,kBAAU;AAAA,MACZ;AACA,gBAAU,mBAAmB,KAAK;AAClC,+BAAyB,IAAI,gBAAgB,MAAM;AACnD,wBAAkB;AAClB,6BAAuB;AACvB;AAAA,IACF;AAEA,cAAU;AACV,2BAAuB;AAAA,EACzB;AAEA,QAAM,UAA2C,CAAC;AAClD,mBAAiB,QAAQ,CAAC,aAAa;AACrC,UAAM,WAAW,yBAAyB,IAAI,SAAS,cAAc;AACrE,QAAI,aAAa,QAAW;AAC1B;AAAA,IACF;AAEA,UAAM,SAAyB;AAAA,MAC7B,UAAU,SAAS;AAAA,MACnB,MAAM,SAAS;AAAA,MACf,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,OAAO,EAAE,MAAM,UAAU,IAAI,SAAS;AAAA,QACtC,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE;AAAA,MAC7B;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,MACR,YAAY,CAAC;AAAA,MACb,UAAU;AAAA,QACR,QAAQ;AAAA,QACR,sBACE,SAAS,SAAS,cAAc,wBAAwB;AAAA,MAC5D;AAAA,IACF;AACA,YAAQ,KAAK,CAAC,SAAS,UAAU,MAAM,CAAC;AAAA,EAC1C,CAAC;AACD,SAAO,OAAO,YAAY,OAAO;AACnC;AAEA,SAAS,sBAAsB,OAA0B;AACvD,MAAI,MAAM,SAAS,aAAa;AAC9B,WAAO,aAAa,iCAAiC;AAAA,MACnD,GAAG;AAAA,MACH,UAAU,wBAAwB,MAAM,QAAQ;AAAA,IAClD,CAAC,CAAC;AAAA,EACJ;AAEA,SAAO,GAAG,MAAM,IAAI,IAAI,iCAAiC,KAAK,CAAC;AACjE;AAEA,SAAS,wBAAwB,UAA+C;AAC9E,SAAO,SAAS,IAAI,CAAC,UAAU;AAC7B,QAAI,MAAM,SAAS,aAAa;AAC9B,aAAO;AAAA,QACL,GAAG;AAAA,QACH,UAAU,wBAAwB,MAAM,QAAQ;AAAA,MAClD;AAAA,IACF;AACA,QAAI,MAAM,SAAS,SAAS;AAC1B,aAAO;AAAA,QACL,GAAG;AAAA,QACH,UAAU,wBAAwB,MAAM,QAAQ;AAAA,MAClD;AAAA,IACF;AACA,WAAO,aAAa,KAAK;AAAA,EAC3B,CAAC;AACH;AAEA,SAAS,WAAW,UAA6B,YAA2C;AAC1F,QAAM,SAAS,WAAW,SAAS;AACnC,QAAM,SAAS,MAAM;AAAA,IAAK,EAAE,QAAQ,SAAS,SAAS,EAAE;AAAA,IAAG,MACzD,MAAM,KAAK,EAAE,QAAQ,OAAO,GAAG,MAAM,CAAC;AAAA,EACxC;AAEA,WAASA,aAAY,SAAS,SAAS,GAAGA,cAAa,GAAGA,cAAa,GAAG;AACxE,aAASC,eAAc,WAAW,SAAS,GAAGA,gBAAe,GAAGA,gBAAe,GAAG;AAChF,aAAOD,UAAS,EAAEC,YAAW,IAC3B,SAASD,UAAS,MAAM,WAAWC,YAAW,IAC1C,OAAOD,aAAY,CAAC,EAAEC,eAAc,CAAC,IAAI,IACzC,KAAK,IAAI,OAAOD,aAAY,CAAC,EAAEC,YAAW,GAAG,OAAOD,UAAS,EAAEC,eAAc,CAAC,CAAC;AAAA,IACvF;AAAA,EACF;AAEA,QAAM,UAAsB,CAAC;AAC7B,MAAI,YAAY;AAChB,MAAI,cAAc;AAClB,SAAO,YAAY,SAAS,UAAU,cAAc,WAAW,QAAQ;AACrE,QAAI,SAAS,SAAS,MAAM,WAAW,WAAW,GAAG;AACnD,cAAQ,KAAK,EAAE,WAAW,YAAY,CAAC;AACvC,mBAAa;AACb,qBAAe;AACf;AAAA,IACF;AAEA,QAAI,OAAO,YAAY,CAAC,EAAE,WAAW,KAAK,OAAO,SAAS,EAAE,cAAc,CAAC,GAAG;AAC5E,mBAAa;AAAA,IACf,OAAO;AACL,qBAAe;AAAA,IACjB;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,mBAAmB,WAAkC;AAC5D,SAAO,UAAU,SAAS,OAAO,CAAC,QAAQ,UAAU,SAAS,gBAAgB,KAAK,GAAG,CAAC;AACxF;AAEA,SAAS,gBAAgB,MAA0B;AACjD,UAAQ,KAAK,MAAM;AAAA,IACjB,KAAK;AACH,aAAO,MAAM,KAAK,KAAK,IAAI,EAAE;AAAA,IAC/B,KAAK;AACH,aAAO,KAAK,SAAS,OAAO,CAAC,QAAQ,UAAU,SAAS,gBAAgB,KAAK,GAAG,CAAC;AAAA,IACnF,KAAK;AACH,aAAO,KAAK,SAAS,OAAO,CAAC,QAAQ,UAAU,SAAS,gBAAgB,KAAK,GAAG,CAAC;AAAA,IACnF,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,EACX;AACF;AAEA,SAAS,oBAAoB,OAA0B;AACrD,UAAQ,MAAM,MAAM;AAAA,IAClB,KAAK;AACH,aAAO,MAAM,SAAS,IAAI,oBAAoB,EAAE,KAAK,EAAE;AAAA,IACzD,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,EACX;AACF;AAEA,SAAS,qBAAqB,MAA0B;AACtD,UAAQ,KAAK,MAAM;AAAA,IACjB,KAAK;AACH,aAAO,KAAK;AAAA,IACd,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO,KAAK;AAAA,IACd,KAAK;AACH,aAAO,KAAK,SAAS,IAAI,oBAAoB,EAAE,KAAK,EAAE;AAAA,IACxD,KAAK;AACH,aAAO,KAAK,SAAS,IAAI,oBAAoB,EAAE,KAAK,EAAE;AAAA,IACxD,KAAK;AACH,aAAO,KAAK,WAAW;AAAA,IACzB,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO,KAAK,QAAQ;AAAA,IACtB,KAAK;AACH,aAAO,KAAK;AAAA,IACd,KAAK;AACH,aAAO,KAAK,QAAQ;AAAA,EACxB;AACF;AAEA,SAAS,mBACP,MACA,QAC6B;AAC7B,SAAO;AAAA,IACL,YAAY,EAAE,GAAG,KAAK,YAAY,GAAG,OAAO,WAAW;AAAA,IACvD,YAAY,EAAE,GAAG,KAAK,YAAY,GAAG,OAAO,WAAW;AAAA,IACvD,QAAQ,EAAE,GAAG,KAAK,QAAQ,GAAG,OAAO,OAAO;AAAA,IAC3C,GAAK,KAAK,gBAAgB,OAAO,eAC7B,EAAE,cAAc,EAAE,GAAI,KAAK,gBAAgB,CAAC,GAAI,GAAI,OAAO,gBAAgB,CAAC,EAAG,EAAE,IACjF,CAAC;AAAA,EACP;AACF;AAEA,SAAS,wBACP,MACA,QACmC;AACnC,SAAO;AAAA,IACL,iBAAiB;AAAA,MACf,GAAG,KAAK;AAAA,MACR,GAAG,OAAO;AAAA,IACZ;AAAA,IACA,cAAc;AAAA,MACZ,GAAG,KAAK;AAAA,MACR,GAAG,OAAO;AAAA,IACZ;AAAA,EACF;AACF;AAEA,SAAS,mBAAqC,MAAS,QAAc;AACnE,SAAO,aAAa,EAAE,GAAG,MAAM,GAAG,OAAO,CAAC;AAC5C;AAEA,SAAS,WAAgC,OAAa;AACpD,SAAO,aAAa,KAAK;AAC3B;AAEA,SAAS,aAAgB,OAAa;AACpC,SAAO,gBAAgB,KAAK;AAC9B;;;AC9kBO,SAAS,kBACd,OACA,YACkC;AAClC,SAAO,2BAA2B,KAAK,EAAE,UAAU;AACrD;AAqIA,SAAS,2BACP,OACsC;AACtC,SAAO,SAAS,OAAO,UAAU,YAAY,MAAM,mBAAmB,OAAO,MAAM,oBAAoB,WAClG,MAAM,kBACP,CAAC;AACP;;;AC7KO,SAAS,+BACd,UACA,eACA,yBACA,yBACM;AACN,MAAI,CAAC,YAAY,SAAS,gBAAgB,eAAe;AACvD;AAAA,EACF;AAEA,aAAW,kBAAkB,iCAAiC,SAAS,gBAAgB,GAAG;AACxF,QAAI,wBAAwB,IAAI,cAAc,GAAG;AAC/C;AAAA,IACF;AAEA,UAAM,eAAe,wBAAwB,IAAI,cAAc;AAC/D,QAAI,CAAC,cAAc;AACjB;AAAA,IACF;AAEA,kBAAc,KAAK,EAAE,GAAG,aAAa,CAAC;AACtC,4BAAwB,IAAI,cAAc;AAAA,EAC5C;AACF;AAkBO,SAAS,iCAAiC,KAA0B;AACzE,QAAM,kBAAkB,oBAAI,IAAY;AACxC,QAAM,sBAAsB;AAE5B,aAAW,SAAS,IAAI,SAAS,mBAAmB,GAAG;AACrD,UAAM,iBAAiB,MAAM,CAAC;AAC9B,QAAI,gBAAgB;AAClB,sBAAgB,IAAI,cAAc;AAAA,IACpC;AAAA,EACF;AAEA,SAAO;AACT;;;ACtDO,IAAM,kCAAkC;AACxC,IAAM,kCAAkC;AA2BxC,SAAS,sCACd,YACS;AACT,SAAO,WAAW,wBAAwB;AAC5C;AAEO,SAAS,qCACd,UACS;AACT,SACE,SAAS,wBAAwB,mCACjC,SAAS,wBAAwB;AAErC;;;ACrCO,IAAM,8BACX;AAEK,SAAS,sBAAsB,SAAmC;AACvE,QAAM,sBAAsB,OAAO,OAAO,QAAQ,mBAAmB,EAClE,OAAO,CAAC,eAAe,CAAC,sCAAsC,UAAU,CAAC,EACzE;AAAA,IAAK,CAAC,MAAM,UACX,qBAAqB,KAAK,qBAAqB,MAAM,mBAAmB;AAAA,EAC1E;AACF,QAAM,YAAY,OAAO,OAAO,QAAQ,SAAS,EAC9C,OAAO,CAAC,aAAa,CAAC,qCAAqC,QAAQ,CAAC,EACpE;AAAA,IAAK,CAAC,MAAM,UACX,qBAAqB,KAAK,qBAAqB,MAAM,mBAAmB;AAAA,EAC1E;AAEF,QAAM,OAAO;AAAA,IACX,GAAG,oBAAoB,IAAI,CAAC,eAAe,4BAA4B,UAAU,CAAC;AAAA,IAClF,GAAG,UAAU,IAAI,CAAC,aAAa,kBAAkB,QAAQ,CAAC;AAAA,EAC5D,EAAE,KAAK,EAAE;AAET,SAAO;AAAA,IACL;AAAA,IACA,uFAAuF,IAAI;AAAA,EAC7F,EAAE,KAAK,IAAI;AACb;AAaO,SAAS,sCACd,WACQ;AACR,MAAI,CAAC,WAAW;AACd,WAAO;AAAA,EACT;AAEA,SAAO,2BAA2B,UAAU,KAAK,sBAAsB;AAAA,IACrE,qBAAqB,UAAU,qBAAqB,MAAM;AAAA,EAC5D,CAAC;AACH;AAEA,SAAS,4BAA4B,YAAqE;AACxG,QAAM,gBAAgB;AAAA,IACpB,qBAAqB,WAAW,qBAAqB,eAAe;AAAA,EACtE;AACA,QAAM,SAAS,CAAC,GAAG,WAAW,MAAM,EACjC,KAAK,CAAC,MAAM,UAAU,KAAK,QAAQ,MAAM,KAAK,EAC9C,IAAI,CAAC,UAAU,eAAe,KAAK,CAAC,EACpC,KAAK,EAAE;AAEV,SAAO,mCAAmC,aAAa,KAAK,MAAM;AACpE;AAEA,SAAS,eAAe,OAAkF;AACxG,QAAM,QAAQ,MAAM,YAAY,SAAY,mBAAmB,MAAM,OAAO,QAAQ;AACpF,QAAM,iBAAiB,MAAM,mBACzB,oBAAoB,gBAAgB,MAAM,gBAAgB,CAAC,QAC3D;AACJ,QAAM,UAAU,MAAM,mBAAmB,eAAe;AACxD,QAAM,SAAS,MAAM,SAAS,kBAAkB,gBAAgB,MAAM,MAAM,CAAC,QAAQ;AAErF,SAAO,kBAAkB,MAAM,KAAK,KAAK,KAAK,oBAAoB;AAAA,IAChE,MAAM;AAAA,EACR,CAAC,wBAAwB,gBAAgB,MAAM,IAAI,CAAC,MAAM,cAAc,GAAG,OAAO,GAAG,MAAM;AAC7F;AAEA,SAAS,kBAAkB,UAAyD;AAClF,QAAM,QAAQ,gBAAgB,qBAAqB,SAAS,qBAAqB,MAAM,CAAC;AACxF,QAAM,gBAAgB;AAAA,IACpB,qBAAqB,SAAS,qBAAqB,eAAe;AAAA,EACpE;AACA,QAAM,YAAY,CAAC,GAAG,SAAS,SAAS,EACrC,KAAK,CAAC,MAAM,UAAU,KAAK,QAAQ,MAAM,KAAK,EAC9C,IAAI,CAAC,aAAa,kBAAkB,QAAQ,CAAC,EAC7C,KAAK,EAAE;AAEV,SAAO,mBAAmB,KAAK,6BAA6B,aAAa,MAAM,SAAS;AAC1F;AAEA,SAAS,kBAAkB,UAA8E;AACvG,QAAM,gBACJ,SAAS,YAAY,SAAY,2BAA2B,SAAS,OAAO,QAAQ;AACtF,SAAO,0BAA0B,SAAS,KAAK,KAAK,aAAa;AACnE;AAEA,SAAS,qBAAqB,MAAc,OAAuB;AACjE,SAAO,iBAAiB,IAAI,EAAE,cAAc,iBAAiB,KAAK,GAAG,MAAM,EAAE,SAAS,KAAK,CAAC;AAC9F;AAEA,SAAS,iBAAiB,OAAuB;AAC/C,SAAO,MAAM,QAAQ,wBAAwB,EAAE;AACjD;AAEA,SAAS,qBAAqB,OAAe,QAA0C;AACrF,SAAO,MAAM,WAAW,MAAM,IAAI,MAAM,MAAM,OAAO,MAAM,IAAI;AACjE;AAEA,SAAS,gBAAgB,OAAuB;AAC9C,SAAO,MACJ,QAAQ,MAAM,OAAO,EACrB,QAAQ,MAAM,QAAQ,EACtB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,MAAM;AACzB;;;AChGA,IAAM,8BACJ;AAmCK,SAAS,sBACd,SACA,eAAkC,EAAE,iBAAiB,CAAC,GAAG,cAAc,CAAC,EAAE,GAC1E,wBAAoD,CAAC,GACrD,UAAwC,CAAC,GACjB;AACxB,QAAM,wBACJ,sBAAsB,OAAO,CAAC,UAAU,iBAAiB;AACvD,UAAM,QAAQ,sBAAsB,KAAK,aAAa,EAAE;AACxD,WAAO,QAAQ,KAAK,IAAI,UAAU,OAAO,SAAS,MAAM,CAAC,KAAK,KAAK,EAAE,CAAC,IAAI;AAAA,EAC5E,GAAG,CAAC,IAAI;AACV,QAAM,QAA4B;AAAA,IAChC,gCAAgC;AAAA,IAChC,eAAe,sBAAsB;AAAA,MACnC,CAAC,iBAAiB,aAAa,SAAS;AAAA,IAC1C,EAAE,IAAI,iBAAiB;AAAA,IACvB,yBAAyB,IAAI;AAAA,MAC3B,sBAAsB,IAAI,CAAC,iBAAiB,CAAC,aAAa,IAAI,kBAAkB,YAAY,CAAC,CAAC;AAAA,IAChG;AAAA,IACA,yBAAyB,IAAI;AAAA,MAC3B,sBACG,OAAO,CAAC,iBAAiB,aAAa,SAAS,2BAA2B,EAC1E,IAAI,CAAC,iBAAiB,aAAa,EAAE;AAAA,IAC1C;AAAA,IACA,OAAO,QAAQ,SAAS,EAAE,OAAO,CAAC,EAAE;AAAA,IACpC;AAAA,EACF;AACA,QAAM,eAAe,cAAc,4BAA4B,QAAQ,oBAAoB,OAAO,CAAC;AACnG,QAAM,SAAS;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACX,QAAM,SAAS;AAAA;AACf,QAAM,aAAuB,CAAC;AAC9B,QAAM,sBAAmD,CAAC;AAC1D,MAAI,aAAa;AACjB,MAAI,uBAAuB,QAAQ,yBAC/B,8BAA8B,QAAQ,sBAAsB,IAC5D;AACJ,MAAI,SAAS;AACb,MAAI,iBAAiB;AACrB,MAAI,uBAAuB;AAE3B,aAAW,SAAS,QAAQ,UAAU;AACpC,QAAI,MAAM,SAAS,aAAa;AAC9B,UAAI,sBAAsB;AACxB,kBAAU;AAAA,MACZ;AAEA,wBAAkB;AAClB,YAAM,sBAAsB;AAAA,QAC1B;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,YAAM,kBAAkB,OAAO,SAAS;AACxC,iBAAW,KAAK,oBAAoB,GAAG;AACvC,oBAAc,oBAAoB,IAAI;AACtC,0BAAoB;AAAA,QAClB,wBAAwB,oBAAoB,UAAU,eAAe;AAAA,MACvE;AACA,eAAS,oBAAoB;AAC7B,6BAAuB;AACvB;AAAA,IACF;AAEA,QAAI,MAAM,SAAS,SAAS;AAC1B,YAAM,WAAW,mBAAmB,OAAO,KAAK;AAChD,iBAAW,KAAK,QAAQ;AACxB,oBAAc,SAAS;AACvB,gBAAU;AACV,6BAAuB;AACvB;AAAA,IACF;AAEA,QAAI,MAAM,SAAS,OAAO;AACxB,YAAM,SAAS,iBAAiB,OAAO,KAAK;AAC5C,iBAAW,KAAK,MAAM;AACtB,oBAAc,OAAO;AACrB,6BAAuB;AACvB;AAAA,IACF;AAEA,QAAI,MAAM,SAAS,cAAc;AAC/B,YAAM,YAAY,uBAAuB,OAAO,KAAK;AACrD,iBAAW,KAAK,SAAS;AACzB,oBAAc,UAAU;AACxB,6BAAuB;AACvB;AAAA,IACF;AAEA,QAAI,MAAM,SAAS,aAAa;AAC9B,YAAM,cAAc,sBAAsB,KAAK;AAC/C,iBAAW,KAAK,WAAW;AAC3B,oBAAc,YAAY;AAC1B,gBAAU;AACV,6BAAuB;AACvB;AAAA,IACF;AAEA,QAAI,MAAM,SAAS,iBAAiB;AAIlC,UAAI;AACJ,UAAI,MAAM,wBAAwB,MAAM,eAAe;AACrD,uBAAe,MAAM,wBAAwB,MAAM;AAAA,MACrD,WAAW,MAAM,mBAAmB;AAClC,uBAAe,8BAA8B,MAAM,iBAAiB;AAAA,MACtE,OAAO;AACL,uBAAe;AAAA,MACjB;AACA,YAAM,sBAAsB,eAAe,YAAY;AACvD,iBAAW,KAAK,mBAAmB;AACnC,oBAAc,oBAAoB;AAClC,gBAAU;AACV,6BAAuB;AACvB;AAAA,IACF;AAEA,UAAM,WAAW,qBAAqB,OAAO,KAAK;AAClD,QAAI,8BAA8B,QAAQ,GAAG;AAC3C,6BAAuB;AAAA,IACzB,OAAO;AACL,iBAAW,KAAK,QAAQ;AACxB,oBAAc,SAAS;AAAA,IACzB;AACA,cAAU;AACV,2BAAuB;AAAA,EACzB;AAEA,QAAM,UAAU,WAAW,KAAK,EAAE;AAClC,QAAM,cAAc,GAAG,MAAM,GAAG,WAAW,mCAAmC,GAAG,oBAAoB,GAAG,MAAM;AAE9G,SAAO;AAAA,IACL;AAAA,IACA,eAAe,MAAM;AAAA,IACrB;AAAA,EACF;AACF;AAEA,SAAS,qBACP,OACA,OACQ;AACR,SAAO,gBAAgB,MAAM,YAAY,KAAK;AAChD;AAEA,SAAS,mBACP,OACA,OACQ;AACR,QAAM,gBAAgB,MAAM,iBAAiB,wBAAwB,KAAK;AAC1E,QAAM,UACJ,MAAM,YAAY,SAAS,IACvB,cAAc,MAAM,YACjB,IAAI,CAAC,UAAU,mBAAmB,KAAK,KAAK,EAC5C,KAAK,EAAE,CAAC,iBACX;AACN,QAAM,UAAU,MAAM,KACnB,IAAI,CAAC,QAAQ;AACZ,UAAM,mBAAmB,IAAI,iBAAiB,2BAA2B,GAAG;AAC5E,UAAM,WAAW,IAAI,MAClB,IAAI,CAAC,SAAS,uBAAuB,MAAM,KAAK,CAAC,EACjD,KAAK,EAAE;AACV,WAAO,SAAS,gBAAgB,GAAG,QAAQ;AAAA,EAC7C,CAAC,EACA,KAAK,EAAE;AACV,SAAO,UAAU,aAAa,GAAG,OAAO,GAAG,OAAO;AACpD;AAEA,SAAS,uBACP,MACA,OACQ;AACR,QAAM,gBAAgB,KAAK,iBAAiB,uBAAuB,IAAI;AACvE,QAAM,YAAY,KAAK,SACpB,IAAI,CAAC,UAAU,mBAAmB,OAAO,KAAK,CAAC,EAC/C,KAAK,EAAE;AACV,SAAO,SAAS,aAAa,GAAG,aAAa,QAAQ;AACvD;AAEA,SAAS,mBACP,OACA,OACQ;AACR,UAAQ,MAAM,MAAM;AAAA,IAClB,KAAK;AACH,aAAO,4BAA4B,OAAO,KAAK;AAAA,IACjD,KAAK;AACH,aAAO,mBAAmB,OAAO,KAAK;AAAA,IACxC,KAAK;AACH,aAAO,iBAAiB,OAAO,KAAK;AAAA,IACtC,KAAK;AACH,aAAO,uBAAuB,OAAO,KAAK;AAAA,IAC5C,KAAK;AACH,aAAO,sBAAsB,KAAK;AAAA,IACpC,KAAK;AACH,aAAO,gBAAgB,MAAM,YAAY,KAAK;AAAA,IAChD,KAAK;AACH,UAAI,MAAM,wBAAwB,MAAM,eAAe;AACrD,eAAO,MAAM,wBAAwB,MAAM;AAAA,MAC7C;AACA,UAAI,MAAM,kBAAmB,QAAO,8BAA8B,MAAM,iBAAiB;AACzF,aAAO;AAAA,EACX;AACF;AAEA,SAAS,uBAAuB,MAA6B;AAC3D,QAAM,WAAqB,CAAC;AAC5B,MAAI,KAAK,YAAY,KAAK,WAAW,GAAG;AACtC,aAAS,KAAK,sBAAsB,KAAK,QAAQ,KAAK;AAAA,EACxD;AACA,MAAI,KAAK,eAAe;AACtB,aAAS;AAAA,MACP,KAAK,kBAAkB,YACnB,gCACA;AAAA,IACN;AAAA,EACF;AACA,SAAO,SAAS,SAAS,IAAI,WAAW,SAAS,KAAK,EAAE,CAAC,cAAc;AACzE;AAEA,SAAS,2BAA2B,KAAwC;AAC1E,QAAM,WAAqB,CAAC;AAC5B,MAAI,IAAI,eAAe,QAAW;AAChC,aAAS,KAAK,wBAAwB,IAAI,UAAU,KAAK;AAAA,EAC3D;AACA,MAAI,IAAI,aAAa;AACnB,aAAS,KAAK,mBAAmB,IAAI,YAAY,KAAK,aAAa,IAAI,YAAY,IAAI,KAAK;AAAA,EAC9F;AACA,MAAI,IAAI,cAAc,QAAW;AAC/B,aAAS,KAAK,uBAAuB,IAAI,SAAS,KAAK;AAAA,EACzD;AACA,MAAI,IAAI,YAAY;AAClB,aAAS,KAAK,kBAAkB,IAAI,WAAW,KAAK,aAAa,IAAI,WAAW,IAAI,KAAK;AAAA,EAC3F;AACA,MAAI,SAAS,WAAW,GAAG;AACzB,WAAO;AAAA,EACT;AACA,SAAO,WAAW,SAAS,KAAK,EAAE,CAAC;AACrC;AAEA,SAAS,iBACP,OACA,OACQ;AACR,QAAM,gBAAgB,MAAM,WAAW,iBAAiB,sBAAsB,KAAK;AACnF,QAAM,cAAc,MAAM,SAAS,IAAI,CAAC,UAAU,mBAAmB,OAAO,KAAK,CAAC,EAAE,KAAK,EAAE,KAAK;AAChG,SAAO,UAAU,aAAa,iBAAiB,WAAW;AAC5D;AAEA,SAAS,uBACP,OACA,OACQ;AACR,QAAM,QAAkB,CAAC;AACzB,MAAI,MAAM,KAAK;AACb,UAAM,KAAK,UAAUC,iBAAgB,MAAM,GAAG,CAAC,GAAG;AAAA,EACpD;AACA,MAAI,MAAM,SAAS;AACjB,UAAM,KAAK,cAAcA,iBAAgB,MAAM,OAAO,CAAC,GAAG;AAAA,EAC5D;AACA,QAAM,UAAU,MAAM,SAAS,IAAI,IAAI,MAAM,KAAK,GAAG,CAAC,KAAK;AAC3D,QAAM,cAAc,MAAM,SAAS,IAAI,CAAC,UAAU,mBAAmB,OAAO,KAAK,CAAC,EAAE,KAAK,EAAE;AAC3F,SAAO,eAAe,OAAO,IAAI,eAAe,QAAQ;AAC1D;AAEA,SAAS,sBACP,OACQ;AACR,SAAO,qBAAqBA,iBAAgB,MAAM,cAAc,CAAC;AACnE;AAEA,SAAS,sBAAsB,OAAwB;AACrD,QAAM,WAAqB,CAAC;AAC5B,MAAI,MAAM,WAAW,OAAO;AAC1B,aAAS,KAAK,mBAAmBA,iBAAgB,MAAM,WAAW,KAAK,CAAC,KAAK;AAAA,EAC/E;AACA,MAAI,MAAM,WAAW,KAAK;AACxB,aAAS,KAAK,iBAAiBA,iBAAgB,MAAM,WAAW,GAAG,CAAC,KAAK;AAAA,EAC3E;AACA,MAAI,MAAM,WAAW,MAAM;AACzB,aAAS,KAAK,kBAAkBA,iBAAgB,MAAM,WAAW,IAAI,CAAC,KAAK;AAAA,EAC7E;AACA,MAAI,MAAM,WAAW,eAAe;AAClC,aAAS,KAAK,oBAAoB;AAAA,EACpC;AACA,MAAI,MAAM,WAAW,UAAU;AAC7B,UAAM,KAAK,MAAM,WAAW;AAC5B,UAAM,UAAoB,CAAC;AAC3B,YAAQ,KAAK,yBAAyB,GAAG,UAAU,MAAM,GAAG,KAAK;AACjE,QAAI,GAAG,YAAa,SAAQ,KAAK,8BAA8BA,iBAAgB,GAAG,WAAW,CAAC,KAAK;AACnG,QAAI,GAAG,cAAe,SAAQ,KAAK,gCAAgCA,iBAAgB,GAAG,aAAa,CAAC,KAAK;AACzG,aAAS,KAAK,iBAAiB,QAAQ,KAAK,EAAE,CAAC,iBAAiB;AAAA,EAClE,WAAW,MAAM,WAAW,YAAY;AACtC,UAAM,KAAK,MAAM,WAAW;AAC5B,UAAM,YAAY,GAAG,WAAW,gBAAgBA,iBAAgB,GAAG,QAAQ,CAAC,MAAM;AAClF,UAAM,UAAoB,CAAC;AAC3B,QAAI,GAAG,WAAY,SAAQ,KAAK,wBAAwBA,iBAAgB,GAAG,UAAU,CAAC,KAAK;AAC3F,QAAI,GAAG,IAAK,SAAQ,KAAK,iBAAiBA,iBAAgB,GAAG,GAAG,CAAC,KAAK;AACtE,aAAS,KAAK,QAAQ,SAAS,IAAI,UAAU,SAAS,IAAI,QAAQ,KAAK,EAAE,CAAC,cAAc,UAAU,SAAS,IAAI;AAAA,EACjH,WAAW,MAAM,WAAW,cAAc;AACxC,UAAM,QAAQ,MAAM,WAAW,aAAa,IAAI,CAAC,SAAS;AACxD,YAAM,KAAK,KAAK,cAAc,mBAAmBA,iBAAgB,KAAK,WAAW,CAAC,MAAM;AACxF,aAAO,cAAc,EAAE,aAAaA,iBAAgB,KAAK,KAAK,CAAC;AAAA,IACjE,CAAC,EAAE,KAAK,EAAE;AACV,aAAS,KAAK,mBAAmB,KAAK,mBAAmB;AAAA,EAC3D,WAAW,MAAM,WAAW,UAAU;AACpC,UAAM,QAAQ,MAAM,WAAW,SAAS,IAAI,CAAC,SAAS;AACpD,YAAM,KAAK,KAAK,cAAc,mBAAmBA,iBAAgB,KAAK,WAAW,CAAC,MAAM;AACxF,aAAO,cAAc,EAAE,aAAaA,iBAAgB,KAAK,KAAK,CAAC;AAAA,IACjE,CAAC,EAAE,KAAK,EAAE;AACV,aAAS,KAAK,eAAe,KAAK,eAAe;AAAA,EACnD,WAAW,MAAM,WAAW,YAAY,aAAa;AACnD,aAAS,KAAK,WAAW;AAAA,EAC3B,WAAW,MAAM,WAAW,YAAY,YAAY;AAClD,aAAS,KAAK,eAAe;AAAA,EAC/B,WAAW,MAAM,WAAW,SAAS;AACnC,aAAS,KAAK,MAAM,MAAM,WAAW,OAAO,IAAI;AAAA,EAClD;AACA,SAAO,SAAS,SAAS,IAAI,YAAY,SAAS,KAAK,EAAE,CAAC,eAAe;AAC3E;AAEA,SAAS,4BACP,WACA,OACQ;AACR,MAAI,MAAM;AACV,QAAM,yBAAyB,4BAA4B,SAAS;AACpE,MAAI,uBAAuB,SAAS,GAAG;AACrC,WAAO;AAAA,EACT;AACA,QAAM,cAAc,UAAU,SAAS,IAAI,CAAC,UAAU,yBAAyB,OAAO,KAAK,CAAC,EAAE,KAAK,EAAE;AACrG,SAAO,eAAe;AACtB,SAAO;AACP,SAAO;AACT;AAEA,SAAS,yBACP,MACA,OACQ;AACR,UAAQ,KAAK,MAAM;AAAA,IACjB,KAAK,QAAQ;AACX,YAAM,QAAQ,KAAK;AACnB,YAAM,aAAa,gCAAgC,KAAK;AACxD,YAAM,WAAW,uBAAuB,KAAK,IAAI,IAAI,0BAA0B;AAC/E,aAAO,QAAQ,UAAU,OAAO,QAAQ,IAAI,UAAU,KAAK,IAAI,CAAC;AAAA,IAClE;AAAA,IACA,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK,UAAU;AACb,YAAM,aAAa,gCAAgC,KAAK,KAAK;AAC7D,YAAM,gBAAgB,KAAK,OAAO,YAAYA,iBAAgB,KAAK,IAAI,CAAC,MAAM;AAC9E,aAAO,QAAQ,UAAU,SAAS,aAAa,YAAYA,iBAAgB,KAAK,IAAI,CAAC;AAAA,IACvF;AAAA,IACA,KAAK;AACH,aAAO,mBAAmB,MAAM,KAAK;AAAA,IACvC,KAAK;AACH,aAAO,gBAAgB,KAAK,YAAY,KAAK;AAAA,IAC/C,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO,iBAAiB,KAAK,MAAM;AAAA,IACrC,KAAK,aAAa;AAChB,YAAM,gBAAgB,KAAK,KAAK,WAAW,GAAG,IAC1C,0BAA0BA,iBAAgB,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,QAC5D,MAAM;AACL,cAAM,iBAAiB,eAAe,MAAM,8BAA8B;AAC1E,cAAM,kCAAkC;AACxC,cAAM,cAAc,KAAK;AAAA,UACvB,IAAI;AAAA,UACJ,MAAM;AAAA,UACN,QAAQ,KAAK;AAAA,UACb,YAAY;AAAA,QACd,CAAC;AACD,cAAM,wBAAwB,IAAI,cAAc;AAChD,eAAO,sBAAsB,cAAc;AAAA,MAC7C,GAAG;AACP,YAAM,cAAc,KAAK,SAAS,IAAI,CAAC,UAAU,yBAAyB,OAAO,KAAK,CAAC,EAAE,KAAK,EAAE;AAChG,aAAO,GAAG,aAAa,GAAG,WAAW;AAAA,IACvC;AAAA,IACA,KAAK,SAAS;AACZ,UAAI,KAAK,YAAY,KAAK,SAAS,SAAS,GAAG;AAC7C,cAAM,cAAc,KAAK,SACtB,IAAI,CAAC,UAAU,yBAAyB,OAAO,KAAK,CAAC,EACrD,KAAK,EAAE;AACV,YAAI,KAAK,cAAc,WAAW;AAChC,iBACE,wFAC2C,UAAU,KAAK,WAAW,CAAC,0EAEtE,cACA;AAAA,QAEJ;AACA,eAAO,yBAAyBA,iBAAgB,KAAK,WAAW,CAAC,KAAK,WAAW;AAAA,MACnF;AACA,aAAO,yBAAyBA,iBAAgB,KAAK,WAAW,CAAC;AAAA,IACnE;AAAA,IACA,KAAK;AACH,aACE,0BAA0BA,iBAAgB,KAAK,UAAU,CAAC,aAC9CA,iBAAgB,KAAK,IAAI,CAAC;AAAA,IAE1C,KAAK;AACH,aAAO,wBAAwBA,iBAAgB,KAAK,UAAU,CAAC;AAAA,IACjE,KAAK,gBAAgB;AACnB,YAAM,aACJ,KAAK,aAAa,aACd,8BAA8BA,iBAAgB,KAAK,MAAM,CAAC,QAC1D,6BAA6BA,iBAAgB,KAAK,MAAM,CAAC;AAC/D,YAAM,WACJ,KAAK,aAAa,aACd,sBACA;AACN,aAAO,gCAAgC,QAAQ,cAAc,UAAU;AAAA,IACzE;AAAA,IACA;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,4BAA4B,WAAkC;AACrE,QAAM,WAAqB,CAAC;AAE5B,MAAI,UAAU,SAAS;AACrB,aAAS,KAAK,oBAAoBA,iBAAgB,UAAU,OAAO,CAAC,KAAK;AAAA,EAC3E;AACA,MAAI,UAAU,UAAU;AACtB,aAAS,KAAK,eAAe;AAAA,EAC/B;AACA,MAAI,UAAU,WAAW;AACvB,aAAS,KAAK,gBAAgB;AAAA,EAChC;AACA,MAAI,UAAU,iBAAiB;AAC7B,aAAS,KAAK,sBAAsB;AAAA,EACtC;AACA,MAAI,UAAU,cAAc;AAC1B,aAAS,KAAK,mBAAmB;AAAA,EACnC;AACA,MAAI,UAAU,iBAAiB,QAAW;AACxC,aAAS,KAAK,wBAAwB,UAAU,YAAY,KAAK;AAAA,EACnE;AACA,MAAI,UAAU,WAAW;AACvB,aAAS,KAAK,sCAAsC,UAAU,SAAS,CAAC;AAAA,EAC1E;AACA,MAAI,UAAU,SAAS;AACrB,UAAM,IAAI,UAAU;AACpB,UAAM,QAAkB,CAAC;AACzB,QAAI,EAAE,WAAW,OAAW,OAAM,KAAK,aAAa,EAAE,MAAM,GAAG;AAC/D,QAAI,EAAE,UAAU,OAAW,OAAM,KAAK,YAAY,EAAE,KAAK,GAAG;AAC5D,QAAI,EAAE,SAAS,OAAW,OAAM,KAAK,WAAW,EAAE,IAAI,GAAG;AACzD,QAAI,EAAE,aAAa,OAAW,OAAM,KAAK,eAAe,EAAE,QAAQ,GAAG;AACrE,QAAI,MAAM,SAAS,EAAG,UAAS,KAAK,cAAc,MAAM,KAAK,GAAG,CAAC,IAAI;AAAA,EACvE;AACA,MAAI,UAAU,sBAAsB,QAAW;AAC7C,aAAS;AAAA,MACP,UAAU,oBACN,2BACA;AAAA,IACN;AAAA,EACF;AACA,MAAI,UAAU,aAAa;AACzB,UAAM,MAAM,UAAU;AACtB,UAAM,QAAkB,CAAC;AACzB,QAAI,IAAI,SAAS,OAAW,OAAM,KAAK,WAAW,IAAI,IAAI,GAAG;AAC7D,QAAI,IAAI,UAAU,OAAW,OAAM,KAAK,YAAY,IAAI,KAAK,GAAG;AAChE,QAAI,IAAI,cAAc,OAAW,OAAM,KAAK,gBAAgB,IAAI,SAAS,GAAG;AAC5E,QAAI,IAAI,YAAY,OAAW,OAAM,KAAK,cAAc,IAAI,OAAO,GAAG;AACtE,QAAI,MAAM,SAAS,EAAG,UAAS,KAAK,UAAU,MAAM,KAAK,GAAG,CAAC,IAAI;AAAA,EACnE;AACA,MAAI,UAAU,WAAW;AACvB,aAAS,KAAK,gBAAgB,UAAU,SAAS,KAAK;AAAA,EACxD;AACA,MAAI,UAAU,SAAS;AACrB,UAAM,aAAa,0BAA0B,UAAU,OAAO;AAC9D,QAAI,YAAY;AACd,eAAS,KAAK,UAAU;AAAA,IAC1B;AAAA,EACF;AACA,MAAI,UAAU,SAAS;AACrB,UAAM,aAAa,0BAA0B,UAAU,OAAO;AAC9D,QAAI,YAAY;AACd,eAAS,KAAK,UAAU;AAAA,IAC1B;AAAA,EACF;AACA,MAAI,UAAU,MAAM;AAClB,aAAS,KAAK,WAAW;AAAA,EAC3B;AACA,MAAI,UAAU,qBAAqB;AACjC,aAAS,KAAK,0BAA0B;AAAA,EAC1C;AACA,MAAI,UAAU,UAAU;AACtB,aAAS,KAAK,sBAAsBA,iBAAgB,UAAU,QAAQ,CAAC,KAAK;AAAA,EAC9E;AACA,MAAI,UAAU,YAAY,UAAU,SAAS,SAAS,GAAG;AACvD,UAAM,UAAU,UAAU,SAAS,IAAI,CAAC,QAAQ;AAC9C,YAAM,aAAa,IAAI,SAAS,cAAc,IAAI,MAAM,MAAM;AAC9D,aAAO,iBAAiB,IAAI,KAAK,YAAY,IAAI,QAAQ,IAAI,UAAU;AAAA,IACzE,CAAC,EAAE,KAAK,EAAE;AACV,aAAS,KAAK,WAAW,OAAO,WAAW;AAAA,EAC7C;AAEA,MAAI,SAAS,WAAW,EAAG,QAAO;AAClC,SAAO,UAAU,SAAS,KAAK,EAAE,CAAC;AACpC;AAEA,SAAS,wBAAwB,OAA0B;AACzD,QAAM,WAAqB,CAAC;AAC5B,MAAI,MAAM,SAAS;AACjB,aAAS,KAAK,sBAAsBA,iBAAgB,MAAM,OAAO,CAAC,KAAK;AAAA,EACzE;AACA,MAAI,MAAM,SAAS;AACjB,UAAM,QAAkB,CAAC;AACzB,QAAI,MAAM,QAAQ,KAAK;AACrB,YAAM,KAAK,UAAUA,iBAAgB,MAAM,QAAQ,GAAG,CAAC,GAAG;AAAA,IAC5D;AACA,eAAW,CAAC,KAAK,IAAI,KAAK;AAAA,MACxB,CAAC,YAAY,YAAY;AAAA,MACzB,CAAC,WAAW,WAAW;AAAA,MACvB,CAAC,eAAe,eAAe;AAAA,MAC/B,CAAC,cAAc,cAAc;AAAA,MAC7B,CAAC,WAAW,WAAW;AAAA,MACvB,CAAC,WAAW,WAAW;AAAA,IACzB,GAAY;AACV,YAAM,QAAQ,MAAM,QAAQ,GAAG;AAC/B,UAAI,UAAU,QAAW;AACvB,cAAM,KAAK,GAAG,IAAI,KAAK,QAAQ,MAAM,GAAG,GAAG;AAAA,MAC7C;AAAA,IACF;AACA,QAAI,MAAM,SAAS,GAAG;AACpB,eAAS,KAAK,cAAc,MAAM,KAAK,GAAG,CAAC,IAAI;AAAA,IACjD;AAAA,EACF;AACA,SAAO,SAAS,SAAS,IAAI,YAAY,SAAS,KAAK,EAAE,CAAC,eAAe;AAC3E;AAEA,SAAS,0BAA0B,SAA2C;AAC5E,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AACA,QAAM,QAAkB,CAAC;AACzB,aAAW,CAAC,MAAM,MAAM,KAAK;AAAA,IAC3B,CAAC,OAAO,QAAQ,GAAG;AAAA,IACnB,CAAC,QAAQ,QAAQ,IAAI;AAAA,IACrB,CAAC,UAAU,QAAQ,MAAM;AAAA,IACzB,CAAC,SAAS,QAAQ,KAAK;AAAA,IACvB,CAAC,OAAO,QAAQ,GAAG;AAAA,IACnB,CAAC,WAAW,QAAQ,OAAO;AAAA,EAC7B,GAAY;AACV,UAAM,MAAM,gBAAgB,MAAM,MAAM;AACxC,QAAI,KAAK;AACP,YAAM,KAAK,GAAG;AAAA,IAChB;AAAA,EACF;AACA,SAAO,MAAM,SAAS,IAAI,WAAW,MAAM,KAAK,EAAE,CAAC,cAAc;AACnE;AAEA,SAAS,gBAAgB,MAAc,QAAwC;AAC7E,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,EACT;AACA,QAAM,QAAkB,CAAC;AACzB,MAAI,OAAO,MAAO,OAAM,KAAK,UAAUA,iBAAgB,OAAO,KAAK,CAAC,GAAG;AACvE,MAAI,OAAO,SAAS,OAAW,OAAM,KAAK,SAAS,OAAO,IAAI,GAAG;AACjE,MAAI,OAAO,UAAU,OAAW,OAAM,KAAK,YAAY,OAAO,KAAK,GAAG;AACtE,MAAI,OAAO,MAAO,OAAM,KAAK,YAAYA,iBAAgB,OAAO,KAAK,CAAC,GAAG;AACzE,SAAO,MAAM,SAAS,IAAI,MAAM,IAAI,IAAI,MAAM,KAAK,GAAG,CAAC,OAAO;AAChE;AAEA,SAAS,0BAA0B,SAA2C;AAC5E,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AACA,QAAM,QAAkB,CAAC;AACzB,MAAI,QAAQ,IAAK,OAAM,KAAK,UAAUA,iBAAgB,QAAQ,GAAG,CAAC,GAAG;AACrE,MAAI,QAAQ,MAAO,OAAM,KAAK,YAAYA,iBAAgB,QAAQ,KAAK,CAAC,GAAG;AAC3E,MAAI,QAAQ,KAAM,OAAM,KAAK,WAAWA,iBAAgB,QAAQ,IAAI,CAAC,GAAG;AACxE,SAAO,MAAM,SAAS,IAAI,UAAU,MAAM,KAAK,GAAG,CAAC,OAAO;AAC5D;AAEA,SAAS,gCAAgC,OAAuC;AAC9E,SAAO,uBAAuB,KAAK;AACrC;AAEA,SAAS,mBACP,WACA,OACA,QACA,gBAC8B;AAC9B,MAAI,MAAM;AACV,QAAM,aAAa,oBAAI,IAAoB;AAC3C,QAAM,iBAAiB;AACvB,QAAM,uBAAuB,IAAI;AACjC,aAAW,IAAI,QAAQ,oBAAoB;AAE3C,MAAI;AACJ,MAAI;AAEJ,QAAM,yBAAyB,4BAA4B,SAAS;AACpE,MAAI,uBAAuB,SAAS,GAAG;AACrC,+BAA2B,IAAI;AAC/B,WAAO;AACP,6BAAyB,IAAI;AAAA,EAC/B;AAEA,QAAM,WAAW,2BAA2B,UAAU,UAAU,OAAO,QAAQ,IAAI,MAAM;AACzF,SAAO,SAAS;AAChB,QAAM,eAAe,SAAS,IAAI,WAAW;AAC7C,MAAI,cAAc;AAChB,WAAO;AAAA,EACT;AACA,QAAM,uBAAuB,IAAI;AACjC,SAAO;AAEP,MAAI,CAAC,SAAS,WAAW,IAAI,SAAS,MAAM,GAAG;AAC7C,aAAS,WAAW,IAAI,SAAS,QAAQ,oBAAoB;AAAA,EAC/D;AAEA,SAAO;AAAA,IACL;AAAA,IACA,YAAY,SAAS;AAAA,IACrB,UAAU;AAAA,MACR;AAAA,MACA,OAAO;AAAA,MACP,KAAK,SAAS;AAAA,MACd,YAAY,SAAS;AAAA,MACrB;AAAA,MACA;AAAA,MACA;AAAA,MACA,cAAc,IAAI;AAAA,MAClB,GAAI,6BAA6B,SAC7B,EAAE,yBAAyB,IAC3B,CAAC;AAAA,MACL,GAAI,2BAA2B,SAAY,EAAE,uBAAuB,IAAI,CAAC;AAAA,IAC3E;AAAA,EACF;AACF;AAEA,SAAS,2BACP,UACA,OACA,QACA,WAC2B;AAC3B,QAAM,SAAmB,CAAC;AAC1B,QAAM,aAAa,oBAAI,IAAoB;AAC3C,MAAI,aAAa;AACjB,MAAI,aAAa;AACjB,aAAW,IAAI,YAAY,UAAU;AAErC,aAAW,SAAS,UAAU;AAC5B,UAAM,SAAS,oBAAoB,OAAO,OAAO,YAAY,UAAU;AACvE,WAAO,KAAK,OAAO,GAAG;AACtB,eAAW,CAAC,UAAU,KAAK,KAAK,OAAO,YAAY;AACjD,iBAAW,IAAI,UAAU,KAAK;AAAA,IAChC;AACA,iBAAa,OAAO;AACpB,kBAAc,OAAO,IAAI;AAAA,EAC3B;AAEA,SAAO;AAAA,IACL,KAAK,OAAO,KAAK,EAAE;AAAA,IACnB,QAAQ;AAAA,IACR;AAAA,EACF;AACF;AAOA,SAAS,kBAAkB,OAAyB;AAClD,UAAQ,MAAM,MAAM;AAAA,IAClB,KAAK;AACH,aAAO,cAAc,MAAM,IAAI;AAAA,IACjC,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,EACX;AACF;AAEA,SAAS,cAAc,MAAsB;AAC3C,QAAM,WAAW,uBAAuB,IAAI,IAAI,0BAA0B;AAC1E,SAAO,OAAO,QAAQ,IAAI,UAAU,IAAI,CAAC;AAC3C;AAEA,SAAS,oBACP,MACA,OACA,QACA,WAC2B;AAC3B,UAAQ,KAAK,MAAM;AAAA,IACjB,KAAK,QAAQ;AACX,YAAM,MAAM,aAAa;AAAA,QACvB,MAAM;AAAA,QACN,MAAM,KAAK;AAAA,QACX,GAAI,KAAK,SAAS,KAAK,MAAM,SAAS,IAAI,EAAE,OAAO,KAAK,MAAM,IAAI,CAAC;AAAA,MACrE,CAAC;AACD,YAAM,aAAa,oBAAI,IAAoB;AAC3C,iBAAW,IAAI,QAAQ,SAAS;AAChC,iBAAW,IAAI,SAAS,MAAM,KAAK,KAAK,IAAI,EAAE,QAAQ,YAAY,IAAI,MAAM;AAC5E,aAAO;AAAA,QACL;AAAA,QACA,QAAQ,SAAS,MAAM,KAAK,KAAK,IAAI,EAAE;AAAA,QACvC;AAAA,MACF;AAAA,IACF;AAAA,IACA,KAAK,OAAO;AACV,YAAM,MAAM,aAAa,EAAE,MAAM,MAAM,CAAC;AACxC,YAAM,aAAa,oBAAI,IAAoB;AAC3C,iBAAW,IAAI,QAAQ,SAAS;AAChC,iBAAW,IAAI,SAAS,GAAG,YAAY,IAAI,MAAM;AACjD,aAAO;AAAA,QACL;AAAA,QACA,QAAQ,SAAS;AAAA,QACjB;AAAA,MACF;AAAA,IACF;AAAA,IACA,KAAK,gBAAgB;AACnB,YAAM,MAAM;AACZ,YAAM,aAAa,oBAAI,IAAoB;AAC3C,iBAAW,IAAI,QAAQ,SAAS;AAChC,iBAAW,IAAI,SAAS,GAAG,YAAY,IAAI,MAAM;AACjD,aAAO;AAAA,QACL;AAAA,QACA,QAAQ,SAAS;AAAA,QACjB;AAAA,MACF;AAAA,IACF;AAAA,IACA,KAAK,cAAc;AACjB,YAAM,MAAM,aAAa,EAAE,MAAM,aAAa,CAAC;AAC/C,YAAM,aAAa,oBAAI,IAAoB;AAC3C,iBAAW,IAAI,QAAQ,SAAS;AAChC,iBAAW,IAAI,SAAS,GAAG,YAAY,IAAI,MAAM;AACjD,aAAO;AAAA,QACL;AAAA,QACA,QAAQ,SAAS;AAAA,QACjB;AAAA,MACF;AAAA,IACF;AAAA,IACA,KAAK,UAAU;AACb,YAAM,MAAM,yBAAyB,MAAM,KAAK;AAChD,YAAM,aAAa,oBAAI,IAAoB;AAC3C,iBAAW,IAAI,QAAQ,SAAS;AAChC,iBAAW,IAAI,SAAS,GAAG,YAAY,IAAI,MAAM;AACjD,aAAO;AAAA,QACL;AAAA,QACA,QAAQ,SAAS;AAAA,QACjB;AAAA,MACF;AAAA,IACF;AAAA,IACA,KAAK,SAAS;AACZ,YAAM,MAAM,mBAAmB,MAAM,KAAK;AAC1C,YAAM,aAAa,oBAAI,IAAoB;AAC3C,iBAAW,IAAI,QAAQ,SAAS;AAChC,iBAAW,IAAI,SAAS,GAAG,YAAY,IAAI,MAAM;AACjD,aAAO;AAAA,QACL;AAAA,QACA,QAAQ,SAAS;AAAA,QACjB;AAAA,MACF;AAAA,IACF;AAAA,IACA,KAAK,iBAAiB;AACpB,YAAM,MAAM,gBAAgB,KAAK,YAAY,KAAK;AAClD,YAAM,aAAa,oBAAI,IAAoB;AAC3C,iBAAW,IAAI,QAAQ,SAAS;AAChC,iBAAW,IAAI,SAAS,GAAG,YAAY,IAAI,MAAM;AACjD,aAAO;AAAA,QACL;AAAA,QACA,QAAQ,SAAS;AAAA,QACjB;AAAA,MACF;AAAA,IACF;AAAA,IACA,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK,aAAa;AAEhB,YAAM,MAAM,iBAAiB,KAAK,MAAM;AACxC,YAAM,aAAa,oBAAI,IAAoB;AAC3C,iBAAW,IAAI,QAAQ,SAAS;AAChC,iBAAW,IAAI,SAAS,GAAG,YAAY,IAAI,MAAM;AACjD,aAAO;AAAA,QACL;AAAA,QACA,QAAQ,SAAS;AAAA,QACjB;AAAA,MACF;AAAA,IACF;AAAA,IACA,KAAK,aAAa;AAChB,YAAM,gBAAgB,KAAK,KAAK,WAAW,GAAG,IAC1C,0BAA0BA,iBAAgB,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,QAC5D,MAAM;AACL,cAAM,iBAAiB,eAAe,MAAM,8BAA8B;AAC1E,cAAM,kCAAkC;AACxC,cAAM,cAAc,KAAK;AAAA,UACvB,IAAI;AAAA,UACJ,MAAM;AAAA,UACN,QAAQ,KAAK;AAAA,UACb,YAAY;AAAA,QACd,CAAC;AACD,cAAM,wBAAwB,IAAI,cAAc;AAChD,eAAO,sBAAsB,cAAc;AAAA,MAC7C,GAAG;AACP,YAAM,iBAAiB;AACvB,YAAM,aAAa,oBAAI,IAAoB;AAC3C,UAAI,aAAa;AACjB,UAAI,aAAa,YAAY,cAAc;AAC3C,iBAAW,IAAI,QAAQ,UAAU;AACjC,YAAM,WAAqB,CAAC;AAE5B,iBAAW,SAAS,KAAK,UAAU;AACjC,cAAM,SAAS,oBAAoB,OAAO,OAAO,YAAY,UAAU;AACvE,iBAAS,KAAK,OAAO,GAAG;AACxB,mBAAW,CAAC,UAAU,KAAK,KAAK,OAAO,YAAY;AACjD,qBAAW,IAAI,UAAU,KAAK;AAAA,QAChC;AACA,qBAAa,OAAO;AACpB,sBAAc,OAAO,IAAI;AAAA,MAC3B;AAEA,iBAAW,IAAI,YAAY,UAAU;AACrC,aAAO;AAAA,QACL,KAAK,GAAG,aAAa,GAAG,SAAS,KAAK,EAAE,CAAC,GAAG,cAAc;AAAA,QAC1D,QAAQ;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,IACA,KAAK,SAAS;AACZ,UAAI,KAAK,YAAY,KAAK,SAAS,SAAS,GAAG;AAC7C,cAAMC,cAAa,oBAAI,IAAoB;AAC3C,QAAAA,YAAW,IAAI,QAAQ,SAAS;AAChC,YAAI,aAAa;AACjB,YAAI,aAAa;AAEjB,YAAI,KAAK,cAAc,WAAW;AAChC,gBAAM,WACJ,wFAC2C,UAAU,KAAK,WAAW,CAAC;AAExE,wBAAc,SAAS;AAEvB,gBAAMC,YAAqB,CAAC,QAAQ;AACpC,qBAAW,SAAS,KAAK,UAAU;AACjC,kBAAM,SAAS,oBAAoB,OAAO,OAAO,YAAY,UAAU;AACvE,YAAAA,UAAS,KAAK,OAAO,GAAG;AACxB,uBAAW,CAAC,UAAU,KAAK,KAAK,OAAO,YAAY;AACjD,cAAAD,YAAW,IAAI,UAAU,KAAK;AAAA,YAChC;AACA,yBAAa,OAAO;AACpB,0BAAc,OAAO,IAAI;AAAA,UAC3B;AACA,gBAAM,SAAS;AACf,UAAAC,UAAS,KAAK,MAAM;AACpB,wBAAc,OAAO;AACrB,UAAAD,YAAW,IAAI,YAAY,UAAU;AACrC,iBAAO,EAAE,KAAKC,UAAS,KAAK,EAAE,GAAG,QAAQ,YAAY,YAAAD,YAAW;AAAA,QAClE;AAGA,cAAM,UAAU,yBAAyBD,iBAAgB,KAAK,WAAW,CAAC;AAC1E,sBAAc,QAAQ;AACtB,cAAM,WAAqB,CAAC,OAAO;AACnC,mBAAW,SAAS,KAAK,UAAU;AACjC,gBAAM,SAAS,oBAAoB,OAAO,OAAO,YAAY,UAAU;AACvE,mBAAS,KAAK,OAAO,GAAG;AACxB,qBAAW,CAAC,UAAU,KAAK,KAAK,OAAO,YAAY;AACjD,YAAAC,YAAW,IAAI,UAAU,KAAK;AAAA,UAChC;AACA,uBAAa,OAAO;AACpB,wBAAc,OAAO,IAAI;AAAA,QAC3B;AACA,iBAAS,KAAK,gBAAgB;AAC9B,sBAAc,iBAAiB;AAC/B,QAAAA,YAAW,IAAI,YAAY,UAAU;AACrC,eAAO,EAAE,KAAK,SAAS,KAAK,EAAE,GAAG,QAAQ,YAAY,YAAAA,YAAW;AAAA,MAClE;AAEA,YAAM,MAAM,yBAAyBD,iBAAgB,KAAK,WAAW,CAAC;AACtE,YAAM,aAAa,oBAAI,IAAoB;AAC3C,iBAAW,IAAI,QAAQ,SAAS;AAChC,iBAAW,IAAI,SAAS,GAAG,YAAY,IAAI,MAAM;AACjD,aAAO;AAAA,QACL;AAAA,QACA,QAAQ,SAAS;AAAA,QACjB;AAAA,MACF;AAAA,IACF;AAAA,IACA,KAAK,kBAAkB;AACrB,YAAM,MACJ,0BAA0BA,iBAAgB,KAAK,UAAU,CAAC,aAC9CA,iBAAgB,KAAK,IAAI,CAAC;AACxC,YAAM,aAAa,oBAAI,IAAoB;AAC3C,iBAAW,IAAI,QAAQ,SAAS;AAChC,iBAAW,IAAI,QAAQ,YAAY,IAAI,MAAM;AAC7C,aAAO,EAAE,KAAK,QAAQ,WAAW;AAAA,IACnC;AAAA,IACA,KAAK,gBAAgB;AACnB,YAAM,MAAM,wBAAwBA,iBAAgB,KAAK,UAAU,CAAC;AACpE,YAAM,aAAa,oBAAI,IAAoB;AAC3C,iBAAW,IAAI,QAAQ,SAAS;AAChC,iBAAW,IAAI,QAAQ,YAAY,IAAI,MAAM;AAC7C,aAAO,EAAE,KAAK,QAAQ,WAAW;AAAA,IACnC;AAAA,IACA,KAAK,gBAAgB;AACnB,YAAM,aACJ,KAAK,aAAa,aACd,8BAA8BA,iBAAgB,KAAK,MAAM,CAAC,QAC1D,6BAA6BA,iBAAgB,KAAK,MAAM,CAAC;AAC/D,YAAM,WACJ,KAAK,aAAa,aACd,sBACA;AACN,YAAM,MAAM,gCAAgC,QAAQ,cAAc,UAAU;AAC5E,YAAM,aAAa,oBAAI,IAAoB;AAC3C,iBAAW,IAAI,QAAQ,SAAS;AAChC,iBAAW,IAAI,SAAS,GAAG,YAAY,IAAI,MAAM;AACjD,aAAO;AAAA,QACL;AAAA,QACA,QAAQ,SAAS;AAAA,QACjB;AAAA,MACF;AAAA,IACF;AAAA,IACA,SAAS;AACP,YAAM,aAAa,oBAAI,IAAoB;AAC3C,iBAAW,IAAI,QAAQ,SAAS;AAChC,aAAO,EAAE,KAAK,IAAI,QAAQ,WAAW;AAAA,IACvC;AAAA,EACF;AACF;AAEA,SAAS,mBACP,MACA,OACQ;AACR,QAAM,eAAe,OAAO,KAAK,iBAAiB,WAAW,KAAK,aAAa,KAAK,IAAI;AACxF,MAAI,aAAa,SAAS,GAAG;AAC3B,WAAO,aAAa,WAAW,MAAM,IAAI,eAAe,QAAQ,YAAY;AAAA,EAC9E;AAEA,QAAM,YAAY,MAAM,MAAM,MAAM,KAAK,OAAO;AAChD,MAAI,WAAW,kBAAkB,MAAM,wBAAwB,IAAI,UAAU,cAAc,GAAG;AAC5F,UAAM,UAAU,KAAK,WAAW,UAAU,WAAW,UAAU;AAC/D,WAAO,4SAA4SA,iBAAgB,UAAU,QAAQ,CAAC,YAAYA,iBAAgB,WAAW,EAAE,CAAC,oKAAoKA,iBAAgB,UAAU,QAAQ,CAAC,kEAAkEA,iBAAgB,UAAU,cAAc,CAAC;AAAA,EACprB;AAEA,SAAO,aAAa;AAAA,IAClB,MAAM;AAAA,IACN,MAAM,KAAK,WAAW;AAAA,EACxB,CAAC;AACH;AAEA,SAAS,aAAa,OAAyB;AAC7C,QAAM,QAAQ,MAAM,SAAS,SAAS,MAAM,QAAQ;AACpD,QAAM,aAAa,uBAAuB,KAAK;AAC/C,QAAM,UAAU,kBAAkB,KAAK;AACvC,SAAO,QAAQ,UAAU,GAAG,OAAO;AACrC;AAEA,SAAS,uBAAuB,OAAuC;AACrE,MAAI,CAAC,SAAS,MAAM,WAAW,GAAG;AAChC,WAAO;AAAA,EACT;AAEA,QAAM,YAAsB,CAAC;AAC7B,aAAW,QAAQ,OAAO;AACxB,YAAQ,KAAK,MAAM;AAAA,MACjB,KAAK;AACH,kBAAU,KAAK,QAAQ;AACvB;AAAA,MACF,KAAK;AACH,kBAAU,KAAK,QAAQ;AACvB;AAAA,MACF,KAAK;AACH,kBAAU,KAAK,uBAAuB;AACtC;AAAA,MACF,KAAK;AACH,kBAAU,KAAK,aAAa;AAC5B;AAAA,MACF,KAAK;AACH,kBAAU,KAAK,cAAc;AAC7B;AAAA,MACF,KAAK;AACH,kBAAU,KAAK,aAAa;AAC5B;AAAA,MACF,KAAK;AACH,kBAAU,KAAK,kBAAkBA,iBAAgB,KAAK,GAAG,CAAC,KAAK;AAC/D;AAAA,MACF,KAAK;AACH,kBAAU,KAAK,uBAAuBA,iBAAgB,KAAK,GAAG,CAAC,KAAK;AACpE;AAAA,MACF,KAAK;AACH,kBAAU;AAAA,UACR,+CAA+CA,iBAAgB,KAAK,KAAK,CAAC;AAAA,QAC5E;AACA;AAAA,MACF,KAAK;AACH,kBAAU,KAAK,qBAAqB,KAAK,GAAG,KAAK;AACjD;AAAA,MACF,KAAK;AACH,kBAAU,KAAK,kBAAkB,KAAK,GAAG,KAAK;AAC9C;AAAA,MACF,KAAK;AACH,kBAAU,KAAK,aAAa;AAC5B;AAAA,MACF,KAAK;AACH,kBAAU,KAAK,cAAc;AAC7B;AAAA,MACF,KAAK;AACH,kBAAU,KAAK,aAAa;AAC5B;AAAA,MACF,KAAK;AACH,kBAAU,KAAK,sBAAsB,KAAK,GAAG,KAAK;AAClD;AAAA,MACF,KAAK;AACH,kBAAU,KAAK,KAAK,GAAG;AACvB;AAAA,MACF,KAAK;AACH,kBAAU,KAAK,sBAAsBA,iBAAgB,KAAK,GAAG,CAAC,cAAcA,iBAAgB,KAAK,GAAG,CAAC,KAAK;AAC1G;AAAA,MACF,KAAK;AACH,kBAAU,KAAK,gBAAgB,KAAK,GAAG,KAAK;AAC5C;AAAA,MACF,KAAK;AACH,kBAAU,KAAK,mBAAmBA,iBAAgB,KAAK,KAAK,CAAC,KAAK;AAClE;AAAA,MACF,KAAK;AACH,kBAAU,KAAK,gBAAgB;AAC/B;AAAA,MACF,KAAK;AACH,kBAAU,KAAK,WAAW;AAC1B;AAAA,IACJ;AAAA,EACF;AAEA,QAAM,WAAW,UAAU,KAAK,EAAE;AAClC,SAAO,SAAS,SAAS,IAAI,UAAU,QAAQ,aAAa;AAC9D;AAEA,SAAS,uBAAuB,MAAuB;AACrD,SAAO,MAAM,KAAK,IAAI,KAAK,MAAM,KAAK,IAAI,KAAK,KAAK,SAAS,IAAI;AACnE;AAEA,SAAS,gBAAgB,YAAoB,OAAmC;AAC9E,QAAM,WAAW,kBAAkB,MAAM,cAAc,UAAU;AACjE,MAAI,CAAC,YAAY,SAAS,gBAAgB,eAAe;AACvD,UAAM,IAAI,MAAM,oCAAoC,UAAU,wBAAwB;AAAA,EACxF;AAEA;AAAA,IACE;AAAA,IACA,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AACA,SAAO,SAAS;AAClB;AAEA,SAAS,kBAAkB,cAAgD;AACzE,SAAO,EAAE,GAAG,aAAa;AAC3B;AAEA,SAAS,8BAA8B,KAAsB;AAC3D,SAAO,6BAA6B,KAAK,IAAI,KAAK,CAAC;AACrD;AAEA,SAAS,UAAU,OAAuB;AACxC,SAAO,MACJ,QAAQ,MAAM,OAAO,EACrB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,MAAM;AACzB;AAEA,SAASA,iBAAgB,OAAuB;AAC9C,SAAO,UAAU,KAAK,EAAE,QAAQ,MAAM,QAAQ;AAChD;AAEA,SAAS,wBACP,UACA,QAC2B;AAC3B,SAAO;AAAA,IACL,GAAG;AAAA,IACH,YAAY,IAAI;AAAA,MACd,CAAC,GAAG,SAAS,WAAW,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC,UAAU,KAAK,MAAM;AAAA,QAC5D;AAAA,QACA,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAAA,IACA,gBAAgB,SAAS,iBAAiB;AAAA,IAC1C,sBAAsB,SAAS,uBAAuB;AAAA,IACtD,sBAAsB,SAAS,uBAAuB;AAAA,IACtD,cAAc,SAAS,eAAe;AAAA,IACtC,GAAI,SAAS,6BAA6B,SACtC,EAAE,0BAA0B,SAAS,2BAA2B,OAAO,IACvE,CAAC;AAAA,IACL,GAAI,SAAS,2BAA2B,SACpC,EAAE,wBAAwB,SAAS,yBAAyB,OAAO,IACnE,CAAC;AAAA,IACL,GAAI,SAAS,gCAAgC,SACzC,EAAE,6BAA6B,SAAS,8BAA8B,OAAO,IAC7E,CAAC;AAAA,IACL,GAAI,SAAS,8BAA8B,SACvC,EAAE,2BAA2B,SAAS,4BAA4B,OAAO,IACzE,CAAC;AAAA,EACP;AACF;AAEA,SAAS,4BACP,YACA,SACQ;AACR,QAAM,SAAS;AAAA,IACb,WAAW;AAAA,IACX,WAAW;AAAA,IACX,GAAI,WAAW,0BAA0B,OAAO,IAC5C,EAAE,aAAa,uDAAuD,IACtE,CAAC;AAAA,IACL,GAAI,cAAc,CAAC;AAAA,EACrB;AAEA,SAAO,OAAO,QAAQ,MAAM,EACzB,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,IAAI,IAAI,KAAKA,iBAAgB,KAAK,CAAC,GAAG,EAC7D,KAAK,EAAE;AACZ;AAEO,SAAS,8BAA8B,OAAkC;AAC9E,QAAM,WAAqB,CAAC;AAG5B,MAAI,MAAM,kBAAkB;AAC1B,eAAW,OAAO,MAAM,kBAAkB;AACxC,eAAS,KAAK,8BAA8BA,iBAAgB,IAAI,OAAO,CAAC,WAAWA,iBAAgB,IAAI,cAAc,CAAC,KAAK;AAAA,IAC7H;AAAA,EACF;AAGA,MAAI,MAAM,kBAAkB;AAC1B,eAAW,OAAO,MAAM,kBAAkB;AACxC,eAAS,KAAK,8BAA8BA,iBAAgB,IAAI,OAAO,CAAC,WAAWA,iBAAgB,IAAI,cAAc,CAAC,KAAK;AAAA,IAC7H;AAAA,EACF;AAGA,MAAI,MAAM,aAAa;AACrB,aAAS,KAAK,kBAAkBA,iBAAgB,MAAM,WAAW,CAAC,KAAK;AAAA,EACzE;AAGA,MAAI,MAAM,UAAU;AAClB,QAAI,OAAO,gBAAgB,MAAM,SAAS,KAAK,UAAU,MAAM,SAAS,MAAM;AAC9E,QAAI,MAAM,SAAS,aAAa;AAC9B,cAAQ,cAAc,MAAM,SAAS,WAAW;AAAA,IAClD;AACA,YAAQ;AACR,aAAS,KAAK,IAAI;AAAA,EACpB;AAGA,MAAI,MAAM,aAAa;AACrB,QAAI,QAAQ,mBAAmB,MAAM,YAAY,GAAG,cAAc,MAAM,YAAY,KAAK,eAAe,MAAM,YAAY,MAAM,aAAa,MAAM,YAAY,IAAI;AACnK,QAAI,MAAM,YAAY,WAAW,OAAW,UAAS,cAAc,MAAM,YAAY,MAAM;AAC3F,QAAI,MAAM,YAAY,WAAW,OAAW,UAAS,cAAc,MAAM,YAAY,MAAM;AAC3F,QAAI,MAAM,YAAY,WAAW,OAAW,UAAS,cAAc,MAAM,YAAY,MAAM;AAC3F,aAAS;AACT,aAAS,KAAK,KAAK;AAAA,EACrB;AAGA,MAAI,MAAM,SAAS;AACjB,QAAI,OAAO;AACX,QAAI,MAAM,QAAQ,UAAU,OAAW,SAAQ,WAAW,MAAM,QAAQ,KAAK;AAC7E,QAAI,MAAM,QAAQ,UAAU,OAAW,SAAQ,aAAa,MAAM,QAAQ,KAAK;AAC/E,QAAI,MAAM,QAAQ,eAAe,OAAW,SAAQ,kBAAkB,MAAM,QAAQ,aAAa,MAAM,GAAG;AAC1G,QAAI,MAAM,QAAQ,UAAW,SAAQ;AACrC,QAAI,MAAM,QAAQ,WAAW,MAAM,QAAQ,QAAQ,SAAS,GAAG;AAC7D,cAAQ;AACR,iBAAW,OAAO,MAAM,QAAQ,SAAS;AACvC,YAAI,SAAS,eAAe,IAAI,KAAK;AACrC,YAAI,IAAI,UAAU,OAAW,WAAU,aAAa,IAAI,KAAK;AAC7D,kBAAU;AACV,gBAAQ;AAAA,MACV;AACA,cAAQ;AAAA,IACV,OAAO;AACL,cAAQ;AAAA,IACV;AACA,aAAS,KAAK,IAAI;AAAA,EACpB;AAGA,MAAI,MAAM,eAAe;AACvB,QAAI,QAAQ;AACZ,QAAI,MAAM,cAAc,OAAQ,UAAS,WAAWA,iBAAgB,MAAM,cAAc,MAAM,CAAC;AAC/F,QAAI,MAAM,cAAc,UAAU,OAAW,UAAS,aAAa,MAAM,cAAc,KAAK;AAC5F,QAAI,MAAM,cAAc,UAAW,UAAS,iBAAiBA,iBAAgB,MAAM,cAAc,SAAS,CAAC;AAC3G,QAAI,MAAM,cAAc,QAAS,UAAS,eAAeA,iBAAgB,MAAM,cAAc,OAAO,CAAC;AACrG,aAAS;AACT,aAAS,KAAK,KAAK;AAAA,EACrB;AAEA,MAAI,MAAM,eAAe;AACvB,QAAI,gBAAgB;AACpB,QAAI,MAAM,cAAc,YAAY,QAAW;AAC7C,uBAAiB,eAAe,MAAM,cAAc,OAAO;AAAA,IAC7D;AACA,QAAI,MAAM,cAAc,UAAU,QAAW;AAC3C,uBAAiB,aAAa,MAAM,cAAc,KAAK;AAAA,IACzD;AACA,QAAI,MAAM,cAAc,aAAa,QAAW;AAC9C,uBAAiB,gBAAgB,MAAM,cAAc,QAAQ;AAAA,IAC/D;AACA,QAAI,MAAM,cAAc,SAAS;AAC/B,uBAAiB,eAAeA,iBAAgB,MAAM,cAAc,OAAO,CAAC;AAAA,IAC9E;AACA,qBAAiB;AACjB,aAAS,KAAK,aAAa;AAAA,EAC7B;AAEA,MAAI,MAAM,aAAa;AACrB,UAAM,QAAkB,CAAC;AACzB,QAAI,MAAM,YAAY,YAAY;AAChC,YAAM,KAAK,iBAAiBA,iBAAgB,MAAM,YAAY,UAAU,CAAC,GAAG;AAAA,IAC9E;AACA,QAAI,MAAM,YAAY,SAAS;AAC7B,YAAM,KAAK,cAAcA,iBAAgB,MAAM,YAAY,OAAO,CAAC,GAAG;AAAA,IACxE;AACA,QAAI,MAAM,YAAY,QAAQ;AAC5B,YAAM,KAAK,aAAaA,iBAAgB,MAAM,YAAY,MAAM,CAAC,GAAG;AAAA,IACtE;AACA,UAAM,YAAY;AAAA,MAChB,gBAAgB,OAAO,MAAM,YAAY,GAAG;AAAA,MAC5C,gBAAgB,QAAQ,MAAM,YAAY,IAAI;AAAA,MAC9C,gBAAgB,UAAU,MAAM,YAAY,MAAM;AAAA,MAClD,gBAAgB,SAAS,MAAM,YAAY,KAAK;AAAA,IAClD,EAAE,OAAO,CAAC,UAAU,MAAM,SAAS,CAAC;AACpC,QAAI,MAAM,SAAS,KAAK,UAAU,SAAS,GAAG;AAC5C,eAAS;AAAA,QACP,eAAe,MAAM,SAAS,IAAI,IAAI,MAAM,KAAK,GAAG,CAAC,KAAK,EAAE,IAAI,UAAU,KAAK,EAAE,CAAC;AAAA,MACpF;AAAA,IACF;AAAA,EACF;AAGA,MAAI,MAAM,WAAW;AACnB,aAAS,KAAK,cAAc;AAAA,EAC9B;AAEA,MAAI,MAAM,cAAc;AACtB,UAAM,QAAkB,CAAC;AACzB,QAAI,MAAM,aAAa,MAAM;AAC3B,YAAM,KAAK,WAAWA,iBAAgB,MAAM,aAAa,IAAI,CAAC,GAAG;AAAA,IACnE;AACA,QAAI,MAAM,aAAa,cAAc,QAAW;AAC9C,YAAM,KAAK,gBAAgB,MAAM,aAAa,SAAS,GAAG;AAAA,IAC5D;AACA,QAAI,MAAM,aAAa,cAAc,QAAW;AAC9C,YAAM,KAAK,gBAAgB,MAAM,aAAa,SAAS,GAAG;AAAA,IAC5D;AACA,QAAI,MAAM,SAAS,GAAG;AACpB,eAAS,KAAK,cAAc,MAAM,KAAK,GAAG,CAAC,IAAI;AAAA,IACjD;AAAA,EACF;AAEA,MAAI,SAAS,WAAW,GAAG;AACzB,WAAO;AAAA,EACT;AAEA,SAAO,aAAa,SAAS,KAAK,EAAE,CAAC;AACvC;AAEA,SAAS,iBAAiB,QAAwB;AAChD,QAAM,UAAU,OAAO,UAAU;AACjC,SAAO,QAAQ,WAAW,MAAM,IAAI,SAAS,QAAQ,MAAM;AAC7D;AAEA,SAAS,0BAA0B,SAAoC;AACrE,QAAM,aAAa,CAAC,GAAG,QAAQ,QAAQ;AACvC,SAAO,WAAW,SAAS,GAAG;AAC5B,UAAM,QAAQ,WAAW,MAAM;AAC/B,QAAI,CAAC,OAAO;AACV;AAAA,IACF;AACA,QAAI,MAAM,SAAS,aAAa;AAC9B,iBAAW,SAAS,MAAM,UAAU;AAClC,aACG,MAAM,SAAS,UAAU,MAAM,SAAS,aACzC,MAAM,OAAO,KAAK,CAAC,SAAS,KAAK,SAAS,UAAU,GACpD;AACA,iBAAO;AAAA,QACT;AAAA,MACF;AACA;AAAA,IACF;AACA,QAAI,MAAM,SAAS,SAAS;AAC1B,iBAAW,OAAO,MAAM,MAAM;AAC5B,mBAAW,QAAQ,IAAI,OAAO;AAC5B,qBAAW,KAAK,GAAG,KAAK,QAAQ;AAAA,QAClC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;;;AC5zCO,SAAS,sBACd,aAC6B;AAC7B,QAAM,OAAO,sBAAsB,WAAW;AAC9C,QAAM,kBAAkB,yBAAyB,MAAM,UAAU;AACjE,QAAM,cAAc,yBAAyB,iBAAiB,MAAM;AACpE,QAAM,aAA0C,CAAC;AACjD,MAAI,SAAS;AACb,MAAI,iBAAiB;AACrB,MAAI,uBAAuB;AAE3B,aAAW,SAAS,YAAY,UAAU;AACxC,QAAI,MAAM,SAAS,WAAW;AAC5B;AAAA,IACF;AAEA,QAAI,UAAU,MAAM,IAAI,MAAM,KAAK;AACjC,gBAAU;AACV,6BAAuB;AACvB;AAAA,IACF;AAEA,QAAI,sBAAsB;AACxB,gBAAU;AAAA,IACZ;AACA,sBAAkB;AAClB,UAAM,aAAa,oBAAI,IAAoB;AAC3C,eAAW,IAAI,QAAQ,MAAM,aAAa;AAE1C,UAAM,sBAAsB,iBAAiB,OAAO,KAAK;AACzD,UAAM,yBAAyB,sBAC3B,iBAAiB,qBAAqB,KAAK,IAC3C;AAEJ;AAAA,MACE,MAAM;AAAA,MACN;AAAA,MACA,MAAM;AAAA,MACN,CAAC,SAAS;AACR,iBAAS;AAAA,MACX;AAAA,IACF;AAEA,eAAW,IAAI,QAAQ,MAAM,eAAe;AAC5C,eAAW,KAAK;AAAA,MACd;AAAA,MACA,OAAO,KAAK,IAAI,GAAG,WAAW,KAAK,CAAC;AAAA,MACpC,KAAK,KAAK,IAAI,GAAG,WAAW,KAAK,CAAC;AAAA,MAClC;AAAA,MACA,gBAAgB,MAAM;AAAA,MACtB,sBAAsB,MAAM;AAAA,MAC5B,sBAAsB,MAAM;AAAA,MAC5B,cAAc,MAAM;AAAA,MACpB,GAAI,sBACA;AAAA,QACE,0BAA0B,oBAAoB;AAAA,QAC9C,wBAAwB,oBAAoB;AAAA,MAC9C,IACA,CAAC;AAAA,MACL,GAAI,yBACA;AAAA,QACE,6BAA6B,uBAAuB;AAAA,QACpD,2BAA2B,uBAAuB;AAAA,MACpD,IACA,CAAC;AAAA,IACP,CAAC;AACD,2BAAuB;AAAA,EACzB;AAEA,SAAO;AACT;AAEA,SAAS,4BACP,OACA,YACA,WACA,WACM;AACN,aAAW,QAAQ,OAAO;AACxB,+BAA2B,MAAM,YAAY,WAAW,SAAS;AAAA,EACnE;AACF;AAEA,SAAS,2BACP,MACA,YACA,WACA,WACM;AACN,MAAI,KAAK,SAAS,WAAW;AAC3B;AAAA,EACF;AAEA,UAAQ,UAAU,KAAK,IAAI,GAAG;AAAA,IAC5B,KAAK;AACH;AAAA,IACF,KAAK;AACH,iBAAW,IAAI,UAAU,GAAG,KAAK,KAAK;AACtC,iBAAW,SAAS,KAAK,UAAU;AACjC,mCAA2B,OAAO,YAAY,WAAW,SAAS;AAAA,MACpE;AACA,iBAAW,IAAI,UAAU,GAAG,KAAK,GAAG;AACpC;AAAA,IACF,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,iBAAW,SAAS,KAAK,UAAU;AACjC,mCAA2B,OAAO,YAAY,WAAW,SAAS;AAAA,MACpE;AACA;AAAA,IACF,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK,gBAAgB;AACnB,YAAM,OAAO,KAAK,SACf,OAAO,CAAC,UAAgC,MAAM,SAAS,MAAM,EAC7D,IAAI,CAAC,UAAU,MAAM,IAAI,EACzB,KAAK,EAAE;AACV,UAAI,KAAK,WAAW,GAAG;AACrB;AAAA,MACF;AAEA,UAAI,CAAC,WAAW,IAAI,UAAU,CAAC,GAAG;AAChC,mBAAW,IAAI,UAAU,GAAG,KAAK,KAAK;AAAA,MACxC;AACA,gBAAU,UAAU,IAAI,KAAK,MAAM;AACnC,iBAAW,IAAI,UAAU,GAAG,KAAK,GAAG;AACpC;AAAA,IACF;AAAA,IACA,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,UAAI,CAAC,WAAW,IAAI,UAAU,CAAC,GAAG;AAChC,mBAAW,IAAI,UAAU,GAAG,KAAK,KAAK;AAAA,MACxC;AACA,gBAAU,UAAU,IAAI,CAAC;AACzB,iBAAW,IAAI,UAAU,GAAG,KAAK,GAAG;AACpC;AAAA,IACF;AACE,iBAAW,SAAS,KAAK,UAAU;AACjC,mCAA2B,OAAO,YAAY,WAAW,SAAS;AAAA,MACpE;AAAA,EACJ;AACF;AAEO,SAAS,sBAAsB,KAA6B;AACjE,QAAM,OAAuB;AAAA,IAC3B,MAAM;AAAA,IACN,MAAM;AAAA,IACN,YAAY,CAAC;AAAA,IACb,UAAU,CAAC;AAAA,IACX,OAAO;AAAA,IACP,KAAK,IAAI;AAAA,IACT,eAAe;AAAA,IACf,iBAAiB,IAAI;AAAA,EACvB;AACA,QAAM,QAA0B,CAAC,IAAI;AACrC,MAAI,SAAS;AAEb,SAAO,SAAS,IAAI,QAAQ;AAC1B,QAAI,IAAI,WAAW,QAAQ,MAAM,GAAG;AAClC,YAAM,MAAM,IAAI,QAAQ,OAAO,MAAM;AACrC,eAAS,OAAO,IAAI,MAAM,IAAI,IAAI;AAClC;AAAA,IACF;AAEA,QAAI,IAAI,WAAW,MAAM,MAAM,GAAG;AAChC,YAAM,MAAM,IAAI,QAAQ,MAAM,MAAM;AACpC,eAAS,OAAO,IAAI,MAAM,IAAI,IAAI;AAClC;AAAA,IACF;AAEA,QAAI,IAAI,WAAW,aAAa,MAAM,GAAG;AACvC,YAAM,MAAM,IAAI,QAAQ,OAAO,MAAM;AACrC,YAAM,UAAU,OAAO,IAAI,MAAM,IAAI;AACrC,YAAM,MAAM,SAAS,CAAC,GAAG,SAAS,KAAK;AAAA,QACrC,MAAM;AAAA,QACN,MAAM,IAAI,MAAM,SAAS,GAAG,OAAO;AAAA,QACnC,OAAO;AAAA,QACP,KAAK;AAAA,MACP,CAAC;AACD,eAAS,OAAO,IAAI,MAAM,IAAI,IAAI;AAClC;AAAA,IACF;AAEA,QAAI,IAAI,MAAM,MAAM,KAAK;AACvB,YAAM,UAAU,IAAI,QAAQ,KAAK,MAAM;AACvC,YAAM,MAAM,WAAW,IAAI,UAAU,IAAI;AACzC,YAAM,OAAO,kBAAkB,IAAI,MAAM,QAAQ,GAAG,CAAC;AACrD,UAAI,KAAK,SAAS,GAAG;AACnB,cAAM,MAAM,SAAS,CAAC,GAAG,SAAS,KAAK;AAAA,UACrC,MAAM;AAAA,UACN;AAAA,UACA,OAAO;AAAA,UACP;AAAA,QACF,CAAC;AAAA,MACH;AACA,eAAS;AACT;AAAA,IACF;AAEA,QAAI,IAAI,SAAS,CAAC,MAAM,KAAK;AAC3B,YAAMG,UAAS,IAAI,QAAQ,KAAK,MAAM;AACtC,UAAIA,UAAS,GAAG;AACd,cAAM,IAAI,MAAM,0CAA0C;AAAA,MAC5D;AAEA,YAAMC,QAAO,MAAM,IAAI;AACvB,UAAI,CAACA,SAAQ,MAAM,WAAW,GAAG;AAC/B,cAAM,IAAI,MAAM,wCAAwC;AAAA,MAC1D;AAEA,MAAAA,MAAK,kBAAkB;AACvB,MAAAA,MAAK,MAAMD,UAAS;AACpB,eAASA,UAAS;AAClB;AAAA,IACF;AAEA,UAAM,SAAS,IAAI,QAAQ,KAAK,MAAM;AACtC,QAAI,SAAS,GAAG;AACd,YAAM,IAAI,MAAM,0CAA0C;AAAA,IAC5D;AAEA,UAAM,SAAS,IAAI,MAAM,SAAS,GAAG,MAAM;AAC3C,UAAM,cAAc,SAAS,KAAK,MAAM;AACxC,UAAM,gBAAgB,cAAc,OAAO,QAAQ,UAAU,EAAE,IAAI;AACnE,UAAM,QAAQ,cAAc,KAAK,EAAE,MAAM,OAAO,CAAC;AACjD,UAAM,OAAO,MAAM,CAAC;AACpB,QAAI,CAAC,MAAM;AACT,YAAM,IAAI,MAAM,gCAAgC;AAAA,IAClD;AAEA,UAAM,aAAa,gBAAgB,cAAc,MAAM,KAAK,MAAM,CAAC;AACnE,UAAM,OAAuB;AAAA,MAC3B,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA,UAAU,CAAC;AAAA,MACX,OAAO;AAAA,MACP,KAAK,cAAc,SAAS,IAAI,IAAI;AAAA,MACpC,eAAe,SAAS;AAAA,MACxB,iBAAiB,SAAS;AAAA,IAC5B;AAEA,UAAM,MAAM,SAAS,CAAC,GAAG,SAAS,KAAK,IAAI;AAC3C,aAAS,SAAS;AAElB,QAAI,CAAC,aAAa;AAChB,YAAM,KAAK,IAAI;AAAA,IACjB;AAAA,EACF;AAEA,MAAI,MAAM,WAAW,GAAG;AACtB,UAAM,IAAI,MAAM,kCAAkC;AAAA,EACpD;AAEA,SAAO;AACT;AAEO,SAAS,yBACd,MACA,gBACgB;AAChB,QAAM,QAAQ,iBAAiB,MAAM,cAAc;AACnD,MAAI,CAAC,OAAO;AACV,UAAM,IAAI,MAAM,aAAa,cAAc,YAAY;AAAA,EACzD;AAEA,SAAO;AACT;AAEO,SAAS,iBACd,MACA,gBAC4B;AAC5B,SAAO,KAAK,SAAS;AAAA,IACnB,CAAC,UACC,MAAM,SAAS,aAAa,UAAU,MAAM,IAAI,MAAM;AAAA,EAC1D;AACF;AAEO,SAAS,UAAU,MAAsB;AAC9C,QAAM,iBAAiB,KAAK,QAAQ,GAAG;AACvC,SAAO,kBAAkB,IAAI,KAAK,MAAM,iBAAiB,CAAC,IAAI;AAChE;AAEA,SAAS,gBAAgB,QAAwC;AAC/D,QAAM,aAAqC,CAAC;AAC5C,QAAM,mBAAmB;AAEzB,aAAW,SAAS,OAAO,SAAS,gBAAgB,GAAG;AACrD,UAAM,MAAM,MAAM,CAAC;AACnB,QAAI,CAAC,KAAK;AACR;AAAA,IACF;AAEA,UAAM,WAAW,MAAM,CAAC,KAAK,MAAM,CAAC,KAAK;AACzC,eAAW,GAAG,IAAI,kBAAkB,QAAQ;AAAA,EAC9C;AAEA,SAAO;AACT;AAEA,SAAS,kBAAkB,OAAuB;AAChD,SAAO,MACJ,QAAQ,SAAS,GAAG,EACpB,QAAQ,SAAS,GAAG,EACpB,QAAQ,WAAW,GAAI,EACvB,QAAQ,WAAW,GAAG,EACtB,QAAQ,UAAU,GAAG;AAC1B;;;AC5UO,SAAS,yCACd,aACA,WACA,aAAmD,sBAAsB,WAAW,GAClD;AAClC,QAAM,eAAiC,CAAC;AACxC,QAAM,wBAAkC,CAAC;AACzC,QAAM,qBAA+B,CAAC;AACtC,QAAM,mBAAmB,oBAAI,IAG3B;AAEF,aAAW,YAAY,WAAW;AAChC,QAAI,SAAS,WAAW,YAAY,SAAS,OAAO,SAAS,SAAS;AACpE;AAAA,IACF;AAEA,QAAI,SAAS,SAAS,eAAe,SAAS,SAAS,YAAY;AACjE;AAAA,IACF;AAEA,UAAM,OAAO,SAAS,SAAS;AAC/B,QAAI,SAAS,yBAAyB,SAAS,sBAAsB;AACnE,YAAM,oBAAoB,+BAA+B,YAAY,QAAQ;AAC7E,UAAI,CAAC,mBAAmB;AACtB,2BAAmB,KAAK,SAAS,UAAU;AAC3C;AAAA,MACF;AAEA,YAAM,QAAQ,iBAAiB,IAAI,kBAAkB,cAAc,KAAK;AAAA,QACtE,UAAU;AAAA,QACV,SAAS,CAAC;AAAA,QACV,aAAa,CAAC;AAAA,MAChB;AACA,YAAM,QAAQ,KAAK,8BAA8B,QAAQ,CAAC;AAC1D,YAAM,YAAY,KAAK,SAAS,UAAU;AAC1C,uBAAiB,IAAI,kBAAkB,gBAAgB,KAAK;AAC5D,4BAAsB,KAAK,SAAS,UAAU;AAC9C;AAAA,IACF;AAEA,UAAM,mBAAmB,+BAA+B,aAAa,YAAY,QAAQ;AACzF,QAAI,CAAC,kBAAkB;AACrB,yBAAmB,KAAK,SAAS,UAAU;AAC3C;AAAA,IACF;AAEA,iBAAa,KAAK,gBAAgB;AAClC,0BAAsB,KAAK,SAAS,UAAU;AAAA,EAChD;AAEA,aAAW,EAAE,UAAU,SAAS,YAAY,KAAK,iBAAiB,OAAO,GAAG;AAC1E,UAAM,qBAAqB;AAAA,MACzB;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,QAAI,CAAC,oBAAoB;AACvB,yBAAmB,KAAK,GAAG,WAAW;AACtC;AAAA,IACF;AAEA,iBAAa,KAAK,kBAAkB;AAAA,EACtC;AAEA,SAAO;AAAA,IACL,aAAa,kBAAkB,aAAa,YAAY;AAAA,IACxD;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,+BACP,aACA,YACA,UAC4B;AAC5B,QAAM,EAAE,OAAO,IAAI;AACnB,MAAI,OAAO,SAAS,SAAS;AAC3B,WAAO;AAAA,EACT;AACA,QAAM,oBAAoB,8BAA8B,YAAY,OAAO,MAAM,MAAM,OAAO,MAAM,EAAE;AACtG,MAAI,CAAC,mBAAmB;AACtB,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,kBAAkB,WAAW,IAAI,OAAO,MAAM,IAAI;AACrE,QAAM,WAAW,kBAAkB,WAAW,IAAI,OAAO,MAAM,EAAE;AACjE,MAAI,eAAe,UAAa,aAAa,UAAa,WAAW,YAAY;AAC/E,WAAO;AAAA,EACT;AAEA,QAAM,MAAM,YAAY,MAAM,YAAY,QAAQ;AAClD,QAAM,aAAa,4BAA4B,QAAQ;AACvD,SAAO;AAAA,IACL,OAAO;AAAA,IACP,KAAK;AAAA,IACL,aACE,SAAS,SAAS,cACd,SAAS,UAAU,IAAI,GAAG,aAC1B,SAAS,UAAU,IAAI,4BAA4B,GAAG,CAAC;AAAA,EAC/D;AACF;AAEA,SAAS,8BAA8B,UAAkC;AACvE,QAAM,aAAa,SAAS,SAAS,cAAc,UAAU;AAC7D,SAAO,IAAI,UAAU,GAAG,4BAA4B,QAAQ,CAAC;AAC/D;AAEA,SAAS,iCACP,aACA,mBACA,SAC4B;AAC5B,QAAM,eAAe,YAAY;AAAA,IAC/B,kBAAkB;AAAA,IAClB,kBAAkB;AAAA,EACpB;AACA,QAAM,YAAY,QAAQ,KAAK,EAAE;AACjC,QAAM,uCAAuC;AAAA,IAC3C;AAAA,IACA,kBAAkB;AAAA,IAClB,kBAAkB;AAAA,IAClB;AAAA,EACF;AACA,MAAI,yCAAyC,QAAW;AACtD,WAAO;AAAA,MACL,OAAO;AAAA,MACP,KAAK;AAAA,MACL,aAAa;AAAA,IACf;AAAA,EACF;AAEA,QAAM,oCAAoC;AAAA,IACxC;AAAA,IACA,kBAAkB;AAAA,IAClB,kBAAkB;AAAA,IAClB;AAAA,EACF;AACA,MAAI,sCAAsC,QAAW;AACnD,WAAO;AAAA,MACL,OAAO;AAAA,MACP,KAAK;AAAA,MACL,aAAa,UAAU,SAAS;AAAA,IAClC;AAAA,EACF;AAEA,MAAI,CAAC,aAAa,KAAK,YAAY,GAAG;AACpC,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,OAAO,kBAAkB;AAAA,IACzB,KAAK,kBAAkB;AAAA,IACvB,aAAa,iBAAiB,SAAS;AAAA,EACzC;AACF;AAEA,SAAS,8BACP,YACA,MACA,IACuC;AACvC,SAAO,WAAW;AAAA,IAChB,CAAC,aAAa,QAAQ,SAAS,SAAS,MAAM,SAAS;AAAA,EACzD;AACF;AAEA,SAAS,+BACP,YACA,UACuC;AACvC,QAAM,SAAS,SAAS,OAAO,SAAS,UAAU,SAAS,OAAO,MAAM,OAAO;AAC/E,MAAI,WAAW,QAAW;AACxB,WAAO;AAAA,EACT;AAEA,SAAO,WAAW;AAAA,IAChB,CAAC,aACC,SAAS,QAAQ,UAChB,UAAU,SAAS,SAAS,UAAU,SAAS;AAAA,EACpD;AACF;AAEA,SAAS,4BAA4B,UAAkC;AACrE,QAAM,aAAa;AAAA,IACjB,QAAQ,SAAS,SAAS,mBAAmB,mBAAmB,SAAS,UAAU;AAAA,IACnF,YAAY,SAAS;AAAA,IACrB,UAAU,SAAS;AAAA,EACrB;AAEA,SAAO,OAAO,QAAQ,UAAU,EAC7B,OAAO,CAAC,CAAC,EAAE,KAAK,MAAM,SAAS,MAAM,SAAS,CAAC,EAC/C,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,IAAI,IAAI,KAAKE,iBAAgB,KAAK,CAAC,GAAG,EAC7D,KAAK,EAAE;AACZ;AAEA,SAAS,6BACP,aACA,OACA,KACA,SACoB;AACpB,MAAI,UAAU,UAAa,QAAQ,QAAW;AAC5C,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,KAAK,OAAO;AAC/B,QAAM,eAAe,YAAY,YAAY,YAAY,GAAG;AAC5D,MAAI,eAAe,OAAO;AACxB,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,mBAAmB,YAA4B;AACtD,QAAM,cAAc,SAAS,KAAK,UAAU,IAAI,CAAC;AACjD,SAAO,eAAe,WAAW,QAAQ,oBAAoB,GAAG;AAClE;AAEA,SAAS,4BAA4B,KAAqB;AACxD,SAAO,IACJ,QAAQ,gBAAgB,cAAc,EACtC,QAAQ,wBAAwB,mBAAmB;AACxD;AAEA,SAAS,kBAAkB,aAAqB,cAAiD;AAC/F,QAAM,SAAS,aACZ,MAAM,EACN,KAAK,CAAC,MAAM,UAAU,MAAM,QAAQ,KAAK,SAAS,MAAM,MAAM,KAAK,GAAG;AACzE,MAAI,SAAS;AAEb,aAAW,eAAe,QAAQ;AAChC,aACE,OAAO,MAAM,GAAG,YAAY,KAAK,IACjC,YAAY,cACZ,OAAO,MAAM,YAAY,GAAG;AAAA,EAChC;AAEA,SAAO;AACT;AAEA,SAASA,iBAAgB,OAAuB;AAC9C,SAAO,MACJ,QAAQ,MAAM,OAAO,EACrB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,QAAQ;AAC3B;;;AClQO,SAAS,gCACd,SACA,UACA,WACkB;AAClB,QAAM,iBAAiB,sBAAsB,UAAU,SAAS;AAChE,MAAI,eAAe,SAAS,GAAG;AAC7B,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU,gBAAgB,QAAQ,UAAU,gBAAgB,GAAG,IAAI,EAAE;AAAA,EACvE;AACF;AAEA,SAAS,sBACP,UACA,WACa;AACb,QAAM,YAAY,oBAAI,IAAY;AAElC,aAAW,UAAU,UAAU;AAC7B,QAAI,OAAO,OAAO,SAAS,SAAS;AAClC;AAAA,IACF;AAEA,cAAU,IAAI,OAAO,OAAO,MAAM,IAAI;AACtC,cAAU,IAAI,OAAO,OAAO,MAAM,EAAE;AAAA,EACtC;AAEA,aAAW,YAAY,WAAW;AAChC,QAAI,SAAS,WAAW,YAAY,SAAS,OAAO,SAAS,SAAS;AACpE;AAAA,IACF;AAEA,QACE,SAAS,SAAS,yBAAyB,yBAC3C,SAAS,SAAS,yBAAyB,sBAC3C;AACA;AAAA,IACF;AAEA,cAAU,IAAI,SAAS,OAAO,MAAM,IAAI;AACxC,cAAU,IAAI,SAAS,OAAO,MAAM,EAAE;AAAA,EACxC;AAEA,SAAO;AACT;AAEA,SAAS,eACP,WACA,gBACA,QAC8C;AAC9C,QAAM,WAAyB,CAAC;AAChC,MAAI,aAAa;AAEjB,aAAW,SAAS,UAAU,UAAU;AACtC,QAAI,MAAM,SAAS,QAAQ;AACzB,YAAM,QAAQ,cAAc,OAAO,gBAAgB,UAAU;AAC7D,eAAS,KAAK,GAAG,MAAM,QAAQ;AAC/B,mBAAa,MAAM;AACnB;AAAA,IACF;AAEA,QAAI,MAAM,SAAS,aAAa;AAC9B,YAAM,QAAQ,mBAAmB,OAAO,gBAAgB,UAAU;AAClE,eAAS,KAAK,GAAG,MAAM,QAAQ;AAC/B,mBAAa,MAAM;AACnB;AAAA,IACF;AAEA,aAAS,KAAK,KAAK;AACnB,kBAAc,qCAAqC,KAAK;AAAA,EAC1D;AAEA,SAAO;AAAA,IACL,WAAW;AAAA,MACT,GAAG;AAAA,MACH;AAAA,IACF;AAAA,IACA,QAAQ;AAAA,EACV;AACF;AAEA,SAAS,gBACP,QACA,gBACA,QACA,+BAIA;AACA,QAAM,WAAyC,CAAC;AAChD,MAAI,aAAa;AACjB,aAAW,CAAC,OAAO,KAAK,KAAK,OAAO,QAAQ,GAAG;AAC7C,QAAI,MAAM,SAAS,aAAa;AAC9B,UAAI,iCAAiC,QAAQ,GAAG;AAC9C,sBAAc;AAAA,MAChB;AACA,YAAM,OAAO,eAAe,OAAO,gBAAgB,UAAU;AAC7D,eAAS,KAAK,KAAK,SAAS;AAC5B,mBAAa,KAAK;AAClB;AAAA,IACF;AAEA,QAAI,MAAM,SAAS,SAAS;AAC1B,YAAM,OAAO,6BAA6B,OAAO,gBAAgB,UAAU;AAC3E,eAAS,KAAK,KAAK,KAAK;AACxB,mBAAa,KAAK;AAClB;AAAA,IACF;AAEA,QAAI,MAAM,SAAS,OAAO;AACxB,YAAM,OAAO,gBAAgB,MAAM,UAAU,gBAAgB,YAAY,KAAK;AAC9E,eAAS,KAAK;AAAA,QACZ,GAAG;AAAA,QACH,UAAU,KAAK;AAAA,MACjB,CAAC;AACD,mBAAa,KAAK;AAClB;AAAA,IACF;AAEA,QAAI,MAAM,SAAS,cAAc;AAC/B,eAAS,KAAK,KAAK;AACnB,oBAAc;AACd;AAAA,IACF;AAEA,aAAS,KAAK,KAAK;AACnB,kBAAc;AAAA,EAChB;AAEA,SAAO;AAAA,IACL;AAAA,IACA,QAAQ;AAAA,EACV;AACF;AAEA,SAAS,6BACP,OACA,gBACA,QAIA;AACA,MAAI,aAAa;AACjB,QAAM,OAAO,MAAM,KAAK,IAAI,CAAC,SAAS;AAAA,IACpC,GAAG;AAAA,IACH,OAAO,IAAI,MAAM,IAAI,CAAC,SAAS;AAC7B,YAAM,OAAO,gBAAgB,KAAK,UAAU,gBAAgB,YAAY,KAAK;AAC7E,mBAAa,KAAK;AAClB,aAAO;AAAA,QACL,GAAG;AAAA,QACH,UAAU,KAAK;AAAA,MACjB;AAAA,IACF,CAAC;AAAA,EACH,EAAE;AAEF,SAAO;AAAA,IACL,OAAO;AAAA,MACL,GAAG;AAAA,MACH;AAAA,IACF;AAAA,IACA,QAAQ;AAAA,EACV;AACF;AA0DA,SAAS,mBACP,MACA,gBACA,QAC+C;AAC/C,MAAI,aAAa;AACjB,QAAM,SAA2C,CAAC,CAAC,CAAC;AAEpD,aAAW,SAAS,KAAK,UAAU;AACjC,QAAI,MAAM,SAAS,QAAQ;AACzB,YAAM,QAAQ,cAAc,OAAO,gBAAgB,UAAU;AAC7D,iBAAW,SAAS,MAAM,UAAU;AAClC,eAAO,OAAO,SAAS,CAAC,GAAG,KAAK,KAAK;AACrC,sBAAc,MAAM,KAAK,MAAM,IAAI,EAAE;AACrC,YAAI,eAAe,IAAI,UAAU,GAAG;AAClC,iBAAO,KAAK,CAAC,CAAC;AAAA,QAChB;AAAA,MACF;AACA;AAAA,IACF;AAEA,WAAO,OAAO,SAAS,CAAC,GAAG,KAAK,KAAK;AACrC,kBAAc,qCAAqC,KAAK;AACxD,QAAI,eAAe,IAAI,UAAU,GAAG;AAClC,aAAO,KAAK,CAAC,CAAC;AAAA,IAChB;AAAA,EACF;AAEA,QAAM,aAAa,OAChB,OAAO,CAAC,aAAa,SAAS,SAAS,CAAC,EACxC,IAAI,CAAC,cAAc;AAAA,IAClB,MAAM;AAAA,IACN,MAAM,KAAK;AAAA,IACX;AAAA,EACF,EAAE;AAEJ,SAAO;AAAA,IACL,UAAU,WAAW,SAAS,IAAI,aAAa,CAAC,IAAI;AAAA,IACpD,QAAQ;AAAA,EACV;AACF;AAEA,SAAS,cACP,MACA,gBACA,QAC0C;AAC1C,QAAM,aAAa,MAAM,KAAK,KAAK,IAAI;AACvC,MAAI,WAAW,WAAW,GAAG;AAC3B,WAAO,EAAE,UAAU,CAAC,GAAG,OAAO;AAAA,EAChC;AAEA,QAAM,aAAa,oBAAI,IAAY,CAAC,GAAG,WAAW,MAAM,CAAC;AACzD,WAAS,QAAQ,GAAG,QAAQ,WAAW,QAAQ,SAAS,GAAG;AACzD,QAAI,eAAe,IAAI,SAAS,KAAK,GAAG;AACtC,iBAAW,IAAI,KAAK;AAAA,IACtB;AAAA,EACF;AAEA,QAAM,UAAU,CAAC,GAAG,UAAU,EAAE,KAAK,CAAC,MAAM,UAAU,OAAO,KAAK;AAClE,QAAM,WAAuB,CAAC;AAE9B,WAAS,QAAQ,GAAG,QAAQ,QAAQ,SAAS,GAAG,SAAS,GAAG;AAC1D,UAAM,QAAQ,QAAQ,KAAK,KAAK;AAChC,UAAM,MAAM,QAAQ,QAAQ,CAAC,KAAK,WAAW;AAC7C,UAAM,OAAO,WAAW,MAAM,OAAO,GAAG,EAAE,KAAK,EAAE;AACjD,QAAI,KAAK,WAAW,GAAG;AACrB;AAAA,IACF;AAEA,aAAS,KAAK;AAAA,MACZ,MAAM;AAAA,MACN;AAAA,MACA,GAAI,KAAK,SAAS,KAAK,MAAM,SAAS,IAAI,EAAE,OAAO,KAAK,MAAM,IAAI,CAAC;AAAA,IACrE,CAAC;AAAA,EACH;AAEA,SAAO;AAAA,IACL,UAAU,SAAS,SAAS,IAAI,WAAW,CAAC,IAAI;AAAA,IAChD,QAAQ,SAAS,WAAW;AAAA,EAC9B;AACF;AAEA,SAAS,qCAAqC,MAA0B;AACtE,UAAQ,KAAK,MAAM;AAAA,IACjB,KAAK;AACH,aAAO,MAAM,KAAK,KAAK,IAAI,EAAE;AAAA,IAC/B,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO,KAAK,SAAS;AAAA,QACnB,CAAC,MAAM,UAAU,OAAO,qCAAqC,KAAK;AAAA,QAClE;AAAA,MACF;AAAA,IACF,KAAK,SAAS;AACZ,YAAM,aAAa,KAAK,SAAS;AAAA,QAC/B,CAAC,MAAM,UAAU,OAAO,qCAAqC,KAAK;AAAA,QAClE;AAAA,MACF;AACA,aAAO,aAAa,IAAI,aAAa;AAAA,IACvC;AAAA,IACA,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;;;ACjSA,IAAM,4BACJ;AACF,IAAM,qCACJ;AACF,IAAM,gCACJ;AACF,IAAM,0BACJ;AAaK,SAAS,2BACd,SACA,UAA6C,CAAC,GACpB;AAC1B,QAAM,sBAAsB,QAAQ,OAAO,CAAC,WAAW,OAAO,QAAQ,SAAS,CAAC;AAChF,QAAM,wBAAwB,QAAQ,wBAAwB,CAAC,GAC5D,MAAM,EACN,KAAK,CAAC,MAAM,UAAU,KAAK,QAAQ,MAAM,KAAK;AACjD,QAAM,oBAAoB,IAAI;AAAA,IAC5B,oBAAoB,IAAI,CAAC,WAAW,CAAC,OAAO,WAAW,MAAM,CAAC;AAAA,EAChE;AACA,QAAM,mBACJ,QAAQ,oBACR,yBAAyB,qBAAqB,oBAAoB;AACpE,QAAM,sBAAsB;AAAA,IAC1B;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,QAAM,2BAA2B,IAAI;AAAA,IACnC,oBAAoB,IAAI,CAAC,UAAU,CAAC,MAAM,iBAAiB,KAAK,CAAC;AAAA,EACnE;AACA,QAAM,mBAAmB,oBAAI,IAAY;AACzC,QAAM,iBAA2B,CAAC;AAElC,aAAW,cAAc,sBAAsB;AAC7C,UAAM,cAAc,kBAAkB,IAAI,WAAW,SAAS;AAC9D,QAAI,aAAa;AACf,UAAI,iBAAiB,IAAI,YAAY,SAAS,GAAG;AAC/C;AAAA,MACF;AACA,qBAAe;AAAA,QACb,GAAG;AAAA,UACD,oBAAoB,OAAO,CAAC,UAAU,MAAM,OAAO,cAAc,YAAY,SAAS;AAAA,QACxF;AAAA,MACF;AACA,uBAAiB,IAAI,YAAY,SAAS;AAC1C;AAAA,IACF;AAEA,QAAI,yBAAyB,IAAI,WAAW,SAAS,GAAG;AACtD;AAAA,IACF;AAEA,mBAAe,KAAK,WAAW,MAAM;AAAA,EACvC;AAEA,aAAW,UAAU,qBAAqB;AACxC,QAAI,iBAAiB,IAAI,OAAO,SAAS,GAAG;AAC1C;AAAA,IACF;AAEA,mBAAe;AAAA,MACb,GAAG;AAAA,QACD,oBAAoB,OAAO,CAAC,UAAU,MAAM,OAAO,cAAc,OAAO,SAAS;AAAA,MACnF;AAAA,IACF;AACA,qBAAiB,IAAI,OAAO,SAAS;AAAA,EACvC;AAEA,QAAM,wBAAwB;AAAA,IAC5B,GAAG;AAAA,MACD,qBAAqB,OAAO,CAAC,eAAe,CAAC,yBAAyB,IAAI,WAAW,SAAS,CAAC;AAAA,IACjG;AAAA,IACA,GAAG,oBACA,IAAI,CAAC,UAAU,0BAA0B,KAAK,CAAC,EAC/C,OAAO,CAAC,QAAuB,QAAQ,GAAG,CAAC;AAAA,EAChD;AACA,QAAM,mBAAmB;AAAA,IACvB,GAAG;AAAA,MACD,qBAAqB,OAAO,CAAC,eAAe,CAAC,yBAAyB,IAAI,WAAW,SAAS,CAAC;AAAA,IACjG;AAAA,IACA,GAAG,oBACA,IAAI,CAAC,UAAU,0BAA0B,KAAK,CAAC,EAC/C,OAAO,CAAC,QAAuB,QAAQ,GAAG,CAAC;AAAA,EAChD;AACA,QAAM,gBAAgB,oBAAI,IAAI;AAAA,IAC5B,GAAI,QAAQ,iBAAiB,CAAC;AAAA,IAC9B,GAAG,qBACA,IAAI,CAAC,eAAe,WAAW,QAAQ,EACvC,OAAO,CAAC,aAAiC,OAAO,aAAa,YAAY,SAAS,SAAS,CAAC;AAAA,IAC/F,GAAG,oBACA,IAAI,CAAC,UAAU,MAAM,MAAM,QAAQ,EACnC,OAAO,CAAC,aAAiC,OAAO,aAAa,YAAY,SAAS,SAAS,CAAC;AAAA,EACjG,CAAC;AAED,SAAO;AAAA,IACL,aAAa;AAAA,MACX;AAAA,MACA,yBAAyB,QAAQ,iBAAiB,yBAAyB;AAAA,MAC3E,GAAG;AAAA,MACH;AAAA,IACF,EAAE,KAAK,IAAI;AAAA,IACX,sBAAsB,oBAAoB,IAAI,CAAC,WAAW,OAAO,SAAS;AAAA,IAC1E,qBACE,sBAAsB,SAAS,IAC3B;AAAA,MACE;AAAA,MACA,QAAQ,yBAAyB;AAAA,MACjC,GAAG;AAAA,MACH;AAAA,IACF,EAAE,KAAK,IAAI,IACX;AAAA,IACN,gBACE,iBAAiB,SAAS,IACtB;AAAA,MACE;AAAA,MACA,QAAQ,oBAAoB;AAAA,MAC5B,GAAG;AAAA,MACH;AAAA,IACF,EAAE,KAAK,IAAI,IACX;AAAA,IACN,WACE,cAAc,OAAO,IACjB;AAAA,MACE;AAAA,MACA,QAAQ,uBAAuB;AAAA,MAC/B,GAAG,CAAC,GAAG,aAAa,EACjB,KAAK,CAAC,MAAM,UAAU,KAAK,cAAc,KAAK,CAAC,EAC/C;AAAA,QACC,CAAC,aACC,2BAA2BC,iBAAgB,QAAQ,CAAC;AAAA,MACxD;AAAA,MACF;AAAA,IACF,EAAE,KAAK,IAAI,IACX;AAAA,EACR;AACF;AAEA,SAAS,yBAAyB,SAAyB;AACzD,MAAI,aAAa;AACjB,MAAI,CAAC,gBAAgB,KAAK,UAAU,GAAG;AACrC,iBAAa,WAAW;AAAA,MACtB;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,MAAI,CAAC,eAAe,KAAK,UAAU,GAAG;AACpC,iBAAa,WAAW;AAAA,MACtB;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,MAAI,CAAC,mBAAmB,KAAK,UAAU,GAAG;AACxC,iBAAa,WAAW,QAAQ,OAAO,sBAAsB;AAAA,EAC/D,WAAW,CAAC,gCAAgC,KAAK,UAAU,GAAG;AAC5D,iBAAa,WAAW;AAAA,MACtB;AAAA,MACA,CAAC,QAAQ,UACP,iBAAiB,GAAG,KAAK,OAAO,KAAK,EAAE,QAAQ,SAAS,GAAG,CAAC;AAAA,IAChE;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,uCACd,aACA,SACA,aAGM,uBAAuB,WAAW,GACxC,UAA0C,CAAC,GACV;AACjC,QAAM,aAAa,oBAAI,IAAsB;AAC7C,QAAM,uBAAiC,CAAC;AACxC,QAAM,oBAA8B,CAAC;AACrC,QAAM,mBACJ,QAAQ,oBAAoB,yBAAyB,OAAO;AAE9D,aAAW,UAAU,SAAS;AAC5B,UAAM,EAAE,OAAO,IAAI;AACnB,QAAI,OAAO,SAAS,SAAS;AAC3B,wBAAkB,KAAK,OAAO,SAAS;AACvC;AAAA,IACF;AAEA,UAAM,YAAY,WAAW;AAAA,MAC3B,CAAC,cACC,OAAO,MAAM,QAAQ,UAAU,SAC/B,OAAO,MAAM,MAAM,UAAU;AAAA,IACjC;AAEA,QAAI,CAAC,WAAW;AACd,wBAAkB,KAAK,OAAO,SAAS;AACvC;AAAA,IACF;AAEA,UAAM,aAAa,UAAU,WAAW,IAAI,OAAO,MAAM,IAAI;AAC7D,UAAM,WAAW,UAAU,WAAW,IAAI,OAAO,MAAM,EAAE;AAEzD,QAAI,eAAe,UAAa,aAAa,QAAW;AACtD,wBAAkB,KAAK,OAAO,SAAS;AACvC;AAAA,IACF;AAEA,UAAM,kBAAkB,iBAAiB,IAAI,OAAO,SAAS,KAAK,OAAO;AACzE;AAAA,MACE;AAAA,MACA;AAAA,MACA,8BAA8BA,iBAAgB,eAAe,CAAC;AAAA,IAChE;AACA;AAAA,MACE;AAAA,MACA;AAAA,MACA,4BAA4BA,iBAAgB,eAAe,CAAC;AAAA,IAC9D;AACA;AAAA,MACE;AAAA,MACA;AAAA,MACA,kCAAkCA,iBAAgB,eAAe,CAAC;AAAA,IACpE;AACA,yBAAqB,KAAK,OAAO,SAAS;AAAA,EAC5C;AAEA,QAAM,mBAAmB,CAAC,GAAG,WAAW,QAAQ,CAAC,EAAE,KAAK,CAAC,MAAM,UAAU,KAAK,CAAC,IAAI,MAAM,CAAC,CAAC;AAC3F,MAAI,SAAS;AACb,MAAI,SAAS;AAEb,aAAW,CAAC,OAAO,QAAQ,KAAK,kBAAkB;AAChD,cAAU,YAAY,MAAM,QAAQ,KAAK;AACzC,cAAU,SAAS,KAAK,EAAE;AAC1B,aAAS;AAAA,EACX;AAEA,YAAU,YAAY,MAAM,MAAM;AAElC,SAAO;AAAA,IACL,aAAa;AAAA,IACb;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,yBACd,SACA,uBAA6D,CAAC,GACjC;AAC7B,QAAM,YAAY,oBAAI,IAAoB;AAC1C,QAAM,qBAAqB,oBAAI,IAAY;AAE3C,aAAW,cAAc,sBAAsB;AAC7C,UAAM,YAAY,oBAAoB,WAAW,SAAS;AAC1D,QAAI,cAAc,QAAW;AAC3B,yBAAmB,IAAI,SAAS;AAAA,IAClC;AAAA,EACF;AAEA,aAAW,UAAU,SAAS;AAC5B,UAAM,YAAY,aAAa,MAAM;AACrC,UAAM,iBACJ,OAAO,UAAU,sBACjB,WAAW,UAAU,kBACrB,OAAO;AACT,UAAM,YAAY,oBAAoB,cAAc;AACpD,QAAI,cAAc,UAAa,CAAC,mBAAmB,IAAI,SAAS,GAAG;AACjE,gBAAU,IAAI,OAAO,WAAW,OAAO,SAAS,CAAC;AACjD,yBAAmB,IAAI,SAAS;AAAA,IAClC;AAAA,EACF;AAEA,MAAI,kBACF,mBAAmB,OAAO,IAAI,KAAK,IAAI,GAAG,kBAAkB,IAAI,IAAI;AAEtE,aAAW,UAAU,SAAS;AAC5B,QAAI,UAAU,IAAI,OAAO,SAAS,GAAG;AACnC;AAAA,IACF;AAEA,WAAO,mBAAmB,IAAI,eAAe,GAAG;AAC9C,yBAAmB;AAAA,IACrB;AAEA,cAAU,IAAI,OAAO,WAAW,OAAO,eAAe,CAAC;AACvD,uBAAmB,IAAI,eAAe;AACtC,uBAAmB;AAAA,EACrB;AAEA,SAAO;AACT;AAEA,SAAS,0BACP,SACA,sBACA,kBAC4B;AAC5B,QAAM,UAAsC,CAAC;AAC7C,QAAM,qBAAqB,oBAAI,IAAY;AAE3C,aAAW,cAAc,sBAAsB;AAC7C,UAAM,YAAY,oBAAoB,WAAW,SAAS;AAC1D,QAAI,cAAc,QAAW;AAC3B,yBAAmB,IAAI,SAAS;AAAA,IAClC;AAAA,EACF;AAEA,aAAW,UAAU,SAAS;AAC5B,UAAM,YAAY,aAAa,MAAM;AACrC,QAAI,CAAC,WAAW;AACd;AAAA,IACF;AAEA,UAAM,sBAAsB,iBAAiB,IAAI,OAAO,SAAS,KAAK,OAAO;AAC7E,UAAM,gBAAgB,oBAAoB,mBAAmB;AAC7D,QAAI,kBAAkB,QAAW;AAC/B,yBAAmB,IAAI,aAAa;AAAA,IACtC;AAEA,UAAM,aACJ,UAAU,UAAU,UACpB,OAAO,UAAU,cACjB,eAAe,OAAO,WAAW,CAAC;AACpC,UAAM,gBACJ,UAAU,UAAU,aACpB,gBAAgB,WAAW,qBAAqB,CAAC;AAEnD,YAAQ,KAAK;AAAA,MACX;AAAA,MACA,OAAO;AAAA,MACP,iBAAiB;AAAA,MACjB,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,QAAQ;AAAA,IACV,CAAC;AAED,aAAS,QAAQ,GAAG,QAAQ,OAAO,QAAQ,QAAQ,SAAS,GAAG;AAC7D,YAAM,QAAQ,OAAO,QAAQ,KAAK;AAClC,UAAI,CAAC,OAAO;AACV;AAAA,MACF;AAEA,YAAM,qBAAqB,MAAM,UAAU;AAC3C,UAAI;AACJ,YAAM,qBAAqB,qBACvB,oBAAoB,kBAAkB,IACtC;AACJ,UACE,uBAAuB,UACvB,CAAC,mBAAmB,IAAI,kBAAkB,GAC1C;AACA,0BAAkB,OAAO,kBAAkB;AAC3C,2BAAmB,IAAI,kBAAkB;AAAA,MAC3C,OAAO;AACL,YAAI,kBACF,mBAAmB,OAAO,IAAI,KAAK,IAAI,GAAG,kBAAkB,IAAI,IAAI;AACtE,eAAO,mBAAmB,IAAI,eAAe,GAAG;AAC9C,6BAAmB;AAAA,QACrB;AACA,0BAAkB,OAAO,eAAe;AACxC,2BAAmB,IAAI,eAAe;AAAA,MACxC;AAEA,cAAQ,KAAK;AAAA,QACX;AAAA,QACA;AAAA,QACA;AAAA,QACA,QAAQ,MAAM,UAAU,UAAU,eAAe,OAAO,WAAW,KAAK;AAAA,QACxE,WACE,MAAM,UAAU,aAChB,gBAAgB,OAAO,iBAAiB,KAAK;AAAA,QAC/C,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,uBAAuB,SAAwD;AACtF,SAAO,QAAQ,IAAI,CAAC,UAAU,sBAAsB,KAAK,CAAC;AAC5D;AAEA,SAAS,sBAAsB,OAAyC;AACtE,QAAM,SAASA,iBAAgB,MAAM,MAAM,QAAQ;AACnD,QAAM,YAAYA,iBAAgB,MAAM,MAAM,SAAS;AACvD,QAAM,WAAW,MAAM,MAAM,UAAU;AACvC,QAAM,eAAe,2BAA2B,MAAM,MAAM,MAAM,MAAM,MAAM;AAE9E,SAAO,oBAAoBA,iBAAgB,MAAM,eAAe,CAAC,IAAI,WAAW,gBAAgBA,iBAAgB,QAAQ,CAAC,MAAM,EAAE,cAAc,MAAM,aAAa,SAAS,KAAK,YAAY;AAC9L;AAEA,SAAS,2BAA2B,MAAc,QAAwB;AACxE,QAAM,aAAa,KAAK,SAAS,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,EAAE;AAC3D,QAAM,SAAS,uBAAuB,MAAM;AAC5C,SAAO,WACJ,IAAI,CAAC,WAAW,UAAU;AACzB,UAAM,aACJ,UAAU,IACN,gBAAgBA,iBAAgB,MAAM,CAAC,iBAAiBA,iBAAgB,MAAM,CAAC,MAC/E;AACN,WAAO,OAAO,UAAU,SAASC,eAAc,SAAS,CAAC;AAAA,EAC3D,CAAC,EACA,KAAK,EAAE;AACZ;AAEA,SAAS,oCACP,aACU;AACV,SAAO,YACJ;AAAA,IAAI,CAAC,eACJ,WAAW,SACP,mCAAmC,UAAU,IAC7C;AAAA,EACN,EACC,OAAO,CAAC,QAAuB,QAAQ,GAAG,CAAC;AAChD;AAEA,SAAS,mCACP,YACQ;AACR,QAAM,YAAY,WAAW,SAAS,SAAS;AAC/C,SAAO,8BAA8BD,iBAAgB,WAAW,MAAO,CAAC,IAAI,WAAW,eAAe,sBAAsBA,iBAAgB,WAAW,YAAY,CAAC,MAAM,EAAE,cAAc,SAAS;AACrM;AAEA,SAAS,0BACP,OACoB;AACpB,SAAO,8BAA8BA,iBAAgB,MAAM,MAAM,CAAC,IAAI,MAAM,SAAS,KAAK,sBAAsBA,iBAAgB,eAAe,MAAM,QAAQ,MAAM,MAAM,CAAC,CAAC,GAAG,cAAc,MAAM,UAAU,MAAM,OAAO,WAAW,aAAa,SAAS,OAAO;AACnQ;AAEA,SAAS,6BACP,aACU;AACV,SAAO,YACJ;AAAA,IAAI,CAAC,eACJ,WAAW,UAAU,WAAW,YAC5B,oCAAoCA,iBAAgB,WAAW,MAAM,CAAC,uBAAuBA,iBAAgB,WAAW,SAAS,CAAC,SAClI;AAAA,EACN,EACC,OAAO,CAAC,QAAuB,QAAQ,GAAG,CAAC;AAChD;AAEA,SAAS,0BACP,OACoB;AACpB,MAAI,CAAC,MAAM,WAAW;AACpB,WAAO;AAAA,EACT;AAEA,SAAO,oCAAoCA,iBAAgB,MAAM,MAAM,CAAC,uBAAuBA,iBAAgB,MAAM,SAAS,CAAC;AACjI;AAEA,SAAS,aAAa,QAAiD;AACrE,SAAO,OAAO,QAAQ,CAAC;AACzB;AAEA,SAAS,eAAe,QAAuB,UAA0B;AACvE,SACE,OAAO,QAAQ,CAAC,GAAG,UAAU,UAC7B,OAAO,UAAU,cACjB;AAEJ;AAEA,SAAS,eAAe,MAAc,OAAuB;AAC3D,QAAM,aAAa,GAAG,IAAI,IAAI,KAAK;AACnC,MAAI,OAAO;AAEX,WAAS,SAAS,GAAG,SAAS,WAAW,QAAQ,UAAU,GAAG;AAC5D,WAAQ,OAAO,KAAK,WAAW,WAAW,MAAM,MAAO;AAAA,EACzD;AAEA,SAAO,KAAK,SAAS,EAAE,EAAE,YAAY,EAAE,SAAS,GAAG,GAAG,EAAE,MAAM,EAAE;AAClE;AAEA,SAAS,gBACP,OACA,iBACA,OACQ;AACR,QAAM,OAAO,GAAG,MAAM,OAAO,IAAI,eAAe,IAAI,KAAK;AACzD,MAAI,OAAO;AAEX,WAAS,SAAS,GAAG,SAAS,KAAK,QAAQ,UAAU,GAAG;AACtD,WAAQ,OAAO,OAAO,OAAO,KAAK,WAAW,MAAM,CAAC,IAAK;AAAA,EAC3D;AAEA,SAAO,KAAK,SAAS,EAAE,EAAE,YAAY,EAAE,SAAS,IAAI,GAAG,EAAE,MAAM,GAAG;AACpE;AAEA,SAAS,uBAAuB,QAAwB;AACtD,SAAO,OAAO,MAAM,EAAE,EAAE,SAAS,GAAG,GAAG;AACzC;AAEA,SAAS,oBAAoB,OAAmC;AAC9D,MAAI,CAAC,WAAW,KAAK,KAAK,GAAG;AAC3B,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,OAAO,SAAS,OAAO,EAAE;AAC3C,SAAO,OAAO,SAAS,SAAS,IAAI,YAAY;AAClD;AAEO,SAAS,uBAAuB,aAA6C;AAClF,QAAM,OAAO,SAAS,WAAW;AACjC,QAAM,kBAAkBE,kBAAiB,MAAM,UAAU;AACzD,QAAM,cAAcA,kBAAiB,iBAAiB,MAAM;AAC5D,QAAM,aAAqC,CAAC;AAC5C;AAAA,IACE,YAAY;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,qCACP,OACA,aACA,YACA,cACA,gBACA,+BAIA;AACA,MAAI,aAAa;AACjB,MAAI,qBAAqB;AACzB,MAAI,eAAe;AAEnB,aAAW,QAAQ,OAAO;AACxB,QAAI,KAAK,SAAS,WAAW;AAC3B;AAAA,IACF;AACA,oBAAgB;AAEhB,UAAM,OAAOC,WAAU,KAAK,IAAI;AAChC,QAAI,SAAS,KAAK;AAChB,UAAI,iCAAiC,eAAe,GAAG;AACrD,sBAAc;AAAA,MAChB;AACA,4BAAsB;AACtB,YAAM,aAAa,oBAAI,IAAoB;AAC3C,iBAAW,IAAI,YAAY,KAAK,QAAQ,iBAAiB,aAAa,KAAK,KAAK,CAAC;AAEjF;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA,MAAM;AAAA,QACN,CAAC,SAAS;AACR,uBAAa;AAAA,QACf;AAAA,MACF;AAEA,UAAI,CAAC,WAAW,IAAI,UAAU,GAAG;AAC/B,mBAAW,IAAI,YAAY,KAAK,MAAM,CAAC;AAAA,MACzC;AACA,iBAAW,KAAK;AAAA,QACd,gBAAgB;AAAA,QAChB,OAAO,KAAK,IAAI,GAAG,WAAW,KAAK,CAAC;AAAA,QACpC,KAAK,KAAK,IAAI,GAAG,WAAW,KAAK,CAAC;AAAA,QAClC;AAAA,MACF,CAAC;AACD;AAAA,IACF;AAEA,QAAI,SAAS,OAAO;AAClB,iBAAW,SAAS,KAAK,UAAU;AACjC,YAAI,MAAM,SAAS,aAAaA,WAAU,MAAM,IAAI,MAAM,MAAM;AAC9D;AAAA,QACF;AACA,mBAAW,YAAY,MAAM,UAAU;AACrC,cAAI,SAAS,SAAS,aAAaA,WAAU,SAAS,IAAI,MAAM,MAAM;AACpE;AAAA,UACF;AACA,gBAAM,SAAS;AAAA,YACb,SAAS;AAAA,YACT;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AACA,uBAAa,OAAO;AACpB,+BAAqB,OAAO;AAAA,QAC9B;AAAA,MACF;AACA;AAAA,IACF;AAEA,QAAI,SAAS,OAAO;AAClB,YAAM,aAAaD,kBAAiB,MAAM,YAAY;AACtD,YAAM,SAAS;AAAA,QACb,WAAW;AAAA,QACX;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,mBAAa,OAAO;AACpB,2BAAqB,OAAO;AAC5B;AAAA,IACF;AAEA,QAAI,SAAS,aAAa;AACxB,oBAAc;AACd;AAAA,IACF;AAEA,kBAAc;AAAA,EAChB;AAEA,SAAO;AAAA,IACL,cAAc;AAAA,IACd,gBAAgB;AAAA,EAClB;AACF;AAEA,SAAS,2BACP,WACA,WACA,YACA,WACA,WACM;AACN,aAAW,SAAS,UAAU,UAAU;AACtC,gCAA4B,OAAO,WAAW,YAAY,WAAW,SAAS;AAAA,EAChF;AACF;AAEA,SAAS,4BACP,MACA,WACA,YACA,WACA,WACM;AACN,MAAI,KAAK,SAAS,WAAW;AAC3B;AAAA,EACF;AAEA,UAAQC,WAAU,KAAK,IAAI,GAAG;AAAA,IAC5B,KAAK,KAAK;AACR,UAAI,CAAC,WAAW,IAAI,UAAU,CAAC,GAAG;AAChC,mBAAW,IAAI,UAAU,GAAG,KAAK,KAAK;AAAA,MACxC;AAEA,iBAAW,SAAS,KAAK,UAAU;AACjC,oCAA4B,OAAO,WAAW,YAAY,WAAW,SAAS;AAAA,MAChF;AAEA,iBAAW,IAAI,UAAU,GAAG,KAAK,GAAG;AACpC;AAAA,IACF;AAAA,IACA,KAAK,KAAK;AACR,YAAM,OAAO,KAAK,SACf,OAAO,CAAC,UAAgC,MAAM,SAAS,MAAM,EAC7D,IAAI,CAAC,UAAU,MAAM,IAAI,EACzB,KAAK,EAAE;AACV,gBAAU,UAAU,IAAI,MAAM,KAAK,IAAI,EAAE,MAAM;AAC/C;AAAA,IACF;AAAA,IACA,KAAK;AAAA,IACL,KAAK,MAAM;AACT,YAAM,cAAc,UAAU;AAC9B,iBAAW,IAAI,aAAa,KAAK,KAAK;AACtC,YAAM,aAAa,cAAc;AACjC,iBAAW,IAAI,YAAY,KAAK,GAAG;AACnC,gBAAU,UAAU;AACpB;AAAA,IACF;AAAA,IACA;AACE,iBAAW,SAAS,KAAK,UAAU;AACjC,oCAA4B,OAAO,WAAW,YAAY,WAAW,SAAS;AAAA,MAChF;AAAA,EACJ;AACF;AAEA,SAAS,cACP,YACA,OACA,KACM;AACN,QAAM,SAAS,WAAW,IAAI,KAAK;AACnC,MAAI,QAAQ;AACV,WAAO,KAAK,GAAG;AACf;AAAA,EACF;AAEA,aAAW,IAAI,OAAO,CAAC,GAAG,CAAC;AAC7B;AAEA,SAASF,eAAc,MAAsB;AAC3C,QAAM,WAAWG,wBAAuB,IAAI,IAAI,0BAA0B;AAC1E,SAAO,OAAO,QAAQ,IAAIC,WAAU,IAAI,CAAC;AAC3C;AAEA,SAASD,wBAAuB,MAAuB;AACrD,SAAO,OAAO,KAAK,IAAI,KAAK,OAAO,KAAK,IAAI,KAAK,UAAU,KAAK,IAAI;AACtE;AAEA,SAASC,WAAU,OAAuB;AACxC,SAAO,MACJ,QAAQ,MAAM,OAAO,EACrB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,MAAM;AACzB;AAEA,SAASL,iBAAgB,OAAuB;AAC9C,SAAOK,WAAU,KAAK,EAAE,QAAQ,MAAM,QAAQ;AAChD;AAEA,SAAS,iBAAiB,KAAa,OAAuB;AAC5D,QAAM,MAAM,IAAI,QAAQ,KAAK,KAAK;AAClC,MAAI,MAAM,GAAG;AACX,UAAM,IAAI,MAAM,mCAAmC;AAAA,EACrD;AAEA,SAAO,MAAM,QAAQ;AACvB;AAEA,SAAS,SAAS,KAA6B;AAC7C,QAAM,OAAuB;AAAA,IAC3B,MAAM;AAAA,IACN,MAAM;AAAA,IACN,YAAY,CAAC;AAAA,IACb,UAAU,CAAC;AAAA,IACX,OAAO;AAAA,IACP,KAAK,IAAI;AAAA,EACX;AACA,QAAM,QAA0B,CAAC,IAAI;AACrC,QAAM,eACJ;AAEF,aAAW,SAAS,IAAI,SAAS,YAAY,GAAG;AAC9C,UAAM,QAAQ,MAAM,CAAC,KAAK;AAC1B,UAAM,QAAQ,MAAM,SAAS;AAC7B,UAAM,MAAM,QAAQ,MAAM;AAE1B,QAAI,MAAM,WAAW,IAAI,KAAK,MAAM,WAAW,WAAW,KAAK,MAAM,WAAW,MAAM,GAAG;AACvF;AAAA,IACF;AAEA,QAAI,MAAM,WAAW,WAAW,GAAG;AACjC,YAAMC,QAAO,MAAM,MAAM,GAAG,EAAE;AAC9B,YAAM,MAAM,SAAS,CAAC,GAAG,SAAS,KAAK;AAAA,QACrC,MAAM;AAAA,QACN,MAAAA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AACD;AAAA,IACF;AAEA,QAAI,MAAM,WAAW,IAAI,GAAG;AAC1B,YAAM,OAAO,MAAM,IAAI;AACvB,UAAI,CAAC,MAAM;AACT,cAAM,IAAI,MAAM,wCAAwC;AAAA,MAC1D;AACA,WAAK,MAAM;AACX;AAAA,IACF;AAEA,QAAI,MAAM,WAAW,GAAG,GAAG;AACzB,YAAM,cAAc,OAAO,KAAK,KAAK;AACrC,YAAM,UAAU,MAAM,MAAM,GAAG,MAAM,UAAU,cAAc,IAAI,EAAE,EAAE,KAAK;AAC1E,YAAM,EAAE,MAAM,WAAW,IAAI,SAAS,OAAO;AAC7C,YAAM,OAAuB;AAAA,QAC3B,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA,UAAU,CAAC;AAAA,QACX;AAAA,QACA;AAAA,MACF;AACA,YAAM,MAAM,SAAS,CAAC,GAAG,SAAS,KAAK,IAAI;AAC3C,UAAI,CAAC,aAAa;AAChB,cAAM,KAAK,IAAI;AAAA,MACjB;AACA;AAAA,IACF;AAEA,UAAM,OAAO,cAAc,KAAK;AAChC,QAAI,KAAK,SAAS,GAAG;AACnB,YAAM,MAAM,SAAS,CAAC,GAAG,SAAS,KAAK;AAAA,QACrC,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,MAAI,MAAM,WAAW,GAAG;AACtB,UAAM,IAAI,MAAM,8BAA8B;AAAA,EAChD;AAEA,SAAO;AACT;AAEA,SAAS,SAAS,SAAuE;AACvF,QAAM,kBAAkB,QAAQ,OAAO,KAAK;AAC5C,QAAM,OAAO,oBAAoB,KAAK,UAAU,QAAQ,MAAM,GAAG,eAAe;AAChF,QAAM,gBAAgB,oBAAoB,KAAK,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AACrF,QAAM,aAAqC,CAAC;AAC5C,QAAM,UAAU;AAEhB,aAAW,SAAS,cAAc,SAAS,OAAO,GAAG;AACnD,UAAM,MAAM,MAAM,CAAC;AACnB,UAAM,QAAQ,MAAM,CAAC,KAAK,MAAM,CAAC,KAAK;AACtC,QAAI,KAAK;AACP,iBAAW,GAAG,IAAI,cAAc,KAAK;AAAA,IACvC;AAAA,EACF;AAEA,SAAO,EAAE,MAAM,WAAW;AAC5B;AAEA,SAASJ,kBAAiB,MAAsB,MAA8B;AAC5E,QAAM,QAAQ,KAAK,SAAS;AAAA,IAC1B,CAAC,UACC,MAAM,SAAS,aAAaC,WAAU,MAAM,IAAI,MAAM;AAAA,EAC1D;AAEA,MAAI,CAAC,OAAO;AACV,UAAM,IAAI,MAAM,wBAAwB,IAAI,GAAG;AAAA,EACjD;AAEA,SAAO;AACT;AAEA,SAASA,WAAU,MAAsB;AACvC,QAAM,QAAQ,KAAK,QAAQ,GAAG;AAC9B,SAAO,UAAU,KAAK,OAAO,KAAK,MAAM,QAAQ,CAAC;AACnD;AAEA,SAAS,cAAc,MAAsB;AAC3C,SAAO,KAAK;AAAA,IACV;AAAA,IACA,CAAC,GAAG,KAAK,KAAK,UAAU;AACtB,UAAI,KAAK;AACP,eAAO,OAAO,cAAc,OAAO,SAAS,KAAK,EAAE,CAAC;AAAA,MACtD;AACA,UAAI,KAAK;AACP,eAAO,OAAO,cAAc,OAAO,SAAS,KAAK,EAAE,CAAC;AAAA,MACtD;AAEA,cAAQ,OAAO;AAAA,QACb,KAAK;AACH,iBAAO;AAAA,QACT,KAAK;AACH,iBAAO;AAAA,QACT,KAAK;AACH,iBAAO;AAAA,QACT,KAAK;AACH,iBAAO;AAAA,QACT,KAAK;AACH,iBAAO;AAAA,QACT;AACE,iBAAO,IAAI,KAAK;AAAA,MACpB;AAAA,IACF;AAAA,EACF;AACF;;;ACl7BO,IAAM,qBAAqB;AAC3B,IAAM,6BAA6B;AA6CnC,SAAS,kBAAkB,MAAsB;AACtD,QAAM,aAAa,KAAK,QAAQ,OAAO,GAAG,EAAE,KAAK;AACjD,MAAI,WAAW,WAAW,GAAG;AAC3B,UAAM,IAAI,MAAM,kCAAkC;AAAA,EACpD;AAEA,QAAM,mBAAmB,WAAW,WAAW,GAAG,IAAI,aAAa,IAAI,UAAU;AACjF,QAAM,WAAW,iBAAiB,MAAM,GAAG;AAC3C,QAAM,WAAqB,CAAC;AAE5B,aAAW,WAAW,UAAU;AAC9B,QAAI,YAAY,MAAM,YAAY,KAAK;AACrC;AAAA,IACF;AAEA,QAAI,YAAY,MAAM;AACpB,UAAI,SAAS,WAAW,GAAG;AACzB,cAAM,IAAI,MAAM,uCAAuC,IAAI,EAAE;AAAA,MAC/D;AAEA,eAAS,IAAI;AACb;AAAA,IACF;AAEA,aAAS,KAAK,OAAO;AAAA,EACvB;AAEA,SAAO,IAAI,SAAS,KAAK,GAAG,CAAC;AAC/B;AAEO,SAAS,aAAa,UAA0B;AACrD,QAAM,aAAa,kBAAkB,QAAQ;AAC7C,QAAM,YAAY,WAAW,YAAY,GAAG;AAC5C,QAAM,UAAU,WAAW,YAAY,GAAG;AAC1C,MAAI,WAAW,WAAW;AACxB,WAAO;AAAA,EACT;AAEA,SAAO,WAAW,MAAM,UAAU,CAAC,EAAE,YAAY;AACnD;AAEO,SAAS,yBAAyB,UAAkC;AACzE,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,kBAAkB,QAAQ;AAC7C,QAAM,YAAY,WAAW,YAAY,GAAG;AAC5C,QAAM,YAAY,aAAa,IAAI,KAAK,WAAW,MAAM,GAAG,SAAS;AACrE,QAAM,WAAW,WAAW,MAAM,YAAY,CAAC;AAC/C,SAAO,GAAG,SAAS,UAAU,QAAQ;AACvC;AAmBO,SAAS,0BACd,gBACA,cACQ;AACR,MAAI,aAAa,eAAe,YAAY;AAC1C,WAAO,aAAa;AAAA,EACtB;AAEA,MAAI,aAAa,OAAO,WAAW,GAAG,GAAG;AACvC,WAAO,kBAAkB,aAAa,MAAM;AAAA,EAC9C;AAEA,QAAM,WAAW,iBAAiB,kBAAkB,cAAc,IAAI;AACtE,QAAM,UAAU,aAAa,MAAM,MAAM,SAAS,MAAM,GAAG,SAAS,YAAY,GAAG,IAAI,CAAC;AACxF,SAAO,kBAAkB,GAAG,OAAO,GAAG,aAAa,MAAM,EAAE;AAC7D;AAEO,SAAS,iBAAiB,GAAW,GAAmB;AAC7D,SAAO,kBAAkB,CAAC,EAAE,cAAc,kBAAkB,CAAC,CAAC;AAChE;;;ACjHO,SAAS,gBAAgB,OAAsG;AACpI,QAAM,UAAU,kBAAkB,MAAM,UAAU,MAAM,KAAK;AAC7D,SAAO,gBAAgB,OAAO;AAChC;AAEA,SAAS,kBACP,UACA,OACmB;AACnB,QAAM,UAA6B,CAAC;AACpC,QAAM,eAAe,CAAC,GAAG,MAAM,OAAO,CAAC,EACpC,OAAO,CAAC,SAAS,KAAK,gBAAgB,SAAS,EAC/C,KAAK,CAAC,MAAM,UAAU,iBAAiB,KAAK,MAAM,MAAM,IAAI,CAAC;AAEhE,UAAQ,KAAK,iBAAiB,oBAAoB,WAAW,UAAU,qBAAqB,UAAU,YAAY,CAAC,CAAC,CAAC;AACrH,UAAQ;AAAA,IACN;AAAA,MACE;AAAA,MACA;AAAA,MACA,UAAU,sBAAsB,SAAS,oBAAoB,CAAC;AAAA,IAChE;AAAA,EACF;AAEA,aAAW,QAAQ,cAAc;AAC/B,YAAQ,KAAK,iBAAiB,KAAK,MAAM,KAAK,aAAa,KAAK,KAAK,CAAC;AAEtE,QAAI,KAAK,cAAc,SAAS,GAAG;AACjC,cAAQ;AAAA,QACN;AAAA,UACE,yBAAyB,KAAK,IAAI;AAAA,UAClC;AAAA,UACA,UAAU,sBAAsB,KAAK,aAAa,CAAC;AAAA,QACrD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO,QAAQ,KAAK,CAAC,MAAM,UAAU,iBAAiB,KAAK,MAAM,MAAM,IAAI,CAAC;AAC9E;AAEA,SAAS,qBACP,UACA,OACQ;AACR,QAAM,WAAmC;AAAA,IACvC,GAAG,SAAS,aAAa;AAAA,IACzB,MAAM,SAAS,aAAa,SAAS,QAAQ;AAAA,IAC7C,KAAK,SAAS,aAAa,SAAS,OAAO;AAAA,EAC7C;AAEA,QAAM,YAAY,EAAE,GAAG,SAAS,aAAa,UAAU;AAEvD,aAAW,QAAQ,OAAO;AACxB,QAAI,CAAC,KAAK,aAAa;AACrB,YAAM,IAAI,MAAM,sDAAsD,KAAK,IAAI,GAAG;AAAA,IACpF;AAEA,UAAM,YAAY,aAAa,KAAK,IAAI;AACxC,QAAI,CAAC,WAAW;AACd,gBAAU,KAAK,IAAI,IAAI,KAAK;AAC5B;AAAA,IACF;AAEA,UAAM,qBAAqB,SAAS,SAAS;AAC7C,QAAI,CAAC,oBAAoB;AACvB,eAAS,SAAS,IAAI,KAAK;AAC3B,aAAO,UAAU,KAAK,IAAI;AAC1B;AAAA,IACF;AAEA,QAAI,uBAAuB,KAAK,aAAa;AAC3C,aAAO,UAAU,KAAK,IAAI;AAC1B;AAAA,IACF;AAEA,cAAU,KAAK,IAAI,IAAI,KAAK;AAAA,EAC9B;AAEA,QAAM,iBAAiB,OAAO,QAAQ,QAAQ,EAAE,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,MAAM,KAAK,cAAc,KAAK,CAAC;AACnG,QAAM,kBAAkB,OAAO,QAAQ,SAAS,EAAE,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,MAAM,iBAAiB,MAAM,KAAK,CAAC;AAEzG,QAAM,aAAa,eAChB,IAAI,CAAC,CAAC,WAAW,WAAW,MAAM,yBAAyBI,WAAU,SAAS,CAAC,kBAAkBA,WAAU,WAAW,CAAC,KAAK,EAC5H,KAAK,IAAI;AACZ,QAAM,cAAc,gBACjB,IAAI,CAAC,CAAC,UAAU,WAAW,MAAM,yBAAyBA,WAAU,QAAQ,CAAC,kBAAkBA,WAAU,WAAW,CAAC,KAAK,EAC1H,KAAK,IAAI;AACZ,QAAM,OAAO,CAAC,YAAY,WAAW,EAAE,OAAO,CAAC,UAAU,MAAM,SAAS,CAAC,EAAE,KAAK,IAAI;AAEpF,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AAEA,SAAS,sBAAsB,eAA0C;AACvE,QAAM,kBAAkB,CAAC,GAAG,aAAa,EACtC,KAAK,CAAC,MAAM,UAAU,KAAK,GAAG,cAAc,MAAM,EAAE,CAAC,EACrD,IAAI,CAAC,iBAAiB;AACrB,UAAM,aACJ,aAAa,eAAe,aACxB,2BACA;AACN,WAAO,uBAAuBA,WAAU,aAAa,EAAE,CAAC,WAAWA,WAAU,aAAa,IAAI,CAAC,aAAaA,WAAU,aAAa,MAAM,CAAC,IAAI,UAAU;AAAA,EAC1J,CAAC,EACA,KAAK,IAAI;AAEZ,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AAEA,SAAS,iBACP,MACA,aACA,OACiB;AACjB,QAAM,iBAAiB,kBAAkB,IAAI,EAAE,MAAM,CAAC;AACtD,QAAM,oBAAoB,IAAI,WAAW,KAAK;AAE9C,QAAM,kBAAkB;AACxB,QAAM,uBAA6C;AAEnD,SAAO;AAAA,IACL,MAAM;AAAA,IACN,aAAa;AAAA,IACb;AAAA,IACA;AAAA,IACA,OAAO,eAAe,iBAAiB;AAAA,EACzC;AACF;AAEA,SAAS,gBAAgB,SAAwC;AAC/D,QAAM,cAA4B,CAAC;AACnC,QAAM,gBAA8B,CAAC;AACrC,MAAI,cAAc;AAElB,aAAW,SAAS,SAAS;AAC3B,UAAM,WAAW,WAAW,MAAM,IAAI;AACtC,UAAM,cAAc,iBAAiB,KAAK,SAAS,MAAM;AACzD,UAAM,kBAAkB,IAAI,SAAS,YAAY,MAAM;AACvD,oBAAgB,UAAU,GAAG,UAAY,IAAI;AAC7C,oBAAgB,UAAU,GAAG,IAAI,IAAI;AACrC,oBAAgB,UAAU,GAAG,GAAG,IAAI;AACpC,oBAAgB,UAAU,GAAG,MAAM,gBAAgB,UAAU,IAAI,GAAG,IAAI;AACxE,oBAAgB,UAAU,IAAI,GAAG,IAAI;AACrC,oBAAgB,UAAU,IAAI,GAAG,IAAI;AACrC,oBAAgB,UAAU,IAAI,MAAM,UAAU,GAAG,IAAI;AACrD,oBAAgB,UAAU,IAAI,MAAM,gBAAgB,YAAY,IAAI;AACpE,oBAAgB,UAAU,IAAI,MAAM,kBAAkB,YAAY,IAAI;AACtE,oBAAgB,UAAU,IAAI,SAAS,QAAQ,IAAI;AACnD,oBAAgB,UAAU,IAAI,GAAG,IAAI;AACrC,gBAAY,IAAI,UAAU,EAAE;AAE5B,gBAAY,KAAK,aAAa,MAAM,eAAe;AAEnD,UAAM,gBAAgB,iBAAiB,KAAK,SAAS,MAAM;AAC3D,UAAM,oBAAoB,IAAI,SAAS,cAAc,MAAM;AAC3D,sBAAkB,UAAU,GAAG,UAAY,IAAI;AAC/C,sBAAkB,UAAU,GAAG,IAAI,IAAI;AACvC,sBAAkB,UAAU,GAAG,IAAI,IAAI;AACvC,sBAAkB,UAAU,GAAG,GAAG,IAAI;AACtC,sBAAkB,UAAU,IAAI,MAAM,gBAAgB,UAAU,IAAI,GAAG,IAAI;AAC3E,sBAAkB,UAAU,IAAI,GAAG,IAAI;AACvC,sBAAkB,UAAU,IAAI,GAAG,IAAI;AACvC,sBAAkB,UAAU,IAAI,MAAM,UAAU,GAAG,IAAI;AACvD,sBAAkB,UAAU,IAAI,MAAM,gBAAgB,YAAY,IAAI;AACtE,sBAAkB,UAAU,IAAI,MAAM,kBAAkB,YAAY,IAAI;AACxE,sBAAkB,UAAU,IAAI,SAAS,QAAQ,IAAI;AACrD,sBAAkB,UAAU,IAAI,GAAG,IAAI;AACvC,sBAAkB,UAAU,IAAI,GAAG,IAAI;AACvC,sBAAkB,UAAU,IAAI,GAAG,IAAI;AACvC,sBAAkB,UAAU,IAAI,GAAG,IAAI;AACvC,sBAAkB,UAAU,IAAI,GAAG,IAAI;AACvC,sBAAkB,UAAU,IAAI,aAAa,IAAI;AACjD,kBAAc,IAAI,UAAU,EAAE;AAC9B,kBAAc,KAAK,aAAa;AAEhC,mBAAe,YAAY,aAAa,MAAM,gBAAgB;AAAA,EAChE;AAEA,QAAM,yBAAyB;AAC/B,QAAM,mBAAmB,iBAAiB,aAAa;AACvD,QAAM,wBAAwB,iBAAiB,EAAE;AACjD,QAAM,4BAA4B,IAAI,SAAS,sBAAsB,MAAM;AAC3E,4BAA0B,UAAU,GAAG,WAAY,IAAI;AACvD,4BAA0B,UAAU,GAAG,GAAG,IAAI;AAC9C,4BAA0B,UAAU,GAAG,GAAG,IAAI;AAC9C,4BAA0B,UAAU,GAAG,QAAQ,QAAQ,IAAI;AAC3D,4BAA0B,UAAU,IAAI,QAAQ,QAAQ,IAAI;AAC5D,4BAA0B,UAAU,IAAI,iBAAiB,YAAY,IAAI;AACzE,4BAA0B,UAAU,IAAI,wBAAwB,IAAI;AACpE,4BAA0B,UAAU,IAAI,GAAG,IAAI;AAE/C,SAAO,iBAAiB,CAAC,GAAG,aAAa,kBAAkB,qBAAqB,CAAC;AACnF;AAEA,SAAS,UAAU,KAAyB;AAC1C,SAAO,WAAW,GAAG;AACvB;AAEA,SAASA,WAAU,OAAuB;AACxC,SAAO,MACJ,QAAQ,MAAM,OAAO,EACrB,QAAQ,MAAM,QAAQ,EACtB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,QAAQ;AAC3B;AAEA,SAAS,eAAe,OAA2B;AACjD,MAAI,MAAM;AAEV,aAAW,QAAQ,OAAO;AACxB,WAAO;AACP,aAAS,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG;AACnC,YAAM,OAAO,EAAE,MAAM;AACrB,YAAO,QAAQ,IAAM,aAAa;AAAA,IACpC;AAAA,EACF;AAEA,UAAQ,MAAM,gBAAgB;AAChC;AAEA,SAAS,iBAAiB,MAA0B;AAClD,SAAO,IAAI,WAAW,IAAI;AAC5B;AAEA,SAAS,iBAAiB,QAA2C;AACnE,QAAM,cAAc,OAAO,OAAO,CAAC,KAAK,UAAU,MAAM,MAAM,YAAY,CAAC;AAC3E,QAAM,WAAW,IAAI,WAAW,WAAW;AAC3C,MAAI,SAAS;AAEb,aAAW,SAAS,QAAQ;AAC1B,aAAS,IAAI,OAAO,MAAM;AAC1B,cAAU,MAAM;AAAA,EAClB;AAEA,SAAO;AACT;AAEA,SAAS,WAAW,OAA2B;AAC7C,SAAO,IAAI,YAAY,EAAE,OAAO,KAAK;AACvC;;;AC3QO,SAAS,uBACd,eACA,cACA,sBACA,YACM;AACN,aAAW,CAAC,MAAM,UAAU,KAAK,cAAc,MAAM,QAAQ,GAAG;AAC9D,QAAI,WAAW,IAAI,IAAI,KAAK,WAAW,gBAAgB,WAAW;AAChE;AAAA,IACF;AAEA,QAAI,CAAC,aAAa,IAAI,IAAI,GAAG;AAC3B,mBAAa,IAAI,MAAM,UAAU,UAAU,CAAC;AAC5C;AAAA,IACF;AAEA,UAAM,cAAc,aAAa,IAAI,IAAI;AACzC,QAAI,CAAC,aAAa;AAChB;AAAA,IACF;AAEA,gBAAY,cAAc,WAAW;AACrC,gBAAY,gBAAgB,WAAW,cAAc,IAAIC,kBAAiB;AAC1E,gBAAY,wBAAwB,WAAW;AAC/C,gBAAY,cAAc,WAAW;AACrC,gBAAY,QAAQ,IAAI,WAAW,WAAW,KAAK;AACnD,gBAAY,QAAQ,WAAW;AAAA,EACjC;AAEA,QAAM,8BAA8B,IAAI,IAAI,qBAAqB,IAAI,CAAC,iBAAiB,aAAa,EAAE,CAAC;AACvG,aAAW,gBAAgB,cAAc,SAAS,sBAAsB;AACtE,QAAI,4BAA4B,IAAI,aAAa,EAAE,GAAG;AACpD;AAAA,IACF;AAEA,yBAAqB,KAAKA,mBAAkB,YAAY,CAAC;AACzD,gCAA4B,IAAI,aAAa,EAAE;AAAA,EACjD;AACF;AAEA,SAAS,UAAU,MAAsC;AACvD,SAAO;AAAA,IACL,GAAG;AAAA,IACH,eAAe,KAAK,cAAc,IAAIA,kBAAiB;AAAA,IACvD,OAAO,IAAI,WAAW,KAAK,KAAK;AAAA,EAClC;AACF;AAEA,SAASA,mBAAkB,cAAgD;AACzE,SAAO,EAAE,GAAG,aAAa;AAC3B;;;ACzBO,IAAM,gBAAN,MAAoB;AAAA,EAKlB,YAA6B,eAA2B,kBAAoC;AAA/D;AAClC,SAAK,aAAa,IAAI;AAAA,MACpB,CAAC,GAAG,gBAAgB,EAAE,IAAI,CAAC,SAAS;AAClC,cAAM,aAAa,kBAAkB,IAAI;AACzC,YAAI,eAAe,sBAAsB,WAAW,SAAS,OAAO,KAAK,eAAe,4BAA4B;AAClH,gBAAM,IAAI,MAAM,gEAAgE,UAAU,GAAG;AAAA,QAC/F;AAEA,eAAO;AAAA,MACT,CAAC;AAAA,IACH;AACA,SAAK,eAAe,WAAW,cAAc,KAAK;AAClD,SAAK,uBAAuB,cAAc,SAAS,qBAAqB,IAAIC,kBAAiB;AAAA,EAC/F;AAAA,EAjBiB;AAAA,EACA;AAAA,EACA;AAAA,EAiBV,iBAAiB,aAA0C;AAChE,UAAM,iBAAiB,kBAAkB,YAAY,IAAI;AACzD,QAAI,CAAC,KAAK,WAAW,IAAI,cAAc,GAAG;AACxC,YAAM,IAAI,MAAM,2CAA2C,cAAc,GAAG;AAAA,IAC9E;AAEA,UAAM,WAAW,KAAK,aAAa,IAAI,cAAc;AACrD,UAAM,WAA2B;AAAA,MAC/B,MAAM;AAAA,MACN,aAAa;AAAA,MACb,aAAa,YAAY;AAAA,MACzB,uBAAuB,yBAAyB,cAAc;AAAA,MAC9D,gBAAgB,YAAY,iBAAiB,UAAU,iBAAiB,CAAC,GAAG,IAAIA,kBAAiB;AAAA,MACjG,aAAa,YAAY,eAAe,UAAU,eAAe;AAAA,MACjE,OAAO,IAAI,WAAW,YAAY,KAAK;AAAA,MACvC,OAAO;AAAA,IACT;AAEA,SAAK,aAAa,IAAI,gBAAgB,QAAQ;AAAA,EAChD;AAAA,EAEO,cAAc,aAAmD;AACtE,SAAK,iBAAiB,WAAW;AACjC,WAAO;AAAA,EACT;AAAA,EAEO,0BAA0B,OAKxB;AACP,UAAM,aAAa,MAAM,cAAc;AACvC,UAAM,mBACJ,eAAe,aAAa,kBAAkB,MAAM,MAAM,IAAI,MAAM;AACtE,UAAM,WAAW,KAAK,qBAAqB,KAAK,CAAC,iBAAiB;AAChE,UAAI,aAAa,SAAS,MAAM,QAAQ,aAAa,eAAe,YAAY;AAC9E,eAAO;AAAA,MACT;AAEA,aAAO,eAAe,aAClB,0BAA0B,MAAM,YAAY,MAAM,mBAClD,aAAa,WAAW;AAAA,IAC9B,CAAC;AACD,QAAI,UAAU;AACZ;AAAA,IACF;AAEA,UAAM,iBAAiB;AAAA,MACrB,IAAI,IAAI,KAAK,qBAAqB,IAAI,CAAC,iBAAiB,aAAa,EAAE,CAAC;AAAA,MACxE,MAAM,eAAe;AAAA,IACvB;AACA,SAAK,qBAAqB,KAAK;AAAA,MAC7B,IAAI;AAAA,MACJ,MAAM,MAAM;AAAA,MACZ,QACE,eAAe,aACX,4BAA4B,gBAAgB,IAC5C;AAAA,MACN;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEO,YAAwB;AAC7B;AAAA,MACE,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,IACP;AACA,UAAM,QAAQ,2BAA2B,KAAK,YAAY;AAC1D,UAAM,WAAW,cAAc,OAAO,KAAK,sBAAsB,KAAK,cAAc,SAAS,YAAY;AACzG,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,kBAAkB,KAAK,cAAc;AAAA,IACvC;AAAA,EACF;AAAA,EAEO,YAAwB;AAC7B,WAAO,gBAAgB,KAAK,UAAU,CAAC;AAAA,EACzC;AACF;AAEO,SAAS,oBACd,eACA,kBACe;AACf,SAAO,IAAI,cAAc,eAAe,gBAAgB;AAC1D;AAEA,SAAS,WAAW,OAAiE;AACnF,SAAO,IAAI;AAAA,IACT,CAAC,GAAG,MAAM,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC,MAAM,IAAI,MAAM;AAAA,MACzC;AAAA,MACA;AAAA,QACE,GAAG;AAAA,QACH,eAAe,KAAK,cAAc,IAAIA,kBAAiB;AAAA,QACvD,OAAO,IAAI,WAAW,KAAK,KAAK;AAAA,MAClC;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAEA,SAAS,2BAA2B,OAAiE;AACnG,SAAO,IAAI;AAAA,IACT,CAAC,GAAG,MAAM,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC,IAAI,MAAM,SAAS,sBAAsB,SAAS,8BAA8B,CAAC,KAAK,SAAS,SAAS,CAAC;AAAA,EACzI;AACF;AAEA,SAAS,cACP,OACA,sBACA,kBACwB;AACxB,QAAM,YAAY,CAAC,GAAG,MAAM,OAAO,CAAC,EAAE,KAAK,CAAC,MAAM,UAAU,iBAAiB,KAAK,MAAM,MAAM,IAAI,CAAC;AAEnG,QAAM,YAAY,EAAE,GAAG,iBAAiB,UAAU;AAClD,aAAW,OAAO,OAAO,KAAK,SAAS,GAAG;AACxC,QAAI,CAAC,MAAM,IAAI,kBAAkB,GAAG,CAAC,GAAG;AACtC,aAAO,UAAU,GAAG;AAAA,IACtB;AAAA,EACF;AAEA,aAAW,QAAQ,WAAW;AAC5B,QAAI,CAAC,KAAK,aAAa;AACrB,YAAM,IAAI,MAAM,4CAA4C,KAAK,IAAI,EAAE;AAAA,IACzE;AAEA,cAAU,KAAK,IAAI,IAAI,KAAK;AAAA,EAC9B;AAEA,SAAO;AAAA,IACL,cAAc;AAAA,MACZ,UAAU,EAAE,GAAG,iBAAiB,SAAS;AAAA,MACzC;AAAA,IACF;AAAA,IACA,sBAAsB,qBAAqB,IAAIA,kBAAiB;AAAA,IAChE,OAAO,UAAU,IAAI,CAAC,UAAU;AAAA,MAC9B,MAAM,KAAK;AAAA,MACX,aAAa,KAAK;AAAA,MAClB,aAAa,KAAK;AAAA,MAClB,uBAAuB,KAAK;AAAA,MAC5B,eAAe,KAAK,cAAc,IAAIA,kBAAiB;AAAA,MACvD,aAAa,KAAK;AAAA,MAClB,YAAY,KAAK,MAAM;AAAA,IACzB,EAAE;AAAA,EACJ;AACF;AAEA,SAASA,mBAAkB,cAAgD;AACzE,SAAO,EAAE,GAAG,aAAa;AAC3B;AAEA,SAAS,2BAA2B,aAAkC,aAA6B;AACjG,MAAI,CAAC,YAAY,IAAI,WAAW,GAAG;AACjC,WAAO;AAAA,EACT;AAEA,MAAI,YAAY;AAChB,SAAO,YAAY,IAAI,GAAG,WAAW,IAAI,SAAS,EAAE,GAAG;AACrD,iBAAa;AAAA,EACf;AAEA,SAAO,GAAG,WAAW,IAAI,SAAS;AACpC;AAEA,SAAS,4BAA4B,UAA0B;AAC7D,SAAO,kBAAkB,QAAQ,EAAE,MAAM,CAAC;AAC5C;;;AClNO,IAAM,iBACX;AACK,IAAM,6BACX;AACK,IAAM,kCACX;AAQK,SAAS,iBAAiB,OAA0C;AACzE,QAAM,eAAe;AACrB,QAAM,cAAc,MAAM,uBAAuB;AACjD,QAAM,mBACJ,MAAM,2BAA2B;AACnC,QAAM,gBAAgB,IAAI,YAAY,EAAE,OAAO,MAAM,WAAW;AAEhE,QAAM,eAA+B;AAAA,IACnC,MAAM;AAAA,IACN,aAAa;AAAA,IACb;AAAA,IACA,uBAAuB,yBAAyB,YAAY;AAAA,IAC5D,eAAe,CAAC;AAAA,IAChB,aAAa;AAAA,IACb,OAAO;AAAA,IACP,OAAO;AAAA,EACT;AAEA,QAAM,WAA+B;AAAA,IACnC,cAAc;AAAA,MACZ,UAAU;AAAA,QACR,MAAM;AAAA,QACN,KAAK;AAAA,MACP;AAAA,MACA,WAAW;AAAA,QACT,CAAC,YAAY,GAAG;AAAA,MAClB;AAAA,IACF;AAAA,IACA,sBAAsB;AAAA,MACpB;AAAA,QACE,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,YAAY;AAAA,MACd;AAAA,IACF;AAAA,IACA,OAAO;AAAA,MACL;AAAA,QACE,MAAM,aAAa;AAAA,QACnB,aAAa,aAAa;AAAA,QAC1B,aAAa,aAAa;AAAA,QAC1B,uBAAuB,aAAa;AAAA,QACpC,eAAe,aAAa;AAAA,QAC5B,aAAa,aAAa;AAAA,QAC1B,YAAY,aAAa,MAAM;AAAA,MACjC;AAAA,IACF;AAAA,EACF;AAEA,SAAO,gBAAgB;AAAA,IACrB;AAAA,IACA,OAAO,oBAAI,IAAI,CAAC,CAAC,aAAa,MAAM,YAAY,CAAC,CAAC;AAAA,EACpD,CAAC;AACH;;;ACzEA,oBAA4B;AA+B5B,IAAM,iBAAiB;AACvB,IAAM,8BAA8B;AACpC,IAAM,8BAA8B;AAE7B,SAAS,eAAe,QAA8C;AAC3E,QAAM,QAAQ,kBAAkB,aAAa,SAAS,IAAI,WAAW,MAAM;AAC3E,QAAM,mBAAmB,qBAAqB,KAAK;AACnD,QAAM,QAAQ,oBAAI,IAA4B;AAE9C,aAAW,SAAS,kBAAkB;AACpC,QAAI,MAAM,KAAK,SAAS,GAAG,GAAG;AAC5B;AAAA,IACF;AAEA,UAAM,cAAc,aAAa,OAAO,KAAK;AAC7C,UAAM,iBAAiB,kBAAkB,MAAM,IAAI;AACnD,UAAM,cAAc,eAAe,cAAc;AAEjD,UAAM,IAAI,gBAAgB;AAAA,MACxB,MAAM;AAAA,MACN;AAAA,MACA,aAAa;AAAA,MACb,uBACE,gBAAgB,YAAY,yBAAyB,cAAc,IAAI;AAAA,MACzE,eAAe,CAAC;AAAA,MAChB,aAAa,MAAM;AAAA,MACnB,OAAO;AAAA,MACP,OAAO,MAAM,UAAU;AAAA,IACzB,CAAC;AAAA,EACH;AAEA,QAAM,mBAAmB,MAAM,IAAI,kBAAkB;AACrD,MAAI,CAAC,kBAAkB;AACrB,UAAM,IAAI,MAAM,oDAAoD;AAAA,EACtE;AAEA,QAAM,eAAe,qBAAqB,UAAU,iBAAiB,KAAK,CAAC;AAC3E,QAAM,2BAA2B,MAAM,IAAI,0BAA0B;AACrE,QAAM,uBAAuB,2BACzB,sBAAsB,UAAU,yBAAyB,KAAK,CAAC,IAC/D,CAAC;AAEL,QAAM,gBAAwC,CAAC;AAE/C,aAAW,CAAC,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,QAAQ,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,MAAM,KAAK,cAAc,KAAK,CAAC,GAAG;AACpG,UAAM,cAAc,mBAAmB,MAAM,YAAY;AACzD,UAAM,wBAAwB,KAAK,gBAAgB,YAAY,yBAAyB,IAAI,IAAI;AAChG,UAAM,oBAAoB,wBAAwB,MAAM,IAAI,qBAAqB,IAAI;AACrF,UAAM,gBAAgB,oBAClB,sBAAsB,UAAU,kBAAkB,KAAK,CAAC,IACxD,CAAC;AAEL,UAAM,WAA2B;AAAA,MAC/B,GAAG;AAAA,MACH;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,UAAM,IAAI,MAAM,QAAQ;AACxB,kBAAc,KAAK;AAAA,MACjB;AAAA,MACA,aAAa,SAAS;AAAA,MACtB;AAAA,MACA;AAAA,MACA;AAAA,MACA,aAAa,SAAS;AAAA,MACtB,YAAY,SAAS,MAAM;AAAA,IAC7B,CAAC;AAAA,EACH;AAEA,SAAO;AAAA,IACL,UAAU;AAAA,MACR;AAAA,MACA;AAAA,MACA,OAAO;AAAA,IACT;AAAA,IACA;AAAA,IACA,kBAAkB,MAAM;AAAA,EAC1B;AACF;AAEA,SAAS,qBAAqB,SAAiD;AAC7E,QAAM,OAAO,IAAI,SAAS,QAAQ,QAAQ,QAAQ,YAAY,QAAQ,UAAU;AAChF,QAAM,aAAa,0BAA0B,SAAS,IAAI;AAC1D,QAAM,aAAa,KAAK,UAAU,aAAa,IAAI,IAAI;AACvD,QAAM,yBAAyB,KAAK,UAAU,aAAa,IAAI,IAAI;AACnE,QAAM,UAAsC,CAAC;AAC7C,MAAI,SAAS;AAEb,WAAS,QAAQ,GAAG,QAAQ,YAAY,SAAS,GAAG;AAClD,UAAM,YAAY,KAAK,UAAU,QAAQ,IAAI;AAC7C,QAAI,cAAc,6BAA6B;AAC7C,YAAM,IAAI,MAAM,qDAAqD,MAAM,GAAG;AAAA,IAChF;AAEA,UAAM,wBAAwB,KAAK,UAAU,SAAS,GAAG,IAAI;AAC7D,UAAM,oBAAoB,KAAK,UAAU,SAAS,IAAI,IAAI;AAC1D,UAAM,QAAQ,KAAK,UAAU,SAAS,IAAI,IAAI;AAC9C,UAAM,iBAAiB,KAAK,UAAU,SAAS,IAAI,IAAI;AACvD,UAAM,mBAAmB,KAAK,UAAU,SAAS,IAAI,IAAI;AACzD,UAAM,iBAAiB,KAAK,UAAU,SAAS,IAAI,IAAI;AACvD,UAAM,mBAAmB,KAAK,UAAU,SAAS,IAAI,IAAI;AACzD,UAAM,oBAAoB,KAAK,UAAU,SAAS,IAAI,IAAI;AAC1D,UAAM,oBAAoB,KAAK,UAAU,SAAS,IAAI,IAAI;AAC1D,UAAM,iBAAiB,SAAS;AAChC,UAAM,WAAW,WAAW,QAAQ,SAAS,gBAAgB,iBAAiB,cAAc,CAAC;AAE7F,YAAQ,KAAK;AAAA,MACX,MAAM;AAAA,MACN,aAAa,qBAAqB,iBAAiB;AAAA,MACnD;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAED,cAAU,KAAK,iBAAiB,mBAAmB;AAAA,EACrD;AAEA,SAAO;AACT;AAEA,SAAS,0BAA0B,SAAqB,MAAwB;AAC9E,QAAM,kBAAkB;AACxB,QAAM,qBAAqB;AAC3B,QAAM,cAAc,KAAK,IAAI,GAAG,QAAQ,SAAS,kBAAkB,kBAAkB;AAErF,WAAS,SAAS,QAAQ,SAAS,iBAAiB,UAAU,aAAa,UAAU,GAAG;AACtF,QAAI,KAAK,UAAU,QAAQ,IAAI,MAAM,gBAAgB;AACnD,aAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,IAAI,MAAM,0DAA0D;AAC5E;AAEA,SAAS,aAAa,SAAqB,OAA6C;AACtF,QAAM,OAAO,IAAI,SAAS,QAAQ,QAAQ,QAAQ,YAAY,QAAQ,UAAU;AAChF,QAAM,eAAe,MAAM;AAC3B,QAAM,YAAY,KAAK,UAAU,cAAc,IAAI;AACnD,MAAI,cAAc,6BAA6B;AAC7C,UAAM,IAAI,MAAM,qDAAqD,YAAY,GAAG;AAAA,EACtF;AAEA,QAAM,iBAAiB,KAAK,UAAU,eAAe,IAAI,IAAI;AAC7D,QAAM,mBAAmB,KAAK,UAAU,eAAe,IAAI,IAAI;AAC/D,QAAM,aAAa,eAAe,KAAK,iBAAiB;AACxD,QAAM,aAAa,QAAQ,SAAS,YAAY,aAAa,MAAM,cAAc;AAEjF,UAAQ,MAAM,aAAa;AAAA,IACzB,KAAK;AACH,aAAO,IAAI,WAAW,UAAU;AAAA,IAClC,KAAK;AACH,iBAAO,2BAAY,UAAU;AAAA,IAC/B;AACE,YAAM,IAAI,MAAM,mCAAmC,MAAM,IAAI,GAAG;AAAA,EACpE;AACF;AAEA,SAAS,qBAAqB,QAAsC;AAClE,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,YAAM,IAAI,MAAM,sCAAsC,MAAM,GAAG;AAAA,EACnE;AACF;AAEA,SAAS,eAAe,MAAmD;AACzE,MAAI,SAAS,oBAAoB;AAC/B,WAAO;AAAA,EACT;AAEA,MAAI,SAAS,8BAA8B,KAAK,SAAS,SAAS,GAAG;AACnE,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,UAAU,OAA2B;AAC5C,SAAO,IAAI,YAAY,OAAO,EAAE,OAAO,KAAK;AAC9C;AAEA,SAAS,WAAW,OAA2B;AAC7C,SAAO,IAAI,YAAY,OAAO,EAAE,OAAO,KAAK;AAC9C;AAEA,SAAS,qBAAqB,KAAiD;AAC7E,QAAM,WAAmC,CAAC;AAC1C,QAAM,YAAoC,CAAC;AAE3C,aAAW,cAAc,kBAAkB,KAAK,SAAS,GAAG;AAC1D,UAAM,YAAY,WAAW,WAAW,YAAY;AACpD,UAAM,cAAc,WAAW;AAC/B,QAAI,CAAC,aAAa,CAAC,aAAa;AAC9B;AAAA,IACF;AAEA,aAAS,SAAS,IAAI;AAAA,EACxB;AAEA,aAAW,cAAc,kBAAkB,KAAK,UAAU,GAAG;AAC3D,UAAM,WAAW,WAAW;AAC5B,UAAM,cAAc,WAAW;AAC/B,QAAI,CAAC,YAAY,CAAC,aAAa;AAC7B;AAAA,IACF;AAEA,cAAU,kBAAkB,QAAQ,CAAC,IAAI;AAAA,EAC3C;AAEA,SAAO,EAAE,UAAU,UAAU;AAC/B;AAEA,SAAS,sBAAsB,KAAgC;AAC7D,QAAM,gBAAmC,CAAC;AAE1C,aAAW,cAAc,kBAAkB,KAAK,cAAc,GAAG;AAC/D,UAAM,KAAK,WAAW;AACtB,UAAM,OAAO,WAAW;AACxB,UAAM,SAAS,WAAW;AAC1B,QAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ;AAC3B;AAAA,IACF;AAEA,kBAAc,KAAK;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MACA,YAAY,WAAW,eAAe,aAAa,aAAa;AAAA,IAClE,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEA,SAAS,kBAAkB,KAAa,SAA2C;AACjF,QAAM,aAAa,IAAI,OAAO,2BAA2B,OAAO,mBAAmB,GAAG;AACtF,QAAM,UAAoC,CAAC;AAC3C,MAAI,WAAmC,WAAW,KAAK,GAAG;AAE1D,SAAO,UAAU;AACf,YAAQ,KAAKC,iBAAgB,SAAS,CAAC,KAAK,EAAE,CAAC;AAC/C,eAAW,WAAW,KAAK,GAAG;AAAA,EAChC;AAEA,SAAO;AACT;AAEA,SAASA,iBAAgB,eAA+C;AACtE,QAAM,aAAqC,CAAC;AAC5C,QAAM,mBAAmB;AACzB,MAAI,QAAgC,iBAAiB,KAAK,aAAa;AAEvE,SAAO,OAAO;AACZ,eAAW,MAAM,CAAC,CAAC,IAAIC,mBAAkB,MAAM,CAAC,CAAC;AACjD,YAAQ,iBAAiB,KAAK,aAAa;AAAA,EAC7C;AAEA,SAAO;AACT;AAEA,SAASA,mBAAkB,OAAuB;AAChD,SAAO,MACJ,QAAQ,WAAW,GAAG,EACtB,QAAQ,WAAW,GAAG,EACtB,QAAQ,SAAS,GAAG,EACpB,QAAQ,SAAS,GAAG,EACpB,QAAQ,UAAU,GAAG;AAC1B;AAEA,SAAS,mBACP,MACA,cACe;AACf,MAAI,SAAS,oBAAoB;AAC/B,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,aAAa,UAAU,IAAI;AAC5C,MAAI,UAAU;AACZ,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,KAAK,SAAS,GAAG,IAAI,KAAK,MAAM,KAAK,YAAY,GAAG,IAAI,CAAC,EAAE,YAAY,IAAI;AAC7F,SAAO,YAAY,aAAa,SAAS,SAAS,KAAK,OAAO;AAChE;;;AChPO,SAAS,qBACd,gBACA,QACgB;AAChB,SAAO;AAAA,IACL,MAAM;AAAA,IACN,gBAAgB,eAAe,cAAc;AAAA,IAC7C;AAAA,EACF;AACF;AAQO,SAAS,eAAe,OAA2B;AACxD,SAAO,MAAM,QAAQ,MAAM,KACvB,EAAE,MAAM,MAAM,MAAM,IAAI,MAAM,GAAG,IACjC,EAAE,MAAM,MAAM,IAAI,IAAI,MAAM,KAAK;AACvC;;;ACmnBA,SAAS,SAAS,OAAkD;AAClE,SAAO,QAAQ,KAAK,KAAK,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK;AAC5E;AA2BO,SAAS,6BAA6B,OAAqC;AAChF,QAAM,SAAS,SAAS,KAAK,IAAI,QAAQ,CAAC;AAC1C,QAAM,WACJ,OAAO,OAAO,cAAc,YAAY,OAAO,UAAU,SAAS,IAC9D,OAAO,YACP,OAAO,OAAO,aAAa,YAAY,OAAO,SAAS,SAAS,IAC9D,OAAO,WACP;AACR,QAAM,YACJ,OAAO,OAAO,cAAc,YAAY,OAAO,UAAU,SAAS,IAC9D,OAAO,aACP,oBAAI,KAAK,CAAC,GAAE,YAAY;AAC9B,QAAM,UAAU,MAAM,QAAQ,OAAO,OAAO,IACxC,OAAO,QACJ,OAAO,CAAC,UAA4C,SAAS,KAAK,CAAC,EACnE,IAAI,CAAC,OAAO,WAAW;AAAA,IACtB,SACE,OAAO,MAAM,YAAY,YAAY,MAAM,QAAQ,SAAS,IACxD,MAAM,UACN,GAAG,OAAO,OAAO,aAAa,SAAS,CAAC,UAAU,QAAQ,CAAC;AAAA,IACjE,UACE,OAAO,MAAM,aAAa,YAAY,MAAM,SAAS,SAAS,IAC1D,MAAM,WACN;AAAA,IACN,MAAM,OAAO,MAAM,SAAS,WAAW,MAAM,OAAO;AAAA,IACpD,WACE,OAAO,MAAM,cAAc,YAAY,MAAM,UAAU,SAAS,IAC5D,MAAM,YACN;AAAA,IACN,UAAU,SAAS,MAAM,QAAQ,IAC7B;AAAA,MACE,gBACE,OAAO,MAAM,SAAS,mBAAmB,WACrC,MAAM,SAAS,iBACf;AAAA,MACN,QACE,OAAO,MAAM,SAAS,WAAW,WAC7B,MAAM,SAAS,SACf;AAAA,MACN,cACE,OAAO,MAAM,SAAS,iBAAiB,WACnC,MAAM,SAAS,eACf;AAAA,MACN,WACE,OAAO,MAAM,SAAS,cAAc,WAChC,MAAM,SAAS,YACf;AAAA,MACN,UACE,OAAO,MAAM,SAAS,aAAa,WAC/B,MAAM,SAAS,WACf;AAAA,IACR,IACA;AAAA,EACN,EAAE,IACJ;AAAA,IACE;AAAA,MACE,SAAS,GAAG,OAAO,OAAO,aAAa,SAAS,CAAC;AAAA,MACjD;AAAA,MACA,MAAM,OAAO,OAAO,SAAS,WAAW,OAAO,OAAO;AAAA,MACtD;AAAA,IACF;AAAA,EACF;AACJ,QAAM,aAAa,SAAS,OAAO,UAAU,IACzC;AAAA,IACE,YACE,OAAO,OAAO,WAAW,eAAe,WACpC,OAAO,WAAW,aAClB,OAAO,OAAO,eAAe,WAC3B,OAAO,aACP;AAAA,IACR,YACE,OAAO,OAAO,WAAW,eAAe,YACxC,OAAO,WAAW,WAAW,SAAS,IAClC,OAAO,WAAW,aAClB;AAAA,EACR,IACA,OAAO,OAAO,eAAe,WAC3B;AAAA,IACE,YAAY,OAAO;AAAA,IACnB,YAAY;AAAA,EACd,IACA;AACN,QAAM,mBACJ,OAAO,OAAO,WAAW,WACrB,OAAO,SACP,OAAO,UAAU,SAAS,OAAO,MAAM,KAAK,OAAO,OAAO,SAAS,aACjE,aACA,cAAc,OAAO,aACnB,aACA;AAEV,SAAO;AAAA,IACL,WACE,OAAO,OAAO,cAAc,YAAY,OAAO,UAAU,SAAS,IAC9D,OAAO,YACP;AAAA,IACN,QACE,SAAS,OAAO,MAAM,KAAK,OAAO,OAAO,OAAO,SAAS,WACpD,OAAO,SACR,qBAAqB,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,iBAAiB;AAAA,IAChE;AAAA,IACA,WAAW;AAAA,IACX;AAAA,IACA,MAAM,QAAQ,IAAI,CAAC,UAAU,MAAM,IAAI,EAAE,KAAK,IAAI;AAAA,IAClD;AAAA,IACA,QACE,qBAAqB,cAAc,qBAAqB,aACpD,mBACA;AAAA,IACN;AAAA,IACA,YAAY,YAAY;AAAA,IACxB,YAAY,MAAM,QAAQ,OAAO,UAAU,IACvC,OAAO,WAAW,OAAO,CAAC,cAAmC,OAAO,cAAc,QAAQ,IAC1F,CAAC;AAAA,IACL,YAAY,qBAAqB;AAAA,IACjC,UAAU,SAAS,OAAO,QAAQ,IAC9B;AAAA,MACE,QACE,OAAO,SAAS,WAAW,YAAY,OAAO,SAAS,WAAW,YAC9D,OAAO,SAAS,SAChB;AAAA,MACN,oBACE,OAAO,OAAO,SAAS,uBAAuB,WAC1C,OAAO,SAAS,qBAChB;AAAA,MACN,YACE,OAAO,OAAO,SAAS,eAAe,WAClC,OAAO,SAAS,aAChB;AAAA,IACR,IACA;AAAA,EACN;AACF;;;AC1xBO,SAAS,mBACd,UAAyC,CAAC,GAC5B;AACd,SAAO;AAAA,IACL,SAAS;AAAA,IACT;AAAA,EACF;AACF;;;AC9FO,SAAS,sCACd,UACc;AACd,QAAM,UAAU,OAAO;AAAA,IACrB,OAAO,OAAO,QAAQ,EAAE,IAAI,CAAC,YAAY;AAAA,MACvC,QAAQ;AAAA,MACR,gBAAgB,OAAO;AAAA,IACzB,CAAC;AAAA,EACH;AAEA,SAAO,mBAAmB,OAAO;AACnC;AAEA,SAAS,gBAAgB,SAA6C;AACpE,QAAM,aAAa,6BAA6B,OAAO;AAEvD,SAAO;AAAA,IACL,WAAW,WAAW;AAAA,IACtB,QAAQ,WAAW;AAAA,IACnB,QACE,WAAW,OAAO,SAAS,aACvB,aACA,WAAW,WAAW,aACpB,aACA;AAAA,IACR,SAAS,WAAW,WAAW,CAAC;AAAA,IAChC,WAAW,WAAW,aAAa,WAAW,YAAY;AAAA,IAC1D,WAAW,WAAW;AAAA,IACtB,YAAY,WAAW;AAAA,IACvB,YAAY,CAAC,GAAI,WAAW,cAAc,CAAC,CAAE;AAAA,IAC7C,UAAU,WAAW;AAAA,EACvB;AACF;;;ACjBA,IAAM,qBAAqB;AAC3B,IAAM,sBAAsB;AAC5B,IAAM,qBAAqB;AAC3B,IAAM,8BAA8B;AACpC,IAAM,yBAAyB;AAC/B,IAAM,mBAAmB;AACzB,IAAM,8BACJ;AACF,IAAM,6BACJ;AACF,IAAM,sCACJ;AACF,IAAM,iCACJ;AACF,IAAM,2BACJ;AACF,IAAM,wBACJ;AACF,IAAM,iCACJ;AACF,IAAM,4BACJ;AACF,IAAM,sBACJ;AAaK,SAAS,+BACd,QACA,UAAyC,CAAC,GACZ;AAC9B,QAAM,gBACJ,QAAQ,iBACR;AAAA,IACE,iBAAiB;AAAA,MACf,aAAa;AAAA,IACf,CAAC;AAAA,EACH;AACF,QAAM,wBACJ,cAAc,MAAM,IAAI,kBAAkB,GAAG,iBAAiB,CAAC;AAEjE,QAAM,iBAAiB,OAAO;AAAA,IAC5B,sCAAsC,OAAO,iBAAiB,OAAO,QAAQ,EAAE;AAAA,EACjF;AACA,QAAM,sBAAsB,wBAAwB,OAAO,iBAAiB,OAAO,SAAS;AAC5F,QAAM,aAAa;AAAA,IACjB;AAAA,MACE,OAAO,iBAAiB;AAAA,MACxB;AAAA,MACA;AAAA,IACF;AAAA,IACA,OAAO,iBAAiB;AAAA,IACxB;AAAA,IACA;AAAA,MACE,OAAO,OAAO,iBAAiB;AAAA,IACjC;AAAA,EACF;AACA,QAAM,mBAAmB;AAAA,IACvB,WAAW;AAAA,IACX;AAAA,IACA,WAAW;AAAA,EACb;AACA,MAAI,iBAAiB,mBAAmB,SAAS,GAAG;AAClD,UAAM,IAAI;AAAA,MACR,0BAA0B,iBAAiB,mBAAmB,MAAM;AAAA,IACtE;AAAA,EACF;AACA,QAAM,mBAAmB,yBAAyB,cAAc;AAChE,QAAM,qBAAqB,2BAA2B,gBAAgB;AAAA,IACpE;AAAA,EACF,CAAC;AACD,QAAM,oBAAoB;AAAA,IACxB,iBAAiB;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,MACE;AAAA,IACF;AAAA,EACF;AACA,MAAI,kBAAkB,kBAAkB,SAAS,GAAG;AAClD,UAAM,IAAI;AAAA,MACR,0BAA0B,kBAAkB,kBAAkB,MAAM;AAAA,IACtE;AAAA,EACF;AAEA,QAAM,eAAe,oBAAoB,OAAO,iBAAiB,SAAS,IACtE,sBAAsB,OAAO,iBAAiB,SAAS,IACvD;AACJ,QAAM,gBAAgB;AAAA,IACpB;AAAA,MACE;AAAA,QACE;AAAA,UACE;AAAA,YACE,WAAW;AAAA,YACX;AAAA,YACA;AAAA,YACA;AAAA,YACA,QAAQ,YAAY;AAAA,UACtB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,mBAAmB,qBAAqB,SAAS;AAAA,QACnD;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,QAAQ,mBAAmB,mBAAmB;AAAA,MAChD;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ,mBAAmB,cAAc;AAAA,IAC3C;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ,mBAAmB,SAAS;AAAA,EACtC;AACA,QAAM,gBAAgB,oBAAoB,eAAe;AAAA,IACvD;AAAA,IACA,GAAI,eAAe,CAAC,mBAAmB,IAAI,CAAC;AAAA,IAC5C,GAAI,mBAAmB,qBAAqB,SAAS,IAAI,CAAC,kBAAkB,IAAI,CAAC;AAAA,IACjF,GAAI,mBAAmB,sBAAsB,CAAC,2BAA2B,IAAI,CAAC;AAAA,IAC9E,GAAI,mBAAmB,iBAAiB,CAAC,sBAAsB,IAAI,CAAC;AAAA,IACpE,GAAI,mBAAmB,YAAY,CAAC,gBAAgB,IAAI,CAAC;AAAA,EAC3D,CAAC;AAED,gBAAc,iBAAiB;AAAA,IAC7B,MAAM;AAAA,IACN,OAAO,IAAI,YAAY,EAAE,OAAO,kBAAkB,WAAW;AAAA,IAC7D,aAAa;AAAA,IACb;AAAA,EACF,CAAC;AAED,MAAI,cAAc;AAChB,kBAAc,iBAAiB;AAAA,MAC7B,MAAM;AAAA,MACN,OAAO,IAAI,YAAY,EAAE,OAAO,YAAY;AAAA,MAC5C,aACE,cAAc,MAAM,IAAI,mBAAmB,GAAG,eAAe;AAAA,IACjE,CAAC;AAAA,EACH;AAEA,MAAI,mBAAmB,qBAAqB,SAAS,GAAG;AACtD,kBAAc,iBAAiB;AAAA,MAC7B,MAAM;AAAA,MACN,OAAO,IAAI,YAAY,EAAE,OAAO,mBAAmB,WAAW;AAAA,MAC9D,aACE,cAAc,MAAM,IAAI,kBAAkB,GAAG,eAAe;AAAA,IAChE,CAAC;AAAA,EACH;AAEA,MAAI,mBAAmB,qBAAqB;AAC1C,kBAAc,iBAAiB;AAAA,MAC7B,MAAM;AAAA,MACN,OAAO,IAAI,YAAY,EAAE,OAAO,mBAAmB,mBAAmB;AAAA,MACtE,aACE,cAAc,MAAM,IAAI,2BAA2B,GAAG,eACtD;AAAA,IACJ,CAAC;AAAA,EACH;AAEA,MAAI,mBAAmB,gBAAgB;AACrC,kBAAc,iBAAiB;AAAA,MAC7B,MAAM;AAAA,MACN,OAAO,IAAI,YAAY,EAAE,OAAO,mBAAmB,cAAc;AAAA,MACjE,aACE,cAAc,MAAM,IAAI,sBAAsB,GAAG,eAAe;AAAA,IACpE,CAAC;AAAA,EACH;AAEA,MAAI,mBAAmB,WAAW;AAChC,kBAAc,iBAAiB;AAAA,MAC7B,MAAM;AAAA,MACN,OAAO,IAAI,YAAY,EAAE,OAAO,mBAAmB,SAAS;AAAA,MAC5D,aACE,cAAc,MAAM,IAAI,gBAAgB,GAAG,eAAe;AAAA,IAC9D,CAAC;AAAA,EACH;AAEA,SAAO;AAAA,IACL,OAAO,cAAc,UAAU;AAAA,IAC/B,UAAU;AAAA,IACV,UAAU,QAAQ,YAAY,GAAG,OAAO,OAAO,IAAI;AAAA,EACrD;AACF;AAEA,SAAS,wBACP,WACwB;AACxB,SAAO,OAAO,OAAO,SAAS,EAAE,IAAI,CAAC,cAAc;AAAA,IACjD,YAAY,SAAS;AAAA,IACrB,MAAM,SAAS;AAAA,IACf,QAAQ,SAAS;AAAA,IACjB,UAAU,SAAS,YAAY;AAAA,IAC/B,WAAW,SAAS;AAAA,IACpB,YAAY,CAAC,GAAI,SAAS,cAAc,CAAC,CAAE;AAAA,IAC3C,UAAU;AAAA,MACR,QAAQ,SAAS,UAAU,UAAU;AAAA,MACrC,oBAAoB,SAAS,UAAU;AAAA,MACvC,sBAAsB,SAAS,UAAU;AAAA,MACzC,sBAAsB,SAAS,UAAU;AAAA,MACzC,iBAAiB,SAAS,UAAU;AAAA,IACtC;AAAA,IACA,QAAQ,SAAS,WAAW,SAAS,WAAW,SAAS;AAAA,EAC3D,EAAE;AACJ;AAEA,SAAS,oBACP,WACS;AACT,SACE,OAAO,KAAK,UAAU,mBAAmB,EAAE,SAAS,KACpD,OAAO,KAAK,UAAU,SAAS,EAAE,SAAS;AAE9C;AAEA,SAAS,wBACP,eACA,uBACA,kBACA,QACA,aACmB;AACnB,QAAM,OAAO,cAAc,IAAI,CAAC,kBAAkB,EAAE,GAAG,aAAa,EAAE;AACtE,MAAI,CAAC,aAAa;AAChB,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,KAAK,KAAK,CAAC,iBAAiB,aAAa,SAAS,gBAAgB;AACnF,MAAI,UAAU;AACZ,WAAO;AAAA,EACT;AAEA,QAAM,aACJ,sBAAsB,KAAK,CAAC,iBAAiB,aAAa,SAAS,gBAAgB,GAAG,MACtF,MAAM,KAAK,SAAS,CAAC;AACvB,OAAK,KAAK;AAAA,IACR,IAAI;AAAA,IACJ,MAAM;AAAA,IACN;AAAA,IACA,YAAY;AAAA,EACd,CAAC;AACD,SAAO;AACT;;;ACjQO,SAAS,gCACd,UACA,MACQ;AACR,SAAO,GAAG,SAAS,KAAK,IAAI,IAAI;AAClC;AAEO,SAAS,8BACd,UACA,SACyB;AACzB,QAAM,oBAAoB,yBAAyB,QAAQ;AAC3D,SAAO;AAAA,IACL,iBAAiB;AAAA,IACjB,WACE,QAAQ,aAAa,gCAAgC,mBAAmB,QAAQ,IAAI;AAAA,IACtF,MAAM,QAAQ;AAAA,IACd,WAAW,QAAQ,aAAa,kBAAkB;AAAA,IAClD,YAAY,kBAAkB;AAAA,IAC9B,mBAAmB,iCAAiC,iBAAiB;AAAA,IACrE;AAAA,EACF;AACF;AAEO,SAAS,4BACd,WACA,UAC2B;AAC3B,QAAM,OAAO,UAAU,OAAO,CAAC,UAAU,MAAM,cAAc,SAAS,SAAS;AAC/E,OAAK,KAAK,QAAQ;AAClB,SAAO,KAAK,KAAK,+BAA+B;AAClD;AAUO,SAAS,uBACd,WACqB;AACrB,SAAO,UAAU,IAAI,CAAC,cAAc;AAAA,IAClC,WAAW,SAAS;AAAA,IACpB,MAAM,SAAS;AAAA,IACf,WAAW,SAAS;AAAA,IACpB,mBAAmB,SAAS;AAAA,IAC5B,QAAQ;AAAA,EACV,EAAE;AACJ;AAEO,SAAS,4BACd,UACyB;AACzB,SAAO;AAAA,IACL,GAAG;AAAA,IACH,MAAM,SAAS,KAAK,WAAW,WAAW,IACtC,SAAS,OACT,YAAY,SAAS,IAAI;AAAA,EAC/B;AACF;AAEA,SAAS,gCACP,MACA,OACQ;AACR,QAAM,sBAAsB,MAAM,UAAU,cAAc,KAAK,SAAS;AACxE,MAAI,wBAAwB,GAAG;AAC7B,WAAO;AAAA,EACT;AAEA,SAAO,KAAK,UAAU,cAAc,MAAM,SAAS;AACrD;","names":["baseIndex","targetIndex","escapeAttribute","boundaries","children","tagEnd","node","escapeAttribute","escapeAttribute","serializeText","findChildElement","localName","requiresPreservedSpace","escapeXml","text","escapeXml","cloneRelationship","cloneRelationship","parseAttributes","decodeXmlEntities"]}
|