@flogeez/angular-tiptap-editor 3.1.3 → 3.1.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.
- package/CHANGELOG.md +24 -0
- package/README.md +2 -2
- package/esm2022/flogeez-angular-tiptap-editor.mjs +5 -0
- package/esm2022/lib/ate-editor.provider.mjs +38 -0
- package/esm2022/lib/components/bubble-menus/base/ate-base-bubble-menu.mjs +207 -0
- package/esm2022/lib/components/bubble-menus/base/ate-base-sub-bubble-menu.mjs +137 -0
- package/esm2022/lib/components/bubble-menus/color/ate-color-bubble-menu.component.mjs +365 -0
- package/esm2022/lib/components/bubble-menus/image/ate-image-bubble-menu.component.mjs +309 -0
- package/esm2022/lib/components/bubble-menus/link/ate-link-bubble-menu.component.mjs +247 -0
- package/esm2022/lib/components/bubble-menus/table/ate-cell-bubble-menu.component.mjs +126 -0
- package/esm2022/lib/components/bubble-menus/table/ate-table-bubble-menu.component.mjs +271 -0
- package/esm2022/lib/components/bubble-menus/text/ate-bubble-menu.component.mjs +272 -0
- package/esm2022/lib/components/color-picker/ate-color-picker.component.mjs +123 -0
- package/esm2022/lib/components/edit-toggle/ate-edit-toggle.component.mjs +42 -0
- package/esm2022/lib/components/editor/angular-tiptap-editor.component.mjs +1032 -0
- package/esm2022/lib/components/editor/ate-block-controls.component.mjs +256 -0
- package/esm2022/lib/components/slash-commands/ate-slash-commands.component.mjs +328 -0
- package/esm2022/lib/components/toolbar/ate-toolbar.component.mjs +531 -0
- package/esm2022/lib/components/ui/ate-button.component.mjs +91 -0
- package/esm2022/lib/components/ui/ate-separator.component.mjs +11 -0
- package/esm2022/lib/config/ate-editor.config.mjs +133 -0
- package/esm2022/lib/config/ate-global-config.token.mjs +6 -0
- package/esm2022/lib/config/ate-slash-commands.config.mjs +130 -0
- package/esm2022/lib/directives/ate-noop-value-accessor.directive.mjs +40 -0
- package/esm2022/lib/directives/ate-tooltip.directive.mjs +138 -0
- package/esm2022/lib/extensions/ate-block-controls.extension.mjs +156 -0
- package/esm2022/lib/extensions/ate-link-click-behavior.extension.mjs +32 -0
- package/esm2022/lib/extensions/ate-resizable-image.extension.mjs +277 -0
- package/esm2022/lib/extensions/ate-table.extension.mjs +27 -0
- package/esm2022/lib/extensions/ate-tiptap-state.extension.mjs +85 -0
- package/esm2022/lib/extensions/ate-upload-progress.extension.mjs +195 -0
- package/esm2022/lib/extensions/calculators/ate-discovery.calculator.mjs +62 -0
- package/esm2022/lib/extensions/calculators/ate-image.calculator.mjs +8 -0
- package/esm2022/lib/extensions/calculators/ate-marks.calculator.mjs +75 -0
- package/esm2022/lib/extensions/calculators/ate-selection.calculator.mjs +35 -0
- package/esm2022/lib/extensions/calculators/ate-structure.calculator.mjs +34 -0
- package/esm2022/lib/extensions/calculators/ate-table.calculator.mjs +38 -0
- package/esm2022/lib/models/ate-bubble-menu.model.mjs +53 -0
- package/esm2022/lib/models/ate-editor-config.model.mjs +2 -0
- package/esm2022/lib/models/ate-editor-state.model.mjs +90 -0
- package/esm2022/lib/models/ate-image.model.mjs +2 -0
- package/esm2022/lib/models/ate-slash-command.model.mjs +2 -0
- package/esm2022/lib/models/ate-toolbar.model.mjs +35 -0
- package/esm2022/lib/node-view/ate-angular-node-view.mjs +97 -0
- package/esm2022/lib/node-view/ate-injector.registry.mjs +16 -0
- package/esm2022/lib/node-view/ate-node-view.factory.mjs +125 -0
- package/esm2022/lib/node-view/ate-node-view.models.mjs +2 -0
- package/esm2022/lib/node-view/ate-node-view.renderer.mjs +154 -0
- package/esm2022/lib/node-view/ate-register-angular-component.mjs +49 -0
- package/esm2022/lib/services/ate-color-picker.service.mjs +194 -0
- package/esm2022/lib/services/ate-editor-commands.service.mjs +507 -0
- package/esm2022/lib/services/ate-export.service.mjs +71 -0
- package/esm2022/lib/services/ate-i18n.service.mjs +449 -0
- package/esm2022/lib/services/ate-image.service.mjs +459 -0
- package/esm2022/lib/services/ate-link.service.mjs +99 -0
- package/esm2022/lib/utils/ate-color.utils.mjs +60 -0
- package/esm2022/lib/utils/ate-markdown.utils.mjs +179 -0
- package/esm2022/public-api.mjs +41 -0
- package/fesm2022/flogeez-angular-tiptap-editor.mjs +627 -354
- package/fesm2022/flogeez-angular-tiptap-editor.mjs.map +1 -1
- package/index.d.ts +3 -1734
- package/lib/ate-editor.provider.d.ts +21 -0
- package/lib/components/bubble-menus/base/ate-base-bubble-menu.d.ts +71 -0
- package/lib/components/bubble-menus/base/ate-base-sub-bubble-menu.d.ts +60 -0
- package/lib/components/bubble-menus/color/ate-color-bubble-menu.component.d.ts +77 -0
- package/lib/components/bubble-menus/image/ate-image-bubble-menu.component.d.ts +49 -0
- package/lib/components/bubble-menus/link/ate-link-bubble-menu.component.d.ts +55 -0
- package/lib/components/bubble-menus/table/ate-cell-bubble-menu.component.d.ts +16 -0
- package/lib/components/bubble-menus/table/ate-table-bubble-menu.component.d.ts +25 -0
- package/lib/components/bubble-menus/text/ate-bubble-menu.component.d.ts +53 -0
- package/lib/components/color-picker/ate-color-picker.component.d.ts +54 -0
- package/lib/components/edit-toggle/ate-edit-toggle.component.d.ts +13 -0
- package/lib/components/editor/angular-tiptap-editor.component.d.ts +242 -0
- package/lib/components/editor/ate-block-controls.component.d.ts +44 -0
- package/lib/components/slash-commands/ate-slash-commands.component.d.ts +34 -0
- package/lib/components/toolbar/ate-toolbar.component.d.ts +47 -0
- package/lib/components/ui/ate-button.component.d.ts +25 -0
- package/lib/components/ui/ate-separator.component.d.ts +5 -0
- package/lib/config/ate-editor.config.d.ts +19 -0
- package/lib/config/ate-global-config.token.d.ts +6 -0
- package/lib/config/ate-slash-commands.config.d.ts +41 -0
- package/lib/directives/ate-noop-value-accessor.directive.d.ts +13 -0
- package/lib/directives/ate-tooltip.directive.d.ts +30 -0
- package/lib/extensions/ate-block-controls.extension.d.ts +10 -0
- package/lib/extensions/ate-link-click-behavior.extension.d.ts +2 -0
- package/lib/extensions/ate-resizable-image.extension.d.ts +27 -0
- package/lib/extensions/ate-table.extension.d.ts +2 -0
- package/lib/extensions/ate-tiptap-state.extension.d.ts +7 -0
- package/lib/extensions/ate-upload-progress.extension.d.ts +7 -0
- package/lib/extensions/calculators/ate-discovery.calculator.d.ts +7 -0
- package/lib/extensions/calculators/ate-image.calculator.d.ts +2 -0
- package/lib/extensions/calculators/ate-marks.calculator.d.ts +2 -0
- package/lib/extensions/calculators/ate-selection.calculator.d.ts +2 -0
- package/lib/extensions/calculators/ate-structure.calculator.d.ts +2 -0
- package/lib/extensions/calculators/ate-table.calculator.d.ts +2 -0
- package/lib/models/ate-bubble-menu.model.d.ts +33 -0
- package/lib/models/ate-editor-config.model.d.ts +113 -0
- package/lib/models/ate-editor-state.model.d.ts +109 -0
- package/lib/models/ate-image.model.d.ts +104 -0
- package/lib/models/ate-slash-command.model.d.ts +17 -0
- package/lib/models/ate-toolbar.model.d.ts +18 -0
- package/lib/node-view/ate-angular-node-view.d.ts +115 -0
- package/lib/node-view/ate-injector.registry.d.ts +3 -0
- package/lib/node-view/ate-node-view.factory.d.ts +10 -0
- package/lib/node-view/ate-node-view.models.d.ts +138 -0
- package/lib/node-view/ate-node-view.renderer.d.ts +23 -0
- package/lib/node-view/ate-register-angular-component.d.ts +35 -0
- package/lib/services/ate-color-picker.service.d.ts +65 -0
- package/lib/services/ate-editor-commands.service.d.ts +89 -0
- package/lib/services/ate-export.service.d.ts +27 -0
- package/lib/services/ate-i18n.service.d.ts +432 -0
- package/lib/services/ate-image.service.d.ts +82 -0
- package/lib/services/ate-link.service.d.ts +42 -0
- package/lib/utils/ate-color.utils.d.ts +12 -0
- package/lib/utils/ate-markdown.utils.d.ts +4 -0
- package/package.json +3 -1
- package/public-api.d.ts +32 -0
|
@@ -0,0 +1,507 @@
|
|
|
1
|
+
import { Injectable, inject, signal } from "@angular/core";
|
|
2
|
+
import { AteImageService } from "./ate-image.service";
|
|
3
|
+
import { AteColorPickerService } from "./ate-color-picker.service";
|
|
4
|
+
import { AteLinkService } from "./ate-link.service";
|
|
5
|
+
import { AteExportService } from "./ate-export.service";
|
|
6
|
+
import { ATE_INITIAL_EDITOR_STATE } from "../models/ate-editor-state.model";
|
|
7
|
+
import * as i0 from "@angular/core";
|
|
8
|
+
export class AteEditorCommandsService {
|
|
9
|
+
constructor() {
|
|
10
|
+
this.imageService = inject(AteImageService);
|
|
11
|
+
this.colorPickerSvc = inject(AteColorPickerService);
|
|
12
|
+
this.linkSvc = inject(AteLinkService);
|
|
13
|
+
this.exportSvc = inject(AteExportService);
|
|
14
|
+
this._editorState = signal(ATE_INITIAL_EDITOR_STATE, {
|
|
15
|
+
equal: (a, b) => {
|
|
16
|
+
// 1. Primitive global states
|
|
17
|
+
if (a.isFocused !== b.isFocused || a.isEditable !== b.isEditable) {
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
// 2. Detailed selection comparison
|
|
21
|
+
if (a.selection.from !== b.selection.from ||
|
|
22
|
+
a.selection.to !== b.selection.to ||
|
|
23
|
+
a.selection.type !== b.selection.type ||
|
|
24
|
+
a.selection.empty !== b.selection.empty ||
|
|
25
|
+
a.selection.isSingleCell !== b.selection.isSingleCell) {
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
// Helper for object comparison
|
|
29
|
+
const isRecordEqual = (objA, objB) => {
|
|
30
|
+
const keysA = Object.keys(objA);
|
|
31
|
+
const keysB = Object.keys(objB);
|
|
32
|
+
if (keysA.length !== keysB.length) {
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
return keysA.every(key => objA[key] === objB[key]);
|
|
36
|
+
};
|
|
37
|
+
// 3. Compare sub-states (marks, can, nodes)
|
|
38
|
+
if (!isRecordEqual(a.marks, b.marks)) {
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
if (!isRecordEqual(a.can, b.can)) {
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
if (!isRecordEqual(a.nodes, b.nodes)) {
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
// 4. Compare custom extension states
|
|
48
|
+
if (!isRecordEqual(a.custom, b.custom)) {
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
return true;
|
|
52
|
+
},
|
|
53
|
+
});
|
|
54
|
+
/** Exposed editor state as a readonly signal */
|
|
55
|
+
this.editorState = this._editorState.asReadonly();
|
|
56
|
+
// ============================================
|
|
57
|
+
// Toolbar Interaction State
|
|
58
|
+
// ============================================
|
|
59
|
+
/** Signal to track when the toolbar is being hovered/interacted with */
|
|
60
|
+
this._isToolbarInteracting = signal(false);
|
|
61
|
+
this.isToolbarInteracting = this._isToolbarInteracting.asReadonly();
|
|
62
|
+
// Access to ImageService states as readonly signals for UI binding
|
|
63
|
+
this.isUploading = this.imageService.isUploading.asReadonly();
|
|
64
|
+
this.uploadProgress = this.imageService.uploadProgress.asReadonly();
|
|
65
|
+
this.uploadMessage = this.imageService.uploadMessage.asReadonly();
|
|
66
|
+
// ============================================
|
|
67
|
+
// Link State (proxied from LinkService)
|
|
68
|
+
// ============================================
|
|
69
|
+
/** Signal to toggle link edit mode from UI (Toolbar) - Immediate response */
|
|
70
|
+
this.linkEditMode = this.linkSvc.editMode.asReadonly();
|
|
71
|
+
/** Reference to the element that triggered the link menu (for anchoring) */
|
|
72
|
+
this.linkMenuTrigger = this.linkSvc.menuTrigger.asReadonly();
|
|
73
|
+
// ============================================
|
|
74
|
+
// Color Picker State (proxied from ColorPickerService)
|
|
75
|
+
// ============================================
|
|
76
|
+
/** Signal to toggle color picker mode from UI (text or highlight) */
|
|
77
|
+
this.colorEditMode = this.colorPickerSvc.editMode.asReadonly();
|
|
78
|
+
/** Reference to the element that triggered the color menu (for anchoring) */
|
|
79
|
+
this.colorMenuTrigger = this.colorPickerSvc.menuTrigger.asReadonly();
|
|
80
|
+
}
|
|
81
|
+
/** Set toolbar interaction state (called by editor component) */
|
|
82
|
+
setToolbarInteracting(value) {
|
|
83
|
+
this._isToolbarInteracting.set(value);
|
|
84
|
+
}
|
|
85
|
+
set uploadHandler(handler) {
|
|
86
|
+
this.imageService.uploadHandler = handler;
|
|
87
|
+
}
|
|
88
|
+
/** Update state (called by TiptapStateExtension) */
|
|
89
|
+
updateState(state) {
|
|
90
|
+
this._editorState.set(state);
|
|
91
|
+
}
|
|
92
|
+
// ============================================
|
|
93
|
+
// Link Edit Methods (delegated to LinkService)
|
|
94
|
+
// ============================================
|
|
95
|
+
// ============================================
|
|
96
|
+
// Command Execution
|
|
97
|
+
// ============================================
|
|
98
|
+
/** Generic method to execute any command by name */
|
|
99
|
+
execute(editor, command, ...args) {
|
|
100
|
+
if (!editor) {
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
switch (command) {
|
|
104
|
+
case "toggleBold":
|
|
105
|
+
this.toggleBold(editor);
|
|
106
|
+
break;
|
|
107
|
+
case "toggleItalic":
|
|
108
|
+
this.toggleItalic(editor);
|
|
109
|
+
break;
|
|
110
|
+
case "toggleStrike":
|
|
111
|
+
this.toggleStrike(editor);
|
|
112
|
+
break;
|
|
113
|
+
case "toggleCode":
|
|
114
|
+
this.toggleCode(editor);
|
|
115
|
+
break;
|
|
116
|
+
case "toggleCodeBlock":
|
|
117
|
+
this.toggleCodeBlock(editor);
|
|
118
|
+
break;
|
|
119
|
+
case "toggleUnderline":
|
|
120
|
+
this.toggleUnderline(editor);
|
|
121
|
+
break;
|
|
122
|
+
case "toggleSuperscript":
|
|
123
|
+
this.toggleSuperscript(editor);
|
|
124
|
+
break;
|
|
125
|
+
case "toggleSubscript":
|
|
126
|
+
this.toggleSubscript(editor);
|
|
127
|
+
break;
|
|
128
|
+
case "toggleHeading":
|
|
129
|
+
this.toggleHeading(editor, args[0]);
|
|
130
|
+
break;
|
|
131
|
+
case "toggleBulletList":
|
|
132
|
+
this.toggleBulletList(editor);
|
|
133
|
+
break;
|
|
134
|
+
case "toggleOrderedList":
|
|
135
|
+
this.toggleOrderedList(editor);
|
|
136
|
+
break;
|
|
137
|
+
case "toggleBlockquote":
|
|
138
|
+
this.toggleBlockquote(editor);
|
|
139
|
+
break;
|
|
140
|
+
case "setTextAlign":
|
|
141
|
+
this.setTextAlign(editor, args[0]);
|
|
142
|
+
break;
|
|
143
|
+
case "toggleLink":
|
|
144
|
+
this.linkSvc.toggle(editor, args[0]);
|
|
145
|
+
break;
|
|
146
|
+
case "unsetLink":
|
|
147
|
+
this.linkSvc.unsetLink(editor);
|
|
148
|
+
break;
|
|
149
|
+
case "toggleColorPicker":
|
|
150
|
+
this.colorPickerSvc.toggle(editor, args[0], args[1]);
|
|
151
|
+
break;
|
|
152
|
+
case "insertHorizontalRule":
|
|
153
|
+
this.insertHorizontalRule(editor);
|
|
154
|
+
break;
|
|
155
|
+
case "insertImage":
|
|
156
|
+
this.insertImage(editor, args[0]);
|
|
157
|
+
break;
|
|
158
|
+
case "uploadImage":
|
|
159
|
+
this.uploadImage(editor, args[0], args[1]);
|
|
160
|
+
break;
|
|
161
|
+
case "toggleHighlight":
|
|
162
|
+
this.toggleHighlight(editor, args[0]);
|
|
163
|
+
break;
|
|
164
|
+
case "undo":
|
|
165
|
+
this.undo(editor);
|
|
166
|
+
break;
|
|
167
|
+
case "redo":
|
|
168
|
+
this.redo(editor);
|
|
169
|
+
break;
|
|
170
|
+
case "insertTable":
|
|
171
|
+
this.insertTable(editor, args[0], args[1]);
|
|
172
|
+
break;
|
|
173
|
+
case "addColumnBefore":
|
|
174
|
+
this.addColumnBefore(editor);
|
|
175
|
+
break;
|
|
176
|
+
case "addColumnAfter":
|
|
177
|
+
this.addColumnAfter(editor);
|
|
178
|
+
break;
|
|
179
|
+
case "deleteColumn":
|
|
180
|
+
this.deleteColumn(editor);
|
|
181
|
+
break;
|
|
182
|
+
case "addRowBefore":
|
|
183
|
+
this.addRowBefore(editor);
|
|
184
|
+
break;
|
|
185
|
+
case "addRowAfter":
|
|
186
|
+
this.addRowAfter(editor);
|
|
187
|
+
break;
|
|
188
|
+
case "deleteRow":
|
|
189
|
+
this.deleteRow(editor);
|
|
190
|
+
break;
|
|
191
|
+
case "deleteTable":
|
|
192
|
+
this.deleteTable(editor);
|
|
193
|
+
break;
|
|
194
|
+
case "mergeCells":
|
|
195
|
+
this.mergeCells(editor);
|
|
196
|
+
break;
|
|
197
|
+
case "splitCell":
|
|
198
|
+
this.splitCell(editor);
|
|
199
|
+
break;
|
|
200
|
+
case "toggleHeaderColumn":
|
|
201
|
+
this.toggleHeaderColumn(editor);
|
|
202
|
+
break;
|
|
203
|
+
case "toggleHeaderRow":
|
|
204
|
+
this.toggleHeaderRow(editor);
|
|
205
|
+
break;
|
|
206
|
+
case "applyColor":
|
|
207
|
+
this.colorPickerSvc.applyColor(editor, args[0], args[1], args[2]);
|
|
208
|
+
break;
|
|
209
|
+
case "applyHighlight":
|
|
210
|
+
this.colorPickerSvc.applyHighlight(editor, args[0], args[1], args[2]);
|
|
211
|
+
break;
|
|
212
|
+
case "unsetColor":
|
|
213
|
+
this.colorPickerSvc.unsetColor(editor, args[0]);
|
|
214
|
+
break;
|
|
215
|
+
case "unsetHighlight":
|
|
216
|
+
this.colorPickerSvc.unsetHighlight(editor, args[0]);
|
|
217
|
+
break;
|
|
218
|
+
case "clearContent":
|
|
219
|
+
this.clearContent(editor);
|
|
220
|
+
break;
|
|
221
|
+
case "exportAs":
|
|
222
|
+
void this.exportAs(editor, args[0], args[1], args[2]);
|
|
223
|
+
break;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
// --- Formatting Commands ---
|
|
227
|
+
toggleBold(editor) {
|
|
228
|
+
if (!editor) {
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
editor.chain().focus().toggleBold().run();
|
|
232
|
+
}
|
|
233
|
+
toggleItalic(editor) {
|
|
234
|
+
if (!editor) {
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
237
|
+
editor.chain().focus().toggleItalic().run();
|
|
238
|
+
}
|
|
239
|
+
toggleStrike(editor) {
|
|
240
|
+
if (!editor) {
|
|
241
|
+
return;
|
|
242
|
+
}
|
|
243
|
+
editor.chain().focus().toggleStrike().run();
|
|
244
|
+
}
|
|
245
|
+
toggleCode(editor) {
|
|
246
|
+
if (!editor) {
|
|
247
|
+
return;
|
|
248
|
+
}
|
|
249
|
+
editor.chain().focus().toggleCode().run();
|
|
250
|
+
}
|
|
251
|
+
toggleCodeBlock(editor) {
|
|
252
|
+
if (!editor) {
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
editor.chain().focus().toggleCodeBlock().run();
|
|
256
|
+
}
|
|
257
|
+
toggleUnderline(editor) {
|
|
258
|
+
if (!editor) {
|
|
259
|
+
return;
|
|
260
|
+
}
|
|
261
|
+
editor.chain().focus().toggleUnderline().run();
|
|
262
|
+
}
|
|
263
|
+
toggleSuperscript(editor) {
|
|
264
|
+
if (!editor) {
|
|
265
|
+
return;
|
|
266
|
+
}
|
|
267
|
+
editor.chain().focus().toggleSuperscript().run();
|
|
268
|
+
}
|
|
269
|
+
toggleSubscript(editor) {
|
|
270
|
+
if (!editor) {
|
|
271
|
+
return;
|
|
272
|
+
}
|
|
273
|
+
editor.chain().focus().toggleSubscript().run();
|
|
274
|
+
}
|
|
275
|
+
toggleHeading(editor, level) {
|
|
276
|
+
if (!editor) {
|
|
277
|
+
return;
|
|
278
|
+
}
|
|
279
|
+
editor.chain().focus().toggleHeading({ level }).run();
|
|
280
|
+
}
|
|
281
|
+
toggleHighlight(editor, color) {
|
|
282
|
+
if (!editor) {
|
|
283
|
+
return;
|
|
284
|
+
}
|
|
285
|
+
if (color) {
|
|
286
|
+
editor.chain().focus().setHighlight({ color }).run();
|
|
287
|
+
}
|
|
288
|
+
else {
|
|
289
|
+
editor.chain().focus().toggleHighlight().run();
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
// --- Structure Commands ---
|
|
293
|
+
toggleBulletList(editor) {
|
|
294
|
+
if (!editor) {
|
|
295
|
+
return;
|
|
296
|
+
}
|
|
297
|
+
editor.chain().focus().toggleBulletList().run();
|
|
298
|
+
}
|
|
299
|
+
toggleOrderedList(editor) {
|
|
300
|
+
if (!editor) {
|
|
301
|
+
return;
|
|
302
|
+
}
|
|
303
|
+
editor.chain().focus().toggleOrderedList().run();
|
|
304
|
+
}
|
|
305
|
+
toggleBlockquote(editor) {
|
|
306
|
+
if (!editor) {
|
|
307
|
+
return;
|
|
308
|
+
}
|
|
309
|
+
editor.chain().focus().toggleBlockquote().run();
|
|
310
|
+
}
|
|
311
|
+
setTextAlign(editor, alignment) {
|
|
312
|
+
if (!editor) {
|
|
313
|
+
return;
|
|
314
|
+
}
|
|
315
|
+
editor.chain().focus().setTextAlign(alignment).run();
|
|
316
|
+
}
|
|
317
|
+
insertHorizontalRule(editor) {
|
|
318
|
+
if (!editor) {
|
|
319
|
+
return;
|
|
320
|
+
}
|
|
321
|
+
editor.chain().focus().setHorizontalRule().run();
|
|
322
|
+
}
|
|
323
|
+
// --- History Commands ---
|
|
324
|
+
undo(editor) {
|
|
325
|
+
if (!editor) {
|
|
326
|
+
return;
|
|
327
|
+
}
|
|
328
|
+
editor.chain().focus().undo().run();
|
|
329
|
+
}
|
|
330
|
+
redo(editor) {
|
|
331
|
+
if (!editor) {
|
|
332
|
+
return;
|
|
333
|
+
}
|
|
334
|
+
editor.chain().focus().redo().run();
|
|
335
|
+
}
|
|
336
|
+
// --- Table Commands ---
|
|
337
|
+
insertTable(editor, rows = 3, cols = 3) {
|
|
338
|
+
if (!editor) {
|
|
339
|
+
return;
|
|
340
|
+
}
|
|
341
|
+
editor.chain().focus().insertTable({ rows, cols }).run();
|
|
342
|
+
}
|
|
343
|
+
addColumnBefore(editor) {
|
|
344
|
+
if (!editor) {
|
|
345
|
+
return;
|
|
346
|
+
}
|
|
347
|
+
editor.chain().focus().addColumnBefore().run();
|
|
348
|
+
}
|
|
349
|
+
addColumnAfter(editor) {
|
|
350
|
+
if (!editor) {
|
|
351
|
+
return;
|
|
352
|
+
}
|
|
353
|
+
editor.chain().focus().addColumnAfter().run();
|
|
354
|
+
}
|
|
355
|
+
deleteColumn(editor) {
|
|
356
|
+
if (!editor) {
|
|
357
|
+
return;
|
|
358
|
+
}
|
|
359
|
+
editor.chain().focus().deleteColumn().run();
|
|
360
|
+
}
|
|
361
|
+
addRowBefore(editor) {
|
|
362
|
+
if (!editor) {
|
|
363
|
+
return;
|
|
364
|
+
}
|
|
365
|
+
editor.chain().focus().addRowBefore().run();
|
|
366
|
+
}
|
|
367
|
+
addRowAfter(editor) {
|
|
368
|
+
if (!editor) {
|
|
369
|
+
return;
|
|
370
|
+
}
|
|
371
|
+
editor.chain().focus().addRowAfter().run();
|
|
372
|
+
}
|
|
373
|
+
deleteRow(editor) {
|
|
374
|
+
if (!editor) {
|
|
375
|
+
return;
|
|
376
|
+
}
|
|
377
|
+
editor.chain().focus().deleteRow().run();
|
|
378
|
+
}
|
|
379
|
+
deleteTable(editor) {
|
|
380
|
+
if (!editor) {
|
|
381
|
+
return;
|
|
382
|
+
}
|
|
383
|
+
editor.chain().focus().deleteTable().run();
|
|
384
|
+
}
|
|
385
|
+
mergeCells(editor) {
|
|
386
|
+
if (!editor) {
|
|
387
|
+
return;
|
|
388
|
+
}
|
|
389
|
+
editor.chain().focus().mergeCells().run();
|
|
390
|
+
}
|
|
391
|
+
splitCell(editor) {
|
|
392
|
+
if (!editor) {
|
|
393
|
+
return;
|
|
394
|
+
}
|
|
395
|
+
editor.chain().focus().splitCell().run();
|
|
396
|
+
}
|
|
397
|
+
toggleHeaderColumn(editor) {
|
|
398
|
+
if (!editor) {
|
|
399
|
+
return;
|
|
400
|
+
}
|
|
401
|
+
editor.chain().focus().toggleHeaderColumn().run();
|
|
402
|
+
}
|
|
403
|
+
toggleHeaderRow(editor) {
|
|
404
|
+
if (!editor) {
|
|
405
|
+
return;
|
|
406
|
+
}
|
|
407
|
+
editor.chain().focus().toggleHeaderRow().run();
|
|
408
|
+
}
|
|
409
|
+
// --- Utility Commands ---
|
|
410
|
+
clearContent(editor) {
|
|
411
|
+
if (!editor) {
|
|
412
|
+
return;
|
|
413
|
+
}
|
|
414
|
+
editor.commands.clearContent(true);
|
|
415
|
+
}
|
|
416
|
+
// --- Export Commands ---
|
|
417
|
+
/**
|
|
418
|
+
* Returns the editor content in the given format.
|
|
419
|
+
* @param format 'html' | 'markdown' | 'text'
|
|
420
|
+
*/
|
|
421
|
+
getContent(editor, format) {
|
|
422
|
+
if (!editor) {
|
|
423
|
+
return "";
|
|
424
|
+
}
|
|
425
|
+
return this.exportSvc.getContent(editor, format);
|
|
426
|
+
}
|
|
427
|
+
/**
|
|
428
|
+
* Exports the editor content.
|
|
429
|
+
* @param format 'html' | 'markdown' | 'text'
|
|
430
|
+
* @param method 'clipboard' | 'download'
|
|
431
|
+
* @param options Optional filename for download
|
|
432
|
+
*/
|
|
433
|
+
async exportAs(editor, format, method, options) {
|
|
434
|
+
if (!editor) {
|
|
435
|
+
return;
|
|
436
|
+
}
|
|
437
|
+
if (method === "clipboard") {
|
|
438
|
+
await this.exportSvc.exportToClipboard(editor, format);
|
|
439
|
+
}
|
|
440
|
+
else {
|
|
441
|
+
this.exportSvc.exportToFile(editor, format, options);
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
focus(editor) {
|
|
445
|
+
if (!editor) {
|
|
446
|
+
return;
|
|
447
|
+
}
|
|
448
|
+
editor.chain().focus().run();
|
|
449
|
+
}
|
|
450
|
+
blur(editor) {
|
|
451
|
+
if (!editor) {
|
|
452
|
+
return;
|
|
453
|
+
}
|
|
454
|
+
editor.chain().blur().run();
|
|
455
|
+
}
|
|
456
|
+
setContent(editor, content, emitUpdate = true) {
|
|
457
|
+
if (!editor) {
|
|
458
|
+
return;
|
|
459
|
+
}
|
|
460
|
+
editor.commands.setContent(content, { emitUpdate });
|
|
461
|
+
}
|
|
462
|
+
setEditable(editor, editable) {
|
|
463
|
+
if (!editor) {
|
|
464
|
+
return;
|
|
465
|
+
}
|
|
466
|
+
editor.setEditable(editable);
|
|
467
|
+
}
|
|
468
|
+
insertContent(editor, content) {
|
|
469
|
+
if (!editor) {
|
|
470
|
+
return;
|
|
471
|
+
}
|
|
472
|
+
editor.chain().focus().insertContent(content).run();
|
|
473
|
+
}
|
|
474
|
+
async insertImage(editor, options) {
|
|
475
|
+
try {
|
|
476
|
+
await this.imageService.selectAndUploadImage(editor, options);
|
|
477
|
+
}
|
|
478
|
+
catch (error) {
|
|
479
|
+
console.error("Error inserting image:", error);
|
|
480
|
+
throw error;
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
async uploadImage(editor, file, options) {
|
|
484
|
+
try {
|
|
485
|
+
await this.imageService.uploadAndInsertImage(editor, file, options);
|
|
486
|
+
}
|
|
487
|
+
catch (error) {
|
|
488
|
+
console.error("Error uploading image:", error);
|
|
489
|
+
throw error;
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
downloadImage(editor) {
|
|
493
|
+
this.imageService.downloadImage(editor);
|
|
494
|
+
}
|
|
495
|
+
handleImageDrop(editor, event, options) {
|
|
496
|
+
return this.imageService.handleDrop(editor, event, options);
|
|
497
|
+
}
|
|
498
|
+
handleImagePaste(editor, event, options) {
|
|
499
|
+
return this.imageService.handlePaste(editor, event, options);
|
|
500
|
+
}
|
|
501
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AteEditorCommandsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
502
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AteEditorCommandsService }); }
|
|
503
|
+
}
|
|
504
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AteEditorCommandsService, decorators: [{
|
|
505
|
+
type: Injectable
|
|
506
|
+
}] });
|
|
507
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXRlLWVkaXRvci1jb21tYW5kcy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci10aXB0YXAtZWRpdG9yL3NyYy9saWIvc2VydmljZXMvYXRlLWVkaXRvci1jb21tYW5kcy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDbkUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxnQkFBZ0IsRUFBcUMsTUFBTSxzQkFBc0IsQ0FBQztBQUMzRixPQUFPLEVBQTBCLHdCQUF3QixFQUFFLE1BQU0sa0NBQWtDLENBQUM7O0FBSXBHLE1BQU0sT0FBTyx3QkFBd0I7SUFEckM7UUFFVSxpQkFBWSxHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUN2QyxtQkFBYyxHQUFHLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQy9DLFlBQU8sR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDakMsY0FBUyxHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQzVCLGlCQUFZLEdBQUcsTUFBTSxDQUF5Qix3QkFBd0IsRUFBRTtZQUN2RixLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ2QsNkJBQTZCO2dCQUM3QixJQUFJLENBQUMsQ0FBQyxTQUFTLEtBQUssQ0FBQyxDQUFDLFNBQVMsSUFBSSxDQUFDLENBQUMsVUFBVSxLQUFLLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztvQkFDakUsT0FBTyxLQUFLLENBQUM7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QXdCLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDL0MsTUFBTSxLQUFLLENBQUM7UUFDZCxDQUFDO0lBQ0gsQ0FBQztJQUVELEtBQUssQ0FBQyxXQUFXLENBQUMsTUFBYyxFQUFFLElBQVUsRUFBRSxPQUErQjtRQUMzRSxJQUFJLENBQUM7WUFDSCxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsb0JBQW9CLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN0RSxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE9BQU8sQ0FBQyxLQUFLLENBQUMsd0JBQXdCLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDL0MsTUFBTSxLQUFLLENBQUM7UUFDZCxDQUFDO0lBQ0gsQ0FBQztJQUVELGFBQWEsQ0FBQyxNQUFjO1FBQzFCLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRCxlQUFlLENBQUMsTUFBYyxFQUFFLEtBQWdCLEVBQUUsT0FBK0I7UUFDL0UsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxNQUFjLEVBQUUsS0FBcUIsRUFBRSxPQUErQjtRQUNyRixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDL0QsQ0FBQzsrR0EvakJVLHdCQUF3QjttSEFBeEIsd0JBQXdCOzs0RkFBeEIsd0JBQXdCO2tCQURwQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgaW5qZWN0LCBzaWduYWwgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgRWRpdG9yIH0gZnJvbSBcIkB0aXB0YXAvY29yZVwiO1xuaW1wb3J0IHsgQXRlSW1hZ2VTZXJ2aWNlIH0gZnJvbSBcIi4vYXRlLWltYWdlLnNlcnZpY2VcIjtcbmltcG9ydCB7IEF0ZUNvbG9yUGlja2VyU2VydmljZSB9IGZyb20gXCIuL2F0ZS1jb2xvci1waWNrZXIuc2VydmljZVwiO1xuaW1wb3J0IHsgQXRlTGlua1NlcnZpY2UgfSBmcm9tIFwiLi9hdGUtbGluay5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBBdGVFeHBvcnRTZXJ2aWNlLCBBdGVFeHBvcnRGb3JtYXQsIEF0ZUV4cG9ydE9wdGlvbnMgfSBmcm9tIFwiLi9hdGUtZXhwb3J0LnNlcnZpY2VcIjtcbmltcG9ydCB7IEF0ZUVkaXRvclN0YXRlU25hcHNob3QsIEFURV9JTklUSUFMX0VESVRPUl9TVEFURSB9IGZyb20gXCIuLi9tb2RlbHMvYXRlLWVkaXRvci1zdGF0ZS5tb2RlbFwiO1xuaW1wb3J0IHsgQXRlSW1hZ2VVcGxvYWRIYW5kbGVyLCBBdGVJbWFnZVVwbG9hZE9wdGlvbnMgfSBmcm9tIFwiLi4vbW9kZWxzL2F0ZS1pbWFnZS5tb2RlbFwiO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQXRlRWRpdG9yQ29tbWFuZHNTZXJ2aWNlIHtcbiAgcHJpdmF0ZSBpbWFnZVNlcnZpY2UgPSBpbmplY3QoQXRlSW1hZ2VTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBjb2xvclBpY2tlclN2YyA9IGluamVjdChBdGVDb2xvclBpY2tlclNlcnZpY2UpO1xuICBwcml2YXRlIGxpbmtTdmMgPSBpbmplY3QoQXRlTGlua1NlcnZpY2UpO1xuICBwcml2YXRlIGV4cG9ydFN2YyA9IGluamVjdChBdGVFeHBvcnRTZXJ2aWNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfZWRpdG9yU3RhdGUgPSBzaWduYWw8QXRlRWRpdG9yU3RhdGVTbmFwc2hvdD4oQVRFX0lOSVRJQUxfRURJVE9SX1NUQVRFLCB7XG4gICAgZXF1YWw6IChhLCBiKSA9PiB7XG4gICAgICAvLyAxLiBQcmltaXRpdmUgZ2xvYmFsIHN0YXRlc1xuICAgICAgaWYgKGEuaXNGb2N1c2VkICE9PSBiLmlzRm9jdXNlZCB8fCBhLmlzRWRpdGFibGUgIT09IGIuaXNFZGl0YWJsZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIC8vIDIuIERldGFpbGVkIHNlbGVjdGlvbiBjb21wYXJpc29uXG4gICAgICBpZiAoXG4gICAgICAgIGEuc2VsZWN0aW9uLmZyb20gIT09IGIuc2VsZWN0aW9uLmZyb20gfHxcbiAgICAgICAgYS5zZWxlY3Rpb24udG8gIT09IGIuc2VsZWN0aW9uLnRvIHx8XG4gICAgICAgIGEuc2VsZWN0aW9uLnR5cGUgIT09IGIuc2VsZWN0aW9uLnR5cGUgfHxcbiAgICAgICAgYS5zZWxlY3Rpb24uZW1wdHkgIT09IGIuc2VsZWN0aW9uLmVtcHR5IHx8XG4gICAgICAgIGEuc2VsZWN0aW9uLmlzU2luZ2xlQ2VsbCAhPT0gYi5zZWxlY3Rpb24uaXNTaW5nbGVDZWxsXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICAvLyBIZWxwZXIgZm9yIG9iamVjdCBjb21wYXJpc29uXG4gICAgICBjb25zdCBpc1JlY29yZEVxdWFsID0gKG9iakE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBvYmpCOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4ge1xuICAgICAgICBjb25zdCBrZXlzQSA9IE9iamVjdC5rZXlzKG9iakEpO1xuICAgICAgICBjb25zdCBrZXlzQiA9IE9iamVjdC5rZXlzKG9iakIpO1xuICAgICAgICBpZiAoa2V5c0EubGVuZ3RoICE9PSBrZXlzQi5sZW5ndGgpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGtleXNBLmV2ZXJ5KGtleSA9PiBvYmpBW2tleV0gPT09IG9iakJba2V5XSk7XG4gICAgICB9O1xuXG4gICAgICAvLyAzLiBDb21wYXJlIHN1Yi1zdGF0ZXMgKG1hcmtzLCBjYW4sIG5vZGVzKVxuICAgICAgaWYgKCFpc1JlY29yZEVxdWFsKGEubWFya3MsIGIubWFya3MpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmICghaXNSZWNvcmRFcXVhbChhLmNhbiwgYi5jYW4pKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmICghaXNSZWNvcmRFcXVhbChhLm5vZGVzLCBiLm5vZGVzKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIC8vIDQuIENvbXBhcmUgY3VzdG9tIGV4dGVuc2lvbiBzdGF0ZXNcbiAgICAgIGlmICghaXNSZWNvcmRFcXVhbChhLmN1c3RvbSwgYi5jdXN0b20pKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbiAgfSk7XG5cbiAgLyoqIEV4cG9zZWQgZWRpdG9yIHN0YXRlIGFzIGEgcmVhZG9ubHkgc2lnbmFsICovXG4gIHJlYWRvbmx5IGVkaXRvclN0YXRlID0gdGhpcy5fZWRpdG9yU3RhdGUuYXNSZWFkb25seSgpO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFRvb2xiYXIgSW50ZXJhY3Rpb24gU3RhdGVcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKiogU2lnbmFsIHRvIHRyYWNrIHdoZW4gdGhlIHRvb2xiYXIgaXMgYmVpbmcgaG92ZXJlZC9pbnRlcmFjdGVkIHdpdGggKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfaXNUb29sYmFySW50ZXJhY3RpbmcgPSBzaWduYWwoZmFsc2UpO1xuICByZWFkb25seSBpc1Rvb2xiYXJJbnRlcmFjdGluZyA9IHRoaXMuX2lzVG9vbGJhckludGVyYWN0aW5nLmFzUmVhZG9ubHkoKTtcblxuICAvKiogU2V0IHRvb2xiYXIgaW50ZXJhY3Rpb24gc3RhdGUgKGNhbGxlZCBieSBlZGl0b3IgY29tcG9uZW50KSAqL1xuICBzZXRUb29sYmFySW50ZXJhY3RpbmcodmFsdWU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLl9pc1Rvb2xiYXJJbnRlcmFjdGluZy5zZXQodmFsdWUpO1xuICB9XG5cbiAgLy8gQWNjZXNzIHRvIEltYWdlU2VydmljZSBzdGF0ZXMgYXMgcmVhZG9ubHkgc2lnbmFscyBmb3IgVUkgYmluZGluZ1xuICByZWFkb25seSBpc1VwbG9hZGluZyA9IHRoaXMuaW1hZ2VTZXJ2aWNlLmlzVXBsb2FkaW5nLmFzUmVhZG9ubHkoKTtcbiAgcmVhZG9ubHkgdXBsb2FkUHJvZ3Jlc3MgPSB0aGlzLmltYWdlU2VydmljZS51cGxvYWRQcm9ncmVzcy5hc1JlYWRvbmx5KCk7XG4gIHJlYWRvbmx5IHVwbG9hZE1lc3NhZ2UgPSB0aGlzLmltYWdlU2VydmljZS51cGxvYWRNZXNzYWdlLmFzUmVhZG9ubHkoKTtcbiAgc2V0IHVwbG9hZEhhbmRsZXIoaGFuZGxlcjogQXRlSW1hZ2VVcGxvYWRIYW5kbGVyIHwgbnVsbCkge1xuICAgIHRoaXMuaW1hZ2VTZXJ2aWNlLnVwbG9hZEhhbmRsZXIgPSBoYW5kbGVyO1xuICB9XG5cbiAgLyoqIFVwZGF0ZSBzdGF0ZSAoY2FsbGVkIGJ5IFRpcHRhcFN0YXRlRXh0ZW5zaW9uKSAqL1xuICB1cGRhdGVTdGF0ZShzdGF0ZTogQXRlRWRpdG9yU3RhdGVTbmFwc2hvdCkge1xuICAgIHRoaXMuX2VkaXRvclN0YXRlLnNldChzdGF0ZSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBMaW5rIFN0YXRlIChwcm94aWVkIGZyb20gTGlua1NlcnZpY2UpXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIFNpZ25hbCB0byB0b2dnbGUgbGluayBlZGl0IG1vZGUgZnJvbSBVSSAoVG9vbGJhcikgLSBJbW1lZGlhdGUgcmVzcG9uc2UgKi9cbiAgcmVhZG9ubHkgbGlua0VkaXRNb2RlID0gdGhpcy5saW5rU3ZjLmVkaXRNb2RlLmFzUmVhZG9ubHkoKTtcblxuICAvKiogUmVmZXJlbmNlIHRvIHRoZSBlbGVtZW50IHRoYXQgdHJpZ2dlcmVkIHRoZSBsaW5rIG1lbnUgKGZvciBhbmNob3JpbmcpICovXG4gIHJlYWRvbmx5IGxpbmtNZW51VHJpZ2dlciA9IHRoaXMubGlua1N2Yy5tZW51VHJpZ2dlci5hc1JlYWRvbmx5KCk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ29sb3IgUGlja2VyIFN0YXRlIChwcm94aWVkIGZyb20gQ29sb3JQaWNrZXJTZXJ2aWNlKVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKiBTaWduYWwgdG8gdG9nZ2xlIGNvbG9yIHBpY2tlciBtb2RlIGZyb20gVUkgKHRleHQgb3IgaGlnaGxpZ2h0KSAqL1xuICByZWFkb25seSBjb2xvckVkaXRNb2RlID0gdGhpcy5jb2xvclBpY2tlclN2Yy5lZGl0TW9kZS5hc1JlYWRvbmx5KCk7XG5cbiAgLyoqIFJlZmVyZW5jZSB0byB0aGUgZWxlbWVudCB0aGF0IHRyaWdnZXJlZCB0aGUgY29sb3IgbWVudSAoZm9yIGFuY2hvcmluZykgKi9cbiAgcmVhZG9ubHkgY29sb3JNZW51VHJpZ2dlciA9IHRoaXMuY29sb3JQaWNrZXJTdmMubWVudVRyaWdnZXIuYXNSZWFkb25seSgpO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIExpbmsgRWRpdCBNZXRob2RzIChkZWxlZ2F0ZWQgdG8gTGlua1NlcnZpY2UpXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ29tbWFuZCBFeGVjdXRpb25cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKiogR2VuZXJpYyBtZXRob2QgdG8gZXhlY3V0ZSBhbnkgY29tbWFuZCBieSBuYW1lICovXG4gIGV4ZWN1dGUoZWRpdG9yOiBFZGl0b3IsIGNvbW1hbmQ6IHN0cmluZywgLi4uYXJnczogdW5rbm93bltdKTogdm9pZCB7XG4gICAgaWYgKCFlZGl0b3IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKGNvbW1hbmQpIHtcbiAgICAgIGNhc2UgXCJ0b2dnbGVCb2xkXCI6XG4gICAgICAgIHRoaXMudG9nZ2xlQm9sZChlZGl0b3IpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJ0b2dnbGVJdGFsaWNcIjpcbiAgICAgICAgdGhpcy50b2dnbGVJdGFsaWMoZWRpdG9yKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwidG9nZ2xlU3RyaWtlXCI6XG4gICAgICAgIHRoaXMudG9nZ2xlU3RyaWtlKGVkaXRvcik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcInRvZ2dsZUNvZGVcIjpcbiAgICAgICAgdGhpcy50b2dnbGVDb2RlKGVkaXRvcik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcInRvZ2dsZUNvZGVCbG9ja1wiOlxuICAgICAgICB0aGlzLnRvZ2dsZUNvZGVCbG9jayhlZGl0b3IpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJ0b2dnbGVVbmRlcmxpbmVcIjpcbiAgICAgICAgdGhpcy50b2dnbGVVbmRlcmxpbmUoZWRpdG9yKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwidG9nZ2xlU3VwZXJzY3JpcHRcIjpcbiAgICAgICAgdGhpcy50b2dnbGVTdXBlcnNjcmlwdChlZGl0b3IpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJ0b2dnbGVTdWJzY3JpcHRcIjpcbiAgICAgICAgdGhpcy50b2dnbGVTdWJzY3JpcHQoZWRpdG9yKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwidG9nZ2xlSGVhZGluZ1wiOlxuICAgICAgICB0aGlzLnRvZ2dsZUhlYWRpbmcoZWRpdG9yLCBhcmdzWzBdIGFzIDEgfCAyIHwgMyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcInRvZ2dsZUJ1bGxldExpc3RcIjpcbiAgICAgICAgdGhpcy50b2dnbGVCdWxsZXRMaXN0KGVkaXRvcik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcInRvZ2dsZU9yZGVyZWRMaXN0XCI6XG4gICAgICAgIHRoaXMudG9nZ2xlT3JkZXJlZExpc3QoZWRpdG9yKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwidG9nZ2xlQmxvY2txdW90ZVwiOlxuICAgICAgICB0aGlzLnRvZ2dsZUJsb2NrcXVvdGUoZWRpdG9yKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwic2V0VGV4dEFsaWduXCI6XG4gICAgICAgIHRoaXMuc2V0VGV4dEFsaWduKGVkaXRvciwgYXJnc1swXSBhcyBcImxlZnRcIiB8IFwiY2VudGVyXCIgfCBcInJpZ2h0XCIgfCBcImp1c3RpZnlcIik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcInRvZ2dsZUxpbmtcIjpcbiAgICAgICAgdGhpcy5saW5rU3ZjLnRvZ2dsZShlZGl0b3IsIGFyZ3NbMF0gYXMgRXZlbnQgfCB1bmRlZmluZWQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJ1bnNldExpbmtcIjpcbiAgICAgICAgdGhpcy5saW5rU3ZjLnVuc2V0TGluayhlZGl0b3IpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJ0b2dnbGVDb2xvclBpY2tlclwiOlxuICAgICAgICB0aGlzLmNvbG9yUGlja2VyU3ZjLnRvZ2dsZShlZGl0b3IsIGFyZ3NbMF0gYXMgXCJ0ZXh0XCIgfCBcImhpZ2hsaWdodFwiLCBhcmdzWzFdIGFzIEV2ZW50KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiaW5zZXJ0SG9yaXpvbnRhbFJ1bGVcIjpcbiAgICAgICAgdGhpcy5pbnNlcnRIb3Jpem9udGFsUnVsZShlZGl0b3IpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJpbnNlcnRJbWFnZVwiOlxuICAgICAgICB0aGlzLmluc2VydEltYWdlKGVkaXRvciwgYXJnc1swXSBhcyBBdGVJbWFnZVVwbG9hZE9wdGlvbnMpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJ1cGxvYWRJbWFnZVwiOlxuICAgICAgICB0aGlzLnVwbG9hZEltYWdlKGVkaXRvciwgYXJnc1swXSBhcyBGaWxlLCBhcmdzWzFdIGFzIEF0ZUltYWdlVXBsb2FkT3B0aW9ucyB8IHVuZGVmaW5lZCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcInRvZ2dsZUhpZ2hsaWdodFwiOlxuICAgICAgICB0aGlzLnRvZ2dsZUhpZ2hsaWdodChlZGl0b3IsIGFyZ3NbMF0gYXMgc3RyaW5nKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwidW5kb1wiOlxuICAgICAgICB0aGlzLnVuZG8oZWRpdG9yKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwicmVkb1wiOlxuICAgICAgICB0aGlzLnJlZG8oZWRpdG9yKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiaW5zZXJ0VGFibGVcIjpcbiAgICAgICAgdGhpcy5pbnNlcnRUYWJsZShlZGl0b3IsIGFyZ3NbMF0gYXMgbnVtYmVyIHwgdW5kZWZpbmVkLCBhcmdzWzFdIGFzIG51bWJlciB8IHVuZGVmaW5lZCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcImFkZENvbHVtbkJlZm9yZVwiOlxuICAgICAgICB0aGlzLmFkZENvbHVtbkJlZm9yZShlZGl0b3IpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJhZGRDb2x1bW5BZnRlclwiOlxuICAgICAgICB0aGlzLmFkZENvbHVtbkFmdGVyKGVkaXRvcik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcImRlbGV0ZUNvbHVtblwiOlxuICAgICAgICB0aGlzLmRlbGV0ZUNvbHVtbihlZGl0b3IpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJhZGRSb3dCZWZvcmVcIjpcbiAgICAgICAgdGhpcy5hZGRSb3dCZWZvcmUoZWRpdG9yKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiYWRkUm93QWZ0ZXJcIjpcbiAgICAgICAgdGhpcy5hZGRSb3dBZnRlcihlZGl0b3IpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJkZWxldGVSb3dcIjpcbiAgICAgICAgdGhpcy5kZWxldGVSb3coZWRpdG9yKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiZGVsZXRlVGFibGVcIjpcbiAgICAgICAgdGhpcy5kZWxldGVUYWJsZShlZGl0b3IpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJtZXJnZUNlbGxzXCI6XG4gICAgICAgIHRoaXMubWVyZ2VDZWxscyhlZGl0b3IpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJzcGxpdENlbGxcIjpcbiAgICAgICAgdGhpcy5zcGxpdENlbGwoZWRpdG9yKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwidG9nZ2xlSGVhZGVyQ29sdW1uXCI6XG4gICAgICAgIHRoaXMudG9nZ2xlSGVhZGVyQ29sdW1uKGVkaXRvcik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcInRvZ2dsZUhlYWRlclJvd1wiOlxuICAgICAgICB0aGlzLnRvZ2dsZUhlYWRlclJvdyhlZGl0b3IpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJhcHBseUNvbG9yXCI6XG4gICAgICAgIHRoaXMuY29sb3JQaWNrZXJTdmMuYXBwbHlDb2xvcihcbiAgICAgICAgICBlZGl0b3IsXG4gICAgICAgICAgYXJnc1swXSBhcyBzdHJpbmcsXG4gICAgICAgICAgYXJnc1sxXSBhcyBib29sZWFuIHwgdW5kZWZpbmVkLFxuICAgICAgICAgIGFyZ3NbMl0gYXMgYm9vbGVhbiB8IHVuZGVmaW5lZFxuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJhcHBseUhpZ2hsaWdodFwiOlxuICAgICAgICB0aGlzLmNvbG9yUGlja2VyU3ZjLmFwcGx5SGlnaGxpZ2h0KFxuICAgICAgICAgIGVkaXRvcixcbiAgICAgICAgICBhcmdzWzBdIGFzIHN0cmluZyxcbiAgICAgICAgICBhcmdzWzFdIGFzIGJvb2xlYW4gfCB1bmRlZmluZWQsXG4gICAgICAgICAgYXJnc1syXSBhcyBib29sZWFuIHwgdW5kZWZpbmVkXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcInVuc2V0Q29sb3JcIjpcbiAgICAgICAgdGhpcy5jb2xvclBpY2tlclN2Yy51bnNldENvbG9yKGVkaXRvciwgYXJnc1swXSBhcyBib29sZWFuKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwidW5zZXRIaWdobGlnaHRcIjpcbiAgICAgICAgdGhpcy5jb2xvclBpY2tlclN2Yy51bnNldEhpZ2hsaWdodChlZGl0b3IsIGFyZ3NbMF0gYXMgYm9vbGVhbik7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFwiY2xlYXJDb250ZW50XCI6XG4gICAgICAgIHRoaXMuY2xlYXJDb250ZW50KGVkaXRvcik7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFwiZXhwb3J0QXNcIjpcbiAgICAgICAgdm9pZCB0aGlzLmV4cG9ydEFzKFxuICAgICAgICAgIGVkaXRvcixcbiAgICAgICAgICBhcmdzWzBdIGFzIEF0ZUV4cG9ydEZvcm1hdCxcbiAgICAgICAgICBhcmdzWzFdIGFzIFwiY2xpcGJvYXJkXCIgfCBcImRvd25sb2FkXCIsXG4gICAgICAgICAgYXJnc1syXSBhcyBBdGVFeHBvcnRPcHRpb25zIHwgdW5kZWZpbmVkXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIC8vIC0tLSBGb3JtYXR0aW5nIENvbW1hbmRzIC0tLVxuXG4gIHRvZ2dsZUJvbGQoZWRpdG9yOiBFZGl0b3IpOiB2b2lkIHtcbiAgICBpZiAoIWVkaXRvcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlZGl0b3IuY2hhaW4oKS5mb2N1cygpLnRvZ2dsZUJvbGQoKS5ydW4oKTtcbiAgfVxuXG4gIHRvZ2dsZUl0YWxpYyhlZGl0b3I6IEVkaXRvcik6IHZvaWQge1xuICAgIGlmICghZWRpdG9yKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVkaXRvci5jaGFpbigpLmZvY3VzKCkudG9nZ2xlSXRhbGljKCkucnVuKCk7XG4gIH1cblxuICB0b2dnbGVTdHJpa2UoZWRpdG9yOiBFZGl0b3IpOiB2b2lkIHtcbiAgICBpZiAoIWVkaXRvcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlZGl0b3IuY2hhaW4oKS5mb2N1cygpLnRvZ2dsZVN0cmlrZSgpLnJ1bigpO1xuICB9XG5cbiAgdG9nZ2xlQ29kZShlZGl0b3I6IEVkaXRvcik6IHZvaWQge1xuICAgIGlmICghZWRpdG9yKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVkaXRvci5jaGFpbigpLmZvY3VzKCkudG9nZ2xlQ29kZSgpLnJ1bigpO1xuICB9XG5cbiAgdG9nZ2xlQ29kZUJsb2NrKGVkaXRvcjogRWRpdG9yKTogdm9pZCB7XG4gICAgaWYgKCFlZGl0b3IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZWRpdG9yLmNoYWluKCkuZm9jdXMoKS50b2dnbGVDb2RlQmxvY2soKS5ydW4oKTtcbiAgfVxuXG4gIHRvZ2dsZVVuZGVybGluZShlZGl0b3I6IEVkaXRvcik6IHZvaWQge1xuICAgIGlmICghZWRpdG9yKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVkaXRvci5jaGFpbigpLmZvY3VzKCkudG9nZ2xlVW5kZXJsaW5lKCkucnVuKCk7XG4gIH1cblxuICB0b2dnbGVTdXBlcnNjcmlwdChlZGl0b3I6IEVkaXRvcik6IHZvaWQge1xuICAgIGlmICghZWRpdG9yKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVkaXRvci5jaGFpbigpLmZvY3VzKCkudG9nZ2xlU3VwZXJzY3JpcHQoKS5ydW4oKTtcbiAgfVxuXG4gIHRvZ2dsZVN1YnNjcmlwdChlZGl0b3I6IEVkaXRvcik6IHZvaWQge1xuICAgIGlmICghZWRpdG9yKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVkaXRvci5jaGFpbigpLmZvY3VzKCkudG9nZ2xlU3Vic2NyaXB0KCkucnVuKCk7XG4gIH1cblxuICB0b2dnbGVIZWFkaW5nKGVkaXRvcjogRWRpdG9yLCBsZXZlbDogMSB8IDIgfCAzKTogdm9pZCB7XG4gICAgaWYgKCFlZGl0b3IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZWRpdG9yLmNoYWluKCkuZm9jdXMoKS50b2dnbGVIZWFkaW5nKHsgbGV2ZWwgfSkucnVuKCk7XG4gIH1cblxuICB0b2dnbGVIaWdobGlnaHQoZWRpdG9yOiBFZGl0b3IsIGNvbG9yPzogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCFlZGl0b3IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGNvbG9yKSB7XG4gICAgICBlZGl0b3IuY2hhaW4oKS5mb2N1cygpLnNldEhpZ2hsaWdodCh7IGNvbG9yIH0pLnJ1bigpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlZGl0b3IuY2hhaW4oKS5mb2N1cygpLnRvZ2dsZUhpZ2hsaWdodCgpLnJ1bigpO1xuICAgIH1cbiAgfVxuXG4gIC8vIC0tLSBTdHJ1Y3R1cmUgQ29tbWFuZHMgLS0tXG5cbiAgdG9nZ2xlQnVsbGV0TGlzdChlZGl0b3I6IEVkaXRvcik6IHZvaWQge1xuICAgIGlmICghZWRpdG9yKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVkaXRvci5jaGFpbigpLmZvY3VzKCkudG9nZ2xlQnVsbGV0TGlzdCgpLnJ1bigpO1xuICB9XG5cbiAgdG9nZ2xlT3JkZXJlZExpc3QoZWRpdG9yOiBFZGl0b3IpOiB2b2lkIHtcbiAgICBpZiAoIWVkaXRvcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlZGl0b3IuY2hhaW4oKS5mb2N1cygpLnRvZ2dsZU9yZGVyZWRMaXN0KCkucnVuKCk7XG4gIH1cblxuICB0b2dnbGVCbG9ja3F1b3RlKGVkaXRvcjogRWRpdG9yKTogdm9pZCB7XG4gICAgaWYgKCFlZGl0b3IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZWRpdG9yLmNoYWluKCkuZm9jdXMoKS50b2dnbGVCbG9ja3F1b3RlKCkucnVuKCk7XG4gIH1cblxuICBzZXRUZXh0QWxpZ24oZWRpdG9yOiBFZGl0b3IsIGFsaWdubWVudDogXCJsZWZ0XCIgfCBcImNlbnRlclwiIHwgXCJyaWdodFwiIHwgXCJqdXN0aWZ5XCIpOiB2b2lkIHtcbiAgICBpZiAoIWVkaXRvcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlZGl0b3IuY2hhaW4oKS5mb2N1cygpLnNldFRleHRBbGlnbihhbGlnbm1lbnQpLnJ1bigpO1xuICB9XG5cbiAgaW5zZXJ0SG9yaXpvbnRhbFJ1bGUoZWRpdG9yOiBFZGl0b3IpOiB2b2lkIHtcbiAgICBpZiAoIWVkaXRvcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlZGl0b3IuY2hhaW4oKS5mb2N1cygpLnNldEhvcml6b250YWxSdWxlKCkucnVuKCk7XG4gIH1cblxuICAvLyAtLS0gSGlzdG9yeSBDb21tYW5kcyAtLS1cblxuICB1bmRvKGVkaXRvcjogRWRpdG9yKTogdm9pZCB7XG4gICAgaWYgKCFlZGl0b3IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZWRpdG9yLmNoYWluKCkuZm9jdXMoKS51bmRvKCkucnVuKCk7XG4gIH1cblxuICByZWRvKGVkaXRvcjogRWRpdG9yKTogdm9pZCB7XG4gICAgaWYgKCFlZGl0b3IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZWRpdG9yLmNoYWluKCkuZm9jdXMoKS5yZWRvKCkucnVuKCk7XG4gIH1cblxuICAvLyAtLS0gVGFibGUgQ29tbWFuZHMgLS0tXG5cbiAgaW5zZXJ0VGFibGUoZWRpdG9yOiBFZGl0b3IsIHJvd3MgPSAzLCBjb2xzID0gMyk6IHZvaWQge1xuICAgIGlmICghZWRpdG9yKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVkaXRvci5jaGFpbigpLmZvY3VzKCkuaW5zZXJ0VGFibGUoeyByb3dzLCBjb2xzIH0pLnJ1bigpO1xuICB9XG5cbiAgYWRkQ29sdW1uQmVmb3JlKGVkaXRvcjogRWRpdG9yKTogdm9pZCB7XG4gICAgaWYgKCFlZGl0b3IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZWRpdG9yLmNoYWluKCkuZm9jdXMoKS5hZGRDb2x1bW5CZWZvcmUoKS5ydW4oKTtcbiAgfVxuXG4gIGFkZENvbHVtbkFmdGVyKGVkaXRvcjogRWRpdG9yKTogdm9pZCB7XG4gICAgaWYgKCFlZGl0b3IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZWRpdG9yLmNoYWluKCkuZm9jdXMoKS5hZGRDb2x1bW5BZnRlcigpLnJ1bigpO1xuICB9XG5cbiAgZGVsZXRlQ29sdW1uKGVkaXRvcjogRWRpdG9yKTogdm9pZCB7XG4gICAgaWYgKCFlZGl0b3IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZWRpdG9yLmNoYWluKCkuZm9jdXMoKS5kZWxldGVDb2x1bW4oKS5ydW4oKTtcbiAgfVxuXG4gIGFkZFJvd0JlZm9yZShlZGl0b3I6IEVkaXRvcik6IHZvaWQge1xuICAgIGlmICghZWRpdG9yKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVkaXRvci5jaGFpbigpLmZvY3VzKCkuYWRkUm93QmVmb3JlKCkucnVuKCk7XG4gIH1cblxuICBhZGRSb3dBZnRlcihlZGl0b3I6IEVkaXRvcik6IHZvaWQge1xuICAgIGlmICghZWRpdG9yKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVkaXRvci5jaGFpbigpLmZvY3VzKCkuYWRkUm93QWZ0ZXIoKS5ydW4oKTtcbiAgfVxuXG4gIGRlbGV0ZVJvdyhlZGl0b3I6IEVkaXRvcik6IHZvaWQge1xuICAgIGlmICghZWRpdG9yKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVkaXRvci5jaGFpbigpLmZvY3VzKCkuZGVsZXRlUm93KCkucnVuKCk7XG4gIH1cblxuICBkZWxldGVUYWJsZShlZGl0b3I6IEVkaXRvcik6IHZvaWQge1xuICAgIGlmICghZWRpdG9yKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVkaXRvci5jaGFpbigpLmZvY3VzKCkuZGVsZXRlVGFibGUoKS5ydW4oKTtcbiAgfVxuXG4gIG1lcmdlQ2VsbHMoZWRpdG9yOiBFZGl0b3IpOiB2b2lkIHtcbiAgICBpZiAoIWVkaXRvcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlZGl0b3IuY2hhaW4oKS5mb2N1cygpLm1lcmdlQ2VsbHMoKS5ydW4oKTtcbiAgfVxuXG4gIHNwbGl0Q2VsbChlZGl0b3I6IEVkaXRvcik6IHZvaWQge1xuICAgIGlmICghZWRpdG9yKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVkaXRvci5jaGFpbigpLmZvY3VzKCkuc3BsaXRDZWxsKCkucnVuKCk7XG4gIH1cblxuICB0b2dnbGVIZWFkZXJDb2x1bW4oZWRpdG9yOiBFZGl0b3IpOiB2b2lkIHtcbiAgICBpZiAoIWVkaXRvcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlZGl0b3IuY2hhaW4oKS5mb2N1cygpLnRvZ2dsZUhlYWRlckNvbHVtbigpLnJ1bigpO1xuICB9XG5cbiAgdG9nZ2xlSGVhZGVyUm93KGVkaXRvcjogRWRpdG9yKTogdm9pZCB7XG4gICAgaWYgKCFlZGl0b3IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZWRpdG9yLmNoYWluKCkuZm9jdXMoKS50b2dnbGVIZWFkZXJSb3coKS5ydW4oKTtcbiAgfVxuXG4gIC8vIC0tLSBVdGlsaXR5IENvbW1hbmRzIC0tLVxuXG4gIGNsZWFyQ29udGVudChlZGl0b3I6IEVkaXRvcik6IHZvaWQge1xuICAgIGlmICghZWRpdG9yKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVkaXRvci5jb21tYW5kcy5jbGVhckNvbnRlbnQodHJ1ZSk7XG4gIH1cblxuICAvLyAtLS0gRXhwb3J0IENvbW1hbmRzIC0tLVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBlZGl0b3IgY29udGVudCBpbiB0aGUgZ2l2ZW4gZm9ybWF0LlxuICAgKiBAcGFyYW0gZm9ybWF0ICdodG1sJyB8ICdtYXJrZG93bicgfCAndGV4dCdcbiAgICovXG4gIGdldENvbnRlbnQoZWRpdG9yOiBFZGl0b3IsIGZvcm1hdDogQXRlRXhwb3J0Rm9ybWF0KTogc3RyaW5nIHtcbiAgICBpZiAoIWVkaXRvcikge3JldHVybiBcIlwiO31cbiAgICByZXR1cm4gdGhpcy5leHBvcnRTdmMuZ2V0Q29udGVudChlZGl0b3IsIGZvcm1hdCk7XG4gIH1cblxuICAvKipcbiAgICogRXhwb3J0cyB0aGUgZWRpdG9yIGNvbnRlbnQuXG4gICAqIEBwYXJhbSBmb3JtYXQgICdodG1sJyB8ICdtYXJrZG93bicgfCAndGV4dCdcbiAgICogQHBhcmFtIG1ldGhvZCAgJ2NsaXBib2FyZCcgfCAnZG93bmxvYWQnXG4gICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbmFsIGZpbGVuYW1lIGZvciBkb3dubG9hZFxuICAgKi9cbiAgYXN5bmMgZXhwb3J0QXMoXG4gICAgZWRpdG9yOiBFZGl0b3IsXG4gICAgZm9ybWF0OiBBdGVFeHBvcnRGb3JtYXQsXG4gICAgbWV0aG9kOiBcImNsaXBib2FyZFwiIHwgXCJkb3dubG9hZFwiLFxuICAgIG9wdGlvbnM/OiBBdGVFeHBvcnRPcHRpb25zXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghZWRpdG9yKSB7cmV0dXJuO31cbiAgICBpZiAobWV0aG9kID09PSBcImNsaXBib2FyZFwiKSB7XG4gICAgICBhd2FpdCB0aGlzLmV4cG9ydFN2Yy5leHBvcnRUb0NsaXBib2FyZChlZGl0b3IsIGZvcm1hdCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZXhwb3J0U3ZjLmV4cG9ydFRvRmlsZShlZGl0b3IsIGZvcm1hdCwgb3B0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgZm9jdXMoZWRpdG9yOiBFZGl0b3IpOiB2b2lkIHtcbiAgICBpZiAoIWVkaXRvcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlZGl0b3IuY2hhaW4oKS5mb2N1cygpLnJ1bigpO1xuICB9XG5cbiAgYmx1cihlZGl0b3I6IEVkaXRvcik6IHZvaWQge1xuICAgIGlmICghZWRpdG9yKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVkaXRvci5jaGFpbigpLmJsdXIoKS5ydW4oKTtcbiAgfVxuXG4gIHNldENvbnRlbnQoZWRpdG9yOiBFZGl0b3IsIGNvbnRlbnQ6IHN0cmluZywgZW1pdFVwZGF0ZSA9IHRydWUpOiB2b2lkIHtcbiAgICBpZiAoIWVkaXRvcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlZGl0b3IuY29tbWFuZHMuc2V0Q29udGVudChjb250ZW50LCB7IGVtaXRVcGRhdGUgfSk7XG4gIH1cblxuICBzZXRFZGl0YWJsZShlZGl0b3I6IEVkaXRvciwgZWRpdGFibGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoIWVkaXRvcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlZGl0b3Iuc2V0RWRpdGFibGUoZWRpdGFibGUpO1xuICB9XG5cbiAgaW5zZXJ0Q29udGVudChlZGl0b3I6IEVkaXRvciwgY29udGVudDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCFlZGl0b3IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZWRpdG9yLmNoYWluKCkuZm9jdXMoKS5pbnNlcnRDb250ZW50KGNvbnRlbnQpLnJ1bigpO1xuICB9XG5cbiAgYXN5bmMgaW5zZXJ0SW1hZ2UoZWRpdG9yOiBFZGl0b3IsIG9wdGlvbnM/OiBBdGVJbWFnZVVwbG9hZE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5pbWFnZVNlcnZpY2Uuc2VsZWN0QW5kVXBsb2FkSW1hZ2UoZWRpdG9yLCBvcHRpb25zKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIGluc2VydGluZyBpbWFnZTpcIiwgZXJyb3IpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgdXBsb2FkSW1hZ2UoZWRpdG9yOiBFZGl0b3IsIGZpbGU6IEZpbGUsIG9wdGlvbnM/OiBBdGVJbWFnZVVwbG9hZE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5pbWFnZVNlcnZpY2UudXBsb2FkQW5kSW5zZXJ0SW1hZ2UoZWRpdG9yLCBmaWxlLCBvcHRpb25zKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIHVwbG9hZGluZyBpbWFnZTpcIiwgZXJyb3IpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgZG93bmxvYWRJbWFnZShlZGl0b3I6IEVkaXRvcik6IHZvaWQge1xuICAgIHRoaXMuaW1hZ2VTZXJ2aWNlLmRvd25sb2FkSW1hZ2UoZWRpdG9yKTtcbiAgfVxuXG4gIGhhbmRsZUltYWdlRHJvcChlZGl0b3I6IEVkaXRvciwgZXZlbnQ6IERyYWdFdmVudCwgb3B0aW9ucz86IEF0ZUltYWdlVXBsb2FkT3B0aW9ucyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmltYWdlU2VydmljZS5oYW5kbGVEcm9wKGVkaXRvciwgZXZlbnQsIG9wdGlvbnMpO1xuICB9XG5cbiAgaGFuZGxlSW1hZ2VQYXN0ZShlZGl0b3I6IEVkaXRvciwgZXZlbnQ6IENsaXBib2FyZEV2ZW50LCBvcHRpb25zPzogQXRlSW1hZ2VVcGxvYWRPcHRpb25zKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaW1hZ2VTZXJ2aWNlLmhhbmRsZVBhc3RlKGVkaXRvciwgZXZlbnQsIG9wdGlvbnMpO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { Injectable } from "@angular/core";
|
|
2
|
+
import { htmlToMarkdown } from "../utils/ate-markdown.utils";
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
export class AteExportService {
|
|
5
|
+
// ============================================================
|
|
6
|
+
// Public Content Getters
|
|
7
|
+
// ============================================================
|
|
8
|
+
/** Returns the editor content as HTML string. */
|
|
9
|
+
getHtml(editor) {
|
|
10
|
+
return editor.getHTML();
|
|
11
|
+
}
|
|
12
|
+
/** Returns the editor content as plain text. */
|
|
13
|
+
getText(editor) {
|
|
14
|
+
return editor.getText();
|
|
15
|
+
}
|
|
16
|
+
/** Returns the editor content converted to Markdown. */
|
|
17
|
+
getMarkdown(editor) {
|
|
18
|
+
const html = editor.getHTML();
|
|
19
|
+
return htmlToMarkdown(html);
|
|
20
|
+
}
|
|
21
|
+
/** Returns the editor content in the specified format. */
|
|
22
|
+
getContent(editor, format) {
|
|
23
|
+
switch (format) {
|
|
24
|
+
case "html":
|
|
25
|
+
return this.getHtml(editor);
|
|
26
|
+
case "markdown":
|
|
27
|
+
return this.getMarkdown(editor);
|
|
28
|
+
case "text":
|
|
29
|
+
return this.getText(editor);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
// ============================================================
|
|
33
|
+
// Export Methods
|
|
34
|
+
// ============================================================
|
|
35
|
+
/** Copies the editor content to the clipboard. */
|
|
36
|
+
async exportToClipboard(editor, format) {
|
|
37
|
+
const content = this.getContent(editor, format);
|
|
38
|
+
await navigator.clipboard.writeText(content);
|
|
39
|
+
}
|
|
40
|
+
/** Downloads the editor content as a file. */
|
|
41
|
+
exportToFile(editor, format, options) {
|
|
42
|
+
const content = this.getContent(editor, format);
|
|
43
|
+
const baseName = options?.filename || "document";
|
|
44
|
+
const extensions = {
|
|
45
|
+
html: "html",
|
|
46
|
+
markdown: "md",
|
|
47
|
+
text: "txt",
|
|
48
|
+
};
|
|
49
|
+
const mimeTypes = {
|
|
50
|
+
html: "text/html;charset=utf-8",
|
|
51
|
+
markdown: "text/markdown;charset=utf-8",
|
|
52
|
+
text: "text/plain;charset=utf-8",
|
|
53
|
+
};
|
|
54
|
+
const filename = `${baseName}.${extensions[format]}`;
|
|
55
|
+
const blob = new Blob([content], { type: mimeTypes[format] });
|
|
56
|
+
const url = URL.createObjectURL(blob);
|
|
57
|
+
const link = document.createElement("a");
|
|
58
|
+
link.href = url;
|
|
59
|
+
link.download = filename;
|
|
60
|
+
document.body.appendChild(link);
|
|
61
|
+
link.click();
|
|
62
|
+
document.body.removeChild(link);
|
|
63
|
+
URL.revokeObjectURL(url);
|
|
64
|
+
}
|
|
65
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AteExportService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
66
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AteExportService }); }
|
|
67
|
+
}
|
|
68
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AteExportService, decorators: [{
|
|
69
|
+
type: Injectable
|
|
70
|
+
}] });
|
|
71
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXRlLWV4cG9ydC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci10aXB0YXAtZWRpdG9yL3NyYy9saWIvc2VydmljZXMvYXRlLWV4cG9ydC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0MsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDZCQUE2QixDQUFDOztBQWU3RCxNQUFNLE9BQU8sZ0JBQWdCO0lBQzNCLCtEQUErRDtJQUMvRCx5QkFBeUI7SUFDekIsK0RBQStEO0lBRS9ELGlEQUFpRDtJQUNqRCxPQUFPLENBQUMsTUFBYztRQUNwQixPQUFPLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQsZ0RBQWdEO0lBQ2hELE9BQU8sQ0FBQyxNQUFjO1FBQ3BCLE9BQU8sTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRCx3REFBd0Q7SUFDeEQsV0FBVyxDQUFDLE1BQWM7UUFDeEIsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzlCLE9BQU8sY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRCwwREFBMEQ7SUFDMUQsVUFBVSxDQUFDLE1BQWMsRUFBRSxNQUF1QjtRQUNoRCxRQUFRLE1BQU0sRUFBRSxDQUFDO1lBQ2YsS0FBSyxNQUFNO2dCQUNULE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM5QixLQUFLLFVBQVU7Z0JBQ2IsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2xDLEtBQUssTUFBTTtnQkFDVCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDaEMsQ0FBQztJQUNILENBQUM7SUFFRCwrREFBK0Q7SUFDL0QsaUJBQWlCO0lBQ2pCLCtEQUErRDtJQUUvRCxrREFBa0Q7SUFDbEQsS0FBSyxDQUFDLGlCQUFpQixDQUFDLE1BQWMsRUFBRSxNQUF1QjtRQUM3RCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNoRCxNQUFNLFNBQVMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFRCw4Q0FBOEM7SUFDOUMsWUFBWSxDQUFDLE1BQWMsRUFBRSxNQUF1QixFQUFFLE9BQTBCO1FBQzlFLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ2hELE1BQU0sUUFBUSxHQUFHLE9BQU8sRUFBRSxRQUFRLElBQUksVUFBVSxDQUFDO1FBRWpELE1BQU0sVUFBVSxHQUFvQztZQUNsRCxJQUFJLEVBQUUsTUFBTTtZQUNaLFFBQVEsRUFBRSxJQUFJO1lBQ2QsSUFBSSxFQUFFLEtBQUs7U0FDWixDQUFDO1FBQ0YsTUFBTSxTQUFTLEdBQW9DO1lBQ2pELElBQUksRUFBRSx5QkFBeUI7WUFDL0IsUUFBUSxFQUFFLDZCQUE2QjtZQUN2QyxJQUFJLEVBQUUsMEJBQTBCO1NBQ2pDLENBQUM7UUFFRixNQUFNLFFBQVEsR0FBRyxHQUFHLFFBQVEsSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUNyRCxNQUFNLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDOUQsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV0QyxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDO1FBQ2hCLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ3pCLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNiLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2hDLEdBQUcsQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDM0IsQ0FBQzsrR0F0RVUsZ0JBQWdCO21IQUFoQixnQkFBZ0I7OzRGQUFoQixnQkFBZ0I7a0JBRDVCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IEVkaXRvciB9IGZyb20gXCJAdGlwdGFwL2NvcmVcIjtcbmltcG9ydCB7IGh0bWxUb01hcmtkb3duIH0gZnJvbSBcIi4uL3V0aWxzL2F0ZS1tYXJrZG93bi51dGlsc1wiO1xuXG4vKiogU3VwcG9ydGVkIGV4cG9ydCBmb3JtYXRzICovXG5leHBvcnQgdHlwZSBBdGVFeHBvcnRGb3JtYXQgPSBcImh0bWxcIiB8IFwibWFya2Rvd25cIiB8IFwidGV4dFwiO1xuXG4vKiogRXhwb3J0IGRlbGl2ZXJ5IG1ldGhvZCAqL1xuZXhwb3J0IHR5cGUgQXRlRXhwb3J0TWV0aG9kID0gXCJjbGlwYm9hcmRcIiB8IFwiZG93bmxvYWRcIjtcblxuLyoqIE9wdGlvbnMgZm9yIGZpbGUgZG93bmxvYWQgKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXRlRXhwb3J0T3B0aW9ucyB7XG4gIC8qKiBDdXN0b20gZmlsZW5hbWUgKHdpdGhvdXQgZXh0ZW5zaW9uKS4gRGVmYXVsdHMgdG8gXCJkb2N1bWVudFwiLiAqL1xuICBmaWxlbmFtZT86IHN0cmluZztcbn1cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEF0ZUV4cG9ydFNlcnZpY2Uge1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUHVibGljIENvbnRlbnQgR2V0dGVyc1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKiogUmV0dXJucyB0aGUgZWRpdG9yIGNvbnRlbnQgYXMgSFRNTCBzdHJpbmcuICovXG4gIGdldEh0bWwoZWRpdG9yOiBFZGl0b3IpOiBzdHJpbmcge1xuICAgIHJldHVybiBlZGl0b3IuZ2V0SFRNTCgpO1xuICB9XG5cbiAgLyoqIFJldHVybnMgdGhlIGVkaXRvciBjb250ZW50IGFzIHBsYWluIHRleHQuICovXG4gIGdldFRleHQoZWRpdG9yOiBFZGl0b3IpOiBzdHJpbmcge1xuICAgIHJldHVybiBlZGl0b3IuZ2V0VGV4dCgpO1xuICB9XG5cbiAgLyoqIFJldHVybnMgdGhlIGVkaXRvciBjb250ZW50IGNvbnZlcnRlZCB0byBNYXJrZG93bi4gKi9cbiAgZ2V0TWFya2Rvd24oZWRpdG9yOiBFZGl0b3IpOiBzdHJpbmcge1xuICAgIGNvbnN0IGh0bWwgPSBlZGl0b3IuZ2V0SFRNTCgpO1xuICAgIHJldHVybiBodG1sVG9NYXJrZG93bihodG1sKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHRoZSBlZGl0b3IgY29udGVudCBpbiB0aGUgc3BlY2lmaWVkIGZvcm1hdC4gKi9cbiAgZ2V0Q29udGVudChlZGl0b3I6IEVkaXRvciwgZm9ybWF0OiBBdGVFeHBvcnRGb3JtYXQpOiBzdHJpbmcge1xuICAgIHN3aXRjaCAoZm9ybWF0KSB7XG4gICAgICBjYXNlIFwiaHRtbFwiOlxuICAgICAgICByZXR1cm4gdGhpcy5nZXRIdG1sKGVkaXRvcik7XG4gICAgICBjYXNlIFwibWFya2Rvd25cIjpcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TWFya2Rvd24oZWRpdG9yKTtcbiAgICAgIGNhc2UgXCJ0ZXh0XCI6XG4gICAgICAgIHJldHVybiB0aGlzLmdldFRleHQoZWRpdG9yKTtcbiAgICB9XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gRXhwb3J0IE1ldGhvZHNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIENvcGllcyB0aGUgZWRpdG9yIGNvbnRlbnQgdG8gdGhlIGNsaXBib2FyZC4gKi9cbiAgYXN5bmMgZXhwb3J0VG9DbGlwYm9hcmQoZWRpdG9yOiBFZGl0b3IsIGZvcm1hdDogQXRlRXhwb3J0Rm9ybWF0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY29udGVudCA9IHRoaXMuZ2V0Q29udGVudChlZGl0b3IsIGZvcm1hdCk7XG4gICAgYXdhaXQgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQoY29udGVudCk7XG4gIH1cblxuICAvKiogRG93bmxvYWRzIHRoZSBlZGl0b3IgY29udGVudCBhcyBhIGZpbGUuICovXG4gIGV4cG9ydFRvRmlsZShlZGl0b3I6IEVkaXRvciwgZm9ybWF0OiBBdGVFeHBvcnRGb3JtYXQsIG9wdGlvbnM/OiBBdGVFeHBvcnRPcHRpb25zKTogdm9pZCB7XG4gICAgY29uc3QgY29udGVudCA9IHRoaXMuZ2V0Q29udGVudChlZGl0b3IsIGZvcm1hdCk7XG4gICAgY29uc3QgYmFzZU5hbWUgPSBvcHRpb25zPy5maWxlbmFtZSB8fCBcImRvY3VtZW50XCI7XG5cbiAgICBjb25zdCBleHRlbnNpb25zOiBSZWNvcmQ8QXRlRXhwb3J0Rm9ybWF0LCBzdHJpbmc+ID0ge1xuICAgICAgaHRtbDogXCJodG1sXCIsXG4gICAgICBtYXJrZG93bjogXCJtZFwiLFxuICAgICAgdGV4dDogXCJ0eHRcIixcbiAgICB9O1xuICAgIGNvbnN0IG1pbWVUeXBlczogUmVjb3JkPEF0ZUV4cG9ydEZvcm1hdCwgc3RyaW5nPiA9IHtcbiAgICAgIGh0bWw6IFwidGV4dC9odG1sO2NoYXJzZXQ9dXRmLThcIixcbiAgICAgIG1hcmtkb3duOiBcInRleHQvbWFya2Rvd247Y2hhcnNldD11dGYtOFwiLFxuICAgICAgdGV4dDogXCJ0ZXh0L3BsYWluO2NoYXJzZXQ9dXRmLThcIixcbiAgICB9O1xuXG4gICAgY29uc3QgZmlsZW5hbWUgPSBgJHtiYXNlTmFtZX0uJHtleHRlbnNpb25zW2Zvcm1hdF19YDtcbiAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW2NvbnRlbnRdLCB7IHR5cGU6IG1pbWVUeXBlc1tmb3JtYXRdIH0pO1xuICAgIGNvbnN0IHVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG5cbiAgICBjb25zdCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImFcIik7XG4gICAgbGluay5ocmVmID0gdXJsO1xuICAgIGxpbmsuZG93bmxvYWQgPSBmaWxlbmFtZTtcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGxpbmspO1xuICAgIGxpbmsuY2xpY2soKTtcbiAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGxpbmspO1xuICAgIFVSTC5yZXZva2VPYmplY3RVUkwodXJsKTtcbiAgfVxufVxuIl19
|