@eternalheart/angular-file-preview 1.6.5

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 (119) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +879 -0
  3. package/README.zh-CN.md +876 -0
  4. package/lib/LICENSE +22 -0
  5. package/lib/README.md +879 -0
  6. package/lib/components/preview/file-preview-toolbar.d.ts +19 -0
  7. package/lib/components/preview/nav-arrows.d.ts +25 -0
  8. package/lib/components/preview/renderer-outlet.d.ts +23 -0
  9. package/lib/components/preview/toolbar-button.d.ts +12 -0
  10. package/lib/components/resizable-split.d.ts +32 -0
  11. package/lib/di/locale.service.d.ts +12 -0
  12. package/lib/di/request.service.d.ts +20 -0
  13. package/lib/di/theme-mode.d.ts +6 -0
  14. package/lib/di/theme.service.d.ts +9 -0
  15. package/lib/fesm2022/eternalheart-angular-file-preview-avifLoader-BP3fgcMm-CZsJ9svm.mjs +55 -0
  16. package/lib/fesm2022/eternalheart-angular-file-preview-avifLoader-BP3fgcMm-CZsJ9svm.mjs.map +1 -0
  17. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-RendererError-DtNihCIX-DtNihCIX.mjs +58 -0
  18. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-RendererError-DtNihCIX-DtNihCIX.mjs.map +1 -0
  19. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-UobTf36G.mjs +5835 -0
  20. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-UobTf36G.mjs.map +1 -0
  21. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-base.types-D5x7QPey-D5x7QPey.mjs +17 -0
  22. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-base.types-D5x7QPey-D5x7QPey.mjs.map +1 -0
  23. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index--7d8Hgi0-D-sg24Qs.mjs +284 -0
  24. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index--7d8Hgi0-D-sg24Qs.mjs.map +1 -0
  25. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-6dZS_Cfs-B1itLV5R.mjs +703 -0
  26. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-6dZS_Cfs-B1itLV5R.mjs.map +1 -0
  27. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-B1ANUCTy-BRs7TMLn.mjs +231 -0
  28. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-B1ANUCTy-BRs7TMLn.mjs.map +1 -0
  29. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-BEaqpRV8-BidVIVlO.mjs +552 -0
  30. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-BEaqpRV8-BidVIVlO.mjs.map +1 -0
  31. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-BGqTRZbm-CAOLRw20.mjs +688 -0
  32. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-BGqTRZbm-CAOLRw20.mjs.map +1 -0
  33. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-Bv3JRXKn-B4Wewc-4.mjs +273 -0
  34. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-Bv3JRXKn-B4Wewc-4.mjs.map +1 -0
  35. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-C0McUoqT-DJ35bhIz.mjs +288 -0
  36. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-C0McUoqT-DJ35bhIz.mjs.map +1 -0
  37. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-C518mdUd-B5SCzrzU.mjs +550 -0
  38. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-C518mdUd-B5SCzrzU.mjs.map +1 -0
  39. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-CDjKPqyW-CmX5sdkL.mjs +102 -0
  40. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-CDjKPqyW-CmX5sdkL.mjs.map +1 -0
  41. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-CHi9tOe0-NOeQYAnM.mjs +516 -0
  42. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-CHi9tOe0-NOeQYAnM.mjs.map +1 -0
  43. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-CQwhffym-DAGw4Xy_.mjs +823 -0
  44. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-CQwhffym-DAGw4Xy_.mjs.map +1 -0
  45. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-CSCTj7ft-BfqruUyY.mjs +164 -0
  46. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-CSCTj7ft-BfqruUyY.mjs.map +1 -0
  47. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-Cb1RLXeO-Bj9gjS1Z.mjs +655 -0
  48. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-Cb1RLXeO-Bj9gjS1Z.mjs.map +1 -0
  49. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-Cw90Kdyg-BzrW_cyx.mjs +207 -0
  50. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-Cw90Kdyg-BzrW_cyx.mjs.map +1 -0
  51. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-D35x1nwM-CugEEXjg.mjs +199 -0
  52. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-D35x1nwM-CugEEXjg.mjs.map +1 -0
  53. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-D9jJNzeM-mWX59Aj2.mjs +194 -0
  54. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-D9jJNzeM-mWX59Aj2.mjs.map +1 -0
  55. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-DbmuvdvN-C29uLyt2.mjs +94 -0
  56. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-DbmuvdvN-C29uLyt2.mjs.map +1 -0
  57. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-DsNNZ59Q-C8MaSME6.mjs +468 -0
  58. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-DsNNZ59Q-C8MaSME6.mjs.map +1 -0
  59. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-DufW2Fuc-CTosCut6.mjs +193 -0
  60. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-DufW2Fuc-CTosCut6.mjs.map +1 -0
  61. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-TSTa_Q7E-DBhkL6pV.mjs +184 -0
  62. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-TSTa_Q7E-DBhkL6pV.mjs.map +1 -0
  63. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-pG0Ko5mI-DthQJg-X.mjs +492 -0
  64. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-pG0Ko5mI-DthQJg-X.mjs.map +1 -0
  65. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-shiki-highlight-CL9cG481-BKfwdOpN.mjs +68 -0
  66. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-shiki-highlight-CL9cG481-BKfwdOpN.mjs.map +1 -0
  67. package/lib/fesm2022/eternalheart-angular-file-preview-heicLoader-CH_raQNn-BSXHd_oi.mjs +36 -0
  68. package/lib/fesm2022/eternalheart-angular-file-preview-heicLoader-CH_raQNn-BSXHd_oi.mjs.map +1 -0
  69. package/lib/fesm2022/eternalheart-angular-file-preview-jp2Loader-ldvCSsvm-DJEhfimG.mjs +121 -0
  70. package/lib/fesm2022/eternalheart-angular-file-preview-jp2Loader-ldvCSsvm-DJEhfimG.mjs.map +1 -0
  71. package/lib/fesm2022/eternalheart-angular-file-preview-psdLoader-D5CkupyY-D5Gegcdg.mjs +78 -0
  72. package/lib/fesm2022/eternalheart-angular-file-preview-psdLoader-D5CkupyY-D5Gegcdg.mjs.map +1 -0
  73. package/lib/fesm2022/eternalheart-angular-file-preview-rawLoader-0mLvxCNp-CCXn9Rdp.mjs +81 -0
  74. package/lib/fesm2022/eternalheart-angular-file-preview-rawLoader-0mLvxCNp-CCXn9Rdp.mjs.map +1 -0
  75. package/lib/fesm2022/eternalheart-angular-file-preview-tiffLoader-CmUAD1vO-0JqIws9t.mjs +59 -0
  76. package/lib/fesm2022/eternalheart-angular-file-preview-tiffLoader-CmUAD1vO-0JqIws9t.mjs.map +1 -0
  77. package/lib/fesm2022/eternalheart-angular-file-preview.mjs +2 -0
  78. package/lib/fesm2022/eternalheart-angular-file-preview.mjs.map +1 -0
  79. package/lib/file-preview-content.d.ts +65 -0
  80. package/lib/file-preview-embed.d.ts +30 -0
  81. package/lib/file-preview-modal.d.ts +34 -0
  82. package/lib/fp-core.d.ts +1 -0
  83. package/lib/index.css +2119 -0
  84. package/lib/index.d.ts +11 -0
  85. package/lib/renderers/Audio/index.d.ts +74 -0
  86. package/lib/renderers/Cad/index.d.ts +45 -0
  87. package/lib/renderers/Cad/toolbar.d.ts +15 -0
  88. package/lib/renderers/Csv/index.d.ts +26 -0
  89. package/lib/renderers/Doc/index.d.ts +19 -0
  90. package/lib/renderers/Docx/index.d.ts +42 -0
  91. package/lib/renderers/Epub/index.d.ts +57 -0
  92. package/lib/renderers/Font/font-preview-line.d.ts +26 -0
  93. package/lib/renderers/Font/index.d.ts +52 -0
  94. package/lib/renderers/Image/index.d.ts +79 -0
  95. package/lib/renderers/Json/index.d.ts +61 -0
  96. package/lib/renderers/Markdown/index.d.ts +35 -0
  97. package/lib/renderers/Mobi/index.d.ts +51 -0
  98. package/lib/renderers/Msg/index.d.ts +47 -0
  99. package/lib/renderers/Pdf/index.d.ts +55 -0
  100. package/lib/renderers/Ppt/index.d.ts +19 -0
  101. package/lib/renderers/Pptx/index.d.ts +29 -0
  102. package/lib/renderers/RendererError.d.ts +9 -0
  103. package/lib/renderers/RendererLoading.d.ts +7 -0
  104. package/lib/renderers/Subtitle/index.d.ts +25 -0
  105. package/lib/renderers/Text/index.d.ts +29 -0
  106. package/lib/renderers/Unsupported/index.d.ts +15 -0
  107. package/lib/renderers/Video/index.d.ts +28 -0
  108. package/lib/renderers/Xlsx/index.d.ts +25 -0
  109. package/lib/renderers/Xml/index.d.ts +26 -0
  110. package/lib/renderers/Zip/index.d.ts +58 -0
  111. package/lib/renderers/Zip/tree-item.d.ts +29 -0
  112. package/lib/renderers/base.types.d.ts +10 -0
  113. package/lib/renderers/lazy.d.ts +23 -0
  114. package/lib/renderers/registry.d.ts +13 -0
  115. package/lib/renderers/toolbar.types.d.ts +19 -0
  116. package/lib/types.d.ts +26 -0
  117. package/lib/utils/audio-player.d.ts +20 -0
  118. package/lib/utils/shiki-highlight.d.ts +7 -0
  119. package/package.json +119 -0
@@ -0,0 +1,194 @@
1
+ import * as i0 from '@angular/core';
2
+ import { input, inject, DestroyRef, signal, viewChild, effect, untracked, ChangeDetectionStrategy, Component } from '@angular/core';
3
+ import videojs from 'video.js';
4
+ import 'video.js/dist/video-js.css';
5
+ import { L as LocaleService, g as getFallbackTranslator, n as n0 } from './eternalheart-angular-file-preview-eternalheart-angular-file-preview-UobTf36G.mjs';
6
+ import { R as RendererError } from './eternalheart-angular-file-preview-eternalheart-angular-file-preview-RendererError-DtNihCIX-DtNihCIX.mjs';
7
+ import { T as ToolbarEventEmitter } from './eternalheart-angular-file-preview-eternalheart-angular-file-preview-base.types-D5x7QPey-D5x7QPey.mjs';
8
+
9
+ const BROWSER_UNSUPPORTED_EXTS = new Set(['avi', 'wmv', 'flv']);
10
+ class VideoRenderer {
11
+ constructor() {
12
+ this.url = input.required();
13
+ this.fileName = input(undefined);
14
+ this.emitter = new ToolbarEventEmitter();
15
+ this.locale = inject(LocaleService, { optional: true });
16
+ this.destroyRef = inject(DestroyRef);
17
+ this.t = this.locale?.t() ?? getFallbackTranslator();
18
+ this.error = signal(null);
19
+ this.isLoading = signal(true);
20
+ this.videoContainerRef = viewChild('videoContainerRef');
21
+ this.player = null;
22
+ this.getToolbarGroups = () => [];
23
+ this.onToolbarChange = (listener) => this.emitter.subscribe(listener);
24
+ effect(() => {
25
+ const el = this.videoContainerRef()?.nativeElement;
26
+ if (el && !this.player) {
27
+ untracked(() => this.initPlayer(el));
28
+ }
29
+ });
30
+ effect(() => {
31
+ const url = this.url();
32
+ untracked(() => {
33
+ if (this.player && !this.player.isDisposed()) {
34
+ this.player.src({ src: url, type: n0(url) });
35
+ }
36
+ });
37
+ });
38
+ this.destroyRef.onDestroy(() => {
39
+ if (this.player && !this.player.isDisposed()) {
40
+ this.player.dispose();
41
+ this.player = null;
42
+ }
43
+ });
44
+ }
45
+ getVideoExt(url, fileName) {
46
+ const source = fileName || url;
47
+ return source.split('.').pop()?.toLowerCase().split('?')[0] || '';
48
+ }
49
+ initPlayer(container) {
50
+ if (this.player)
51
+ return;
52
+ const videoExt = this.getVideoExt(this.url(), this.fileName());
53
+ if (BROWSER_UNSUPPORTED_EXTS.has(videoExt)) {
54
+ this.error.set({
55
+ title: this.t('video.unsupported_title'),
56
+ detail: this.t('video.unsupported_detail', { format: videoExt.toUpperCase() }),
57
+ });
58
+ this.isLoading.set(false);
59
+ return;
60
+ }
61
+ const videoElement = document.createElement('video-js');
62
+ videoElement.classList.add('vjs-big-play-centered', 'vjs-theme-apple');
63
+ container.appendChild(videoElement);
64
+ const videoType = n0(this.url());
65
+ let sources;
66
+ if (videoType === 'video/quicktime') {
67
+ sources = [
68
+ { src: this.url(), type: 'video/quicktime' },
69
+ { src: this.url(), type: 'video/mp4' },
70
+ ];
71
+ }
72
+ else {
73
+ sources = [{ src: this.url(), type: videoType }];
74
+ }
75
+ const player = videojs(videoElement, {
76
+ controls: true,
77
+ fill: true,
78
+ preload: 'auto',
79
+ controlBar: {
80
+ children: [
81
+ 'playToggle',
82
+ 'volumePanel',
83
+ 'currentTimeDisplay',
84
+ 'timeDivider',
85
+ 'durationDisplay',
86
+ 'progressControl',
87
+ 'remainingTimeDisplay',
88
+ 'fullscreenToggle',
89
+ ],
90
+ volumePanel: {
91
+ inline: false,
92
+ },
93
+ },
94
+ html5: {
95
+ vhs: {
96
+ overrideNative: true,
97
+ },
98
+ nativeVideoTracks: false,
99
+ nativeAudioTracks: false,
100
+ nativeTextTracks: false,
101
+ },
102
+ sources,
103
+ });
104
+ const videoEl = player.el().querySelector('video');
105
+ if (videoEl) {
106
+ videoEl.style.objectFit = 'contain';
107
+ }
108
+ player.on('loadeddata', () => {
109
+ this.isLoading.set(false);
110
+ });
111
+ player.on('error', () => {
112
+ const err = player.error();
113
+ console.warn('[VideoRenderer] Video playback error:', err?.message || 'Unknown error');
114
+ if (err?.code === 4) {
115
+ this.error.set({
116
+ title: this.t('video.unsupported_title'),
117
+ detail: this.t('video.unsupported_detail', {
118
+ format: videoExt ? videoExt.toUpperCase() : this.t('common.unknown_error'),
119
+ }),
120
+ });
121
+ }
122
+ else {
123
+ this.error.set({
124
+ title: this.t('video.load_failed'),
125
+ detail: err?.message || this.t('common.unknown_error'),
126
+ });
127
+ }
128
+ this.isLoading.set(false);
129
+ });
130
+ this.player = player;
131
+ }
132
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: VideoRenderer, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
133
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.25", type: VideoRenderer, isStandalone: true, selector: "afp-video-renderer", inputs: { url: { classPropertyName: "url", publicName: "url", isSignal: true, isRequired: true, transformFunction: null }, fileName: { classPropertyName: "fileName", publicName: "fileName", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "afp-block afp-w-full afp-h-full" }, viewQueries: [{ propertyName: "videoContainerRef", first: true, predicate: ["videoContainerRef"], descendants: true, isSignal: true }], ngImport: i0, template: `
134
+ @if (error(); as err) {
135
+ <afp-renderer-error [message]="err.title" [detail]="err.detail" />
136
+ } @else {
137
+ <div class="afp-flex afp-items-center afp-justify-center afp-w-full afp-h-full">
138
+ <div class="afp-w-full afp-h-full afp-relative">
139
+ @if (isLoading()) {
140
+ <div class="afp-absolute afp-inset-0 afp-flex afp-items-center afp-justify-center afp-bg-surface-3 afp-backdrop-blur-sm afp-z-10">
141
+ <div class="afp-text-center">
142
+ <div class="afp-w-12 afp-h-12 afp-mx-auto afp-mb-3 afp-border-4 afp-border-line-strong afp-border-t-spinner-head afp-rounded-full afp-animate-spin"></div>
143
+ <p class="afp-text-sm afp-text-fg-secondary afp-font-medium">{{ t('video.loading') }}</p>
144
+ </div>
145
+ </div>
146
+ }
147
+
148
+ <div
149
+ #videoContainerRef
150
+ class="afp-overflow-hidden afp-w-full afp-h-full"
151
+ style="box-shadow: 0 20px 60px rgba(0, 0, 0, 0.4), 0 0 0 1px rgba(255, 255, 255, 0.05)"
152
+ ></div>
153
+ </div>
154
+ </div>
155
+ }
156
+ `, isInline: true, dependencies: [{ kind: "component", type: RendererError, selector: "afp-renderer-error", inputs: ["message", "detail", "showIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
157
+ }
158
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: VideoRenderer, decorators: [{
159
+ type: Component,
160
+ args: [{
161
+ selector: 'afp-video-renderer',
162
+ standalone: true,
163
+ imports: [RendererError],
164
+ changeDetection: ChangeDetectionStrategy.OnPush,
165
+ host: { class: 'afp-block afp-w-full afp-h-full' },
166
+ template: `
167
+ @if (error(); as err) {
168
+ <afp-renderer-error [message]="err.title" [detail]="err.detail" />
169
+ } @else {
170
+ <div class="afp-flex afp-items-center afp-justify-center afp-w-full afp-h-full">
171
+ <div class="afp-w-full afp-h-full afp-relative">
172
+ @if (isLoading()) {
173
+ <div class="afp-absolute afp-inset-0 afp-flex afp-items-center afp-justify-center afp-bg-surface-3 afp-backdrop-blur-sm afp-z-10">
174
+ <div class="afp-text-center">
175
+ <div class="afp-w-12 afp-h-12 afp-mx-auto afp-mb-3 afp-border-4 afp-border-line-strong afp-border-t-spinner-head afp-rounded-full afp-animate-spin"></div>
176
+ <p class="afp-text-sm afp-text-fg-secondary afp-font-medium">{{ t('video.loading') }}</p>
177
+ </div>
178
+ </div>
179
+ }
180
+
181
+ <div
182
+ #videoContainerRef
183
+ class="afp-overflow-hidden afp-w-full afp-h-full"
184
+ style="box-shadow: 0 20px 60px rgba(0, 0, 0, 0.4), 0 0 0 1px rgba(255, 255, 255, 0.05)"
185
+ ></div>
186
+ </div>
187
+ </div>
188
+ }
189
+ `,
190
+ }]
191
+ }], ctorParameters: () => [] });
192
+
193
+ export { VideoRenderer };
194
+ //# sourceMappingURL=eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-D9jJNzeM-mWX59Aj2.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-D9jJNzeM-mWX59Aj2.mjs","sources":["../fesm2022/eternalheart-angular-file-preview-index-D9jJNzeM.mjs"],"sourcesContent":["import * as i0 from '@angular/core';\nimport { input, inject, DestroyRef, signal, viewChild, effect, untracked, ChangeDetectionStrategy, Component } from '@angular/core';\nimport videojs from 'video.js';\nimport 'video.js/dist/video-js.css';\nimport { L as LocaleService, g as getFallbackTranslator } from './eternalheart-angular-file-preview-eternalheart-angular-file-preview-DXwNhxAB.mjs';\nimport { R as RendererError } from './eternalheart-angular-file-preview-RendererError-DtNihCIX.mjs';\nimport { T as ToolbarEventEmitter } from './eternalheart-angular-file-preview-base.types-D5x7QPey.mjs';\nimport { getVideoMimeType } from '@eternalheart/file-preview-core';\n\nconst BROWSER_UNSUPPORTED_EXTS = new Set(['avi', 'wmv', 'flv']);\nclass VideoRenderer {\n constructor() {\n this.url = input.required();\n this.fileName = input(undefined);\n this.emitter = new ToolbarEventEmitter();\n this.locale = inject(LocaleService, { optional: true });\n this.destroyRef = inject(DestroyRef);\n this.t = this.locale?.t() ?? getFallbackTranslator();\n this.error = signal(null);\n this.isLoading = signal(true);\n this.videoContainerRef = viewChild('videoContainerRef');\n this.player = null;\n this.getToolbarGroups = () => [];\n this.onToolbarChange = (listener) => this.emitter.subscribe(listener);\n effect(() => {\n const el = this.videoContainerRef()?.nativeElement;\n if (el && !this.player) {\n untracked(() => this.initPlayer(el));\n }\n });\n effect(() => {\n const url = this.url();\n untracked(() => {\n if (this.player && !this.player.isDisposed()) {\n this.player.src({ src: url, type: getVideoMimeType(url) });\n }\n });\n });\n this.destroyRef.onDestroy(() => {\n if (this.player && !this.player.isDisposed()) {\n this.player.dispose();\n this.player = null;\n }\n });\n }\n getVideoExt(url, fileName) {\n const source = fileName || url;\n return source.split('.').pop()?.toLowerCase().split('?')[0] || '';\n }\n initPlayer(container) {\n if (this.player)\n return;\n const videoExt = this.getVideoExt(this.url(), this.fileName());\n if (BROWSER_UNSUPPORTED_EXTS.has(videoExt)) {\n this.error.set({\n title: this.t('video.unsupported_title'),\n detail: this.t('video.unsupported_detail', { format: videoExt.toUpperCase() }),\n });\n this.isLoading.set(false);\n return;\n }\n const videoElement = document.createElement('video-js');\n videoElement.classList.add('vjs-big-play-centered', 'vjs-theme-apple');\n container.appendChild(videoElement);\n const videoType = getVideoMimeType(this.url());\n let sources;\n if (videoType === 'video/quicktime') {\n sources = [\n { src: this.url(), type: 'video/quicktime' },\n { src: this.url(), type: 'video/mp4' },\n ];\n }\n else {\n sources = [{ src: this.url(), type: videoType }];\n }\n const player = videojs(videoElement, {\n controls: true,\n fill: true,\n preload: 'auto',\n controlBar: {\n children: [\n 'playToggle',\n 'volumePanel',\n 'currentTimeDisplay',\n 'timeDivider',\n 'durationDisplay',\n 'progressControl',\n 'remainingTimeDisplay',\n 'fullscreenToggle',\n ],\n volumePanel: {\n inline: false,\n },\n },\n html5: {\n vhs: {\n overrideNative: true,\n },\n nativeVideoTracks: false,\n nativeAudioTracks: false,\n nativeTextTracks: false,\n },\n sources,\n });\n const videoEl = player.el().querySelector('video');\n if (videoEl) {\n videoEl.style.objectFit = 'contain';\n }\n player.on('loadeddata', () => {\n this.isLoading.set(false);\n });\n player.on('error', () => {\n const err = player.error();\n console.warn('[VideoRenderer] Video playback error:', err?.message || 'Unknown error');\n if (err?.code === 4) {\n this.error.set({\n title: this.t('video.unsupported_title'),\n detail: this.t('video.unsupported_detail', {\n format: videoExt ? videoExt.toUpperCase() : this.t('common.unknown_error'),\n }),\n });\n }\n else {\n this.error.set({\n title: this.t('video.load_failed'),\n detail: err?.message || this.t('common.unknown_error'),\n });\n }\n this.isLoading.set(false);\n });\n this.player = player;\n }\n static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"19.2.25\", ngImport: i0, type: VideoRenderer, deps: [], target: i0.ɵɵFactoryTarget.Component }); }\n static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"17.0.0\", version: \"19.2.25\", type: VideoRenderer, isStandalone: true, selector: \"afp-video-renderer\", inputs: { url: { classPropertyName: \"url\", publicName: \"url\", isSignal: true, isRequired: true, transformFunction: null }, fileName: { classPropertyName: \"fileName\", publicName: \"fileName\", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: \"afp-block afp-w-full afp-h-full\" }, viewQueries: [{ propertyName: \"videoContainerRef\", first: true, predicate: [\"videoContainerRef\"], descendants: true, isSignal: true }], ngImport: i0, template: `\n @if (error(); as err) {\n <afp-renderer-error [message]=\"err.title\" [detail]=\"err.detail\" />\n } @else {\n <div class=\"afp-flex afp-items-center afp-justify-center afp-w-full afp-h-full\">\n <div class=\"afp-w-full afp-h-full afp-relative\">\n @if (isLoading()) {\n <div class=\"afp-absolute afp-inset-0 afp-flex afp-items-center afp-justify-center afp-bg-surface-3 afp-backdrop-blur-sm afp-z-10\">\n <div class=\"afp-text-center\">\n <div class=\"afp-w-12 afp-h-12 afp-mx-auto afp-mb-3 afp-border-4 afp-border-line-strong afp-border-t-spinner-head afp-rounded-full afp-animate-spin\"></div>\n <p class=\"afp-text-sm afp-text-fg-secondary afp-font-medium\">{{ t('video.loading') }}</p>\n </div>\n </div>\n }\n\n <div\n #videoContainerRef\n class=\"afp-overflow-hidden afp-w-full afp-h-full\"\n style=\"box-shadow: 0 20px 60px rgba(0, 0, 0, 0.4), 0 0 0 1px rgba(255, 255, 255, 0.05)\"\n ></div>\n </div>\n </div>\n }\n `, isInline: true, dependencies: [{ kind: \"component\", type: RendererError, selector: \"afp-renderer-error\", inputs: [\"message\", \"detail\", \"showIcon\"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"19.2.25\", ngImport: i0, type: VideoRenderer, decorators: [{\n type: Component,\n args: [{\n selector: 'afp-video-renderer',\n standalone: true,\n imports: [RendererError],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'afp-block afp-w-full afp-h-full' },\n template: `\n @if (error(); as err) {\n <afp-renderer-error [message]=\"err.title\" [detail]=\"err.detail\" />\n } @else {\n <div class=\"afp-flex afp-items-center afp-justify-center afp-w-full afp-h-full\">\n <div class=\"afp-w-full afp-h-full afp-relative\">\n @if (isLoading()) {\n <div class=\"afp-absolute afp-inset-0 afp-flex afp-items-center afp-justify-center afp-bg-surface-3 afp-backdrop-blur-sm afp-z-10\">\n <div class=\"afp-text-center\">\n <div class=\"afp-w-12 afp-h-12 afp-mx-auto afp-mb-3 afp-border-4 afp-border-line-strong afp-border-t-spinner-head afp-rounded-full afp-animate-spin\"></div>\n <p class=\"afp-text-sm afp-text-fg-secondary afp-font-medium\">{{ t('video.loading') }}</p>\n </div>\n </div>\n }\n\n <div\n #videoContainerRef\n class=\"afp-overflow-hidden afp-w-full afp-h-full\"\n style=\"box-shadow: 0 20px 60px rgba(0, 0, 0, 0.4), 0 0 0 1px rgba(255, 255, 255, 0.05)\"\n ></div>\n </div>\n </div>\n }\n `,\n }]\n }], ctorParameters: () => [] });\n\nexport { VideoRenderer };\n//# sourceMappingURL=eternalheart-angular-file-preview-index-D9jJNzeM.mjs.map\n"],"names":["getVideoMimeType"],"mappings":"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"}
@@ -0,0 +1,94 @@
1
+ import * as i0 from '@angular/core';
2
+ import { input, inject, signal, effect, untracked, ChangeDetectionStrategy, Component } from '@angular/core';
3
+ import { DomSanitizer } from '@angular/platform-browser';
4
+ import { L as LocaleService, R as RequestService, g as getFallbackTranslator, S as Sg } from './eternalheart-angular-file-preview-eternalheart-angular-file-preview-UobTf36G.mjs';
5
+ import { R as RendererError } from './eternalheart-angular-file-preview-eternalheart-angular-file-preview-RendererError-DtNihCIX-DtNihCIX.mjs';
6
+
7
+ class PptRenderer {
8
+ constructor() {
9
+ this.url = input.required();
10
+ this.locale = inject(LocaleService, { optional: true });
11
+ this.request = inject(RequestService, { optional: true });
12
+ this.sanitizer = inject(DomSanitizer);
13
+ this.t = this.locale?.t() ?? getFallbackTranslator();
14
+ this.html = signal('');
15
+ this.loading = signal(true);
16
+ this.error = signal(null);
17
+ this.getToolbarGroups = () => [];
18
+ effect(() => {
19
+ const newUrl = this.url();
20
+ if (newUrl) {
21
+ untracked(() => {
22
+ void this.loadPpt();
23
+ });
24
+ }
25
+ });
26
+ }
27
+ trust(html) {
28
+ return this.sanitizer.bypassSecurityTrustHtml(html);
29
+ }
30
+ async loadPpt() {
31
+ this.loading.set(true);
32
+ this.error.set(null);
33
+ this.html.set('');
34
+ try {
35
+ const fetcher = this.request?.fetcher() ?? ((u, init) => fetch(u, init));
36
+ const response = await fetcher(this.url());
37
+ if (!response.ok)
38
+ throw new Error('load failed');
39
+ const buffer = await response.arrayBuffer();
40
+ this.html.set(await Sg(buffer));
41
+ }
42
+ catch (err) {
43
+ console.error('Ppt 解析错误:', err);
44
+ this.error.set(this.t('ppt.parse_failed'));
45
+ }
46
+ finally {
47
+ this.loading.set(false);
48
+ }
49
+ }
50
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: PptRenderer, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
51
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.25", type: PptRenderer, isStandalone: true, selector: "afp-ppt-renderer", inputs: { url: { classPropertyName: "url", publicName: "url", isSignal: true, isRequired: true, transformFunction: null } }, host: { classAttribute: "afp-block afp-w-full afp-h-full" }, ngImport: i0, template: `
52
+ @if (loading()) {
53
+ <div class="afp-flex afp-items-center afp-justify-center afp-w-full afp-h-full">
54
+ <div
55
+ class="afp-w-12 afp-h-12 afp-border-4 afp-border-line-strong afp-border-t-spinner-head afp-rounded-full afp-animate-spin"
56
+ ></div>
57
+ </div>
58
+ } @else if (error()) {
59
+ <afp-renderer-error [message]="error()!" />
60
+ } @else {
61
+ <div class="afp-w-full afp-h-full afp-overflow-auto afp-py-6 afp-px-4">
62
+ <div class="afp-legacy-ppt-wrap" [innerHTML]="trust(html())"></div>
63
+ </div>
64
+ }
65
+ `, isInline: true, dependencies: [{ kind: "component", type: RendererError, selector: "afp-renderer-error", inputs: ["message", "detail", "showIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
66
+ }
67
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: PptRenderer, decorators: [{
68
+ type: Component,
69
+ args: [{
70
+ selector: 'afp-ppt-renderer',
71
+ standalone: true,
72
+ imports: [RendererError],
73
+ changeDetection: ChangeDetectionStrategy.OnPush,
74
+ host: { class: 'afp-block afp-w-full afp-h-full' },
75
+ template: `
76
+ @if (loading()) {
77
+ <div class="afp-flex afp-items-center afp-justify-center afp-w-full afp-h-full">
78
+ <div
79
+ class="afp-w-12 afp-h-12 afp-border-4 afp-border-line-strong afp-border-t-spinner-head afp-rounded-full afp-animate-spin"
80
+ ></div>
81
+ </div>
82
+ } @else if (error()) {
83
+ <afp-renderer-error [message]="error()!" />
84
+ } @else {
85
+ <div class="afp-w-full afp-h-full afp-overflow-auto afp-py-6 afp-px-4">
86
+ <div class="afp-legacy-ppt-wrap" [innerHTML]="trust(html())"></div>
87
+ </div>
88
+ }
89
+ `,
90
+ }]
91
+ }], ctorParameters: () => [] });
92
+
93
+ export { PptRenderer };
94
+ //# sourceMappingURL=eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-DbmuvdvN-C29uLyt2.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-DbmuvdvN-C29uLyt2.mjs","sources":["../fesm2022/eternalheart-angular-file-preview-index-DbmuvdvN.mjs"],"sourcesContent":["import * as i0 from '@angular/core';\nimport { input, inject, signal, effect, untracked, ChangeDetectionStrategy, Component } from '@angular/core';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { L as LocaleService, R as RequestService, g as getFallbackTranslator } from './eternalheart-angular-file-preview-eternalheart-angular-file-preview-DXwNhxAB.mjs';\nimport { R as RendererError } from './eternalheart-angular-file-preview-RendererError-DtNihCIX.mjs';\nimport { renderLegacyPptHtml } from '@eternalheart/file-preview-core';\n\nclass PptRenderer {\n constructor() {\n this.url = input.required();\n this.locale = inject(LocaleService, { optional: true });\n this.request = inject(RequestService, { optional: true });\n this.sanitizer = inject(DomSanitizer);\n this.t = this.locale?.t() ?? getFallbackTranslator();\n this.html = signal('');\n this.loading = signal(true);\n this.error = signal(null);\n this.getToolbarGroups = () => [];\n effect(() => {\n const newUrl = this.url();\n if (newUrl) {\n untracked(() => {\n void this.loadPpt();\n });\n }\n });\n }\n trust(html) {\n return this.sanitizer.bypassSecurityTrustHtml(html);\n }\n async loadPpt() {\n this.loading.set(true);\n this.error.set(null);\n this.html.set('');\n try {\n const fetcher = this.request?.fetcher() ?? ((u, init) => fetch(u, init));\n const response = await fetcher(this.url());\n if (!response.ok)\n throw new Error('load failed');\n const buffer = await response.arrayBuffer();\n this.html.set(await renderLegacyPptHtml(buffer));\n }\n catch (err) {\n console.error('Ppt 解析错误:', err);\n this.error.set(this.t('ppt.parse_failed'));\n }\n finally {\n this.loading.set(false);\n }\n }\n static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"19.2.25\", ngImport: i0, type: PptRenderer, deps: [], target: i0.ɵɵFactoryTarget.Component }); }\n static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"17.0.0\", version: \"19.2.25\", type: PptRenderer, isStandalone: true, selector: \"afp-ppt-renderer\", inputs: { url: { classPropertyName: \"url\", publicName: \"url\", isSignal: true, isRequired: true, transformFunction: null } }, host: { classAttribute: \"afp-block afp-w-full afp-h-full\" }, ngImport: i0, template: `\n @if (loading()) {\n <div class=\"afp-flex afp-items-center afp-justify-center afp-w-full afp-h-full\">\n <div\n class=\"afp-w-12 afp-h-12 afp-border-4 afp-border-line-strong afp-border-t-spinner-head afp-rounded-full afp-animate-spin\"\n ></div>\n </div>\n } @else if (error()) {\n <afp-renderer-error [message]=\"error()!\" />\n } @else {\n <div class=\"afp-w-full afp-h-full afp-overflow-auto afp-py-6 afp-px-4\">\n <div class=\"afp-legacy-ppt-wrap\" [innerHTML]=\"trust(html())\"></div>\n </div>\n }\n `, isInline: true, dependencies: [{ kind: \"component\", type: RendererError, selector: \"afp-renderer-error\", inputs: [\"message\", \"detail\", \"showIcon\"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"19.2.25\", ngImport: i0, type: PptRenderer, decorators: [{\n type: Component,\n args: [{\n selector: 'afp-ppt-renderer',\n standalone: true,\n imports: [RendererError],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'afp-block afp-w-full afp-h-full' },\n template: `\n @if (loading()) {\n <div class=\"afp-flex afp-items-center afp-justify-center afp-w-full afp-h-full\">\n <div\n class=\"afp-w-12 afp-h-12 afp-border-4 afp-border-line-strong afp-border-t-spinner-head afp-rounded-full afp-animate-spin\"\n ></div>\n </div>\n } @else if (error()) {\n <afp-renderer-error [message]=\"error()!\" />\n } @else {\n <div class=\"afp-w-full afp-h-full afp-overflow-auto afp-py-6 afp-px-4\">\n <div class=\"afp-legacy-ppt-wrap\" [innerHTML]=\"trust(html())\"></div>\n </div>\n }\n `,\n }]\n }], ctorParameters: () => [] });\n\nexport { PptRenderer };\n//# sourceMappingURL=eternalheart-angular-file-preview-index-DbmuvdvN.mjs.map\n"],"names":["renderLegacyPptHtml"],"mappings":";;;;;;AAOA,MAAM,WAAW,CAAC;AAClB,IAAI,WAAW,GAAG;AAClB,QAAQ,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC,QAAQ,EAAE;AACnC,QAAQ,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,aAAa,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAC/D,QAAQ,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,cAAc,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AACjE,QAAQ,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,YAAY,CAAC;AAC7C,QAAQ,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,IAAI,qBAAqB,EAAE;AAC5D,QAAQ,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,EAAE,CAAC;AAC9B,QAAQ,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC;AACnC,QAAQ,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC;AACjC,QAAQ,IAAI,CAAC,gBAAgB,GAAG,MAAM,EAAE;AACxC,QAAQ,MAAM,CAAC,MAAM;AACrB,YAAY,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE;AACrC,YAAY,IAAI,MAAM,EAAE;AACxB,gBAAgB,SAAS,CAAC,MAAM;AAChC,oBAAoB,KAAK,IAAI,CAAC,OAAO,EAAE;AACvC,gBAAgB,CAAC,CAAC;AAClB,YAAY;AACZ,QAAQ,CAAC,CAAC;AACV,IAAI;AACJ,IAAI,KAAK,CAAC,IAAI,EAAE;AAChB,QAAQ,OAAO,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAAC,IAAI,CAAC;AAC3D,IAAI;AACJ,IAAI,MAAM,OAAO,GAAG;AACpB,QAAQ,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AAC9B,QAAQ,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;AAC5B,QAAQ,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;AACzB,QAAQ,IAAI;AACZ,YAAY,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,EAAE,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;AACpF,YAAY,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;AACtD,YAAY,IAAI,CAAC,QAAQ,CAAC,EAAE;AAC5B,gBAAgB,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC;AAC9C,YAAY,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE;AACvD,YAAY,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAMA,EAAmB,CAAC,MAAM,CAAC,CAAC;AAC5D,QAAQ;AACR,QAAQ,OAAO,GAAG,EAAE;AACpB,YAAY,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,GAAG,CAAC;AAC3C,YAAY,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC;AACtD,QAAQ;AACR,gBAAgB;AAChB,YAAY,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;AACnC,QAAQ;AACR,IAAI;AACJ,IAAI,SAAS,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC,kBAAkB,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,eAAe,CAAC,SAAS,EAAE,CAAC,CAAC;AAC9K,IAAI,SAAS,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC,oBAAoB,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,EAAE,iBAAiB,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,cAAc,EAAE,iCAAiC,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,EAAE;AACpX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,oBAAoB,EAAE,MAAM,EAAE,CAAC,SAAS,EAAE,QAAQ,EAAE,UAAU,CAAC,EAAE,CAAC,EAAE,eAAe,EAAE,EAAE,CAAC,uBAAuB,CAAC,MAAM,EAAE,CAAC,CAAC;AAClN;AACA,EAAE,CAAC,wBAAwB,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC;AACtH,YAAY,IAAI,EAAE,SAAS;AAC3B,YAAY,IAAI,EAAE,CAAC;AACnB,oBAAoB,QAAQ,EAAE,kBAAkB;AAChD,oBAAoB,UAAU,EAAE,IAAI;AACpC,oBAAoB,OAAO,EAAE,CAAC,aAAa,CAAC;AAC5C,oBAAoB,eAAe,EAAE,uBAAuB,CAAC,MAAM;AACnE,oBAAoB,IAAI,EAAE,EAAE,KAAK,EAAE,iCAAiC,EAAE;AACtE,oBAAoB,QAAQ,EAAE;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,CAAC;AACH,iBAAiB;AACjB,SAAS,CAAC,EAAE,cAAc,EAAE,MAAM,EAAE,EAAE,CAAC;;;;"}