@hmcts/media-viewer 4.1.8 → 4.1.9-exui-1580

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 (34) hide show
  1. package/assets/all.scss +1 -0
  2. package/assets/sass/pdf-viewer.scss +79 -1
  3. package/assets/sass/tooltip.scss +50 -0
  4. package/esm2022/lib/annotations/annotation-set/annotation-create/highlight-create/highlight-create.directive.mjs +80 -21
  5. package/esm2022/lib/annotations/annotation-set/annotation-create/highlight-create/keyboard-text-highlight.directive.mjs +354 -0
  6. package/esm2022/lib/annotations/annotation-set/annotation-view/annotation-view.component.mjs +1 -1
  7. package/esm2022/lib/annotations/annotation-set/ctx-toolbar/ctx-toolbar.component.mjs +31 -5
  8. package/esm2022/lib/annotations/annotation-set/metadata-layer/metadata-layer.component.mjs +17 -4
  9. package/esm2022/lib/media-viewer.module.mjs +4 -1
  10. package/esm2022/lib/shared/directives/tooltip-dismiss.directive.mjs +36 -0
  11. package/esm2022/lib/toolbar/highlight-toolbar/highlight-toolbar.component.mjs +6 -4
  12. package/esm2022/lib/toolbar/main-toolbar/main-toolbar.component.mjs +5 -4
  13. package/esm2022/lib/toolbar/redaction-toolbar/redaction-toolbar.component.mjs +5 -4
  14. package/esm2022/lib/toolbar/toolbar.module.mjs +7 -4
  15. package/esm2022/lib/viewers/pdf-viewer/pdf-viewer.component.mjs +45 -7
  16. package/fesm2022/hmcts-media-viewer.mjs +1448 -926
  17. package/fesm2022/hmcts-media-viewer.mjs.map +1 -1
  18. package/lib/annotations/annotation-set/annotation-create/highlight-create/highlight-create.directive.d.ts +6 -2
  19. package/lib/annotations/annotation-set/annotation-create/highlight-create/highlight-create.directive.d.ts.map +1 -1
  20. package/lib/annotations/annotation-set/annotation-create/highlight-create/keyboard-text-highlight.directive.d.ts +63 -0
  21. package/lib/annotations/annotation-set/annotation-create/highlight-create/keyboard-text-highlight.directive.d.ts.map +1 -0
  22. package/lib/annotations/annotation-set/ctx-toolbar/ctx-toolbar.component.d.ts +6 -2
  23. package/lib/annotations/annotation-set/ctx-toolbar/ctx-toolbar.component.d.ts.map +1 -1
  24. package/lib/annotations/annotation-set/metadata-layer/metadata-layer.component.d.ts +3 -0
  25. package/lib/annotations/annotation-set/metadata-layer/metadata-layer.component.d.ts.map +1 -1
  26. package/lib/media-viewer.module.d.ts +19 -18
  27. package/lib/media-viewer.module.d.ts.map +1 -1
  28. package/lib/shared/directives/tooltip-dismiss.directive.d.ts +11 -0
  29. package/lib/shared/directives/tooltip-dismiss.directive.d.ts.map +1 -0
  30. package/lib/toolbar/toolbar.module.d.ts +7 -6
  31. package/lib/toolbar/toolbar.module.d.ts.map +1 -1
  32. package/lib/viewers/pdf-viewer/pdf-viewer.component.d.ts +20 -0
  33. package/lib/viewers/pdf-viewer/pdf-viewer.component.d.ts.map +1 -1
  34. package/package.json +2 -2
@@ -0,0 +1,354 @@
1
+ import { Directive, EventEmitter, HostListener, Input, Output } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export class KeyboardTextHighlightDirective {
4
+ set enabled(value) {
5
+ const wasEnabled = this._enabled;
6
+ this._enabled = value;
7
+ // Don't auto-initialize cursor - let it appear on first arrow key press
8
+ // This prevents the Enter key from the button click triggering startTextSelection
9
+ }
10
+ get enabled() {
11
+ return this._enabled;
12
+ }
13
+ static { this.lastInteractionWasKeyboard = false; }
14
+ constructor(elementRef) {
15
+ this.elementRef = elementRef;
16
+ this._enabled = false;
17
+ this.incrementSmall = 5;
18
+ this.incrementMedium = 10;
19
+ this.incrementLarge = 20;
20
+ this.selectionStarted = new EventEmitter();
21
+ this.selectionUpdated = new EventEmitter();
22
+ this.selectionConfirmed = new EventEmitter();
23
+ this.selectionCancelled = new EventEmitter();
24
+ this.cursorPositionChanged = new EventEmitter();
25
+ this.selectionCursorPositionChanged = new EventEmitter();
26
+ this.isSelecting = false;
27
+ this.showCursor = false;
28
+ this.lastValidEndNode = null;
29
+ this.lastValidEndOffset = 0;
30
+ if (typeof window !== 'undefined') {
31
+ window.addEventListener('keydown', KeyboardTextHighlightDirective.onGlobalKeyDown, { capture: true });
32
+ window.addEventListener('mousedown', KeyboardTextHighlightDirective.onGlobalMouseDown, { capture: true });
33
+ }
34
+ }
35
+ static onGlobalKeyDown() {
36
+ KeyboardTextHighlightDirective.lastInteractionWasKeyboard = true;
37
+ }
38
+ static onGlobalMouseDown() {
39
+ KeyboardTextHighlightDirective.lastInteractionWasKeyboard = false;
40
+ }
41
+ ngOnDestroy() {
42
+ this.cleanup();
43
+ }
44
+ onKeyDown(event) {
45
+ if (!this.enabled) {
46
+ return;
47
+ }
48
+ if (event.key === 'Enter') {
49
+ event.preventDefault();
50
+ event.stopPropagation();
51
+ if (!this.isSelecting) {
52
+ this.startTextSelection();
53
+ }
54
+ else {
55
+ this.confirmTextSelection();
56
+ }
57
+ return;
58
+ }
59
+ if (event.key === 'Escape') {
60
+ event.preventDefault();
61
+ event.stopPropagation();
62
+ if (this.isSelecting) {
63
+ this.cancelTextSelection();
64
+ }
65
+ else if (this.showCursor) {
66
+ this.hideCursor();
67
+ }
68
+ return;
69
+ }
70
+ if (['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight'].includes(event.key)) {
71
+ event.preventDefault();
72
+ event.stopPropagation();
73
+ if (this.isSelecting) {
74
+ this.expandTextSelection(event);
75
+ }
76
+ else {
77
+ this.moveCursor(event);
78
+ }
79
+ }
80
+ }
81
+ onBlur() {
82
+ if (this.showCursor && !this.isSelecting) {
83
+ this.hideCursor();
84
+ }
85
+ }
86
+ moveCursor(event) {
87
+ const increment = event.shiftKey ? this.incrementLarge : this.incrementMedium;
88
+ if (!this.showCursor) {
89
+ // we use window dimensions because we're using fixed positioning
90
+ const viewportWidth = window.innerWidth;
91
+ const viewportHeight = window.innerHeight;
92
+ this.cursorX = viewportWidth / 2;
93
+ this.cursorY = viewportHeight / 2;
94
+ this.showCursor = true;
95
+ this.emitCursorPosition();
96
+ return;
97
+ }
98
+ const viewportWidth = window.innerWidth;
99
+ const viewportHeight = window.innerHeight;
100
+ switch (event.key) {
101
+ case 'ArrowUp':
102
+ this.cursorY = Math.max(0, this.cursorY - increment);
103
+ break;
104
+ case 'ArrowDown':
105
+ this.cursorY = Math.min(viewportHeight, this.cursorY + increment);
106
+ break;
107
+ case 'ArrowLeft':
108
+ this.cursorX = Math.max(0, this.cursorX - increment);
109
+ break;
110
+ case 'ArrowRight':
111
+ this.cursorX = Math.min(viewportWidth, this.cursorX + increment);
112
+ break;
113
+ }
114
+ this.emitCursorPosition();
115
+ }
116
+ startTextSelection() {
117
+ if (this.showCursor) {
118
+ this.selectionStartX = this.cursorX;
119
+ this.selectionStartY = this.cursorY;
120
+ this.selectionEndX = this.cursorX;
121
+ this.selectionEndY = this.cursorY;
122
+ this.showCursor = false;
123
+ this.emitCursorPosition();
124
+ }
125
+ else {
126
+ // default to center
127
+ this.selectionStartX = window.innerWidth / 2;
128
+ this.selectionStartY = window.innerHeight / 2;
129
+ this.selectionEndX = this.selectionStartX;
130
+ this.selectionEndY = this.selectionStartY;
131
+ }
132
+ this.isSelecting = true;
133
+ this.currentPage = this.getCurrentPageNumber();
134
+ this.lastValidEndNode = null;
135
+ this.lastValidEndOffset = 0;
136
+ this.selectionCursorPositionChanged.emit({
137
+ x: this.selectionEndX,
138
+ y: this.selectionEndY,
139
+ visible: true
140
+ });
141
+ this.createTextSelectionAtPoint(this.selectionStartX, this.selectionStartY);
142
+ this.selectionStarted.emit();
143
+ }
144
+ expandTextSelection(event) {
145
+ const increment = event.shiftKey ? this.incrementLarge : this.incrementSmall;
146
+ const viewportWidth = window.innerWidth;
147
+ const viewportHeight = window.innerHeight;
148
+ switch (event.key) {
149
+ case 'ArrowRight':
150
+ this.selectionEndX = Math.min(viewportWidth, this.selectionEndX + increment);
151
+ break;
152
+ case 'ArrowLeft':
153
+ this.selectionEndX = Math.max(0, this.selectionEndX - increment);
154
+ break;
155
+ case 'ArrowDown':
156
+ this.selectionEndY = Math.min(viewportHeight, this.selectionEndY + increment);
157
+ break;
158
+ case 'ArrowUp':
159
+ this.selectionEndY = Math.max(0, this.selectionEndY - increment);
160
+ break;
161
+ }
162
+ this.selectionCursorPositionChanged.emit({
163
+ x: this.selectionEndX,
164
+ y: this.selectionEndY,
165
+ visible: true
166
+ });
167
+ this.updateTextSelection();
168
+ this.emitSelectionUpdated();
169
+ }
170
+ createTextSelectionAtPoint(viewportX, viewportY) {
171
+ const selection = window.getSelection();
172
+ // get precise caret position at the coordinates
173
+ // caretPositionFromPoint is standard but not supported in all browsers
174
+ // caretRangeFromPoint is older and supported in more browsers
175
+ let range = null;
176
+ if (document.caretPositionFromPoint) {
177
+ const caretPosition = document.caretPositionFromPoint(viewportX, viewportY);
178
+ if (caretPosition) {
179
+ range = document.createRange();
180
+ range.setStart(caretPosition.offsetNode, caretPosition.offset);
181
+ range.collapse(true);
182
+ }
183
+ }
184
+ else if (document.caretRangeFromPoint) {
185
+ range = document.caretRangeFromPoint(viewportX, viewportY);
186
+ }
187
+ if (range) {
188
+ selection.removeAllRanges();
189
+ selection.addRange(range);
190
+ }
191
+ }
192
+ updateTextSelection() {
193
+ const selection = window.getSelection();
194
+ if (!selection || selection.rangeCount === 0) {
195
+ return;
196
+ }
197
+ const range = selection.getRangeAt(0);
198
+ const startNode = range.startContainer;
199
+ const startOffset = range.startOffset;
200
+ // get end position using caret APIs
201
+ // caretPositionFromPoint is standard but not supported in all browsers
202
+ // caretRangeFromPoint is older and supported in more browsers
203
+ let endNode = null;
204
+ let endOffset = 0;
205
+ if (document.caretPositionFromPoint) {
206
+ const caretPosition = document.caretPositionFromPoint(this.selectionEndX, this.selectionEndY);
207
+ if (caretPosition) {
208
+ endNode = caretPosition.offsetNode;
209
+ endOffset = caretPosition.offset;
210
+ }
211
+ }
212
+ else if (document.caretRangeFromPoint) {
213
+ const caretRange = document.caretRangeFromPoint(this.selectionEndX, this.selectionEndY);
214
+ if (caretRange) {
215
+ endNode = caretRange.startContainer;
216
+ endOffset = caretRange.startOffset;
217
+ }
218
+ }
219
+ if (endNode) {
220
+ const range = document.createRange();
221
+ range.setStart(startNode, startOffset);
222
+ range.setEnd(endNode, endOffset);
223
+ const isBackward = range.collapsed && (startNode !== endNode || endOffset < startOffset);
224
+ const comparison = startNode.compareDocumentPosition(endNode);
225
+ const endBeforeStart = (comparison & Node.DOCUMENT_POSITION_PRECEDING) !== 0;
226
+ if (isBackward || endBeforeStart) {
227
+ if (this.lastValidEndNode) {
228
+ endNode = this.lastValidEndNode;
229
+ endOffset = this.lastValidEndOffset;
230
+ }
231
+ else {
232
+ endNode = startNode;
233
+ endOffset = startOffset;
234
+ }
235
+ }
236
+ else {
237
+ this.lastValidEndNode = endNode;
238
+ this.lastValidEndOffset = endOffset;
239
+ }
240
+ // use setBaseAndExtent to handle selection direction with precise offsets
241
+ // to ensure the selection always starts from the original start point
242
+ // and extends to the exact character position at the cursor
243
+ selection.setBaseAndExtent(startNode, startOffset, endNode, endOffset);
244
+ }
245
+ }
246
+ confirmTextSelection() {
247
+ this.selectionConfirmed.emit();
248
+ this.selectionCursorPositionChanged.emit({
249
+ x: this.selectionEndX,
250
+ y: this.selectionEndY,
251
+ visible: false
252
+ });
253
+ this.cleanup();
254
+ }
255
+ cancelTextSelection() {
256
+ const selection = window.getSelection();
257
+ if (selection) {
258
+ selection.removeAllRanges();
259
+ }
260
+ this.selectionCancelled.emit();
261
+ this.selectionCursorPositionChanged.emit({
262
+ x: this.selectionEndX,
263
+ y: this.selectionEndY,
264
+ visible: false
265
+ });
266
+ this.cleanup();
267
+ }
268
+ hideCursor() {
269
+ this.showCursor = false;
270
+ this.emitCursorPosition();
271
+ }
272
+ cleanup() {
273
+ this.isSelecting = false;
274
+ this.showCursor = false;
275
+ this.cursorX = undefined;
276
+ this.cursorY = undefined;
277
+ this.selectionStartX = undefined;
278
+ this.selectionStartY = undefined;
279
+ this.selectionEndX = undefined;
280
+ this.selectionEndY = undefined;
281
+ this.currentPage = undefined;
282
+ this.lastValidEndNode = null;
283
+ this.lastValidEndOffset = 0;
284
+ }
285
+ getCurrentPageNumber() {
286
+ let currentElement = this.elementRef.nativeElement;
287
+ while (currentElement && currentElement.offsetParent) {
288
+ currentElement = currentElement.offsetParent;
289
+ if (currentElement.getAttribute) {
290
+ const page = parseInt(currentElement.getAttribute('data-page-number'), 10);
291
+ if (page) {
292
+ return page;
293
+ }
294
+ }
295
+ }
296
+ return 1;
297
+ }
298
+ emitCursorPosition() {
299
+ const position = {
300
+ x: this.cursorX,
301
+ y: this.cursorY,
302
+ visible: this.showCursor
303
+ };
304
+ this.cursorPositionChanged.emit(position);
305
+ }
306
+ emitSelectionUpdated() {
307
+ this.selectionUpdated.emit({
308
+ page: this.currentPage,
309
+ startX: this.selectionStartX,
310
+ startY: this.selectionStartY,
311
+ endX: this.selectionEndX,
312
+ endY: this.selectionEndY
313
+ });
314
+ }
315
+ reset() {
316
+ this.cleanup();
317
+ this.emitCursorPosition();
318
+ }
319
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: KeyboardTextHighlightDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive }); }
320
+ /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: KeyboardTextHighlightDirective, selector: "[mvKeyboardTextHighlight]", inputs: { enabled: "enabled", incrementSmall: "incrementSmall", incrementMedium: "incrementMedium", incrementLarge: "incrementLarge" }, outputs: { selectionStarted: "selectionStarted", selectionUpdated: "selectionUpdated", selectionConfirmed: "selectionConfirmed", selectionCancelled: "selectionCancelled", cursorPositionChanged: "cursorPositionChanged", selectionCursorPositionChanged: "selectionCursorPositionChanged" }, host: { listeners: { "keydown": "onKeyDown($event)", "blur": "onBlur()" } }, ngImport: i0 }); }
321
+ }
322
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: KeyboardTextHighlightDirective, decorators: [{
323
+ type: Directive,
324
+ args: [{
325
+ selector: '[mvKeyboardTextHighlight]'
326
+ }]
327
+ }], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { enabled: [{
328
+ type: Input
329
+ }], incrementSmall: [{
330
+ type: Input
331
+ }], incrementMedium: [{
332
+ type: Input
333
+ }], incrementLarge: [{
334
+ type: Input
335
+ }], selectionStarted: [{
336
+ type: Output
337
+ }], selectionUpdated: [{
338
+ type: Output
339
+ }], selectionConfirmed: [{
340
+ type: Output
341
+ }], selectionCancelled: [{
342
+ type: Output
343
+ }], cursorPositionChanged: [{
344
+ type: Output
345
+ }], selectionCursorPositionChanged: [{
346
+ type: Output
347
+ }], onKeyDown: [{
348
+ type: HostListener,
349
+ args: ['keydown', ['$event']]
350
+ }], onBlur: [{
351
+ type: HostListener,
352
+ args: ['blur']
353
+ }] } });
354
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5Ym9hcmQtdGV4dC1oaWdobGlnaHQuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbWVkaWEtdmlld2VyL3NyYy9saWIvYW5ub3RhdGlvbnMvYW5ub3RhdGlvbi1zZXQvYW5ub3RhdGlvbi1jcmVhdGUvaGlnaGxpZ2h0LWNyZWF0ZS9rZXlib2FyZC10ZXh0LWhpZ2hsaWdodC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBYyxZQUFZLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBYSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBbUI1RyxNQUFNLE9BQU8sOEJBQThCO0lBRXpDLElBQWEsT0FBTyxDQUFDLEtBQWM7UUFDakMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUNqQyxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztRQUV0Qix3RUFBd0U7UUFDeEUsa0ZBQWtGO0lBQ3BGLENBQUM7SUFDRCxJQUFJLE9BQU87UUFDVCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQzthQXlCYywrQkFBMEIsR0FBRyxLQUFLLEFBQVIsQ0FBUztJQUVsRCxZQUFvQixVQUFtQztRQUFuQyxlQUFVLEdBQVYsVUFBVSxDQUF5QjtRQTFCL0MsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUVoQixtQkFBYyxHQUFHLENBQUMsQ0FBQztRQUNuQixvQkFBZSxHQUFHLEVBQUUsQ0FBQztRQUNyQixtQkFBYyxHQUFHLEVBQUUsQ0FBQztRQUVuQixxQkFBZ0IsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBQzVDLHFCQUFnQixHQUFHLElBQUksWUFBWSxFQUE4QixDQUFDO1FBQ2xFLHVCQUFrQixHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFDOUMsdUJBQWtCLEdBQUcsSUFBSSxZQUFZLEVBQVEs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QyxhQUFhO1lBQ3hCLElBQUksRUFBRSxJQUFJLENBQUMsYUFBYTtTQUN6QixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0sS0FBSztRQUNWLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNmLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBQzVCLENBQUM7a0lBeFhVLDhCQUE4QjtzSEFBOUIsOEJBQThCOzs0RkFBOUIsOEJBQThCO2tCQUgxQyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSwyQkFBMkI7aUJBQ3RDOytFQUdjLE9BQU87c0JBQW5CLEtBQUs7Z0JBWUcsY0FBYztzQkFBdEIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBRUksZ0JBQWdCO3NCQUF6QixNQUFNO2dCQUNHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFDRyxrQkFBa0I7c0JBQTNCLE1BQU07Z0JBQ0csa0JBQWtCO3NCQUEzQixNQUFNO2dCQUNHLHFCQUFxQjtzQkFBOUIsTUFBTTtnQkFDRyw4QkFBOEI7c0JBQXZDLE1BQU07Z0JBbUNQLFNBQVM7c0JBRFIsWUFBWTt1QkFBQyxTQUFTLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBMkNuQyxNQUFNO3NCQURMLFlBQVk7dUJBQUMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBIb3N0TGlzdGVuZXIsIElucHV0LCBPbkRlc3Ryb3ksIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEtleWJvYXJkVGV4dEhpZ2hsaWdodEV2ZW50IHtcbiAgcGFnZTogbnVtYmVyO1xuICBzdGFydFg6IG51bWJlcjtcbiAgc3RhcnRZOiBudW1iZXI7XG4gIGVuZFg6IG51bWJlcjtcbiAgZW5kWTogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEN1cnNvclBvc2l0aW9uIHtcbiAgeDogbnVtYmVyO1xuICB5OiBudW1iZXI7XG4gIHZpc2libGU6IGJvb2xlYW47XG59XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1ttdktleWJvYXJkVGV4dEhpZ2hsaWdodF0nXG59KVxuZXhwb3J0IGNsYXNzIEtleWJvYXJkVGV4dEhpZ2hsaWdodERpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG5cbiAgQElucHV0KCkgc2V0IGVuYWJsZWQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICBjb25zdCB3YXNFbmFibGVkID0gdGhpcy5fZW5hYmxlZDtcbiAgICB0aGlzLl9lbmFibGVkID0gdmFsdWU7XG5cbiAgICAvLyBEb24ndCBhdXRvLWluaXRpYWxpemUgY3Vyc29yIC0gbGV0IGl0IGFwcGVhciBvbiBmaXJzdCBhcnJvdyBrZXkgcHJlc3NcbiAgICAvLyBUaGlzIHByZXZlbnRzIHRoZSBFbnRlciBrZXkgZnJvbSB0aGUgYnV0dG9uIGNsaWNrIHRyaWdnZXJpbmcgc3RhcnRUZXh0U2VsZWN0aW9uXG4gIH1cbiAgZ2V0IGVuYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2VuYWJsZWQ7XG4gIH1cbiAgcHJpdmF0ZSBfZW5hYmxlZCA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIGluY3JlbWVudFNtYWxsID0gNTtcbiAgQElucHV0KCkgaW5jcmVtZW50TWVkaXVtID0gMTA7XG4gIEBJbnB1dCgpIGluY3JlbWVudExhcmdlID0gMjA7XG5cbiAgQE91dHB1dCgpIHNlbGVjdGlvblN0YXJ0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBzZWxlY3Rpb25VcGRhdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxLZXlib2FyZFRleHRIaWdobGlnaHRFdmVudD4oKTtcbiAgQE91dHB1dCgpIHNlbGVjdGlvbkNvbmZpcm1lZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIHNlbGVjdGlvbkNhbmNlbGxlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIGN1cnNvclBvc2l0aW9uQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Q3Vyc29yUG9zaXRpb24+KCk7XG4gIEBPdXRwdXQoKSBzZWxlY3Rpb25DdXJzb3JQb3NpdGlvbkNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEN1cnNvclBvc2l0aW9uPigpO1xuXG4gIHByaXZhdGUgaXNTZWxlY3RpbmcgPSBmYWxzZTtcbiAgcHJpdmF0ZSBjdXJzb3JYOiBudW1iZXI7XG4gIHByaXZhdGUgY3Vyc29yWTogbnVtYmVyO1xuICBwcml2YXRlIHNob3dDdXJzb3IgPSBmYWxzZTtcbiAgcHJpdmF0ZSBzZWxlY3Rpb25TdGFydFg6IG51bWJlcjtcbiAgcHJpdmF0ZSBzZWxlY3Rpb25TdGFydFk6IG51bWJlcjtcbiAgcHJpdmF0ZSBzZWxlY3Rpb25FbmRYOiBudW1iZXI7XG4gIHByaXZhdGUgc2VsZWN0aW9uRW5kWTogbnVtYmVyO1xuICBwcml2YXRlIGN1cnJlbnRQYWdlOiBudW1iZXI7XG4gIHByaXZhdGUgbGFzdFZhbGlkRW5kTm9kZTogTm9kZSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGxhc3RWYWxpZEVuZE9mZnNldDogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSBzdGF0aWMgbGFzdEludGVyYWN0aW9uV2FzS2V5Ym9hcmQgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+KSB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIEtleWJvYXJkVGV4dEhpZ2hsaWdodERpcmVjdGl2ZS5vbkdsb2JhbEtleURvd24sIHsgY2FwdHVyZTogdHJ1ZSB9KTtcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBLZXlib2FyZFRleHRIaWdobGlnaHREaXJlY3RpdmUub25HbG9iYWxNb3VzZURvd24sIHsgY2FwdHVyZTogdHJ1ZSB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBvbkdsb2JhbEtleURvd24oKTogdm9pZCB7XG4gICAgS2V5Ym9hcmRUZXh0SGlnaGxpZ2h0RGlyZWN0aXZlLmxhc3RJbnRlcmFjdGlvbldhc0tleWJvYXJkID0gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIG9uR2xvYmFsTW91c2VEb3duKCk6IHZvaWQge1xuICAgIEtleWJvYXJkVGV4dEhpZ2hsaWdodERpcmVjdGl2ZS5sYXN0SW50ZXJhY3Rpb25XYXNLZXlib2FyZCA9IGZhbHNlO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5jbGVhbnVwKCk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdrZXlkb3duJywgWyckZXZlbnQnXSlcbiAgb25LZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmVuYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZXZlbnQua2V5ID09PSAnRW50ZXInKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgIGlmICghdGhpcy5pc1NlbGVjdGluZykge1xuICAgICAgICB0aGlzLnN0YXJ0VGV4dFNlbGVjdGlvbigpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jb25maXJtVGV4dFNlbGVjdGlvbigpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChldmVudC5rZXkgPT09ICdFc2NhcGUnKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgIGlmICh0aGlzLmlzU2VsZWN0aW5nKSB7XG4gICAgICAgIHRoaXMuY2FuY2VsVGV4dFNlbGVjdGlvbigpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnNob3dDdXJzb3IpIHtcbiAgICAgICAgdGhpcy5oaWRlQ3Vyc29yKCk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKFsnQXJyb3dVcCcsICdBcnJvd0Rvd24nLCAnQXJyb3dMZWZ0JywgJ0Fycm93UmlnaHQnXS5pbmNsdWRlcyhldmVudC5rZXkpKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgIGlmICh0aGlzLmlzU2VsZWN0aW5nKSB7XG4gICAgICAgIHRoaXMuZXhwYW5kVGV4dFNlbGVjdGlvbihldmVudCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm1vdmVDdXJzb3IoZXZlbnQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2JsdXInKVxuICBvbkJsdXIoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2hvd0N1cnNvciAmJiAhdGhpcy5pc1NlbGVjdGluZykge1xuICAgICAgdGhpcy5oaWRlQ3Vyc29yKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBtb3ZlQ3Vyc29yKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgaW5jcmVtZW50ID0gZXZlbnQuc2hpZnRLZXkgPyB0aGlzLmluY3JlbWVudExhcmdlIDogdGhpcy5pbmNyZW1lbnRNZWRpdW07XG5cbiAgICBpZiAoIXRoaXMuc2hvd0N1cnNvcikge1xuICAgICAgLy8gd2UgdXNlIHdpbmRvdyBkaW1lbnNpb25zIGJlY2F1c2Ugd2UncmUgdXNpbmcgZml4ZWQgcG9zaXRpb25pbmdcbiAgICAgIGNvbnN0IHZpZXdwb3J0V2lkdGggPSB3aW5kb3cuaW5uZXJXaWR0aDtcbiAgICAgIGNvbnN0IHZpZXdwb3J0SGVpZ2h0ID0gd2luZG93LmlubmVySGVpZ2h0O1xuXG4gICAgICB0aGlzLmN1cnNvclggPSB2aWV3cG9ydFdpZHRoIC8gMjtcbiAgICAgIHRoaXMuY3Vyc29yWSA9IHZpZXdwb3J0SGVpZ2h0IC8gMjtcbiAgICAgIHRoaXMuc2hvd0N1cnNvciA9IHRydWU7XG5cbiAgICAgIHRoaXMuZW1pdEN1cnNvclBvc2l0aW9uKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgdmlld3BvcnRXaWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoO1xuICAgIGNvbnN0IHZpZXdwb3J0SGVpZ2h0ID0gd2luZG93LmlubmVySGVpZ2h0O1xuXG4gICAgc3dpdGNoIChldmVudC5rZXkpIHtcbiAgICAgIGNhc2UgJ0Fycm93VXAnOlxuICAgICAgICB0aGlzLmN1cnNvclkgPSBNYXRoLm1heCgwLCB0aGlzLmN1cnNvclkgLSBpbmNyZW1lbnQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0Fycm93RG93bic6XG4gICAgICAgIHRoaXMuY3Vyc29yWSA9IE1hdGgubWluKHZpZXdwb3J0SGVpZ2h0LCB0aGlzLmN1cnNvclkgKyBpbmNyZW1lbnQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0Fycm93TGVmdCc6XG4gICAgICAgIHRoaXMuY3Vyc29yWCA9IE1hdGgubWF4KDAsIHRoaXMuY3Vyc29yWCAtIGluY3JlbWVudCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnQXJyb3dSaWdodCc6XG4gICAgICAgIHRoaXMuY3Vyc29yWCA9IE1hdGgubWluKHZpZXdwb3J0V2lkdGgsIHRoaXMuY3Vyc29yWCArIGluY3JlbWVudCk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHRoaXMuZW1pdEN1cnNvclBvc2l0aW9uKCk7XG4gIH1cblxuICAgIHByaXZhdGUgc3RhcnRUZXh0U2VsZWN0aW9uKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNob3dDdXJzb3IpIHtcbiAgICAgIHRoaXMuc2VsZWN0aW9uU3RhcnRYID0gdGhpcy5jdXJzb3JYO1xuICAgICAgdGhpcy5zZWxlY3Rpb25TdGFydFkgPSB0aGlzLmN1cnNvclk7XG4gICAgICB0aGlzLnNlbGVjdGlvbkVuZFggPSB0aGlzLmN1cnNvclg7XG4gICAgICB0aGlzLnNlbGVjdGlvbkVuZFkgPSB0aGlzLmN1cnNvclk7XG4gICAgICB0aGlzLnNob3dDdXJzb3IgPSBmYWxzZTtcbiAgICAgIHRoaXMuZW1pdEN1cnNvclBvc2l0aW9uKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGRlZmF1bHQgdG8gY2VudGVyXG4gICAgICB0aGlzLnNlbGVjdGlvblN0YXJ0WCA9IHdpbmRvdy5pbm5lcldpZHRoIC8gMjtcbiAgICAgIHRoaXMuc2VsZWN0aW9uU3RhcnRZID0gd2luZG93LmlubmVySGVpZ2h0IC8gMjtcbiAgICAgIHRoaXMuc2VsZWN0aW9uRW5kWCA9IHRoaXMuc2VsZWN0aW9uU3RhcnRYO1xuICAgICAgdGhpcy5zZWxlY3Rpb25FbmRZID0gdGhpcy5zZWxlY3Rpb25TdGFydFk7XG4gICAgfVxuXG4gICAgdGhpcy5pc1NlbGVjdGluZyA9IHRydWU7XG4gICAgdGhpcy5jdXJyZW50UGFnZSA9IHRoaXMuZ2V0Q3VycmVudFBhZ2VOdW1iZXIoKTtcbiAgICB0aGlzLmxhc3RWYWxpZEVuZE5vZGUgPSBudWxsO1xuICAgIHRoaXMubGFzdFZhbGlkRW5kT2Zmc2V0ID0gMDtcblxuICAgIHRoaXMuc2VsZWN0aW9uQ3Vyc29yUG9zaXRpb25DaGFuZ2VkLmVtaXQoe1xuICAgICAgeDogdGhpcy5zZWxlY3Rpb25FbmRYLFxuICAgICAgeTogdGhpcy5zZWxlY3Rpb25FbmRZLFxuICAgICAgdmlzaWJsZTogdHJ1ZVxuICAgIH0pO1xuXG4gICAgdGhpcy5jcmVhdGVUZXh0U2VsZWN0aW9uQXRQb2ludCh0aGlzLnNlbGVjdGlvblN0YXJ0WCwgdGhpcy5zZWxlY3Rpb25TdGFydFkpO1xuXG4gICAgdGhpcy5zZWxlY3Rpb25TdGFydGVkLmVtaXQoKTtcbiAgfVxuXG4gIHByaXZhdGUgZXhwYW5kVGV4dFNlbGVjdGlvbihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGluY3JlbWVudCA9IGV2ZW50LnNoaWZ0S2V5ID8gdGhpcy5pbmNyZW1lbnRMYXJnZSA6IHRoaXMuaW5jcmVtZW50U21hbGw7XG5cbiAgICBjb25zdCB2aWV3cG9ydFdpZHRoID0gd2luZG93LmlubmVyV2lkdGg7XG4gICAgY29uc3Qgdmlld3BvcnRIZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQ7XG5cbiAgICBzd2l0Y2ggKGV2ZW50LmtleSkge1xuICAgICAgY2FzZSAnQXJyb3dSaWdodCc6XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uRW5kWCA9IE1hdGgubWluKHZpZXdwb3J0V2lkdGgsIHRoaXMuc2VsZWN0aW9uRW5kWCArIGluY3JlbWVudCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnQXJyb3dMZWZ0JzpcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25FbmRYID0gTWF0aC5tYXgoMCwgdGhpcy5zZWxlY3Rpb25FbmRYIC0gaW5jcmVtZW50KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdBcnJvd0Rvd24nOlxuICAgICAgICB0aGlzLnNlbGVjdGlvbkVuZFkgPSBNYXRoLm1pbih2aWV3cG9ydEhlaWdodCwgdGhpcy5zZWxlY3Rpb25FbmRZICsgaW5jcmVtZW50KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdBcnJvd1VwJzpcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25FbmRZID0gTWF0aC5tYXgoMCwgdGhpcy5zZWxlY3Rpb25FbmRZIC0gaW5jcmVtZW50KTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgdGhpcy5zZWxlY3Rpb25DdXJzb3JQb3NpdGlvbkNoYW5nZWQuZW1pdCh7XG4gICAgICB4OiB0aGlzLnNlbGVjdGlvbkVuZFgsXG4gICAgICB5OiB0aGlzLnNlbGVjdGlvbkVuZFksXG4gICAgICB2aXNpYmxlOiB0cnVlXG4gICAgfSk7XG5cbiAgICB0aGlzLnVwZGF0ZVRleHRTZWxlY3Rpb24oKTtcblxuICAgIHRoaXMuZW1pdFNlbGVjdGlvblVwZGF0ZWQoKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlVGV4dFNlbGVjdGlvbkF0UG9pbnQodmlld3BvcnRYOiBudW1iZXIsIHZpZXdwb3J0WTogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuXG4gICAgLy8gZ2V0IHByZWNpc2UgY2FyZXQgcG9zaXRpb24gYXQgdGhlIGNvb3JkaW5hdGVzXG4gICAgLy8gY2FyZXRQb3NpdGlvbkZyb21Qb2ludCBpcyBzdGFuZGFyZCBidXQgbm90IHN1cHBvcnRlZCBpbiBhbGwgYnJvd3NlcnNcbiAgICAvLyBjYXJldFJhbmdlRnJvbVBvaW50IGlzIG9sZGVyIGFuZCBzdXBwb3J0ZWQgaW4gbW9yZSBicm93c2Vyc1xuICAgIGxldCByYW5nZTogUmFuZ2UgfCBudWxsID0gbnVsbDtcblxuICAgIGlmICgoZG9jdW1lbnQgYXMgYW55KS5jYXJldFBvc2l0aW9uRnJvbVBvaW50KSB7XG4gICAgICBjb25zdCBjYXJldFBvc2l0aW9uID0gKGRvY3VtZW50IGFzIGFueSkuY2FyZXRQb3NpdGlvbkZyb21Qb2ludCh2aWV3cG9ydFgsIHZpZXdwb3J0WSk7XG4gICAgICBpZiAoY2FyZXRQb3NpdGlvbikge1xuICAgICAgICByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG4gICAgICAgIHJhbmdlLnNldFN0YXJ0KGNhcmV0UG9zaXRpb24ub2Zmc2V0Tm9kZSwgY2FyZXRQb3NpdGlvbi5vZmZzZXQpO1xuICAgICAgICByYW5nZS5jb2xsYXBzZSh0cnVlKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKChkb2N1bWVudCBhcyBhbnkpLmNhcmV0UmFuZ2VGcm9tUG9pbnQpIHtcbiAgICAgIHJhbmdlID0gKGRvY3VtZW50IGFzIGFueSkuY2FyZXRSYW5nZUZyb21Qb2ludCh2aWV3cG9ydFgsIHZpZXdwb3J0WSk7XG4gICAgfVxuXG4gICAgaWYgKHJhbmdlKSB7XG4gICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlVGV4dFNlbGVjdGlvbigpOiB2b2lkIHtcbiAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgaWYgKCFzZWxlY3Rpb24gfHwgc2VsZWN0aW9uLnJhbmdlQ291bnQgPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xuICAgIGNvbnN0IHN0YXJ0Tm9kZSA9IHJhbmdlLnN0YXJ0Q29udGFpbmVyO1xuICAgIGNvbnN0IHN0YXJ0T2Zmc2V0ID0gcmFuZ2Uuc3RhcnRPZmZzZXQ7XG5cbiAgICAvLyBnZXQgZW5kIHBvc2l0aW9uIHVzaW5nIGNhcmV0IEFQSXNcbiAgICAvLyBjYXJldFBvc2l0aW9uRnJvbVBvaW50IGlzIHN0YW5kYXJkIGJ1dCBub3Qgc3VwcG9ydGVkIGluIGFsbCBicm93c2Vyc1xuICAgIC8vIGNhcmV0UmFuZ2VGcm9tUG9pbnQgaXMgb2xkZXIgYW5kIHN1cHBvcnRlZCBpbiBtb3JlIGJyb3dzZXJzXG4gICAgbGV0IGVuZE5vZGU6IE5vZGUgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgZW5kT2Zmc2V0ID0gMDtcblxuICAgIGlmICgoZG9jdW1lbnQgYXMgYW55KS5jYXJldFBvc2l0aW9uRnJvbVBvaW50KSB7XG4gICAgICBjb25zdCBjYXJldFBvc2l0aW9uID0gKGRvY3VtZW50IGFzIGFueSkuY2FyZXRQb3NpdGlvbkZyb21Qb2ludCh0aGlzLnNlbGVjdGlvbkVuZFgsIHRoaXMuc2VsZWN0aW9uRW5kWSk7XG4gICAgICBpZiAoY2FyZXRQb3NpdGlvbikge1xuICAgICAgICBlbmROb2RlID0gY2FyZXRQb3NpdGlvbi5vZmZzZXROb2RlO1xuICAgICAgICBlbmRPZmZzZXQgPSBjYXJldFBvc2l0aW9uLm9mZnNldDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKChkb2N1bWVudCBhcyBhbnkpLmNhcmV0UmFuZ2VGcm9tUG9pbnQpIHtcbiAgICAgIGNvbnN0IGNhcmV0UmFuZ2UgPSAoZG9jdW1lbnQgYXMgYW55KS5jYXJldFJhbmdlRnJvbVBvaW50KHRoaXMuc2VsZWN0aW9uRW5kWCwgdGhpcy5zZWxlY3Rpb25FbmRZKTtcbiAgICAgIGlmIChjYXJldFJhbmdlKSB7XG4gICAgICAgIGVuZE5vZGUgPSBjYXJldFJhbmdlLnN0YXJ0Q29udGFpbmVyO1xuICAgICAgICBlbmRPZmZzZXQgPSBjYXJldFJhbmdlLnN0YXJ0T2Zmc2V0O1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChlbmROb2RlKSB7XG4gICAgICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG4gICAgICByYW5nZS5zZXRTdGFydChzdGFydE5vZGUsIHN0YXJ0T2Zmc2V0KTtcbiAgICAgIHJhbmdlLnNldEVuZChlbmROb2RlLCBlbmRPZmZzZXQpO1xuXG4gICAgICBjb25zdCBpc0JhY2t3YXJkID0gcmFuZ2UuY29sbGFwc2VkICYmIChzdGFydE5vZGUgIT09IGVuZE5vZGUgfHwgZW5kT2Zmc2V0IDwgc3RhcnRPZmZzZXQpO1xuICAgICAgY29uc3QgY29tcGFyaXNvbiA9IHN0YXJ0Tm9kZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihlbmROb2RlKTtcbiAgICAgIGNvbnN0IGVuZEJlZm9yZVN0YXJ0ID0gKGNvbXBhcmlzb24gJiBOb2RlLkRPQ1VNRU5UX1BPU0lUSU9OX1BSRUNFRElORykgIT09IDA7XG5cbiAgICAgIGlmIChpc0JhY2t3YXJkIHx8IGVuZEJlZm9yZVN0YXJ0KSB7XG4gICAgICAgIGlmICh0aGlzLmxhc3RWYWxpZEVuZE5vZGUpIHtcbiAgICAgICAgICBlbmROb2RlID0gdGhpcy5sYXN0VmFsaWRFbmROb2RlO1xuICAgICAgICAgIGVuZE9mZnNldCA9IHRoaXMubGFzdFZhbGlkRW5kT2Zmc2V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVuZE5vZGUgPSBzdGFydE5vZGU7XG4gICAgICAgICAgZW5kT2Zmc2V0ID0gc3RhcnRPZmZzZXQ7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubGFzdFZhbGlkRW5kTm9kZSA9IGVuZE5vZGU7XG4gICAgICAgIHRoaXMubGFzdFZhbGlkRW5kT2Zmc2V0ID0gZW5kT2Zmc2V0O1xuICAgICAgfVxuXG4gICAgICAvLyB1c2Ugc2V0QmFzZUFuZEV4dGVudCB0byBoYW5kbGUgc2VsZWN0aW9uIGRpcmVjdGlvbiB3aXRoIHByZWNpc2Ugb2Zmc2V0c1xuICAgICAgLy8gdG8gZW5zdXJlIHRoZSBzZWxlY3Rpb24gYWx3YXlzIHN0YXJ0cyBmcm9tIHRoZSBvcmlnaW5hbCBzdGFydCBwb2ludFxuICAgICAgLy8gYW5kIGV4dGVuZHMgdG8gdGhlIGV4YWN0IGNoYXJhY3RlciBwb3NpdGlvbiBhdCB0aGUgY3Vyc29yXG4gICAgICBzZWxlY3Rpb24uc2V0QmFzZUFuZEV4dGVudChcbiAgICAgICAgc3RhcnROb2RlLFxuICAgICAgICBzdGFydE9mZnNldCxcbiAgICAgICAgZW5kTm9kZSxcbiAgICAgICAgZW5kT2Zmc2V0XG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY29uZmlybVRleHRTZWxlY3Rpb24oKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3Rpb25Db25maXJtZWQuZW1pdCgpO1xuICAgIHRoaXMuc2VsZWN0aW9uQ3Vyc29yUG9zaXRpb25DaGFuZ2VkLmVtaXQoe1xuICAgICAgeDogdGhpcy5zZWxlY3Rpb25FbmRYLFxuICAgICAgeTogdGhpcy5zZWxlY3Rpb25FbmRZLFxuICAgICAgdmlzaWJsZTogZmFsc2VcbiAgICB9KTtcbiAgICB0aGlzLmNsZWFudXAoKTtcbiAgfVxuXG4gIHByaXZhdGUgY2FuY2VsVGV4dFNlbGVjdGlvbigpOiB2b2lkIHtcbiAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgaWYgKHNlbGVjdGlvbikge1xuICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgIH1cblxuICAgIHRoaXMuc2VsZWN0aW9uQ2FuY2VsbGVkLmVtaXQoKTtcbiAgICB0aGlzLnNlbGVjdGlvbkN1cnNvclBvc2l0aW9uQ2hhbmdlZC5lbWl0KHtcbiAgICAgIHg6IHRoaXMuc2VsZWN0aW9uRW5kWCxcbiAgICAgIHk6IHRoaXMuc2VsZWN0aW9uRW5kWSxcbiAgICAgIHZpc2libGU6IGZhbHNlXG4gICAgfSk7XG4gICAgdGhpcy5jbGVhbnVwKCk7XG4gIH1cblxuICBwcml2YXRlIGhpZGVDdXJzb3IoKTogdm9pZCB7XG4gICAgdGhpcy5zaG93Q3Vyc29yID0gZmFsc2U7XG4gICAgdGhpcy5lbWl0Q3Vyc29yUG9zaXRpb24oKTtcbiAgfVxuXG4gIHByaXZhdGUgY2xlYW51cCgpOiB2b2lkIHtcbiAgICB0aGlzLmlzU2VsZWN0aW5nID0gZmFsc2U7XG4gICAgdGhpcy5zaG93Q3Vyc29yID0gZmFsc2U7XG4gICAgdGhpcy5jdXJzb3JYID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuY3Vyc29yWSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnNlbGVjdGlvblN0YXJ0WCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnNlbGVjdGlvblN0YXJ0WSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnNlbGVjdGlvbkVuZFggPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5zZWxlY3Rpb25FbmRZID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuY3VycmVudFBhZ2UgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5sYXN0VmFsaWRFbmROb2RlID0gbnVsbDtcbiAgICB0aGlzLmxhc3RWYWxpZEVuZE9mZnNldCA9IDA7XG4gIH1cblxuICBwcml2YXRlIGdldEN1cnJlbnRQYWdlTnVtYmVyKCk6IG51bWJlciB7XG4gICAgbGV0IGN1cnJlbnRFbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgd2hpbGUgKGN1cnJlbnRFbGVtZW50ICYmIGN1cnJlbnRFbGVtZW50Lm9mZnNldFBhcmVudCkge1xuICAgICAgY3VycmVudEVsZW1lbnQgPSBjdXJyZW50RWxlbWVudC5vZmZzZXRQYXJlbnQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICBpZiAoY3VycmVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKSB7XG4gICAgICAgIGNvbnN0IHBhZ2UgPSBwYXJzZUludChjdXJyZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtcGFnZS1udW1iZXInKSwgMTApO1xuICAgICAgICBpZiAocGFnZSkge1xuICAgICAgICAgIHJldHVybiBwYWdlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAxO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0Q3Vyc29yUG9zaXRpb24oKTogdm9pZCB7XG4gICAgY29uc3QgcG9zaXRpb24gPSB7XG4gICAgICB4OiB0aGlzLmN1cnNvclgsXG4gICAgICB5OiB0aGlzLmN1cnNvclksXG4gICAgICB2aXNpYmxlOiB0aGlzLnNob3dDdXJzb3JcbiAgICB9O1xuICAgIHRoaXMuY3Vyc29yUG9zaXRpb25DaGFuZ2VkLmVtaXQocG9zaXRpb24pO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0U2VsZWN0aW9uVXBkYXRlZCgpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGlvblVwZGF0ZWQuZW1pdCh7XG4gICAgICBwYWdlOiB0aGlzLmN1cnJlbnRQYWdlLFxuICAgICAgc3RhcnRYOiB0aGlzLnNlbGVjdGlvblN0YXJ0WCxcbiAgICAgIHN0YXJ0WTogdGhpcy5zZWxlY3Rpb25TdGFydFksXG4gICAgICBlbmRYOiB0aGlzLnNlbGVjdGlvbkVuZFgsXG4gICAgICBlbmRZOiB0aGlzLnNlbGVjdGlvbkVuZFlcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLmNsZWFudXAoKTtcbiAgICB0aGlzLmVtaXRDdXJzb3JQb3NpdGlvbigpO1xuICB9XG59Il19
@@ -64,7 +64,7 @@ export class AnnotationViewComponent {
64
64
  this.toolbarEvents.toggleCommentsPanel(true);
65
65
  }
66
66
  /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AnnotationViewComponent, deps: [{ token: i1.ToolbarEventService }, { token: i2.Store }], target: i0.ɵɵFactoryTarget.Component }); }
67
- /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: AnnotationViewComponent, selector: "mv-annotation", inputs: { annotation: "annotation", zoom: "zoom", rotate: "rotate", selectedAnnoId: "selectedAnnoId", pageHeight: "pageHeight", pageWidth: "pageWidth" }, outputs: { update: "update", delete: "delete", annotationClick: "annotationClick" }, viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true }], ngImport: i0, template: "<div #container [tabindex]=\"anno.id\">\n <mv-ctx-toolbar *ngIf=\"selected\"\n [canDelete]=\"true\" [canComment]=\"true\"\n [rectangles]=\"anno.rectangles\"\n [zoom]=\"zoom\"\n [rotate]=\"rotate\"\n [pageHeight]=\"pageHeight\"\n [pageWidth]=\"pageWidth\"\n (deleteHighlightEvent)=\"deleteHighlight()\"\n (addOrEditCommentEvent)=\"addOrEditComment()\">\n </mv-ctx-toolbar>\n <ng-container *ngFor=\"let rectangle of anno.rectangles\">\n <mv-anno-rectangle\n (selectEvent)=\"onSelect()\"\n (updateEvent)=\"onRectangleUpdate($event)\"\n [selected]=\"selected\"\n [zoom]=\"zoom\"\n [rotate]=\"rotate\"\n [pageHeight]=\"pageHeight\"\n [pageWidth]=\"pageWidth\"\n [editable]=\"anno.rectangles.length <= 1\"\n [annoRect]=\"rectangle\"\n [color]=\"anno.color\">\n </mv-anno-rectangle>\n </ng-container>\n</div>\n", dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.RectangleComponent, selector: "mv-anno-rectangle", inputs: ["color", "zoom", "rotate", "editable", "pageHeight", "pageWidth", "annoRect", "selected"], outputs: ["selectEvent", "updateEvent"] }, { kind: "component", type: i5.CtxToolbarComponent, selector: "mv-ctx-toolbar", inputs: ["zoom", "rotate", "pageHeight", "pageWidth", "canHighlight", "canBookmark", "canComment", "canDelete", "rectangles"], outputs: ["createHighlightEvent", "deleteHighlightEvent", "addOrEditCommentEvent", "createBookmarkEvent"] }] }); }
67
+ /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: AnnotationViewComponent, selector: "mv-annotation", inputs: { annotation: "annotation", zoom: "zoom", rotate: "rotate", selectedAnnoId: "selectedAnnoId", pageHeight: "pageHeight", pageWidth: "pageWidth" }, outputs: { update: "update", delete: "delete", annotationClick: "annotationClick" }, viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true }], ngImport: i0, template: "<div #container [tabindex]=\"anno.id\">\n <mv-ctx-toolbar *ngIf=\"selected\"\n [canDelete]=\"true\" [canComment]=\"true\"\n [rectangles]=\"anno.rectangles\"\n [zoom]=\"zoom\"\n [rotate]=\"rotate\"\n [pageHeight]=\"pageHeight\"\n [pageWidth]=\"pageWidth\"\n (deleteHighlightEvent)=\"deleteHighlight()\"\n (addOrEditCommentEvent)=\"addOrEditComment()\">\n </mv-ctx-toolbar>\n <ng-container *ngFor=\"let rectangle of anno.rectangles\">\n <mv-anno-rectangle\n (selectEvent)=\"onSelect()\"\n (updateEvent)=\"onRectangleUpdate($event)\"\n [selected]=\"selected\"\n [zoom]=\"zoom\"\n [rotate]=\"rotate\"\n [pageHeight]=\"pageHeight\"\n [pageWidth]=\"pageWidth\"\n [editable]=\"anno.rectangles.length <= 1\"\n [annoRect]=\"rectangle\"\n [color]=\"anno.color\">\n </mv-anno-rectangle>\n </ng-container>\n</div>\n", dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.RectangleComponent, selector: "mv-anno-rectangle", inputs: ["color", "zoom", "rotate", "editable", "pageHeight", "pageWidth", "annoRect", "selected"], outputs: ["selectEvent", "updateEvent"] }, { kind: "component", type: i5.CtxToolbarComponent, selector: "mv-ctx-toolbar", inputs: ["zoom", "rotate", "pageHeight", "pageWidth", "canHighlight", "canBookmark", "canComment", "canDelete", "rectangles"], outputs: ["createHighlightEvent", "deleteHighlightEvent", "addOrEditCommentEvent", "createBookmarkEvent", "cancelEvent"] }] }); }
68
68
  }
69
69
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AnnotationViewComponent, decorators: [{
70
70
  type: Component,
@@ -1,4 +1,4 @@
1
- import { Component, EventEmitter, Input, Output } from '@angular/core';
1
+ import { Component, EventEmitter, HostListener, Input, Output, ViewChild } from '@angular/core';
2
2
  import * as i0 from "@angular/core";
3
3
  import * as i1 from "@angular/common";
4
4
  export class CtxToolbarComponent {
@@ -7,6 +7,7 @@ export class CtxToolbarComponent {
7
7
  this.deleteHighlightEvent = new EventEmitter();
8
8
  this.addOrEditCommentEvent = new EventEmitter();
9
9
  this.createBookmarkEvent = new EventEmitter();
10
+ this.cancelEvent = new EventEmitter();
10
11
  this.defaultHeight = 70;
11
12
  this.defaultWidth = 300;
12
13
  }
@@ -15,6 +16,14 @@ export class CtxToolbarComponent {
15
16
  this.top = this.popupTop();
16
17
  this.left = this.popupLeft();
17
18
  }
19
+ onEscapeKey(event) {
20
+ if (this.rectangle) {
21
+ event.stopPropagation();
22
+ event.preventDefault();
23
+ this.rectangle = undefined;
24
+ this.cancelEvent.emit();
25
+ }
26
+ }
18
27
  set rectangles(rectangles) {
19
28
  if (rectangles) {
20
29
  this._rectangles = rectangles;
@@ -83,13 +92,25 @@ export class CtxToolbarComponent {
83
92
  return popupLeft;
84
93
  }
85
94
  }
95
+ focusToolbar() {
96
+ if (this.toolbarContainer?.nativeElement) {
97
+ const firstButton = this.toolbarContainer.nativeElement.querySelector('button');
98
+ if (firstButton) {
99
+ setTimeout(() => firstButton.focus(), 0);
100
+ return;
101
+ }
102
+ }
103
+ }
86
104
  /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CtxToolbarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
87
- /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: CtxToolbarComponent, selector: "mv-ctx-toolbar", inputs: { zoom: "zoom", rotate: "rotate", pageHeight: "pageHeight", pageWidth: "pageWidth", canHighlight: "canHighlight", canBookmark: "canBookmark", canComment: "canComment", canDelete: "canDelete", rectangles: "rectangles" }, outputs: { createHighlightEvent: "createHighlightEvent", deleteHighlightEvent: "deleteHighlightEvent", addOrEditCommentEvent: "addOrEditCommentEvent", createBookmarkEvent: "createBookmarkEvent" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"toolbar\" *ngIf=\"rectangle\"\n [style.top.px]=\"top\"\n [style.left.px]=\"left\">\n <button *ngIf=\"canHighlight\"\n type=\"button\" title=\"Highlight\"\n class=\"aui__toolbar-button aui__toolbar-button--comments contextual-btn leftButton aui__toolbar-button-highlight\"\n (mousedown)=\"createHighlight()\">\n <span>Highlight</span>\n </button>\n <button *ngIf=\"canDelete\"\n type=\"button\" title=\"Delete\"\n class=\"aui__toolbar-button aui__toolbar-button--comments contextual-btn leftButton\"\n (mousedown)=\"deleteHighlight()\">\n <span>Remove</span>\n </button>\n <button *ngIf=\"canComment\"\n type=\"button\" title=\"Comment\"\n class=\"aui__toolbar-button aui__toolbar-button--comments contextual-btn rightButton aui__toolbar-button-comment\"\n (mousedown)=\"addOrEditComment()\">\n <span>Comment</span></button>\n <button *ngIf=\"canBookmark\"\n type=\"button\" title=\"Bookmark\"\n class=\"aui__toolbar-button aui__toolbar-button--comments contextual-btn rightButton aui__toolbar-button-bookmark\"\n id=\"bookmarkButton\"\n (mousedown)=\"createBookmark()\">\n <span>Bookmark</span></button>\n <div class=\"arrow-down\">\n <div class=\"inner-triangle\"></div>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); }
105
+ /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: CtxToolbarComponent, selector: "mv-ctx-toolbar", inputs: { zoom: "zoom", rotate: "rotate", pageHeight: "pageHeight", pageWidth: "pageWidth", canHighlight: "canHighlight", canBookmark: "canBookmark", canComment: "canComment", canDelete: "canDelete", rectangles: "rectangles" }, outputs: { createHighlightEvent: "createHighlightEvent", deleteHighlightEvent: "deleteHighlightEvent", addOrEditCommentEvent: "addOrEditCommentEvent", createBookmarkEvent: "createBookmarkEvent", cancelEvent: "cancelEvent" }, host: { listeners: { "document:keydown.escape": "onEscapeKey($event)" } }, viewQueries: [{ propertyName: "toolbarContainer", first: true, predicate: ["toolbarContainer"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div #toolbarContainer class=\"toolbar\" *ngIf=\"rectangle\"\n [style.top.px]=\"top\"\n [style.left.px]=\"left\">\n <button *ngIf=\"canHighlight\"\n type=\"button\" title=\"Highlight\"\n class=\"aui__toolbar-button aui__toolbar-button--comments contextual-btn leftButton aui__toolbar-button-highlight\"\n (mousedown)=\"createHighlight()\"\n (keydown.enter)=\"createHighlight()\">\n <span>Highlight</span>\n </button>\n <button *ngIf=\"canDelete\"\n type=\"button\" title=\"Delete\"\n class=\"aui__toolbar-button aui__toolbar-button--comments contextual-btn leftButton\"\n (mousedown)=\"deleteHighlight()\"\n (keydown.enter)=\"deleteHighlight()\">\n <span>Remove</span>\n </button>\n <button *ngIf=\"canComment\"\n type=\"button\" title=\"Comment\"\n class=\"aui__toolbar-button aui__toolbar-button--comments contextual-btn rightButton aui__toolbar-button-comment\"\n (mousedown)=\"addOrEditComment()\"\n (keydown.enter)=\"addOrEditComment()\">\n <span>Comment</span></button>\n <button *ngIf=\"canBookmark\"\n type=\"button\" title=\"Bookmark\"\n class=\"aui__toolbar-button aui__toolbar-button--comments contextual-btn rightButton aui__toolbar-button-bookmark\"\n id=\"bookmarkButton\"\n (mousedown)=\"createBookmark()\"\n (keydown.enter)=\"createBookmark()\">\n <span>Bookmark</span></button>\n <div class=\"arrow-down\">\n <div class=\"inner-triangle\"></div>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); }
88
106
  }
89
107
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CtxToolbarComponent, decorators: [{
90
108
  type: Component,
91
- args: [{ selector: 'mv-ctx-toolbar', template: "<div class=\"toolbar\" *ngIf=\"rectangle\"\n [style.top.px]=\"top\"\n [style.left.px]=\"left\">\n <button *ngIf=\"canHighlight\"\n type=\"button\" title=\"Highlight\"\n class=\"aui__toolbar-button aui__toolbar-button--comments contextual-btn leftButton aui__toolbar-button-highlight\"\n (mousedown)=\"createHighlight()\">\n <span>Highlight</span>\n </button>\n <button *ngIf=\"canDelete\"\n type=\"button\" title=\"Delete\"\n class=\"aui__toolbar-button aui__toolbar-button--comments contextual-btn leftButton\"\n (mousedown)=\"deleteHighlight()\">\n <span>Remove</span>\n </button>\n <button *ngIf=\"canComment\"\n type=\"button\" title=\"Comment\"\n class=\"aui__toolbar-button aui__toolbar-button--comments contextual-btn rightButton aui__toolbar-button-comment\"\n (mousedown)=\"addOrEditComment()\">\n <span>Comment</span></button>\n <button *ngIf=\"canBookmark\"\n type=\"button\" title=\"Bookmark\"\n class=\"aui__toolbar-button aui__toolbar-button--comments contextual-btn rightButton aui__toolbar-button-bookmark\"\n id=\"bookmarkButton\"\n (mousedown)=\"createBookmark()\">\n <span>Bookmark</span></button>\n <div class=\"arrow-down\">\n <div class=\"inner-triangle\"></div>\n </div>\n</div>\n" }]
92
- }], ctorParameters: () => [], propDecorators: { zoom: [{
109
+ args: [{ selector: 'mv-ctx-toolbar', template: "<div #toolbarContainer class=\"toolbar\" *ngIf=\"rectangle\"\n [style.top.px]=\"top\"\n [style.left.px]=\"left\">\n <button *ngIf=\"canHighlight\"\n type=\"button\" title=\"Highlight\"\n class=\"aui__toolbar-button aui__toolbar-button--comments contextual-btn leftButton aui__toolbar-button-highlight\"\n (mousedown)=\"createHighlight()\"\n (keydown.enter)=\"createHighlight()\">\n <span>Highlight</span>\n </button>\n <button *ngIf=\"canDelete\"\n type=\"button\" title=\"Delete\"\n class=\"aui__toolbar-button aui__toolbar-button--comments contextual-btn leftButton\"\n (mousedown)=\"deleteHighlight()\"\n (keydown.enter)=\"deleteHighlight()\">\n <span>Remove</span>\n </button>\n <button *ngIf=\"canComment\"\n type=\"button\" title=\"Comment\"\n class=\"aui__toolbar-button aui__toolbar-button--comments contextual-btn rightButton aui__toolbar-button-comment\"\n (mousedown)=\"addOrEditComment()\"\n (keydown.enter)=\"addOrEditComment()\">\n <span>Comment</span></button>\n <button *ngIf=\"canBookmark\"\n type=\"button\" title=\"Bookmark\"\n class=\"aui__toolbar-button aui__toolbar-button--comments contextual-btn rightButton aui__toolbar-button-bookmark\"\n id=\"bookmarkButton\"\n (mousedown)=\"createBookmark()\"\n (keydown.enter)=\"createBookmark()\">\n <span>Bookmark</span></button>\n <div class=\"arrow-down\">\n <div class=\"inner-triangle\"></div>\n </div>\n</div>\n" }]
110
+ }], ctorParameters: () => [], propDecorators: { toolbarContainer: [{
111
+ type: ViewChild,
112
+ args: ['toolbarContainer', { static: false }]
113
+ }], zoom: [{
93
114
  type: Input
94
115
  }], rotate: [{
95
116
  type: Input
@@ -113,7 +134,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
113
134
  type: Output
114
135
  }], createBookmarkEvent: [{
115
136
  type: Output
137
+ }], cancelEvent: [{
138
+ type: Output
139
+ }], onEscapeKey: [{
140
+ type: HostListener,
141
+ args: ['document:keydown.escape', ['$event']]
116
142
  }], rectangles: [{
117
143
  type: Input
118
144
  }] } });
119
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3R4LXRvb2xiYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbWVkaWEtdmlld2VyL3NyYy9saWIvYW5ub3RhdGlvbnMvYW5ub3RhdGlvbi1zZXQvY3R4LXRvb2xiYXIvY3R4LXRvb2xiYXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbWVkaWEtdmlld2VyL3NyYy9saWIvYW5ub3RhdGlvbnMvYW5ub3RhdGlvbi1zZXQvY3R4LXRvb2xiYXIvY3R4LXRvb2xiYXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sRUFFUCxNQUFNLGVBQWUsQ0FBQzs7O0FBT3ZCLE1BQU0sT0FBTyxtQkFBbUI7SUF5QjlCO1FBVlUseUJBQW9CLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUMxQyx5QkFBb0IsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQzFDLDBCQUFxQixHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDM0Msd0JBQW1CLEdBQUcsSUFBSSxZQUFZLEVBQWEsQ0FBQztRQVE1RCxJQUFJLENBQUMsYUFBYSxHQUFHLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsWUFBWSxHQUFHLEdBQUcsQ0FBQztJQUMxQixDQUFDO0lBRUQsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBRUQsSUFBYSxVQUFVLENBQUMsVUFBdUI7UUFDN0MsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUNmLElBQUksQ0FB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QUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUVJLG9CQUFvQjtzQkFBN0IsTUFBTTtnQkFDRyxvQkFBb0I7c0JBQTdCLE1BQU07Z0JBQ0cscUJBQXFCO3NCQUE5QixNQUFNO2dCQUNHLG1CQUFtQjtzQkFBNUIsTUFBTTtnQkFrQk0sVUFBVTtzQkFBdEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2VzXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUmVjdGFuZ2xlIH0gZnJvbSAnLi4vYW5ub3RhdGlvbi12aWV3L3JlY3RhbmdsZS9yZWN0YW5nbGUubW9kZWwnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdtdi1jdHgtdG9vbGJhcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9jdHgtdG9vbGJhci5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgQ3R4VG9vbGJhckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG5cbiAgcmVhZG9ubHkgZGVmYXVsdEhlaWdodDtcbiAgcmVhZG9ubHkgZGVmYXVsdFdpZHRoO1xuXG4gIEBJbnB1dCgpIHpvb207XG4gIEBJbnB1dCgpIHJvdGF0ZTtcbiAgQElucHV0KCkgcGFnZUhlaWdodDogbnVtYmVyO1xuICBASW5wdXQoKSBwYWdlV2lkdGg6IG51bWJlcjtcblxuICBASW5wdXQoKSBjYW5IaWdobGlnaHQ6IGJvb2xlYW47XG4gIEBJbnB1dCgpIGNhbkJvb2ttYXJrOiBib29sZWFuO1xuICBASW5wdXQoKSBjYW5Db21tZW50OiBib29sZWFuO1xuICBASW5wdXQoKSBjYW5EZWxldGU6IGJvb2xlYW47XG5cbiAgQE91dHB1dCgpIGNyZWF0ZUhpZ2hsaWdodEV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgZGVsZXRlSGlnaGxpZ2h0RXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBhZGRPckVkaXRDb21tZW50RXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBjcmVhdGVCb29rbWFya0V2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxSZWN0YW5nbGU+KCk7XG5cbiAgcmVjdGFuZ2xlOiBSZWN0YW5nbGU7XG4gIF9yZWN0YW5nbGVzOiBSZWN0YW5nbGVbXTtcbiAgdG9wOiBudW1iZXI7XG4gIGxlZnQ6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmRlZmF1bHRIZWlnaHQgPSA3MDtcbiAgICB0aGlzLmRlZmF1bHRXaWR0aCA9IDMwMDtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICB0aGlzLnNldFJlY3RhbmdsZSgpO1xuICAgIHRoaXMudG9wID0gdGhpcy5wb3B1cFRvcCgpO1xuICAgIHRoaXMubGVmdCA9IHRoaXMucG9wdXBMZWZ0KCk7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgcmVjdGFuZ2xlcyhyZWN0YW5nbGVzOiBSZWN0YW5nbGVbXSkge1xuICAgIGlmIChyZWN0YW5nbGVzKSB7XG4gICAgICB0aGlzLl9yZWN0YW5nbGVzID0gcmVjdGFuZ2xlcztcbiAgICAgIHRoaXMuc2V0UmVjdGFuZ2xlKCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHJlY3RhbmdsZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3JlY3RhbmdsZXM7XG4gIH1cblxuICBjcmVhdGVIaWdobGlnaHQoKSB7XG4gICAgdGhpcy5jcmVhdGVIaWdobGlnaHRFdmVudC5lbWl0KCk7XG4gICAgdGhpcy5yZWN0YW5nbGUgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBkZWxldGVIaWdobGlnaHQoKSB7XG4gICAgdGhpcy5kZWxldGVIaWdobGlnaHRFdmVudC5lbWl0KCk7XG4gIH1cblxuICBhZGRPckVkaXRDb21tZW50KCkge1xuICAgIHRoaXMuYWRkT3JFZGl0Q29tbWVudEV2ZW50LmVtaXQoKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIC8vIFRoaXMgaGFjayB0byB3YWl0IHVudGlsIHRoZSBlbGVtZW50IGlzIHJlbmRlcmVkIHNlZW1zIHRvIGJlIHVucmVsaWFibGUsXG4gICAgICBpZiAoIWxvY2F0aW9uLmhhc2gpIHtcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ZpZXdlckNvbnRhaW5lcicpPy5zY3JvbGxCeSgwLCAxKTtcbiAgICAgIH1cbiAgICB9LCAyMCk7XG4gIH1cblxuICBjcmVhdGVCb29rbWFyaygpIHtcbiAgICB0aGlzLmNyZWF0ZUJvb2ttYXJrRXZlbnQuZW1pdCh0aGlzLnJlY3RhbmdsZSk7XG4gICAgdGhpcy5yZWN0YW5nbGUgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBzZXRSZWN0YW5nbGUoKSB7XG4gICAgY29uc3QgcmVjdGFuZ2xlID0gdGhpcy5yZWN0YW5nbGVzXG4gICAgICAucmVkdWNlKChwcmV2LCBjdXJyZW50KSA9PiBwcmV2LnkgPCBjdXJyZW50LnkgPyBwcmV2IDogY3VycmVudCk7XG4gICAgdGhpcy5yZWN0YW5nbGUgPSAgeyAuLi5yZWN0YW5nbGUgfTtcbiAgICBzd2l0Y2ggKHRoaXMucm90YXRlKSB7XG4gICAgICBjYXNlIDkwOlxuICAgICAgICB0aGlzLnJlY3RhbmdsZS53aWR0aCA9IHJlY3RhbmdsZS5oZWlnaHQ7XG4gICAgICAgIHRoaXMucmVjdGFuZ2xlLmhlaWdodCA9IHJlY3RhbmdsZS53aWR0aDtcbiAgICAgICAgdGhpcy5yZWN0YW5nbGUueCA9ICh0aGlzLnBhZ2VXaWR0aCAvIHRoaXMuem9vbSkgLSByZWN0YW5nbGUueSAtIHJlY3RhbmdsZS5oZWlnaHQ7XG4gICAgICAgIHRoaXMucmVjdGFuZ2xlLnkgPSByZWN0YW5nbGUueDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDE4MDpcbiAgICAgICAgdGhpcy5yZWN0YW5nbGUueCA9ICh0aGlzLnBhZ2VXaWR0aCAvIHRoaXMuem9vbSkgLSByZWN0YW5nbGUueCAtIHJlY3RhbmdsZS53aWR0aDtcbiAgICAgICAgdGhpcy5yZWN0YW5nbGUueSA9ICh0aGlzLnBhZ2VIZWlnaHQgLyB0aGlzLnpvb20pIC0gcmVjdGFuZ2xlLnkgLSByZWN0YW5nbGUuaGVpZ2h0O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMjcwOlxuICAgICAgICB0aGlzLnJlY3RhbmdsZS53aWR0aCA9IHJlY3RhbmdsZS5oZWlnaHQ7XG4gICAgICAgIHRoaXMucmVjdGFuZ2xlLmhlaWdodCA9IHJlY3RhbmdsZS53aWR0aDtcbiAgICAgICAgdGhpcy5yZWN0YW5nbGUueCA9IHJlY3RhbmdsZS55O1xuICAgICAgICB0aGlzLnJlY3RhbmdsZS55ID0gKHRoaXMucGFnZUhlaWdodCAvIHRoaXMuem9vbSkgLSByZWN0YW5nbGUueCAtIHJlY3RhbmdsZS53aWR0aDtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcG9wdXBUb3AoKSB7XG4gICAgY29uc3QgcG9wdXBUb3AgPSB0aGlzLnJlY3RhbmdsZS55ICogdGhpcy56b29tIC0gdGhpcy5kZWZhdWx0SGVpZ2h0O1xuICAgIHJldHVybiBwb3B1cFRvcCA8PSAwID8gdGhpcy5kZWZhdWx0SGVpZ2h0IDogcG9wdXBUb3A7XG4gIH1cblxuICBwb3B1cExlZnQoKSB7XG4gICAgY29uc3QgcG9wdXBMZWZ0ID0gKHRoaXMucmVjdGFuZ2xlLnggKyAodGhpcy5yZWN0YW5nbGUud2lkdGggLyAyKSkgKiB0aGlzLnpvb20gLSAodGhpcy5kZWZhdWx0V2lkdGggLyAyKTtcbiAgICBpZiAocG9wdXBMZWZ0IDw9IDApIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH0gZWxzZSBpZiAocG9wdXBMZWZ0ID49IHRoaXMucGFnZVdpZHRoIC0gdGhpcy5kZWZhdWx0V2lkdGgpIHtcbiAgICAgIHJldHVybiB0aGlzLnBhZ2VXaWR0aCAtIHRoaXMuZGVmYXVsdFdpZHRoO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcG9wdXBMZWZ0O1xuICAgIH1cbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cInRvb2xiYXJcIiAqbmdJZj1cInJlY3RhbmdsZVwiXG4gICAgIFtzdHlsZS50b3AucHhdPVwidG9wXCJcbiAgICAgW3N0eWxlLmxlZnQucHhdPVwibGVmdFwiPlxuICA8YnV0dG9uICpuZ0lmPVwiY2FuSGlnaGxpZ2h0XCJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCIgdGl0bGU9XCJIaWdobGlnaHRcIlxuICAgICAgICAgIGNsYXNzPVwiYXVpX190b29sYmFyLWJ1dHRvbiBhdWlfX3Rvb2xiYXItYnV0dG9uLS1jb21tZW50cyBjb250ZXh0dWFsLWJ0biBsZWZ0QnV0dG9uIGF1aV9fdG9vbGJhci1idXR0b24taGlnaGxpZ2h0XCJcbiAgICAgICAgICAobW91c2Vkb3duKT1cImNyZWF0ZUhpZ2hsaWdodCgpXCI+XG4gICAgPHNwYW4+SGlnaGxpZ2h0PC9zcGFuPlxuICA8L2J1dHRvbj5cbiAgPGJ1dHRvbiAqbmdJZj1cImNhbkRlbGV0ZVwiXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiIHRpdGxlPVwiRGVsZXRlXCJcbiAgICAgICAgICBjbGFzcz1cImF1aV9fdG9vbGJhci1idXR0b24gYXVpX190b29sYmFyLWJ1dHRvbi0tY29tbWVudHMgY29udGV4dHVhbC1idG4gbGVmdEJ1dHRvblwiXG4gICAgICAgICAgKG1vdXNlZG93bik9XCJkZWxldGVIaWdobGlnaHQoKVwiPlxuICAgIDxzcGFuPlJlbW92ZTwvc3Bhbj5cbiAgPC9idXR0b24+XG4gIDxidXR0b24gKm5nSWY9XCJjYW5Db21tZW50XCJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCIgdGl0bGU9XCJDb21tZW50XCJcbiAgICAgICAgICBjbGFzcz1cImF1aV9fdG9vbGJhci1idXR0b24gYXVpX190b29sYmFyLWJ1dHRvbi0tY29tbWVudHMgY29udGV4dHVhbC1idG4gcmlnaHRCdXR0b24gYXVpX190b29sYmFyLWJ1dHRvbi1jb21tZW50XCJcbiAgICAgICAgICAobW91c2Vkb3duKT1cImFkZE9yRWRpdENvbW1lbnQoKVwiPlxuICAgIDxzcGFuPkNvbW1lbnQ8L3NwYW4+PC9idXR0b24+XG4gIDxidXR0b24gKm5nSWY9XCJjYW5Cb29rbWFya1wiXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiIHRpdGxlPVwiQm9va21hcmtcIlxuICAgICAgICAgIGNsYXNzPVwiYXVpX190b29sYmFyLWJ1dHRvbiBhdWlfX3Rvb2xiYXItYnV0dG9uLS1jb21tZW50cyBjb250ZXh0dWFsLWJ0biByaWdodEJ1dHRvbiBhdWlfX3Rvb2xiYXItYnV0dG9uLWJvb2ttYXJrXCJcbiAgICAgICAgICBpZD1cImJvb2ttYXJrQnV0dG9uXCJcbiAgICAgICAgICAobW91c2Vkb3duKT1cImNyZWF0ZUJvb2ttYXJrKClcIj5cbiAgICA8c3Bhbj5Cb29rbWFyazwvc3Bhbj48L2J1dHRvbj5cbiAgPGRpdiBjbGFzcz1cImFycm93LWRvd25cIj5cbiAgICA8ZGl2IGNsYXNzPVwiaW5uZXItdHJpYW5nbGVcIj48L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
145
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3R4LXRvb2xiYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbWVkaWEtdmlld2VyL3NyYy9saWIvYW5ub3RhdGlvbnMvYW5ub3RhdGlvbi1zZXQvY3R4LXRvb2xiYXIvY3R4LXRvb2xiYXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbWVkaWEtdmlld2VyL3NyYy9saWIvYW5ub3RhdGlvbnMvYW5ub3RhdGlvbi1zZXQvY3R4LXRvb2xiYXIvY3R4LXRvb2xiYXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLFNBQVMsRUFFVCxZQUFZLEVBQ1osWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEVBRU4sU0FBUyxFQUNWLE1BQU0sZUFBZSxDQUFDOzs7QUFPdkIsTUFBTSxPQUFPLG1CQUFtQjtJQTRCOUI7UUFYVSx5QkFBb0IsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQzFDLHlCQUFvQixHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDMUMsMEJBQXFCLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUMzQyx3QkFBbUIsR0FBRyxJQUFJLFlBQVksRUFBYSxDQUFDO1FBQ3BELGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQVF6QyxJQUFJLENBQUMsYUFBYSxHQUFHLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsWUFBWSxHQUFHLEdBQUcsQ0FBQztJQUMxQixDQUFDO0lBRUQsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBR0QsV0FB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b3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIEhvc3RMaXN0ZW5lcixcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2VzLFxuICBWaWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBSZWN0YW5nbGUgfSBmcm9tICcuLi9hbm5vdGF0aW9uLXZpZXcvcmVjdGFuZ2xlL3JlY3RhbmdsZS5tb2RlbCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ212LWN0eC10b29sYmFyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2N0eC10b29sYmFyLmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBDdHhUb29sYmFyQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzIHtcblxuICByZWFkb25seSBkZWZhdWx0SGVpZ2h0O1xuICByZWFkb25seSBkZWZhdWx0V2lkdGg7XG5cbiAgQFZpZXdDaGlsZCgndG9vbGJhckNvbnRhaW5lcicsIHsgc3RhdGljOiBmYWxzZSB9KSB0b29sYmFyQ29udGFpbmVyOiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PjtcblxuICBASW5wdXQoKSB6b29tO1xuICBASW5wdXQoKSByb3RhdGU7XG4gIEBJbnB1dCgpIHBhZ2VIZWlnaHQ6IG51bWJlcjtcbiAgQElucHV0KCkgcGFnZVdpZHRoOiBudW1iZXI7XG5cbiAgQElucHV0KCkgY2FuSGlnaGxpZ2h0OiBib29sZWFuO1xuICBASW5wdXQoKSBjYW5Cb29rbWFyazogYm9vbGVhbjtcbiAgQElucHV0KCkgY2FuQ29tbWVudDogYm9vbGVhbjtcbiAgQElucHV0KCkgY2FuRGVsZXRlOiBib29sZWFuO1xuXG4gIEBPdXRwdXQoKSBjcmVhdGVIaWdobGlnaHRFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIGRlbGV0ZUhpZ2hsaWdodEV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgYWRkT3JFZGl0Q29tbWVudEV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgY3JlYXRlQm9va21hcmtFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8UmVjdGFuZ2xlPigpO1xuICBAT3V0cHV0KCkgY2FuY2VsRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgcmVjdGFuZ2xlOiBSZWN0YW5nbGU7XG4gIF9yZWN0YW5nbGVzOiBSZWN0YW5nbGVbXTtcbiAgdG9wOiBudW1iZXI7XG4gIGxlZnQ6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmRlZmF1bHRIZWlnaHQgPSA3MDtcbiAgICB0aGlzLmRlZmF1bHRXaWR0aCA9IDMwMDtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICB0aGlzLnNldFJlY3RhbmdsZSgpO1xuICAgIHRoaXMudG9wID0gdGhpcy5wb3B1cFRvcCgpO1xuICAgIHRoaXMubGVmdCA9IHRoaXMucG9wdXBMZWZ0KCk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDprZXlkb3duLmVzY2FwZScsIFsnJGV2ZW50J10pXG4gIG9uRXNjYXBlS2V5KGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgaWYgKHRoaXMucmVjdGFuZ2xlKSB7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLnJlY3RhbmdsZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuY2FuY2VsRXZlbnQuZW1pdCgpO1xuICAgIH1cbiAgfVxuXG4gIEBJbnB1dCgpIHNldCByZWN0YW5nbGVzKHJlY3RhbmdsZXM6IFJlY3RhbmdsZVtdKSB7XG4gICAgaWYgKHJlY3RhbmdsZXMpIHtcbiAgICAgIHRoaXMuX3JlY3RhbmdsZXMgPSByZWN0YW5nbGVzO1xuICAgICAgdGhpcy5zZXRSZWN0YW5nbGUoKTtcbiAgICB9XG4gIH1cblxuICBnZXQgcmVjdGFuZ2xlcygpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVjdGFuZ2xlcztcbiAgfVxuXG4gIGNyZWF0ZUhpZ2hsaWdodCgpIHtcbiAgICB0aGlzLmNyZWF0ZUhpZ2hsaWdodEV2ZW50LmVtaXQoKTtcbiAgICB0aGlzLnJlY3RhbmdsZSA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGRlbGV0ZUhpZ2hsaWdodCgpIHtcbiAgICB0aGlzLmRlbGV0ZUhpZ2hsaWdodEV2ZW50LmVtaXQoKTtcbiAgfVxuXG4gIGFkZE9yRWRpdENvbW1lbnQoKSB7XG4gICAgdGhpcy5hZGRPckVkaXRDb21tZW50RXZlbnQuZW1pdCgpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgLy8gVGhpcyBoYWNrIHRvIHdhaXQgdW50aWwgdGhlIGVsZW1lbnQgaXMgcmVuZGVyZWQgc2VlbXMgdG8gYmUgdW5yZWxpYWJsZSxcbiAgICAgIGlmICghbG9jYXRpb24uaGFzaCkge1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndmlld2VyQ29udGFpbmVyJyk/LnNjcm9sbEJ5KDAsIDEpO1xuICAgICAgfVxuICAgIH0sIDIwKTtcbiAgfVxuXG4gIGNyZWF0ZUJvb2ttYXJrKCkge1xuICAgIHRoaXMuY3JlYXRlQm9va21hcmtFdmVudC5lbWl0KHRoaXMucmVjdGFuZ2xlKTtcbiAgICB0aGlzLnJlY3RhbmdsZSA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHNldFJlY3RhbmdsZSgpIHtcbiAgICBjb25zdCByZWN0YW5nbGUgPSB0aGlzLnJlY3RhbmdsZXNcbiAgICAgIC5yZWR1Y2UoKHByZXYsIGN1cnJlbnQpID0+IHByZXYueSA8IGN1cnJlbnQueSA/IHByZXYgOiBjdXJyZW50KTtcbiAgICB0aGlzLnJlY3RhbmdsZSA9ICB7IC4uLnJlY3RhbmdsZSB9O1xuICAgIHN3aXRjaCAodGhpcy5yb3RhdGUpIHtcbiAgICAgIGNhc2UgOTA6XG4gICAgICAgIHRoaXMucmVjdGFuZ2xlLndpZHRoID0gcmVjdGFuZ2xlLmhlaWdodDtcbiAgICAgICAgdGhpcy5yZWN0YW5nbGUuaGVpZ2h0ID0gcmVjdGFuZ2xlLndpZHRoO1xuICAgICAgICB0aGlzLnJlY3RhbmdsZS54ID0gKHRoaXMucGFnZVdpZHRoIC8gdGhpcy56b29tKSAtIHJlY3RhbmdsZS55IC0gcmVjdGFuZ2xlLmhlaWdodDtcbiAgICAgICAgdGhpcy5yZWN0YW5nbGUueSA9IHJlY3RhbmdsZS54O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMTgwOlxuICAgICAgICB0aGlzLnJlY3RhbmdsZS54ID0gKHRoaXMucGFnZVdpZHRoIC8gdGhpcy56b29tKSAtIHJlY3RhbmdsZS54IC0gcmVjdGFuZ2xlLndpZHRoO1xuICAgICAgICB0aGlzLnJlY3RhbmdsZS55ID0gKHRoaXMucGFnZUhlaWdodCAvIHRoaXMuem9vbSkgLSByZWN0YW5nbGUueSAtIHJlY3RhbmdsZS5oZWlnaHQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyNzA6XG4gICAgICAgIHRoaXMucmVjdGFuZ2xlLndpZHRoID0gcmVjdGFuZ2xlLmhlaWdodDtcbiAgICAgICAgdGhpcy5yZWN0YW5nbGUuaGVpZ2h0ID0gcmVjdGFuZ2xlLndpZHRoO1xuICAgICAgICB0aGlzLnJlY3RhbmdsZS54ID0gcmVjdGFuZ2xlLnk7XG4gICAgICAgIHRoaXMucmVjdGFuZ2xlLnkgPSAodGhpcy5wYWdlSGVpZ2h0IC8gdGhpcy56b29tKSAtIHJlY3RhbmdsZS54IC0gcmVjdGFuZ2xlLndpZHRoO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBwb3B1cFRvcCgpIHtcbiAgICBjb25zdCBwb3B1cFRvcCA9IHRoaXMucmVjdGFuZ2xlLnkgKiB0aGlzLnpvb20gLSB0aGlzLmRlZmF1bHRIZWlnaHQ7XG4gICAgcmV0dXJuIHBvcHVwVG9wIDw9IDAgPyB0aGlzLmRlZmF1bHRIZWlnaHQgOiBwb3B1cFRvcDtcbiAgfVxuXG4gIHBvcHVwTGVmdCgpIHtcbiAgICBjb25zdCBwb3B1cExlZnQgPSAodGhpcy5yZWN0YW5nbGUueCArICh0aGlzLnJlY3RhbmdsZS53aWR0aCAvIDIpKSAqIHRoaXMuem9vbSAtICh0aGlzLmRlZmF1bHRXaWR0aCAvIDIpO1xuICAgIGlmIChwb3B1cExlZnQgPD0gMCkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfSBlbHNlIGlmIChwb3B1cExlZnQgPj0gdGhpcy5wYWdlV2lkdGggLSB0aGlzLmRlZmF1bHRXaWR0aCkge1xuICAgICAgcmV0dXJuIHRoaXMucGFnZVdpZHRoIC0gdGhpcy5kZWZhdWx0V2lkdGg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBwb3B1cExlZnQ7XG4gICAgfVxuICB9XG5cbiAgZm9jdXNUb29sYmFyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnRvb2xiYXJDb250YWluZXI/Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IGZpcnN0QnV0dG9uID0gdGhpcy50b29sYmFyQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignYnV0dG9uJyk7XG4gICAgICBcbiAgICAgIGlmIChmaXJzdEJ1dHRvbikge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IGZpcnN0QnV0dG9uLmZvY3VzKCksIDApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IFxuICAgIH1cbiAgfVxufVxuIiwiPGRpdiAjdG9vbGJhckNvbnRhaW5lciBjbGFzcz1cInRvb2xiYXJcIiAqbmdJZj1cInJlY3RhbmdsZVwiXG4gICAgIFtzdHlsZS50b3AucHhdPVwidG9wXCJcbiAgICAgW3N0eWxlLmxlZnQucHhdPVwibGVmdFwiPlxuICA8YnV0dG9uICpuZ0lmPVwiY2FuSGlnaGxpZ2h0XCJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCIgdGl0bGU9XCJIaWdobGlnaHRcIlxuICAgICAgICAgIGNsYXNzPVwiYXVpX190b29sYmFyLWJ1dHRvbiBhdWlfX3Rvb2xiYXItYnV0dG9uLS1jb21tZW50cyBjb250ZXh0dWFsLWJ0biBsZWZ0QnV0dG9uIGF1aV9fdG9vbGJhci1idXR0b24taGlnaGxpZ2h0XCJcbiAgICAgICAgICAobW91c2Vkb3duKT1cImNyZWF0ZUhpZ2hsaWdodCgpXCJcbiAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJjcmVhdGVIaWdobGlnaHQoKVwiPlxuICAgIDxzcGFuPkhpZ2hsaWdodDwvc3Bhbj5cbiAgPC9idXR0b24+XG4gIDxidXR0b24gKm5nSWY9XCJjYW5EZWxldGVcIlxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIiB0aXRsZT1cIkRlbGV0ZVwiXG4gICAgICAgICAgY2xhc3M9XCJhdWlfX3Rvb2xiYXItYnV0dG9uIGF1aV9fdG9vbGJhci1idXR0b24tLWNvbW1lbnRzIGNvbnRleHR1YWwtYnRuIGxlZnRCdXR0b25cIlxuICAgICAgICAgIChtb3VzZWRvd24pPVwiZGVsZXRlSGlnaGxpZ2h0KClcIlxuICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cImRlbGV0ZUhpZ2hsaWdodCgpXCI+XG4gICAgPHNwYW4+UmVtb3ZlPC9zcGFuPlxuICA8L2J1dHRvbj5cbiAgPGJ1dHRvbiAqbmdJZj1cImNhbkNvbW1lbnRcIlxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIiB0aXRsZT1cIkNvbW1lbnRcIlxuICAgICAgICAgIGNsYXNzPVwiYXVpX190b29sYmFyLWJ1dHRvbiBhdWlfX3Rvb2xiYXItYnV0dG9uLS1jb21tZW50cyBjb250ZXh0dWFsLWJ0biByaWdodEJ1dHRvbiBhdWlfX3Rvb2xiYXItYnV0dG9uLWNvbW1lbnRcIlxuICAgICAgICAgIChtb3VzZWRvd24pPVwiYWRkT3JFZGl0Q29tbWVudCgpXCJcbiAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJhZGRPckVkaXRDb21tZW50KClcIj5cbiAgICA8c3Bhbj5Db21tZW50PC9zcGFuPjwvYnV0dG9uPlxuICA8YnV0dG9uICpuZ0lmPVwiY2FuQm9va21hcmtcIlxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIiB0aXRsZT1cIkJvb2ttYXJrXCJcbiAgICAgICAgICBjbGFzcz1cImF1aV9fdG9vbGJhci1idXR0b24gYXVpX190b29sYmFyLWJ1dHRvbi0tY29tbWVudHMgY29udGV4dHVhbC1idG4gcmlnaHRCdXR0b24gYXVpX190b29sYmFyLWJ1dHRvbi1ib29rbWFya1wiXG4gICAgICAgICAgaWQ9XCJib29rbWFya0J1dHRvblwiXG4gICAgICAgICAgKG1vdXNlZG93bik9XCJjcmVhdGVCb29rbWFyaygpXCJcbiAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJjcmVhdGVCb29rbWFyaygpXCI+XG4gICAgPHNwYW4+Qm9va21hcms8L3NwYW4+PC9idXR0b24+XG4gIDxkaXYgY2xhc3M9XCJhcnJvdy1kb3duXCI+XG4gICAgPGRpdiBjbGFzcz1cImlubmVyLXRyaWFuZ2xlXCI+PC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=