@flogeez/angular-tiptap-editor 2.4.0 → 2.4.1

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