pptx-svelte-viewer 3.3.0 → 3.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. package/CHANGELOG.md +50 -0
  2. package/dist/{AiChatPanel-D1kCyNeI.js → AiChatPanel-2KybLFhz.js} +11 -11
  3. package/dist/{export-CL58Fm_4.js → export-C0RzyaUT.js} +36613 -31616
  4. package/dist/i18n.js +1 -1
  5. package/dist/index.js +2 -2
  6. package/dist/pptx-svelte-viewer.css +1 -1
  7. package/dist/{translator-i8zxb8S8.js → translator-YCJ___7k.js} +42 -1
  8. package/dist/viewer/ai/ai-panel-controller.svelte.d.ts +2 -8
  9. package/dist/viewer/ai/ai-panel-controller.svelte.d.ts.map +1 -1
  10. package/dist/viewer/components/inspector/animation-panel-helpers.d.ts.map +1 -1
  11. package/dist/viewer/components/props-elements.d.ts +28 -0
  12. package/dist/viewer/components/props-elements.d.ts.map +1 -1
  13. package/dist/viewer/components/props-stage.d.ts +6 -0
  14. package/dist/viewer/components/props-stage.d.ts.map +1 -1
  15. package/dist/viewer/components/ribbon/review/comment-compose.svelte.d.ts +40 -0
  16. package/dist/viewer/components/ribbon/review/comment-compose.svelte.d.ts.map +1 -0
  17. package/dist/viewer/components/viewer-body-props.d.ts +14 -9
  18. package/dist/viewer/components/viewer-body-props.d.ts.map +1 -1
  19. package/dist/viewer/editor/editor-arrange-ops.d.ts.map +1 -1
  20. package/dist/viewer/editor/editor-background-controller.d.ts.map +1 -1
  21. package/dist/viewer/editor/editor-clipboard.d.ts.map +1 -1
  22. package/dist/viewer/editor/editor-controller-deps.d.ts +2 -5
  23. package/dist/viewer/editor/editor-controller-deps.d.ts.map +1 -1
  24. package/dist/viewer/editor/editor-controller-wiring.d.ts +1 -2
  25. package/dist/viewer/editor/editor-controller-wiring.d.ts.map +1 -1
  26. package/dist/viewer/editor/editor-controller.svelte.d.ts.map +1 -1
  27. package/dist/viewer/editor/editor-document-lifecycle.d.ts.map +1 -1
  28. package/dist/viewer/editor/editor-document-state.d.ts +6 -2
  29. package/dist/viewer/editor/editor-document-state.d.ts.map +1 -1
  30. package/dist/viewer/editor/editor-element-controller.d.ts +1 -1
  31. package/dist/viewer/editor/editor-element-controller.d.ts.map +1 -1
  32. package/dist/viewer/editor/editor-handle-handlers.d.ts +1 -2
  33. package/dist/viewer/editor/editor-handle-handlers.d.ts.map +1 -1
  34. package/dist/viewer/editor/editor-ink-controller.svelte.d.ts.map +1 -1
  35. package/dist/viewer/editor/editor-insert.d.ts.map +1 -1
  36. package/dist/viewer/editor/editor-master-crud.d.ts +24 -0
  37. package/dist/viewer/editor/editor-master-crud.d.ts.map +1 -0
  38. package/dist/viewer/editor/editor-presentation-metadata.svelte.d.ts +7 -0
  39. package/dist/viewer/editor/editor-presentation-metadata.svelte.d.ts.map +1 -1
  40. package/dist/viewer/editor/editor-selection-gestures.d.ts +1 -2
  41. package/dist/viewer/editor/editor-selection-gestures.d.ts.map +1 -1
  42. package/dist/viewer/editor/editor-state.svelte.d.ts +44 -3
  43. package/dist/viewer/editor/editor-state.svelte.d.ts.map +1 -1
  44. package/dist/viewer/editor/editor-transition-controller.d.ts.map +1 -1
  45. package/dist/viewer/editor/editor-zorder.d.ts +2 -2
  46. package/dist/viewer/editor/editor-zorder.d.ts.map +1 -1
  47. package/dist/viewer/editor/index.d.ts +4 -5
  48. package/dist/viewer/editor/index.d.ts.map +1 -1
  49. package/dist/viewer/editor/inline-text.d.ts +1 -6
  50. package/dist/viewer/editor/inline-text.d.ts.map +1 -1
  51. package/dist/viewer/export/export-controller.svelte.d.ts.map +1 -1
  52. package/dist/viewer/export/export-print.d.ts +7 -1
  53. package/dist/viewer/export/export-print.d.ts.map +1 -1
  54. package/dist/viewer/index.d.ts +310 -39
  55. package/dist/viewer/index.js +13 -13
  56. package/dist/viewer/presentation/action-runner-callbacks.d.ts +18 -0
  57. package/dist/viewer/presentation/action-runner-callbacks.d.ts.map +1 -0
  58. package/dist/viewer/presentation/animation-playback.svelte.d.ts +3 -2
  59. package/dist/viewer/presentation/animation-playback.svelte.d.ts.map +1 -1
  60. package/dist/viewer/presentation/presentation-controller.svelte.d.ts +39 -2
  61. package/dist/viewer/presentation/presentation-controller.svelte.d.ts.map +1 -1
  62. package/dist/viewer/render/media-view.d.ts +1 -13
  63. package/dist/viewer/render/media-view.d.ts.map +1 -1
  64. package/dist/viewer/render/ole-view.d.ts +2 -8
  65. package/dist/viewer/render/ole-view.d.ts.map +1 -1
  66. package/dist/viewer/state/compat-toasts.svelte.d.ts +28 -0
  67. package/dist/viewer/state/compat-toasts.svelte.d.ts.map +1 -0
  68. package/dist/viewer/state/create-viewer-state-editor-ui.svelte.d.ts +4 -0
  69. package/dist/viewer/state/create-viewer-state-editor-ui.svelte.d.ts.map +1 -1
  70. package/dist/viewer/state/create-viewer-state-presentation.svelte.d.ts.map +1 -1
  71. package/dist/viewer/state/create-viewer-state-types.d.ts +10 -0
  72. package/dist/viewer/state/create-viewer-state-types.d.ts.map +1 -1
  73. package/dist/viewer/state/create-viewer-state.svelte.d.ts.map +1 -1
  74. package/dist/viewer/state/google-webfonts.d.ts +1 -1
  75. package/dist/viewer/state/guide-id.d.ts +9 -0
  76. package/dist/viewer/state/guide-id.d.ts.map +1 -0
  77. package/dist/viewer/state/inspector-deck.d.ts +9 -2
  78. package/dist/viewer/state/inspector-deck.d.ts.map +1 -1
  79. package/dist/viewer/state/loader-helpers.d.ts.map +1 -1
  80. package/dist/viewer/state/presentation-loader.svelte.d.ts +20 -1
  81. package/dist/viewer/state/presentation-loader.svelte.d.ts.map +1 -1
  82. package/dist/viewer/state/read-only-recommendation.svelte.d.ts +34 -0
  83. package/dist/viewer/state/read-only-recommendation.svelte.d.ts.map +1 -0
  84. package/dist/viewer/state/viewer-effects.svelte.d.ts.map +1 -1
  85. package/dist/viewer/state/viewer-parity-ui.svelte.d.ts +19 -7
  86. package/dist/viewer/state/viewer-parity-ui.svelte.d.ts.map +1 -1
  87. package/dist/viewer/state/viewport-handlers.d.ts +4 -0
  88. package/dist/viewer/state/viewport-handlers.d.ts.map +1 -1
  89. package/package.json +1 -1
  90. package/dist/viewer/ai/ai-log-export.d.ts +0 -71
  91. package/dist/viewer/ai/ai-log-export.d.ts.map +0 -1
  92. package/dist/viewer/ai/focus-targets.d.ts +0 -36
  93. package/dist/viewer/ai/focus-targets.d.ts.map +0 -1
  94. package/dist/viewer/editor/editor-geometry.d.ts +0 -29
  95. package/dist/viewer/editor/editor-geometry.d.ts.map +0 -1
  96. package/dist/viewer/editor/editor-gestures.d.ts +0 -55
  97. package/dist/viewer/editor/editor-gestures.d.ts.map +0 -1
  98. package/dist/viewer/editor/editor-mutations.d.ts +0 -59
  99. package/dist/viewer/editor/editor-mutations.d.ts.map +0 -1
  100. package/dist/viewer/presentation/animation-playback-helpers.d.ts +0 -43
  101. package/dist/viewer/presentation/animation-playback-helpers.d.ts.map +0 -1
@@ -10161,6 +10161,11 @@ interface SlideTemplateBuildOptions {
10161
10161
  */
10162
10162
  translate?: (key: string) => string;
10163
10163
  }
10164
+ /** A user-placed alignment guide: `axis: 'v'` is a vertical line at x=`position`. */
10165
+ interface SnapGuideInput {
10166
+ axis: 'h' | 'v';
10167
+ position: number;
10168
+ }
10164
10169
  /** A snap alignment line: `axis: 'v'` is a vertical line at x=`position`. */
10165
10170
  interface SnapLine {
10166
10171
  axis: 'h' | 'v';
@@ -10547,6 +10552,14 @@ interface PresentationInkStroke {
10547
10552
  points: PresentationInkPoint[];
10548
10553
  }
10549
10554
  //#endregion
10555
+ //#region src/render/alignment-guides.d.ts
10556
+ /** A single alignment guide, positioned in authored slide pixels. */
10557
+ interface Guide {
10558
+ id: string;
10559
+ axis: 'h' | 'v';
10560
+ position: number;
10561
+ }
10562
+ //#endregion
10550
10563
  //#region src/render/find-replace.d.ts
10551
10564
  /** Identifies a single match of the find query at segment-level precision. */
10552
10565
  interface FindResult {
@@ -10707,6 +10720,19 @@ interface AutosaveRecoveryPrompt {
10707
10720
  readonly restoreKey: string;
10708
10721
  readonly discardKey: string;
10709
10722
  }
10723
+ //#endregion
10724
+ //#region src/render/master-view-crud.d.ts
10725
+ /** One Slide Master view sidebar command. */
10726
+ type MasterViewCrudActionId = 'addLayout' | 'duplicateLayout' | 'deleteLayout' | 'renameLayout' | 'addMaster' | 'duplicateMaster' | 'deleteMaster' | 'renameMaster';
10727
+ /** A framework-neutral descriptor for one sidebar button. */
10728
+ interface MasterViewCrudAction {
10729
+ id: MasterViewCrudActionId;
10730
+ /** i18n key for the button label (`pptx.masterView.<id>`). */
10731
+ labelKey: string;
10732
+ enabled: boolean;
10733
+ /** i18n key explaining why the button is disabled, set only when it is. */
10734
+ disabledReasonKey?: string;
10735
+ }
10710
10736
  /**
10711
10737
  * Why the deck is being serialised, which is a separate question from whether
10712
10738
  * the user protected it.
@@ -10785,6 +10811,28 @@ interface ViewerPreferences {
10785
10811
  snapToGrid: boolean;
10786
10812
  reducedMotion: boolean;
10787
10813
  }
10814
+ /**
10815
+ * Viewer preferences plus the `ppt/viewProps.xml` fields the round-trip in
10816
+ * {@link viewerPreferencesFromViewProperties} seeds from the deck itself. All
10817
+ * optional, so a plain {@link ViewerPreferences} is assignable.
10818
+ */
10819
+ interface DeckViewPreferences extends ViewerPreferences {
10820
+ /** `p:viewPr/p:slideViewPr/p:cSldViewPr/@snapToObjects`. */
10821
+ snapToObjects?: boolean;
10822
+ /** `p:viewPr/p:slideViewPr/p:cSldViewPr/@showGuides`. */
10823
+ showGuides?: boolean;
10824
+ /** `p:viewPr/p:gridSpacing/@cx`, in positive DrawingML (EMU) units. */
10825
+ gridSpacingCx?: number;
10826
+ /** `p:viewPr/p:gridSpacing/@cy`, in positive DrawingML (EMU) units. */
10827
+ gridSpacingCy?: number;
10828
+ }
10829
+ /** A `p:showPr/p:sldRg` custom range, resolved to 0-based deck indexes. */
10830
+ interface AuthoredSlideRange {
10831
+ /** First slide of the range, 0-based, inclusive. */
10832
+ readonly fromIndex: number;
10833
+ /** Last slide of the range, 0-based, inclusive. */
10834
+ readonly toIndex: number;
10835
+ }
10788
10836
  /**
10789
10837
  * Optional hook point for hosts that want to wire a real sign-in flow into
10790
10838
  * File > Account. Disabled by default: the Account page renders nothing
@@ -11024,6 +11072,44 @@ interface ViewerOptionsStoreInit {
11024
11072
  /** Skip localStorage entirely (hosts that own persistence themselves). */
11025
11073
  persist?: boolean;
11026
11074
  }
11075
+ //#endregion
11076
+ //#region src/render/editor-mutations.d.ts
11077
+ /**
11078
+ * Pure, immutable slide-array mutations for the editor.
11079
+ *
11080
+ * Extracted from the Vanilla binding's `editor/editor-mutations` (the superset
11081
+ * of the byte-for-byte-equivalent Svelte copy; Vue's `useEditorOperations`
11082
+ * commit helpers do the same array math inline, reactivity mixed in). Every
11083
+ * function takes the current `PptxSlide[]` and returns a brand-new array
11084
+ * (untouched slides are reused by reference so the render layer can cheaply
11085
+ * detect changes). All cloning defers to the core helpers (`cloneSlide`,
11086
+ * `cloneElement`, `duplicateElement`); nothing is mutated in place.
11087
+ */
11088
+ /** Geometry patch applied by drag / resize / rotate / nudge. */
11089
+ interface ElementBoxPatch {
11090
+ x: number;
11091
+ y: number;
11092
+ width: number;
11093
+ height: number;
11094
+ rotation: number;
11095
+ }
11096
+ type ReadOnlyRecommendationKind = 'modifyVerifier' | 'markedFinal' | null;
11097
+ interface ReadOnlyRecommendation {
11098
+ readonly kind: ReadOnlyRecommendationKind;
11099
+ /** i18n key for the banner/toast a binding shows for this recommendation. */
11100
+ readonly messageKey: string;
11101
+ /** Whether a binding's "read-only" toggle should default to on. */
11102
+ readonly defaultReadOnly: boolean;
11103
+ }
11104
+ interface CompatibilityWarningToast {
11105
+ /** Stable per-code id, since toasts are deduped by code (see module docs). */
11106
+ readonly id: string;
11107
+ readonly code: string;
11108
+ readonly severity: 'info' | 'warning';
11109
+ readonly messageKey: string;
11110
+ /** `{{code}}` for the generic fallback key; `undefined` for a mapped code. */
11111
+ readonly params?: Readonly<Record<string, string>>;
11112
+ }
11027
11113
 
11028
11114
  //#endregion
11029
11115
  //#region src/ai/change-diff.d.ts
@@ -11283,6 +11369,13 @@ interface PptxAiBridge {
11283
11369
  /** Surface a transient message in the host UI (toast / status line). */
11284
11370
  notify?(message: string, level?: PptxAiNotifyLevel): void;
11285
11371
  }
11372
+ /** One element ring to draw on the canvas: an explicit pick or a live-tool focus. */
11373
+ interface AiCanvasHighlight {
11374
+ slideIndex: number;
11375
+ elementId: string;
11376
+ /** `pick` = persistent user pick; `active` = transient AI-is-working ring. */
11377
+ variant: 'pick' | 'active';
11378
+ }
11286
11379
  //#endregion
11287
11380
  //#region src/ai/tool-target.d.ts
11288
11381
  /**
@@ -11883,6 +11976,8 @@ interface SlideCanvasProps {
11883
11976
  editTemplateMode?: boolean;
11884
11977
  /** Forwarded to `SlideStage`; see `SlideStageProps.editingElementId`. */
11885
11978
  editingElementId?: string | null;
11979
+ /** Forwarded to `SlideStage`; see `SlideStageProps.selectedElementIds`. */
11980
+ selectedElementIds?: readonly string[];
11886
11981
  ontablecellcommit?: (elementId: string, rowIndex: number, cellIndex: number, text: string) => void;
11887
11982
  onsmartartnodecommit?: (elementId: string, nodeId: string, text: string) => void;
11888
11983
  onsmartartnodefill?: (elementId: string, nodeId: string, fill: string) => void;
@@ -12280,25 +12375,6 @@ type LoadDocumentArgs = [
12280
12375
  customShows?: PptxCustomShow[]
12281
12376
  ];
12282
12377
 
12283
- /**
12284
- * Pure, immutable slide-array mutations for the Svelte editor.
12285
- *
12286
- * Mirrors the vanilla binding's `editor-mutations` (in turn the Vue binding's
12287
- * `useEditorOperations` commit helpers), minus the reactivity: every function
12288
- * takes the current `PptxSlide[]` and returns a brand-new array (untouched
12289
- * slides are reused by reference so the render layer can cheaply detect
12290
- * changes). All cloning defers to the core helpers (`cloneSlide`,
12291
- * `cloneElement`, `duplicateElement`); nothing is mutated in place.
12292
- */
12293
- /** Geometry patch applied by drag / resize / rotate / nudge. */
12294
- interface ElementBoxPatch {
12295
- x: number;
12296
- y: number;
12297
- width: number;
12298
- height: number;
12299
- rotation: number;
12300
- }
12301
-
12302
12378
  /**
12303
12379
  * Z-order (paint-order) reordering for the Svelte editor.
12304
12380
  *
@@ -12306,8 +12382,8 @@ interface ElementBoxPatch {
12306
12382
  * `sendBackward`) are the shared, framework-agnostic operations from
12307
12383
  * `pptx-viewer-shared` (`render/element-operations`), where array index 0 is
12308
12384
  * the back and the last index is the front. This module only lifts them to the
12309
- * slide-array shape the editor state stores, reusing the same immutable
12310
- * `mapSlideElements` helper as the other mutations.
12385
+ * slide-array shape the editor state stores, reusing the shared
12386
+ * `reorderElementOnSlide` helper as the other mutations do.
12311
12387
  */
12312
12388
  /** Which way to move the selected element through the paint-order stack. */
12313
12389
  type ZOrderDirection = 'front' | 'back' | 'forward' | 'backward';
@@ -12467,6 +12543,28 @@ declare class EditorMasterController {
12467
12543
  setBackgroundColor(backgroundColor: string): void;
12468
12544
  }
12469
12545
 
12546
+ interface MasterViewCrudPrompts {
12547
+ /** Ask for the new layout/master name; null/empty cancels the rename. */
12548
+ promptName(currentName: string): string | null;
12549
+ /** Surface a rejection (`notFound` / `inUse` / `lastMaster`) as translated copy. */
12550
+ notify(message: string): void;
12551
+ translate(key: string): string;
12552
+ }
12553
+ /** Drives the sidebar's Insert/Duplicate/Delete/Rename commands on {@link EditorState}. */
12554
+ declare class EditorMasterCrudController {
12555
+ private readonly editor;
12556
+ constructor(editor: EditorState);
12557
+ /** The sidebar's action list (enabled/disabled + reason) for the current target. */
12558
+ actions(): MasterViewCrudAction[];
12559
+ /**
12560
+ * Run one command against the CURRENT master-view target. A no-op outside
12561
+ * master view, on a read-only deck, or when the action is disabled for the
12562
+ * target (mirrors the sidebar's own gating, so a stray call through the
12563
+ * public API cannot bypass it).
12564
+ */
12565
+ run(id: MasterViewCrudActionId, prompts: MasterViewCrudPrompts): Promise<boolean>;
12566
+ }
12567
+
12470
12568
  interface PresentationMetadataHost {
12471
12569
  readonly editable: boolean;
12472
12570
  pushHistory(): void;
@@ -12492,6 +12590,13 @@ declare class EditorPresentationMetadata {
12492
12590
  private static clone;
12493
12591
  set(headerFooter?: PptxHeaderFooter, presentationProperties?: PptxPresentationProperties, customShows?: PptxCustomShow[]): void;
12494
12592
  updatePresentationProperties(next: PptxPresentationProperties): void;
12593
+ /**
12594
+ * Fold a picker's recent-colours list into `presentationProperties.mruColors`
12595
+ * WITHOUT pushing undo history (wave-4 B6): PowerPoint's colour-picker MRU
12596
+ * is not an undoable edit, mirroring how `editor.viewProperties` writes back
12597
+ * the View > Grid/Guides/Snap toggles outside `pushHistory`/`commitChange`.
12598
+ */
12599
+ setMruColorsSilently(mruColors: readonly string[]): void;
12495
12600
  updateHeaderFooter(next: PptxHeaderFooter): void;
12496
12601
  updateCustomShows(next: PptxCustomShow[]): void;
12497
12602
  private commit;
@@ -12707,6 +12812,13 @@ interface EditorStateDeps {
12707
12812
  * case core re-emits the load-time dimensions verbatim.
12708
12813
  */
12709
12814
  getSlideSize?: () => PptxSlideSize | undefined;
12815
+ /**
12816
+ * Adopt a fresh handler in place of the loaded one. Master-view CRUD
12817
+ * (`masterCrud`) rebuilds the package through core and comes back with a
12818
+ * new `PptxHandler`; the loader owns handler lifecycle, so it disposes the
12819
+ * previous one here. Optional for out-of-tree mounts and the unit tests.
12820
+ */
12821
+ setHandler?: (handler: PptxHandler) => void;
12710
12822
  onChange?: () => void;
12711
12823
  }
12712
12824
  declare class EditorState {
@@ -12740,6 +12852,28 @@ declare class EditorState {
12740
12852
  * undo stack owns.
12741
12853
  */
12742
12854
  theme: PptxTheme | undefined;
12855
+ /**
12856
+ * `ppt/viewProps.xml`, seeded from the load and kept in sync with the View >
12857
+ * Grid/Guides/Snap toggles (wave 4 #5: `viewPropertiesPatchFromPreferences`
12858
+ * writes the toggle state back in here). Deliberately outside
12859
+ * {@link EditorSnapshot}, like {@link theme}: PowerPoint does not undo a view
12860
+ * toggle, so this is session state that `saveEditorDocument` reads directly,
12861
+ * never something `pushHistory`/`commitChange` touches.
12862
+ */
12863
+ viewProperties: PptxViewProperties | undefined;
12864
+ /**
12865
+ * Modern comment authors (`ppt/authors.xml`, Office 2021 `p188:author`),
12866
+ * seeded from the load. Read-only round-trip metadata, like {@link theme}:
12867
+ * the comment panel's @-mention typeahead (wave-4 B5) reads this to match
12868
+ * against, never something a binding edits or that undo restores.
12869
+ */
12870
+ modernCommentAuthors: PptxModernCommentAuthor[];
12871
+ /**
12872
+ * Legacy comment authors (`ppt/commentAuthors.xml`), offered to the
12873
+ * @-mention typeahead alongside {@link modernCommentAuthors}. Same
12874
+ * read-only, non-undo lifecycle.
12875
+ */
12876
+ commentAuthors: PptxCommentAuthor[];
12743
12877
  /**
12744
12878
  * Families the deck embeds, offered as their own font-dropdown group. Write
12745
12879
  * through {@link adoptEmbeddedFontFamilies} so {@link embedFonts} is reseeded
@@ -12806,6 +12940,7 @@ declare class EditorState {
12806
12940
  readonly animationOps: EditorAnimationController;
12807
12941
  readonly inkOps: EditorInkController;
12808
12942
  readonly masterOps: EditorMasterController;
12943
+ readonly masterCrud: EditorMasterCrudController;
12809
12944
  readonly formatPainter: EditorFormatPainterController;
12810
12945
  readonly equationOps: EditorEquationController;
12811
12946
  constructor(deps: EditorStateDeps);
@@ -12813,6 +12948,15 @@ declare class EditorState {
12813
12948
  get headerFooter(): PptxHeaderFooter;
12814
12949
  get presentationProperties(): PptxPresentationProperties;
12815
12950
  get customShows(): PptxCustomShow[];
12951
+ /** The colour picker's "Recent colours" row (`p:clrMru`), most-recent-first. */
12952
+ get mruColors(): string[];
12953
+ /**
12954
+ * Record a colour just picked in ANY colour picker (fill, line, text,
12955
+ * background, table cell, chart series, ...) into the recent-colours row
12956
+ * (wave-4 B6). Writes `presentationProperties.mruColors` OUTSIDE the undo
12957
+ * stack, like the view-preferences write-back.
12958
+ */
12959
+ recordRecentColor(hex: string): void;
12816
12960
  get canRedo(): boolean;
12817
12961
  get selectedElementId(): string | null;
12818
12962
  get selectedElement(): PptxElement | undefined;
@@ -12824,6 +12968,8 @@ declare class EditorState {
12824
12968
  /** The loaded core handler, or null before a deck is open. Used by the
12825
12969
  * Slides group for layout switching (`applyLayoutToSlide`). */
12826
12970
  getHandler(): PptxHandler | null;
12971
+ /** Hand a rebuilt handler to the loader (see `EditorStateDeps.setHandler`). */
12972
+ adoptHandler(handler: PptxHandler): void;
12827
12973
  /**
12828
12974
  * The `p:sldSz` the next save should write, or undefined to leave the
12829
12975
  * load-time dimensions alone. Slide size lives on the loader (it is not
@@ -12970,10 +13116,7 @@ interface EditorControllerDeps {
12970
13116
  */
12971
13117
  getGridSize?(): number;
12972
13118
  getSnapToShape?(): boolean;
12973
- getGuides?(): readonly {
12974
- axis: 'h' | 'v';
12975
- position: number;
12976
- }[];
13119
+ getGuides?(): readonly SnapGuideInput[];
12977
13120
  /**
12978
13121
  * Transform inline-editor text at commit time (File > Options > Proofing
12979
13122
  * AutoCorrect); identity when unset.
@@ -13403,7 +13546,20 @@ declare class PresentationLoader {
13403
13546
  * `p:presentationPr`.
13404
13547
  */
13405
13548
  viewProperties: PptxViewProperties | undefined;
13549
+ /** Write-protection verifier from `p:modifyVerifier` (`presentation.xml`). */
13550
+ modifyVerifier: PptxModifyVerifier | undefined;
13551
+ /**
13552
+ * Every compatibility warning the load (and any save/patch so far this
13553
+ * session) has raised, from `handler.getCompatibilityWarnings()`: unmodelled
13554
+ * markup round-tripped only via `rawXml`, an external image reference that
13555
+ * cannot be embedded, and so on. Feeds the compat-toast stack (wave 4 #3).
13556
+ */
13557
+ compatibilityWarnings: PptxCompatibilityWarning[];
13406
13558
  customShows: PptxCustomShow[];
13559
+ /** Modern comment authors (`ppt/authors.xml`, Office 2021 `p188:author`), for the @-mention typeahead (wave-4 B5). */
13560
+ modernCommentAuthors: PptxModernCommentAuthor[];
13561
+ /** Legacy comment authors (`ppt/commentAuthors.xml`), round-tripped and offered to the typeahead alongside the modern list. */
13562
+ commentAuthors: PptxCommentAuthor[];
13407
13563
  coreProperties: PptxCoreProperties | undefined;
13408
13564
  appProperties: PptxAppProperties | undefined;
13409
13565
  customProperties: PptxCustomProperty[];
@@ -13467,6 +13623,12 @@ declare class PresentationLoader {
13467
13623
  getLoadOptions: () => Pick<PptxHandlerLoadOptions, 'allowExternalImages'>;
13468
13624
  /** Parse a `.pptx` buffer into reactive viewer state. */
13469
13625
  load(raw: Uint8Array | ArrayBuffer, origin?: CollabLoadOrigin): Promise<void>;
13626
+ /**
13627
+ * Replace the live handler with one core rebuilt (master-view CRUD returns
13628
+ * a fresh package rather than a patch). Disposes the previous handler; the
13629
+ * Blob URLs stay valid because the media parts are unchanged.
13630
+ */
13631
+ adoptHandler(next: PptxHandler): void;
13470
13632
  /** Cancel in-flight loads, revoke Blob URLs, dispose the handler. */
13471
13633
  dispose(): void;
13472
13634
  }
@@ -13683,8 +13845,9 @@ interface EditingApi {
13683
13845
  *
13684
13846
  * The class owns the reactive per-element state map, the keyframes CSS, and the
13685
13847
  * interactive / hover trigger-shape id sets; the controller stays pure. The
13686
- * clock (timers, requestAnimationFrame) + DOM effects live in
13687
- * {@link module:presentation/animation-playback-helpers}.
13848
+ * clock (timers, requestAnimationFrame) + DOM effects live in the shared
13849
+ * {@link module:render/animation-playback-engine}, wired here with the local
13850
+ * `./animation-sound` player.
13688
13851
  *
13689
13852
  * NOTE: the editor / inspector animation PREVIEW still uses the older shared
13690
13853
  * `buildClickGroups` model (see `AnimationsTab` / `editor-animation-controller`);
@@ -13788,6 +13951,14 @@ interface PresentationControllerDeps {
13788
13951
  exit?(): void;
13789
13952
  /** `p:showPr` "end with black slide"; defaults to on, like PowerPoint. */
13790
13953
  getEndWithBlackSlide?(): boolean | undefined;
13954
+ /**
13955
+ * Slide Show > Set Up Show > "Loop continuously until 'Esc'"
13956
+ * (`p:presentationPr/@loopContinuously`), or the implicit loop of a kiosk
13957
+ * (`showType === 'kiosk'`) show. When true, advancing past the last slide
13958
+ * wraps to the show's first slide instead of raising the black end screen
13959
+ * or exiting.
13960
+ */
13961
+ getLoopContinuously?(): boolean | undefined;
13791
13962
  /**
13792
13963
  * Membership of the custom show the user selected, or null/undefined for the
13793
13964
  * whole deck. Restricts and reorders the show; hiding still wins over it.
@@ -13802,6 +13973,24 @@ interface PresentationControllerDeps {
13802
13973
  * omitted opens unconditionally.
13803
13974
  */
13804
13975
  confirmUrl?(url: string): boolean;
13976
+ /**
13977
+ * The `p:showPr/p:sldRg` authored slide-range restriction (deck opens into
13978
+ * slides `fromIndex..toIndex` rather than the whole deck), when no custom
13979
+ * show is active. `resolveShowSlideIndexes` applies hiding and the active
13980
+ * custom show first, same as `getActiveCustomShow`; this is the third,
13981
+ * lowest-precedence restriction.
13982
+ */
13983
+ getAuthoredRange?(): AuthoredSlideRange | null | undefined;
13984
+ /**
13985
+ * The deck's custom shows, for `ppaction://customshow?id=<id>` (wave-4
13986
+ * B7): the runner resolves `id` against this list to find the show's
13987
+ * membership.
13988
+ */
13989
+ getCustomShows?(): readonly PptxCustomShow[];
13990
+ /** Current active custom show id (or null for the whole deck), read back by `returnAfter`. */
13991
+ getActiveCustomShowId?(): string | null;
13992
+ /** Switch the active custom show (mirrors {@link getActiveCustomShow}'s source of truth). */
13993
+ setActiveCustomShowId?(id: string | null): void;
13805
13994
  }
13806
13995
  declare class PresentationController {
13807
13996
  #private;
@@ -13853,6 +14042,17 @@ declare class PresentationController {
13853
14042
  * wraps a backward press off the first slide.
13854
14043
  */
13855
14044
  previousSlide(): void;
14045
+ /**
14046
+ * The deck index the show should OPEN on when entered from `activeIndex`
14047
+ * (wave-4 B1): `activeIndex` itself when the show includes it ("From
14048
+ * Current Slide"), otherwise the nearest show slide, per
14049
+ * `presentationEntrySlideIndex`. Every entry point (status-bar button,
14050
+ * ribbon From Current Slide, `setMode('present')`, the mobile toolbar) must
14051
+ * seed the presentation index with this instead of the raw active slide, or
14052
+ * a deck authored with a `p:showPr/p:sldRg` range (or a custom show that
14053
+ * excludes the active slide) opens on a slide the show does not include.
14054
+ */
14055
+ entryIndex(activeIndex: number): number;
13856
14056
  /** Home: the show's first slide, which is not slide 1 when that one is hidden. */
13857
14057
  firstSlide(): void;
13858
14058
  /** End: the show's last slide, skipping trailing hidden slides. */
@@ -13966,13 +14166,32 @@ declare class AutosaveRecoveryController {
13966
14166
  dismiss(): void;
13967
14167
  }
13968
14168
 
13969
- /** One element ring to draw on the canvas: an explicit pick or a live-tool focus. */
13970
- interface AiCanvasHighlight {
13971
- slideIndex: number;
13972
- elementId: string;
13973
- /** `pick` = persistent user pick; `active` = transient AI-is-working ring. */
13974
- variant: 'pick' | 'active';
14169
+ /**
14170
+ * CompatToastsState: the fidelity-loss toast stack shown after a load whose
14171
+ * parse reported `PptxCompatibilityWarning`s (unmodelled markup, external
14172
+ * image references, a chart workbook that could not be written back, and so
14173
+ * on). Svelte port of Vue's `useCompatibilityToasts` composable.
14174
+ *
14175
+ * Toasts do not auto-hide (they are load diagnostics, not transient
14176
+ * notices): they persist until dismissed, and `reset()` clears them for a
14177
+ * newly loaded document, called from the same load-commit hook that resets
14178
+ * the read-only recommendation.
14179
+ */
14180
+ declare class CompatToastsState {
14181
+ #private;
14182
+ constructor(deps: {
14183
+ getWarnings(): readonly PptxCompatibilityWarning[];
14184
+ });
14185
+ /** Every toast this load produced, dismissed ones excluded, capped at the visible limit. */
14186
+ get visibleToasts(): CompatibilityWarningToast[];
14187
+ /** How many more toasts exist beyond the visible limit. */
14188
+ get overflowCount(): number;
14189
+ dismiss(id: string): void;
14190
+ dismissAll(): void;
14191
+ /** Clear the dismissal state for a newly loaded document. */
14192
+ reset(): void;
13975
14193
  }
14194
+
13976
14195
  /** Live viewer accessors + the panel-open hook the controller closes over. */
13977
14196
  interface AiPanelControllerDeps {
13978
14197
  getActiveSlideIndex(): number;
@@ -14052,6 +14271,38 @@ interface AiCluster {
14052
14271
  readonly canvasHighlights: readonly AiCanvasHighlight[];
14053
14272
  }
14054
14273
 
14274
+ /**
14275
+ * ReadOnlyRecommendationState: the Trust-Center-style banner shown when a
14276
+ * loaded deck asks to be opened read-only (`p:modifyVerifier`, or `docProps/
14277
+ * custom.xml`'s "Mark as Final"), and the lock that goes with it. Svelte port
14278
+ * of Vue's `useReadOnlyRecommendation` composable.
14279
+ *
14280
+ * `locked` is meant to be ANDed into the SAME `getEditable` gate the viewer
14281
+ * already reads (Protected View, collaboration read-only), not a second
14282
+ * editability mechanism. `reset()` is called from the load-commit hook
14283
+ * (`onContentApplied`) so a newly opened document is evaluated fresh even if
14284
+ * a previous one was unlocked.
14285
+ */
14286
+ declare class ReadOnlyRecommendationState {
14287
+ #private;
14288
+ constructor(deps: {
14289
+ getModifyVerifier(): PptxModifyVerifier | undefined;
14290
+ getCustomProperties(): PptxCustomProperty[];
14291
+ });
14292
+ /** The current recommendation (`kind: null` when the deck asks for nothing). */
14293
+ get recommendation(): ReadOnlyRecommendation;
14294
+ /** Whether the banner should render. */
14295
+ get showBanner(): boolean;
14296
+ /** Whether editing should currently be blocked because of this recommendation. */
14297
+ get locked(): boolean;
14298
+ /** "Edit anyway": lifts the lock and hides the banner for this document. */
14299
+ editAnyway(): void;
14300
+ /** "Dismiss": hides the banner but leaves the lock (if any) in place. */
14301
+ dismiss(): void;
14302
+ /** Re-arm the recommendation for a newly loaded document. */
14303
+ reset(): void;
14304
+ }
14305
+
14055
14306
  /**
14056
14307
  * ViewerOptionsState: the runes wrapper around the shared File > Options
14057
14308
  * store. Owns the reactive `options` snapshot (updated via the store's
@@ -14281,16 +14532,28 @@ declare class ViewerParityUiState {
14281
14532
  readingViewOpen: boolean;
14282
14533
  /** View tab > Outline View: the deck as one editable indented text document. */
14283
14534
  outlineViewOpen: boolean;
14535
+ /** View > H/V Guides. Also seeded from the deck's `slideViewPr/@showGuides`. */
14284
14536
  showGuides: boolean;
14537
+ /**
14538
+ * "Snap to shape" (View ▸ Snap Objects to Other Objects): the on-drag
14539
+ * alignment-guide snap. Also seeded from the deck's
14540
+ * `slideViewPr/@snapToObjects` (shared's `DeckViewPreferences.snapToObjects`
14541
+ * field; this binding's own historical name for the same toggle).
14542
+ */
14285
14543
  snapToShape: boolean;
14286
- guides: {
14287
- axis: "h" | "v";
14288
- position: number;
14289
- }[];
14290
- preferences: ViewerPreferences;
14544
+ guides: Guide[];
14545
+ /**
14546
+ * Also carries the deck-authored `snapToObjects`/`showGuides`/
14547
+ * `gridSpacingCx`/`gridSpacingCy` fields (`DeckViewPreferences`, a superset
14548
+ * of the base `ViewerPreferences` toggles), even though `showGuides` and
14549
+ * `snapToShape` above are the fields this binding actually reads: keeping
14550
+ * them here too is what lets `viewerPreferencesFromViewProperties` seed (and
14551
+ * `viewPropertiesPatchFromPreferences` later read back) a single object.
14552
+ */
14553
+ preferences: DeckViewPreferences;
14291
14554
  constructor(editor: EditorState);
14292
14555
  syncAutosave(enabled: boolean): void;
14293
- updatePreferences(next: ViewerPreferences, onAutosaveChange: (enabled: boolean) => void): void;
14556
+ updatePreferences(next: DeckViewPreferences, onAutosaveChange: (enabled: boolean) => void): void;
14294
14557
  }
14295
14558
 
14296
14559
  /**
@@ -14375,6 +14638,14 @@ interface ViewerStateBag {
14375
14638
  readonly editor: EditorState;
14376
14639
  readonly controller: EditorController;
14377
14640
  readonly parityUi: ViewerParityUiState;
14641
+ /**
14642
+ * The deck's own `p:modifyVerifier` / "Mark as Final" read-only
14643
+ * recommendation and lock (wave 4 #2), mirroring the Protected View banner
14644
+ * mechanism rather than inventing a second one.
14645
+ */
14646
+ readonly readOnlyRec: ReadOnlyRecommendationState;
14647
+ /** Fidelity-loss toast stack (wave 4 #3), fed by `loader.compatibilityWarnings`. */
14648
+ readonly compatToasts: CompatToastsState;
14378
14649
  readonly chromeUi: ChromeUiState;
14379
14650
  readonly findReplace: FindReplaceState;
14380
14651
  readonly collab: CollaborationController;
@@ -1,22 +1,22 @@
1
- import { A as e, M as a, _ as s, c as t, d as i, f as l, gt as S, ht as n, i as v, j as o, l as d, n as p, o as b, p as g, r as c, s as x, t as w, u as T } from "../export-CL58Fm_4.js";
2
- var m = a, A = o, P = e;
1
+ import { A as e, M as a, c as s, d as t, f as i, gt as l, ht as S, i as n, j as o, l as v, m as d, n as p, o as b, p as g, r as c, s as x, t as m, u as w } from "../export-C0RzyaUT.js";
2
+ var T = a, A = o, P = e;
3
3
  export {
4
- w as PowerPointViewer,
5
- v as PresentationLoader,
6
- m as Ribbon,
4
+ m as PowerPointViewer,
5
+ n as PresentationLoader,
6
+ T as Ribbon,
7
7
  P as SlideCanvas,
8
8
  c as ViewerState,
9
9
  A as ViewerToolbar,
10
- i as clampSlideIndex,
11
- s as createSvelteAiBridge,
10
+ t as clampSlideIndex,
11
+ d as createSvelteAiBridge,
12
12
  p as createViewerState,
13
13
  b as exportAllSlidesToSvg,
14
14
  x as exportAllSlidesToSvgBlobs,
15
- t as exportSlideAsSvg,
16
- d as exportSlideToSvg,
17
- T as exportSlideToSvgBlob,
18
- l as fitScale,
15
+ s as exportSlideAsSvg,
16
+ v as exportSlideToSvg,
17
+ w as exportSlideToSvgBlob,
18
+ i as fitScale,
19
19
  g as resolveNavigationKey,
20
- n as zoomInPercent,
21
- S as zoomOutPercent
20
+ S as zoomInPercent,
21
+ l as zoomOutPercent
22
22
  };
@@ -0,0 +1,18 @@
1
+ import { PresentationActionRunner } from 'pptx-viewer-shared';
2
+ import { PresentationControllerDeps } from './presentation-controller.svelte';
3
+ /** Set while a `ppaction://customshow?...&return=true` sub-show is running. */
4
+ export interface CustomShowReturnState {
5
+ previousId: string | null;
6
+ originIndex: number;
7
+ }
8
+ /**
9
+ * Builds the wave-4 B7 half of `PresentationActionRunner` (`lastViewed`,
10
+ * `customShow`, `openFile`, `openPresentation`, `playMedia`, `oleVerb`):
11
+ * split out of `PresentationController.handleStageClick` to keep that file
12
+ * under the repo's file-size budget. Pure glue over `deps` plus the small bit
13
+ * of cross-click state (`getLastViewedIndex`, `getCustomShowReturn` /
14
+ * `setCustomShowReturn`) the controller owns, since a `return=true` sub-show
15
+ * has to be restored by a LATER `advance()` call, not by this click itself.
16
+ */
17
+ export declare function buildWaveFourActionCallbacks(deps: PresentationControllerDeps, getLastViewedIndex: () => number | undefined, setCustomShowReturn: (next: CustomShowReturnState | null) => void): Pick<PresentationActionRunner, 'lastViewed' | 'customShow' | 'openFile' | 'openPresentation' | 'playMedia' | 'oleVerb'>;
18
+ //# sourceMappingURL=action-runner-callbacks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action-runner-callbacks.d.ts","sourceRoot":"","sources":["../../../src/viewer/presentation/action-runner-callbacks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAWnE,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,kCAAkC,CAAC;AAEnF,+EAA+E;AAC/E,MAAM,WAAW,qBAAqB;IACrC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;GAQG;AACH,wBAAgB,4BAA4B,CAC3C,IAAI,EAAE,0BAA0B,EAChC,kBAAkB,EAAE,MAAM,MAAM,GAAG,SAAS,EAC5C,mBAAmB,EAAE,CAAC,IAAI,EAAE,qBAAqB,GAAG,IAAI,KAAK,IAAI,GAC/D,IAAI,CACN,wBAAwB,EACxB,YAAY,GAAG,YAAY,GAAG,UAAU,GAAG,kBAAkB,GAAG,WAAW,GAAG,SAAS,CACvF,CAoDA"}
@@ -15,8 +15,9 @@ import { ElementAnimationState } from 'pptx-viewer-shared';
15
15
  *
16
16
  * The class owns the reactive per-element state map, the keyframes CSS, and the
17
17
  * interactive / hover trigger-shape id sets; the controller stays pure. The
18
- * clock (timers, requestAnimationFrame) + DOM effects live in
19
- * {@link module:presentation/animation-playback-helpers}.
18
+ * clock (timers, requestAnimationFrame) + DOM effects live in the shared
19
+ * {@link module:render/animation-playback-engine}, wired here with the local
20
+ * `./animation-sound` player.
20
21
  *
21
22
  * NOTE: the editor / inspector animation PREVIEW still uses the older shared
22
23
  * `buildClickGroups` model (see `AnimationsTab` / `editor-animation-controller`);
@@ -1 +1 @@
1
- {"version":3,"file":"animation-playback.svelte.d.ts","sourceRoot":"","sources":["../../../src/viewer/presentation/animation-playback.svelte.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAElD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAShE;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,WAAW,qBAAqB;IACrC,oEAAoE;IACpE,QAAQ,IAAI,SAAS,GAAG,SAAS,CAAC;IAClC,wDAAwD;IACxD,oBAAoB,CAAC,IAAI,OAAO,GAAG,SAAS,CAAC;IAC7C,4EAA4E;IAC5E,iBAAiB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD,uEAAuE;IACvE,SAAS,CAAC,EAAE,MAAM,WAAW,GAAG,IAAI,CAAC;CACrC;AAED,qBAAa,iBAAiB;;gBAkBjB,IAAI,EAAE,qBAAqB;IAavC,+EAA+E;IAC/E,IAAI,aAAa,IAAI,GAAG,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAEtD;IAED,+DAA+D;IAC/D,IAAI,YAAY,IAAI,MAAM,CAEzB;IAED,uEAAuE;IACvE,IAAI,0BAA0B,IAAI,WAAW,CAAC,MAAM,CAAC,CAEpD;IAED,2DAA2D;IAC3D,IAAI,oBAAoB,IAAI,WAAW,CAAC,MAAM,CAAC,CAE9C;IAED,mEAAmE;IACnE,IAAI,UAAU,IAAI,OAAO,CAExB;IAUD,iEAAiE;IACjE,WAAW,IAAI,IAAI;IAcnB,2EAA2E;IAC3E,IAAI,eAAe,IAAI,OAAO,CAE7B;IAED;;;;OAIG;IACH,KAAK,CAAC,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI;IAmD9C;;;;OAIG;IACH,OAAO,IAAI,OAAO;IAclB,0EAA0E;IAC1E,2BAA2B,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAYrD,mEAAmE;IACnE,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAkB1C,mEAAmE;IACnE,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;CAKrC"}
1
+ {"version":3,"file":"animation-playback.svelte.d.ts","sourceRoot":"","sources":["../../../src/viewer/presentation/animation-playback.svelte.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,KAAK,EAAkB,qBAAqB,EAAmB,MAAM,oBAAoB,CAAC;AAUjG;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,WAAW,qBAAqB;IACrC,oEAAoE;IACpE,QAAQ,IAAI,SAAS,GAAG,SAAS,CAAC;IAClC,wDAAwD;IACxD,oBAAoB,CAAC,IAAI,OAAO,GAAG,SAAS,CAAC;IAC7C,4EAA4E;IAC5E,iBAAiB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD,uEAAuE;IACvE,SAAS,CAAC,EAAE,MAAM,WAAW,GAAG,IAAI,CAAC;CACrC;AAED,qBAAa,iBAAiB;;gBAkBjB,IAAI,EAAE,qBAAqB;IAevC,+EAA+E;IAC/E,IAAI,aAAa,IAAI,GAAG,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAEtD;IAED,+DAA+D;IAC/D,IAAI,YAAY,IAAI,MAAM,CAEzB;IAED,uEAAuE;IACvE,IAAI,0BAA0B,IAAI,WAAW,CAAC,MAAM,CAAC,CAEpD;IAED,2DAA2D;IAC3D,IAAI,oBAAoB,IAAI,WAAW,CAAC,MAAM,CAAC,CAE9C;IAED,mEAAmE;IACnE,IAAI,UAAU,IAAI,OAAO,CAExB;IAUD,iEAAiE;IACjE,WAAW,IAAI,IAAI;IAcnB,2EAA2E;IAC3E,IAAI,eAAe,IAAI,OAAO,CAE7B;IAED;;;;OAIG;IACH,KAAK,CAAC,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI;IAmD9C;;;;OAIG;IACH,OAAO,IAAI,OAAO;IAclB,0EAA0E;IAC1E,2BAA2B,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAYrD,mEAAmE;IACnE,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAkB1C,mEAAmE;IACnE,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;CAKrC"}