@pepperi-addons/ngx-composite-lib 0.4.2-beta.69 → 0.4.2-beta.70

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.
@@ -1,650 +1,33 @@
1
1
  import { Injectable } from "@angular/core";
2
- import { coerceNumberProperty } from "@angular/cdk/coercion";
3
- import { moveItemInArray } from "@angular/cdk/drag-drop";
4
- import { PepGuid, PepScreenSizeType } from "@pepperi-addons/ngx-lib";
5
- import { BehaviorSubject } from 'rxjs';
6
- import { distinctUntilChanged, filter } from 'rxjs/operators';
7
- import { PepDialogData } from "@pepperi-addons/ngx-lib/dialog";
8
2
  import * as i0 from "@angular/core";
9
- import * as i1 from "@ngx-translate/core";
10
- import * as i2 from "@pepperi-addons/ngx-lib/dialog";
3
+ import * as i1 from "./layout-builder-internal.service";
11
4
  export class PepLayoutBuilderService {
12
- constructor(translate, dialogService) {
13
- this.translate = translate;
14
- this.dialogService = dialogService;
15
- this._defaultSectionTitle = '';
16
- this._blocksLimitNumber = 0;
17
- this._editorsBreadCrumb = Array();
18
- this._editMode = false;
19
- this._editableState = false;
20
- // This subject is for the screen size change events.
21
- this._screenSizeSubject = new BehaviorSubject(PepScreenSizeType.XL);
22
- // This subject is for demostrate the container size (Usage only in edit mode).
23
- this._screenWidthSubject = new BehaviorSubject('100%');
24
- // This subject is for load the current editor (Usage only in edit mode).
25
- this._editorSubject = new BehaviorSubject(null);
26
- // This is the sections columns drop list subject.
27
- this._sectionsColumnsDropListSubject = new BehaviorSubject([]);
28
- // This is the sections subject (a pare from the layout view object)
29
- this._sectionsViewSubject = new BehaviorSubject([]);
30
- // This subject is for layout view change.
31
- this._layoutViewSubject = new BehaviorSubject(null);
32
- // This subject is for edit mode when block is dragging now or not.
33
- this._draggingBlockKey = new BehaviorSubject('');
34
- // This subject is for edit mode when section is dragging now or not.
35
- this._draggingSectionKey = new BehaviorSubject('');
36
- // This subject is for lock or unlock the screen (Usage only in edit mode).
37
- this._lockScreenSubject = new BehaviorSubject(false);
38
- // This is for control the preview mode (for load the blocks with the CPI events)
39
- this._previewModeSubject = new BehaviorSubject(false);
40
- // This is for editor mode for block added.
41
- this._blockAddedEventSubject = new BehaviorSubject(null);
42
- // This is for editor mode for blocks removed.
43
- this._blocksRemovedEventSubject = new BehaviorSubject([]);
44
- // This subject is for skeleton.
45
- this._showSkeletonSubject = new BehaviorSubject(true);
46
- // This subjects is for load the available blocks to drag into map for better performance.
47
- this._availableBlocksForDragMap = new Map();
48
- this._availableBlocksForDragMapSubject = new BehaviorSubject(this.availableBlocksForDragMap);
5
+ constructor(layoutBuilderInternalService) {
6
+ this.layoutBuilderInternalService = layoutBuilderInternalService;
49
7
  //
50
- this._defaultSectionTitle = this.translate.instant('LAYOUT_BUILDER.SECTION');
51
- }
52
- setBlocksLimitNumber(value) {
53
- this._blocksLimitNumber = value;
54
8
  }
55
9
  get editMode() {
56
- return this._editMode;
57
- }
58
- setEditMode(value) {
59
- this._editMode = value;
60
- this.setEditableState();
10
+ return this.layoutBuilderInternalService.editMode;
61
11
  }
62
12
  get editableState() {
63
- return this._editableState;
64
- }
65
- get screenSizeChange$() {
66
- return this._screenSizeSubject.asObservable().pipe(distinctUntilChanged());
67
- }
68
- get screenWidthChange$() {
69
- return this._screenWidthSubject.asObservable().pipe(distinctUntilChanged());
70
- }
71
- get editorChange$() {
72
- return this._editorSubject.asObservable().pipe(distinctUntilChanged());
73
- }
74
- get sectionsColumnsDropListChange$() {
75
- return this._sectionsColumnsDropListSubject.asObservable();
76
- }
77
- get sectionsChange$() {
78
- return this._sectionsViewSubject.asObservable();
79
- // (prevSections, nextSections) => JSON.stringify(prevSections) === JSON.stringify(nextSections)));
80
- }
81
- get layoutViewChange$() {
82
- return this._layoutViewSubject.asObservable().pipe(filter(layout => !!layout));
83
- }
84
- get draggingBlockKey() {
85
- return this._draggingBlockKey.asObservable().pipe(distinctUntilChanged());
86
- }
87
- get draggingSectionKey() {
88
- return this._draggingSectionKey.asObservable().pipe(distinctUntilChanged());
89
- }
90
- get lockScreenChange$() {
91
- return this._lockScreenSubject.asObservable().pipe(distinctUntilChanged());
92
- }
93
- get previewModeChange$() {
94
- return this._previewModeSubject.asObservable().pipe(distinctUntilChanged());
95
- }
96
- get blockAddedEventSubject$() {
97
- return this._blockAddedEventSubject.asObservable();
98
- }
99
- get blocksRemovedEventSubject$() {
100
- return this._blocksRemovedEventSubject.asObservable();
101
- }
102
- get showSkeletonChange$() {
103
- return this._showSkeletonSubject.asObservable().pipe(distinctUntilChanged());
104
- }
105
- get availableBlocksForDragMap() {
106
- return this._availableBlocksForDragMap;
107
- }
108
- get availableBlocksForDragMapChange$() {
109
- return this._availableBlocksForDragMapSubject.asObservable();
110
- }
111
- setEditableState() {
112
- this._editableState = this.editMode && !this._previewModeSubject.getValue();
113
- }
114
- notifyLayoutViewChange(layoutViewToUpdate) {
115
- if (layoutViewToUpdate) {
116
- if (this.editMode) {
117
- this.updateLayoutEditorProperties(layoutViewToUpdate);
118
- }
119
- // Update the layout for the view.
120
- this._layoutViewSubject.next(layoutViewToUpdate);
121
- // Update the sections for the view.
122
- this._sectionsViewSubject.next(layoutViewToUpdate?.Layout.Sections || []);
123
- }
124
- }
125
- notifyBlockAdded(blockAddedEventData) {
126
- // Notify that the block is added (to raise the event for the client).
127
- this._blockAddedEventSubject.next(blockAddedEventData);
128
- }
129
- notifyBlocksRemoved(keys) {
130
- if (keys) {
131
- // Notify that the blocks are removed (to raise the event for the client).
132
- this._blocksRemovedEventSubject.next(keys);
133
- }
134
- }
135
- notifyEditorChange(editor) {
136
- this._editorSubject.next(editor);
137
- }
138
- notifyAvailableBlocksForDragMapChange() {
139
- this._availableBlocksForDragMapSubject.next(this.availableBlocksForDragMap);
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
- }
151
- updateLayoutEditorProperties(layoutView) {
152
- if (this._editorsBreadCrumb[0]) {
153
- const layoutEditor = {
154
- maxWidth: layoutView?.Layout.MaxWidth || 0,
155
- verticalSpacing: layoutView?.Layout.VerticalSpacing,
156
- horizontalSpacing: layoutView?.Layout.HorizontalSpacing,
157
- sectionsGap: layoutView?.Layout.SectionsGap,
158
- columnsGap: layoutView?.Layout.ColumnsGap,
159
- // roundedCorners: layoutView?.layout.
160
- };
161
- this._editorsBreadCrumb[0].hostObject = layoutEditor;
162
- }
163
- }
164
- loadDefaultEditor(layoutView) {
165
- this._editorsBreadCrumb = new Array();
166
- if (layoutView) {
167
- this._editorsBreadCrumb.push({
168
- id: PepLayoutBuilderService.MAIN_EDITOR_ID,
169
- type: 'layout-builder',
170
- title: layoutView.Title || this.translate.instant('LAYOUT_BUILDER.DEFAULT_TITLE'),
171
- // hostObject: {} // Updates in updateLayoutEditorProperties function above.
172
- });
173
- this.updateLayoutEditorProperties(layoutView);
174
- this.notifyEditorChange(this._editorsBreadCrumb[0]);
175
- }
176
- else {
177
- this.notifyEditorChange(null);
178
- }
179
- }
180
- changeCurrentEditor() {
181
- if (this._editorsBreadCrumb.length > 0) {
182
- this.notifyEditorChange(this._editorsBreadCrumb[this._editorsBreadCrumb.length - 1]);
183
- }
184
- }
185
- getEditorByType(editorType, id) {
186
- // Build editor object.
187
- let editor = null;
188
- if (editorType === 'section') {
189
- editor = this.getInternalSectionEditor(id);
190
- }
191
- else if (editorType === 'block') {
192
- editor = this.getInternalBlockEditor(id);
193
- }
194
- return editor;
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
- };
13
+ return this.layoutBuilderInternalService.editableState;
210
14
  }
211
- getSectionEditorTitle(section, sectionIndex) {
212
- return section.Name || `${this._defaultSectionTitle} ${sectionIndex + 1}`;
213
- }
214
- getInternalSectionEditor(sectionId) {
215
- const layoutView = this._layoutViewSubject.getValue();
216
- const sections = layoutView?.Layout.Sections || [];
217
- const sectionIndex = sections.findIndex(section => section.Key === sectionId);
218
- if (sectionIndex >= 0) {
219
- let section = sections[sectionIndex];
220
- const sectionEditor = {
221
- id: section.Key,
222
- sectionName: section.Name || '',
223
- split: section.Split || undefined,
224
- height: section.Height || 0,
225
- collapseOnTablet: section.CollapseOnTablet ?? false,
226
- fillHeight: section.FillHeight ?? false
227
- };
228
- return {
229
- id: sectionId,
230
- type: 'section',
231
- title: this.getSectionEditorTitle(section, sectionIndex),
232
- hostObject: sectionEditor
233
- };
234
- }
235
- else {
236
- return null;
237
- }
238
- }
239
- getSectionColumnByIdForEditor(sectionColumnId) {
240
- let currentColumn = null;
241
- // Get the section and column array by the pattern of the section column key.
242
- const sectionColumnPatternSeparator = this.getSectionColumnKey();
243
- const sectionColumnArr = sectionColumnId.split(sectionColumnPatternSeparator);
244
- if (sectionColumnArr.length === 2) {
245
- const layoutView = this._layoutViewSubject.getValue();
246
- const sections = layoutView?.Layout.Sections || [];
247
- // Get the section id to get the section index.
248
- const sectionId = sectionColumnArr[0];
249
- const sectionIndex = sections.findIndex(section => section.Key === sectionId);
250
- // Get the column index.
251
- const columnIndex = coerceNumberProperty(sectionColumnArr[1], -1);
252
- if (sectionIndex >= 0 && columnIndex >= 0) {
253
- currentColumn = sections[sectionIndex].Columns[columnIndex];
254
- }
255
- }
256
- return currentColumn;
257
- }
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
- // }
266
- getCssScreenWidh(screenType) {
267
- let widthToSet = '100%';
268
- if (screenType === 'Tablet') {
269
- widthToSet = '720';
270
- }
271
- else if (screenType === 'Phablet') {
272
- widthToSet = '360';
273
- }
274
- return widthToSet;
275
- }
276
- getBlockContainerByBlockKey(blockKey) {
277
- let blockContainerToFind = undefined;
278
- const layoutView = this._layoutViewSubject.getValue();
279
- const sections = layoutView?.Layout.Sections || [];
280
- for (let sectionIndex = 0; sectionIndex < sections.length; sectionIndex++) {
281
- const section = sections[sectionIndex];
282
- // Get the block container.
283
- const columnIndex = section.Columns.findIndex(column => column.BlockContainer?.BlockKey === blockKey);
284
- if (columnIndex > -1) {
285
- blockContainerToFind = section.Columns[columnIndex].BlockContainer;
286
- break;
287
- }
288
- }
289
- return blockContainerToFind;
290
- }
291
- changeCursorOnDragStart() {
292
- document.body.classList.add('inheritCursors');
293
- document.body.style.cursor = 'grabbing';
294
- }
295
- changeCursorOnDragEnd() {
296
- document.body.classList.remove('inheritCursors');
297
- document.body.style.cursor = 'unset';
298
- }
299
- /***********************************************************************************************/
300
- /* Public functions
301
- /***********************************************************************************************/
302
- setSectionsColumnsDropListChange(sectionsColumnsDropList) {
303
- this.notifySectionsColumnsDropListChange(sectionsColumnsDropList);
304
- }
305
- setLockScreen(value) {
306
- this.notifyLockScreen(value);
307
- }
308
- changePreviewMode(value) {
309
- this.notifyPreviewModeChange(value);
310
- }
311
- setAvailableBlocksToDrag(availableBlocksForDrag) {
312
- this._availableBlocksForDragMap.clear();
313
- availableBlocksForDrag.forEach(block => {
314
- this._availableBlocksForDragMap.set(block.data.key, block);
315
- });
316
- this.notifyAvailableBlocksForDragMapChange();
317
- }
318
- getScreenType(size) {
319
- const screenType = size < PepScreenSizeType.MD ? 'Landscape' :
320
- (size === PepScreenSizeType.MD || size === PepScreenSizeType.SM ? 'Tablet' : 'Phablet');
321
- return screenType;
322
- }
323
- getSectionColumnKey(sectionKey = '', index = '') {
324
- return `${sectionKey}_column_${index}`;
15
+ getCurrentScreenType() {
16
+ return this.layoutBuilderInternalService.getCurrentScreenType();
325
17
  }
326
18
  getIsHidden(hideIn, currentScreenType) {
327
19
  return (hideIn && hideIn?.length > 0) ? hideIn.some(hi => hi === currentScreenType) : false;
328
20
  }
329
- navigateToEditor(editorType, id) {
330
- let success = false;
331
- // Cannot navigate into 'layout-builder' because this is first and const in the editorsBreadCrumbs.
332
- if (editorType !== 'layout-builder' && id?.length > 0) {
333
- // Check which editor we have now
334
- const currentEditor = this._editorsBreadCrumb[this._editorsBreadCrumb.length - 1];
335
- // Only if it's another editor.
336
- if (currentEditor.id !== id) {
337
- if (currentEditor.type !== 'layout-builder') {
338
- // Always pop the last and insert the current.
339
- this._editorsBreadCrumb.pop();
340
- }
341
- let editor = this.getEditorByType(editorType, id);
342
- if (editor) {
343
- this._editorsBreadCrumb.push(editor);
344
- this.changeCurrentEditor();
345
- success = true;
346
- }
347
- else {
348
- success = false;
349
- }
350
- }
351
- }
352
- return success;
353
- }
354
- navigateBackFromEditor() {
355
- // Keep the layout builder editor.
356
- if (this._editorsBreadCrumb.length > 1) {
357
- // Maybe we want to compare the last editor for validation ?
358
- const lastEditor = this._editorsBreadCrumb.pop();
359
- this.changeCurrentEditor();
360
- }
361
- }
362
- updateLayoutFromEditor(editorData) {
363
- const layoutView = this._layoutViewSubject.getValue();
364
- if (layoutView) {
365
- layoutView.Layout.MaxWidth = editorData.maxWidth;
366
- layoutView.Layout.HorizontalSpacing = editorData.horizontalSpacing;
367
- layoutView.Layout.VerticalSpacing = editorData.verticalSpacing;
368
- layoutView.Layout.SectionsGap = editorData.sectionsGap;
369
- layoutView.Layout.ColumnsGap = editorData.columnsGap;
370
- // layoutView.layout.RoundedCorners = editorData.roundedCorners;
371
- // this.setSectionsColumnsGap(layoutView);
372
- this.notifyLayoutViewChange(layoutView);
373
- }
374
- }
375
- updateSectionFromEditor(sectionData) {
376
- const layoutView = this._layoutViewSubject.getValue();
377
- const sections = layoutView?.Layout.Sections || [];
378
- const sectionIndex = sections.findIndex(section => section.Key === sectionData.id);
379
- // Update section details.
380
- if (sectionIndex >= 0) {
381
- const blocksIdsToRemove = [];
382
- const currentSection = sections[sectionIndex];
383
- currentSection.Name = sectionData.sectionName;
384
- currentSection.Split = sectionData.split;
385
- currentSection.Height = sectionData.height;
386
- currentSection.CollapseOnTablet = sectionData.collapseOnTablet;
387
- currentSection.FillHeight = sectionData.fillHeight;
388
- // Get the new columns number from currentSection.Split, if its undefined put a default 1.
389
- const newColumnsLength = currentSection.Split?.split(' ').length || 1;
390
- if (newColumnsLength > currentSection.Columns.length) {
391
- while (newColumnsLength > currentSection.Columns.length) {
392
- currentSection.Columns.push({});
393
- }
394
- }
395
- else if (newColumnsLength < currentSection.Columns.length) {
396
- while (newColumnsLength < currentSection.Columns.length) {
397
- const colunm = currentSection.Columns.pop();
398
- // If there is block in this column delete it.
399
- if (colunm && colunm.BlockContainer) {
400
- blocksIdsToRemove.push(colunm.BlockContainer.BlockKey);
401
- }
402
- }
403
- }
404
- // Update editor title
405
- const currentEditor = this._editorSubject.getValue();
406
- if (currentEditor && currentEditor.type === 'section' && currentEditor.id === currentSection.Key) {
407
- const title = this.getSectionEditorTitle(currentSection, sectionIndex);
408
- currentEditor.title = title;
409
- this.notifyEditorChange(currentEditor);
410
- }
411
- // Update sections change.
412
- this.notifyLayoutViewChange(layoutView);
413
- // If there are blocks to remove, notify the blocks removed.
414
- if (blocksIdsToRemove.length > 0) {
415
- this.notifyBlocksRemoved(blocksIdsToRemove);
416
- }
417
- }
418
- }
419
- addSection(section = null) {
420
- // Create new section
421
- if (!section) {
422
- section = {
423
- Key: PepGuid.newGuid(),
424
- Columns: [{}],
425
- Hide: []
426
- };
427
- }
428
- // Add the new section to layout view.
429
- const layoutView = this._layoutViewSubject.getValue();
430
- const sections = layoutView?.Layout.Sections || [];
431
- sections.push(section);
432
- this.notifyLayoutViewChange(layoutView);
433
- }
434
- removeSection(sectionId) {
435
- const layoutView = this._layoutViewSubject.getValue();
436
- const sections = layoutView?.Layout.Sections || [];
437
- const index = sections.findIndex(section => section.Key === sectionId);
438
- if (index > -1) {
439
- // Get the blocks id's to remove.
440
- const blocksIdsToRemove = sections[index].Columns.map(column => column?.BlockContainer?.BlockKey);
441
- // Remove section.
442
- sections.splice(index, 1);
443
- this.notifyLayoutViewChange(layoutView);
444
- // If there are blocks to remove, notify the blocks removed.
445
- if (blocksIdsToRemove.length > 0) {
446
- this.notifyBlocksRemoved(blocksIdsToRemove);
447
- }
448
- }
449
- }
450
- hideSection(sectionId, hideIn) {
451
- const layoutView = this._layoutViewSubject.getValue();
452
- const sections = layoutView?.Layout.Sections || [];
453
- const index = sections.findIndex(section => section.Key === sectionId);
454
- if (index > -1) {
455
- sections[index].Hide = hideIn;
456
- this.notifyLayoutViewChange(layoutView);
457
- }
458
- }
459
- onSectionDropped(event) {
460
- const layoutView = this._layoutViewSubject.getValue();
461
- const sections = layoutView?.Layout.Sections || [];
462
- moveItemInArray(sections, event.previousIndex, event.currentIndex);
463
- this.notifyLayoutViewChange(layoutView);
464
- }
465
- onSectionDragStart(event) {
466
- this.changeCursorOnDragStart();
467
- this._draggingSectionKey.next(event.source.data);
468
- }
469
- onSectionDragEnd(event) {
470
- this.changeCursorOnDragEnd();
471
- this._draggingSectionKey.next('');
472
- }
473
- removeBlockFromSection(blockId) {
474
- let blockRemoved = false;
475
- // Remove the block from section column.
476
- const layoutView = this._layoutViewSubject.getValue();
477
- const sections = layoutView?.Layout.Sections || [];
478
- for (let sectionIndex = 0; sectionIndex < sections.length; sectionIndex++) {
479
- const section = sections[sectionIndex];
480
- // Remove the block container.
481
- const columnIndex = section.Columns.findIndex(column => column.BlockContainer?.BlockKey === blockId);
482
- if (columnIndex > -1) {
483
- delete section.Columns[columnIndex].BlockContainer;
484
- this.notifyLayoutViewChange(layoutView);
485
- blockRemoved = true;
486
- break;
487
- }
488
- }
489
- // If the block was removed, notify the block removed.
490
- if (blockRemoved) {
491
- this.notifyBlocksRemoved([blockId]);
492
- }
493
- }
494
- hideBlock(sectionId, blockId, hideIn) {
495
- const layoutView = this._layoutViewSubject.getValue();
496
- const sections = layoutView?.Layout.Sections || [];
497
- const index = sections.findIndex(section => section.Key === sectionId);
498
- if (index > -1) {
499
- const columnIndex = sections[index].Columns.findIndex(column => column.BlockContainer?.BlockKey === blockId);
500
- if (columnIndex > -1) {
501
- const blockContainer = sections[index].Columns[columnIndex].BlockContainer;
502
- if (blockContainer) {
503
- blockContainer.Hide = hideIn;
504
- this.notifyLayoutViewChange(layoutView);
505
- }
506
- }
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
- }
523
- onBlockDropped(event, sectionId) {
524
- const layoutView = this._layoutViewSubject.getValue();
525
- if (event.previousContainer.id === PepLayoutBuilderService.AVAILABLE_BLOCKS_CONTAINER_ID) {
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);
533
- }
534
- else {
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
- }
563
- }
564
- }
565
- else {
566
- // If the block moved between columns in the same section or between different sections but not in the same column.
567
- if (event.container.id !== event.previousContainer.id) {
568
- // Get the column.
569
- const currentColumn = this.getSectionColumnByIdForEditor(event.container.id);
570
- // Get the previous column.
571
- const previuosColumn = this.getSectionColumnByIdForEditor(event.previousContainer.id);
572
- if (currentColumn && previuosColumn) {
573
- currentColumn.BlockContainer = previuosColumn.BlockContainer;
574
- delete previuosColumn.BlockContainer;
575
- this.notifyLayoutViewChange(layoutView);
576
- }
577
- }
578
- }
579
- }
580
- onBlockDragStart(event) {
581
- this.changeCursorOnDragStart();
582
- // Take the block key if exist, else take the available block key (relation key).
583
- const blockKey = event.source.data?.BlockKey || event.source.data?.Key;
584
- this._draggingBlockKey.next(blockKey);
585
- }
586
- onBlockDragEnd(event) {
587
- this.changeCursorOnDragEnd();
588
- this._draggingBlockKey.next('');
589
- }
590
- doesColumnContainBlock(sectionId, columnIndex) {
591
- let res = false;
592
- const layoutView = this._layoutViewSubject.getValue();
593
- const section = layoutView?.Layout.Sections.find(section => section.Key === sectionId);
594
- if (section && columnIndex >= 0 && section.Columns.length > columnIndex) {
595
- res = !!section.Columns[columnIndex].BlockContainer;
596
- }
597
- return res;
598
- }
599
- setScreenWidth(screenType) {
600
- const value = this.getCssScreenWidh(screenType);
601
- let width = coerceNumberProperty(value, 0);
602
- if (width === 0) {
603
- this._screenWidthSubject.next('100%');
604
- this._screenSizeSubject.next(PepScreenSizeType.XL);
605
- }
606
- else {
607
- this._screenWidthSubject.next(`${width}px`);
608
- // Change the size according the width.
609
- if (width >= 1920) {
610
- this._screenSizeSubject.next(PepScreenSizeType.XL);
611
- }
612
- else if (width >= 1280 && width < 1920) {
613
- this._screenSizeSubject.next(PepScreenSizeType.LG);
614
- }
615
- else if (width >= 960 && width < 1280) {
616
- this._screenSizeSubject.next(PepScreenSizeType.MD);
617
- }
618
- else if (width >= 600 && width < 960) {
619
- this._screenSizeSubject.next(PepScreenSizeType.SM);
620
- }
621
- else if (width < 600) {
622
- this._screenSizeSubject.next(PepScreenSizeType.XS);
623
- }
624
- }
625
- }
626
21
  showSkeleton(show) {
627
- this._showSkeletonSubject.next(show);
628
- }
629
- loadLayoutBuilder(layoutView) {
630
- if (this.editMode) {
631
- // Load the layout editor.
632
- this.loadDefaultEditor(layoutView);
633
- // Set the columns gap of the sections.
634
- // this.setSectionsColumnsGap(layoutView);
635
- }
636
- // Load only the layout view.
637
- this.notifyLayoutViewChange(layoutView);
22
+ return this.layoutBuilderInternalService.showSkeleton(show);
638
23
  }
639
24
  }
640
- PepLayoutBuilderService.AVAILABLE_BLOCKS_CONTAINER_ID = 'availableBlocks';
641
- PepLayoutBuilderService.MAIN_EDITOR_ID = 'main';
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 });
25
+ PepLayoutBuilderService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: PepLayoutBuilderService, deps: [{ token: i1.LayoutBuilderInternalService }], target: i0.ɵɵFactoryTarget.Injectable });
643
26
  PepLayoutBuilderService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: PepLayoutBuilderService, providedIn: 'root' });
644
27
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: PepLayoutBuilderService, decorators: [{
645
28
  type: Injectable,
646
29
  args: [{
647
30
  providedIn: 'root',
648
31
  }]
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
32
+ }], ctorParameters: function () { return [{ type: i1.LayoutBuilderInternalService }]; } });
33
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF5b3V0LWJ1aWxkZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1jb21wb3NpdGUtbGliL2xheW91dC1idWlsZGVyL2xheW91dC1idWlsZGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7O0FBTzNDLE1BQU0sT0FBTyx1QkFBdUI7SUFTaEMsWUFDWSw0QkFBMEQ7UUFBMUQsaUNBQTRCLEdBQTVCLDRCQUE0QixDQUE4QjtRQUVsRSxFQUFFO0lBQ04sQ0FBQztJQVhELElBQUksUUFBUTtRQUNSLE9BQU8sSUFBSSxDQUFDLDRCQUE0QixDQUFDLFFBQVEsQ0FBQztJQUN0RCxDQUFDO0lBQ0QsSUFBSSxhQUFhO1FBQ2IsT0FBTyxJQUFJLENBQUMsNEJBQTRCLENBQUMsYUFBYSxDQUFDO0lBQzNELENBQUM7SUFRRCxvQkFBb0I7UUFDaEIsT0FBTyxJQUFJLENBQUMsNEJBQTRCLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztJQUNwRSxDQUFDO0lBRUQsV0FBVyxDQUFDLE1BQXdDLEVBQUUsaUJBQXFDO1FBQ3ZGLE9BQU8sQ0FBQyxNQUFNLElBQUksTUFBTSxFQUFFLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDaEcsQ0FBQztJQUVELFlBQVksQ0FBQyxJQUFhO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLDRCQUE0QixDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNoRSxDQUFDOztvSEF6QlEsdUJBQXVCO3dIQUF2Qix1QkFBdUIsY0FGcEIsTUFBTTsyRkFFVCx1QkFBdUI7a0JBSG5DLFVBQVU7bUJBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBEYXRhVmlld1NjcmVlblNpemUgfSBmcm9tIFwiQHBlcHBlcmktYWRkb25zL3BhcGktc2RrXCI7XG5pbXBvcnQgeyBMYXlvdXRCdWlsZGVySW50ZXJuYWxTZXJ2aWNlIH0gZnJvbSBcIi4vbGF5b3V0LWJ1aWxkZXItaW50ZXJuYWwuc2VydmljZVwiO1xuXG5ASW5qZWN0YWJsZSh7XG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBQZXBMYXlvdXRCdWlsZGVyU2VydmljZSB7XG4gICAgXG4gICAgZ2V0IGVkaXRNb2RlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5sYXlvdXRCdWlsZGVySW50ZXJuYWxTZXJ2aWNlLmVkaXRNb2RlO1xuICAgIH1cbiAgICBnZXQgZWRpdGFibGVTdGF0ZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGF5b3V0QnVpbGRlckludGVybmFsU2VydmljZS5lZGl0YWJsZVN0YXRlO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIGxheW91dEJ1aWxkZXJJbnRlcm5hbFNlcnZpY2U6IExheW91dEJ1aWxkZXJJbnRlcm5hbFNlcnZpY2VcbiAgICApIHtcbiAgICAgICAgLy9cbiAgICB9XG4gICAgXG4gICAgZ2V0Q3VycmVudFNjcmVlblR5cGUoKTogRGF0YVZpZXdTY3JlZW5TaXplIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGF5b3V0QnVpbGRlckludGVybmFsU2VydmljZS5nZXRDdXJyZW50U2NyZWVuVHlwZSgpO1xuICAgIH1cblxuICAgIGdldElzSGlkZGVuKGhpZGVJbjogRGF0YVZpZXdTY3JlZW5TaXplW10gfCB1bmRlZmluZWQsIGN1cnJlbnRTY3JlZW5UeXBlOiBEYXRhVmlld1NjcmVlblNpemUpIHtcbiAgICAgICAgcmV0dXJuIChoaWRlSW4gJiYgaGlkZUluPy5sZW5ndGggPiAwKSA/IGhpZGVJbi5zb21lKGhpID0+IGhpID09PSBjdXJyZW50U2NyZWVuVHlwZSkgOiBmYWxzZTtcbiAgICB9XG4gICAgXG4gICAgc2hvd1NrZWxldG9uKHNob3c6IGJvb2xlYW4pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGF5b3V0QnVpbGRlckludGVybmFsU2VydmljZS5zaG93U2tlbGV0b24oc2hvdyk7XG4gICAgfVxufVxuIl19