@pepperi-addons/ngx-composite-lib 0.4.2-beta.67 → 0.4.2-beta.69
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/layout-builder/layout-builder.component.mjs +31 -11
- package/esm2020/layout-builder/layout-builder.service.mjs +108 -83
- package/fesm2015/pepperi-addons-ngx-composite-lib-layout-builder.mjs +139 -95
- package/fesm2015/pepperi-addons-ngx-composite-lib-layout-builder.mjs.map +1 -1
- package/fesm2020/pepperi-addons-ngx-composite-lib-layout-builder.mjs +136 -93
- package/fesm2020/pepperi-addons-ngx-composite-lib-layout-builder.mjs.map +1 -1
- package/layout-builder/layout-builder.component.d.ts +8 -2
- package/layout-builder/layout-builder.service.d.ts +17 -12
- package/package.json +1 -1
- package/src/assets/i18n/en.ngx-composite-lib.json +2 -0
|
@@ -4,12 +4,16 @@ import { moveItemInArray } from "@angular/cdk/drag-drop";
|
|
|
4
4
|
import { PepGuid, PepScreenSizeType } from "@pepperi-addons/ngx-lib";
|
|
5
5
|
import { BehaviorSubject } from 'rxjs';
|
|
6
6
|
import { distinctUntilChanged, filter } from 'rxjs/operators';
|
|
7
|
+
import { PepDialogData } from "@pepperi-addons/ngx-lib/dialog";
|
|
7
8
|
import * as i0 from "@angular/core";
|
|
8
9
|
import * as i1 from "@ngx-translate/core";
|
|
10
|
+
import * as i2 from "@pepperi-addons/ngx-lib/dialog";
|
|
9
11
|
export class PepLayoutBuilderService {
|
|
10
|
-
constructor(translate) {
|
|
12
|
+
constructor(translate, dialogService) {
|
|
11
13
|
this.translate = translate;
|
|
14
|
+
this.dialogService = dialogService;
|
|
12
15
|
this._defaultSectionTitle = '';
|
|
16
|
+
this._blocksLimitNumber = 0;
|
|
13
17
|
this._editorsBreadCrumb = Array();
|
|
14
18
|
this._editMode = false;
|
|
15
19
|
this._editableState = false;
|
|
@@ -43,11 +47,10 @@ export class PepLayoutBuilderService {
|
|
|
43
47
|
this._availableBlocksForDragMap = new Map();
|
|
44
48
|
this._availableBlocksForDragMapSubject = new BehaviorSubject(this.availableBlocksForDragMap);
|
|
45
49
|
//
|
|
50
|
+
this._defaultSectionTitle = this.translate.instant('LAYOUT_BUILDER.SECTION');
|
|
46
51
|
}
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
this._defaultSectionTitle = value;
|
|
50
|
-
}
|
|
52
|
+
setBlocksLimitNumber(value) {
|
|
53
|
+
this._blocksLimitNumber = value;
|
|
51
54
|
}
|
|
52
55
|
get editMode() {
|
|
53
56
|
return this._editMode;
|
|
@@ -135,14 +138,19 @@ export class PepLayoutBuilderService {
|
|
|
135
138
|
notifyAvailableBlocksForDragMapChange() {
|
|
136
139
|
this._availableBlocksForDragMapSubject.next(this.availableBlocksForDragMap);
|
|
137
140
|
}
|
|
141
|
+
notifyPreviewModeChange(value) {
|
|
142
|
+
this._previewModeSubject.next(value);
|
|
143
|
+
this.setEditableState();
|
|
144
|
+
}
|
|
145
|
+
notifyLockScreen(value) {
|
|
146
|
+
this._lockScreenSubject.next(value);
|
|
147
|
+
}
|
|
148
|
+
notifySectionsColumnsDropListChange(sectionsColumnsDropList) {
|
|
149
|
+
this._sectionsColumnsDropListSubject.next(sectionsColumnsDropList);
|
|
150
|
+
}
|
|
138
151
|
updateLayoutEditorProperties(layoutView) {
|
|
139
152
|
if (this._editorsBreadCrumb[0]) {
|
|
140
153
|
const layoutEditor = {
|
|
141
|
-
// pageName: page?.Name,
|
|
142
|
-
// pageDescription: page?.Description,
|
|
143
|
-
// parameters: page.Parameters,
|
|
144
|
-
// onLoadFlow: page.OnLoadFlow,
|
|
145
|
-
// onChangeFlow: page.OnChangeFlow,
|
|
146
154
|
maxWidth: layoutView?.Layout.MaxWidth || 0,
|
|
147
155
|
verticalSpacing: layoutView?.Layout.VerticalSpacing,
|
|
148
156
|
horizontalSpacing: layoutView?.Layout.HorizontalSpacing,
|
|
@@ -174,21 +182,36 @@ export class PepLayoutBuilderService {
|
|
|
174
182
|
this.notifyEditorChange(this._editorsBreadCrumb[this._editorsBreadCrumb.length - 1]);
|
|
175
183
|
}
|
|
176
184
|
}
|
|
177
|
-
|
|
185
|
+
getEditorByType(editorType, id) {
|
|
178
186
|
// Build editor object.
|
|
179
187
|
let editor = null;
|
|
180
188
|
if (editorType === 'section') {
|
|
181
|
-
editor = this.
|
|
189
|
+
editor = this.getInternalSectionEditor(id);
|
|
182
190
|
}
|
|
183
191
|
else if (editorType === 'block') {
|
|
184
|
-
editor = this.
|
|
192
|
+
editor = this.getInternalBlockEditor(id);
|
|
185
193
|
}
|
|
186
194
|
return editor;
|
|
187
195
|
}
|
|
196
|
+
getInternalBlockEditor(blockKey) {
|
|
197
|
+
const blockContainer = this.getBlockContainerByBlockKey(blockKey);
|
|
198
|
+
const defaultTitle = this.translate.instant('LAYOUT_BUILDER.NO_TITLE');
|
|
199
|
+
let blockTitle = defaultTitle;
|
|
200
|
+
if (blockContainer) {
|
|
201
|
+
blockTitle = this.availableBlocksForDragMap?.get(blockContainer?.DraggableItemKey)?.title || defaultTitle;
|
|
202
|
+
}
|
|
203
|
+
return {
|
|
204
|
+
id: blockKey,
|
|
205
|
+
type: 'block',
|
|
206
|
+
title: blockTitle,
|
|
207
|
+
// remoteModuleOptions: remoteLoaderOptions,
|
|
208
|
+
hostObject: {} // JSON.parse(JSON.stringify(hostObject))
|
|
209
|
+
};
|
|
210
|
+
}
|
|
188
211
|
getSectionEditorTitle(section, sectionIndex) {
|
|
189
212
|
return section.Name || `${this._defaultSectionTitle} ${sectionIndex + 1}`;
|
|
190
213
|
}
|
|
191
|
-
|
|
214
|
+
getInternalSectionEditor(sectionId) {
|
|
192
215
|
const layoutView = this._layoutViewSubject.getValue();
|
|
193
216
|
const sections = layoutView?.Layout.Sections || [];
|
|
194
217
|
const sectionIndex = sections.findIndex(section => section.Key === sectionId);
|
|
@@ -232,14 +255,14 @@ export class PepLayoutBuilderService {
|
|
|
232
255
|
}
|
|
233
256
|
return currentColumn;
|
|
234
257
|
}
|
|
235
|
-
setSectionsColumnsGap(layoutView) {
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
}
|
|
258
|
+
// private setSectionsColumnsGap(layoutView: IPepLayoutView) {
|
|
259
|
+
// if (layoutView?.Layout?.Sections) {
|
|
260
|
+
// for (let index = 0; index < layoutView.Layout.Sections.length; index++) {
|
|
261
|
+
// const section = layoutView.Layout.Sections[index];
|
|
262
|
+
// section.ColumnsGap = layoutView.Layout.ColumnsGap;
|
|
263
|
+
// }
|
|
264
|
+
// }
|
|
265
|
+
// }
|
|
243
266
|
getCssScreenWidh(screenType) {
|
|
244
267
|
let widthToSet = '100%';
|
|
245
268
|
if (screenType === 'Tablet') {
|
|
@@ -276,22 +299,14 @@ export class PepLayoutBuilderService {
|
|
|
276
299
|
/***********************************************************************************************/
|
|
277
300
|
/* Public functions
|
|
278
301
|
/***********************************************************************************************/
|
|
279
|
-
|
|
280
|
-
this.
|
|
302
|
+
setSectionsColumnsDropListChange(sectionsColumnsDropList) {
|
|
303
|
+
this.notifySectionsColumnsDropListChange(sectionsColumnsDropList);
|
|
281
304
|
}
|
|
282
|
-
|
|
283
|
-
this.
|
|
284
|
-
this.setEditableState();
|
|
285
|
-
}
|
|
286
|
-
notifyLockScreen(value) {
|
|
287
|
-
this._lockScreenSubject.next(value);
|
|
305
|
+
setLockScreen(value) {
|
|
306
|
+
this.notifyLockScreen(value);
|
|
288
307
|
}
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
if (currentEditor) {
|
|
292
|
-
currentEditor.title = title;
|
|
293
|
-
this.notifyEditorChange(currentEditor);
|
|
294
|
-
}
|
|
308
|
+
changePreviewMode(value) {
|
|
309
|
+
this.notifyPreviewModeChange(value);
|
|
295
310
|
}
|
|
296
311
|
setAvailableBlocksToDrag(availableBlocksForDrag) {
|
|
297
312
|
this._availableBlocksForDragMap.clear();
|
|
@@ -300,21 +315,6 @@ export class PepLayoutBuilderService {
|
|
|
300
315
|
});
|
|
301
316
|
this.notifyAvailableBlocksForDragMapChange();
|
|
302
317
|
}
|
|
303
|
-
getBlockEditor(blockKey) {
|
|
304
|
-
const blockContainer = this.getBlockContainerByBlockKey(blockKey);
|
|
305
|
-
const defaultTitle = this.translate.instant('LAYOUT_BUILDER.NO_TITLE');
|
|
306
|
-
let blockTitle = defaultTitle;
|
|
307
|
-
if (blockContainer) {
|
|
308
|
-
blockTitle = this.availableBlocksForDragMap?.get(blockContainer?.DraggableItemKey)?.title || defaultTitle;
|
|
309
|
-
}
|
|
310
|
-
return {
|
|
311
|
-
id: blockKey,
|
|
312
|
-
type: 'block',
|
|
313
|
-
title: blockTitle,
|
|
314
|
-
// remoteModuleOptions: remoteLoaderOptions,
|
|
315
|
-
hostObject: {} // JSON.parse(JSON.stringify(hostObject))
|
|
316
|
-
};
|
|
317
|
-
}
|
|
318
318
|
getScreenType(size) {
|
|
319
319
|
const screenType = size < PepScreenSizeType.MD ? 'Landscape' :
|
|
320
320
|
(size === PepScreenSizeType.MD || size === PepScreenSizeType.SM ? 'Tablet' : 'Phablet');
|
|
@@ -338,7 +338,7 @@ export class PepLayoutBuilderService {
|
|
|
338
338
|
// Always pop the last and insert the current.
|
|
339
339
|
this._editorsBreadCrumb.pop();
|
|
340
340
|
}
|
|
341
|
-
let editor = this.
|
|
341
|
+
let editor = this.getEditorByType(editorType, id);
|
|
342
342
|
if (editor) {
|
|
343
343
|
this._editorsBreadCrumb.push(editor);
|
|
344
344
|
this.changeCurrentEditor();
|
|
@@ -368,7 +368,7 @@ export class PepLayoutBuilderService {
|
|
|
368
368
|
layoutView.Layout.SectionsGap = editorData.sectionsGap;
|
|
369
369
|
layoutView.Layout.ColumnsGap = editorData.columnsGap;
|
|
370
370
|
// layoutView.layout.RoundedCorners = editorData.roundedCorners;
|
|
371
|
-
this.setSectionsColumnsGap(layoutView);
|
|
371
|
+
// this.setSectionsColumnsGap(layoutView);
|
|
372
372
|
this.notifyLayoutViewChange(layoutView);
|
|
373
373
|
}
|
|
374
374
|
}
|
|
@@ -405,7 +405,8 @@ export class PepLayoutBuilderService {
|
|
|
405
405
|
const currentEditor = this._editorSubject.getValue();
|
|
406
406
|
if (currentEditor && currentEditor.type === 'section' && currentEditor.id === currentSection.Key) {
|
|
407
407
|
const title = this.getSectionEditorTitle(currentSection, sectionIndex);
|
|
408
|
-
|
|
408
|
+
currentEditor.title = title;
|
|
409
|
+
this.notifyEditorChange(currentEditor);
|
|
409
410
|
}
|
|
410
411
|
// Update sections change.
|
|
411
412
|
this.notifyLayoutViewChange(layoutView);
|
|
@@ -505,36 +506,60 @@ export class PepLayoutBuilderService {
|
|
|
505
506
|
}
|
|
506
507
|
}
|
|
507
508
|
}
|
|
509
|
+
getBlocksNumber() {
|
|
510
|
+
let blocksNumber = 0;
|
|
511
|
+
const sections = this._layoutViewSubject.getValue()?.Layout.Sections || [];
|
|
512
|
+
for (let index = 0; index < sections.length; index++) {
|
|
513
|
+
const section = sections[index];
|
|
514
|
+
for (let columnIndex = 0; columnIndex < section.Columns.length; columnIndex++) {
|
|
515
|
+
const column = section.Columns[columnIndex];
|
|
516
|
+
if (column.BlockContainer && column.BlockContainer.BlockKey?.length > 0) {
|
|
517
|
+
blocksNumber++;
|
|
518
|
+
}
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
return blocksNumber;
|
|
522
|
+
}
|
|
508
523
|
onBlockDropped(event, sectionId) {
|
|
509
524
|
const layoutView = this._layoutViewSubject.getValue();
|
|
510
525
|
if (event.previousContainer.id === PepLayoutBuilderService.AVAILABLE_BLOCKS_CONTAINER_ID) {
|
|
511
|
-
//
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
// Set the block key in the section block only if there is a blank column.
|
|
519
|
-
if (currentColumn && !currentColumn.BlockContainer) {
|
|
520
|
-
// Generate the block uuid.
|
|
521
|
-
const blockKey = PepGuid.newGuid();
|
|
522
|
-
currentColumn.BlockContainer = {
|
|
523
|
-
BlockKey: blockKey,
|
|
524
|
-
DraggableItemKey: draggableItem.data.key,
|
|
525
|
-
};
|
|
526
|
-
// Here we update the layout view cause the layout is updated.
|
|
527
|
-
this.notifyLayoutViewChange(layoutView);
|
|
528
|
-
// Raise block added event.
|
|
529
|
-
const blockAddedEventData = {
|
|
530
|
-
BlockKey: blockKey,
|
|
531
|
-
DraggableItem: draggableItem,
|
|
532
|
-
};
|
|
533
|
-
this.notifyBlockAdded(blockAddedEventData);
|
|
534
|
-
}
|
|
526
|
+
// Validate if blocks number allow.
|
|
527
|
+
if (this._blocksLimitNumber > 0 && this.getBlocksNumber() >= this._blocksLimitNumber) {
|
|
528
|
+
const data = new PepDialogData({
|
|
529
|
+
title: this.translate.instant('MESSAGES.DIALOG_NOTICE_TITLE'),
|
|
530
|
+
content: this.translate.instant('LAYOUT_BUILDER.BLOCKS_COUNT_LIMIT_MESSAGE'),
|
|
531
|
+
});
|
|
532
|
+
this.dialogService.openDefaultDialog(data);
|
|
535
533
|
}
|
|
536
534
|
else {
|
|
537
|
-
|
|
535
|
+
// Get the block relation (previousContainer.data is IPepDraggableItem and inside we have AvailableBlock object).
|
|
536
|
+
const draggableItem = event.previousContainer.data[event.previousIndex];
|
|
537
|
+
if (draggableItem) {
|
|
538
|
+
// lock the screen untill the editor will be loaded.
|
|
539
|
+
// this._lockScreenSubject.next(true);
|
|
540
|
+
// Get the column.
|
|
541
|
+
const currentColumn = this.getSectionColumnByIdForEditor(event.container.id);
|
|
542
|
+
// Set the block key in the section block only if there is a blank column.
|
|
543
|
+
if (currentColumn && !currentColumn.BlockContainer) {
|
|
544
|
+
// Generate the block uuid.
|
|
545
|
+
const blockKey = PepGuid.newGuid();
|
|
546
|
+
currentColumn.BlockContainer = {
|
|
547
|
+
BlockKey: blockKey,
|
|
548
|
+
DraggableItemKey: draggableItem.data.key,
|
|
549
|
+
};
|
|
550
|
+
// Here we update the layout view cause the layout is updated.
|
|
551
|
+
this.notifyLayoutViewChange(layoutView);
|
|
552
|
+
// Raise block added event.
|
|
553
|
+
const blockAddedEventData = {
|
|
554
|
+
BlockKey: blockKey,
|
|
555
|
+
DraggableItem: draggableItem,
|
|
556
|
+
};
|
|
557
|
+
this.notifyBlockAdded(blockAddedEventData);
|
|
558
|
+
}
|
|
559
|
+
}
|
|
560
|
+
else {
|
|
561
|
+
console.log("draggableItem is not a IPepDraggableItem type");
|
|
562
|
+
}
|
|
538
563
|
}
|
|
539
564
|
}
|
|
540
565
|
else {
|
|
@@ -606,7 +631,7 @@ export class PepLayoutBuilderService {
|
|
|
606
631
|
// Load the layout editor.
|
|
607
632
|
this.loadDefaultEditor(layoutView);
|
|
608
633
|
// Set the columns gap of the sections.
|
|
609
|
-
this.setSectionsColumnsGap(layoutView);
|
|
634
|
+
// this.setSectionsColumnsGap(layoutView);
|
|
610
635
|
}
|
|
611
636
|
// Load only the layout view.
|
|
612
637
|
this.notifyLayoutViewChange(layoutView);
|
|
@@ -614,12 +639,12 @@ export class PepLayoutBuilderService {
|
|
|
614
639
|
}
|
|
615
640
|
PepLayoutBuilderService.AVAILABLE_BLOCKS_CONTAINER_ID = 'availableBlocks';
|
|
616
641
|
PepLayoutBuilderService.MAIN_EDITOR_ID = 'main';
|
|
617
|
-
PepLayoutBuilderService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: PepLayoutBuilderService, deps: [{ token: i1.TranslateService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
642
|
+
PepLayoutBuilderService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: PepLayoutBuilderService, deps: [{ token: i1.TranslateService }, { token: i2.PepDialogService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
618
643
|
PepLayoutBuilderService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: PepLayoutBuilderService, providedIn: 'root' });
|
|
619
644
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: PepLayoutBuilderService, decorators: [{
|
|
620
645
|
type: Injectable,
|
|
621
646
|
args: [{
|
|
622
647
|
providedIn: 'root',
|
|
623
648
|
}]
|
|
624
|
-
}], ctorParameters: function () { return [{ type: i1.TranslateService }]; } });
|
|
625
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF5b3V0LWJ1aWxkZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1jb21wb3NpdGUtbGliL2xheW91dC1idWlsZGVyL2xheW91dC1idWlsZGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM3RCxPQUFPLEVBQXdELGVBQWUsRUFBcUIsTUFBTSx3QkFBd0IsQ0FBQztBQUVsSSxPQUFPLEVBQW1CLE9BQU8sRUFBa0IsaUJBQWlCLEVBQTBDLE1BQU0seUJBQXlCLENBQUM7QUFJOUksT0FBTyxFQUFjLGVBQWUsRUFBVyxNQUFNLE1BQU0sQ0FBQztBQUM1RCxPQUFPLEVBQWdCLG9CQUFvQixFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7QUFNNUUsTUFBTSxPQUFPLHVCQUF1QjtJQW1IaEMsWUFDYyxTQUEyQjtRQUEzQixjQUFTLEdBQVQsU0FBUyxDQUFrQjtRQWhIakMseUJBQW9CLEdBQUcsRUFBRSxDQUFDO1FBTzFCLHVCQUFrQixHQUFHLEtBQUssRUFBVyxDQUFDO1FBRXRDLGNBQVMsR0FBWSxLQUFLLENBQUM7UUFTM0IsbUJBQWMsR0FBWSxLQUFLLENBQUM7UUFLeEMscURBQXFEO1FBQzNDLHVCQUFrQixHQUF1QyxJQUFJLGVBQWUsQ0FBb0IsaUJBQWlCLENBQUMsRUFBRSxDQUFDLENBQUM7UUFLaEksK0VBQStFO1FBQ3ZFLHdCQUFtQixHQUE0QixJQUFJLGVBQWUsQ0FBUyxNQUFNLENBQUMsQ0FBQztRQUszRix5RUFBeUU7UUFDL0QsbUJBQWMsR0FBb0MsSUFBSSxlQUFlLENBQWlCLElBQUksQ0FBQyxDQUFDO1FBS3RHLGtEQUFrRDtRQUMxQyxvQ0FBK0IsR0FBMkIsSUFBSSxlQUFlLENBQVEsRUFB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RUFBRSxDQUFDLENBQUM7YUFDdEQ7aUJBQU0sSUFBSSxLQUFLLEdBQUcsR0FBRyxFQUFFO2dCQUNwQixJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxDQUFDO2FBQ3REO1NBQ0o7SUFDTCxDQUFDO0lBRUQsWUFBWSxDQUFDLElBQWE7UUFDdEIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQsaUJBQWlCLENBQUMsVUFBMEI7UUFDeEMsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2YsMEJBQTBCO1lBQzFCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUVuQyx1Q0FBdUM7WUFDdkMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1NBQzFDO1FBRUQsNkJBQTZCO1FBQzdCLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUM1QyxDQUFDOztBQS9zQmUscURBQTZCLEdBQUcsaUJBQWtCLENBQUE7QUFDbEQsc0NBQWMsR0FBRyxNQUFPLENBQUE7b0hBRi9CLHVCQUF1Qjt3SEFBdkIsdUJBQXVCLGNBRnBCLE1BQU07MkZBRVQsdUJBQXVCO2tCQUhuQyxVQUFVO21CQUFDO29CQUNSLFVBQVUsRUFBRSxNQUFNO2lCQUNyQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgY29lcmNlTnVtYmVyUHJvcGVydHkgfSBmcm9tIFwiQGFuZ3VsYXIvY2RrL2NvZXJjaW9uXCI7XG5pbXBvcnQgeyBDZGtEcmFnRHJvcCwgQ2RrRHJhZ0VuZCwgQ2RrRHJhZ1N0YXJ0LCBjb3B5QXJyYXlJdGVtLCBtb3ZlSXRlbUluQXJyYXksIHRyYW5zZmVyQXJyYXlJdGVtIH0gZnJvbSBcIkBhbmd1bGFyL2Nkay9kcmFnLWRyb3BcIjtcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tIFwiQG5neC10cmFuc2xhdGUvY29yZVwiO1xuaW1wb3J0IHsgUGVwQWRkb25TZXJ2aWNlLCBQZXBHdWlkLCBQZXBIdHRwU2VydmljZSwgUGVwU2NyZWVuU2l6ZVR5cGUsIFBlcFNlc3Npb25TZXJ2aWNlLCBQZXBVdGlsaXRpZXNTZXJ2aWNlIH0gZnJvbSBcIkBwZXBwZXJpLWFkZG9ucy9uZ3gtbGliXCI7XG5pbXBvcnQgeyBJUGVwRHJhZ2dhYmxlSXRlbSB9IGZyb20gXCJAcGVwcGVyaS1hZGRvbnMvbmd4LWxpYi9kcmFnZ2FibGUtaXRlbXNcIjtcbmltcG9ydCB7IERhdGFWaWV3U2NyZWVuU2l6ZSwgU2NyZWVuU2l6ZURhdGFDb25maWd1cmF0aW9uIH0gZnJvbSBcIkBwZXBwZXJpLWFkZG9ucy9wYXBpLXNka1wiO1xuaW1wb3J0IHsgUGVwU25hY2tCYXJEYXRhLCBQZXBTbmFja0JhclNlcnZpY2UgfSBmcm9tIFwiQHBlcHBlcmktYWRkb25zL25neC1saWIvc25hY2stYmFyXCI7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBCZWhhdmlvclN1YmplY3QsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQsIGZpbHRlciB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IExheW91dEVkaXRvclR5cGUsIElFZGl0b3IsIElQZXBMYXlvdXRCbG9ja0FkZGVkRXZlbnQsIElMYXlvdXRFZGl0b3IsIElQZXBMYXlvdXRTZWN0aW9uLCBJUGVwTGF5b3V0U2VjdGlvbkNvbHVtbiwgSVBlcExheW91dFZpZXcsIElMYXlvdXRTZWN0aW9uRWRpdG9yLCBQZXBMYXlvdXRTaXplVHlwZSwgSVBlcExheW91dEJsb2NrQ29udGFpbmVyIH0gZnJvbSBcIi4vbGF5b3V0LWJ1aWxkZXIubW9kZWxcIjtcblxuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgUGVwTGF5b3V0QnVpbGRlclNlcnZpY2Uge1xuICAgIHN0YXRpYyByZWFkb25seSBBVkFJTEFCTEVfQkxPQ0tTX0NPTlRBSU5FUl9JRCA9ICdhdmFpbGFibGVCbG9ja3MnO1xuICAgIHN0YXRpYyByZWFkb25seSBNQUlOX0VESVRPUl9JRCA9ICdtYWluJztcblxuICAgIHByaXZhdGUgX2RlZmF1bHRTZWN0aW9uVGl0bGUgPSAnJztcbiAgICBzZXQgZGVmYXVsdFNlY3Rpb25UaXRsZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIGlmICh0aGlzLl9kZWZhdWx0U2VjdGlvblRpdGxlID09PSAnJykge1xuICAgICAgICAgICAgdGhpcy5fZGVmYXVsdFNlY3Rpb25UaXRsZSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZWRpdG9yc0JyZWFkQ3J1bWIgPSBBcnJheTxJRWRpdG9yPigpO1xuXG4gICAgcHJpdmF0ZSBfZWRpdE1vZGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBnZXQgZWRpdE1vZGUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9lZGl0TW9kZTtcbiAgICB9XG4gICAgc2V0RWRpdE1vZGUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5fZWRpdE1vZGUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5zZXRFZGl0YWJsZVN0YXRlKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZWRpdGFibGVTdGF0ZTogYm9vbGVhbiA9IGZhbHNlO1xuICAgIGdldCBlZGl0YWJsZVN0YXRlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZWRpdGFibGVTdGF0ZTtcbiAgICB9XG5cbiAgICAvLyBUaGlzIHN1YmplY3QgaXMgZm9yIHRoZSBzY3JlZW4gc2l6ZSBjaGFuZ2UgZXZlbnRzLlxuICAgIHByb3RlY3RlZCBfc2NyZWVuU2l6ZVN1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxQZXBTY3JlZW5TaXplVHlwZT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFBlcFNjcmVlblNpemVUeXBlPihQZXBTY3JlZW5TaXplVHlwZS5YTCk7XG4gICAgZ2V0IHNjcmVlblNpemVDaGFuZ2UkKCk6IE9ic2VydmFibGU8UGVwU2NyZWVuU2l6ZVR5cGU+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NjcmVlblNpemVTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSk7XG4gICAgfVxuXG4gICAgLy8gVGhpcyBzdWJqZWN0IGlzIGZvciBkZW1vc3RyYXRlIHRoZSBjb250YWluZXIgc2l6ZSAoVXNhZ2Ugb25seSBpbiBlZGl0IG1vZGUpLlxuICAgIHByaXZhdGUgX3NjcmVlbldpZHRoU3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4oJzEwMCUnKTtcbiAgICBnZXQgc2NyZWVuV2lkdGhDaGFuZ2UkKCk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zY3JlZW5XaWR0aFN1YmplY3QuYXNPYnNlcnZhYmxlKCkucGlwZShkaXN0aW5jdFVudGlsQ2hhbmdlZCgpKTtcbiAgICB9XG5cbiAgICAvLyBUaGlzIHN1YmplY3QgaXMgZm9yIGxvYWQgdGhlIGN1cnJlbnQgZWRpdG9yIChVc2FnZSBvbmx5IGluIGVkaXQgbW9kZSkuXG4gICAgcHJvdGVjdGVkIF9lZGl0b3JTdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8SUVkaXRvciB8IG51bGw+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxJRWRpdG9yIHwgbnVsbD4obnVsbCk7XG4gICAgZ2V0IGVkaXRvckNoYW5nZSQoKTogT2JzZXJ2YWJsZTxJRWRpdG9yIHwgbnVsbD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZWRpdG9yU3ViamVjdC5hc09ic2VydmFibGUoKS5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpO1xuICAgIH1cblxuICAgIC8vIFRoaXMgaXMgdGhlIHNlY3Rpb25zIGNvbHVtbnMgZHJvcCBsaXN0IHN1YmplY3QuXG4gICAgcHJpdmF0ZSBfc2VjdGlvbnNDb2x1bW5zRHJvcExpc3RTdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8YW55W10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnlbXT4oW10pO1xuICAgIGdldCBzZWN0aW9uc0NvbHVtbnNEcm9wTGlzdENoYW5nZSQoKTogT2JzZXJ2YWJsZTxhbnlbXT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2VjdGlvbnNDb2x1bW5zRHJvcExpc3RTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICAgIH1cblxuICAgIC8vIFRoaXMgaXMgdGhlIHNlY3Rpb25zIHN1YmplY3QgKGEgcGFyZSBmcm9tIHRoZSBsYXlvdXQgdmlldyBvYmplY3QpXG4gICAgcHJpdmF0ZSBfc2VjdGlvbnNWaWV3U3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PElQZXBMYXlvdXRTZWN0aW9uW10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxJUGVwTGF5b3V0U2VjdGlvbltdPihbXSk7XG4gICAgZ2V0IHNlY3Rpb25zQ2hhbmdlJCgpOiBPYnNlcnZhYmxlPElQZXBMYXlvdXRTZWN0aW9uW10+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NlY3Rpb25zVmlld1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gICAgICAgIC8vIChwcmV2U2VjdGlvbnMsIG5leHRTZWN0aW9ucykgPT4gSlNPTi5zdHJpbmdpZnkocHJldlNlY3Rpb25zKSA9PT0gSlNPTi5zdHJpbmdpZnkobmV4dFNlY3Rpb25zKSkpO1xuICAgIH1cblxuICAgIC8vIFRoaXMgc3ViamVjdCBpcyBmb3IgbGF5b3V0IHZpZXcgY2hhbmdlLlxuICAgIHByaXZhdGUgX2xheW91dFZpZXdTdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8SVBlcExheW91dFZpZXcgfCBudWxsPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8SVBlcExheW91dFZpZXcgfCBudWxsPihudWxsKTtcbiAgICBnZXQgbGF5b3V0Vmlld0NoYW5nZSQoKTogT2JzZXJ2YWJsZTxJUGVwTGF5b3V0VmlldyB8IG51bGw+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xheW91dFZpZXdTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpLnBpcGUoZmlsdGVyKGxheW91dCA9PiAhIWxheW91dCkpO1xuICAgIH1cblxuICAgIC8vIFRoaXMgc3ViamVjdCBpcyBmb3IgZWRpdCBtb2RlIHdoZW4gYmxvY2sgaXMgZHJhZ2dpbmcgbm93IG9yIG5vdC5cbiAgICBwcml2YXRlIF9kcmFnZ2luZ0Jsb2NrS2V5OiBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPiA9IG5ldyBCZWhhdmlvclN1YmplY3QoJycpO1xuICAgIGdldCBkcmFnZ2luZ0Jsb2NrS2V5KCk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kcmFnZ2luZ0Jsb2NrS2V5LmFzT2JzZXJ2YWJsZSgpLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSk7XG4gICAgfVxuXG4gICAgLy8gVGhpcyBzdWJqZWN0IGlzIGZvciBlZGl0IG1vZGUgd2hlbiBzZWN0aW9uIGlzIGRyYWdnaW5nIG5vdyBvciBub3QuXG4gICAgcHJpdmF0ZSBfZHJhZ2dpbmdTZWN0aW9uS2V5OiBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPiA9IG5ldyBCZWhhdmlvclN1YmplY3QoJycpO1xuICAgIGdldCBkcmFnZ2luZ1NlY3Rpb25LZXkoKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RyYWdnaW5nU2VjdGlvbktleS5hc09ic2VydmFibGUoKS5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpO1xuICAgIH1cblxuICAgIC8vIFRoaXMgc3ViamVjdCBpcyBmb3IgbG9jayBvciB1bmxvY2sgdGhlIHNjcmVlbiAoVXNhZ2Ugb25seSBpbiBlZGl0IG1vZGUpLlxuICAgIHByaXZhdGUgX2xvY2tTY3JlZW5TdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgICBnZXQgbG9ja1NjcmVlbkNoYW5nZSQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sb2NrU2NyZWVuU3ViamVjdC5hc09ic2VydmFibGUoKS5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpO1xuICAgIH1cblxuICAgIC8vIFRoaXMgaXMgZm9yIGNvbnRyb2wgdGhlIHByZXZpZXcgbW9kZSAoZm9yIGxvYWQgdGhlIGJsb2NrcyB3aXRoIHRoZSBDUEkgZXZlbnRzKSBcbiAgICBwcml2YXRlIF9wcmV2aWV3TW9kZVN1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICAgIGdldCBwcmV2aWV3TW9kZUNoYW5nZSQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wcmV2aWV3TW9kZVN1YmplY3QuYXNPYnNlcnZhYmxlKCkucGlwZShkaXN0aW5jdFVudGlsQ2hhbmdlZCgpKTtcbiAgICB9XG5cbiAgICAvLyBUaGlzIGlzIGZvciBlZGl0b3IgbW9kZSBmb3IgYmxvY2sgYWRkZWQuXG4gICAgcHJpdmF0ZSBfYmxvY2tBZGRlZEV2ZW50U3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8SVBlcExheW91dEJsb2NrQWRkZWRFdmVudCB8IG51bGw+KG51bGwpO1xuICAgIGdldCBibG9ja0FkZGVkRXZlbnRTdWJqZWN0JCgpOiBPYnNlcnZhYmxlPElQZXBMYXlvdXRCbG9ja0FkZGVkRXZlbnQgfCBudWxsPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9ibG9ja0FkZGVkRXZlbnRTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICAgIH1cbiAgICAvLyBUaGlzIGlzIGZvciBlZGl0b3IgbW9kZSBmb3IgYmxvY2tzIHJlbW92ZWQuXG4gICAgcHJpdmF0ZSBfYmxvY2tzUmVtb3ZlZEV2ZW50U3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nW10+KFtdKTtcbiAgICBnZXQgYmxvY2tzUmVtb3ZlZEV2ZW50U3ViamVjdCQoKTogT2JzZXJ2YWJsZTxzdHJpbmdbXT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fYmxvY2tzUmVtb3ZlZEV2ZW50U3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgICB9XG5cbiAgICAvLyBUaGlzIHN1YmplY3QgaXMgZm9yIHNrZWxldG9uLlxuICAgIHByaXZhdGUgX3Nob3dTa2VsZXRvblN1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4odHJ1ZSk7XG4gICAgZ2V0IHNob3dTa2VsZXRvbkNoYW5nZSQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zaG93U2tlbGV0b25TdWJqZWN0LmFzT2JzZXJ2YWJsZSgpLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSk7XG4gICAgfVxuICAgIFxuICAgIC8vIFRoaXMgc3ViamVjdHMgaXMgZm9yIGxvYWQgdGhlIGF2YWlsYWJsZSBibG9ja3MgdG8gZHJhZyBpbnRvIG1hcCBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlLlxuICAgIHByaXZhdGUgX2F2YWlsYWJsZUJsb2Nrc0ZvckRyYWdNYXAgPSBuZXcgTWFwPHN0cmluZywgSVBlcERyYWdnYWJsZUl0ZW0+KCk7XG4gICAgZ2V0IGF2YWlsYWJsZUJsb2Nrc0ZvckRyYWdNYXAoKTogUmVhZG9ubHlNYXA8c3RyaW5nLCBJUGVwRHJhZ2dhYmxlSXRlbT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fYXZhaWxhYmxlQmxvY2tzRm9yRHJhZ01hcDtcbiAgICB9XG4gICAgcHJpdmF0ZSBfYXZhaWxhYmxlQmxvY2tzRm9yRHJhZ01hcFN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFJlYWRvbmx5TWFwPHN0cmluZywgSVBlcERyYWdnYWJsZUl0ZW0+Pih0aGlzLmF2YWlsYWJsZUJsb2Nrc0ZvckRyYWdNYXApO1xuICAgIGdldCBhdmFpbGFibGVCbG9ja3NGb3JEcmFnTWFwQ2hhbmdlJCgpOiBPYnNlcnZhYmxlPFJlYWRvbmx5TWFwPHN0cmluZywgSVBlcERyYWdnYWJsZUl0ZW0+PiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hdmFpbGFibGVCbG9ja3NGb3JEcmFnTWFwU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJvdGVjdGVkIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICApIHtcbiAgICAgICAgLy9cbiAgICB9XG4gICAgXG4gICAgcHJpdmF0ZSBzZXRFZGl0YWJsZVN0YXRlKCkge1xuICAgICAgICB0aGlzLl9lZGl0YWJsZVN0YXRlID0gdGhpcy5lZGl0TW9kZSAmJiAhdGhpcy5fcHJldmlld01vZGVTdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBub3RpZnlMYXlvdXRWaWV3Q2hhbmdlKGxheW91dFZpZXdUb1VwZGF0ZTogSVBlcExheW91dFZpZXcgfCBudWxsKSB7XG4gICAgICAgIGlmIChsYXlvdXRWaWV3VG9VcGRhdGUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmVkaXRNb2RlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVMYXlvdXRFZGl0b3JQcm9wZXJ0aWVzKGxheW91dFZpZXdUb1VwZGF0ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgbGF5b3V0IGZvciB0aGUgdmlldy5cbiAgICAgICAgICAgIHRoaXMuX2xheW91dFZpZXdTdWJqZWN0Lm5leHQobGF5b3V0Vmlld1RvVXBkYXRlKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBzZWN0aW9ucyBmb3IgdGhlIHZpZXcuXG4gICAgICAgICAgICB0aGlzLl9zZWN0aW9uc1ZpZXdTdWJqZWN0Lm5leHQobGF5b3V0Vmlld1RvVXBkYXRlPy5MYXlvdXQuU2VjdGlvbnMgfHwgW10pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBub3RpZnlCbG9ja0FkZGVkKGJsb2NrQWRkZWRFdmVudERhdGE6IElQZXBMYXlvdXRCbG9ja0FkZGVkRXZlbnQpIHtcbiAgICAgICAgLy8gTm90aWZ5IHRoYXQgdGhlIGJsb2NrIGlzIGFkZGVkICh0byByYWlzZSB0aGUgZXZlbnQgZm9yIHRoZSBjbGllbnQpLlxuICAgICAgICB0aGlzLl9ibG9ja0FkZGVkRXZlbnRTdWJqZWN0Lm5leHQoYmxvY2tBZGRlZEV2ZW50RGF0YSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBub3RpZnlCbG9ja3NSZW1vdmVkKGtleXM6IHN0cmluZ1tdIHwgdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmIChrZXlzKSB7XG4gICAgICAgICAgICAvLyBOb3RpZnkgdGhhdCB0aGUgYmxvY2tzIGFyZSByZW1vdmVkICh0byByYWlzZSB0aGUgZXZlbnQgZm9yIHRoZSBjbGllbnQpLlxuICAgICAgICAgICAgdGhpcy5fYmxvY2tzUmVtb3ZlZEV2ZW50U3ViamVjdC5uZXh0KGtleXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBub3RpZnlFZGl0b3JDaGFuZ2UoZWRpdG9yOiBJRWRpdG9yIHwgbnVsbCkge1xuICAgICAgICB0aGlzLl9lZGl0b3JTdWJqZWN0Lm5leHQoZWRpdG9yKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG5vdGlmeUF2YWlsYWJsZUJsb2Nrc0ZvckRyYWdNYXBDaGFuZ2UoKSB7XG4gICAgICAgIHRoaXMuX2F2YWlsYWJsZUJsb2Nrc0ZvckRyYWdNYXBTdWJqZWN0Lm5leHQodGhpcy5hdmFpbGFibGVCbG9ja3NGb3JEcmFnTWFwKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZUxheW91dEVkaXRvclByb3BlcnRpZXMobGF5b3V0VmlldzogSVBlcExheW91dFZpZXcpIHtcbiAgICAgICAgaWYgKHRoaXMuX2VkaXRvcnNCcmVhZENydW1iWzBdKSB7XG4gICAgICAgICAgICBjb25zdCBsYXlvdXRFZGl0b3I6IElMYXlvdXRFZGl0b3IgPSB7XG4gICAgICAgICAgICAgICAgLy8gcGFnZU5hbWU6IHBhZ2U/Lk5hbWUsXG4gICAgICAgICAgICAgICAgLy8gcGFnZURlc2NyaXB0aW9uOiBwYWdlPy5EZXNjcmlwdGlvbixcbiAgICAgICAgICAgICAgICAvLyBwYXJhbWV0ZXJzOiBwYWdlLlBhcmFtZXRlcnMsXG4gICAgICAgICAgICAgICAgLy8gb25Mb2FkRmxvdzogcGFnZS5PbkxvYWRGbG93LFxuICAgICAgICAgICAgICAgIC8vIG9uQ2hhbmdlRmxvdzogcGFnZS5PbkNoYW5nZUZsb3csXG4gICAgICAgICAgICAgICAgbWF4V2lkdGg6IGxheW91dFZpZXc/LkxheW91dC5NYXhXaWR0aCB8fCAwLFxuICAgICAgICAgICAgICAgIHZlcnRpY2FsU3BhY2luZzogbGF5b3V0Vmlldz8uTGF5b3V0LlZlcnRpY2FsU3BhY2luZyxcbiAgICAgICAgICAgICAgICBob3Jpem9udGFsU3BhY2luZzogbGF5b3V0Vmlldz8uTGF5b3V0Lkhvcml6b250YWxTcGFjaW5nLFxuICAgICAgICAgICAgICAgIHNlY3Rpb25zR2FwOiBsYXlvdXRWaWV3Py5MYXlvdXQuU2VjdGlvbnNHYXAsXG4gICAgICAgICAgICAgICAgY29sdW1uc0dhcDogbGF5b3V0Vmlldz8uTGF5b3V0LkNvbHVtbnNHYXAsXG4gICAgICAgICAgICAgICAgLy8gcm91bmRlZENvcm5lcnM6IGxheW91dFZpZXc/LmxheW91dC5cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHRoaXMuX2VkaXRvcnNCcmVhZENydW1iWzBdLmhvc3RPYmplY3QgPSBsYXlvdXRFZGl0b3I7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGxvYWREZWZhdWx0RWRpdG9yKGxheW91dFZpZXc6IElQZXBMYXlvdXRWaWV3KSB7XG4gICAgICAgIHRoaXMuX2VkaXRvcnNCcmVhZENydW1iID0gbmV3IEFycmF5PElFZGl0b3I+KCk7XG5cbiAgICAgICAgaWYgKGxheW91dFZpZXcpIHtcbiAgICAgICAgICAgIHRoaXMuX2VkaXRvcnNCcmVhZENydW1iLnB1c2goe1xuICAgICAgICAgICAgICAgIGlkOiBQZXBMYXlvdXRCdWlsZGVyU2VydmljZS5NQUlOX0VESVRPUl9JRCxcbiAgICAgICAgICAgICAgICB0eXBlIDogJ2xheW91dC1idWlsZGVyJyxcbiAgICAgICAgICAgICAgICB0aXRsZTogbGF5b3V0Vmlldy5UaXRsZSB8fCB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdMQVlPVVRfQlVJTERFUi5ERUZBVUxUX1RJVExFJyksXG4gICAgICAgICAgICAgICAgLy8gaG9zdE9iamVjdDoge30gLy8gVXBkYXRlcyBpbiB1cGRhdGVMYXlvdXRFZGl0b3JQcm9wZXJ0aWVzIGZ1bmN0aW9uIGFib3ZlLlxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMudXBkYXRlTGF5b3V0RWRpdG9yUHJvcGVydGllcyhsYXlvdXRWaWV3KTtcbiAgICAgICAgICAgIHRoaXMubm90aWZ5RWRpdG9yQ2hhbmdlKHRoaXMuX2VkaXRvcnNCcmVhZENydW1iWzBdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubm90aWZ5RWRpdG9yQ2hhbmdlKG51bGwpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjaGFuZ2VDdXJyZW50RWRpdG9yKCkge1xuICAgICAgICBpZiAodGhpcy5fZWRpdG9yc0JyZWFkQ3J1bWIubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5ub3RpZnlFZGl0b3JDaGFuZ2UodGhpcy5fZWRpdG9yc0JyZWFkQ3J1bWJbdGhpcy5fZWRpdG9yc0JyZWFkQ3J1bWIubGVuZ3RoIC0gMV0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRFZGl0b3IoZWRpdG9yVHlwZTogTGF5b3V0RWRpdG9yVHlwZSwgaWQ6IHN0cmluZyk6IElFZGl0b3IgfCBudWxsIHtcbiAgICAgICAgLy8gQnVpbGQgZWRpdG9yIG9iamVjdC5cbiAgICAgICAgbGV0IGVkaXRvcjogSUVkaXRvciB8IG51bGwgPSBudWxsO1xuXG4gICAgICAgIGlmIChlZGl0b3JUeXBlID09PSAnc2VjdGlvbicpIHtcbiAgICAgICAgICAgIGVkaXRvciA9IHRoaXMuZ2V0U2VjdGlvbkVkaXRvcihpZCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZWRpdG9yVHlwZSA9PT0gJ2Jsb2NrJykge1xuICAgICAgICAgICAgZWRpdG9yID0gdGhpcy5nZXRCbG9ja0VkaXRvcihpZCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZWRpdG9yO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0U2VjdGlvbkVkaXRvclRpdGxlKHNlY3Rpb246IElQZXBMYXlvdXRTZWN0aW9uLCBzZWN0aW9uSW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBzZWN0aW9uLk5hbWUgfHwgYCR7dGhpcy5fZGVmYXVsdFNlY3Rpb25UaXRsZX0gJHtzZWN0aW9uSW5kZXggKyAxfWA7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRTZWN0aW9uRWRpdG9yKHNlY3Rpb25JZDogc3RyaW5nKTogSUVkaXRvciB8IG51bGwge1xuICAgICAgICBjb25zdCBsYXlvdXRWaWV3ID0gdGhpcy5fbGF5b3V0Vmlld1N1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICAgICAgY29uc3Qgc2VjdGlvbnMgPSBsYXlvdXRWaWV3Py5MYXlvdXQuU2VjdGlvbnMgfHwgW107XG4gICAgICAgIGNvbnN0IHNlY3Rpb25JbmRleCA9IHNlY3Rpb25zLmZpbmRJbmRleChzZWN0aW9uID0+IHNlY3Rpb24uS2V5ID09PSBzZWN0aW9uSWQpO1xuXG4gICAgICAgIGlmIChzZWN0aW9uSW5kZXggPj0gMCkge1xuICAgICAgICAgICAgbGV0IHNlY3Rpb24gPSBzZWN0aW9uc1tzZWN0aW9uSW5kZXhdO1xuICAgICAgICAgICAgY29uc3Qgc2VjdGlvbkVkaXRvcjogSUxheW91dFNlY3Rpb25FZGl0b3IgPSB7XG4gICAgICAgICAgICAgICAgaWQ6IHNlY3Rpb24uS2V5LFxuICAgICAgICAgICAgICAgIHNlY3Rpb25OYW1lOiBzZWN0aW9uLk5hbWUgfHwgJycsXG4gICAgICAgICAgICAgICAgc3BsaXQ6IHNlY3Rpb24uU3BsaXQgfHwgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIGhlaWdodDogc2VjdGlvbi5IZWlnaHQgfHwgMCxcbiAgICAgICAgICAgICAgICBjb2xsYXBzZU9uVGFibGV0OiBzZWN0aW9uLkNvbGxhcHNlT25UYWJsZXQgPz8gZmFsc2UsXG4gICAgICAgICAgICAgICAgZmlsbEhlaWdodDogc2VjdGlvbi5GaWxsSGVpZ2h0ID8/IGZhbHNlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgaWQ6IHNlY3Rpb25JZCxcbiAgICAgICAgICAgICAgICB0eXBlOiAnc2VjdGlvbicsXG4gICAgICAgICAgICAgICAgdGl0bGU6IHRoaXMuZ2V0U2VjdGlvbkVkaXRvclRpdGxlKHNlY3Rpb24sIHNlY3Rpb25JbmRleCksXG4gICAgICAgICAgICAgICAgaG9zdE9iamVjdDogc2VjdGlvbkVkaXRvclxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFNlY3Rpb25Db2x1bW5CeUlkRm9yRWRpdG9yKHNlY3Rpb25Db2x1bW5JZDogc3RyaW5nKTogSVBlcExheW91dFNlY3Rpb25Db2x1bW4gfCBudWxsIHtcbiAgICAgICAgbGV0IGN1cnJlbnRDb2x1bW4gPSBudWxsO1xuXG4gICAgICAgIC8vIEdldCB0aGUgc2VjdGlvbiBhbmQgY29sdW1uIGFycmF5IGJ5IHRoZSBwYXR0ZXJuIG9mIHRoZSBzZWN0aW9uIGNvbHVtbiBrZXkuXG4gICAgICAgIGNvbnN0IHNlY3Rpb25Db2x1bW5QYXR0ZXJuU2VwYXJhdG9yID0gdGhpcy5nZXRTZWN0aW9uQ29sdW1uS2V5KCk7XG4gICAgICAgIGNvbnN0IHNlY3Rpb25Db2x1bW5BcnIgPSBzZWN0aW9uQ29sdW1uSWQuc3BsaXQoc2VjdGlvbkNvbHVtblBhdHRlcm5TZXBhcmF0b3IpO1xuXG4gICAgICAgIGlmIChzZWN0aW9uQ29sdW1uQXJyLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgICAgY29uc3QgbGF5b3V0VmlldyA9IHRoaXMuX2xheW91dFZpZXdTdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgICAgICAgICBjb25zdCBzZWN0aW9ucyA9IGxheW91dFZpZXc/LkxheW91dC5TZWN0aW9ucyB8fCBbXTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gR2V0IHRoZSBzZWN0aW9uIGlkIHRvIGdldCB0aGUgc2VjdGlvbiBpbmRleC5cbiAgICAgICAgICAgIGNvbnN0IHNlY3Rpb25JZCA9IHNlY3Rpb25Db2x1bW5BcnJbMF07XG4gICAgICAgICAgICBjb25zdCBzZWN0aW9uSW5kZXggPSBzZWN0aW9ucy5maW5kSW5kZXgoc2VjdGlvbiA9PiBzZWN0aW9uLktleSA9PT0gc2VjdGlvbklkKTtcbiAgICAgICAgICAgIC8vIEdldCB0aGUgY29sdW1uIGluZGV4LlxuICAgICAgICAgICAgY29uc3QgY29sdW1uSW5kZXggPSBjb2VyY2VOdW1iZXJQcm9wZXJ0eShzZWN0aW9uQ29sdW1uQXJyWzFdLCAtMSk7XG4gICAgICAgICAgICBpZiAoc2VjdGlvbkluZGV4ID49IDAgJiYgY29sdW1uSW5kZXggPj0gMCkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRDb2x1bW4gPSBzZWN0aW9uc1tzZWN0aW9uSW5kZXhdLkNvbHVtbnNbY29sdW1uSW5kZXhdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGN1cnJlbnRDb2x1bW47XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRTZWN0aW9uc0NvbHVtbnNHYXAobGF5b3V0VmlldzogSVBlcExheW91dFZpZXcpIHtcbiAgICAgICAgaWYgKGxheW91dFZpZXc/LkxheW91dD8uU2VjdGlvbnMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBsYXlvdXRWaWV3LkxheW91dC5TZWN0aW9ucy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzZWN0aW9uID0gbGF5b3V0Vmlldy5MYXlvdXQuU2VjdGlvbnNbaW5kZXhdO1xuICAgICAgICAgICAgICAgIHNlY3Rpb24uQ29sdW1uc0dhcCA9IGxheW91dFZpZXcuTGF5b3V0LkNvbHVtbnNHYXA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGdldENzc1NjcmVlbldpZGgoc2NyZWVuVHlwZTogRGF0YVZpZXdTY3JlZW5TaXplKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IHdpZHRoVG9TZXQgPSAnMTAwJSc7XG5cbiAgICAgICAgaWYgKHNjcmVlblR5cGUgPT09ICdUYWJsZXQnKSB7XG4gICAgICAgICAgICB3aWR0aFRvU2V0ID0gJzcyMCc7XG4gICAgICAgIH0gZWxzZSBpZiAoc2NyZWVuVHlwZSA9PT0gJ1BoYWJsZXQnKSB7XG4gICAgICAgICAgICB3aWR0aFRvU2V0ID0gJzM2MCc7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gd2lkdGhUb1NldDtcbiAgICB9XG4gICAgXG4gICAgcHJpdmF0ZSBnZXRCbG9ja0NvbnRhaW5lckJ5QmxvY2tLZXkoYmxvY2tLZXk6IHN0cmluZyk6IElQZXBMYXlvdXRCbG9ja0NvbnRhaW5lciB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGxldCBibG9ja0NvbnRhaW5lclRvRmluZDogSVBlcExheW91dEJsb2NrQ29udGFpbmVyIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gICAgICAgIGNvbnN0IGxheW91dFZpZXcgPSB0aGlzLl9sYXlvdXRWaWV3U3ViamVjdC5nZXRWYWx1ZSgpO1xuICAgICAgICBjb25zdCBzZWN0aW9ucyA9IGxheW91dFZpZXc/LkxheW91dC5TZWN0aW9ucyB8fCBbXTtcbiAgICAgICAgXG4gICAgICAgIGZvciAobGV0IHNlY3Rpb25JbmRleCA9IDA7IHNlY3Rpb25JbmRleCA8IHNlY3Rpb25zLmxlbmd0aDsgc2VjdGlvbkluZGV4KyspIHtcbiAgICAgICAgICAgIGNvbnN0IHNlY3Rpb24gPSBzZWN0aW9uc1tzZWN0aW9uSW5kZXhdO1xuXG4gICAgICAgICAgICAvLyBHZXQgdGhlIGJsb2NrIGNvbnRhaW5lci5cbiAgICAgICAgICAgIGNvbnN0IGNvbHVtbkluZGV4ID0gc2VjdGlvbi5Db2x1bW5zLmZpbmRJbmRleChjb2x1bW4gPT4gY29sdW1uLkJsb2NrQ29udGFpbmVyPy5CbG9ja0tleSA9PT0gYmxvY2tLZXkpO1xuICAgICAgICAgICAgaWYgKGNvbHVtbkluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgICAgICBibG9ja0NvbnRhaW5lclRvRmluZCA9IHNlY3Rpb24uQ29sdW1uc1tjb2x1bW5JbmRleF0uQmxvY2tDb250YWluZXJcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBibG9ja0NvbnRhaW5lclRvRmluZDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNoYW5nZUN1cnNvck9uRHJhZ1N0YXJ0KCkge1xuICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoJ2luaGVyaXRDdXJzb3JzJyk7XG4gICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuY3Vyc29yID0gJ2dyYWJiaW5nJztcbiAgICB9XG5cbiAgICBwcml2YXRlIGNoYW5nZUN1cnNvck9uRHJhZ0VuZCgpIHtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCdpbmhlcml0Q3Vyc29ycycpO1xuICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLmN1cnNvciA9ICd1bnNldCc7XG4gICAgfVxuXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB1YmxpYyBmdW5jdGlvbnNcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgICBub3RpZnlTZWN0aW9uc0NvbHVtbnNEcm9wTGlzdENoYW5nZShzZWN0aW9uc0NvbHVtbnNEcm9wTGlzdDogYW55W10pIHtcbiAgICAgICAgdGhpcy5fc2VjdGlvbnNDb2x1bW5zRHJvcExpc3RTdWJqZWN0Lm5leHQoc2VjdGlvbnNDb2x1bW5zRHJvcExpc3QpO1xuICAgIH1cblxuICAgIG5vdGlmeVByZXZpZXdNb2RlQ2hhbmdlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuX3ByZXZpZXdNb2RlU3ViamVjdC5uZXh0KHZhbHVlKTtcbiAgICAgICAgdGhpcy5zZXRFZGl0YWJsZVN0YXRlKCk7XG4gICAgfVxuXG4gICAgbm90aWZ5TG9ja1NjcmVlbih2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLl9sb2NrU2NyZWVuU3ViamVjdC5uZXh0KHZhbHVlKTtcbiAgICB9XG5cbiAgICB1cGRhdGVDdXJyZW50RWRpdG9yVGl0bGUodGl0bGU6IHN0cmluZykge1xuICAgICAgICBjb25zdCBjdXJyZW50RWRpdG9yID0gdGhpcy5fZWRpdG9yU3ViamVjdC5nZXRWYWx1ZSgpO1xuICAgICAgICBpZiAoY3VycmVudEVkaXRvcikge1xuICAgICAgICAgICAgY3VycmVudEVkaXRvci50aXRsZSA9IHRpdGxlO1xuICAgICAgICAgICAgdGhpcy5ub3RpZnlFZGl0b3JDaGFuZ2UoY3VycmVudEVkaXRvcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRBdmFpbGFibGVCbG9ja3NUb0RyYWcoYXZhaWxhYmxlQmxvY2tzRm9yRHJhZzogQXJyYXk8SVBlcERyYWdnYWJsZUl0ZW0+KSB7XG4gICAgICAgIHRoaXMuX2F2YWlsYWJsZUJsb2Nrc0ZvckRyYWdNYXAuY2xlYXIoKTtcbiAgICAgICAgYXZhaWxhYmxlQmxvY2tzRm9yRHJhZy5mb3JFYWNoKGJsb2NrID0+IHtcbiAgICAgICAgICAgIHRoaXMuX2F2YWlsYWJsZUJsb2Nrc0ZvckRyYWdNYXAuc2V0KGJsb2NrLmRhdGEua2V5LCBibG9jayk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMubm90aWZ5QXZhaWxhYmxlQmxvY2tzRm9yRHJhZ01hcENoYW5nZSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0QmxvY2tFZGl0b3IoYmxvY2tLZXk6IHN0cmluZyk6IElFZGl0b3Ige1xuICAgICAgICBjb25zdCBibG9ja0NvbnRhaW5lciA9IHRoaXMuZ2V0QmxvY2tDb250YWluZXJCeUJsb2NrS2V5KGJsb2NrS2V5KTtcbiAgICAgICAgY29uc3QgZGVmYXVsdFRpdGxlID0gdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnTEFZT1VUX0JVSUxERVIuTk9fVElUTEUnKVxuICAgICAgICBsZXQgYmxvY2tUaXRsZSA9IGRlZmF1bHRUaXRsZTtcblxuICAgICAgICBpZiAoYmxvY2tDb250YWluZXIpIHtcbiAgICAgICAgICAgIGJsb2NrVGl0bGUgPSB0aGlzLmF2YWlsYWJsZUJsb2Nrc0ZvckRyYWdNYXA/LmdldChibG9ja0NvbnRhaW5lcj8uRHJhZ2dhYmxlSXRlbUtleSk/LnRpdGxlIHx8IGRlZmF1bHRUaXRsZTtcbiAgICAgICAgfVxuIFxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaWQ6IGJsb2NrS2V5LFxuICAgICAgICAgICAgdHlwZTogJ2Jsb2NrJyxcbiAgICAgICAgICAgIHRpdGxlOiBibG9ja1RpdGxlLFxuICAgICAgICAgICAgLy8gcmVtb3RlTW9kdWxlT3B0aW9uczogcmVtb3RlTG9hZGVyT3B0aW9ucyxcbiAgICAgICAgICAgIGhvc3RPYmplY3Q6IHt9IC8vIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoaG9zdE9iamVjdCkpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRTY3JlZW5UeXBlKHNpemU6IFBlcFNjcmVlblNpemVUeXBlKTogRGF0YVZpZXdTY3JlZW5TaXplIHtcbiAgICAgICAgY29uc3Qgc2NyZWVuVHlwZTogRGF0YVZpZXdTY3JlZW5TaXplID1cbiAgICAgICAgICAgIHNpemUgPCBQZXBTY3JlZW5TaXplVHlwZS5NRCA/ICdMYW5kc2NhcGUnIDpcbiAgICAgICAgICAgIChzaXplID09PSBQZXBTY3JlZW5TaXplVHlwZS5NRCB8fCBzaXplID09PSBQZXBTY3JlZW5TaXplVHlwZS5TTSA/ICdUYWJsZXQnIDogJ1BoYWJsZXQnKTtcblxuICAgICAgICByZXR1cm4gc2NyZWVuVHlwZTtcbiAgICB9XG5cbiAgICBnZXRTZWN0aW9uQ29sdW1uS2V5KHNlY3Rpb25LZXk6IHN0cmluZyA9ICcnLCBpbmRleDogc3RyaW5nID0gJycpIHtcbiAgICAgICAgcmV0dXJuIGAke3NlY3Rpb25LZXl9X2NvbHVtbl8ke2luZGV4fWA7XG4gICAgfVxuXG4gICAgZ2V0SXNIaWRkZW4oaGlkZUluOiBEYXRhVmlld1NjcmVlblNpemVbXSB8IHVuZGVmaW5lZCwgY3VycmVudFNjcmVlblR5cGU6IERhdGFWaWV3U2NyZWVuU2l6ZSkge1xuICAgICAgICByZXR1cm4gKGhpZGVJbiAmJiBoaWRlSW4/Lmxlbmd0aCA+IDApID8gaGlkZUluLnNvbWUoaGkgPT4gaGkgPT09IGN1cnJlbnRTY3JlZW5UeXBlKSA6IGZhbHNlO1xuICAgIH1cblxuICAgIG5hdmlnYXRlVG9FZGl0b3IoZWRpdG9yVHlwZTogTGF5b3V0RWRpdG9yVHlwZSwgaWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgc3VjY2VzcyA9IGZhbHNlO1xuXG4gICAgICAgIC8vIENhbm5vdCBuYXZpZ2F0ZSBpbnRvICdsYXlvdXQtYnVpbGRlcicgYmVjYXVzZSB0aGlzIGlzIGZpcnN0IGFuZCBjb25zdCBpbiB0aGUgZWRpdG9yc0JyZWFkQ3J1bWJzLlxuICAgICAgICBpZiAoZWRpdG9yVHlwZSAhPT0gJ2xheW91dC1idWlsZGVyJyAmJiBpZD8ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgLy8gQ2hlY2sgd2hpY2ggZWRpdG9yIHdlIGhhdmUgbm93XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50RWRpdG9yID0gdGhpcy5fZWRpdG9yc0JyZWFkQ3J1bWJbdGhpcy5fZWRpdG9yc0JyZWFkQ3J1bWIubGVuZ3RoIC0gMV07XG5cbiAgICAgICAgICAgIC8vIE9ubHkgaWYgaXQncyBhbm90aGVyIGVkaXRvci5cbiAgICAgICAgICAgIGlmKGN1cnJlbnRFZGl0b3IuaWQgIT09IGlkKSB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRFZGl0b3IudHlwZSAhPT0gJ2xheW91dC1idWlsZGVyJykge1xuICAgICAgICAgICAgICAgICAgICAvLyBBbHdheXMgcG9wIHRoZSBsYXN0IGFuZCBpbnNlcnQgdGhlIGN1cnJlbnQuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2VkaXRvcnNCcmVhZENydW1iLnBvcCgpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxldCBlZGl0b3IgPSB0aGlzLmdldEVkaXRvcihlZGl0b3JUeXBlLCBpZCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoZWRpdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2VkaXRvcnNCcmVhZENydW1iLnB1c2goZWRpdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VDdXJyZW50RWRpdG9yKCk7XG4gICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc3VjY2VzcztcbiAgICB9XG5cbiAgICBuYXZpZ2F0ZUJhY2tGcm9tRWRpdG9yKCkge1xuICAgICAgICAvLyBLZWVwIHRoZSBsYXlvdXQgYnVpbGRlciBlZGl0b3IuXG4gICAgICAgIGlmICh0aGlzLl9lZGl0b3JzQnJlYWRDcnVtYi5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAvLyBNYXliZSB3ZSB3YW50IHRvIGNvbXBhcmUgdGhlIGxhc3QgZWRpdG9yIGZvciB2YWxpZGF0aW9uID9cbiAgICAgICAgICAgIGNvbnN0IGxhc3RFZGl0b3IgPSB0aGlzLl9lZGl0b3JzQnJlYWRDcnVtYi5wb3AoKTtcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlQ3VycmVudEVkaXRvcigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdXBkYXRlTGF5b3V0RnJvbUVkaXRvcihlZGl0b3JEYXRhOiBJTGF5b3V0RWRpdG9yKSB7XG4gICAgICAgIGNvbnN0IGxheW91dFZpZXcgPSB0aGlzLl9sYXlvdXRWaWV3U3ViamVjdC5nZXRWYWx1ZSgpO1xuXG4gICAgICAgIGlmIChsYXlvdXRWaWV3KSB7XG4gICAgICAgICAgICBsYXlvdXRWaWV3LkxheW91dC5NYXhXaWR0aCA9IGVkaXRvckRhdGEubWF4V2lkdGg7XG4gICAgICAgICAgICBsYXlvdXRWaWV3LkxheW91dC5Ib3Jpem9udGFsU3BhY2luZyA9IGVkaXRvckRhdGEuaG9yaXpvbnRhbFNwYWNpbmc7XG4gICAgICAgICAgICBsYXlvdXRWaWV3LkxheW91dC5WZXJ0aWNhbFNwYWNpbmcgPSBlZGl0b3JEYXRhLnZlcnRpY2FsU3BhY2luZztcbiAgICAgICAgICAgIGxheW91dFZpZXcuTGF5b3V0LlNlY3Rpb25zR2FwID0gZWRpdG9yRGF0YS5zZWN0aW9uc0dhcDtcbiAgICAgICAgICAgIGxheW91dFZpZXcuTGF5b3V0LkNvbHVtbnNHYXAgPSBlZGl0b3JEYXRhLmNvbHVtbnNHYXA7XG4gICAgICAgICAgICAvLyBsYXlvdXRWaWV3LmxheW91dC5Sb3VuZGVkQ29ybmVycyA9IGVkaXRvckRhdGEucm91bmRlZENvcm5lcnM7XG5cbiAgICAgICAgICAgIHRoaXMuc2V0U2VjdGlvbnNDb2x1bW5zR2FwKGxheW91dFZpZXcpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICB0aGlzLm5vdGlmeUxheW91dFZpZXdDaGFuZ2UobGF5b3V0Vmlldyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgdXBkYXRlU2VjdGlvbkZyb21FZGl0b3Ioc2VjdGlvbkRhdGE6IElMYXlvdXRTZWN0aW9uRWRpdG9yKSB7XG4gICAgICAgIGNvbnN0IGxheW91dFZpZXcgPSB0aGlzLl9sYXlvdXRWaWV3U3ViamVjdC5nZXRWYWx1ZSgpO1xuICAgICAgICBjb25zdCBzZWN0aW9ucyA9IGxheW91dFZpZXc/LkxheW91dC5TZWN0aW9ucyB8fCBbXTtcbiAgICAgICAgY29uc3Qgc2VjdGlvbkluZGV4ID0gc2VjdGlvbnMuZmluZEluZGV4KHNlY3Rpb24gPT4gc2VjdGlvbi5LZXkgPT09IHNlY3Rpb25EYXRhLmlkKTtcblxuICAgICAgICAvLyBVcGRhdGUgc2VjdGlvbiBkZXRhaWxzLlxuICAgICAgICBpZiAoc2VjdGlvbkluZGV4ID49IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGJsb2Nrc0lkc1RvUmVtb3ZlID0gW107XG5cbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRTZWN0aW9uID0gc2VjdGlvbnNbc2VjdGlvbkluZGV4XTtcbiAgICAgICAgICAgIGN1cnJlbnRTZWN0aW9uLk5hbWUgPSBzZWN0aW9uRGF0YS5zZWN0aW9uTmFtZTtcbiAgICAgICAgICAgIGN1cnJlbnRTZWN0aW9uLlNwbGl0ID0gc2VjdGlvbkRhdGEuc3BsaXQ7XG4gICAgICAgICAgICBjdXJyZW50U2VjdGlvbi5IZWlnaHQgPSBzZWN0aW9uRGF0YS5oZWlnaHQ7XG4gICAgICAgICAgICBjdXJyZW50U2VjdGlvbi5Db2xsYXBzZU9uVGFibGV0ID0gc2VjdGlvbkRhdGEuY29sbGFwc2VPblRhYmxldDtcbiAgICAgICAgICAgIGN1cnJlbnRTZWN0aW9uLkZpbGxIZWlnaHQgPSBzZWN0aW9uRGF0YS5maWxsSGVpZ2h0O1xuXG4gICAgICAgICAgICAvLyBHZXQgdGhlIG5ldyBjb2x1bW5zIG51bWJlciBmcm9tIGN1cnJlbnRTZWN0aW9uLlNwbGl0LCBpZiBpdHMgdW5kZWZpbmVkIHB1dCBhIGRlZmF1bHQgMS5cbiAgICAgICAgICAgIGNvbnN0IG5ld0NvbHVtbnNMZW5ndGggPSBjdXJyZW50U2VjdGlvbi5TcGxpdD8uc3BsaXQoJyAnKS5sZW5ndGggfHwgMTtcbiAgICAgICAgICAgIGlmIChuZXdDb2x1bW5zTGVuZ3RoID4gY3VycmVudFNlY3Rpb24uQ29sdW1ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB3aGlsZSAobmV3Q29sdW1uc0xlbmd0aCA+IGN1cnJlbnRTZWN0aW9uLkNvbHVtbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTZWN0aW9uLkNvbHVtbnMucHVzaCh7fSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChuZXdDb2x1bW5zTGVuZ3RoIDwgY3VycmVudFNlY3Rpb24uQ29sdW1ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB3aGlsZSAobmV3Q29sdW1uc0xlbmd0aCA8IGN1cnJlbnRTZWN0aW9uLkNvbHVtbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbHVubSA9IGN1cnJlbnRTZWN0aW9uLkNvbHVtbnMucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIGJsb2NrIGluIHRoaXMgY29sdW1uIGRlbGV0ZSBpdC5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbHVubSAmJiBjb2x1bm0uQmxvY2tDb250YWluZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJsb2Nrc0lkc1RvUmVtb3ZlLnB1c2goY29sdW5tLkJsb2NrQ29udGFpbmVyLkJsb2NrS2V5KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gVXBkYXRlIGVkaXRvciB0aXRsZVxuICAgICAgICAgICAgY29uc3QgY3VycmVudEVkaXRvciA9IHRoaXMuX2VkaXRvclN1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICAgICAgICAgIGlmIChjdXJyZW50RWRpdG9yICYmIGN1cnJlbnRFZGl0b3IudHlwZSA9PT0gJ3NlY3Rpb24nICYmIGN1cnJlbnRFZGl0b3IuaWQgPT09IGN1cnJlbnRTZWN0aW9uLktleSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRpdGxlID0gdGhpcy5nZXRTZWN0aW9uRWRpdG9yVGl0bGUoY3VycmVudFNlY3Rpb24sIHNlY3Rpb25JbmRleCk7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVDdXJyZW50RWRpdG9yVGl0bGUodGl0bGUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBVcGRhdGUgc2VjdGlvbnMgY2hhbmdlLlxuICAgICAgICAgICAgdGhpcy5ub3RpZnlMYXlvdXRWaWV3Q2hhbmdlKGxheW91dFZpZXcpO1xuXG4gICAgICAgICAgICAvLyBJZiB0aGVyZSBhcmUgYmxvY2tzIHRvIHJlbW92ZSwgbm90aWZ5IHRoZSBibG9ja3MgcmVtb3ZlZC5cbiAgICAgICAgICAgIGlmIChibG9ja3NJZHNUb1JlbW92ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ub3RpZnlCbG9ja3NSZW1vdmVkKGJsb2Nrc0lkc1RvUmVtb3ZlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFkZFNlY3Rpb24oc2VjdGlvbjogSVBlcExheW91dFNlY3Rpb24gfCBudWxsID0gbnVsbCkge1xuICAgICAgICAvLyBDcmVhdGUgbmV3IHNlY3Rpb25cbiAgICAgICAgaWYgKCFzZWN0aW9uKSB7XG4gICAgICAgICAgICBzZWN0aW9uID0ge1xuICAgICAgICAgICAgICAgIEtleTogUGVwR3VpZC5uZXdHdWlkKCksXG4gICAgICAgICAgICAgICAgQ29sdW1uczogW3t9XSwgLy8gQWRkIGVtcHR5IHNlY3Rpb24gY29sdW1uXG4gICAgICAgICAgICAgICAgSGlkZTogW11cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFkZCB0aGUgbmV3IHNlY3Rpb24gdG8gbGF5b3V0IHZpZXcuXG4gICAgICAgIGNvbnN0IGxheW91dFZpZXcgPSB0aGlzLl9sYXlvdXRWaWV3U3ViamVjdC5nZXRWYWx1ZSgpO1xuICAgICAgICBjb25zdCBzZWN0aW9ucyA9IGxheW91dFZpZXc/LkxheW91dC5TZWN0aW9ucyB8fCBbXTtcbiAgICAgICAgc2VjdGlvbnMucHVzaChzZWN0aW9uKTtcbiAgICAgICAgdGhpcy5ub3RpZnlMYXlvdXRWaWV3Q2hhbmdlKGxheW91dFZpZXcpO1xuICAgIH1cblxuICAgIHJlbW92ZVNlY3Rpb24oc2VjdGlvbklkOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgbGF5b3V0VmlldyA9IHRoaXMuX2xheW91dFZpZXdTdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgICAgIGNvbnN0IHNlY3Rpb25zID0gbGF5b3V0Vmlldz8uTGF5b3V0LlNlY3Rpb25zIHx8IFtdO1xuICAgICAgICBjb25zdCBpbmRleCA9IHNlY3Rpb25zLmZpbmRJbmRleChzZWN0aW9uID0+IHNlY3Rpb24uS2V5ID09PSBzZWN0aW9uSWQpO1xuICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgICAgLy8gR2V0IHRoZSBibG9ja3MgaWQncyB0byByZW1vdmUuXG4gICAgICAgICAgICBjb25zdCBibG9ja3NJZHNUb1JlbW92ZTogYW55ID0gc2VjdGlvbnNbaW5kZXhdLkNvbHVtbnMubWFwKGNvbHVtbiA9PiBjb2x1bW4/LkJsb2NrQ29udGFpbmVyPy5CbG9ja0tleSk7XG5cbiAgICAgICAgICAgIC8vIFJlbW92ZSBzZWN0aW9uLlxuICAgICAgICAgICAgc2VjdGlvbnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgIHRoaXMubm90aWZ5TGF5b3V0Vmlld0NoYW5nZShsYXlvdXRWaWV3KTtcblxuICAgICAgICAgICAgLy8gSWYgdGhlcmUgYXJlIGJsb2NrcyB0byByZW1vdmUsIG5vdGlmeSB0aGUgYmxvY2tzIHJlbW92ZWQuXG4gICAgICAgICAgICBpZiAoYmxvY2tzSWRzVG9SZW1vdmUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMubm90aWZ5QmxvY2tzUmVtb3ZlZChibG9ja3NJZHNUb1JlbW92ZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGhpZGVTZWN0aW9uKHNlY3Rpb25JZDogc3RyaW5nLCBoaWRlSW46IERhdGFWaWV3U2NyZWVuU2l6ZVtdKSB7XG4gICAgICAgIGNvbnN0IGxheW91dFZpZXcgPSB0aGlzLl9sYXlvdXRWaWV3U3ViamVjdC5nZXRWYWx1ZSgpO1xuICAgICAgICBjb25zdCBzZWN0aW9ucyA9IGxheW91dFZpZXc/LkxheW91dC5TZWN0aW9ucyB8fCBbXTtcbiAgICAgICAgY29uc3QgaW5kZXggPSBzZWN0aW9ucy5maW5kSW5kZXgoc2VjdGlvbiA9PiBzZWN0aW9uLktleSA9PT0gc2VjdGlvbklkKTtcbiAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgIHNlY3Rpb25zW2luZGV4XS5IaWRlID0gaGlkZUluO1xuICAgICAgICAgICAgdGhpcy5ub3RpZnlMYXlvdXRWaWV3Q2hhbmdlKGxheW91dFZpZXcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25TZWN0aW9uRHJvcHBlZChldmVudDogQ2RrRHJhZ0Ryb3A8YW55W10+KSB7XG4gICAgICAgIGNvbnN0IGxheW91dFZpZXcgPSB0aGlzLl9sYXlvdXRWaWV3U3ViamVjdC5nZXRWYWx1ZSgpO1xuICAgICAgICBjb25zdCBzZWN0aW9ucyA9IGxheW91dFZpZXc/LkxheW91dC5TZWN0aW9ucyB8fCBbXTtcbiAgICAgICAgbW92ZUl0ZW1JbkFycmF5KHNlY3Rpb25zLCBldmVudC5wcmV2aW91c0luZGV4LCBldmVudC5jdXJyZW50SW5kZXgpO1xuICAgICAgICB0aGlzLm5vdGlmeUxheW91dFZpZXdDaGFuZ2UobGF5b3V0Vmlldyk7XG4gICAgfVxuXG4gICAgb25TZWN0aW9uRHJhZ1N0YXJ0KGV2ZW50OiBDZGtEcmFnU3RhcnQpIHtcbiAgICAgICAgdGhpcy5jaGFuZ2VDdXJzb3JPbkRyYWdTdGFydCgpO1xuICAgICAgICB0aGlzLl9kcmFnZ2luZ1NlY3Rpb25LZXkubmV4dChldmVudC5zb3VyY2UuZGF0YSk7XG4gICAgfVxuXG4gICAgb25TZWN0aW9uRHJhZ0VuZChldmVudDogQ2RrRHJhZ0VuZCkge1xuICAgICAgICB0aGlzLmNoYW5nZUN1cnNvck9uRHJhZ0VuZCgpO1xuICAgICAgICB0aGlzLl9kcmFnZ2luZ1NlY3Rpb25LZXkubmV4dCgnJyk7XG4gICAgfVxuXG4gICAgcmVtb3ZlQmxvY2tGcm9tU2VjdGlvbihibG9ja0lkOiBzdHJpbmcpIHtcbiAgICAgICAgbGV0IGJsb2NrUmVtb3ZlZCA9IGZhbHNlO1xuXG4gICAgICAgIC8vIFJlbW92ZSB0aGUgYmxvY2sgZnJvbSBzZWN0aW9uIGNvbHVtbi5cbiAgICAgICAgY29uc3QgbGF5b3V0VmlldyA9IHRoaXMuX2xheW91dFZpZXdTdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgICAgIGNvbnN0IHNlY3Rpb25zID0gbGF5b3V0Vmlldz8uTGF5b3V0LlNlY3Rpb25zIHx8IFtdO1xuICAgICAgICBcbiAgICAgICAgZm9yIChsZXQgc2VjdGlvbkluZGV4ID0gMDsgc2VjdGlvbkluZGV4IDwgc2VjdGlvbnMubGVuZ3RoOyBzZWN0aW9uSW5kZXgrKykge1xuICAgICAgICAgICAgY29uc3Qgc2VjdGlvbiA9IHNlY3Rpb25zW3NlY3Rpb25JbmRleF07XG5cbiAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgYmxvY2sgY29udGFpbmVyLlxuICAgICAgICAgICAgY29uc3QgY29sdW1uSW5kZXggPSBzZWN0aW9uLkNvbHVtbnMuZmluZEluZGV4KGNvbHVtbiA9PiBjb2x1bW4uQmxvY2tDb250YWluZXI/LkJsb2NrS2V5ID09PSBibG9ja0lkKTtcbiAgICAgICAgICAgIGlmIChjb2x1bW5JbmRleCA+IC0xKSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHNlY3Rpb24uQ29sdW1uc1tjb2x1bW5JbmRleF0uQmxvY2tDb250YWluZXI7XG4gICAgICAgICAgICAgICAgdGhpcy5ub3RpZnlMYXlvdXRWaWV3Q2hhbmdlKGxheW91dFZpZXcpO1xuICAgICAgICAgICAgICAgIGJsb2NrUmVtb3ZlZCA9IHRydWU7XG5cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHRoZSBibG9jayB3YXMgcmVtb3ZlZCwgbm90aWZ5IHRoZSBibG9jayByZW1vdmVkLlxuICAgICAgICBpZiAoYmxvY2tSZW1vdmVkKSB7XG4gICAgICAgICAgICB0aGlzLm5vdGlmeUJsb2Nrc1JlbW92ZWQoW2Jsb2NrSWRdKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGhpZGVCbG9jayhzZWN0aW9uSWQ6IHN0cmluZywgYmxvY2tJZDogc3RyaW5nLCBoaWRlSW46IERhdGFWaWV3U2NyZWVuU2l6ZVtdKSB7XG4gICAgICAgIGNvbnN0IGxheW91dFZpZXcgPSB0aGlzLl9sYXlvdXRWaWV3U3ViamVjdC5nZXRWYWx1ZSgpO1xuICAgICAgICBjb25zdCBzZWN0aW9ucyA9IGxheW91dFZpZXc/LkxheW91dC5TZWN0aW9ucyB8fCBbXTtcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IGluZGV4ID0gc2VjdGlvbnMuZmluZEluZGV4KHNlY3Rpb24gPT4gc2VjdGlvbi5LZXkgPT09IHNlY3Rpb25JZCk7XG4gICAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgICBjb25zdCBjb2x1bW5JbmRleCA9IHNlY3Rpb25zW2luZGV4XS5Db2x1bW5zLmZpbmRJbmRleChjb2x1bW4gPT4gY29sdW1uLkJsb2NrQ29udGFpbmVyPy5CbG9ja0tleSA9PT0gYmxvY2tJZCk7XG4gICAgICAgICAgICBpZiAoY29sdW1uSW5kZXggPiAtMSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJsb2NrQ29udGFpbmVyID0gc2VjdGlvbnNbaW5kZXhdLkNvbHVtbnNbY29sdW1uSW5kZXhdLkJsb2NrQ29udGFpbmVyO1xuICAgICAgICAgICAgICAgIGlmIChibG9ja0NvbnRhaW5lcikge1xuICAgICAgICAgICAgICAgICAgICBibG9ja0NvbnRhaW5lci5IaWRlID0gaGlkZUluO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vdGlmeUxheW91dFZpZXdDaGFuZ2UobGF5b3V0Vmlldyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25CbG9ja0Ryb3BwZWQoZXZlbnQ6IENka0RyYWdEcm9wPElQZXBMYXlvdXRTZWN0aW9uQ29sdW1uLCBhbnksIGFueT4sIHNlY3Rpb25JZDogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IGxheW91dFZpZXcgPSB0aGlzLl9sYXlvdXRWaWV3U3ViamVjdC5nZXRWYWx1ZSgpO1xuXG4gICAgICAgIGlmIChldmVudC5wcmV2aW91c0NvbnRhaW5lci5pZCA9PT0gUGVwTGF5b3V0QnVpbGRlclNlcnZpY2UuQVZBSUxBQkxFX0JMT0NLU19DT05UQUlORVJfSUQpIHtcbiAgICAgICAgICAgIC8vIEdldCB0aGUgYmxvY2sgcmVsYXRpb24gKHByZXZpb3VzQ29udGFpbmVyLmRhdGEgaXMgSVBlcERyYWdnYWJsZUl0ZW0gYW5kIGluc2lkZSB3ZSBoYXZlIEF2YWlsYWJsZUJsb2NrIG9iamVjdCkuXG4gICAgICAgICAgICBjb25zdCBkcmFnZ2FibGVJdGVtOiBJUGVwRHJhZ2dhYmxlSXRlbSA9IGV2ZW50LnByZXZpb3VzQ29udGFpbmVyLmRhdGFbZXZlbnQucHJldmlvdXNJbmRleF0gYXMgSVBlcERyYWdnYWJsZUl0ZW07XG5cbiAgICAgICAgICAgIGlmIChkcmFnZ2FibGVJdGVtKSB7XG4gICAgICAgICAgICAgICAgLy8gbG9jayB0aGUgc2NyZWVuIHVudGlsbCB0aGUgZWRpdG9yIHdpbGwgYmUgbG9hZGVkLlxuICAgICAgICAgICAgICAgIC8vIHRoaXMuX2xvY2tTY3JlZW5TdWJqZWN0Lm5leHQodHJ1ZSk7XG5cbiAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIGNvbHVtbi5cbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50Q29sdW1uID0gdGhpcy5nZXRTZWN0aW9uQ29sdW1uQnlJZEZvckVkaXRvcihldmVudC5jb250YWluZXIuaWQpO1xuXG4gICAgICAgICAgICAgICAgLy8gU2V0IHRoZSBibG9jayBrZXkgaW4gdGhlIHNlY3Rpb24gYmxvY2sgb25seSBpZiB0aGVyZSBpcyBhIGJsYW5rIGNvbHVtbi5cbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudENvbHVtbiAmJiAhY3VycmVudENvbHVtbi5CbG9ja0NvbnRhaW5lcikge1xuICAgICAgICAgICAgICAgICAgICAgLy8gR2VuZXJhdGUgdGhlIGJsb2NrIHV1aWQuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJsb2NrS2V5ID0gUGVwR3VpZC5uZXdHdWlkKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgY3VycmVudENvbHVtbi5CbG9ja0NvbnRhaW5lciA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIEJsb2NrS2V5OiBibG9ja0tleSxcbiAgICAgICAgICAgICAgICAgICAgICAgIERyYWdnYWJsZUl0ZW1LZXk6IGRyYWdnYWJsZUl0ZW0uZGF0YS5rZXksXG4gICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gSGVyZSB3ZSB1cGRhdGUgdGhlIGxheW91dCB2aWV3IGNhdXNlIHRoZSBsYXlvdXQgaXMgdXBkYXRlZC5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3RpZnlMYXlvdXRWaWV3Q2hhbmdlKGxheW91dFZpZXcpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIFJhaXNlIGJsb2NrIGFkZGVkIGV2ZW50LlxuICAgICAgICAgICAgICAgICAgICBjb25zdCBibG9ja0FkZGVkRXZlbnREYXRhOiBJUGVwTGF5b3V0QmxvY2tBZGRlZEV2ZW50ID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgQmxvY2tLZXk6IGJsb2NrS2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgRHJhZ2dhYmxlSXRlbTogZHJhZ2dhYmxlSXRlbSxcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vdGlmeUJsb2NrQWRkZWQoYmxvY2tBZGRlZEV2ZW50RGF0YSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImRyYWdnYWJsZUl0ZW0gaXMgbm90IGEgSVBlcERyYWdnYWJsZUl0ZW0gdHlwZVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIElmIHRoZSBibG9jayBtb3ZlZCBiZXR3ZWVuIGNvbHVtbnMgaW4gdGhlIHNhbWUgc2VjdGlvbiBvciBiZXR3ZWVuIGRpZmZlcmVudCBzZWN0aW9ucyBidXQgbm90IGluIHRoZSBzYW1lIGNvbHVtbi5cbiAgICAgICAgICAgIGlmIChldmVudC5jb250YWluZXIuaWQgIT09IGV2ZW50LnByZXZpb3VzQ29udGFpbmVyLmlkKSB7XG4gICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBjb2x1bW4uXG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudENvbHVtbiA9IHRoaXMuZ2V0U2VjdGlvbkNvbHVtbkJ5SWRGb3JFZGl0b3IoZXZlbnQuY29udGFpbmVyLmlkKTtcbiAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIHByZXZpb3VzIGNvbHVtbi5cbiAgICAgICAgICAgICAgICBjb25zdCBwcmV2aXVvc0NvbHVtbiA9IHRoaXMuZ2V0U2VjdGlvbkNvbHVtbkJ5SWRGb3JFZGl0b3IoZXZlbnQucHJldmlvdXNDb250YWluZXIuaWQpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRDb2x1bW4gJiYgcHJldml1b3NDb2x1bW4pIHtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudENvbHVtbi5CbG9ja0NvbnRhaW5lciA9IHByZXZpdW9zQ29sdW1uLkJsb2NrQ29udGFpbmVyO1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgcHJldml1b3NDb2x1bW4uQmxvY2tDb250YWluZXI7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm90aWZ5TGF5b3V0Vmlld0NoYW5nZShsYXlvdXRWaWV3KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbkJsb2NrRHJhZ1N0YXJ0KGV2ZW50OiBDZGtEcmFnU3RhcnQpIHtcbiAgICAgICAgdGhpcy5jaGFuZ2VDdXJzb3JPbkRyYWdTdGFydCgpO1xuICAgICAgICAvLyBUYWtlIHRoZSBibG9jayBrZXkgaWYgZXhpc3QsIGVsc2UgdGFrZSB0aGUgYXZhaWxhYmxlIGJsb2NrIGtleSAocmVsYXRpb24ga2V5KS5cbiAgICAgICAgY29uc3QgYmxvY2tLZXkgPSBldmVudC5zb3VyY2UuZGF0YT8uQmxvY2tLZXkgfHwgZXZlbnQuc291cmNlLmRhdGE/LktleTtcbiAgICAgICAgdGhpcy5fZHJhZ2dpbmdCbG9ja0tleS5uZXh0KGJsb2NrS2V5KTtcbiAgICB9XG5cbiAgICBvbkJsb2NrRHJhZ0VuZChldmVudDogQ2RrRHJhZ0VuZCkge1xuICAgICAgICB0aGlzLmNoYW5nZUN1cnNvck9uRHJhZ0VuZCgpO1xuICAgICAgICB0aGlzLl9kcmFnZ2luZ0Jsb2NrS2V5Lm5leHQoJycpO1xuICAgIH1cbiAgICBcbiAgICBkb2VzQ29sdW1uQ29udGFpbkJsb2NrKHNlY3Rpb25JZDogc3RyaW5nLCBjb2x1bW5JbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIGxldCByZXMgPSBmYWxzZTtcbiAgICAgICAgY29uc3QgbGF5b3V0VmlldyA9IHRoaXMuX2xheW91dFZpZXdTdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgICAgIGNvbnN0IHNlY3Rpb24gPSBsYXlvdXRWaWV3Py5MYXlvdXQuU2VjdGlvbnMuZmluZChzZWN0aW9uID0+IHNlY3Rpb24uS2V5ID09PSBzZWN0aW9uSWQpO1xuXG4gICAgICAgIGlmIChzZWN0aW9uICYmIGNvbHVtbkluZGV4ID49IDAgJiYgc2VjdGlvbi5Db2x1bW5zLmxlbmd0aCA+IGNvbHVtbkluZGV4KSB7XG4gICAgICAgICAgICByZXMgPSAhIXNlY3Rpb24uQ29sdW1uc1tjb2x1bW5JbmRleF0uQmxvY2tDb250YWluZXI7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIHNldFNjcmVlbldpZHRoKHNjcmVlblR5cGU6IERhdGFWaWV3U2NyZWVuU2l6ZSkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0Q3NzU2NyZWVuV2lkaChzY3JlZW5UeXBlKVxuXG4gICAgICAgIGxldCB3aWR0aCA9IGNvZXJjZU51bWJlclByb3BlcnR5KHZhbHVlLCAwKTtcbiAgICAgICAgaWYgKHdpZHRoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLl9zY3JlZW5XaWR0aFN1YmplY3QubmV4dCgnMTAwJScpO1xuICAgICAgICAgICAgdGhpcy5fc2NyZWVuU2l6ZVN1YmplY3QubmV4dChQZXBTY3JlZW5TaXplVHlwZS5YTCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9zY3JlZW5XaWR0aFN1YmplY3QubmV4dChgJHt3aWR0aH1weGApO1xuXG4gICAgICAgICAgICAvLyBDaGFuZ2UgdGhlIHNpemUgYWNjb3JkaW5nIHRoZSB3aWR0aC5cbiAgICAgICAgICAgIGlmICh3aWR0aCA+PSAxOTIwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2NyZWVuU2l6ZVN1YmplY3QubmV4dChQZXBTY3JlZW5TaXplVHlwZS5YTCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHdpZHRoID49IDEyODAgJiYgd2lkdGggPCAxOTIwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2NyZWVuU2l6ZVN1YmplY3QubmV4dChQZXBTY3JlZW5TaXplVHlwZS5MRyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHdpZHRoID49IDk2MCAmJiB3aWR0aCA8IDEyODApIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zY3JlZW5TaXplU3ViamVjdC5uZXh0KFBlcFNjcmVlblNpemVUeXBlLk1EKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAod2lkdGggPj0gNjAwICYmIHdpZHRoIDwgOTYwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2NyZWVuU2l6ZVN1YmplY3QubmV4dChQZXBTY3JlZW5TaXplVHlwZS5TTSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHdpZHRoIDwgNjAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2NyZWVuU2l6ZVN1YmplY3QubmV4dChQZXBTY3JlZW5TaXplVHlwZS5YUyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzaG93U2tlbGV0b24oc2hvdzogYm9vbGVhbikge1xuICAgICAgICB0aGlzLl9zaG93U2tlbGV0b25TdWJqZWN0Lm5leHQoc2hvdyk7XG4gICAgfVxuICAgIFxuICAgIGxvYWRMYXlvdXRCdWlsZGVyKGxheW91dFZpZXc6IElQZXBMYXlvdXRWaWV3KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmVkaXRNb2RlKSB7XG4gICAgICAgICAgICAvLyBMb2FkIHRoZSBsYXlvdXQgZWRpdG9yLlxuICAgICAgICAgICAgdGhpcy5sb2FkRGVmYXVsdEVkaXRvcihsYXlvdXRWaWV3KTtcblxuICAgICAgICAgICAgLy8gU2V0IHRoZSBjb2x1bW5zIGdhcCBvZiB0aGUgc2VjdGlvbnMuXG4gICAgICAgICAgICB0aGlzLnNldFNlY3Rpb25zQ29sdW1uc0dhcChsYXlvdXRWaWV3KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIExvYWQgb25seSB0aGUgbGF5b3V0IHZpZXcuXG4gICAgICAgIHRoaXMubm90aWZ5TGF5b3V0Vmlld0NoYW5nZShsYXlvdXRWaWV3KTtcbiAgICB9XG59XG4iXX0=
|
|
649
|
+
}], ctorParameters: function () { return [{ type: i1.TranslateService }, { type: i2.PepDialogService }]; } });
|
|
650
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF5b3V0LWJ1aWxkZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1jb21wb3NpdGUtbGliL2xheW91dC1idWlsZGVyL2xheW91dC1idWlsZGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM3RCxPQUFPLEVBQXdELGVBQWUsRUFBcUIsTUFBTSx3QkFBd0IsQ0FBQztBQUVsSSxPQUFPLEVBQW1CLE9BQU8sRUFBa0IsaUJBQWlCLEVBQTBDLE1BQU0seUJBQXlCLENBQUM7QUFJOUksT0FBTyxFQUFjLGVBQWUsRUFBVyxNQUFNLE1BQU0sQ0FBQztBQUM1RCxPQUFPLEVBQWdCLG9CQUFvQixFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTVFLE9BQU8sRUFBRSxhQUFhLEVBQW9CLE1BQU0sZ0NBQWdDLENBQUM7Ozs7QUFLakYsTUFBTSxPQUFPLHVCQUF1QjtJQW1IaEMsWUFDYyxTQUEyQixFQUMzQixhQUErQjtRQUQvQixjQUFTLEdBQVQsU0FBUyxDQUFrQjtRQUMzQixrQkFBYSxHQUFiLGFBQWEsQ0FBa0I7UUFqSHJDLHlCQUFvQixHQUFHLEVBQUUsQ0FBQztRQUUxQix1QkFBa0IsR0FBRyxDQUFDLENBQUM7UUFLdkIsdUJBQWtCLEdBQUcsS0FBSyxFQUFXLENBQUM7UUFFdEMsY0FBUyxHQUFZLEtBQUssQ0FBQztRQVMzQixtQkFBYyxHQUFZLEtBQUssQ0FBQztRQUt4QyxxREFBcUQ7UUFDM0MsdUJBQWtCLEdBQXVDLElBQUksZUFBZSxDQUFvQixpQkFBaUIsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUtoSSwrRUFBK0U7UUFDdkUsd0JBQW1CLEdBQTRCLElBQUksZUFBZSxDQUFTLE1BQU0sQ0FBQyxDQUFD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LENBQUMsRUFBRSxDQUFDLENBQUM7YUFDdEQ7U0FDSjtJQUNMLENBQUM7SUFFRCxZQUFZLENBQUMsSUFBYTtRQUN0QixJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxVQUEwQjtRQUN4QyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDZiwwQkFBMEI7WUFDMUIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBRW5DLHVDQUF1QztZQUN2QywwQ0FBMEM7U0FDN0M7UUFFRCw2QkFBNkI7UUFDN0IsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzVDLENBQUM7O0FBOXVCZSxxREFBNkIsR0FBRyxpQkFBa0IsQ0FBQTtBQUNsRCxzQ0FBYyxHQUFHLE1BQU8sQ0FBQTtvSEFGL0IsdUJBQXVCO3dIQUF2Qix1QkFBdUIsY0FGcEIsTUFBTTsyRkFFVCx1QkFBdUI7a0JBSG5DLFVBQVU7bUJBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBjb2VyY2VOdW1iZXJQcm9wZXJ0eSB9IGZyb20gXCJAYW5ndWxhci9jZGsvY29lcmNpb25cIjtcbmltcG9ydCB7IENka0RyYWdEcm9wLCBDZGtEcmFnRW5kLCBDZGtEcmFnU3RhcnQsIGNvcHlBcnJheUl0ZW0sIG1vdmVJdGVtSW5BcnJheSwgdHJhbnNmZXJBcnJheUl0ZW0gfSBmcm9tIFwiQGFuZ3VsYXIvY2RrL2RyYWctZHJvcFwiO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gXCJAbmd4LXRyYW5zbGF0ZS9jb3JlXCI7XG5pbXBvcnQgeyBQZXBBZGRvblNlcnZpY2UsIFBlcEd1aWQsIFBlcEh0dHBTZXJ2aWNlLCBQZXBTY3JlZW5TaXplVHlwZSwgUGVwU2Vzc2lvblNlcnZpY2UsIFBlcFV0aWxpdGllc1NlcnZpY2UgfSBmcm9tIFwiQHBlcHBlcmktYWRkb25zL25neC1saWJcIjtcbmltcG9ydCB7IElQZXBEcmFnZ2FibGVJdGVtIH0gZnJvbSBcIkBwZXBwZXJpLWFkZG9ucy9uZ3gtbGliL2RyYWdnYWJsZS1pdGVtc1wiO1xuaW1wb3J0IHsgRGF0YVZpZXdTY3JlZW5TaXplLCBTY3JlZW5TaXplRGF0YUNvbmZpZ3VyYXRpb24gfSBmcm9tIFwiQHBlcHBlcmktYWRkb25zL3BhcGktc2RrXCI7XG5pbXBvcnQgeyBQZXBTbmFja0JhckRhdGEsIFBlcFNuYWNrQmFyU2VydmljZSB9IGZyb20gXCJAcGVwcGVyaS1hZGRvbnMvbmd4LWxpYi9zbmFjay1iYXJcIjtcbmltcG9ydCB7IE9ic2VydmFibGUsIEJlaGF2aW9yU3ViamVjdCwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgZmlsdGVyIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgTGF5b3V0RWRpdG9yVHlwZSwgSUVkaXRvciwgSVBlcExheW91dEJsb2NrQWRkZWRFdmVudCwgSUxheW91dEVkaXRvciwgSVBlcExheW91dFNlY3Rpb24sIElQZXBMYXlvdXRTZWN0aW9uQ29sdW1uLCBJUGVwTGF5b3V0VmlldywgSUxheW91dFNlY3Rpb25FZGl0b3IsIFBlcExheW91dFNpemVUeXBlLCBJUGVwTGF5b3V0QmxvY2tDb250YWluZXIgfSBmcm9tIFwiLi9sYXlvdXQtYnVpbGRlci5tb2RlbFwiO1xuaW1wb3J0IHsgUGVwRGlhbG9nRGF0YSwgUGVwRGlhbG9nU2VydmljZSB9IGZyb20gXCJAcGVwcGVyaS1hZGRvbnMvbmd4LWxpYi9kaWFsb2dcIjtcblxuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgUGVwTGF5b3V0QnVpbGRlclNlcnZpY2Uge1xuICAgIHN0YXRpYyByZWFkb25seSBBVkFJTEFCTEVfQkxPQ0tTX0NPTlRBSU5FUl9JRCA9ICdhdmFpbGFibGVCbG9ja3MnO1xuICAgIHN0YXRpYyByZWFkb25seSBNQUlOX0VESVRPUl9JRCA9ICdtYWluJztcblxuICAgIHByaXZhdGUgX2RlZmF1bHRTZWN0aW9uVGl0bGUgPSAnJztcbiAgICBcbiAgICBwcml2YXRlIF9ibG9ja3NMaW1pdE51bWJlciA9IDA7XG4gICAgc2V0QmxvY2tzTGltaXROdW1iZXIodmFsdWU6IG51bWJlcikge1xuICAgICAgICB0aGlzLl9ibG9ja3NMaW1pdE51bWJlciA9IHZhbHVlO1xuICAgIH1cbiAgICBcbiAgICBwcml2YXRlIF9lZGl0b3JzQnJlYWRDcnVtYiA9IEFycmF5PElFZGl0b3I+KCk7XG5cbiAgICBwcml2YXRlIF9lZGl0TW9kZTogYm9vbGVhbiA9IGZhbHNlO1xuICAgIGdldCBlZGl0TW9kZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2VkaXRNb2RlO1xuICAgIH1cbiAgICBzZXRFZGl0TW9kZSh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLl9lZGl0TW9kZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLnNldEVkaXRhYmxlU3RhdGUoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9lZGl0YWJsZVN0YXRlOiBib29sZWFuID0gZmFsc2U7XG4gICAgZ2V0IGVkaXRhYmxlU3RhdGUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9lZGl0YWJsZVN0YXRlO1xuICAgIH1cblxuICAgIC8vIFRoaXMgc3ViamVjdCBpcyBmb3IgdGhlIHNjcmVlbiBzaXplIGNoYW5nZSBldmVudHMuXG4gICAgcHJvdGVjdGVkIF9zY3JlZW5TaXplU3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PFBlcFNjcmVlblNpemVUeXBlPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8UGVwU2NyZWVuU2l6ZVR5cGU+KFBlcFNjcmVlblNpemVUeXBlLlhMKTtcbiAgICBnZXQgc2NyZWVuU2l6ZUNoYW5nZSQoKTogT2JzZXJ2YWJsZTxQZXBTY3JlZW5TaXplVHlwZT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2NyZWVuU2l6ZVN1YmplY3QuYXNPYnNlcnZhYmxlKCkucGlwZShkaXN0aW5jdFVudGlsQ2hhbmdlZCgpKTtcbiAgICB9XG5cbiAgICAvLyBUaGlzIHN1YmplY3QgaXMgZm9yIGRlbW9zdHJhdGUgdGhlIGNvbnRhaW5lciBzaXplIChVc2FnZSBvbmx5IGluIGVkaXQgbW9kZSkuXG4gICAgcHJpdmF0ZSBfc2NyZWVuV2lkdGhTdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPignMTAwJScpO1xuICAgIGdldCBzY3JlZW5XaWR0aENoYW5nZSQoKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NjcmVlbldpZHRoU3ViamVjdC5hc09ic2VydmFibGUoKS5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpO1xuICAgIH1cblxuICAgIC8vIFRoaXMgc3ViamVjdCBpcyBmb3IgbG9hZCB0aGUgY3VycmVudCBlZGl0b3IgKFVzYWdlIG9ubHkgaW4gZWRpdCBtb2RlKS5cbiAgICBwcml2YXRlIF9lZGl0b3JTdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8SUVkaXRvciB8IG51bGw+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxJRWRpdG9yIHwgbnVsbD4obnVsbCk7XG4gICAgZ2V0IGVkaXRvckNoYW5nZSQoKTogT2JzZXJ2YWJsZTxJRWRpdG9yIHwgbnVsbD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZWRpdG9yU3ViamVjdC5hc09ic2VydmFibGUoKS5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpO1xuICAgIH1cblxuICAgIC8vIFRoaXMgaXMgdGhlIHNlY3Rpb25zIGNvbHVtbnMgZHJvcCBsaXN0IHN1YmplY3QuXG4gICAgcHJpdmF0ZSBfc2VjdGlvbnNDb2x1bW5zRHJvcExpc3RTdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8YW55W10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnlbXT4oW10pO1xuICAgIGdldCBzZWN0aW9uc0NvbHVtbnNEcm9wTGlzdENoYW5nZSQoKTogT2JzZXJ2YWJsZTxhbnlbXT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2VjdGlvbnNDb2x1bW5zRHJvcExpc3RTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICAgIH1cblxuICAgIC8vIFRoaXMgaXMgdGhlIHNlY3Rpb25zIHN1YmplY3QgKGEgcGFyZSBmcm9tIHRoZSBsYXlvdXQgdmlldyBvYmplY3QpXG4gICAgcHJpdmF0ZSBfc2VjdGlvbnNWaWV3U3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PElQZXBMYXlvdXRTZWN0aW9uW10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxJUGVwTGF5b3V0U2VjdGlvbltdPihbXSk7XG4gICAgZ2V0IHNlY3Rpb25zQ2hhbmdlJCgpOiBPYnNlcnZhYmxlPElQZXBMYXlvdXRTZWN0aW9uW10+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NlY3Rpb25zVmlld1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gICAgICAgIC8vIChwcmV2U2VjdGlvbnMsIG5leHRTZWN0aW9ucykgPT4gSlNPTi5zdHJpbmdpZnkocHJldlNlY3Rpb25zKSA9PT0gSlNPTi5zdHJpbmdpZnkobmV4dFNlY3Rpb25zKSkpO1xuICAgIH1cblxuICAgIC8vIFRoaXMgc3ViamVjdCBpcyBmb3IgbGF5b3V0IHZpZXcgY2hhbmdlLlxuICAgIHByb3RlY3RlZCBfbGF5b3V0Vmlld1N1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxJUGVwTGF5b3V0VmlldyB8IG51bGw+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxJUGVwTGF5b3V0VmlldyB8IG51bGw+KG51bGwpO1xuICAgIGdldCBsYXlvdXRWaWV3Q2hhbmdlJCgpOiBPYnNlcnZhYmxlPElQZXBMYXlvdXRWaWV3IHwgbnVsbD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fbGF5b3V0Vmlld1N1YmplY3QuYXNPYnNlcnZhYmxlKCkucGlwZShmaWx0ZXIobGF5b3V0ID0+ICEhbGF5b3V0KSk7XG4gICAgfVxuXG4gICAgLy8gVGhpcyBzdWJqZWN0IGlzIGZvciBlZGl0IG1vZGUgd2hlbiBibG9jayBpcyBkcmFnZ2luZyBub3cgb3Igbm90LlxuICAgIHByaXZhdGUgX2RyYWdnaW5nQmxvY2tLZXk6IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+ID0gbmV3IEJlaGF2aW9yU3ViamVjdCgnJyk7XG4gICAgZ2V0IGRyYWdnaW5nQmxvY2tLZXkoKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RyYWdnaW5nQmxvY2tLZXkuYXNPYnNlcnZhYmxlKCkucGlwZShkaXN0aW5jdFVudGlsQ2hhbmdlZCgpKTtcbiAgICB9XG5cbiAgICAvLyBUaGlzIHN1YmplY3QgaXMgZm9yIGVkaXQgbW9kZSB3aGVuIHNlY3Rpb24gaXMgZHJhZ2dpbmcgbm93IG9yIG5vdC5cbiAgICBwcml2YXRlIF9kcmFnZ2luZ1NlY3Rpb25LZXk6IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+ID0gbmV3IEJlaGF2aW9yU3ViamVjdCgnJyk7XG4gICAgZ2V0IGRyYWdnaW5nU2VjdGlvbktleSgpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZHJhZ2dpbmdTZWN0aW9uS2V5LmFzT2JzZXJ2YWJsZSgpLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSk7XG4gICAgfVxuXG4gICAgLy8gVGhpcyBzdWJqZWN0IGlzIGZvciBsb2NrIG9yIHVubG9jayB0aGUgc2NyZWVuIChVc2FnZSBvbmx5IGluIGVkaXQgbW9kZSkuXG4gICAgcHJpdmF0ZSBfbG9ja1NjcmVlblN1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICAgIGdldCBsb2NrU2NyZWVuQ2hhbmdlJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvY2tTY3JlZW5TdWJqZWN0LmFzT2JzZXJ2YWJsZSgpLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSk7XG4gICAgfVxuXG4gICAgLy8gVGhpcyBpcyBmb3IgY29udHJvbCB0aGUgcHJldmlldyBtb2RlIChmb3IgbG9hZCB0aGUgYmxvY2tzIHdpdGggdGhlIENQSSBldmVudHMpIFxuICAgIHByaXZhdGUgX3ByZXZpZXdNb2RlU3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gICAgZ2V0IHByZXZpZXdNb2RlQ2hhbmdlJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ByZXZpZXdNb2RlU3ViamVjdC5hc09ic2VydmFibGUoKS5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpO1xuICAgIH1cblxuICAgIC8vIFRoaXMgaXMgZm9yIGVkaXRvciBtb2RlIGZvciBibG9jayBhZGRlZC5cbiAgICBwcml2YXRlIF9ibG9ja0FkZGVkRXZlbnRTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxJUGVwTGF5b3V0QmxvY2tBZGRlZEV2ZW50IHwgbnVsbD4obnVsbCk7XG4gICAgZ2V0IGJsb2NrQWRkZWRFdmVudFN1YmplY3QkKCk6IE9ic2VydmFibGU8SVBlcExheW91dEJsb2NrQWRkZWRFdmVudCB8IG51bGw+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Jsb2NrQWRkZWRFdmVudFN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuICAgIC8vIFRoaXMgaXMgZm9yIGVkaXRvciBtb2RlIGZvciBibG9ja3MgcmVtb3ZlZC5cbiAgICBwcml2YXRlIF9ibG9ja3NSZW1vdmVkRXZlbnRTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmdbXT4oW10pO1xuICAgIGdldCBibG9ja3NSZW1vdmVkRXZlbnRTdWJqZWN0JCgpOiBPYnNlcnZhYmxlPHN0cmluZ1tdPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9ibG9ja3NSZW1vdmVkRXZlbnRTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICAgIH1cblxuICAgIC8vIFRoaXMgc3ViamVjdCBpcyBmb3Igc2tlbGV0b24uXG4gICAgcHJpdmF0ZSBfc2hvd1NrZWxldG9uU3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPih0cnVlKTtcbiAgICBnZXQgc2hvd1NrZWxldG9uQ2hhbmdlJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Nob3dTa2VsZXRvblN1YmplY3QuYXNPYnNlcnZhYmxlKCkucGlwZShkaXN0aW5jdFVudGlsQ2hhbmdlZCgpKTtcbiAgICB9XG4gICAgXG4gICAgLy8gVGhpcyBzdWJqZWN0cyBpcyBmb3IgbG9hZCB0aGUgYXZhaWxhYmxlIGJsb2NrcyB0byBkcmFnIGludG8gbWFwIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2UuXG4gICAgcHJpdmF0ZSBfYXZhaWxhYmxlQmxvY2tzRm9yRHJhZ01hcCA9IG5ldyBNYXA8c3RyaW5nLCBJUGVwRHJhZ2dhYmxlSXRlbT4oKTtcbiAgICBnZXQgYXZhaWxhYmxlQmxvY2tzRm9yRHJhZ01hcCgpOiBSZWFkb25seU1hcDxzdHJpbmcsIElQZXBEcmFnZ2FibGVJdGVtPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hdmFpbGFibGVCbG9ja3NGb3JEcmFnTWFwO1xuICAgIH1cbiAgICBwcml2YXRlIF9hdmFpbGFibGVCbG9ja3NGb3JEcmFnTWFwU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8UmVhZG9ubHlNYXA8c3RyaW5nLCBJUGVwRHJhZ2dhYmxlSXRlbT4+KHRoaXMuYXZhaWxhYmxlQmxvY2tzRm9yRHJhZ01hcCk7XG4gICAgZ2V0IGF2YWlsYWJsZUJsb2Nrc0ZvckRyYWdNYXBDaGFuZ2UkKCk6IE9ic2VydmFibGU8UmVhZG9ubHlNYXA8c3RyaW5nLCBJUGVwRHJhZ2dhYmxlSXRlbT4+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2F2YWlsYWJsZUJsb2Nrc0ZvckRyYWdNYXBTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcm90ZWN0ZWQgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgICAgICBwcm90ZWN0ZWQgZGlhbG9nU2VydmljZTogUGVwRGlhbG9nU2VydmljZSxcbiAgICApIHtcbiAgICAgICAgLy9cbiAgICAgICAgdGhpcy5fZGVmYXVsdFNlY3Rpb25UaXRsZSA9IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ0xBWU9VVF9CVUlMREVSLlNFQ1RJT04nKTtcbiAgICB9XG4gICAgXG4gICAgcHJpdmF0ZSBzZXRFZGl0YWJsZVN0YXRlKCkge1xuICAgICAgICB0aGlzLl9lZGl0YWJsZVN0YXRlID0gdGhpcy5lZGl0TW9kZSAmJiAhdGhpcy5fcHJldmlld01vZGVTdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBub3RpZnlMYXlvdXRWaWV3Q2hhbmdlKGxheW91dFZpZXdUb1VwZGF0ZTogSVBlcExheW91dFZpZXcgfCBudWxsKSB7XG4gICAgICAgIGlmIChsYXlvdXRWaWV3VG9VcGRhdGUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmVkaXRNb2RlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVMYXlvdXRFZGl0b3JQcm9wZXJ0aWVzKGxheW91dFZpZXdUb1VwZGF0ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgbGF5b3V0IGZvciB0aGUgdmlldy5cbiAgICAgICAgICAgIHRoaXMuX2xheW91dFZpZXdTdWJqZWN0Lm5leHQobGF5b3V0Vmlld1RvVXBkYXRlKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBzZWN0aW9ucyBmb3IgdGhlIHZpZXcuXG4gICAgICAgICAgICB0aGlzLl9zZWN0aW9uc1ZpZXdTdWJqZWN0Lm5leHQobGF5b3V0Vmlld1RvVXBkYXRlPy5MYXlvdXQuU2VjdGlvbnMgfHwgW10pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBub3RpZnlCbG9ja0FkZGVkKGJsb2NrQWRkZWRFdmVudERhdGE6IElQZXBMYXlvdXRCbG9ja0FkZGVkRXZlbnQpIHtcbiAgICAgICAgLy8gTm90aWZ5IHRoYXQgdGhlIGJsb2NrIGlzIGFkZGVkICh0byByYWlzZSB0aGUgZXZlbnQgZm9yIHRoZSBjbGllbnQpLlxuICAgICAgICB0aGlzLl9ibG9ja0FkZGVkRXZlbnRTdWJqZWN0Lm5leHQoYmxvY2tBZGRlZEV2ZW50RGF0YSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBub3RpZnlCbG9ja3NSZW1vdmVkKGtleXM6IHN0cmluZ1tdIHwgdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmIChrZXlzKSB7XG4gICAgICAgICAgICAvLyBOb3RpZnkgdGhhdCB0aGUgYmxvY2tzIGFyZSByZW1vdmVkICh0byByYWlzZSB0aGUgZXZlbnQgZm9yIHRoZSBjbGllbnQpLlxuICAgICAgICAgICAgdGhpcy5fYmxvY2tzUmVtb3ZlZEV2ZW50U3ViamVjdC5uZXh0KGtleXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBub3RpZnlFZGl0b3JDaGFuZ2UoZWRpdG9yOiBJRWRpdG9yIHwgbnVsbCkge1xuICAgICAgICB0aGlzLl9lZGl0b3JTdWJqZWN0Lm5leHQoZWRpdG9yKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG5vdGlmeUF2YWlsYWJsZUJsb2Nrc0ZvckRyYWdNYXBDaGFuZ2UoKSB7XG4gICAgICAgIHRoaXMuX2F2YWlsYWJsZUJsb2Nrc0ZvckRyYWdNYXBTdWJqZWN0Lm5leHQodGhpcy5hdmFpbGFibGVCbG9ja3NGb3JEcmFnTWFwKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG5vdGlmeVByZXZpZXdNb2RlQ2hhbmdlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuX3ByZXZpZXdNb2RlU3ViamVjdC5uZXh0KHZhbHVlKTtcbiAgICAgICAgdGhpcy5zZXRFZGl0YWJsZVN0YXRlKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBub3RpZnlMb2NrU2NyZWVuKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuX2xvY2tTY3JlZW5TdWJqZWN0Lm5leHQodmFsdWUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgbm90aWZ5U2VjdGlvbnNDb2x1bW5zRHJvcExpc3RDaGFuZ2Uoc2VjdGlvbnNDb2x1bW5zRHJvcExpc3Q6IGFueVtdKSB7XG4gICAgICAgIHRoaXMuX3NlY3Rpb25zQ29sdW1uc0Ryb3BMaXN0U3ViamVjdC5uZXh0KHNlY3Rpb25zQ29sdW1uc0Ryb3BMaXN0KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZUxheW91dEVkaXRvclByb3BlcnRpZXMobGF5b3V0VmlldzogSVBlcExheW91dFZpZXcpIHtcbiAgICAgICAgaWYgKHRoaXMuX2VkaXRvcnNCcmVhZENydW1iWzBdKSB7XG4gICAgICAgICAgICBjb25zdCBsYXlvdXRFZGl0b3I6IElMYXlvdXRFZGl0b3IgPSB7XG4gICAgICAgICAgICAgICAgbWF4V2lkdGg6IGxheW91dFZpZXc/LkxheW91dC5NYXhXaWR0aCB8fCAwLFxuICAgICAgICAgICAgICAgIHZlcnRpY2FsU3BhY2luZzogbGF5b3V0Vmlldz8uTGF5b3V0LlZlcnRpY2FsU3BhY2luZyxcbiAgICAgICAgICAgICAgICBob3Jpem9udGFsU3BhY2luZzogbGF5b3V0Vmlldz8uTGF5b3V0Lkhvcml6b250YWxTcGFjaW5nLFxuICAgICAgICAgICAgICAgIHNlY3Rpb25zR2FwOiBsYXlvdXRWaWV3Py5MYXlvdXQuU2VjdGlvbnNHYXAsXG4gICAgICAgICAgICAgICAgY29sdW1uc0dhcDogbGF5b3V0Vmlldz8uTGF5b3V0LkNvbHVtbnNHYXAsXG4gICAgICAgICAgICAgICAgLy8gcm91bmRlZENvcm5lcnM6IGxheW91dFZpZXc/LmxheW91dC5cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHRoaXMuX2VkaXRvcnNCcmVhZENydW1iWzBdLmhvc3RPYmplY3QgPSBsYXlvdXRFZGl0b3I7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGxvYWREZWZhdWx0RWRpdG9yKGxheW91dFZpZXc6IElQZXBMYXlvdXRWaWV3KSB7XG4gICAgICAgIHRoaXMuX2VkaXRvcnNCcmVhZENydW1iID0gbmV3IEFycmF5PElFZGl0b3I+KCk7XG5cbiAgICAgICAgaWYgKGxheW91dFZpZXcpIHtcbiAgICAgICAgICAgIHRoaXMuX2VkaXRvcnNCcmVhZENydW1iLnB1c2goe1xuICAgICAgICAgICAgICAgIGlkOiBQZXBMYXlvdXRCdWlsZGVyU2VydmljZS5NQUlOX0VESVRPUl9JRCxcbiAgICAgICAgICAgICAgICB0eXBlIDogJ2xheW91dC1idWlsZGVyJyxcbiAgICAgICAgICAgICAgICB0aXRsZTogbGF5b3V0Vmlldy5UaXRsZSB8fCB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdMQVlPVVRfQlVJTERFUi5ERUZBVUxUX1RJVExFJyksXG4gICAgICAgICAgICAgICAgLy8gaG9zdE9iamVjdDoge30gLy8gVXBkYXRlcyBpbiB1cGRhdGVMYXlvdXRFZGl0b3JQcm9wZXJ0aWVzIGZ1bmN0aW9uIGFib3ZlLlxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMudXBkYXRlTGF5b3V0RWRpdG9yUHJvcGVydGllcyhsYXlvdXRWaWV3KTtcbiAgICAgICAgICAgIHRoaXMubm90aWZ5RWRpdG9yQ2hhbmdlKHRoaXMuX2VkaXRvcnNCcmVhZENydW1iWzBdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubm90aWZ5RWRpdG9yQ2hhbmdlKG51bGwpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjaGFuZ2VDdXJyZW50RWRpdG9yKCkge1xuICAgICAgICBpZiAodGhpcy5fZWRpdG9yc0JyZWFkQ3J1bWIubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5ub3RpZnlFZGl0b3JDaGFuZ2UodGhpcy5fZWRpdG9yc0JyZWFkQ3J1bWJbdGhpcy5fZWRpdG9yc0JyZWFkQ3J1bWIubGVuZ3RoIC0gMV0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRFZGl0b3JCeVR5cGUoZWRpdG9yVHlwZTogTGF5b3V0RWRpdG9yVHlwZSwgaWQ6IHN0cmluZyk6IElFZGl0b3IgfCBudWxsIHtcbiAgICAgICAgLy8gQnVpbGQgZWRpdG9yIG9iamVjdC5cbiAgICAgICAgbGV0IGVkaXRvcjogSUVkaXRvciB8IG51bGwgPSBudWxsO1xuXG4gICAgICAgIGlmIChlZGl0b3JUeXBlID09PSAnc2VjdGlvbicpIHtcbiAgICAgICAgICAgIGVkaXRvciA9IHRoaXMuZ2V0SW50ZXJuYWxTZWN0aW9uRWRpdG9yKGlkKTtcbiAgICAgICAgfSBlbHNlIGlmIChlZGl0b3JUeXBlID09PSAnYmxvY2snKSB7XG4gICAgICAgICAgICBlZGl0b3IgPSB0aGlzLmdldEludGVybmFsQmxvY2tFZGl0b3IoaWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGVkaXRvcjtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEludGVybmFsQmxvY2tFZGl0b3IoYmxvY2tLZXk6IHN0cmluZyk6IElFZGl0b3Ige1xuICAgICAgICBjb25zdCBibG9ja0NvbnRhaW5lciA9IHRoaXMuZ2V0QmxvY2tDb250YWluZXJCeUJsb2NrS2V5KGJsb2NrS2V5KTtcbiAgICAgICAgY29uc3QgZGVmYXVsdFRpdGxlID0gdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnTEFZT1VUX0JVSUxERVIuTk9fVElUTEUnKVxuICAgICAgICBsZXQgYmxvY2tUaXRsZSA9IGRlZmF1bHRUaXRsZTtcblxuICAgICAgICBpZiAoYmxvY2tDb250YWluZXIpIHtcbiAgICAgICAgICAgIGJsb2NrVGl0bGUgPSB0aGlzLmF2YWlsYWJsZUJsb2Nrc0ZvckRyYWdNYXA/LmdldChibG9ja0NvbnRhaW5lcj8uRHJhZ2dhYmxlSXRlbUtleSk/LnRpdGxlIHx8IGRlZmF1bHRUaXRsZTtcbiAgICAgICAgfVxuIFxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaWQ6IGJsb2NrS2V5LFxuICAgICAgICAgICAgdHlwZTogJ2Jsb2NrJyxcbiAgICAgICAgICAgIHRpdGxlOiBibG9ja1RpdGxlLFxuICAgICAgICAgICAgLy8gcmVtb3RlTW9kdWxlT3B0aW9uczogcmVtb3RlTG9hZGVyT3B0aW9ucyxcbiAgICAgICAgICAgIGhvc3RPYmplY3Q6IHt9IC8vIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoaG9zdE9iamVjdCkpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFNlY3Rpb25FZGl0b3JUaXRsZShzZWN0aW9uOiBJUGVwTGF5b3V0U2VjdGlvbiwgc2VjdGlvbkluZGV4OiBudW1iZXIpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gc2VjdGlvbi5OYW1lIHx8IGAke3RoaXMuX2RlZmF1bHRTZWN0aW9uVGl0bGV9ICR7c2VjdGlvbkluZGV4ICsgMX1gO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0SW50ZXJuYWxTZWN0aW9uRWRpdG9yKHNlY3Rpb25JZDogc3RyaW5nKTogSUVkaXRvciB8IG51bGwge1xuICAgICAgICBjb25zdCBsYXlvdXRWaWV3ID0gdGhpcy5fbGF5b3V0Vmlld1N1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICAgICAgY29uc3Qgc2VjdGlvbnMgPSBsYXlvdXRWaWV3Py5MYXlvdXQuU2VjdGlvbnMgfHwgW107XG4gICAgICAgIGNvbnN0IHNlY3Rpb25JbmRleCA9IHNlY3Rpb25zLmZpbmRJbmRleChzZWN0aW9uID0+IHNlY3Rpb24uS2V5ID09PSBzZWN0aW9uSWQpO1xuXG4gICAgICAgIGlmIChzZWN0aW9uSW5kZXggPj0gMCkge1xuICAgICAgICAgICAgbGV0IHNlY3Rpb24gPSBzZWN0aW9uc1tzZWN0aW9uSW5kZXhdO1xuICAgICAgICAgICAgY29uc3Qgc2VjdGlvbkVkaXRvcjogSUxheW91dFNlY3Rpb25FZGl0b3IgPSB7XG4gICAgICAgICAgICAgICAgaWQ6IHNlY3Rpb24uS2V5LFxuICAgICAgICAgICAgICAgIHNlY3Rpb25OYW1lOiBzZWN0aW9uLk5hbWUgfHwgJycsXG4gICAgICAgICAgICAgICAgc3BsaXQ6IHNlY3Rpb24uU3BsaXQgfHwgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIGhlaWdodDogc2VjdGlvbi5IZWlnaHQgfHwgMCxcbiAgICAgICAgICAgICAgICBjb2xsYXBzZU9uVGFibGV0OiBzZWN0aW9uLkNvbGxhcHNlT25UYWJsZXQgPz8gZmFsc2UsXG4gICAgICAgICAgICAgICAgZmlsbEhlaWdodDogc2VjdGlvbi5GaWxsSGVpZ2h0ID8/IGZhbHNlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgaWQ6IHNlY3Rpb25JZCxcbiAgICAgICAgICAgICAgICB0eXBlOiAnc2VjdGlvbicsXG4gICAgICAgICAgICAgICAgdGl0bGU6IHRoaXMuZ2V0U2VjdGlvbkVkaXRvclRpdGxlKHNlY3Rpb24sIHNlY3Rpb25JbmRleCksXG4gICAgICAgICAgICAgICAgaG9zdE9iamVjdDogc2VjdGlvbkVkaXRvclxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFNlY3Rpb25Db2x1bW5CeUlkRm9yRWRpdG9yKHNlY3Rpb25Db2x1bW5JZDogc3RyaW5nKTogSVBlcExheW91dFNlY3Rpb25Db2x1bW4gfCBudWxsIHtcbiAgICAgICAgbGV0IGN1cnJlbnRDb2x1bW4gPSBudWxsO1xuXG4gICAgICAgIC8vIEdldCB0aGUgc2VjdGlvbiBhbmQgY29sdW1uIGFycmF5IGJ5IHRoZSBwYXR0ZXJuIG9mIHRoZSBzZWN0aW9uIGNvbHVtbiBrZXkuXG4gICAgICAgIGNvbnN0IHNlY3Rpb25Db2x1bW5QYXR0ZXJuU2VwYXJhdG9yID0gdGhpcy5nZXRTZWN0aW9uQ29sdW1uS2V5KCk7XG4gICAgICAgIGNvbnN0IHNlY3Rpb25Db2x1bW5BcnIgPSBzZWN0aW9uQ29sdW1uSWQuc3BsaXQoc2VjdGlvbkNvbHVtblBhdHRlcm5TZXBhcmF0b3IpO1xuXG4gICAgICAgIGlmIChzZWN0aW9uQ29sdW1uQXJyLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgICAgY29uc3QgbGF5b3V0VmlldyA9IHRoaXMuX2xheW91dFZpZXdTdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgICAgICAgICBjb25zdCBzZWN0aW9ucyA9IGxheW91dFZpZXc/LkxheW91dC5TZWN0aW9ucyB8fCBbXTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gR2V0IHRoZSBzZWN0aW9uIGlkIHRvIGdldCB0aGUgc2VjdGlvbiBpbmRleC5cbiAgICAgICAgICAgIGNvbnN0IHNlY3Rpb25JZCA9IHNlY3Rpb25Db2x1bW5BcnJbMF07XG4gICAgICAgICAgICBjb25zdCBzZWN0aW9uSW5kZXggPSBzZWN0aW9ucy5maW5kSW5kZXgoc2VjdGlvbiA9PiBzZWN0aW9uLktleSA9PT0gc2VjdGlvbklkKTtcbiAgICAgICAgICAgIC8vIEdldCB0aGUgY29sdW1uIGluZGV4LlxuICAgICAgICAgICAgY29uc3QgY29sdW1uSW5kZXggPSBjb2VyY2VOdW1iZXJQcm9wZXJ0eShzZWN0aW9uQ29sdW1uQXJyWzFdLCAtMSk7XG4gICAgICAgICAgICBpZiAoc2VjdGlvbkluZGV4ID49IDAgJiYgY29sdW1uSW5kZXggPj0gMCkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRDb2x1bW4gPSBzZWN0aW9uc1tzZWN0aW9uSW5kZXhdLkNvbHVtbnNbY29sdW1uSW5kZXhdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGN1cnJlbnRDb2x1bW47XG4gICAgfVxuXG4gICAgLy8gcHJpdmF0ZSBzZXRTZWN0aW9uc0NvbHVtbnNHYXAobGF5b3V0VmlldzogSVBlcExheW91dFZpZXcpIHtcbiAgICAvLyAgICAgaWYgKGxheW91dFZpZXc/LkxheW91dD8uU2VjdGlvbnMpIHtcbiAgICAvLyAgICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBsYXlvdXRWaWV3LkxheW91dC5TZWN0aW9ucy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAvLyAgICAgICAgICAgICBjb25zdCBzZWN0aW9uID0gbGF5b3V0Vmlldy5MYXlvdXQuU2VjdGlvbnNbaW5kZXhdO1xuICAgIC8vICAgICAgICAgICAgIHNlY3Rpb24uQ29sdW1uc0dhcCA9IGxheW91dFZpZXcuTGF5b3V0LkNvbHVtbnNHYXA7XG4gICAgLy8gICAgICAgICB9XG4gICAgLy8gICAgIH1cbiAgICAvLyB9XG5cbiAgICBwcml2YXRlIGdldENzc1NjcmVlbldpZGgoc2NyZWVuVHlwZTogRGF0YVZpZXdTY3JlZW5TaXplKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IHdpZHRoVG9TZXQgPSAnMTAwJSc7XG5cbiAgICAgICAgaWYgKHNjcmVlblR5cGUgPT09ICdUYWJsZXQnKSB7XG4gICAgICAgICAgICB3aWR0aFRvU2V0ID0gJzcyMCc7XG4gICAgICAgIH0gZWxzZSBpZiAoc2NyZWVuVHlwZSA9PT0gJ1BoYWJsZXQnKSB7XG4gICAgICAgICAgICB3aWR0aFRvU2V0ID0gJzM2MCc7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gd2lkdGhUb1NldDtcbiAgICB9XG4gICAgXG4gICAgcHJpdmF0ZSBnZXRCbG9ja0NvbnRhaW5lckJ5QmxvY2tLZXkoYmxvY2tLZXk6IHN0cmluZyk6IElQZXBMYXlvdXRCbG9ja0NvbnRhaW5lciB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGxldCBibG9ja0NvbnRhaW5lclRvRmluZDogSVBlcExheW91dEJsb2NrQ29udGFpbmVyIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gICAgICAgIGNvbnN0IGxheW91dFZpZXcgPSB0aGlzLl9sYXlvdXRWaWV3U3ViamVjdC5nZXRWYWx1ZSgpO1xuICAgICAgICBjb25zdCBzZWN0aW9ucyA9IGxheW91dFZpZXc/LkxheW91dC5TZWN0aW9ucyB8fCBbXTtcbiAgICAgICAgXG4gICAgICAgIGZvciAobGV0IHNlY3Rpb25JbmRleCA9IDA7IHNlY3Rpb25JbmRleCA8IHNlY3Rpb25zLmxlbmd0aDsgc2VjdGlvbkluZGV4KyspIHtcbiAgICAgICAgICAgIGNvbnN0IHNlY3Rpb24gPSBzZWN0aW9uc1tzZWN0aW9uSW5kZXhdO1xuXG4gICAgICAgICAgICAvLyBHZXQgdGhlIGJsb2NrIGNvbnRhaW5lci5cbiAgICAgICAgICAgIGNvbnN0IGNvbHVtbkluZGV4ID0gc2VjdGlvbi5Db2x1bW5zLmZpbmRJbmRleChjb2x1bW4gPT4gY29sdW1uLkJsb2NrQ29udGFpbmVyPy5CbG9ja0tleSA9PT0gYmxvY2tLZXkpO1xuICAgICAgICAgICAgaWYgKGNvbHVtbkluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgICAgICBibG9ja0NvbnRhaW5lclRvRmluZCA9IHNlY3Rpb24uQ29sdW1uc1tjb2x1bW5JbmRleF0uQmxvY2tDb250YWluZXJcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBibG9ja0NvbnRhaW5lclRvRmluZDtcbiAgICB9XG4gICAgXG4gICAgcHJpdmF0ZSBjaGFuZ2VDdXJzb3JPbkRyYWdTdGFydCgpIHtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCdpbmhlcml0Q3Vyc29ycycpO1xuICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLmN1cnNvciA9ICdncmFiYmluZyc7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjaGFuZ2VDdXJzb3JPbkRyYWdFbmQoKSB7XG4gICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgnaW5oZXJpdEN1cnNvcnMnKTtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5jdXJzb3IgPSAndW5zZXQnO1xuICAgIH1cblxuICAgIFxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdWJsaWMgZnVuY3Rpb25zXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gICAgc2V0U2VjdGlvbnNDb2x1bW5zRHJvcExpc3RDaGFuZ2Uoc2VjdGlvbnNDb2x1bW5zRHJvcExpc3Q6IGFueVtdKSB7XG4gICAgICAgIHRoaXMubm90aWZ5U2VjdGlvbnNDb2x1bW5zRHJvcExpc3RDaGFuZ2Uoc2VjdGlvbnNDb2x1bW5zRHJvcExpc3QpO1xuICAgIH1cblxuICAgIHNldExvY2tTY3JlZW4odmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5ub3RpZnlMb2NrU2NyZWVuKHZhbHVlKTtcbiAgICB9XG5cbiAgICBjaGFuZ2VQcmV2aWV3TW9kZSh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLm5vdGlmeVByZXZpZXdNb2RlQ2hhbmdlKHZhbHVlKTtcbiAgICB9XG5cbiAgICBzZXRBdmFpbGFibGVCbG9ja3NUb0RyYWcoYXZhaWxhYmxlQmxvY2tzRm9yRHJhZzogQXJyYXk8SVBlcERyYWdnYWJsZUl0ZW0+KSB7XG4gICAgICAgIHRoaXMuX2F2YWlsYWJsZUJsb2Nrc0ZvckRyYWdNYXAuY2xlYXIoKTtcbiAgICAgICAgYXZhaWxhYmxlQmxvY2tzRm9yRHJhZy5mb3JFYWNoKGJsb2NrID0+IHtcbiAgICAgICAgICAgIHRoaXMuX2F2YWlsYWJsZUJsb2Nrc0ZvckRyYWdNYXAuc2V0KGJsb2NrLmRhdGEua2V5LCBibG9jayk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMubm90aWZ5QXZhaWxhYmxlQmxvY2tzRm9yRHJhZ01hcENoYW5nZSgpO1xuICAgIH1cblxuICAgIGdldFNjcmVlblR5cGUoc2l6ZTogUGVwU2NyZWVuU2l6ZVR5cGUpOiBEYXRhVmlld1NjcmVlblNpemUge1xuICAgICAgICBjb25zdCBzY3JlZW5UeXBlOiBEYXRhVmlld1NjcmVlblNpemUgPVxuICAgICAgICAgICAgc2l6ZSA8IFBlcFNjcmVlblNpemVUeXBlLk1EID8gJ0xhbmRzY2FwZScgOlxuICAgICAgICAgICAgKHNpemUgPT09IFBlcFNjcmVlblNpemVUeXBlLk1EIHx8IHNpemUgPT09IFBlcFNjcmVlblNpemVUeXBlLlNNID8gJ1RhYmxldCcgOiAnUGhhYmxldCcpO1xuXG4gICAgICAgIHJldHVybiBzY3JlZW5UeXBlO1xuICAgIH1cblxuICAgIGdldFNlY3Rpb25Db2x1bW5LZXkoc2VjdGlvbktleTogc3RyaW5nID0gJycsIGluZGV4OiBzdHJpbmcgPSAnJykge1xuICAgICAgICByZXR1cm4gYCR7c2VjdGlvbktleX1fY29sdW1uXyR7aW5kZXh9YDtcbiAgICB9XG5cbiAgICBnZXRJc0hpZGRlbihoaWRlSW46IERhdGFWaWV3U2NyZWVuU2l6ZVtdIHwgdW5kZWZpbmVkLCBjdXJyZW50U2NyZWVuVHlwZTogRGF0YVZpZXdTY3JlZW5TaXplKSB7XG4gICAgICAgIHJldHVybiAoaGlkZUluICYmIGhpZGVJbj8ubGVuZ3RoID4gMCkgPyBoaWRlSW4uc29tZShoaSA9PiBoaSA9PT0gY3VycmVudFNjcmVlblR5cGUpIDogZmFsc2U7XG4gICAgfVxuXG4gICAgbmF2aWdhdGVUb0VkaXRvcihlZGl0b3JUeXBlOiBMYXlvdXRFZGl0b3JUeXBlLCBpZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGxldCBzdWNjZXNzID0gZmFsc2U7XG5cbiAgICAgICAgLy8gQ2Fubm90IG5hdmlnYXRlIGludG8gJ2xheW91dC1idWlsZGVyJyBiZWNhdXNlIHRoaXMgaXMgZmlyc3QgYW5kIGNvbnN0IGluIHRoZSBlZGl0b3JzQnJlYWRDcnVtYnMuXG4gICAgICAgIGlmIChlZGl0b3JUeXBlICE9PSAnbGF5b3V0LWJ1aWxkZXInICYmIGlkPy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAvLyBDaGVjayB3aGljaCBlZGl0b3Igd2UgaGF2ZSBub3dcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRFZGl0b3IgPSB0aGlzLl9lZGl0b3JzQnJlYWRDcnVtYlt0aGlzLl9lZGl0b3JzQnJlYWRDcnVtYi5sZW5ndGggLSAxXTtcblxuICAgICAgICAgICAgLy8gT25seSBpZiBpdCdzIGFub3RoZXIgZWRpdG9yLlxuICAgICAgICAgICAgaWYoY3VycmVudEVkaXRvci5pZCAhPT0gaWQpIHtcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudEVkaXRvci50eXBlICE9PSAnbGF5b3V0LWJ1aWxkZXInKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEFsd2F5cyBwb3AgdGhlIGxhc3QgYW5kIGluc2VydCB0aGUgY3VycmVudC5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZWRpdG9yc0JyZWFkQ3J1bWIucG9wKCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IGVkaXRvciA9IHRoaXMuZ2V0RWRpdG9yQnlUeXBlKGVkaXRvclR5cGUsIGlkKTtcblxuICAgICAgICAgICAgICAgIGlmIChlZGl0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZWRpdG9yc0JyZWFkQ3J1bWIucHVzaChlZGl0b3IpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZUN1cnJlbnRFZGl0b3IoKTtcbiAgICAgICAgICAgICAgICAgICAgc3VjY2VzcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc3VjY2VzcyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzdWNjZXNzO1xuICAgIH1cblxuICAgIG5hdmlnYXRlQmFja0Zyb21FZGl0b3IoKSB7XG4gICAgICAgIC8vIEtlZXAgdGhlIGxheW91dCBidWlsZGVyIGVkaXRvci5cbiAgICAgICAgaWYgKHRoaXMuX2VkaXRvcnNCcmVhZENydW1iLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIC8vIE1heWJlIHdlIHdhbnQgdG8gY29tcGFyZSB0aGUgbGFzdCBlZGl0b3IgZm9yIHZhbGlkYXRpb24gP1xuICAgICAgICAgICAgY29uc3QgbGFzdEVkaXRvciA9IHRoaXMuX2VkaXRvcnNCcmVhZENydW1iLnBvcCgpO1xuICAgICAgICAgICAgdGhpcy5jaGFuZ2VDdXJyZW50RWRpdG9yKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1cGRhdGVMYXlvdXRGcm9tRWRpdG9yKGVkaXRvckRhdGE6IElMYXlvdXRFZGl0b3IpIHtcbiAgICAgICAgY29uc3QgbGF5b3V0VmlldyA9IHRoaXMuX2xheW91dFZpZXdTdWJqZWN0LmdldFZhbHVlKCk7XG5cbiAgICAgICAgaWYgKGxheW91dFZpZXcpIHtcbiAgICAgICAgICAgIGxheW91dFZpZXcuTGF5b3V0Lk1heFdpZHRoID0gZWRpdG9yRGF0YS5tYXhXaWR0aDtcbiAgICAgICAgICAgIGxheW91dFZpZXcuTGF5b3V0Lkhvcml6b250YWxTcGFjaW5nID0gZWRpdG9yRGF0YS5ob3Jpem9udGFsU3BhY2luZztcbiAgICAgICAgICAgIGxheW91dFZpZXcuTGF5b3V0LlZlcnRpY2FsU3BhY2luZyA9IGVkaXRvckRhdGEudmVydGljYWxTcGFjaW5nO1xuICAgICAgICAgICAgbGF5b3V0Vmlldy5MYXlvdXQuU2VjdGlvbnNHYXAgPSBlZGl0b3JEYXRhLnNlY3Rpb25zR2FwO1xuICAgICAgICAgICAgbGF5b3V0Vmlldy5MYXlvdXQuQ29sdW1uc0dhcCA9IGVkaXRvckRhdGEuY29sdW1uc0dhcDtcbiAgICAgICAgICAgIC8vIGxheW91dFZpZXcubGF5b3V0LlJvdW5kZWRDb3JuZXJzID0gZWRpdG9yRGF0YS5yb3VuZGVkQ29ybmVycztcblxuICAgICAgICAgICAgLy8gdGhpcy5zZXRTZWN0aW9uc0NvbHVtbnNHYXAobGF5b3V0Vmlldyk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHRoaXMubm90aWZ5TGF5b3V0Vmlld0NoYW5nZShsYXlvdXRWaWV3KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBcbiAgICB1cGRhdGVTZWN0aW9uRnJvbUVkaXRvcihzZWN0aW9uRGF0YTogSUxheW91dFNlY3Rpb25FZGl0b3IpIHtcbiAgICAgICAgY29uc3QgbGF5b3V0VmlldyA9IHRoaXMuX2xheW91dFZpZXdTdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgICAgIGNvbnN0IHNlY3Rpb25zID0gbGF5b3V0Vmlldz8uTGF5b3V0LlNlY3Rpb25zIHx8IFtdO1xuICAgICAgICBjb25zdCBzZWN0aW9uSW5kZXggPSBzZWN0aW9ucy5maW5kSW5kZXgoc2VjdGlvbiA9PiBzZWN0aW9uLktleSA9PT0gc2VjdGlvbkRhdGEuaWQpO1xuXG4gICAgICAgIC8vIFVwZGF0ZSBzZWN0aW9uIGRldGFpbHMuXG4gICAgICAgIGlmIChzZWN0aW9uSW5kZXggPj0gMCkge1xuICAgICAgICAgICAgY29uc3QgYmxvY2tzSWRzVG9SZW1vdmUgPSBbXTtcblxuICAgICAgICAgICAgY29uc3QgY3VycmVudFNlY3Rpb24gPSBzZWN0aW9uc1tzZWN0aW9uSW5kZXhdO1xuICAgICAgICAgICAgY3VycmVudFNlY3Rpb24uTmFtZSA9IHNlY3Rpb25EYXRhLnNlY3Rpb25OYW1lO1xuICAgICAgICAgICAgY3VycmVudFNlY3Rpb24uU3BsaXQgPSBzZWN0aW9uRGF0YS5zcGxpdDtcbiAgICAgICAgICAgIGN1cnJlbnRTZWN0aW9uLkhlaWdodCA9IHNlY3Rpb25EYXRhLmhlaWdodDtcbiAgICAgICAgICAgIGN1cnJlbnRTZWN0aW9uLkNvbGxhcHNlT25UYWJsZXQgPSBzZWN0aW9uRGF0YS5jb2xsYXBzZU9uVGFibGV0O1xuICAgICAgICAgICAgY3VycmVudFNlY3Rpb24uRmlsbEhlaWdodCA9IHNlY3Rpb25EYXRhLmZpbGxIZWlnaHQ7XG5cbiAgICAgICAgICAgIC8vIEdldCB0aGUgbmV3IGNvbHVtbnMgbnVtYmVyIGZyb20gY3VycmVudFNlY3Rpb24uU3BsaXQsIGlmIGl0cyB1bmRlZmluZWQgcHV0IGEgZGVmYXVsdCAxLlxuICAgICAgICAgICAgY29uc3QgbmV3Q29sdW1uc0xlbmd0aCA9IGN1cnJlbnRTZWN0aW9uLlNwbGl0Py5zcGxpdCgnICcpLmxlbmd0aCB8fCAxO1xuICAgICAgICAgICAgaWYgKG5ld0NvbHVtbnNMZW5ndGggPiBjdXJyZW50U2VjdGlvbi5Db2x1bW5zLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHdoaWxlIChuZXdDb2x1bW5zTGVuZ3RoID4gY3VycmVudFNlY3Rpb24uQ29sdW1ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFNlY3Rpb24uQ29sdW1ucy5wdXNoKHt9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG5ld0NvbHVtbnNMZW5ndGggPCBjdXJyZW50U2VjdGlvbi5Db2x1bW5zLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHdoaWxlIChuZXdDb2x1bW5zTGVuZ3RoIDwgY3VycmVudFNlY3Rpb24uQ29sdW1ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29sdW5tID0gY3VycmVudFNlY3Rpb24uQ29sdW1ucy5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgYmxvY2sgaW4gdGhpcyBjb2x1bW4gZGVsZXRlIGl0LlxuICAgICAgICAgICAgICAgICAgICBpZiAoY29sdW5tICYmIGNvbHVubS5CbG9ja0NvbnRhaW5lcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tzSWRzVG9SZW1vdmUucHVzaChjb2x1bm0uQmxvY2tDb250YWluZXIuQmxvY2tLZXkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBVcGRhdGUgZWRpdG9yIHRpdGxlXG4gICAgICAgICAgICBjb25zdCBjdXJyZW50RWRpdG9yID0gdGhpcy5fZWRpdG9yU3ViamVjdC5nZXRWYWx1ZSgpO1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRFZGl0b3IgJiYgY3VycmVudEVkaXRvci50eXBlID09PSAnc2VjdGlvbicgJiYgY3VycmVudEVkaXRvci5pZCA9PT0gY3VycmVudFNlY3Rpb24uS2V5KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGl0bGUgPSB0aGlzLmdldFNlY3Rpb25FZGl0b3JUaXRsZShjdXJyZW50U2VjdGlvbiwgc2VjdGlvbkluZGV4KTtcbiAgICAgICAgICAgICAgICBjdXJyZW50RWRpdG9yLnRpdGxlID0gdGl0bGU7XG4gICAgICAgICAgICAgICAgdGhpcy5ub3RpZnlFZGl0b3JDaGFuZ2UoY3VycmVudEVkaXRvcik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFVwZGF0ZSBzZWN0aW9ucyBjaGFuZ2UuXG4gICAgICAgICAgICB0aGlzLm5vdGlmeUxheW91dFZpZXdDaGFuZ2UobGF5b3V0Vmlldyk7XG5cbiAgICAgICAgICAgIC8vIElmIHRoZXJlIGFyZSBibG9ja3MgdG8gcmVtb3ZlLCBub3RpZnkgdGhlIGJsb2NrcyByZW1vdmVkLlxuICAgICAgICAgICAgaWYgKGJsb2Nrc0lkc1RvUmVtb3ZlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLm5vdGlmeUJsb2Nrc1JlbW92ZWQoYmxvY2tzSWRzVG9SZW1vdmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgYWRkU2VjdGlvbihzZWN0aW9uOiBJUGVwTGF5b3V0U2VjdGlvbiB8IG51bGwgPSBudWxsKSB7XG4gICAgICAgIC8vIENyZWF0ZSBuZXcgc2VjdGlvblxuICAgICAgICBpZiAoIXNlY3Rpb24pIHtcbiAgICAgICAgICAgIHNlY3Rpb24gPSB7XG4gICAgICAgICAgICAgICAgS2V5OiBQZXBHdWlkLm5ld0d1aWQoKSxcbiAgICAgICAgICAgICAgICBDb2x1bW5zOiBbe31dLCAvLyBBZGQgZW1wdHkgc2VjdGlvbiBjb2x1bW5cbiAgICAgICAgICAgICAgICBIaWRlOiBbXVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWRkIHRoZSBuZXcgc2VjdGlvbiB0byBsYXlvdXQgdmlldy5cbiAgICAgICAgY29uc3QgbGF5b3V0VmlldyA9IHRoaXMuX2xheW91dFZpZXdTdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgICAgIGNvbnN0IHNlY3Rpb25zID0gbGF5b3V0Vmlldz8uTGF5b3V0LlNlY3Rpb25zIHx8IFtdO1xuICAgICAgICBzZWN0aW9ucy5wdXNoKHNlY3Rpb24pO1xuICAgICAgICB0aGlzLm5vdGlmeUxheW91dFZpZXdDaGFuZ2UobGF5b3V0Vmlldyk7XG4gICAgfVxuXG4gICAgcmVtb3ZlU2VjdGlvbihzZWN0aW9uSWQ6IHN0cmluZykge1xuICAgICAgICBjb25zdCBsYXlvdXRWaWV3ID0gdGhpcy5fbGF5b3V0Vmlld1N1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICAgICAgY29uc3Qgc2VjdGlvbnMgPSBsYXlvdXRWaWV3Py5MYXlvdXQuU2VjdGlvbnMgfHwgW107XG4gICAgICAgIGNvbnN0IGluZGV4ID0gc2VjdGlvbnMuZmluZEluZGV4KHNlY3Rpb24gPT4gc2VjdGlvbi5LZXkgPT09IHNlY3Rpb25JZCk7XG4gICAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgICAvLyBHZXQgdGhlIGJsb2NrcyBpZCdzIHRvIHJlbW92ZS5cbiAgICAgICAgICAgIGNvbnN0IGJsb2Nrc0lkc1RvUmVtb3ZlOiBhbnkgPSBzZWN0aW9uc1tpbmRleF0uQ29sdW1ucy5tYXAoY29sdW1uID0+IGNvbHVtbj8uQmxvY2tDb250YWluZXI/LkJsb2NrS2V5KTtcblxuICAgICAgICAgICAgLy8gUmVtb3ZlIHNlY3Rpb24uXG4gICAgICAgICAgICBzZWN0aW9ucy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgdGhpcy5ub3RpZnlMYXlvdXRWaWV3Q2hhbmdlKGxheW91dFZpZXcpO1xuXG4gICAgICAgICAgICAvLyBJZiB0aGVyZSBhcmUgYmxvY2tzIHRvIHJlbW92ZSwgbm90aWZ5IHRoZSBibG9ja3MgcmVtb3ZlZC5cbiAgICAgICAgICAgIGlmIChibG9ja3NJZHNUb1JlbW92ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ub3RpZnlCbG9ja3NSZW1vdmVkKGJsb2Nrc0lkc1RvUmVtb3ZlKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgaGlkZVNlY3Rpb24oc2VjdGlvbklkOiBzdHJpbmcsIGhpZGVJbjogRGF0YVZpZXdTY3JlZW5TaXplW10pIHtcbiAgICAgICAgY29uc3QgbGF5b3V0VmlldyA9IHRoaXMuX2xheW91dFZpZXdTdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgICAgIGNvbnN0IHNlY3Rpb25zID0gbGF5b3V0Vmlldz8uTGF5b3V0LlNlY3Rpb25zIHx8IFtdO1xuICAgICAgICBjb25zdCBpbmRleCA9IHNlY3Rpb25zLmZpbmRJbmRleChzZWN0aW9uID0+IHNlY3Rpb24uS2V5ID09PSBzZWN0aW9uSWQpO1xuICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgICAgc2VjdGlvbnNbaW5kZXhdLkhpZGUgPSBoaWRlSW47XG4gICAgICAgICAgICB0aGlzLm5vdGlmeUxheW91dFZpZXdDaGFuZ2UobGF5b3V0Vmlldyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvblNlY3Rpb25Ecm9wcGVkKGV2ZW50OiBDZGtEcmFnRHJvcDxhbnlbXT4pIHtcbiAgICAgICAgY29uc3QgbGF5b3V0VmlldyA9IHRoaXMuX2xheW91dFZpZXdTdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgICAgIGNvbnN0IHNlY3Rpb25zID0gbGF5b3V0Vmlldz8uTGF5b3V0LlNlY3Rpb25zIHx8IFtdO1xuICAgICAgICBtb3ZlSXRlbUluQXJyYXkoc2VjdGlvbnMsIGV2ZW50LnByZXZpb3VzSW5kZXgsIGV2ZW50LmN1cnJlbnRJbmRleCk7XG4gICAgICAgIHRoaXMubm90aWZ5TGF5b3V0Vmlld0NoYW5nZShsYXlvdXRWaWV3KTtcbiAgICB9XG5cbiAgICBvblNlY3Rpb25EcmFnU3RhcnQoZXZlbnQ6IENka0RyYWdTdGFydCkge1xuICAgICAgICB0aGlzLmNoYW5nZUN1cnNvck9uRHJhZ1N0YXJ0KCk7XG4gICAgICAgIHRoaXMuX2RyYWdnaW5nU2VjdGlvbktleS5uZXh0KGV2ZW50LnNvdXJjZS5kYXRhKTtcbiAgICB9XG5cbiAgICBvblNlY3Rpb25EcmFnRW5kKGV2ZW50OiBDZGtEcmFnRW5kKSB7XG4gICAgICAgIHRoaXMuY2hhbmdlQ3Vyc29yT25EcmFnRW5kKCk7XG4gICAgICAgIHRoaXMuX2RyYWdnaW5nU2VjdGlvbktleS5uZXh0KCcnKTtcbiAgICB9XG5cbiAgICByZW1vdmVCbG9ja0Zyb21TZWN0aW9uKGJsb2NrSWQ6IHN0cmluZykge1xuICAgICAgICBsZXQgYmxvY2tSZW1vdmVkID0gZmFsc2U7XG5cbiAgICAgICAgLy8gUmVtb3ZlIHRoZSBibG9jayBmcm9tIHNlY3Rpb24gY29sdW1uLlxuICAgICAgICBjb25zdCBsYXlvdXRWaWV3ID0gdGhpcy5fbGF5b3V0Vmlld1N1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICAgICAgY29uc3Qgc2VjdGlvbnMgPSBsYXlvdXRWaWV3Py5MYXlvdXQuU2VjdGlvbnMgfHwgW107XG4gICAgICAgIFxuICAgICAgICBmb3IgKGxldCBzZWN0aW9uSW5kZXggPSAwOyBzZWN0aW9uSW5kZXggPCBzZWN0aW9ucy5sZW5ndGg7IHNlY3Rpb25JbmRleCsrKSB7XG4gICAgICAgICAgICBjb25zdCBzZWN0aW9uID0gc2VjdGlvbnNbc2VjdGlvbkluZGV4XTtcblxuICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBibG9jayBjb250YWluZXIuXG4gICAgICAgICAgICBjb25zdCBjb2x1bW5JbmRleCA9IHNlY3Rpb24uQ29sdW1ucy5maW5kSW5kZXgoY29sdW1uID0+IGNvbHVtbi5CbG9ja0NvbnRhaW5lcj8uQmxvY2tLZXkgPT09IGJsb2NrSWQpO1xuICAgICAgICAgICAgaWYgKGNvbHVtbkluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgc2VjdGlvbi5Db2x1bW5zW2NvbHVtbkluZGV4XS5CbG9ja0NvbnRhaW5lcjtcbiAgICAgICAgICAgICAgICB0aGlzLm5vdGlmeUxheW91dFZpZXdDaGFuZ2UobGF5b3V0Vmlldyk7XG4gICAgICAgICAgICAgICAgYmxvY2tSZW1vdmVkID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgdGhlIGJsb2NrIHdhcyByZW1vdmVkLCBub3RpZnkgdGhlIGJsb2NrIHJlbW92ZWQuXG4gICAgICAgIGlmIChibG9ja1JlbW92ZWQpIHtcbiAgICAgICAgICAgIHRoaXMubm90aWZ5QmxvY2tzUmVtb3ZlZChbYmxvY2tJZF0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaGlkZUJsb2NrKHNlY3Rpb25JZDogc3RyaW5nLCBibG9ja0lkOiBzdHJpbmcsIGhpZGVJbjogRGF0YVZpZXdTY3JlZW5TaXplW10pIHtcbiAgICAgICAgY29uc3QgbGF5b3V0VmlldyA9IHRoaXMuX2xheW91dFZpZXdTdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgICAgIGNvbnN0IHNlY3Rpb25zID0gbGF5b3V0Vmlldz8uTGF5b3V0LlNlY3Rpb25zIHx8IFtdO1xuICAgICAgICBcbiAgICAgICAgY29uc3QgaW5kZXggPSBzZWN0aW9ucy5maW5kSW5kZXgoc2VjdGlvbiA9PiBzZWN0aW9uLktleSA9PT0gc2VjdGlvbklkKTtcbiAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbHVtbkluZGV4ID0gc2VjdGlvbnNbaW5kZXhdLkNvbHVtbnMuZmluZEluZGV4KGNvbHVtbiA9PiBjb2x1bW4uQmxvY2tDb250YWluZXI/LkJsb2NrS2V5ID09PSBibG9ja0lkKTtcbiAgICAgICAgICAgIGlmIChjb2x1bW5JbmRleCA+IC0xKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYmxvY2tDb250YWluZXIgPSBzZWN0aW9uc1tpbmRleF0uQ29sdW1uc1tjb2x1bW5JbmRleF0uQmxvY2tDb250YWluZXI7XG4gICAgICAgICAgICAgICAgaWYgKGJsb2NrQ29udGFpbmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGJsb2NrQ29udGFpbmVyLkhpZGUgPSBoaWRlSW47XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm90aWZ5TGF5b3V0Vmlld0NoYW5nZShsYXlvdXRWaWV3KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEJsb2Nrc051bWJlcigpOiBudW1iZXIge1xuICAgICAgICBsZXQgYmxvY2tzTnVtYmVyID0gMDtcbiAgICAgICAgY29uc3Qgc2VjdGlvbnMgPSB0aGlzLl9sYXlvdXRWaWV3U3ViamVjdC5nZXRWYWx1ZSgpPy5MYXlvdXQuU2VjdGlvbnMgfHwgW107XG5cbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHNlY3Rpb25zLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgY29uc3Qgc2VjdGlvbiA9IHNlY3Rpb25zW2luZGV4XTtcbiAgICAgICAgXG4gICAgICAgICAgICBmb3IgKGxldCBjb2x1bW5JbmRleCA9IDA7IGNvbHVtbkluZGV4IDwgc2VjdGlvbi5Db2x1bW5zLmxlbmd0aDsgY29sdW1uSW5kZXgrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbHVtbiA9IHNlY3Rpb24uQ29sdW1uc1tjb2x1bW5JbmRleF07XG4gICAgICAgICAgICAgICAgaWYgKGNvbHVtbi5CbG9ja0NvbnRhaW5lciAmJiBjb2x1bW4uQmxvY2tDb250YWluZXIuQmxvY2tLZXk/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgYmxvY2tzTnVtYmVyKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGJsb2Nrc051bWJlcjtcbiAgICB9XG5cbiAgICBvbkJsb2NrRHJvcHBlZChldmVudDogQ2RrRHJhZ0Ryb3A8SVBlcExheW91dFNlY3Rpb25Db2x1bW4sIGFueSwgYW55Piwgc2VjdGlvbklkOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgbGF5b3V0VmlldyA9IHRoaXMuX2xheW91dFZpZXdTdWJqZWN0LmdldFZhbHVlKCk7XG5cbiAgICAgICAgaWYgKGV2ZW50LnByZXZpb3VzQ29udGFpbmVyLmlkID09PSBQZXBMYXlvdXRCdWlsZGVyU2VydmljZS5BVkFJTEFCTEVfQkxPQ0tTX0NPTlRBSU5FUl9JRCkge1xuICAgICAgICAgICAgLy8gVmFsaWRhdGUgaWYgYmxvY2tzIG51bWJlciBhbGxvdy5cbiAgICAgICAgICAgIGlmICh0aGlzLl9ibG9ja3NMaW1pdE51bWJlciA+IDAgJiYgdGhpcy5nZXRCbG9ja3NOdW1iZXIoKSA+PSB0aGlzLl9ibG9ja3NMaW1pdE51bWJlcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBuZXcgUGVwRGlhbG9nRGF0YSh7XG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdNRVNTQUdFUy5ESUFMT0dfTk9USUNFX1RJVExFJyksXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ0xBWU9VVF9CVUlMREVSLkJMT0NLU19DT1VOVF9MSU1JVF9NRVNTQUdFJyksXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmRpYWxvZ1NlcnZpY2Uub3BlbkRlZmF1bHREaWFsb2coZGF0YSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgYmxvY2sgcmVsYXRpb24gKHByZXZpb3VzQ29udGFpbmVyLmRhdGEgaXMgSVBlcERyYWdnYWJsZUl0ZW0gYW5kIGluc2lkZSB3ZSBoYXZlIEF2YWlsYWJsZUJsb2NrIG9iamVjdCkuXG4gICAgICAgICAgICAgICAgY29uc3QgZHJhZ2dhYmxlSXRlbTogSVBlcERyYWdnYWJsZUl0ZW0gPSBldmVudC5wcmV2aW91c0NvbnRhaW5lci5kYXRhW2V2ZW50LnByZXZpb3VzSW5kZXhdIGFzIElQZXBEcmFnZ2FibGVJdGVtO1xuXG4gICAgICAgICAgICAgICAgaWYgKGRyYWdnYWJsZUl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gbG9jayB0aGUgc2NyZWVuIHVudGlsbCB0aGUgZWRpdG9yIHdpbGwgYmUgbG9hZGVkLlxuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLl9sb2NrU2NyZWVuU3ViamVjdC5uZXh0KHRydWUpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgY29sdW1uLlxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50Q29sdW1uID0gdGhpcy5nZXRTZWN0aW9uQ29sdW1uQnlJZEZvckVkaXRvcihldmVudC5jb250YWluZXIuaWQpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIFNldCB0aGUgYmxvY2sga2V5IGluIHRoZSBzZWN0aW9uIGJsb2NrIG9ubHkgaWYgdGhlcmUgaXMgYSBibGFuayBjb2x1bW4uXG4gICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Q29sdW1uICYmICFjdXJyZW50Q29sdW1uLkJsb2NrQ29udGFpbmVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBHZW5lcmF0ZSB0aGUgYmxvY2sgdXVpZC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJsb2NrS2V5ID0gUGVwR3VpZC5uZXdHdWlkKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRDb2x1bW4uQmxvY2tDb250YWluZXIgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQmxvY2tLZXk6IGJsb2NrS2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIERyYWdnYWJsZUl0ZW1LZXk6IGRyYWdnYWJsZUl0ZW0uZGF0YS5rZXksXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBIZXJlIHdlIHVwZGF0ZSB0aGUgbGF5b3V0IHZpZXcgY2F1c2UgdGhlIGxheW91dCBpcyB1cGRhdGVkLlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3RpZnlMYXlvdXRWaWV3Q2hhbmdlKGxheW91dFZpZXcpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBSYWlzZSBibG9jayBhZGRlZCBldmVudC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJsb2NrQWRkZWRFdmVudERhdGE6IElQZXBMYXlvdXRCbG9ja0FkZGVkRXZlbnQgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQmxvY2tLZXk6IGJsb2NrS2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIERyYWdnYWJsZUl0ZW06IGRyYWdnYWJsZUl0ZW0sXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vdGlmeUJsb2NrQWRkZWQoYmxvY2tBZGRlZEV2ZW50RGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImRyYWdnYWJsZUl0ZW0gaXMgbm90IGEgSVBlcERyYWdnYWJsZUl0ZW0gdHlwZVwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBJZiB0aGUgYmxvY2sgbW92ZWQgYmV0d2VlbiBjb2x1bW5zIGluIHRoZSBzYW1lIHNlY3Rpb24gb3IgYmV0d2VlbiBkaWZmZXJlbnQgc2VjdGlvbnMgYnV0IG5vdCBpbiB0aGUgc2FtZSBjb2x1bW4uXG4gICAgICAgICAgICBpZiAoZXZlbnQuY29udGFpbmVyLmlkICE9PSBldmVudC5wcmV2aW91c0NvbnRhaW5lci5pZCkge1xuICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgY29sdW1uLlxuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRDb2x1bW4gPSB0aGlzLmdldFNlY3Rpb25Db2x1bW5CeUlkRm9yRWRpdG9yKGV2ZW50LmNvbnRhaW5lci5pZCk7XG4gICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBwcmV2aW91cyBjb2x1bW4uXG4gICAgICAgICAgICAgICAgY29uc3QgcHJldml1b3NDb2x1bW4gPSB0aGlzLmdldFNlY3Rpb25Db2x1bW5CeUlkRm9yRWRpdG9yKGV2ZW50LnByZXZpb3VzQ29udGFpbmVyLmlkKTtcblxuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Q29sdW1uICYmIHByZXZpdW9zQ29sdW1uKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRDb2x1bW4uQmxvY2tDb250YWluZXIgPSBwcmV2aXVvc0NvbHVtbi5CbG9ja0NvbnRhaW5lcjtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHByZXZpdW9zQ29sdW1uLkJsb2NrQ29udGFpbmVyO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vdGlmeUxheW91dFZpZXdDaGFuZ2UobGF5b3V0Vmlldyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25CbG9ja0RyYWdTdGFydChldmVudDogQ2RrRHJhZ1N0YXJ0KSB7XG4gICAgICAgIHRoaXMuY2hhbmdlQ3Vyc29yT25EcmFnU3RhcnQoKTtcbiAgICAgICAgLy8gVGFrZSB0aGUgYmxvY2sga2V5IGlmIGV4aXN0LCBlbHNlIHRha2UgdGhlIGF2YWlsYWJsZSBibG9jayBrZXkgKHJlbGF0aW9uIGtleSkuXG4gICAgICAgIGNvbnN0IGJsb2NrS2V5ID0gZXZlbnQuc291cmNlLmRhdGE/LkJsb2NrS2V5IHx8IGV2ZW50LnNvdXJjZS5kYXRhPy5LZXk7XG4gICAgICAgIHRoaXMuX2RyYWdnaW5nQmxvY2tLZXkubmV4dChibG9ja0tleSk7XG4gICAgfVxuXG4gICAgb25CbG9ja0RyYWdFbmQoZXZlbnQ6IENka0RyYWdFbmQpIHtcbiAgICAgICAgdGhpcy5jaGFuZ2VDdXJzb3JPbkRyYWdFbmQoKTtcbiAgICAgICAgdGhpcy5fZHJhZ2dpbmdCbG9ja0tleS5uZXh0KCcnKTtcbiAgICB9XG4gICAgXG4gICAgZG9lc0NvbHVtbkNvbnRhaW5CbG9jayhzZWN0aW9uSWQ6IHN0cmluZywgY29sdW1uSW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgcmVzID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IGxheW91dFZpZXcgPSB0aGlzLl9sYXlvdXRWaWV3U3ViamVjdC5nZXRWYWx1ZSgpO1xuICAgICAgICBjb25zdCBzZWN0aW9uID0gbGF5b3V0Vmlldz8uTGF5b3V0LlNlY3Rpb25zLmZpbmQoc2VjdGlvbiA9PiBzZWN0aW9uLktleSA9PT0gc2VjdGlvbklkKTtcblxuICAgICAgICBpZiAoc2VjdGlvbiAmJiBjb2x1bW5JbmRleCA+PSAwICYmIHNlY3Rpb24uQ29sdW1ucy5sZW5ndGggPiBjb2x1bW5JbmRleCkge1xuICAgICAgICAgICAgcmVzID0gISFzZWN0aW9uLkNvbHVtbnNbY29sdW1uSW5kZXhdLkJsb2NrQ29udGFpbmVyO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICBzZXRTY3JlZW5XaWR0aChzY3JlZW5UeXBlOiBEYXRhVmlld1NjcmVlblNpemUpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmdldENzc1NjcmVlbldpZGgoc2NyZWVuVHlwZSlcblxuICAgICAgICBsZXQgd2lkdGggPSBjb2VyY2VOdW1iZXJQcm9wZXJ0eSh2YWx1ZSwgMCk7XG4gICAgICAgIGlmICh3aWR0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5fc2NyZWVuV2lkdGhTdWJqZWN0Lm5leHQoJzEwMCUnKTtcbiAgICAgICAgICAgIHRoaXMuX3NjcmVlblNpemVTdWJqZWN0Lm5leHQoUGVwU2NyZWVuU2l6ZVR5cGUuWEwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fc2NyZWVuV2lkdGhTdWJqZWN0Lm5leHQoYCR7d2lkdGh9cHhgKTtcblxuICAgICAgICAgICAgLy8gQ2hhbmdlIHRoZSBzaXplIGFjY29yZGluZyB0aGUgd2lkdGguXG4gICAgICAgICAgICBpZiAod2lkdGggPj0gMTkyMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3NjcmVlblNpemVTdWJqZWN0Lm5leHQoUGVwU2NyZWVuU2l6ZVR5cGUuWEwpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh3aWR0aCA+PSAxMjgwICYmIHdpZHRoIDwgMTkyMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3NjcmVlblNpemVTdWJqZWN0Lm5leHQoUGVwU2NyZWVuU2l6ZVR5cGUuTEcpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh3aWR0aCA+PSA5NjAgJiYgd2lkdGggPCAxMjgwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2NyZWVuU2l6ZVN1YmplY3QubmV4dChQZXBTY3JlZW5TaXplVHlwZS5NRCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHdpZHRoID49IDYwMCAmJiB3aWR0aCA8IDk2MCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3NjcmVlblNpemVTdWJqZWN0Lm5leHQoUGVwU2NyZWVuU2l6ZVR5cGUuU00pO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh3aWR0aCA8IDYwMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3NjcmVlblNpemVTdWJqZWN0Lm5leHQoUGVwU2NyZWVuU2l6ZVR5cGUuWFMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2hvd1NrZWxldG9uKHNob3c6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5fc2hvd1NrZWxldG9uU3ViamVjdC5uZXh0KHNob3cpO1xuICAgIH1cbiAgICBcbiAgICBsb2FkTGF5b3V0QnVpbGRlcihsYXlvdXRWaWV3OiBJUGVwTGF5b3V0Vmlldyk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5lZGl0TW9kZSkge1xuICAgICAgICAgICAgLy8gTG9hZCB0aGUgbGF5b3V0IGVkaXRvci5cbiAgICAgICAgICAgIHRoaXMubG9hZERlZmF1bHRFZGl0b3IobGF5b3V0Vmlldyk7XG5cbiAgICAgICAgICAgIC8vIFNldCB0aGUgY29sdW1ucyBnYXAgb2YgdGhlIHNlY3Rpb25zLlxuICAgICAgICAgICAgLy8gdGhpcy5zZXRTZWN0aW9uc0NvbHVtbnNHYXAobGF5b3V0Vmlldyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBMb2FkIG9ubHkgdGhlIGxheW91dCB2aWV3LlxuICAgICAgICB0aGlzLm5vdGlmeUxheW91dFZpZXdDaGFuZ2UobGF5b3V0Vmlldyk7XG4gICAgfVxufVxuIl19
|