qms-angular 1.1.46 → 1.1.47

Sign up to get free protection for your applications and to get access to all the features.
Files changed (32) hide show
  1. package/bundles/qms-angular.umd.js +1676 -19
  2. package/bundles/qms-angular.umd.js.map +1 -1
  3. package/esm2015/lib/components/select-process-data/index.js +2 -0
  4. package/esm2015/lib/components/select-process-data/public-api.js +3 -0
  5. package/esm2015/lib/components/select-process-data/select-process-data.component.js +275 -0
  6. package/esm2015/lib/components/select-process-data/select-process-data.module.js +64 -0
  7. package/esm2015/lib/components/select-process-data-tree/index.js +2 -0
  8. package/esm2015/lib/components/select-process-data-tree/public-api.js +3 -0
  9. package/esm2015/lib/components/select-process-data-tree/select-process-data-tree.component.js +1134 -0
  10. package/esm2015/lib/components/select-process-data-tree/select-process-data-tree.module.js +64 -0
  11. package/esm2015/lib/qms-ckeditor-components/components/qms-ckeditor-imagemap/qms-ckeditor-imagemap.component.js +4 -3
  12. package/esm2015/lib/qms-ckeditor-components/models/qms-ckeditor-imagemap.model.js +1 -1
  13. package/esm2015/lib/qms-ckeditor-components/qms-ckeditor.component.js +2 -1
  14. package/esm2015/lib/qms-ckeditor-components/services/qms-ckeditor-bpmn.service.js +3 -3
  15. package/esm2015/public-api.js +3 -1
  16. package/fesm2015/qms-angular.js +1481 -20
  17. package/fesm2015/qms-angular.js.map +1 -1
  18. package/lib/components/select-process-data/index.d.ts +1 -0
  19. package/lib/components/select-process-data/public-api.d.ts +2 -0
  20. package/lib/components/select-process-data/select-process-data.component.d.ts +120 -0
  21. package/lib/components/select-process-data/select-process-data.module.d.ts +2 -0
  22. package/lib/components/select-process-data-tree/index.d.ts +1 -0
  23. package/lib/components/select-process-data-tree/public-api.d.ts +2 -0
  24. package/lib/components/select-process-data-tree/select-process-data-tree.component.d.ts +196 -0
  25. package/lib/components/select-process-data-tree/select-process-data-tree.module.d.ts +2 -0
  26. package/lib/qms-ckeditor-components/models/qms-ckeditor-imagemap.model.d.ts +1 -0
  27. package/package.json +1 -1
  28. package/public-api.d.ts +2 -0
  29. package/qms-angular.metadata.json +1 -1
  30. package/src/assets/jointjs/scss/rappid.scss +12 -1
  31. package/src/lib/components/select-process-data/select-process-data.component.scss +241 -0
  32. package/src/lib/components/select-process-data-tree/select-process-data-tree.component.scss +634 -0
@@ -0,0 +1,1134 @@
1
+ import { __awaiter } from "tslib";
2
+ import { SelectionModel } from '@angular/cdk/collections';
3
+ import { Overlay } from '@angular/cdk/overlay';
4
+ import { CdkVirtualScrollViewport } from '@angular/cdk/scrolling';
5
+ import { FlatTreeControl } from '@angular/cdk/tree';
6
+ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EventEmitter, Input, Output, ViewChild, ViewContainerRef } from '@angular/core';
7
+ import { FormControl } from '@angular/forms';
8
+ import { MatIconRegistry } from '@angular/material/icon';
9
+ import { MatTreeFlatDataSource, MatTreeFlattener } from '@angular/material/tree';
10
+ import { DomSanitizer } from '@angular/platform-browser';
11
+ import * as _ from 'lodash';
12
+ import { BehaviorSubject, merge, of, Subject, timer } from 'rxjs';
13
+ import { delay, filter, map, pairwise, switchMap, takeUntil, tap, throttleTime } from 'rxjs/operators';
14
+ import { QMSFlatNodeTree } from '../../common/models/qms-flat-node.model';
15
+ import { TranslateLibraryService } from '../../services/translation-registry.service';
16
+ import { QMSIconRegistryService } from '../app-icon/icon-registry.service';
17
+ import { PaginationSize } from '../qms-paginator';
18
+ import { ItemIconType } from '../related/common/item-icon-type.enum';
19
+ import { AnimationTreeDepartment, ModeDepartmentTreeeViewEnum, QMSDepartmentPagingModel, QMSSelectDepartmentTreeConfig, QMSSelectDepartmentTreeGlobalService } from '../select-department-tree';
20
+ export class SelectProcessDataTreeComponent {
21
+ constructor(cdRef, domSanitizer, appIconService, iconRegistry, eleRef, trans, overlay, viewContainerRef, treeDepartmentService) {
22
+ this.cdRef = cdRef;
23
+ this.domSanitizer = domSanitizer;
24
+ this.appIconService = appIconService;
25
+ this.iconRegistry = iconRegistry;
26
+ this.eleRef = eleRef;
27
+ this.trans = trans;
28
+ this.overlay = overlay;
29
+ this.viewContainerRef = viewContainerRef;
30
+ this.treeDepartmentService = treeDepartmentService;
31
+ this.spinnerArr = new Array(12).fill(0);
32
+ this.arrSkeleton = new Array(6).fill(0);
33
+ this.height = '50vh';
34
+ this.config = new QMSSelectDepartmentTreeConfig();
35
+ this.isIncludeChildren = false;
36
+ this.onSearchEvent = new EventEmitter();
37
+ this.onPagingSearchEvent = new EventEmitter();
38
+ this.onValueChangeEvent = new EventEmitter();
39
+ this.selectionNodeChangeEvent = new EventEmitter();
40
+ this.onCheckNodeEvent = new EventEmitter();
41
+ this.onExpandNodeEvent = new EventEmitter();
42
+ this.onLoadMoreEvent = new EventEmitter();
43
+ this.onCheckItemSearchEvent = new EventEmitter();
44
+ this.onCheckAllItemSearchEvent = new EventEmitter();
45
+ this.toggleIncludeChildEvent = new EventEmitter();
46
+ this.MODE_VIEW_ENUM = ModeDepartmentTreeeViewEnum;
47
+ this.ITEM_SIZE = 50;
48
+ this.ngUnsubscribe = new Subject();
49
+ this.resultSearchSelected = [];
50
+ this.resultSelected = [];
51
+ this.getDataTree$ = new BehaviorSubject([]);
52
+ this.searchDepartment$ = new BehaviorSubject(new QMSDepartmentPagingModel());
53
+ this.resultSearch = [];
54
+ this.getIndexView$ = new BehaviorSubject(0);
55
+ this.scrollToNodeEvent$ = new Subject();
56
+ this.getActiveNodeEvent$ = new Subject();
57
+ this.activeNode = '';
58
+ this.PAGINATION_SIZE = PaginationSize;
59
+ this.PAGE_SIZE_OPTION = [5, 10, 15, 20, 25, 100];
60
+ this.CURRENT_PAGESIZE = 10;
61
+ this.nestedTreeNodeMap = new Map();
62
+ this.flatTreeNodeMap = new Map();
63
+ this.checkListSelection = new SelectionModel(true);
64
+ this.checkListSelectionSearch = new SelectionModel(true);
65
+ this._selectedList = [];
66
+ this.selectedListAfterDataNodeChange$ = new Subject();
67
+ this.formSearchControl = new FormControl('');
68
+ this.getLoading$ = new BehaviorSubject(false);
69
+ this.getLoadingMore$ = new BehaviorSubject(true);
70
+ this.untilDestroyLoadMore$ = new Subject();
71
+ this.onBeforeInitNodeSelected$ = new Subject();
72
+ this.textSearchSubject$ = new BehaviorSubject('');
73
+ this.itemIconType = ItemIconType;
74
+ this._transformer = (node, level) => {
75
+ const flatNode = this.convertToFlatNode(node) || new QMSFlatNodeTree();
76
+ flatNode.id = node.id;
77
+ flatNode.name = node.name;
78
+ flatNode.expandable = (node.children && node.children.length > 0) || (!!node.childCount) || node.expandable;
79
+ flatNode.level = level;
80
+ flatNode.parentId = node.parentId;
81
+ flatNode.markedGetChildren = node.children.length > 0;
82
+ flatNode.itemIcon = node.itemIcon;
83
+ flatNode.itemIconSvg = node.itemIconSvg;
84
+ flatNode.isFile = node.isFile;
85
+ flatNode.disabled = node.disabled;
86
+ flatNode.isGroup = node.isGroup;
87
+ flatNode.groupId = node.groupId;
88
+ flatNode.externalName = node.externalName;
89
+ flatNode.childCount = node.childCount;
90
+ flatNode.selectedChildCount = node.selectedChildCount;
91
+ flatNode.markedGetChildCountRecurrsive = node.markedGetChildCountRecurrsive;
92
+ flatNode.isIncludeChildWhenChecked = node.isIncludeChildWhenChecked;
93
+ this.flatTreeNodeMap.set(flatNode, node);
94
+ this.nestedTreeNodeMap.set(node, flatNode);
95
+ return flatNode;
96
+ };
97
+ this.getLevel = (node) => node === null || node === void 0 ? void 0 : node.level;
98
+ this._getChild = (node) => node.children;
99
+ this.isExpandable = (node) => node.expandable;
100
+ this.hasChild = (_, node) => node.expandable;
101
+ this._handlingLazyObject = {
102
+ checkAllSearch: false,
103
+ checkItemSearch: false,
104
+ checkNode: false,
105
+ expand: false
106
+ };
107
+ // Init tree data
108
+ this.getDataTree$
109
+ .pipe(takeUntil(this.ngUnsubscribe))
110
+ .subscribe(data => {
111
+ if (!this.dataSource)
112
+ return;
113
+ this.dataSource.data = data;
114
+ this.cdRef.detectChanges();
115
+ });
116
+ // Register icon
117
+ appIconService.registerProcessIcon(iconRegistry, domSanitizer);
118
+ appIconService.registerProcessAreaIcon(iconRegistry, domSanitizer);
119
+ appIconService.registerDocumentIcon(iconRegistry, domSanitizer);
120
+ appIconService.registerFolderIcon(iconRegistry, domSanitizer);
121
+ appIconService.registerDeviationIcon(iconRegistry, domSanitizer);
122
+ appIconService.registerChecklistIcon(iconRegistry, domSanitizer);
123
+ appIconService.registerRiskIcon(iconRegistry, domSanitizer);
124
+ this.trans.getLanguageSubject$.pipe(takeUntil(this.ngUnsubscribe)).subscribe((res) => {
125
+ if (res) {
126
+ this.LANG = this.trans.getObjectLang(res);
127
+ }
128
+ });
129
+ this._handleSearchEvent();
130
+ this._handleActiveNodeEvent();
131
+ this._handleItemSelectionChanged();
132
+ this.getLoading$.pipe(takeUntil(this.ngUnsubscribe), tap(res => {
133
+ res ? this.formSearchControl.disable() : this.formSearchControl.enable();
134
+ })).subscribe();
135
+ }
136
+ set rowsSkeleton(value) {
137
+ this.arrSkeleton = new Array(value).fill(0);
138
+ }
139
+ get departmentRoots() {
140
+ if (!this.treeControl)
141
+ return;
142
+ return this.treeControl.dataNodes.filter(node => node.level === 0);
143
+ }
144
+ get isAllDepartmentSelected() {
145
+ return !!this.treeControl && this.treeControl.dataNodes.every(node => this.isSelectedNode(node));
146
+ }
147
+ get isIndeterminateCheckboxAllTree() {
148
+ return !this.isAllDepartmentSelected && this.checkListSelection.selected.length > 0;
149
+ }
150
+ get currentTreeData() {
151
+ return this.getDataTree$.getValue();
152
+ }
153
+ get isSelectAllResultSearch() {
154
+ return this.resultSearch.length && this.resultSearch.every(x => this.checkListSelectionSearch.isSelected(x));
155
+ }
156
+ get indeterminateSearchResult() {
157
+ return !this.isSelectAllResultSearch && !!this.resultSearch.length && this.resultSearch.some(x => this.checkListSelectionSearch.isSelected(x));
158
+ }
159
+ ngAfterContentInit() {
160
+ this.getLoadingMore$.next(false);
161
+ this.cdRef.detectChanges();
162
+ }
163
+ ngAfterViewInit() {
164
+ this.getIndexView$.pipe(takeUntil(merge(this.ngUnsubscribe, this.untilDestroyLoadMore$)), tap(_ => this.getLoadingMore$.next(this.config.lazy)), delay(700), tap(value => {
165
+ this.getLoadingMore$.next(false);
166
+ if (value === 0)
167
+ this.cdkVirtualScrollViewport &&
168
+ this.cdkVirtualScrollViewport.scrolledIndexChange
169
+ .pipe(takeUntil(this.untilDestroyLoadMore$), map(_ => this.cdkVirtualScrollViewport.measureScrollOffset('bottom')), pairwise(), filter(([x1, x2]) => x1 > x2 && x2 < 140), throttleTime(200), tap(_ => {
170
+ if (this.getLoadingMore$.value)
171
+ return;
172
+ if (!this.config.lazy) {
173
+ this.onDestroyLoadMore();
174
+ return;
175
+ }
176
+ this.onLoadMoreEvent.emit();
177
+ this.getLoadingMore$.next(true);
178
+ }))
179
+ .subscribe();
180
+ })).subscribe();
181
+ this.onBeforeInitNodeSelected$.pipe(takeUntil(this.ngUnsubscribe), tap(_ => {
182
+ this._handleListSelected();
183
+ this.getLoadingMore$.next(false);
184
+ })).subscribe();
185
+ this.cdRef.detectChanges();
186
+ }
187
+ ngOnInit() {
188
+ this.isIncludeChildren = this.config.isIncludeChildren;
189
+ this._initTreeData();
190
+ if (!this.config.lazy) {
191
+ this._handleListSelected();
192
+ return;
193
+ }
194
+ //action for lazy config
195
+ this._initListSelected();
196
+ this._handleAfterDataNodeChangeEvent();
197
+ this.selectedListAfterDataNodeChange$.next(this.treeControl.dataNodes);
198
+ }
199
+ ngOnDestroy() {
200
+ this.ngUnsubscribe.next();
201
+ this.ngUnsubscribe.complete();
202
+ }
203
+ onDestroyLoadMore() {
204
+ this.untilDestroyLoadMore$.next();
205
+ this.untilDestroyLoadMore$.complete();
206
+ }
207
+ _initTreeData() {
208
+ this.treeControl = new FlatTreeControl(this.getLevel, this.isExpandable);
209
+ this.treeFlattener = new MatTreeFlattener(this._transformer, this.getLevel, this.isExpandable, this._getChild);
210
+ this.dataSource = new MatTreeFlatDataSource(this.treeControl, this.treeFlattener);
211
+ const _treeDataInput = _.cloneDeep(this.config.treeData);
212
+ if (!_treeDataInput.length)
213
+ return;
214
+ const treeData = this.treeDepartmentService.convertToTreeData(_treeDataInput);
215
+ this.updateDataTree(treeData);
216
+ this.getLoading$.next(false);
217
+ }
218
+ _handleListSelected() {
219
+ if (!this.config.selectedList.length)
220
+ return;
221
+ const selectedList = this.config.selectedList.sort((x, y) => x.isGroup ? -1 : y.isGroup ? 1 : 0);
222
+ for (let i = 0; i < selectedList.length; i++) {
223
+ const item = selectedList[i];
224
+ const node = this.getNodeById(item.id);
225
+ if (node) {
226
+ const nestedNode = this.convertToNestedNode(node);
227
+ nestedNode.isGroup = item.isGroup;
228
+ nestedNode.groupId = item.groupId;
229
+ this.checkListSelection.select(node);
230
+ this.handleCheckNode(node);
231
+ this.onExpandAllParent(node);
232
+ }
233
+ }
234
+ this.cdRef.detectChanges();
235
+ }
236
+ _initListSelected() {
237
+ this._selectedList = this.treeDepartmentService.convertToTreeData(this.config.selectedList);
238
+ //Convert array selectedList into nested array as 1 level form
239
+ const indexRemove = [];
240
+ for (let i = 0; i < this._selectedList.length; i++) {
241
+ const item = this._selectedList[i];
242
+ const result = this.treeDepartmentService.getDescendantsOfNode(item);
243
+ item.children = result;
244
+ const index = this._selectedList.findIndex(x => result.some(x1 => x1.id === x.id));
245
+ if (index < 0)
246
+ continue;
247
+ indexRemove.push(index);
248
+ }
249
+ this._selectedList = this._selectedList.filter((_, index) => !indexRemove.includes(index));
250
+ this.resultSelected.push(...this._selectedList);
251
+ this.onValueChangeEvent.emit(this.resultSelected);
252
+ }
253
+ // handle selected list when data nodes change
254
+ _handleAfterDataNodeChangeEvent() {
255
+ if (this.config.lazy) {
256
+ this.selectedListAfterDataNodeChange$
257
+ .pipe(takeUntil(this.ngUnsubscribe), tap(data => {
258
+ if (!this._selectedList.length)
259
+ return;
260
+ this._selectedList.forEach(item => {
261
+ if (!item.parentId) {
262
+ const node = this.getNodeById(item.id);
263
+ if (node)
264
+ item.parentId = node.parentId;
265
+ }
266
+ });
267
+ for (let i = 0; i < data.length; i++) {
268
+ const element = data[i];
269
+ const item = this._selectedList.find(x => { var _a; return x.id === element.id || ((_a = x.children) === null || _a === void 0 ? void 0 : _a.some(x1 => x1.id === element.id)); });
270
+ if (!!item) {
271
+ const node = this.getNodeById(item.id);
272
+ if (!node)
273
+ continue;
274
+ const nestedNode = this.convertToNestedNode(node);
275
+ nestedNode.isGroup = item.isGroup;
276
+ nestedNode.groupId = item.groupId;
277
+ this.checkListSelection.select(node);
278
+ const descendants = this.getListChildrenOfNode(node);
279
+ if (node.markedGetChildren) {
280
+ if (!item.children.length)
281
+ continue;
282
+ const itemSelect = descendants.filter(x => item.children.map(x1 => x1.id).includes(x.id));
283
+ if (!itemSelect.length)
284
+ continue;
285
+ itemSelect.forEach(_item => {
286
+ const _nestedNode = this.convertToNestedNode(_item);
287
+ _nestedNode.groupId = item.children[0].groupId;
288
+ _nestedNode.isGroup = false;
289
+ });
290
+ this.checkListSelection.select(...itemSelect);
291
+ }
292
+ }
293
+ }
294
+ }))
295
+ .subscribe();
296
+ }
297
+ }
298
+ /**
299
+ * This method use for lazy mode, do some thing before init list node selected
300
+ * @param callback
301
+ * @returns
302
+ */
303
+ onBeforeInitNodeSelected(callback) {
304
+ return __awaiter(this, void 0, void 0, function* () {
305
+ if (!this.config.lazy)
306
+ return;
307
+ this.getLoadingMore$.next(true);
308
+ if (!!callback)
309
+ yield callback();
310
+ this.onBeforeInitNodeSelected$.next();
311
+ });
312
+ }
313
+ //Handle item selection changed
314
+ _handleItemSelectionChanged() {
315
+ this.checkListSelection.changed
316
+ .pipe(takeUntil(this.ngUnsubscribe))
317
+ .subscribe(({ added, removed }) => {
318
+ const checkExistInResult = (node) => this.resultSelected.findIndex(x => x.id === node.id) > -1;
319
+ if (added.length) {
320
+ added.forEach(node => {
321
+ const nestedNode = _.cloneDeep(this.convertToNestedNode(node));
322
+ nestedNode.children = [];
323
+ if (!this.config.lazy)
324
+ nestedNode.childCount = this.getListChildrenOfNode(node).length;
325
+ const existGroup = _.cloneDeep(this.getAllParentNode(node)
326
+ .map(item => this.convertToNestedNode(item))
327
+ .reverse()
328
+ .find(x => x.isGroup));
329
+ if (!!existGroup) {
330
+ const flatExistGroup = this.getNodeById(existGroup.id);
331
+ nestedNode.groupId = existGroup.id;
332
+ const groupResult = this.resultSelected.find(x => x.id === existGroup.id);
333
+ if (groupResult && !groupResult.children.some(x => x.id === nestedNode.id)) {
334
+ groupResult.isGroup = existGroup.isGroup;
335
+ groupResult.children.push(nestedNode);
336
+ }
337
+ this._onSelectionNodeChangeEvent('updated', [groupResult]);
338
+ // re-filter result selected
339
+ this.resultSelected = this.resultSelected.filter(item => !this.getListChildrenOfNode(flatExistGroup).map(x => x.id).includes(item.id));
340
+ return;
341
+ }
342
+ if (checkExistInResult(node))
343
+ return;
344
+ this.resultSelected.push(nestedNode);
345
+ this._onSelectionNodeChangeEvent('added', [nestedNode]);
346
+ });
347
+ }
348
+ if (removed.length) {
349
+ removed.forEach(node => {
350
+ const nestedNode = this.convertToNestedNode(node);
351
+ const children = this.getListChildrenOfNode(node);
352
+ if (nestedNode.isGroup) {
353
+ const _item = this.resultSelected.find(x => x.id === node.id);
354
+ if (!_item)
355
+ return;
356
+ children.forEach(item => item.groupId = null);
357
+ this.resultSelected.splice(this.resultSelected.indexOf(_item), 1);
358
+ this._onSelectionNodeChangeEvent('removed', [_item]);
359
+ return;
360
+ }
361
+ const group = this.resultSelected.find(x => x.id === nestedNode.groupId);
362
+ if (!group) {
363
+ const _item = this.resultSelected.find(x => x.id === node.id);
364
+ if (!_item)
365
+ return;
366
+ this.resultSelected.splice(this.resultSelected.indexOf(_item), 1);
367
+ this._onSelectionNodeChangeEvent('removed', [_item]);
368
+ return;
369
+ }
370
+ const childNodes = this.getListChildrenOfNode(node).concat(node);
371
+ for (let i = 0; i < childNodes.length; i++) {
372
+ const item = childNodes[i];
373
+ const _node = this.getNodeById(item.id);
374
+ if (group.children.some(x => x.id === _node.id) && !this.isSelectedNode(_node)) {
375
+ const _item = group.children.find(x => x.id === item.id);
376
+ if (!_item)
377
+ return;
378
+ group.children.splice(group.children.indexOf(_item), 1);
379
+ this._onSelectionNodeChangeEvent('updated', [group]);
380
+ }
381
+ }
382
+ });
383
+ }
384
+ this._mapToResultSearch();
385
+ this.onValueChangeEvent.emit(this.resultSelected);
386
+ });
387
+ }
388
+ _onSelectionNodeChangeEvent(state, data) {
389
+ switch (state) {
390
+ case 'removed':
391
+ this.selectionNodeChangeEvent.emit({
392
+ removed: data,
393
+ added: [],
394
+ updated: [],
395
+ source: new SelectionModel(true, this.resultSelected)
396
+ });
397
+ break;
398
+ case 'updated':
399
+ this.selectionNodeChangeEvent.emit({
400
+ removed: [],
401
+ added: [],
402
+ updated: data,
403
+ source: new SelectionModel(true, this.resultSelected)
404
+ });
405
+ break;
406
+ case 'added':
407
+ this.selectionNodeChangeEvent.emit({
408
+ removed: [],
409
+ added: data,
410
+ updated: [],
411
+ source: new SelectionModel(true, this.resultSelected)
412
+ });
413
+ break;
414
+ default:
415
+ return;
416
+ }
417
+ }
418
+ _handleSearchEvent() {
419
+ this.searchDepartment$
420
+ .pipe(takeUntil(this.ngUnsubscribe))
421
+ .subscribe(result => {
422
+ this.resultSearch = [];
423
+ this.CURRENT_PAGESIZE = result.pageSize;
424
+ this.getLoading$.next(false);
425
+ if (result && result.length) {
426
+ result.data.forEach(item => {
427
+ var _a;
428
+ const node = this.getNodeById(item.id);
429
+ let location = [];
430
+ if (this.config.lazy) {
431
+ location = ((_a = item.path) === null || _a === void 0 ? void 0 : _a.map(x => ({ name: x }))) || [];
432
+ }
433
+ else {
434
+ const parents = node ? this.getAllParentNode(node) : [];
435
+ location = parents.length ? parents.map((x) => ({
436
+ id: x.id,
437
+ name: x.name,
438
+ })).reverse() : [];
439
+ }
440
+ this.resultSearch.push(Object.assign(Object.assign({}, item), { disabled: !this.config.lazy && this.config.checkSearchMappingTree && !node, location: [
441
+ ...location,
442
+ {
443
+ id: item.id,
444
+ name: item.name,
445
+ }
446
+ ], isLoading: false }));
447
+ });
448
+ this.textSearchSubject$.next(this.formSearchControl.value);
449
+ if (this.config.clearCheckListSelectionSearchWhenHandle)
450
+ this.checkListSelectionSearch.clear();
451
+ this._mapToResultSearch();
452
+ this.setIndexView(1);
453
+ }
454
+ });
455
+ }
456
+ _handleActiveNodeEvent() {
457
+ this.scrollToNodeEvent$.pipe(takeUntil(this.ngUnsubscribe), switchMap((val) => {
458
+ const delayTiming = this.getIndexView$.value === 1 ? 700 : 0;
459
+ this.setIndexView(0);
460
+ return of(val).pipe(delay(delayTiming), takeUntil(this.ngUnsubscribe));
461
+ }))
462
+ .subscribe(res => {
463
+ this.onScrollIntoNode(res);
464
+ });
465
+ this.getActiveNodeEvent$.pipe(takeUntil(this.ngUnsubscribe), switchMap(val => {
466
+ this.activeNode = val;
467
+ return timer(1500);
468
+ }))
469
+ .subscribe(_ => {
470
+ this.activeNode = '';
471
+ });
472
+ }
473
+ updateDataTree(data) {
474
+ this.getDataTree$.next(data);
475
+ }
476
+ setLoadingStateNode(isLoading, nodeId) {
477
+ const node = this.getNodeById(nodeId);
478
+ if (!node)
479
+ return;
480
+ node.isLoading = isLoading;
481
+ this.checkLoadingOfParent(node);
482
+ }
483
+ onExpandNode(node) {
484
+ if (!(node === null || node === void 0 ? void 0 : node.expandable))
485
+ return;
486
+ this.treeControl.toggle(node);
487
+ if (this.config.lazy && this.treeControl.isExpanded(node) && !node.markedGetChildren) {
488
+ node.isLoading = true;
489
+ this.checkLoadingOfParent(node);
490
+ }
491
+ this.onExpandNodeEvent.emit(node);
492
+ }
493
+ onOptionSearchSelected(value) {
494
+ const flatNode = this.getNodeById(value.id);
495
+ if (!flatNode)
496
+ return;
497
+ this.checkListSelection.select(flatNode);
498
+ this.handleCheckNode(flatNode);
499
+ this.onScrollIntoNode(flatNode.id);
500
+ }
501
+ onCheckAllRootTreeNode() {
502
+ if (this.config.isSelectOne || !this.config.activeSelectAllNode)
503
+ return;
504
+ if (this.isAllDepartmentSelected) {
505
+ this.treeControl.dataNodes.forEach(node => {
506
+ const nestedNode = this.convertToNestedNode(node);
507
+ nestedNode.isGroup = false;
508
+ });
509
+ this.checkListSelection.deselect(...this.treeControl.dataNodes);
510
+ return;
511
+ }
512
+ ;
513
+ this.departmentRoots.forEach(node => {
514
+ if (!this.isIncludeChildren) {
515
+ this.treeControl.dataNodes.filter(x => !this.isSelectedNode(x))
516
+ .forEach(x => this.onCheckNode(x));
517
+ return;
518
+ }
519
+ if (!this.isSelectedNode(node)) {
520
+ this.onCheckNode(node);
521
+ return;
522
+ }
523
+ const nestedNode = this.convertToNestedNode(node);
524
+ if (nestedNode.isGroup && this.isCheckAll(node) || !node.expandable)
525
+ return;
526
+ this.getListChildrenOfNode(node)
527
+ .filter(item => !this.isSelectedNode(item))
528
+ .forEach(item => !this.isSelectedNode(item) && this.onCheckNode(item));
529
+ if (!nestedNode.isGroup) {
530
+ this.checkListSelection.deselect(node);
531
+ this.onCheckNode(node);
532
+ return;
533
+ }
534
+ });
535
+ }
536
+ onCheckNode(node, fireEventCheckNode = true) {
537
+ if (!node)
538
+ return;
539
+ if (fireEventCheckNode)
540
+ this.onCheckNodeEvent.emit(node);
541
+ this.checkListSelection.toggle(node);
542
+ if (this.config.isSelectOne) {
543
+ this._handleSelectOne(node.id);
544
+ return;
545
+ }
546
+ if (this.config.lazy && node.expandable && !node.markedGetChildren && fireEventCheckNode) {
547
+ if (!this._handlingLazyObject.checkNode) {
548
+ this.handleCheckNode(node);
549
+ return;
550
+ }
551
+ node.isLoading = this.isIncludeChildren;
552
+ const children = this.getListChildrenOfNode(node).filter(x => x.expandable && !x.markedGetChildren);
553
+ children.forEach(x => x.isLoading = this.isIncludeChildren);
554
+ return;
555
+ }
556
+ this.handleCheckNode(node);
557
+ }
558
+ _handleSelectOne(nodeId) {
559
+ const nodeTree = this.treeControl.dataNodes.find(node => node.id === nodeId);
560
+ const reSelectSelection = (...params) => {
561
+ params.forEach(selection => {
562
+ const selected = selection.selected.filter(x => x.id !== nodeId);
563
+ selection.deselect(...selected);
564
+ });
565
+ };
566
+ if (!nodeTree) {
567
+ const item = this.checkListSelectionSearch.selected.find(x => x.id === nodeId);
568
+ if (!item)
569
+ return;
570
+ this.resultSelected = [{
571
+ id: item.id,
572
+ parentId: item.parentId,
573
+ name: item.name,
574
+ externalName: item.externalName,
575
+ children: []
576
+ }];
577
+ this._selectedList = [...this.resultSelected];
578
+ this.onValueChangeEvent.emit(this.resultSelected);
579
+ reSelectSelection(this.checkListSelection, this.checkListSelectionSearch);
580
+ this.cdRef.detectChanges();
581
+ return;
582
+ }
583
+ if (this.isSelectedNode(nodeTree)) {
584
+ const nestedNode = this.convertToNestedNode(this.checkListSelection.selected[0]);
585
+ this._selectedList = [...this.resultSelected];
586
+ reSelectSelection(this.checkListSelection, this.checkListSelectionSearch);
587
+ return;
588
+ }
589
+ this.resultSelected = [];
590
+ this._selectedList = [];
591
+ }
592
+ onExpandAllParent(node) {
593
+ const parents = this.getAllParentNode(node);
594
+ if (parents === null || parents === void 0 ? void 0 : parents.length) {
595
+ parents.forEach(parent => {
596
+ if (!this.treeControl.isExpanded(parent))
597
+ this.onExpandNode(parent);
598
+ });
599
+ }
600
+ }
601
+ onRemoveNode(nodeId) {
602
+ const flatNode = this.getNodeById(nodeId);
603
+ if (!flatNode) {
604
+ const item = this._selectedList.find(x => x.id === nodeId);
605
+ if (!item)
606
+ return;
607
+ this._updateSelectedList('remove', item, this._selectedList, this.resultSelected);
608
+ this.cdRef.detectChanges();
609
+ return;
610
+ }
611
+ this.checkListSelection.deselect(flatNode);
612
+ this.handleCheckNode(flatNode);
613
+ }
614
+ onSelectNode(...nodeIds) {
615
+ const nodes = this.treeControl.dataNodes.filter(x => nodeIds.includes(x.id));
616
+ if (!nodes.length)
617
+ return;
618
+ this.checkListSelection.select(...nodes);
619
+ }
620
+ onDeselectNode(...nodeIds) {
621
+ const nodes = this.treeControl.dataNodes.filter(x => nodeIds.includes(x.id));
622
+ if (!nodes.length)
623
+ return;
624
+ this.checkListSelection.deselect(...nodes);
625
+ }
626
+ /**
627
+ * Toggles a value between selected and deselected.
628
+ * @param nodeId :id of node
629
+ */
630
+ onToggleNode(nodeId) {
631
+ const node = this.getNodeById(nodeId);
632
+ if (!node)
633
+ return;
634
+ this.checkListSelection.toggle(node);
635
+ }
636
+ isIndeterminate(node) {
637
+ const childSelected = this.getListChildrenOfNode(node).filter(item => this.isSelectedNode(item));
638
+ return (!!childSelected.length && !this.isSelectedNode(node));
639
+ }
640
+ isCheckAll(node) {
641
+ const listCheck = [...this.getListChildrenOfNode(node), node];
642
+ return listCheck.every(item => this.isSelectedNode(item));
643
+ }
644
+ /**
645
+ * This function handle check node of tree
646
+ * @param node node of tree
647
+ * @param callback do something before handle check node
648
+ * @returns
649
+ */
650
+ onBeforeCheckNode(node, callback) {
651
+ return __awaiter(this, void 0, void 0, function* () {
652
+ this._handlingLazyObject.checkNode = true;
653
+ if (!!callback)
654
+ yield callback(node);
655
+ this.handleCheckNode(node);
656
+ this._handlingLazyObject.checkNode = false;
657
+ });
658
+ }
659
+ handleCheckNode(node) {
660
+ const isSelected = this.isSelectedNode(node);
661
+ const childSelected = this.getChildrenSelected(node);
662
+ const nestedNode = this.convertToNestedNode(node);
663
+ if (isSelected) {
664
+ // Check existed group
665
+ const existedGroup = this.getAllParentNode(node).find(x => this.convertToNestedNode(x).isGroup);
666
+ if (!this.isIncludeChildren) {
667
+ nestedNode.groupId = existedGroup === null || existedGroup === void 0 ? void 0 : existedGroup.id;
668
+ return;
669
+ }
670
+ const children = this.getListChildrenOfNode(node);
671
+ nestedNode.isGroup = !existedGroup && !!children.length;
672
+ if (!children.length)
673
+ return;
674
+ children.forEach(x => {
675
+ const _node = this.convertToNestedNode(x);
676
+ _node.groupId = existedGroup ? existedGroup.id : node.id;
677
+ _node.isGroup = false;
678
+ });
679
+ this.updateDataTree(this.currentTreeData);
680
+ this.checkListSelection.deselect(...childSelected.map(x => this.resetNode(x)));
681
+ this.checkListSelection.select(...children.map(x => this.resetNode(x)));
682
+ return;
683
+ }
684
+ const _selectedIndex = this._selectedList.findIndex(x => x.id === node.id);
685
+ _selectedIndex > -1 && this._selectedList.splice(_selectedIndex, 1);
686
+ const deselectNodes = (this.isIncludeChildren || nestedNode.isGroup) ? childSelected : [node];
687
+ this.checkListSelection.deselect(...deselectNodes);
688
+ nestedNode.isGroup = false;
689
+ this.updateDataTree(this.currentTreeData);
690
+ return;
691
+ }
692
+ resetNode(node) {
693
+ node.isGroup = false;
694
+ return node;
695
+ }
696
+ isSelectedNode(node) {
697
+ return node && this.checkListSelection.isSelected(node);
698
+ }
699
+ getChildrenSelected(node) {
700
+ return this.getListChildrenOfNode(node).filter(x => this.isSelectedNode(x));
701
+ }
702
+ /**
703
+ * Gets a list of the data node's subtree of descendent data nodes.
704
+ * @param node
705
+ * @returns
706
+ */
707
+ getListChildrenOfNode(node) {
708
+ const flatNode = this.getNodeById(node.id);
709
+ if (!flatNode)
710
+ return [];
711
+ return this.treeControl.getDescendants(flatNode);
712
+ }
713
+ _mapToNestedListNode(flatNodeList) {
714
+ return flatNodeList.map(item => this.convertToNestedNode(item));
715
+ }
716
+ convertToNestedNode(node) {
717
+ return this.flatTreeNodeMap.get(node) || {};
718
+ }
719
+ convertToFlatNode(node) {
720
+ return this.nestedTreeNodeMap.get(node);
721
+ }
722
+ getAllParentNode(node) {
723
+ const listParent = [];
724
+ let parent = this.getParentNode(node);
725
+ while (parent) {
726
+ listParent.push(parent);
727
+ parent = this.getParentNode(parent);
728
+ }
729
+ return listParent;
730
+ }
731
+ getParentNode(node) {
732
+ const currentLevel = this.getLevel(node);
733
+ if (currentLevel < 1)
734
+ return;
735
+ const index = this.treeControl.dataNodes.indexOf(node) - 1;
736
+ for (let i = index; i >= 0; i--) {
737
+ const currentNode = this.treeControl.dataNodes[i];
738
+ if (this.getLevel(currentNode) < currentLevel) {
739
+ return currentNode;
740
+ }
741
+ }
742
+ return;
743
+ }
744
+ getItemIconType(item) {
745
+ if (!!item.itemMatIcon)
746
+ return this.itemIconType.name;
747
+ if (!!item.itemIconSvg)
748
+ return this.itemIconType.svg;
749
+ if (!!item.itemIcon)
750
+ return this.itemIconType.path;
751
+ return;
752
+ }
753
+ onScrollIntoNode(nodeId) {
754
+ const flatNode = this.getNodeById(nodeId);
755
+ if (!nodeId)
756
+ return;
757
+ this.onExpandNode(flatNode);
758
+ this.onExpandAllParent(flatNode);
759
+ const index = this.treeControl.dataNodes.findIndex(x => x.id === flatNode.id);
760
+ if (!this.cdkVirtualScrollViewport)
761
+ return;
762
+ this.cdkVirtualScrollViewport.scrollToIndex(index, 'smooth');
763
+ this.getActiveNodeEvent$.next(nodeId);
764
+ }
765
+ onSearch() {
766
+ var _a;
767
+ if (!this.formSearchControl.value || ((_a = this.formSearchControl.value) === null || _a === void 0 ? void 0 : _a.trim()) === '')
768
+ return;
769
+ this.getLoading$.next(true);
770
+ this.setIndexView(1);
771
+ this.onSearchEvent.emit(this.formSearchControl.value);
772
+ if (!this.paginatorSearch)
773
+ return;
774
+ this.paginatorSearch.changePage(0);
775
+ this.paginatorSearch.renderDisplayNumberOfpages();
776
+ }
777
+ setResultSearch(data) {
778
+ this.searchDepartment$.next(data);
779
+ }
780
+ onClickResultItem(item) {
781
+ const node = this.getNodeById(item.id);
782
+ if (node) {
783
+ this.scrollToNode(node.id);
784
+ }
785
+ }
786
+ onBreadCrumbItemClick(item) {
787
+ const node = this.getNodeById(item.id);
788
+ if (node) {
789
+ this.setIndexView(0);
790
+ of(node.id).pipe(delay(700), takeUntil(this.ngUnsubscribe)).subscribe(res => {
791
+ this.onScrollIntoNode(res);
792
+ });
793
+ }
794
+ }
795
+ onCheckItemSearchResult(item) {
796
+ this.checkListSelectionSearch.toggle(item);
797
+ if (this.config.isSelectOne) {
798
+ this.checkListSelectionSearch.deselect(...this.checkListSelectionSearch.selected.filter(x => x.id != item.id));
799
+ }
800
+ this.onCheckItemSearchEvent.emit({
801
+ state: this.checkListSelectionSearch.isSelected(item),
802
+ item: item
803
+ });
804
+ if (this.config.lazy) {
805
+ if (!this._handlingLazyObject.checkItemSearch) {
806
+ this._handleCheckResutlSearch(item);
807
+ return;
808
+ }
809
+ return;
810
+ }
811
+ this._handleCheckResutlSearch(item);
812
+ this.onValueChangeEvent.emit(this.resultSelected);
813
+ }
814
+ onBeforeCheckItemSearch(item, callback) {
815
+ return __awaiter(this, void 0, void 0, function* () {
816
+ item.isLoading = true;
817
+ this._handlingLazyObject.checkItemSearch = true;
818
+ // hold state before call method callback to prevent lost it's state unexpected
819
+ const isSelect = this.isSelectItemSearch(item.id);
820
+ if (!!callback)
821
+ yield callback(item);
822
+ item.isLoading = false;
823
+ this._handleCheckResutlSearch(item, isSelect);
824
+ this.onValueChangeEvent.emit(this.resultSelected);
825
+ this._handlingLazyObject.checkItemSearch = false;
826
+ });
827
+ }
828
+ onBeforeCheckAllSearch(callback) {
829
+ return __awaiter(this, void 0, void 0, function* () {
830
+ this._handlingLazyObject.checkAllSearch = true;
831
+ if (!!callback)
832
+ yield callback(this.resultSearch);
833
+ this._handlingLazyObject.checkAllSearch = false;
834
+ if (!this.resultSearch.length)
835
+ return;
836
+ for (let i = 0; i < this.resultSearch.length; i++) {
837
+ const item = this.resultSearch[i];
838
+ this._handleCheckResutlSearch(item);
839
+ }
840
+ });
841
+ }
842
+ canHandleItemSearchResult(item) {
843
+ if (!this.treeControl)
844
+ return false;
845
+ return this.treeControl.dataNodes.some(node => node.id === item.id) || this.config.lazy;
846
+ }
847
+ _mapToResultSearch() {
848
+ if (!!this.resultSearch.length)
849
+ this.resultSearch.forEach(item => {
850
+ var _a;
851
+ const isExistInResultSelected = (_a = this.resultSelected) === null || _a === void 0 ? void 0 : _a.some(x => { var _a; return x.id === item.id || ((_a = x.children) === null || _a === void 0 ? void 0 : _a.some(y => y.id === item.id)); });
852
+ isExistInResultSelected ? this.checkListSelectionSearch.select(item) : this.checkListSelectionSearch.deselect(item);
853
+ });
854
+ }
855
+ _handleCheckResutlSearch(item, state = this.isSelectItemSearch(item.id)) {
856
+ item.isLoading = false;
857
+ const currentNode = this.getNodeById(item.id.toString());
858
+ if (!!currentNode) {
859
+ if (state) {
860
+ if (this.checkListSelection.isSelected(currentNode))
861
+ return;
862
+ if (this.checkListSelectionSearch.isSelected(item))
863
+ this.checkListSelection.select(currentNode);
864
+ }
865
+ else {
866
+ this.checkListSelection.deselect(currentNode);
867
+ }
868
+ this.config.isSelectOne ? this._handleSelectOne(currentNode.id) : this.handleCheckNode(currentNode);
869
+ this.cdRef.detectChanges();
870
+ return;
871
+ }
872
+ if (this.config.isSelectOne) {
873
+ this._handleSelectOne(item.id);
874
+ return;
875
+ }
876
+ this._updateSelectedList(state ? 'add' : 'remove', item, this._selectedList, this.resultSelected);
877
+ }
878
+ isSelectItemSearch(id) {
879
+ return this.checkListSelectionSearch.selected.some(x => x.id === id);
880
+ }
881
+ _updateSelectedList(state, item, ...selectedLists) {
882
+ if (!item)
883
+ return;
884
+ selectedLists.forEach(selectedList => {
885
+ const itemExisted = selectedList.find(x => x.id === item.id);
886
+ switch (state) {
887
+ case 'add':
888
+ if (item.groupId) {
889
+ const group = selectedList.find(x => x.id === item.groupId);
890
+ if (!group && !itemExisted) {
891
+ selectedList.push(item);
892
+ }
893
+ !group.children.some(x => x.id === item.id) && group.children.push(item);
894
+ return;
895
+ }
896
+ !itemExisted && selectedList.push(item);
897
+ break;
898
+ case 'remove':
899
+ if (!itemExisted) {
900
+ const group = selectedList.find(x => x.children.some(x1 => x1.id === item.id));
901
+ if (!group)
902
+ return;
903
+ const index = group.children.findIndex(x => x.id === item.id);
904
+ if (index < 0)
905
+ return;
906
+ group.children.splice(index, 1);
907
+ return;
908
+ }
909
+ selectedList.splice(selectedList.indexOf(itemExisted), 1);
910
+ const itemSelectionSearch = this.checkListSelectionSearch.selected.find(x => x.id === itemExisted.id);
911
+ itemSelectionSearch && this.checkListSelectionSearch.deselect(itemSelectionSearch);
912
+ break;
913
+ default:
914
+ break;
915
+ }
916
+ });
917
+ }
918
+ onSelectAllSearchResult(checked) {
919
+ checked = !checked;
920
+ if (!this.resultSearch.length)
921
+ return;
922
+ if (this.config.handleCheckAllItemSearch) {
923
+ for (let i = 0; i < this.resultSearch.length; i++) {
924
+ const item = this.resultSearch[i];
925
+ if (checked) {
926
+ const treeNode = this.treeControl.dataNodes.find(node => node.id === item.id);
927
+ const canSelect = (!!treeNode || this.config.lazy);
928
+ if (!canSelect)
929
+ continue;
930
+ !this.checkListSelectionSearch.isSelected(item) && this.checkListSelectionSearch.select(item);
931
+ }
932
+ else {
933
+ const _itemSelections = this.checkListSelectionSearch.selected.filter(x => x.id === item.id);
934
+ if (_itemSelections.length)
935
+ this.checkListSelectionSearch.deselect(..._itemSelections);
936
+ }
937
+ if (!this.config.lazy || !this._handlingLazyObject.checkAllSearch)
938
+ this._handleCheckResutlSearch(item, checked);
939
+ }
940
+ }
941
+ this.onCheckAllItemSearchEvent.emit(checked);
942
+ this.onValueChangeEvent.emit(this.resultSelected);
943
+ }
944
+ isDisableChecboxAllSearch() {
945
+ return this.resultSearch && this.resultSearch.every(x => x.disabled);
946
+ }
947
+ onPagingSearchResult(val) {
948
+ this.getLoading$.next(true);
949
+ this.onPagingSearchEvent.emit(val);
950
+ }
951
+ scrollToNode(nodeId) {
952
+ this.scrollToNodeEvent$.next(nodeId);
953
+ }
954
+ setIndexView(index) {
955
+ if (index === 1 && this.config.resetToggleIncludeChildWhenChangeView) {
956
+ this.isIncludeChildren = false;
957
+ }
958
+ this.getIndexView$.next(index);
959
+ }
960
+ canActiveNodeExternal(node) {
961
+ const allParent = this.getAllParentNode(node);
962
+ return !allParent || allParent.every(item => this.treeControl.isExpanded(item));
963
+ }
964
+ getHeightStyleRefNode(nodeId) {
965
+ const nodeEle = this.eleRef.nativeElement.querySelector(`.mat-tree-node#mat-node-${nodeId}`);
966
+ return `${(nodeEle === null || nodeEle === void 0 ? void 0 : nodeEle.clientHeight) || 0}px`;
967
+ }
968
+ getSelectedNodeStorage() {
969
+ return JSON.parse(localStorage.getItem('selectedNode'));
970
+ }
971
+ setSelectedNodeStorage(node) {
972
+ this.isIncludeChildren && localStorage.setItem('selectedNode', JSON.stringify(node));
973
+ }
974
+ setDefaultPaginatorSize(options) {
975
+ this.PAGE_SIZE_OPTION = options;
976
+ }
977
+ trackBy(index, item) {
978
+ return item;
979
+ }
980
+ /**
981
+ * This function use for lazy load children of node
982
+ * @param node node update. if node is null data auto insert as roots
983
+ * @param data list children to update node.
984
+ * @param mode default is update that replace current list children by new list children , if mode = 'insert' will insert new values to list children existed before.
985
+ */
986
+ updateChildOfNode(node, data = [], mode = 'update') {
987
+ node.isLoading = false;
988
+ this.checkLoadingOfParent(node);
989
+ const nestedNode = this.convertToNestedNode(node);
990
+ const dataNodes = this.treeDepartmentService.convertToTreeData(data).filter(x => x.parentId === node.id);
991
+ if (!nestedNode)
992
+ return;
993
+ switch (mode) {
994
+ case 'insert':
995
+ nestedNode.children.push(...dataNodes);
996
+ break;
997
+ case 'update':
998
+ nestedNode.children = dataNodes;
999
+ break;
1000
+ }
1001
+ this.updateDataTree(this.currentTreeData);
1002
+ const _node = this.getNodeById(node.id);
1003
+ const nodes = this.treeControl.getDescendants(_node);
1004
+ for (let i = 0; i < this.resultSelected.length; i++) {
1005
+ const item = this.resultSelected[i];
1006
+ this._reUpdateSelectionNode(item.id);
1007
+ const descendants = this.treeDepartmentService.getDescendantsOfNode(item);
1008
+ if (!descendants.length)
1009
+ continue;
1010
+ for (let j = 0; j < descendants.length; j++) {
1011
+ const child = descendants[j];
1012
+ this._reUpdateSelectionNode(child.id);
1013
+ }
1014
+ }
1015
+ this.selectedListAfterDataNodeChange$.next([_node, ...nodes]);
1016
+ }
1017
+ //re-select when update children of node
1018
+ _reUpdateSelectionNode(nodeId) {
1019
+ const node = this.getNodeById(nodeId);
1020
+ if (!node || this.checkListSelection.isSelected(node))
1021
+ return;
1022
+ const existInSelection = this.checkListSelection.selected.find(x => x.id == node.id);
1023
+ if (existInSelection)
1024
+ this.checkListSelection.deselect(existInSelection);
1025
+ this.checkListSelection.select(node);
1026
+ }
1027
+ checkLoadingOfParent(node) {
1028
+ const allParent = this.getAllParentNode(node);
1029
+ if (!allParent.length)
1030
+ return;
1031
+ for (let i = 0; i < allParent.length; i++) {
1032
+ const parent = allParent[i];
1033
+ const descendants = this.treeControl.getDescendants(parent);
1034
+ parent.isLoading = descendants.some(x => x.isLoading);
1035
+ }
1036
+ }
1037
+ getNodeById(id) {
1038
+ return this.treeControl.dataNodes.find(node => node.id === id) || undefined;
1039
+ }
1040
+ getRootOfNode(node) {
1041
+ const allParent = this.getAllParentNode(node);
1042
+ if (!allParent.length)
1043
+ return undefined;
1044
+ return allParent.pop();
1045
+ }
1046
+ addRootTree(data = []) {
1047
+ this.getLoadingMore$.next(false);
1048
+ if (!data.length)
1049
+ return;
1050
+ const treeNodeData = this.treeDepartmentService.convertToTreeData(data);
1051
+ // re-check root was existed in tree
1052
+ for (let i = 0; i < treeNodeData.length; i++) {
1053
+ const item = treeNodeData[i];
1054
+ const node = this.getNodeById(item.id);
1055
+ if (!!node && node.expandable && !node.markedGetChildren) {
1056
+ const nestedNode = this.convertToNestedNode(node);
1057
+ nestedNode.children = item.children;
1058
+ nestedNode.markedGetChildren = true;
1059
+ return;
1060
+ }
1061
+ if (!node)
1062
+ this.currentTreeData.push(item);
1063
+ }
1064
+ this.updateDataTree(this.currentTreeData);
1065
+ this.selectedListAfterDataNodeChange$.next(data);
1066
+ }
1067
+ getCheckedStatusNode(node) {
1068
+ return this.isSelectedNode(node);
1069
+ }
1070
+ updateNodeInformation(node) {
1071
+ let nestedNode = this.convertToNestedNode(node);
1072
+ if (!nestedNode) {
1073
+ return;
1074
+ }
1075
+ nestedNode.childCount = node.childCount;
1076
+ nestedNode.name = node.name;
1077
+ nestedNode.itemIcon = node.itemIcon;
1078
+ nestedNode.itemIconSvg = node.itemIconSvg;
1079
+ nestedNode.selectedChildCount = node.selectedChildCount;
1080
+ nestedNode.markedGetChildCountRecurrsive = node.markedGetChildCountRecurrsive;
1081
+ nestedNode.isIncludeChildWhenChecked = node.isIncludeChildWhenChecked;
1082
+ }
1083
+ updateSelectedResultData(node) {
1084
+ const nodeResult = this.resultSelected.find((x) => x.id === node.id);
1085
+ if (nodeResult) {
1086
+ nodeResult.childCount = node.childCount;
1087
+ nodeResult.selectedChildCount = node.selectedChildCount;
1088
+ }
1089
+ }
1090
+ callCheckNodeOutside(node) {
1091
+ this.checkListSelection.toggle(node);
1092
+ //this.handleCheckNode(node);
1093
+ }
1094
+ }
1095
+ SelectProcessDataTreeComponent.decorators = [
1096
+ { type: Component, args: [{
1097
+ selector: 'qms-select-process-data-tree',
1098
+ template: "<div [ngClass]=\"['qms-select-department-tree-container', (config.customClass || '')]\">\n <div class=\"input-select-department\">\n <form (ngSubmit)=\"!getLoading$.value && onSearch()\" *ngIf=\"config.enableTreeSearch\" class=\"input-field\">\n <mat-form-field class=\"w100\" qms-form qms-search-field>\n <input [formControl]=\"formSearchControl\" type=\"text\" placeholder=\"Search\" matInput />\n <button *ngIf=\"!getLoading$.value\" type=\"submit\" qms-btn-icon color=\"light\" matSuffix>\n <mat-icon>search</mat-icon>\n </button>\n <mat-progress-spinner [@inOutAnimation] matSuffix mode=\"indeterminate\" diameter=\"20\"\n *ngIf=\"getLoading$.value\"></mat-progress-spinner>\n <div *ngIf=\"!!formSearchControl.value && !getLoading$.value\" qms-input-clear matSuffix>\n <button qms-btn-icon color=\"light\" [@inOutAnimation] aria-label=\"Clear\" (click)=\"formSearchControl.reset()\">\n <mat-icon>close</mat-icon>\n </button>\n </div>\n </mat-form-field>\n </form>\n <div [@inOutAnimation] *ngIf=\"(getIndexView$ | async) === 1 && (textSearchSubject$ | async)\"\n class=\"sub-text ms-1 fw500\">\n {{LANG.RESULT_SEARCH_FOR}}<i><b>\"{{textSearchSubject$ | async}}\"</b></i>\n </div>\n <div [class.justify-content-between]=\"config.enableIncludeChild && !config.isSelectOne\"\n class=\"select__toggle-include toggle-include-child my-1 d-flex justify-content-end align-items-center\">\n <mat-slide-toggle *ngIf=\"config.enableIncludeChild && !config.isSelectOne\"\n [disabled]=\"(getIndexView$ | async) === 1 && config.disableToggleIncludeChildWhenChangeView\"\n [(ngModel)]=\"isIncludeChildren\" (ngModelChange)=\"toggleIncludeChildEvent.emit($event)\" color=\"default\"\n qms-group-options>\n <span class=\"text-label\">{{config.selectIncludeLabel || LANG.SELECT_INCLUDE_CHILD}}</span>\n </mat-slide-toggle>\n <button class=\"btn-arrow\" [@inOutAnimation] *ngIf=\"(getIndexView$ | async) === 1 && config.enableTreeSearch\"\n (click)=\"setIndexView(0)\" qms-btn-icon color=\"light\" [qms-tool-tip]=\"LANG.BACK_TO_TREE\" mode=\"dark\"\n position=\"top\">\n <mat-icon>arrow_back</mat-icon>\n </button>\n <button class=\"btn-arrow\" [@inOutAnimation]\n *ngIf=\"(getIndexView$ | async) === 0 && config.enableTreeSearch && (textSearchSubject$ | async)\"\n (click)=\"setIndexView(1)\" qms-btn-icon color=\"light\" [qms-tool-tip]=\"LANG.GOTO_SEACH_RESULT\" mode=\"dark\"\n position=\"top\">\n <mat-icon>arrow_forward</mat-icon>\n </button>\n </div>\n </div>\n <div [@inOutAnimation]\n *ngIf=\"(getIndexView$ | async) === 0 && config.modeView === MODE_VIEW_ENUM.ExternalView && !!config.headerName\"\n class=\"header-view-tree\">\n <div class=\"header-view header-title\">\n {{config.headerName.treeName}}\n </div>\n <div class=\"header-view header-title\">\n {{config.headerName.externalName}}\n </div>\n </div>\n <mat-divider class=\"mx-auto\"></mat-divider>\n <div [@animateSlideView]=\"(getIndexView$ | async)\" [ngStyle]=\"{\n minHeight: height\n }\" class=\"tree-department-wrapper\">\n <div *ngIf=\"(getIndexView$ | async) === 0\" class=\"tree-view w100 h100\">\n <div class=\"tree-view-main h100\">\n <div *ngIf=\"!config.isSelectOne && !!treeControl.dataNodes && config.activeSelectAllNode\"\n class=\"checkbox-all-tree\" [class.sticky-position]=\"config.modeView === MODE_VIEW_ENUM.ExternalView\">\n <!-- Checkbox all root node -->\n <mat-checkbox [@inOutAnimation] (click)=\"onCheckAllRootTreeNode()\"\n [indeterminate]=\"isIndeterminateCheckboxAllTree\" [checked]=\"isAllDepartmentSelected\" qms-group-options\n color=\"default\" label=\"none\" class=\"checkbox-all\">\n <span class=\"text-label \">{{LANG.CHOOSE_ALL}}</span>\n <span>(<b>{{treeControl.dataNodes.length}}</b>)</span>\n </mat-checkbox>\n <mat-divider class=\"mx-auto\"></mat-divider>\n </div>\n <cdk-virtual-scroll-viewport *ngIf=\"dataSource.data\" [ngClass]=\"{\n 'has-checkbox-all': !config.isSelectOne && config.modeView === MODE_VIEW_ENUM.Basic,\n 'select-department-tree': true\n }\" [itemSize]=\"ITEM_SIZE\" [ngStyle]=\"{height: height}\">\n <ng-container *cdkVirtualFor=\"let node of dataSource; trackBy: trackBy\">\n <div class=\"qms-tree-node mt-1\" [style.padding-left]=\"node.level * (config.isMobile ? 12 :24) + 'px'\"\n [attr.data-id]=\"node.id\" [id]=\"'mat-node-'+node.id\" [@triggerColor]=\"activeNode == node.id\" [ngClass]=\"{\n 'mat-tree-node-disabled-all': node.disabled,\n 'w-100': config.isSelectOne,\n 'selected-theme': this.checkListSelection.isSelected(node) && config.isSelectOne,\n 'expand-node': treeControl.isExpandable(node) && treeControl.isExpanded(node),\n 'active-external-view': config.modeView === MODE_VIEW_ENUM.ExternalView,\n 'node-loading': node.isLoading\n }\">\n <div class=\"node-expand-area\">\n <button class=\"btn-toggle\" qms-btn-icon color=\"light\" (click)=\"onExpandNode(node)\"\n *ngIf=\"treeControl.isExpandable(node) && !node.isLoading\">\n <mat-icon>\n {{ treeControl.isExpanded(node) ? \"expand_more\" : \"chevron_right\" }}\n </mat-icon>\n </button>\n <ng-container *ngIf=\"node.isLoading; then loadingSpinner\"></ng-container>\n </div>\n <ng-container [ngTemplateOutlet]=\"config.isSelectOne ? nodeWithoutCheckboxTemplate : showCheckboxTemplate\"\n [ngTemplateOutletContext]=\"{ node: node }\"></ng-container>\n <div *ngIf=\"config.modeView === MODE_VIEW_ENUM.ExternalView\" class=\"external-view-node\">\n <span class=\"node-external\" qms-elipsify position=\"top\" mode=\"dark\">\n {{node.externalName || ''}}\n </span>\n </div>\n </div>\n </ng-container>\n </cdk-virtual-scroll-viewport>\n <ng-container [@inOutAnimation] *ngIf=\"config.spinnerWhenGetMore && getLoadingMore$| async ;then maskOverlay\">\n </ng-container>\n </div>\n </div>\n <div *ngIf=\"(getIndexView$ | async) === 1\" [ngStyle]=\"{\n height: height\n }\" class=\"qms-view-search-result\">\n <div *ngIf=\"config.modeView === MODE_VIEW_ENUM.ExternalView\"\n class=\"qms-view-search-result__header d-flex align-items-center justify-content-between\">\n <div class=\"header-title\">\n <span qms-elipsify mode=\"dark\" position=\"top\">\n {{config.headerName.resultSearchName}}\n </span>\n </div>\n <div class=\"header-title\">\n <span qms-elipsify mode=\"dark\" position=\"top\">\n {{config.headerName.externalName}}\n </span>\n </div>\n </div>\n <ng-container *ngIf=\"getLoading$.value; then loading\"></ng-container>\n <div class=\"qms-view-search-result__wrapper\"\n [class.active-external]=\"config.modeView === MODE_VIEW_ENUM.ExternalView\"\n *ngIf=\"!!resultSearch.length && !getLoading$.value\">\n <div class=\"\">\n <mat-checkbox [@inOutAnimation]\n [disabled]=\"!resultSearch.length || config.isSelectOne || isDisableChecboxAllSearch()\" #checkAllSearch\n [indeterminate]=\"indeterminateSearchResult\" [checked]=\"isSelectAllResultSearch\" qms-group-options\n color=\"default\" label=\"none\" class=\"checkbox-all\"\n (click)=\"!config.isSelectOne && onSelectAllSearchResult(checkAllSearch.checked)\">\n <span class=\"text-label header-title\">{{LANG.CHOOSE_ALL}}</span>\n <span>(<b>{{resultSearch.length}}</b>)</span>\n </mat-checkbox>\n </div>\n <div [@inOutAnimation] [@listAnimation]\n [class.active-paging]=\"searchDepartment$.value.length > 10 && config.enablePagingSearch\" class=\"result\">\n <div [qms-tool-tip]=\"!canHandleItemSearchResult(item) ? LANG.ITEM_NOT_MATCH_TO_TREE : ''\" mode=\"dark\"\n position=\"top\" *ngFor=\"let item of resultSearch\"\n (click)=\"$event.stopImmediatePropagation(); !item.disabled && onCheckItemSearchResult(item)\"\n [class.active]=\"checkListSelectionSearch.isSelected(item)\" class=\"result-item user-select-none\" matRipple>\n <mat-checkbox [@inOutAnimation] *ngIf=\"!item.isLoading\" [disabled]=\"item.disabled\"\n (click)=\"$event.stopImmediatePropagation(); !item.disabled && onCheckItemSearchResult(item)\"\n [checked]=\"checkListSelectionSearch.isSelected(item)\" qms-group-options color=\"default\" label=\"none\">\n </mat-checkbox>\n <div *ngIf=\"item.isLoading\" [@inOutAnimation] class=\"position-relative\">\n <ng-container *ngIf=\"item.isLoading; then loadingSpinner\"></ng-container>\n </div>\n <div class=\"result-item__content\">\n <div class=\"item-result-content-wraper\">\n <div class=\"text-gray fw-bold fs-base mb0\">{{item.name}}</div>\n <qms-breadcrumb *ngIf=\"item.location?.length > 1\" [type]=\"config.isMobile ? 'mobile': ''\"\n [numDisplayItem]=\"6\" (onItemClick)=\"$event.stopImmediatePropagation()\" class=\"breadcrumb-container\"\n [nodes]=\"item.location\">\n </qms-breadcrumb>\n <div *ngIf=\"item.location?.length === 1\" class=\"d-flex align-items-center\">\n <span qms-elipsify mode=\"dark\" position=\"top\"\n class=\"item-breadcrumb-disable d-block\">{{item.location[0].name}}</span>\n </div>\n </div>\n <div *ngIf=\"config.modeView === MODE_VIEW_ENUM.ExternalView\" class=\"external-name\">\n <span qms-elipsify mode=\"dark\" position=\"top\" class=\"text-gray fs-base mb0\">{{item.externalName}}\n </span>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div [@inOutAnimation] *ngIf=\"!resultSearch.length && !getLoading$.value\" class=\"result no-result\">\n <ng-container *ngTemplateOutlet=\"noResult\"></ng-container>\n </div>\n <mat-divider *ngIf=\"searchDepartment$.value.length > 10 && config.enablePagingSearch\"\n class=\"mx-auto\"></mat-divider>\n <qms-paginator #paginatorSearch *ngIf=\"searchDepartment$.value.length > 10 && config.enablePagingSearch \"\n [length]=\"searchDepartment$.value.length\" [numHidden]=\"0\" [pageSize]=\"CURRENT_PAGESIZE\"\n [pageSizeOptions]=\"PAGE_SIZE_OPTION\" (page)='onPagingSearchResult($event)'\n [size]='config.isMobile ? PAGINATION_SIZE.small : PAGINATION_SIZE.medium'>\n </qms-paginator>\n </div>\n </div>\n\n <!-- Template for Checkbox -->\n <ng-template #showCheckboxTemplate let-node=\"node\">\n <mat-checkbox [id]=\"'node-'+node.id\" qms-group-options color=\"default\" label=\"none\" class=\"flex-direction-row\"\n [disabled]=\"node.isLoading\" [checked]=\"checkListSelection.isSelected(node)\"\n (click)=\"!node.isLoading && onCheckNode(node)\" [attr.disabled]=\"node.disabled || node.isLoading\">\n <img [title]=\"node.itemIconSvg\" *ngIf=\"node.itemIconSvg\" class=\"material-icons type-icon\"\n [src]=\"node.itemIconSvg\" />\n <span *ngIf=\"node.itemIcon\" [class]=\"node.itemIcon\" [qmsTransformIcon]=\"node.itemIcon\"\n class=\"material-icons-outlined type-icon\"></span>\n <span *ngIf=\"node.itemMatIcon\" class=\"material-icons-outlined type-icon\">{{\n node.itemMatIcon }}\n </span>\n <span class=\"text-name cursor-pointer ml5 123\" [ngClass]=\"{ disabled: node.disabled }\">{{ node.name}}\n </span>\n </mat-checkbox>\n </ng-template>\n\n <!-- Template node without checkbox -->\n <ng-template #nodeWithoutCheckboxTemplate let-node=\"node\">\n <div [id]=\"'node-'+node.id\" (click)=\"onCheckNode(node)\" class=\"node-without-checkbox\">\n <div class=\"node-info\">\n <span *ngIf=\"node.itemIcon\" [class]=\"node.itemIcon\" [qmsTransformIcon]=\"node.itemIcon\"\n class=\"material-icons-outlined type-icon\"></span>\n <span *ngIf=\"node.itemMatIcon\" class=\"material-icons-outlined type-icon\">{{\n node.itemMatIcon }}\n </span>\n <span class=\"text-name cursor-pointer pl-10 123\" [ngClass]=\"{ disabled: node.disabled }\">{{ node.name }}</span>\n </div>\n <div class=\"node-state\">\n <mat-icon *ngIf=\"checkListSelection.isSelected(node)\">check</mat-icon>\n </div>\n </div>\n </ng-template>\n</div>\n\n<ng-template #noResult>\n <svg width=\"89\" height=\"130\" viewBox=\"0 0 89 88\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"0.5\" width=\"88\" height=\"88\" rx=\"44\" fill=\"white\" />\n <rect x=\"0.5\" width=\"88\" height=\"88\" rx=\"44\" fill=\"#0163B2\" fill-opacity=\"0.12\" />\n <path\n d=\"M44.5 56.6936L58.096 64.8996L54.488 49.4336L66.5 39.0276L50.682 37.6856L44.5 23.0996L38.318 37.6856L22.5 39.0276L34.512 49.4336L30.904 64.8996L44.5 56.6936Z\"\n fill=\"#0163B3\" />\n <text x=\"10\" y=\"105\" fill=\"#0163B2\">{{LANG.NO_RESULT}}</text>\n </svg>\n</ng-template>\n\n<!-- Template loading -->\n<ng-template #loading>\n <div [ngStyle]=\"{\n 'height': searchDepartment$.value.length ? (config.modeView === MODE_VIEW_ENUM.ExternalView ? 'calc(100% - 90px)' : 'calc(100% - 50px)' ) : height\n }\" class=\"qms-loading-container\">\n <div class=\"qms-loader\" *ngFor=\"let item of arrSkeleton\">\n <div class=\"qms-loader__wrapper\">\n <div class=\"row-loader\">\n </div>\n </div>\n </div>\n </div>\n</ng-template>\n\n<!-- Template mask overlay -->\n<ng-template #maskOverlay>\n <div class=\"mask-overlay\">\n <mat-spinner [diameter]=\"50\" [strokeWidth]=\"5\"></mat-spinner>\n </div>\n</ng-template>\n\n<!-- Loading spinner -->\n<ng-template #loadingSpinner>\n <div class=\"qms-spinner center\">\n <mat-spinner [diameter]=\"20\" [strokeWidth]=\"2\"></mat-spinner>\n </div>\n</ng-template>",
1099
+ animations: [
1100
+ AnimationTreeDepartment
1101
+ ],
1102
+ changeDetection: ChangeDetectionStrategy.OnPush,
1103
+ styles: ["@charset \"UTF-8\";@font-face{font-family:icomoon;src:url(../assets/fonts/icomoon.eot?aghldx);src:url(../assets/fonts/icomoon.eot?aghldx#iefix) format(\"embedded-opentype\"),url(../assets/fonts/icomoon.ttf?aghldx) format(\"truetype\"),url(../assets/fonts/icomoon.woff?aghldx) format(\"woff\"),url(../assets/fonts/icomoon.svg?aghldx#icomoon) format(\"svg\");font-weight:400;font-style:normal;font-display:block}[class*=\" icon-\"],[class^=icon-]{font-family:icomoon!important;speak:never;font-style:normal;font-weight:400;font-feature-settings:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.icon-acutely-toxic .path1:before{content:\"\uE91B\";color:#e32730}.icon-acutely-toxic .path2:before{content:\"\uE922\";margin-left:-1em;color:#323232}.icon-acutely-toxic .path3:before{content:\"\uE923\";margin-left:-1em;color:#323232}.icon-acutely-toxic .path4:before{content:\"\uE924\";margin-left:-1em;color:#323232}.icon-acutely-toxic .path5:before{content:\"\uE925\";margin-left:-1em;color:#323232}.icon-acutely-toxic .path6:before{content:\"\uE926\";margin-left:-1em;color:#323232}.icon-acutely-toxic .path7:before{content:\"\uE927\";margin-left:-1em;color:#323232}.icon-acutely-toxic .path8:before{content:\"\uE928\";margin-left:-1em;color:#323232}.icon-acutely-toxic .path9:before{content:\"\uE929\";margin-left:-1em;color:#323232}.icon-acutely-toxic .path10:before{content:\"\uE92A\";margin-left:-1em;color:#323232}.icon-acutely-toxic .path11:before{content:\"\uE92B\";margin-left:-1em;color:#323232}.icon-acutely-toxic .path12:before{content:\"\uE92C\";margin-left:-1em;color:#323232}.icon-acutely-toxic .path13:before{content:\"\uE92D\";margin-left:-1em;color:#323232}.icon-acutely-toxic .path14:before{content:\"\uE92E\";margin-left:-1em;color:#323232}.icon-acutely-toxic .path15:before{content:\"\uE92F\";margin-left:-1em;color:#323232}.icon-acutely-toxic .path16:before{content:\"\uE930\";margin-left:-1em;color:#323232}.icon-acutely-toxic .path17:before{content:\"\uE931\";margin-left:-1em;color:#323232}.icon-add-column:before{content:\"\uE932\"}.icon-add-tooltip:before{content:\"\uE933\"}.icon-admin:before{content:\"\uE934\"}.icon-annual-cycle:before{content:\"\uE935\"}.icon-assignment-repete:before{content:\"\uE936\"}.icon-barrier-add:before{content:\"\uE937\"}.icon-barrier-edit:before{content:\"\uE938\"}.icon-barrier-view:before{content:\"\uE939\"}.icon-button-group:before{content:\"\uE93A\"}.icon-chemical-manager:before{content:\"\uE93B\"}.icon-chronic-health-hazard .path1:before{content:\"\uE93C\";color:#e32730}.icon-chronic-health-hazard .path2:before{content:\"\uE93D\";margin-left:-1em;color:#323232}.icon-chronic-health-hazard .path3:before{content:\"\uE93E\";margin-left:-1em;color:#323232}.icon-chronic-health-hazard .path4:before{content:\"\uE93F\";margin-left:-1em;color:#323232}.icon-chronic-health-hazard .path5:before{content:\"\uE940\";margin-left:-1em;color:#323232}.icon-chronic-health-hazard .path6:before{content:\"\uE941\";margin-left:-1em;color:#323232}.icon-chronic-health-hazard .path7:before{content:\"\uE942\";margin-left:-1em;color:#323232}.icon-chronic-health-hazard .path8:before{content:\"\uE943\";margin-left:-1em;color:#323232}.icon-chronic-health-hazard .path9:before{content:\"\uE944\";margin-left:-1em;color:#323232}.icon-chronic-health-hazard .path10:before{content:\"\uE945\";margin-left:-1em;color:#323232}.icon-chronic-health-hazard .path11:before{content:\"\uE946\";margin-left:-1em;color:#323232}.icon-chronic-health-hazard .path12:before{content:\"\uE947\";margin-left:-1em;color:#323232}.icon-chronic-health-hazard .path13:before{content:\"\uE948\";margin-left:-1em;color:#323232}.icon-chronic-health-hazard .path14:before{content:\"\uE949\";margin-left:-1em;color:#323232}.icon-chronic-health-hazard .path15:before{content:\"\uE94A\";margin-left:-1em;color:#323232}.icon-contingency:before{content:\"\uE94B\"}.icon-corrosive .path1:before{content:\"\uE94C\";color:#323232}.icon-corrosive .path2:before{content:\"\uE94D\";margin-left:-1em;color:#323232}.icon-corrosive .path3:before{content:\"\uE94E\";margin-left:-1em;color:#323232}.icon-corrosive .path4:before{content:\"\uE94F\";margin-left:-1em;color:#323232}.icon-corrosive .path5:before{content:\"\uE950\";margin-left:-1em;color:#323232}.icon-corrosive .path6:before{content:\"\uE951\";margin-left:-1em;color:#323232}.icon-corrosive .path7:before{content:\"\uE952\";margin-left:-1em;color:#323232}.icon-corrosive .path8:before{content:\"\uE953\";margin-left:-1em;color:#323232}.icon-corrosive .path9:before{content:\"\uE954\";margin-left:-1em;color:#323232}.icon-corrosive .path10:before{content:\"\uE955\";margin-left:-1em;color:#323232}.icon-corrosive .path11:before{content:\"\uE956\";margin-left:-1em;color:#323232}.icon-corrosive .path12:before{content:\"\uE957\";margin-left:-1em;color:#323232}.icon-corrosive .path13:before{content:\"\uE958\";margin-left:-1em;color:#323232}.icon-corrosive .path14:before{content:\"\uE959\";margin-left:-1em;color:#323232}.icon-corrosive .path15:before{content:\"\uE95A\";margin-left:-1em;color:#323232}.icon-corrosive .path16:before{content:\"\uE95B\";margin-left:-1em;color:#323232}.icon-corrosive .path17:before{content:\"\uE95C\";margin-left:-1em;color:#323232}.icon-corrosive .path18:before{content:\"\uE95D\";margin-left:-1em;color:#323232}.icon-corrosive .path19:before{content:\"\uE95E\";margin-left:-1em;color:#323232}.icon-corrosive .path20:before{content:\"\uE95F\";margin-left:-1em;color:#323232}.icon-corrosive .path21:before{content:\"\uE960\";margin-left:-1em;color:#e32730}.icon-dashboard:before{content:\"\uE961\"}.icon-database-sds:before{content:\"\uE962\"}.icon-description-add:before{content:\"\uE963\"}.icon-description-edit:before{content:\"\uE964\"}.icon-description-view:before{content:\"\uE965\";color:#666}.icon-document-read .path1:before{content:\"\uE966\";color:#000;opacity:.6}.icon-document-read .path2:before{content:\"\uE967\";margin-left:-1em;color:#fff}.icon-document-read .path3:before{content:\"\uE968\";margin-left:-1em;color:#000;opacity:.6}.icon-draft:before{content:\"\uE969\"}.icon-expired-off:before{content:\"\uE96A\"}.icon-expired-on:before{content:\"\uE96B\"}.icon-explosive .path1:before{content:\"\uE96C\";color:#e32730}.icon-explosive .path2:before{content:\"\uE96D\";margin-left:-1em;color:#323232}.icon-explosive .path3:before{content:\"\uE96E\";margin-left:-1em;color:#323232}.icon-explosive .path4:before{content:\"\uE96F\";margin-left:-1em;color:#323232}.icon-explosive .path5:before{content:\"\uE970\";margin-left:-1em;color:#323232}.icon-explosive .path6:before{content:\"\uE971\";margin-left:-1em;color:#323232}.icon-explosive .path7:before{content:\"\uE972\";margin-left:-1em;color:#323232}.icon-explosive .path8:before{content:\"\uE973\";margin-left:-1em;color:#323232}.icon-explosive .path9:before{content:\"\uE974\";margin-left:-1em;color:#323232}.icon-explosive .path10:before{content:\"\uE975\";margin-left:-1em;color:#323232}.icon-explosive .path11:before{content:\"\uE976\";margin-left:-1em;color:#323232}.icon-explosive .path12:before{content:\"\uE977\";margin-left:-1em;color:#323232}.icon-explosive .path13:before{content:\"\uE978\";margin-left:-1em;color:#323232}.icon-explosive .path14:before{content:\"\uE979\";margin-left:-1em;color:#323232}.icon-explosive .path15:before{content:\"\uE97A\";margin-left:-1em;color:#323232}.icon-explosive .path16:before{content:\"\uE97B\";margin-left:-1em;color:#323232}.icon-explosive .path17:before{content:\"\uE97C\";margin-left:-1em;color:#323232}.icon-explosive .path18:before{content:\"\uE97D\";margin-left:-1em;color:#323232}.icon-explosive .path19:before{content:\"\uE97E\";margin-left:-1em;color:#323232}.icon-explosive .path20:before{content:\"\uE97F\";margin-left:-1em;color:#323232}.icon-explosive .path21:before{content:\"\uE980\";margin-left:-1em;color:#323232}.icon-explosive .path22:before{content:\"\uE981\";margin-left:-1em;color:#323232}.icon-explosive .path23:before{content:\"\uE982\";margin-left:-1em;color:#323232}.icon-explosive .path24:before{content:\"\uE983\";margin-left:-1em;color:#323232}.icon-explosive .path25:before{content:\"\uE984\";margin-left:-1em;color:#323232}.icon-explosive .path26:before{content:\"\uE985\";margin-left:-1em;color:#323232}.icon-explosive .path27:before{content:\"\uE986\";margin-left:-1em;color:#323232}.icon-explosive .path28:before{content:\"\uE987\";margin-left:-1em;color:#323232}.icon-explosive .path29:before{content:\"\uE988\";margin-left:-1em;color:#323232}.icon-explosive .path30:before{content:\"\uE989\";margin-left:-1em;color:#323232}.icon-explosive .path31:before{content:\"\uE98A\";margin-left:-1em;color:#323232}.icon-explosive .path32:before{content:\"\uE98B\";margin-left:-1em;color:#323232}.icon-explosive .path33:before{content:\"\uE98C\";margin-left:-1em;color:#323232}.icon-explosive .path34:before{content:\"\uE98D\";margin-left:-1em;color:#323232}.icon-explosive .path35:before{content:\"\uE98E\";margin-left:-1em;color:#323232}.icon-explosive .path36:before{content:\"\uE98F\";margin-left:-1em;color:#323232}.icon-explosive .path37:before{content:\"\uE990\";margin-left:-1em;color:#323232}.icon-explosive .path38:before{content:\"\uE991\";margin-left:-1em;color:#323232}.icon-explosive .path39:before{content:\"\uE992\";margin-left:-1em;color:#323232}.icon-explosive .path40:before{content:\"\uE993\";margin-left:-1em;color:#323232}.icon-explosive .path41:before{content:\"\uE994\";margin-left:-1em;color:#323232}.icon-explosive .path42:before{content:\"\uE995\";margin-left:-1em;color:#323232}.icon-explosive .path43:before{content:\"\uE996\";margin-left:-1em;color:#323232}.icon-explosive .path44:before{content:\"\uE997\";margin-left:-1em;color:#323232}.icon-explosive .path45:before{content:\"\uE998\";margin-left:-1em;color:#323232}.icon-explosive .path46:before{content:\"\uE999\";margin-left:-1em;color:#323232}.icon-file-excel:before{content:\"\uE99A\"}.icon-file-pdf:before{content:\"\uE99B\"}.icon-file-pdf-verified .path1:before{content:\"\uE99C\";color:#000;opacity:.6}.icon-file-pdf-verified .path2:before{content:\"\uE99D\";margin-left:-1em;color:#fff}.icon-file-pdf-verified .path3:before{content:\"\uE99E\";margin-left:-1em;color:#000;opacity:.6}.icon-file-word:before{content:\"\uE99F\"}.icon-filter-alt:before{content:\"\uE9A0\"}.icon-flammable .path1:before{content:\"\uE9A1\";color:#323232}.icon-flammable .path2:before{content:\"\uE9A2\";margin-left:-1em;color:#323232}.icon-flammable .path3:before{content:\"\uE9A3\";margin-left:-1em;color:#e32730}.icon-gas-under-pressure .path1:before{content:\"\uE9A4\";color:#323232}.icon-gas-under-pressure .path2:before{content:\"\uE9A5\";margin-left:-1em;color:#e32730}.icon-health-hazard .path1:before{content:\"\uE9A6\";color:#323232}.icon-health-hazard .path2:before{content:\"\uE9A7\";margin-left:-1em;color:#e32730}.icon-line-break:before{content:\"\uE9A8\"}.icon-location:before{content:\"\uE9A9\"}.icon-measure-add:before{content:\"\uE9AA\"}.icon-measure-edit:before{content:\"\uE9AB\"}.icon-measure-view:before{content:\"\uE9AC\";color:#666}.icon-messages:before{content:\"\uE9AD\"}.icon-monitoring:before{content:\"\uE9AE\";color:#666}.icon-move:before{content:\"\uE9AF\"}.icon-oxidizing .path1:before{content:\"\uE9B0\";color:#e32730}.icon-oxidizing .path2:before{content:\"\uE9B1\";margin-left:-1em;color:#323232}.icon-oxidizing .path3:before{content:\"\uE9B2\";margin-left:-1em;color:#323232}.icon-oxidizing .path4:before{content:\"\uE9B3\";margin-left:-1em;color:#323232}.icon-process-area-closed:before{content:\"\uE9B4\"}.icon-process-area-open:before{content:\"\uE9B5\"}.icon-process-linked .path1:before{content:\"\uE9B6\";color:#000;opacity:.6}.icon-process-linked .path2:before{content:\"\uE9B7\";margin-left:-1em;color:#666}.icon-risk:before{content:\"\uE9B8\"}.icon-search-in-file:before{content:\"\uE9B9\"}.icon-sort-ascending:before{content:\"\uE9BA\"}.icon-sort-descending:before{content:\"\uE9BB\"}.icon-subscript:before{content:\"\uE9BC\"}.icon-superscript:before{content:\"\uE9BD\"}.icon-syncronice-favorites:before{content:\"\uE9BE\"}.icon-system-settings:before{content:\"\uE9BF\"}.icon-view-three-outlined:before{content:\"\uE9C0\"}.icon-workplace-safety:before{content:\"\uE9C1\"}.icon-checklist:before{content:\"\uE900\"}.icon-department-document .path1:before{content:\"\uE901\";color:#000;opacity:.6}.icon-department-document .path2:before{content:\"\uE902\";margin-left:-1em;color:#00804c}.icon-department-folder-closed .path1:before{content:\"\uE903\";color:#000;opacity:.6}.icon-department-folder-closed .path2:before{content:\"\uE904\";margin-left:-1em;color:#00804c}.icon-department-folder-open .path1:before{content:\"\uE905\";color:#000;opacity:.6}.icon-department-folder-open .path2:before{content:\"\uE906\";margin-left:-1em;color:#00804c}.icon-deviation:before{content:\"\uE907\"}.icon-dropdown-folder .path1:before{content:\"\uE908\";color:#00324e}.icon-dropdown-folder .path2:before{content:\"\uE909\";margin-left:-1em;color:#fff;opacity:.6}.icon-enterprise-document .path1:before{content:\"\uE90A\";color:#000;opacity:.6}.icon-enterprise-document .path2:before{content:\"\uE90B\";margin-left:-1em;color:#cf4714}.icon-enterprise-folder-closed .path1:before{content:\"\uE90C\";color:#000;opacity:.6}.icon-enterprise-folder-closed .path2:before{content:\"\uE90D\";margin-left:-1em;color:#cf4714}.icon-enterprise-folder-open .path1:before{content:\"\uE90E\";color:#000;opacity:.6}.icon-enterprise-folder-open .path2:before{content:\"\uE90F\";margin-left:-1em;color:#cf4714}.icon-folder-closed:before{content:\"\uE910\"}.icon-folder-open:before{content:\"\uE911\"}.icon-keyboard_arrow_down:before{content:\"\uE912\"}.icon-keyboard_arrow_up:before{content:\"\uE913\"}.icon-local-document .path1:before{content:\"\uE914\";color:#000;opacity:.6}.icon-local-document .path2:before{content:\"\uE915\";margin-left:-1em;color:#1954a9}.icon-local-folder-closed .path1:before{content:\"\uE916\";color:#000;opacity:.6}.icon-local-folder-closed .path2:before{content:\"\uE917\";margin-left:-1em;color:#1954a9}.icon-local-folder-open .path1:before{content:\"\uE918\";color:#000;opacity:.6}.icon-local-folder-open .path2:before{content:\"\uE919\";margin-left:-1em;color:#1954a9}.icon-process:before{content:\"\uE91A\"}.icon-regional-document .path1:before{content:\"\uE91C\";color:#000;opacity:.6}.icon-regional-document .path2:before{content:\"\uE91D\";margin-left:-1em;color:#662e0d}.icon-regional-folder-closed .path1:before{content:\"\uE91E\";color:#000;opacity:.6}.icon-regional-folder-closed .path2:before{content:\"\uE91F\";margin-left:-1em;color:#662e0d}.icon-regional-folder-open .path1:before{content:\"\uE920\";color:#000;opacity:.6}.icon-regional-folder-open .path2:before{content:\"\uE921\";margin-left:-1em;color:#662e0d}.qms-select-department-tree-container{font-family:Open Sans,sans-serif}.qms-select-department-tree-container .mr10{margin-right:10px}.qms-select-department-tree-container .mt5{margin-bottom:5px}.qms-select-department-tree-container .mb5{margin-top:5px}.qms-select-department-tree-container .w100{width:100%}.qms-select-department-tree-container .h100{height:100%}.qms-select-department-tree-container .fw500{font-weight:500!important}.qms-select-department-tree-container .text-right{text-align:right}.qms-select-department-tree-container .mt20{margin-top:20px}.qms-select-department-tree-container .d-flex{display:flex}.qms-select-department-tree-container .align-items-center{align-items:center}.qms-select-department-tree-container .justify-content-end{justify-content:flex-end}.qms-select-department-tree-container .text-selected{color:rgba(0,0,0,.6);font-size:12px;line-height:16px;margin-top:1rem}.qms-select-department-tree-container .input-field{display:flex;align-items:center;position:relative}.qms-select-department-tree-container .input-field ::ng-deep .mat-form-field-wrapper{padding-bottom:8px!important}.qms-select-department-tree-container .input-field ::ng-deep .mat-form-field-underline{bottom:8px!important}.qms-select-department-tree-container .input-field input.input-search{width:100%;padding:10px;outline:none;border:none;background:var(--background-input-text)}.qms-select-department-tree-container .input-field .btn-search{cursor:pointer;vertical-align:middle;position:absolute;top:50%;right:10px;transform:translateY(-50%)}.qms-select-department-tree-container .input-field .line__divider{border-bottom:1px solid #ccc;height:1px;margin-top:10px;min-width:300px;max-width:100%}.qms-select-department-tree-container .header-title{font-weight:500;color:var(--ws-text-primary);font-size:16px;display:flex;align-items:center}.qms-select-department-tree-container .header-title .header-view{padding:4px 0}.qms-select-department-tree-container .sticky-position{position:-webkit-sticky;position:sticky;top:0;left:0;z-index:1;background:#fff}.qms-select-department-tree-container .header-view-tree{display:grid;grid-template-columns:1fr 200px;grid-column-gap:2px;-moz-column-gap:2px;column-gap:2px;padding:4px 12px 4px 0}.qms-select-department-tree-container .header-view-tree .header-view:first-child{padding-left:12px}.qms-select-department-tree-container .tree-department-wrapper{padding-right:4px;overflow:hidden;position:relative;transition:height .3s ease-in-out}.qms-select-department-tree-container .tree-department-wrapper .tree-view.active-mode-external-view{width:100%;display:grid;grid-template-columns:1fr 200px;grid-column-gap:2px;-moz-column-gap:2px;column-gap:2px}.qms-select-department-tree-container .tree-department-wrapper .tree-view.active-mode-external-view .tree-view-main>.separate{height:38px}.qms-select-department-tree-container .tree-department-wrapper .tree-view.active-mode-external-view .tree-view-main>.separate.h-0{height:0}.qms-select-department-tree-container .tree-department-wrapper .tree-view.active-mode-external-view .tree-view-main:last-child{height:100%;padding-left:4px;position:relative}.qms-select-department-tree-container .tree-department-wrapper .tree-view.active-mode-external-view .tree-view-main:last-child:after{position:absolute;content:\"\";top:0;bottom:-38px;left:0;width:1px;background:rgba(0,0,0,.12)}.qms-select-department-tree-container .tree-department-wrapper .tree-view.active-mode-external-view .tree-view-main .external-list-item-container .node-external{overflow:hidden;transition:all .1s ease-in-out}.qms-select-department-tree-container .tree-department-wrapper .tree-view.active-mode-external-view .tree-view-main .external-list-item-container .node-external .node-external-content{padding:5px 15px;height:calc(100% - 2px);color:var(--default-color);font-size:14px;display:flex;align-items:center}.qms-select-department-tree-container .tree-department-wrapper .tree-view.active-mode-external-view .tree-view-main .external-list-item-container .node-external .node-external-content span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.qms-select-department-tree-container .mask-overlay{z-index:1000;background-color:rgba(34,33,33,.1);position:absolute;top:0;left:0;width:100%;height:100%;border-radius:4px;overflow:hidden;display:grid;place-items:center}.qms-select-department-tree-container .select-department-tree>.cdk-virtual-scroll-orientation-vertical .cdk-virtual-scroll-content-wrapper{padding:0 4px!important}.qms-select-department-tree-container .select-department-tree .qms-tree-node{display:flex;align-items:center;border-radius:4px}.qms-select-department-tree-container .select-department-tree .qms-tree-node:hover{background-color:rgba(0,0,0,.08)}.qms-select-department-tree-container .select-department-tree .qms-tree-node>.node-expand-area{width:48px;height:48px;position:relative}.qms-select-department-tree-container .select-department-tree .qms-tree-node.active-external-view .mat-checkbox.qms-group-options{width:calc(100% - 250px)}.qms-select-department-tree-container .select-department-tree .qms-tree-node.node-loading{background:var(--primary-light-6-opacity)}.qms-select-department-tree-container .select-department-tree .qms-tree-node>.external-view-node{flex-basis:200px;overflow:hidden}.qms-select-department-tree-container .select-department-tree .qms-tree-node>.external-view-node .node-external{overflow:hidden;transition:all .1s ease-in-out;display:block}.qms-select-department-tree-container .select-department-tree .qms-tree-node>.external-view-node .node-external .node-external-content{padding:5px 15px;height:calc(100% - 2px);color:var(--default-color);font-size:14px;display:flex;align-items:center}.qms-select-department-tree-container .select-department-tree .qms-tree-node>.external-view-node .node-external .node-external-content span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.qms-select-department-tree-container .select-department-tree .qms-tree-node.expand-node{color:var(--primary)}.qms-select-department-tree-container .select-department-tree .qms-tree-node.expand-node:hover{background:var(--primary-light-6-opacity)}.qms-select-department-tree-container .select-department-tree .qms-tree-node.expand-node:active{background:var(--primary-light-12-opacity)}.qms-select-department-tree-container .select-department-tree .qms-tree-node.expand-node .mat-icon{color:var(--primary)}.qms-select-department-tree-container .select-department-tree .qms-tree-node .node-without-checkbox{cursor:pointer;width:100%;display:flex;justify-content:space-between;align-items:center}.qms-select-department-tree-container .select-department-tree .qms-tree-node .node-without-checkbox .mat-icon{color:var(--primary);margin-right:4px}.qms-select-department-tree-container .select-department-tree .qms-tree-node.selected-theme{background:var(--primary-light-12-opacity)}.qms-select-department-tree-container .select-department-tree .qms-tree-node.mat-tree-node-disabled-all{cursor:default!important;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.qms-select-department-tree-container .select-department-tree .qms-tree-node.mat-tree-node-disabled-all .mat-icon-rtl-mirror,.qms-select-department-tree-container .select-department-tree .qms-tree-node.mat-tree-node-disabled-all .type-icon,.qms-select-department-tree-container .select-department-tree .qms-tree-node.mat-tree-node-disabled-all button.mat-button-disabled{color:rgba(0,0,0,.38)}.qms-select-department-tree-container .select-department-tree .qms-tree-node.mat-tree-node-disabled-all .text-name.disabled{color:rgba(0,0,0,.38);cursor:default!important;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.qms-select-department-tree-container .select-department-tree .qms-tree-node.mat-tree-node-disabled-all.active{background-color:transparent}.qms-select-department-tree-container .text-name{position:relative;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;cursor:pointer;width:100%}.qms-select-department-tree-container .cursor-pointer{cursor:pointer}.qms-select-department-tree-container .ml5{margin-left:15px!important}.qms-select-department-tree-container .pl-10{padding-left:10px}.qms-select-department-tree-container ::ng-deep .mat-checkbox.qms-group-options.flex-direction-row .mat-checkbox-layout{white-space:normal}.qms-select-department-tree-container ::ng-deep .mat-checkbox.qms-group-options.flex-direction-row .node-text>span{display:block}.qms-select-department-tree-container ::ng-deep .mat-checkbox.qms-group-options.flex-direction-row .mat-checkbox-label{flex-direction:row;align-items:center;position:relative;padding-bottom:2px}.qms-select-department-tree-container .qms-view-search-result{width:100%;overflow:hidden}.qms-select-department-tree-container .qms-view-search-result__header{position:relative}.qms-select-department-tree-container .qms-view-search-result__header:after{position:absolute;content:\"\";bottom:0;left:0;width:100%;height:1px;background-color:rgba(0,0,0,.1)}.qms-select-department-tree-container .qms-view-search-result__header .header-title{padding:8px 0;display:inline-block}.qms-select-department-tree-container .qms-view-search-result__header .header-title:first-child{padding-left:12px}.qms-select-department-tree-container .qms-view-search-result__header .header-title:nth-child(2){flex-basis:200px}.qms-select-department-tree-container .qms-view-search-result>.no-result{height:100%;display:flex;justify-content:center;align-items:center}.qms-select-department-tree-container .qms-view-search-result__wrapper{height:calc(100% - 50px);width:100%}.qms-select-department-tree-container .qms-view-search-result__wrapper.active-external{height:calc(100% - 90px)!important}.qms-select-department-tree-container .qms-view-search-result__wrapper .result{max-height:calc(100% - 44px);overflow-y:auto;margin-bottom:4px;padding-right:4px}.qms-select-department-tree-container .qms-view-search-result__wrapper .result.active-paging{max-height:calc(100% - 40px)}.qms-select-department-tree-container .qms-view-search-result__wrapper .result-item{border-radius:4px;display:grid;grid-template-columns:45px 1fr;align-items:center;cursor:pointer;transition:background .3s ease;min-height:40px}.qms-select-department-tree-container .qms-view-search-result__wrapper .result-item:not(:first-child){margin-top:4px!important}.qms-select-department-tree-container .qms-view-search-result__wrapper .result-item.active,.qms-select-department-tree-container .qms-view-search-result__wrapper .result-item:hover{background:linear-gradient(0deg,rgba(1,99,178,.12),rgba(1,99,178,.12)),#fff}.qms-select-department-tree-container .qms-view-search-result__wrapper .result-item__content{display:flex;align-items:center}.qms-select-department-tree-container .qms-view-search-result__wrapper .result-item__content .item-result-content-wraper{padding:5px 15px;width:100%}.qms-select-department-tree-container .qms-view-search-result__wrapper .result-item__content .external-name{flex-basis:200px}.qms-select-department-tree-container .qms-view-search-result__wrapper .result-item__content .external-name span{width:200px;display:inline-block}.qms-select-department-tree-container .qms-view-search-result ::ng-deep .mat-checkbox.qms-group-options{display:flex;height:100%}.qms-select-department-tree-container ::ng-deep .breadcrumb-container{flex-wrap:wrap}.qms-select-department-tree-container ::ng-deep .mat-button-focus-overlay{background-color:transparent}.qms-select-department-tree-container ::ng-deep .qms-breadcrumb-item{margin:0}.qms-select-department-tree-container ::ng-deep .qms-breadcrumb-item-text{white-space:nowrap;text-overflow:ellipsis;overflow:hidden;transition:color .3s ease}.qms-select-department-tree-container ::ng-deep .qms-breadcrumb-item-text:not(:last-child){max-width:150px!important}.qms-select-department-tree-container ::ng-deep .qms-paginator .mat-paginator-container .qms-total-result{margin-bottom:0;margin-right:12px;height:100%;display:flex;align-items:center}.qms-select-department-tree-container ::ng-deep .qms-paginator .mat-paginator-container .qms-total-result span{font-weight:600;color:rgba(0,0,0,.8)}.qms-select-department-tree-container ::ng-deep .qms-paginator .mat-paginator-container .qms-paginator-range-actions{margin-bottom:0;grid-column-gap:2px;-moz-column-gap:2px;column-gap:2px}.qms-select-department-tree-container ::ng-deep .qms-paginator .mat-paginator-container .qms-paginator-range-actions>.qms-total-result{margin-bottom:0}.qms-select-department-tree-container ::ng-deep .qms-paginator .mat-form-field-wrapper{padding-bottom:0}.qms-select-department-tree-container ::ng-deep .qms-paginator .qms-paginator-page-size{align-items:center}.qms-select-department-tree-container .text-gray{color:#242424}.qms-select-department-tree-container .mb0{margin-bottom:0!important}.qms-select-department-tree-container .fs-base{font-size:14px!important}.qms-select-department-tree-container .user-select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.qms-select-department-tree-container .item-breadcrumb-disable{cursor:not-allowed;color:rgba(0,0,0,.6);font-weight:400;font-size:14px;max-width:250px}.qms-select-department-tree-container ::ng-deep .mat-checkbox.checkbox-all .mat-checkbox-label{flex-direction:row;align-items:center;grid-column-gap:4px;-moz-column-gap:4px;column-gap:4px}.qms-select-department-tree-container ::ng-deep .btn-arrow{width:40px;height:40px;line-height:40px}.qms-select-department-tree-container .qms-loading-container{overflow:hidden;display:grid;grid-template-rows:repeat(60px)}.qms-select-department-tree-container .qms-loading-container .qms-loader{position:relative;width:100%;height:100%;padding:10px 0;overflow:hidden}.qms-select-department-tree-container .qms-loading-container .qms-loader:after{content:\"\";position:absolute;width:100%;height:100%;top:0;left:0;background:linear-gradient(110deg,hsla(0,0%,91%,0),hsla(0,0%,89%,0) 40%,hsla(0,0%,89%,.5) 50%,hsla(0,0%,89%,0) 60%,hsla(0,0%,89%,0));-webkit-animation:animate-loading 1.2s linear infinite;animation:animate-loading 1.2s linear infinite}.qms-select-department-tree-container .qms-loading-container .qms-loader__wrapper{position:relative;width:100%;height:100%}.qms-select-department-tree-container .qms-loading-container .qms-loader__wrapper .row-loader{background-color:#eee;position:absolute;left:0;width:100%;height:40px}@-webkit-keyframes animate-loading{0%{transform:translateX(-100%)}to{transform:translateX(100%)}}@keyframes animate-loading{0%{transform:translateX(-100%)}to{transform:translateX(100%)}}.qms-select-department-tree-container .qms-spinner{font-size:20px;position:relative;display:inline-block;width:1em;height:1em}.qms-select-department-tree-container .qms-spinner.center{position:absolute;left:0;right:0;top:0;bottom:0;margin:auto}.qms-select-department-tree-container .mat-spinner circle,.qms-select-department-tree-container ::ng-deep .mat-progress-spinner circle{stroke:#1b75be!important}@media screen and (max-width:600px){.qms-select-department-tree-container .external-view-node{flex-basis:65px!important}.qms-select-department-tree-container .qms-tree-node.active-external-view .mat-checkbox.qms-group-options{width:calc(100% - 110px)!important}.qms-select-department-tree-container .header-view-tree{grid-template-columns:1fr 80px!important}.qms-select-department-tree-container ::ng-deep .cdk-virtual-scroll-content-wrapper{right:0!important}.qms-select-department-tree-container .header-title{font-size:14px!important}.qms-select-department-tree-container .node-external,.qms-select-department-tree-container .text-label,.qms-select-department-tree-container .text-label+span,.qms-select-department-tree-container .text-name{font-size:12px}.qms-select-department-tree-container .node-expand-area{width:30px!important;height:30px!important}.qms-select-department-tree-container .node-expand-area .qms-btn-icon{width:30px;height:30px;line-height:30px}.qms-select-department-tree-container .fs-base{font-size:12px!important}.qms-select-department-tree-container .qms-select-department-tree-container .breadcrumb-container{flex-wrap:nowrap!important}.qms-select-department-tree-container ::ng-deep .qms-breadcrumb-item-text{font-size:12px!important;max-width:175px!important}.qms-select-department-tree-container ::ng-deep .qms-paginator .mat-paginator-container .qms-total-result{display:none!important}.qms-select-department-tree-container ::ng-deep .qms-paginator .size-small .mat-paginator-container{justify-content:center!important}.qms-select-department-tree-container .qms-view-search-result__header>.header-title:nth-child(2){flex-basis:120px!important}.qms-select-department-tree-container .result-item__content .external-name{flex-basis:75px!important}.qms-select-department-tree-container .result-item__content .external-name span{width:75px!important}}"]
1104
+ },] }
1105
+ ];
1106
+ SelectProcessDataTreeComponent.ctorParameters = () => [
1107
+ { type: ChangeDetectorRef },
1108
+ { type: DomSanitizer },
1109
+ { type: QMSIconRegistryService },
1110
+ { type: MatIconRegistry },
1111
+ { type: ElementRef },
1112
+ { type: TranslateLibraryService },
1113
+ { type: Overlay },
1114
+ { type: ViewContainerRef },
1115
+ { type: QMSSelectDepartmentTreeGlobalService }
1116
+ ];
1117
+ SelectProcessDataTreeComponent.propDecorators = {
1118
+ rowsSkeleton: [{ type: Input }],
1119
+ height: [{ type: Input }],
1120
+ config: [{ type: Input }],
1121
+ onSearchEvent: [{ type: Output }],
1122
+ onPagingSearchEvent: [{ type: Output }],
1123
+ onValueChangeEvent: [{ type: Output }],
1124
+ selectionNodeChangeEvent: [{ type: Output }],
1125
+ onCheckNodeEvent: [{ type: Output }],
1126
+ onExpandNodeEvent: [{ type: Output }],
1127
+ onLoadMoreEvent: [{ type: Output }],
1128
+ onCheckItemSearchEvent: [{ type: Output }],
1129
+ onCheckAllItemSearchEvent: [{ type: Output }],
1130
+ toggleIncludeChildEvent: [{ type: Output }],
1131
+ cdkVirtualScrollViewport: [{ type: ViewChild, args: [CdkVirtualScrollViewport,] }],
1132
+ paginatorSearch: [{ type: ViewChild, args: ['paginatorSearch',] }]
1133
+ };
1134
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LXByb2Nlc3MtZGF0YS10cmVlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Ftcy1hbmd1bGFyL3NyYy9saWIvY29tcG9uZW50cy9zZWxlY3QtcHJvY2Vzcy1kYXRhLXRyZWUvc2VsZWN0LXByb2Nlc3MtZGF0YS10cmVlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzFELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMvQyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNsRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDcEQsT0FBTyxFQUFtQyx1QkFBdUIsRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNyTSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRXpELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2pGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN6RCxPQUFPLEtBQUssQ0FBQyxNQUFNLFFBQVEsQ0FBQztBQUM1QixPQUFPLEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBYyxFQUFFLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM5RSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLFNBQVMs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QztRQUNyRSxJQUFJLFVBQVUsRUFBRTtZQUNkLFVBQVUsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUN4QyxVQUFVLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDO1NBQ3pEO0lBQ0gsQ0FBQztJQUVELG9CQUFvQixDQUFDLElBQXFCO1FBQ3hDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckMsNkJBQTZCO0lBQy9CLENBQUM7OztZQWpxQ0YsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSw4QkFBOEI7Z0JBQ3hDLDYxY0FBd0Q7Z0JBRXhELFVBQVUsRUFBRTtvQkFDVix1QkFBdUI7aUJBQ3hCO2dCQUNELGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNOzthQUNoRDs7O1lBaENrRSxpQkFBaUI7WUFLM0UsWUFBWTtZQU9aLHNCQUFzQjtZQVZ0QixlQUFlO1lBRnlFLFVBQVU7WUFXbEcsdUJBQXVCO1lBZHZCLE9BQU87WUFHNkksZ0JBQWdCO1lBZTRCLG9DQUFvQzs7OzJCQXNCMU8sS0FBSztxQkFHTCxLQUFLO3FCQUNMLEtBQUs7NEJBZ0JMLE1BQU07a0NBQ04sTUFBTTtpQ0FDTixNQUFNO3VDQUNOLE1BQU07K0JBQ04sTUFBTTtnQ0FDTixNQUFNOzhCQUNOLE1BQU07cUNBQ04sTUFBTTt3Q0FDTixNQUFNO3NDQUNOLE1BQU07dUNBRU4sU0FBUyxTQUFDLHdCQUF3Qjs4QkFDbEMsU0FBUyxTQUFDLGlCQUFpQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNlbGVjdGlvbk1vZGVsIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvbGxlY3Rpb25zJztcbmltcG9ydCB7IE92ZXJsYXkgfSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XG5pbXBvcnQgeyBDZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQgfSBmcm9tICdAYW5ndWxhci9jZGsvc2Nyb2xsaW5nJztcbmltcG9ydCB7IEZsYXRUcmVlQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay90cmVlJztcbmltcG9ydCB7IEFmdGVyQ29udGVudEluaXQsIEFmdGVyVmlld0luaXQsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCwgVmlld0NoaWxkLCBWaWV3Q29udGFpbmVyUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE1hdEljb25SZWdpc3RyeSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xuaW1wb3J0IHsgUGFnZUV2ZW50IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcGFnaW5hdG9yJztcbmltcG9ydCB7IE1hdFRyZWVGbGF0RGF0YVNvdXJjZSwgTWF0VHJlZUZsYXR0ZW5lciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3RyZWUnO1xuaW1wb3J0IHsgRG9tU2FuaXRpemVyIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIG1lcmdlLCBPYnNlcnZhYmxlLCBvZiwgU3ViamVjdCwgdGltZXIgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRlbGF5LCBmaWx0ZXIsIG1hcCwgcGFpcndpc2UsIHN3aXRjaE1hcCwgdGFrZVVudGlsLCB0YXAsIHRocm90dGxlVGltZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFFNU0ZsYXROb2RlVHJlZSB9IGZyb20gJy4uLy4uL2NvbW1vbi9tb2RlbHMvcW1zLWZsYXQtbm9kZS5tb2RlbCc7XG5pbXBvcnQgeyBRTVNUcmVlTm9kZSB9IGZyb20gJy4uLy4uL2NvbW1vbi9tb2RlbHMvcW1zLXRyZWUtbm9kZS5tb2RlbCc7XG5pbXBvcnQgeyBUcmFuc2xhdGVMaWJyYXJ5U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3RyYW5zbGF0aW9uLXJlZ2lzdHJ5LnNlcnZpY2UnO1xuaW1wb3J0IHsgUU1TSWNvblJlZ2lzdHJ5U2VydmljZSB9IGZyb20gJy4uL2FwcC1pY29uL2ljb24tcmVnaXN0cnkuc2VydmljZSc7XG5pbXBvcnQgeyBQYWdpbmF0aW9uU2l6ZSwgUU1TUGFnaW5hdG9yQ29tcG9uZW50IH0gZnJvbSAnLi4vcW1zLXBhZ2luYXRvcic7XG5pbXBvcnQgeyBJdGVtSWNvblR5cGUgfSBmcm9tICcuLi9yZWxhdGVkL2NvbW1vbi9pdGVtLWljb24tdHlwZS5lbnVtJztcbmltcG9ydCB7IEFuaW1hdGlvblRyZWVEZXBhcnRtZW50LCBEZXBhcnRtZW50TG9jYXRpb25CcmVhZENydW1iLCBEZXBhcnRtZW50U2VhcmNoUmVzdWx0TW9kZWwsIElTZWxlY3Rpb25Ob2RlQ2hhbmdlLCBNb2RlRGVwYXJ0bWVudFRyZWVlVmlld0VudW0sIFFNU0RlcGFydG1lbnRQYWdpbmdNb2RlbCwgUU1TU2VsZWN0RGVwYXJ0bWVudFRyZWVDb25maWcsIFFNU1NlbGVjdERlcGFydG1lbnRUcmVlR2xvYmFsU2VydmljZSB9IGZyb20gJy4uL3NlbGVjdC1kZXBhcnRtZW50LXRyZWUnO1xuXG5pbnRlcmZhY2UgSUhhbmRsaW5nRXZlbnRMYXp5IHtcbiAgY2hlY2tBbGxTZWFyY2g6IGJvb2xlYW47XG4gIGNoZWNrSXRlbVNlYXJjaDogYm9vbGVhbjtcbiAgY2hlY2tOb2RlOiBib29sZWFuO1xuICBleHBhbmQ6IGJvb2xlYW47XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3Ftcy1zZWxlY3QtcHJvY2Vzcy1kYXRhLXRyZWUnLFxuICB0ZW1wbGF0ZVVybDogJy4vc2VsZWN0LXByb2Nlc3MtZGF0YS10cmVlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vc2VsZWN0LXByb2Nlc3MtZGF0YS10cmVlLmNvbXBvbmVudC5zY3NzJ10sXG4gIGFuaW1hdGlvbnM6IFtcbiAgICBBbmltYXRpb25UcmVlRGVwYXJ0bWVudFxuICBdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgU2VsZWN0UHJvY2Vzc0RhdGFUcmVlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBBZnRlckNvbnRlbnRJbml0IHtcbiAgTEFORzogYW55O1xuICByZWFkb25seSBzcGlubmVyQXJyID0gbmV3IEFycmF5KDEyKS5maWxsKDApO1xuICBhcnJTa2VsZXRvbiA9IG5ldyBBcnJheSg2KS5maWxsKDApO1xuICBASW5wdXQoKSBzZXQgcm93c1NrZWxldG9uKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLmFyclNrZWxldG9uID0gbmV3IEFycmF5KHZhbHVlKS5maWxsKDApO1xuICB9XG4gIEBJbnB1dCgpIGhlaWdodDogc3RyaW5nID0gJzUwdmgnO1xuICBASW5wdXQoKSBjb25maWc6IFFNU1NlbGVjdERlcGFydG1lbnRUcmVlQ29uZmlnID0gbmV3IFFNU1NlbGVjdERlcGFydG1lbnRUcmVlQ29uZmlnKCk7XG4gIGlzSW5jbHVkZUNoaWxkcmVuOiBib29sZWFuID0gZmFsc2U7XG4gIGdldCBkZXBhcnRtZW50Um9vdHMoKSB7XG4gICAgaWYgKCF0aGlzLnRyZWVDb250cm9sKVxuICAgICAgcmV0dXJuO1xuICAgIHJldHVybiB0aGlzLnRyZWVDb250cm9sLmRhdGFOb2Rlcy5maWx0ZXIobm9kZSA9PiBub2RlLmxldmVsID09PSAwKTtcbiAgfVxuXG4gIGdldCBpc0FsbERlcGFydG1lbnRTZWxlY3RlZCgpIHtcbiAgICByZXR1cm4gISF0aGlzLnRyZWVDb250cm9sICYmIHRoaXMudHJlZUNvbnRyb2wuZGF0YU5vZGVzLmV2ZXJ5KG5vZGUgPT4gdGhpcy5pc1NlbGVjdGVkTm9kZShub2RlKSk7XG4gIH1cblxuICBnZXQgaXNJbmRldGVybWluYXRlQ2hlY2tib3hBbGxUcmVlKCkge1xuICAgIHJldHVybiAhdGhpcy5pc0FsbERlcGFydG1lbnRTZWxlY3RlZCAmJiB0aGlzLmNoZWNrTGlzdFNlbGVjdGlvbi5zZWxlY3RlZC5sZW5ndGggPiAwO1xuICB9XG5cbiAgQE91dHB1dCgpIG9uU2VhcmNoRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQE91dHB1dCgpIG9uUGFnaW5nU2VhcmNoRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPFBhZ2VFdmVudD4oKTtcbiAgQE91dHB1dCgpIG9uVmFsdWVDaGFuZ2VFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8UU1TVHJlZU5vZGVbXT4oKTtcbiAgQE91dHB1dCgpIHNlbGVjdGlvbk5vZGVDaGFuZ2VFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8SVNlbGVjdGlvbk5vZGVDaGFuZ2U8UU1TVHJlZU5vZGU+PigpO1xuICBAT3V0cHV0KCkgb25DaGVja05vZGVFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8UU1TRmxhdE5vZGVUcmVlPigpO1xuICBAT3V0cHV0KCkgb25FeHBhbmROb2RlRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPFFNU0ZsYXROb2RlVHJlZT4oKTtcbiAgQE91dHB1dCgpIG9uTG9hZE1vcmVFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIG9uQ2hlY2tJdGVtU2VhcmNoRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPHsgc3RhdGU6IGJvb2xlYW4sIGl0ZW06IERlcGFydG1lbnRTZWFyY2hSZXN1bHRNb2RlbCB9PigpO1xuICBAT3V0cHV0KCkgb25DaGVja0FsbEl0ZW1TZWFyY2hFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcbiAgQE91dHB1dCgpIHRvZ2dsZUluY2x1ZGVDaGlsZEV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gIEBWaWV3Q2hpbGQoQ2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0KSBjZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQ6IENka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydDtcbiAgQFZpZXdDaGlsZCgncGFnaW5hdG9yU2VhcmNoJykgcGFnaW5hdG9yU2VhcmNoOiBRTVNQYWdpbmF0b3JDb21wb25lbnQ7XG5cbiAgcmVhZG9ubHkgTU9ERV9WSUVXX0VOVU0gPSBNb2RlRGVwYXJ0bWVudFRyZWVlVmlld0VudW07XG4gIElURU1fU0laRSA9IDUwO1xuICByZWFkb25seSBuZ1Vuc3Vic2NyaWJlID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgcmVzdWx0U2VhcmNoU2VsZWN0ZWQ6IFFNU1RyZWVOb2RlW10gPSBbXTtcbiAgcmVzdWx0U2VsZWN0ZWQ6IFFNU1RyZWVOb2RlW10gPSBbXTtcbiAgcmVhZG9ubHkgZ2V0RGF0YVRyZWUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxRTVNUcmVlTm9kZVtdPihbXSk7XG4gIHJlYWRvbmx5IHNlYXJjaERlcGFydG1lbnQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxRTVNEZXBhcnRtZW50UGFnaW5nTW9kZWw8UU1TRmxhdE5vZGVUcmVlPj4obmV3IFFNU0RlcGFydG1lbnRQYWdpbmdNb2RlbDxRTVNGbGF0Tm9kZVRyZWU+KCkpO1xuICByZXN1bHRTZWFyY2g6IERlcGFydG1lbnRTZWFyY2hSZXN1bHRNb2RlbFtdID0gW107XG5cbiAgZ2V0IGN1cnJlbnRUcmVlRGF0YSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXREYXRhVHJlZSQuZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIGdldCBpc1NlbGVjdEFsbFJlc3VsdFNlYXJjaCgpIHtcbiAgICByZXR1cm4gdGhpcy5yZXN1bHRTZWFyY2gubGVuZ3RoICYmIHRoaXMucmVzdWx0U2VhcmNoLmV2ZXJ5KHggPT4gdGhpcy5jaGVja0xpc3RTZWxlY3Rpb25TZWFyY2guaXNTZWxlY3RlZCh4KSk7XG4gIH1cblxuICBnZXQgaW5kZXRlcm1pbmF0ZVNlYXJjaFJlc3VsdCgpIHtcbiAgICByZXR1cm4gIXRoaXMuaXNTZWxlY3RBbGxSZXN1bHRTZWFyY2ggJiYgISF0aGlzLnJlc3VsdFNlYXJjaC5sZW5ndGggJiYgdGhpcy5yZXN1bHRTZWFyY2guc29tZSh4ID0+IHRoaXMuY2hlY2tMaXN0U2VsZWN0aW9uU2VhcmNoLmlzU2VsZWN0ZWQoeCkpO1xuICB9XG5cbiAgcmVhZG9ubHkgZ2V0SW5kZXhWaWV3JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPigwKTtcbiAgcmVhZG9ubHkgc2Nyb2xsVG9Ob2RlRXZlbnQkID0gbmV3IFN1YmplY3Q8c3RyaW5nPigpO1xuICByZWFkb25seSBnZXRBY3RpdmVOb2RlRXZlbnQkID0gbmV3IFN1YmplY3Q8c3RyaW5nPigpO1xuICBhY3RpdmVOb2RlOiBzdHJpbmcgPSAnJztcblxuICByZWFkb25seSBQQUdJTkFUSU9OX1NJWkUgPSBQYWdpbmF0aW9uU2l6ZTtcbiAgUEFHRV9TSVpFX09QVElPTjogbnVtYmVyW10gPSBbNSwgMTAsIDE1LCAyMCwgMjUsIDEwMF07XG4gIENVUlJFTlRfUEFHRVNJWkU6IG51bWJlciA9IDEwO1xuICByZWFkb25seSBuZXN0ZWRUcmVlTm9kZU1hcCA9IG5ldyBNYXA8UU1TVHJlZU5vZGUsIFFNU0ZsYXROb2RlVHJlZT4oKTtcbiAgcmVhZG9ubHkgZmxhdFRyZWVOb2RlTWFwID0gbmV3IE1hcDxRTVNGbGF0Tm9kZVRyZWUsIFFNU1RyZWVOb2RlPigpO1xuICByZWFkb25seSBjaGVja0xpc3RTZWxlY3Rpb24gPSBuZXcgU2VsZWN0aW9uTW9kZWw8UU1TRmxhdE5vZGVUcmVlPih0cnVlKTtcbiAgcmVhZG9ubHkgY2hlY2tMaXN0U2VsZWN0aW9uU2VhcmNoID0gbmV3IFNlbGVjdGlvbk1vZGVsPERlcGFydG1lbnRTZWFyY2hSZXN1bHRNb2RlbD4odHJ1ZSk7XG4gIHRyZWVDb250cm9sOiBGbGF0VHJlZUNvbnRyb2w8UU1TRmxhdE5vZGVUcmVlPjtcbiAgdHJlZUZsYXR0ZW5lcjogTWF0VHJlZUZsYXR0ZW5lcjxRTVNUcmVlTm9kZSwgUU1TRmxhdE5vZGVUcmVlPjtcbiAgZGF0YVNvdXJjZTogTWF0VHJlZUZsYXREYXRhU291cmNlPFFNU1RyZWVOb2RlLCBRTVNGbGF0Tm9kZVRyZWU+O1xuXG4gIGRhdGFTb3VyY2VUcmVlU2VhcmNoOiBNYXRUcmVlRmxhdERhdGFTb3VyY2U8UU1TVHJlZU5vZGUsIFFNU0ZsYXROb2RlVHJlZT47XG4gIHByaXZhdGUgX3NlbGVjdGVkTGlzdDogUU1TVHJlZU5vZGVbXSA9IFtdO1xuICBwcml2YXRlIHJlYWRvbmx5IHNlbGVjdGVkTGlzdEFmdGVyRGF0YU5vZGVDaGFuZ2UkID0gbmV3IFN1YmplY3Q8UU1TRmxhdE5vZGVUcmVlW10+KCk7XG5cbiAgZm9ybVNlYXJjaENvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woJycpO1xuICByZWFkb25seSBnZXRMb2FkaW5nJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICByZWFkb25seSBnZXRMb2FkaW5nTW9yZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KHRydWUpO1xuICByZWFkb25seSB1bnRpbERlc3Ryb3lMb2FkTW9yZSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICByZWFkb25seSBvbkJlZm9yZUluaXROb2RlU2VsZWN0ZWQkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICByZWFkb25seSB0ZXh0U2VhcmNoU3ViamVjdCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4oJycpO1xuICBpdGVtSWNvblR5cGUgPSBJdGVtSWNvblR5cGU7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3RyYW5zZm9ybWVyID0gKG5vZGU6IFFNU1RyZWVOb2RlLCBsZXZlbDogbnVtYmVyKSA9PiB7XG4gICAgY29uc3QgZmxhdE5vZGUgPSB0aGlzLmNvbnZlcnRUb0ZsYXROb2RlKG5vZGUpIHx8IG5ldyBRTVNGbGF0Tm9kZVRyZWUoKTtcbiAgICBmbGF0Tm9kZS5pZCA9IG5vZGUuaWQ7XG4gICAgZmxhdE5vZGUubmFtZSA9IG5vZGUubmFtZTtcbiAgICBmbGF0Tm9kZS5leHBhbmRhYmxlID0gKG5vZGUuY2hpbGRyZW4gJiYgbm9kZS5jaGlsZHJlbi5sZW5ndGggPiAwKSB8fCAoISFub2RlLmNoaWxkQ291bnQpIHx8IG5vZGUuZXhwYW5kYWJsZTtcbiAgICBmbGF0Tm9kZS5sZXZlbCA9IGxldmVsO1xuICAgIGZsYXROb2RlLnBhcmVudElkID0gbm9kZS5wYXJlbnRJZDtcbiAgICBmbGF0Tm9kZS5tYXJrZWRHZXRDaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW4ubGVuZ3RoID4gMDtcbiAgICBmbGF0Tm9kZS5pdGVtSWNvbiA9IG5vZGUuaXRlbUljb247XG4gICAgZmxhdE5vZGUuaXRlbUljb25TdmcgPSBub2RlLml0ZW1JY29uU3ZnO1xuICAgIGZsYXROb2RlLmlzRmlsZSA9IG5vZGUuaXNGaWxlO1xuICAgIGZsYXROb2RlLmRpc2FibGVkID0gbm9kZS5kaXNhYmxlZDtcbiAgICBmbGF0Tm9kZS5pc0dyb3VwID0gbm9kZS5pc0dyb3VwO1xuICAgIGZsYXROb2RlLmdyb3VwSWQgPSBub2RlLmdyb3VwSWQ7XG4gICAgZmxhdE5vZGUuZXh0ZXJuYWxOYW1lID0gbm9kZS5leHRlcm5hbE5hbWU7XG4gICAgZmxhdE5vZGUuY2hpbGRDb3VudCA9IG5vZGUuY2hpbGRDb3VudDtcbiAgICBmbGF0Tm9kZS5zZWxlY3RlZENoaWxkQ291bnQgPSBub2RlLnNlbGVjdGVkQ2hpbGRDb3VudDtcbiAgICBmbGF0Tm9kZS5tYXJrZWRHZXRDaGlsZENvdW50UmVjdXJyc2l2ZSA9IG5vZGUubWFya2VkR2V0Q2hpbGRDb3VudFJlY3VycnNpdmU7XG4gICAgZmxhdE5vZGUuaXNJbmNsdWRlQ2hpbGRXaGVuQ2hlY2tlZCA9IG5vZGUuaXNJbmNsdWRlQ2hpbGRXaGVuQ2hlY2tlZDtcblxuICAgIHRoaXMuZmxhdFRyZWVOb2RlTWFwLnNldChmbGF0Tm9kZSwgbm9kZSk7XG4gICAgdGhpcy5uZXN0ZWRUcmVlTm9kZU1hcC5zZXQobm9kZSwgZmxhdE5vZGUpO1xuICAgIHJldHVybiBmbGF0Tm9kZTtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgZ2V0TGV2ZWwgPSAobm9kZTogUU1TRmxhdE5vZGVUcmVlKSA9PiBub2RlPy5sZXZlbDtcbiAgcHJpdmF0ZSByZWFkb25seSBfZ2V0Q2hpbGQgPSAobm9kZTogUU1TVHJlZU5vZGUpID0+IG5vZGUuY2hpbGRyZW47XG4gIHByaXZhdGUgcmVhZG9ubHkgaXNFeHBhbmRhYmxlID0gKG5vZGU6IFFNU0ZsYXROb2RlVHJlZSkgPT4gbm9kZS5leHBhbmRhYmxlO1xuICBoYXNDaGlsZCA9IChfOiBudW1iZXIsIG5vZGU6IFFNU0ZsYXROb2RlVHJlZSkgPT4gbm9kZS5leHBhbmRhYmxlO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2hhbmRsaW5nTGF6eU9iamVjdDogSUhhbmRsaW5nRXZlbnRMYXp5ID0ge1xuICAgIGNoZWNrQWxsU2VhcmNoOiBmYWxzZSxcbiAgICBjaGVja0l0ZW1TZWFyY2g6IGZhbHNlLFxuICAgIGNoZWNrTm9kZTogZmFsc2UsXG4gICAgZXhwYW5kOiBmYWxzZVxuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBjZFJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSBkb21TYW5pdGl6ZXI6IERvbVNhbml0aXplcixcbiAgICBwcml2YXRlIGFwcEljb25TZXJ2aWNlOiBRTVNJY29uUmVnaXN0cnlTZXJ2aWNlLFxuICAgIHByaXZhdGUgaWNvblJlZ2lzdHJ5OiBNYXRJY29uUmVnaXN0cnksXG4gICAgcHJpdmF0ZSBlbGVSZWY6IEVsZW1lbnRSZWYsXG4gICAgcHVibGljIHRyYW5zOiBUcmFuc2xhdGVMaWJyYXJ5U2VydmljZSxcbiAgICBwdWJsaWMgb3ZlcmxheTogT3ZlcmxheSxcbiAgICBwdWJsaWMgdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZixcbiAgICBwcml2YXRlIHRyZWVEZXBhcnRtZW50U2VydmljZTogUU1TU2VsZWN0RGVwYXJ0bWVudFRyZWVHbG9iYWxTZXJ2aWNlXG4gICkge1xuICAgIC8vIEluaXQgdHJlZSBkYXRhXG4gICAgdGhpcy5nZXREYXRhVHJlZSRcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpKVxuICAgICAgLnN1YnNjcmliZShkYXRhID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLmRhdGFTb3VyY2UpXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB0aGlzLmRhdGFTb3VyY2UuZGF0YSA9IGRhdGE7XG4gICAgICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfSk7XG4gICAgLy8gUmVnaXN0ZXIgaWNvblxuICAgIGFwcEljb25TZXJ2aWNlLnJlZ2lzdGVyUHJvY2Vzc0ljb24oaWNvblJlZ2lzdHJ5LCBkb21TYW5pdGl6ZXIpO1xuICAgIGFwcEljb25TZXJ2aWNlLnJlZ2lzdGVyUHJvY2Vzc0FyZWFJY29uKGljb25SZWdpc3RyeSwgZG9tU2FuaXRpemVyKTtcbiAgICBhcHBJY29uU2VydmljZS5yZWdpc3RlckRvY3VtZW50SWNvbihpY29uUmVnaXN0cnksIGRvbVNhbml0aXplcik7XG4gICAgYXBwSWNvblNlcnZpY2UucmVnaXN0ZXJGb2xkZXJJY29uKGljb25SZWdpc3RyeSwgZG9tU2FuaXRpemVyKTtcbiAgICBhcHBJY29uU2VydmljZS5yZWdpc3RlckRldmlhdGlvbkljb24oaWNvblJlZ2lzdHJ5LCBkb21TYW5pdGl6ZXIpO1xuICAgIGFwcEljb25TZXJ2aWNlLnJlZ2lzdGVyQ2hlY2tsaXN0SWNvbihpY29uUmVnaXN0cnksIGRvbVNhbml0aXplcik7XG4gICAgYXBwSWNvblNlcnZpY2UucmVnaXN0ZXJSaXNrSWNvbihpY29uUmVnaXN0cnksIGRvbVNhbml0aXplcik7XG5cbiAgICB0aGlzLnRyYW5zLmdldExhbmd1YWdlU3ViamVjdCQucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSkuc3Vic2NyaWJlKChyZXMpID0+IHtcbiAgICAgIGlmIChyZXMpIHtcbiAgICAgICAgdGhpcy5MQU5HID0gdGhpcy50cmFucy5nZXRPYmplY3RMYW5nKHJlcyk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5faGFuZGxlU2VhcmNoRXZlbnQoKTtcbiAgICB0aGlzLl9oYW5kbGVBY3RpdmVOb2RlRXZlbnQoKTtcbiAgICB0aGlzLl9oYW5kbGVJdGVtU2VsZWN0aW9uQ2hhbmdlZCgpO1xuXG4gICAgdGhpcy5nZXRMb2FkaW5nJC5waXBlKFxuICAgICAgdGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSksXG4gICAgICB0YXAocmVzID0+IHtcbiAgICAgICAgcmVzID8gdGhpcy5mb3JtU2VhcmNoQ29udHJvbC5kaXNhYmxlKCkgOiB0aGlzLmZvcm1TZWFyY2hDb250cm9sLmVuYWJsZSgpO1xuICAgICAgfSkpLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgbmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZ2V0TG9hZGluZ01vcmUkLm5leHQoZmFsc2UpO1xuICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZ2V0SW5kZXhWaWV3JC5waXBlKFxuICAgICAgdGFrZVVudGlsKG1lcmdlKHRoaXMubmdVbnN1YnNjcmliZSwgdGhpcy51bnRpbERlc3Ryb3lMb2FkTW9yZSQpKSxcbiAgICAgIHRhcChfID0+IHRoaXMuZ2V0TG9hZGluZ01vcmUkLm5leHQodGhpcy5jb25maWcubGF6eSkpLFxuICAgICAgZGVsYXkoNzAwKSxcbiAgICAgIHRhcCh2YWx1ZSA9PiB7XG4gICAgICAgIHRoaXMuZ2V0TG9hZGluZ01vcmUkLm5leHQoZmFsc2UpO1xuICAgICAgICBpZiAodmFsdWUgPT09IDApXG4gICAgICAgICAgdGhpcy5jZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQgJiZcbiAgICAgICAgICAgIHRoaXMuY2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0LnNjcm9sbGVkSW5kZXhDaGFuZ2VcbiAgICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMudW50aWxEZXN0cm95TG9hZE1vcmUkKSxcbiAgICAgICAgICAgICAgICBtYXAoXyA9PiB0aGlzLmNka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydC5tZWFzdXJlU2Nyb2xsT2Zmc2V0KCdib3R0b20nKSksXG4gICAgICAgICAgICAgICAgcGFpcndpc2UoKSxcbiAgICAgICAgICAgICAgICBmaWx0ZXIoKFt4MSwgeDJdKSA9PiB4MSA+IHgyICYmIHgyIDwgMTQwKSxcbiAgICAgICAgICAgICAgICB0aHJvdHRsZVRpbWUoMjAwKSxcbiAgICAgICAgICAgICAgICB0YXAoXyA9PiB7XG4gICAgICAgICAgICAgICAgICBpZiAodGhpcy5nZXRMb2FkaW5nTW9yZSQudmFsdWUpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5jb25maWcubGF6eSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uRGVzdHJveUxvYWRNb3JlKCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIHRoaXMub25Mb2FkTW9yZUV2ZW50LmVtaXQoKTtcbiAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0TG9hZGluZ01vcmUkLm5leHQodHJ1ZSk7XG4gICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgIC5zdWJzY3JpYmUoKTtcbiAgICAgIH0pKS5zdWJzY3JpYmUoKTtcblxuICAgIHRoaXMub25CZWZvcmVJbml0Tm9kZVNlbGVjdGVkJC5waXBlKFxuICAgICAgdGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSksIHRhcChfID0+IHtcbiAgICAgICAgdGhpcy5faGFuZGxlTGlzdFNlbGVjdGVkKCk7XG4gICAgICAgIHRoaXMuZ2V0TG9hZGluZ01vcmUkLm5leHQoZmFsc2UpO1xuICAgICAgfSkpLnN1YnNjcmliZSgpO1xuICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5pc0luY2x1ZGVDaGlsZHJlbiA9IHRoaXMuY29uZmlnLmlzSW5jbHVkZUNoaWxkcmVuO1xuICAgIHRoaXMuX2luaXRUcmVlRGF0YSgpO1xuICAgIGlmICghdGhpcy5jb25maWcubGF6eSkge1xuICAgICAgdGhpcy5faGFuZGxlTGlzdFNlbGVjdGVkKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vYWN0aW9uIGZvciBsYXp5IGNvbmZpZ1xuICAgIHRoaXMuX2luaXRMaXN0U2VsZWN0ZWQoKTtcbiAgICB0aGlzLl9oYW5kbGVBZnRlckRhdGFOb2RlQ2hhbmdlRXZlbnQoKTtcbiAgICB0aGlzLnNlbGVjdGVkTGlzdEFmdGVyRGF0YU5vZGVDaGFuZ2UkLm5leHQodGhpcy50cmVlQ29udHJvbC5kYXRhTm9kZXMpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5uZ1Vuc3Vic2NyaWJlLm5leHQoKTtcbiAgICB0aGlzLm5nVW5zdWJzY3JpYmUuY29tcGxldGUoKTtcbiAgfVxuXG4gIG9uRGVzdHJveUxvYWRNb3JlKCk6IHZvaWQge1xuICAgIHRoaXMudW50aWxEZXN0cm95TG9hZE1vcmUkLm5leHQoKTtcbiAgICB0aGlzLnVudGlsRGVzdHJveUxvYWRNb3JlJC5jb21wbGV0ZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaW5pdFRyZWVEYXRhKCkge1xuICAgIHRoaXMudHJlZUNvbnRyb2wgPSBuZXcgRmxhdFRyZWVDb250cm9sPFFNU0ZsYXROb2RlVHJlZT4odGhpcy5nZXRMZXZlbCwgdGhpcy5pc0V4cGFuZGFibGUpO1xuICAgIHRoaXMudHJlZUZsYXR0ZW5lciA9IG5ldyBNYXRUcmVlRmxhdHRlbmVyKHRoaXMuX3RyYW5zZm9ybWVyLCB0aGlzLmdldExldmVsLCB0aGlzLmlzRXhwYW5kYWJsZSwgdGhpcy5fZ2V0Q2hpbGQpO1xuICAgIHRoaXMuZGF0YVNvdXJjZSA9IG5ldyBNYXRUcmVlRmxhdERhdGFTb3VyY2UodGhpcy50cmVlQ29udHJvbCwgdGhpcy50cmVlRmxhdHRlbmVyKTtcbiAgICBjb25zdCBfdHJlZURhdGFJbnB1dDogUU1TRmxhdE5vZGVUcmVlW10gPSBfLmNsb25lRGVlcCh0aGlzLmNvbmZpZy50cmVlRGF0YSlcbiAgICBpZiAoIV90cmVlRGF0YUlucHV0Lmxlbmd0aClcbiAgICAgIHJldHVybjtcbiAgICBjb25zdCB0cmVlRGF0YSA9IHRoaXMudHJlZURlcGFydG1lbnRTZXJ2aWNlLmNvbnZlcnRUb1RyZWVEYXRhKF90cmVlRGF0YUlucHV0KTtcbiAgICB0aGlzLnVwZGF0ZURhdGFUcmVlKHRyZWVEYXRhKTtcbiAgICB0aGlzLmdldExvYWRpbmckLm5leHQoZmFsc2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaGFuZGxlTGlzdFNlbGVjdGVkKCkge1xuICAgIGlmICghdGhpcy5jb25maWcuc2VsZWN0ZWRMaXN0Lmxlbmd0aClcbiAgICAgIHJldHVybjtcbiAgICBjb25zdCBzZWxlY3RlZExpc3QgPSB0aGlzLmNvbmZpZy5zZWxlY3RlZExpc3Quc29ydCgoeCwgeSkgPT4geC5pc0dyb3VwID8gLTEgOiB5LmlzR3JvdXAgPyAxIDogMCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWxlY3RlZExpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGl0ZW0gPSBzZWxlY3RlZExpc3RbaV07XG4gICAgICBjb25zdCBub2RlID0gdGhpcy5nZXROb2RlQnlJZChpdGVtLmlkKTtcbiAgICAgIGlmIChub2RlKSB7XG4gICAgICAgIGNvbnN0IG5lc3RlZE5vZGUgPSB0aGlzLmNvbnZlcnRUb05lc3RlZE5vZGUobm9kZSk7XG4gICAgICAgIG5lc3RlZE5vZGUuaXNHcm91cCA9IGl0ZW0uaXNHcm91cDtcbiAgICAgICAgbmVzdGVkTm9kZS5ncm91cElkID0gaXRlbS5ncm91cElkO1xuICAgICAgICB0aGlzLmNoZWNrTGlzdFNlbGVjdGlvbi5zZWxlY3Qobm9kZSk7XG4gICAgICAgIHRoaXMuaGFuZGxlQ2hlY2tOb2RlKG5vZGUpO1xuICAgICAgICB0aGlzLm9uRXhwYW5kQWxsUGFyZW50KG5vZGUpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIHByaXZhdGUgX2luaXRMaXN0U2VsZWN0ZWQoKSB7XG4gICAgdGhpcy5fc2VsZWN0ZWRMaXN0ID0gdGhpcy50cmVlRGVwYXJ0bWVudFNlcnZpY2UuY29udmVydFRvVHJlZURhdGEodGhpcy5jb25maWcuc2VsZWN0ZWRMaXN0KTtcbiAgICAvL0NvbnZlcnQgYXJyYXkgc2VsZWN0ZWRMaXN0IGludG8gbmVzdGVkIGFycmF5IGFzIDEgbGV2ZWwgZm9ybVxuICAgIGNvbnN0IGluZGV4UmVtb3ZlID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9zZWxlY3RlZExpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLl9zZWxlY3RlZExpc3RbaV07XG4gICAgICBjb25zdCByZXN1bHQgPSB0aGlzLnRyZWVEZXBhcnRtZW50U2VydmljZS5nZXREZXNjZW5kYW50c09mTm9kZShpdGVtKTtcbiAgICAgIGl0ZW0uY2hpbGRyZW4gPSByZXN1bHQ7XG4gICAgICBjb25zdCBpbmRleCA9IHRoaXMuX3NlbGVjdGVkTGlzdC5maW5kSW5kZXgoeCA9PiByZXN1bHQuc29tZSh4MSA9PiB4MS5pZCA9PT0geC5pZCkpXG4gICAgICBpZiAoaW5kZXggPCAwKVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIGluZGV4UmVtb3ZlLnB1c2goaW5kZXgpO1xuICAgIH1cbiAgICB0aGlzLl9zZWxlY3RlZExpc3QgPSB0aGlzLl9zZWxlY3RlZExpc3QuZmlsdGVyKChfLCBpbmRleCkgPT4gIWluZGV4UmVtb3ZlLmluY2x1ZGVzKGluZGV4KSk7XG5cbiAgICB0aGlzLnJlc3VsdFNlbGVjdGVkLnB1c2goLi4udGhpcy5fc2VsZWN0ZWRMaXN0KTtcbiAgICB0aGlzLm9uVmFsdWVDaGFuZ2VFdmVudC5lbWl0KHRoaXMucmVzdWx0U2VsZWN0ZWQpO1xuICB9XG5cbiAgLy8gaGFuZGxlIHNlbGVjdGVkIGxpc3Qgd2hlbiBkYXRhIG5vZGVzIGNoYW5nZVxuICBwcml2YXRlIF9oYW5kbGVBZnRlckRhdGFOb2RlQ2hhbmdlRXZlbnQoKSB7XG4gICAgaWYgKHRoaXMuY29uZmlnLmxhenkpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRMaXN0QWZ0ZXJEYXRhTm9kZUNoYW5nZSRcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgdGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSksXG4gICAgICAgICAgdGFwKGRhdGEgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLl9zZWxlY3RlZExpc3QubGVuZ3RoKVxuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB0aGlzLl9zZWxlY3RlZExpc3QuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgICAgaWYgKCFpdGVtLnBhcmVudElkKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuZ2V0Tm9kZUJ5SWQoaXRlbS5pZCk7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUpXG4gICAgICAgICAgICAgICAgICBpdGVtLnBhcmVudElkID0gbm9kZS5wYXJlbnRJZDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IGRhdGFbaV07XG4gICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLl9zZWxlY3RlZExpc3QuZmluZCh4ID0+IHguaWQgPT09IGVsZW1lbnQuaWQgfHwgeC5jaGlsZHJlbj8uc29tZSh4MSA9PiB4MS5pZCA9PT0gZWxlbWVudC5pZCkpO1xuICAgICAgICAgICAgICBpZiAoISFpdGVtKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuZ2V0Tm9kZUJ5SWQoaXRlbS5pZCk7XG4gICAgICAgICAgICAgICAgaWYgKCFub2RlKVxuICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY29uc3QgbmVzdGVkTm9kZSA9IHRoaXMuY29udmVydFRvTmVzdGVkTm9kZShub2RlKTtcbiAgICAgICAgICAgICAgICBuZXN0ZWROb2RlLmlzR3JvdXAgPSBpdGVtLmlzR3JvdXA7XG4gICAgICAgICAgICAgICAgbmVzdGVkTm9kZS5ncm91cElkID0gaXRlbS5ncm91cElkO1xuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tMaXN0U2VsZWN0aW9uLnNlbGVjdChub2RlKTtcbiAgICAgICAgICAgICAgICBjb25zdCBkZXNjZW5kYW50cyA9IHRoaXMuZ2V0TGlzdENoaWxkcmVuT2ZOb2RlKG5vZGUpO1xuICAgICAgICAgICAgICAgIGlmIChub2RlLm1hcmtlZEdldENoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoIWl0ZW0uY2hpbGRyZW4ubGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1TZWxlY3QgPSBkZXNjZW5kYW50cy5maWx0ZXIoeCA9PiBpdGVtLmNoaWxkcmVuLm1hcCh4MSA9PiB4MS5pZCkuaW5jbHVkZXMoeC5pZCkpO1xuICAgICAgICAgICAgICAgICAgaWYgKCFpdGVtU2VsZWN0Lmxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICBpdGVtU2VsZWN0LmZvckVhY2goX2l0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBfbmVzdGVkTm9kZSA9IHRoaXMuY29udmVydFRvTmVzdGVkTm9kZShfaXRlbSk7XG4gICAgICAgICAgICAgICAgICAgIF9uZXN0ZWROb2RlLmdyb3VwSWQgPSBpdGVtLmNoaWxkcmVuWzBdLmdyb3VwSWQ7XG4gICAgICAgICAgICAgICAgICAgIF9uZXN0ZWROb2RlLmlzR3JvdXAgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgdGhpcy5jaGVja0xpc3RTZWxlY3Rpb24uc2VsZWN0KC4uLml0ZW1TZWxlY3QpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pKVxuICAgICAgICAuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgbWV0aG9kIHVzZSBmb3IgbGF6eSBtb2RlLCBkbyBzb21lIHRoaW5nIGJlZm9yZSBpbml0IGxpc3Qgbm9kZSBzZWxlY3RlZFxuICAgKiBAcGFyYW0gY2FsbGJhY2tcbiAgICogQHJldHVybnNcbiAgICovXG4gIGFzeW5jIG9uQmVmb3JlSW5pdE5vZGVTZWxlY3RlZChjYWxsYmFjaz86ICgpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+KSB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZy5sYXp5KVxuICAgICAgcmV0dXJuO1xuICAgIHRoaXMuZ2V0TG9hZGluZ01vcmUkLm5leHQodHJ1ZSk7XG4gICAgaWYgKCEhY2FsbGJhY2spXG4gICAgICBhd2FpdCBjYWxsYmFjaygpO1xuICAgIHRoaXMub25CZWZvcmVJbml0Tm9kZVNlbGVjdGVkJC5uZXh0KCk7XG4gIH1cblxuICAvL0hhbmRsZSBpdGVtIHNlbGVjdGlvbiBjaGFuZ2VkXG4gIHByaXZhdGUgX2hhbmRsZUl0ZW1TZWxlY3Rpb25DaGFuZ2VkKCkge1xuICAgIHRoaXMuY2hlY2tMaXN0U2VsZWN0aW9uLmNoYW5nZWRcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpKVxuICAgICAgLnN1YnNjcmliZSgoeyBhZGRlZCwgcmVtb3ZlZCB9KSA9PiB7XG4gICAgICAgIGNvbnN0IGNoZWNrRXhpc3RJblJlc3VsdCA9IChub2RlOiBRTVNGbGF0Tm9kZVRyZWUgfCBRTVNUcmVlTm9kZSk6IGJvb2xlYW4gPT4gdGhpcy5yZXN1bHRTZWxlY3RlZC5maW5kSW5kZXgoeCA9PiB4LmlkID09PSBub2RlLmlkKSA+IC0xO1xuICAgICAgICBpZiAoYWRkZWQubGVuZ3RoKSB7XG4gICAgICAgICAgYWRkZWQuZm9yRWFjaChub2RlID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG5lc3RlZE5vZGU6IFFNU1RyZWVOb2RlID0gXy5jbG9uZURlZXAodGhpcy5jb252ZXJ0VG9OZXN0ZWROb2RlKG5vZGUpKTtcbiAgICAgICAgICAgIG5lc3RlZE5vZGUuY2hpbGRyZW4gPSBbXTtcbiAgICAgICAgICAgIGlmICghdGhpcy5jb25maWcubGF6eSlcbiAgICAgICAgICAgICAgbmVzdGVkTm9kZS5jaGlsZENvdW50ID0gdGhpcy5nZXRMaXN0Q2hpbGRyZW5PZk5vZGUobm9kZSkubGVuZ3RoO1xuICAgICAgICAgICAgY29uc3QgZXhpc3RHcm91cDogUU1TVHJlZU5vZGUgPSBfLmNsb25lRGVlcChcbiAgICAgICAgICAgICAgdGhpcy5nZXRBbGxQYXJlbnROb2RlKG5vZGUpXG4gICAgICAgICAgICAgICAgLm1hcChpdGVtID0+IHRoaXMuY29udmVydFRvTmVzdGVkTm9kZShpdGVtKSlcbiAgICAgICAgICAgICAgICAucmV2ZXJzZSgpXG4gICAgICAgICAgICAgICAgLmZpbmQoeCA9PiB4LmlzR3JvdXApKTtcbiAgICAgICAgICAgIGlmICghIWV4aXN0R3JvdXApIHtcbiAgICAgICAgICAgICAgY29uc3QgZmxhdEV4aXN0R3JvdXAgPSB0aGlzLmdldE5vZGVCeUlkKGV4aXN0R3JvdXAuaWQpO1xuICAgICAgICAgICAgICBuZXN0ZWROb2RlLmdyb3VwSWQgPSBleGlzdEdyb3VwLmlkO1xuICAgICAgICAgICAgICBjb25zdCBncm91cFJlc3VsdCA9IHRoaXMucmVzdWx0U2VsZWN0ZWQuZmluZCh4ID0+IHguaWQgPT09IGV4aXN0R3JvdXAuaWQpO1xuICAgICAgICAgICAgICBpZiAoZ3JvdXBSZXN1bHQgJiYgIWdyb3VwUmVzdWx0LmNoaWxkcmVuLnNvbWUoeCA9PiB4LmlkID09PSBuZXN0ZWROb2RlLmlkKSkge1xuICAgICAgICAgICAgICAgIGdyb3VwUmVzdWx0LmlzR3JvdXAgPSBleGlzdEdyb3VwLmlzR3JvdXA7XG4gICAgICAgICAgICAgICAgZ3JvdXBSZXN1bHQuY2hpbGRyZW4ucHVzaChuZXN0ZWROb2RlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0aGlzLl9vblNlbGVjdGlvbk5vZGVDaGFuZ2VFdmVudCgndXBkYXRlZCcsIFtncm91cFJlc3VsdF0pO1xuICAgICAgICAgICAgICAvLyByZS1maWx0ZXIgcmVzdWx0IHNlbGVjdGVkXG4gICAgICAgICAgICAgIHRoaXMucmVzdWx0U2VsZWN0ZWQgPSB0aGlzLnJlc3VsdFNlbGVjdGVkLmZpbHRlcihpdGVtID0+ICF0aGlzLmdldExpc3RDaGlsZHJlbk9mTm9kZShmbGF0RXhpc3RHcm91cCkubWFwKHggPT4geC5pZCkuaW5jbHVkZXMoaXRlbS5pZCkpO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY2hlY2tFeGlzdEluUmVzdWx0KG5vZGUpKVxuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB0aGlzLnJlc3VsdFNlbGVjdGVkLnB1c2gobmVzdGVkTm9kZSk7XG4gICAgICAgICAgICB0aGlzLl9vblNlbGVjdGlvbk5vZGVDaGFuZ2VFdmVudCgnYWRkZWQnLCBbbmVzdGVkTm9kZV0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZW1vdmVkLmxlbmd0aCkge1xuICAgICAgICAgIHJlbW92ZWQuZm9yRWFjaChub2RlID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG5lc3RlZE5vZGUgPSB0aGlzLmNvbnZlcnRUb05lc3RlZE5vZGUobm9kZSk7XG4gICAgICAgICAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuZ2V0TGlzdENoaWxkcmVuT2ZOb2RlKG5vZGUpO1xuICAgICAgICAgICAgaWYgKG5lc3RlZE5vZGUuaXNHcm91cCkge1xuICAgICAgICAgICAgICBjb25zdCBfaXRlbSA9IHRoaXMucmVzdWx0U2VsZWN0ZWQuZmluZCh4ID0+IHguaWQgPT09IG5vZGUuaWQpO1xuICAgICAgICAgICAgICBpZiAoIV9pdGVtKSByZXR1cm47XG4gICAgICAgICAgICAgIGNoaWxkcmVuLmZvckVhY2goaXRlbSA9PiBpdGVtLmdyb3VwSWQgPSBudWxsKTtcbiAgICAgICAgICAgICAgdGhpcy5yZXN1bHRTZWxlY3RlZC5zcGxpY2UodGhpcy5yZXN1bHRTZWxlY3RlZC5pbmRleE9mKF9pdGVtKSwgMSk7XG4gICAgICAgICAgICAgIHRoaXMuX29uU2VsZWN0aW9uTm9kZUNoYW5nZUV2ZW50KCdyZW1vdmVkJywgW19pdGVtXSk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGdyb3VwID0gdGhpcy5yZXN1bHRTZWxlY3RlZC5maW5kKHggPT4geC5pZCA9PT0gbmVzdGVkTm9kZS5ncm91cElkKTtcbiAgICAgICAgICAgIGlmICghZ3JvdXApIHtcbiAgICAgICAgICAgICAgY29uc3QgX2l0ZW0gPSB0aGlzLnJlc3VsdFNlbGVjdGVkLmZpbmQoeCA9PiB4LmlkID09PSBub2RlLmlkKTtcbiAgICAgICAgICAgICAgaWYgKCFfaXRlbSkgcmV0dXJuO1xuICAgICAgICAgICAgICB0aGlzLnJlc3VsdFNlbGVjdGVkLnNwbGljZSh0aGlzLnJlc3VsdFNlbGVjdGVkLmluZGV4T2YoX2l0ZW0pLCAxKTtcbiAgICAgICAgICAgICAgdGhpcy5fb25TZWxlY3Rpb25Ob2RlQ2hhbmdlRXZlbnQoJ3JlbW92ZWQnLCBbX2l0ZW1dKTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgY2hpbGROb2RlcyA9IHRoaXMuZ2V0TGlzdENoaWxkcmVuT2ZOb2RlKG5vZGUpLmNvbmNhdChub2RlKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGROb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICBjb25zdCBpdGVtID0gY2hpbGROb2Rlc1tpXTtcbiAgICAgICAgICAgICAgY29uc3QgX25vZGUgPSB0aGlzLmdldE5vZGVCeUlkKGl0ZW0uaWQpXG4gICAgICAgICAgICAgIGlmIChncm91cC5jaGlsZHJlbi5zb21lKHggPT4geC5pZCA9PT0gX25vZGUuaWQpICYmICF0aGlzLmlzU2VsZWN0ZWROb2RlKF9ub2RlKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IF9pdGVtID0gZ3JvdXAuY2hpbGRyZW4uZmluZCh4ID0+IHguaWQgPT09IGl0ZW0uaWQpO1xuICAgICAgICAgICAgICAgIGlmICghX2l0ZW0pIHJldHVybjtcbiAgICAgICAgICAgICAgICBncm91cC5jaGlsZHJlbi5zcGxpY2UoZ3JvdXAuY2hpbGRyZW4uaW5kZXhPZihfaXRlbSksIDEpO1xuICAgICAgICAgICAgICAgIHRoaXMuX29uU2VsZWN0aW9uTm9kZUNoYW5nZUV2ZW50KCd1cGRhdGVkJywgW2dyb3VwXSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9tYXBUb1Jlc3VsdFNlYXJjaCgpO1xuICAgICAgICB0aGlzLm9uVmFsdWVDaGFuZ2VFdmVudC5lbWl0KHRoaXMucmVzdWx0U2VsZWN0ZWQpO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9vblNlbGVjdGlvbk5vZGVDaGFuZ2VFdmVudChzdGF0ZTogJ3JlbW92ZWQnIHwgJ3VwZGF0ZWQnIHwgJ2FkZGVkJywgZGF0YTogUU1TVHJlZU5vZGVbXSkge1xuICAgIHN3aXRjaCAoc3RhdGUpIHtcbiAgICAgIGNhc2UgJ3JlbW92ZWQnOlxuICAgICAgICB0aGlzLnNlbGVjdGlvbk5vZGVDaGFuZ2VFdmVudC5lbWl0KHtcbiAgICAgICAgICByZW1vdmVkOiBkYXRhLFxuICAgICAgICAgIGFkZGVkOiBbXSxcbiAgICAgICAgICB1cGRhdGVkOiBbXSxcbiAgICAgICAgICBzb3VyY2U6IG5ldyBTZWxlY3Rpb25Nb2RlbCh0cnVlLCB0aGlzLnJlc3VsdFNlbGVjdGVkKVxuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd1cGRhdGVkJzpcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25Ob2RlQ2hhbmdlRXZlbnQuZW1pdCh7XG4gICAgICAgICAgcmVtb3ZlZDogW10sXG4gICAgICAgICAgYWRkZWQ6IFtdLFxuICAgICAgICAgIHVwZGF0ZWQ6IGRhdGEsXG4gICAgICAgICAgc291cmNlOiBuZXcgU2VsZWN0aW9uTW9kZWwodHJ1ZSwgdGhpcy5yZXN1bHRTZWxlY3RlZClcbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnYWRkZWQnOlxuICAgICAgICB0aGlzLnNlbGVjdGlvbk5vZGVDaGFuZ2VFdmVudC5lbWl0KHtcbiAgICAgICAgICByZW1vdmVkOiBbXSxcbiAgICAgICAgICBhZGRlZDogZGF0YSxcbiAgICAgICAgICB1cGRhdGVkOiBbXSxcbiAgICAgICAgICBzb3VyY2U6IG5ldyBTZWxlY3Rpb25Nb2RlbCh0cnVlLCB0aGlzLnJlc3VsdFNlbGVjdGVkKVxuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfaGFuZGxlU2VhcmNoRXZlbnQoKSB7XG4gICAgdGhpcy5zZWFyY2hEZXBhcnRtZW50JFxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSkpXG4gICAgICAuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XG4gICAgICAgIHRoaXMucmVzdWx0U2VhcmNoID0gW107XG4gICAgICAgIHRoaXMuQ1VSUkVOVF9QQUdFU0laRSA9IHJlc3VsdC5wYWdlU2l6ZTtcbiAgICAgICAgdGhpcy5nZXRMb2FkaW5nJC5uZXh0KGZhbHNlKTtcbiAgICAgICAgaWYgKHJlc3VsdCAmJiByZXN1bHQubGVuZ3RoKSB7XG4gICAgICAgICAgcmVzdWx0LmRhdGEuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLmdldE5vZGVCeUlkKGl0ZW0uaWQpO1xuICAgICAgICAgICAgbGV0IGxvY2F0aW9uOiBEZXBhcnRtZW50TG9jYXRpb25CcmVhZENydW1iW10gPSBbXTtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbmZpZy5sYXp5KSB7XG4gICAgICAgICAgICAgIGxvY2F0aW9uID0gaXRlbS5wYXRoPy5tYXAoeCA9PiAoeyBuYW1lOiB4IH0gYXMgRGVwYXJ0bWVudExvY2F0aW9uQnJlYWRDcnVtYikpIHx8IFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgIGNvbnN0IHBhcmVudHMgPSBub2RlID8gdGhpcy5nZXRBbGxQYXJlbnROb2RlKG5vZGUpIDogW107XG4gICAgICAgICAgICAgIGxvY2F0aW9uID0gcGFyZW50cy5sZW5ndGggPyBwYXJlbnRzLm1hcCgoeCkgPT4gKHtcbiAgICAgICAgICAgICAgICBpZDogeC5pZCxcbiAgICAgICAgICAgICAgICBuYW1lOiB4Lm5hbWUsXG4gICAgICAgICAgICAgIH0gYXMgRGVwYXJ0bWVudExvY2F0aW9uQnJlYWRDcnVtYikpLnJldmVyc2UoKSA6IFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5yZXN1bHRTZWFyY2gucHVzaCh7XG4gICAgICAgICAgICAgIC4uLml0ZW0sXG4gICAgICAgICAgICAgIGRpc2FibGVkOiAhdGhpcy5jb25maWcubGF6eSAmJiB0aGlzLmNvbmZpZy5jaGVja1NlYXJjaE1hcHBpbmdUcmVlICYmICFub2RlLFxuICAgICAgICAgICAgICBsb2NhdGlvbjogW1xuICAgICAgICAgICAgICAgIC4uLmxvY2F0aW9uLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGlkOiBpdGVtLmlkLFxuICAgICAgICAgICAgICAgICAgbmFtZTogaXRlbS5uYW1lLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgaXNMb2FkaW5nOiBmYWxzZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy50ZXh0U2VhcmNoU3ViamVjdCQubmV4dCh0aGlzLmZvcm1TZWFyY2hDb250cm9sLnZhbHVlKTtcbiAgICAgICAgICBpZiAodGhpcy5jb25maWcuY2xlYXJDaGVja0xpc3RTZWxlY3Rpb25TZWFyY2hXaGVuSGFuZGxlKVxuICAgICAgICAgICAgdGhpcy5jaGVja0xpc3RTZWxlY3Rpb25TZWFyY2guY2xlYXIoKTtcbiAgICAgICAgICB0aGlzLl9tYXBUb1Jlc3VsdFNlYXJjaCgpO1xuICAgICAgICAgIHRoaXMuc2V0SW5kZXhWaWV3KDEpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2hhbmRsZUFjdGl2ZU5vZGVFdmVudCgpIHtcbiAgICB0aGlzLnNjcm9sbFRvTm9kZUV2ZW50JC5waXBlKHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpLCBzd2l0Y2hNYXAoKHZhbCkgPT4ge1xuICAgICAgY29uc3QgZGVsYXlUaW1pbmcgPSB0aGlzLmdldEluZGV4VmlldyQudmFsdWUgPT09IDEgPyA3MDAgOiAwO1xuICAgICAgdGhpcy5zZXRJbmRleFZpZXcoMCk7XG4gICAgICByZXR1cm4gb2YodmFsKS5waXBlKGRlbGF5KGRlbGF5VGltaW5nKSwgdGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSkpO1xuICAgIH0pKVxuICAgICAgLnN1YnNjcmliZShyZXMgPT4ge1xuICAgICAgICB0aGlzLm9uU2Nyb2xsSW50b05vZGUocmVzKTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5nZXRBY3RpdmVOb2RlRXZlbnQkLnBpcGUodGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSksIHN3aXRjaE1hcCh2YWwgPT4ge1xuICAgICAgdGhpcy5hY3RpdmVOb2RlID0gdmFsO1xuICAgICAgcmV0dXJuIHRpbWVyKDE1MDApO1xuICAgIH0pKVxuICAgICAgLnN1YnNjcmliZShfID0+IHtcbiAgICAgICAgdGhpcy5hY3RpdmVOb2RlID0gJyc7XG4gICAgICB9KTtcbiAgfVxuXG4gIHVwZGF0ZURhdGFUcmVlKGRhdGE6IFFNU1RyZWVOb2RlW10pIHtcbiAgICB0aGlzLmdldERhdGFUcmVlJC5uZXh0KGRhdGEpO1xuICB9XG5cbiAgc2V0TG9hZGluZ1N0YXRlTm9kZShpc0xvYWRpbmc6IGJvb2xlYW4sIG5vZGVJZDogc3RyaW5nKSB7XG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuZ2V0Tm9kZUJ5SWQobm9kZUlkKTtcbiAgICBpZiAoIW5vZGUpXG4gICAgICByZXR1cm47XG4gICAgbm9kZS5pc0xvYWRpbmcgPSBpc0xvYWRpbmc7XG4gICAgdGhpcy5jaGVja0xvYWRpbmdPZlBhcmVudChub2RlKTtcbiAgfVxuXG4gIG9uRXhwYW5kTm9kZShub2RlOiBRTVNGbGF0Tm9kZVRyZWUpIHtcbiAgICBpZiAoIW5vZGU/LmV4cGFuZGFibGUpIHJldHVybjtcbiAgICB0aGlzLnRyZWVDb250cm9sLnRvZ2dsZShub2RlKTtcbiAgICBpZiAodGhpcy5jb25maWcubGF6eSAmJiB0aGlzLnRyZWVDb250cm9sLmlzRXhwYW5kZWQobm9kZSkgJiYgIW5vZGUubWFya2VkR2V0Q2hpbGRyZW4pIHtcbiAgICAgIG5vZGUuaXNMb2FkaW5nID0gdHJ1ZTtcbiAgICAgIHRoaXMuY2hlY2tMb2FkaW5nT2ZQYXJlbnQobm9kZSk7XG4gICAgfVxuICAgIHRoaXMub25FeHBhbmROb2RlRXZlbnQuZW1pdChub2RlKTtcbiAgfVxuXG4gIG9uT3B0aW9uU2VhcmNoU2VsZWN0ZWQodmFsdWU6IFFNU0ZsYXROb2RlVHJlZSkge1xuICAgIGNvbnN0IGZsYXROb2RlID0gdGhpcy5nZXROb2RlQnlJZCh2YWx1ZS5pZCk7XG4gICAgaWYgKCFmbGF0Tm9kZSkgcmV0dXJuO1xuICAgIHRoaXMuY2hlY2tMaXN0U2VsZWN0aW9uLnNlbGVjdChmbGF0Tm9kZSk7XG4gICAgdGhpcy5oYW5kbGVDaGVja05vZGUoZmxhdE5vZGUpO1xuICAgIHRoaXMub25TY3JvbGxJbnRvTm9kZShmbGF0Tm9kZS5pZCk7XG4gIH1cblxuICBvbkNoZWNrQWxsUm9vdFRyZWVOb2RlKCkge1xuICAgIGlmICh0aGlzLmNvbmZpZy5pc1NlbGVjdE9uZSB8fCAhdGhpcy5jb25maWcuYWN0aXZlU2VsZWN0QWxsTm9kZSlcbiAgICAgIHJldHVybjtcbiAgICBpZiAodGhpcy5pc0FsbERlcGFydG1lbnRTZWxlY3RlZCkge1xuICAgICAgdGhpcy50cmVlQ29udHJvbC5kYXRhTm9kZXMuZm9yRWFjaChub2RlID0+IHtcbiAgICAgICAgY29uc3QgbmVzdGVkTm9kZSA9IHRoaXMuY29udmVydFRvTmVzdGVkTm9kZShub2RlKTtcbiAgICAgICAgbmVzdGVkTm9kZS5pc0dyb3VwID0gZmFsc2U7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuY2hlY2tMaXN0U2VsZWN0aW9uLmRlc2VsZWN0KC4uLnRoaXMudHJlZUNvbnRyb2wuZGF0YU5vZGVzKTtcbiAgICAgIHJldHVybjtcbiAgICB9O1xuICAgIHRoaXMuZGVwYXJ0bWVudFJvb3RzLmZvckVhY2gobm9kZSA9PiB7XG4gICAgICBpZiAoIXRoaXMuaXNJbmNsdWRlQ2hpbGRyZW4pIHtcbiAgICAgICAgdGhpcy50cmVlQ29udHJvbC5kYXRhTm9kZXMuZmlsdGVyKHggPT4gIXRoaXMuaXNTZWxlY3RlZE5vZGUoeCkpXG4gICAgICAgICAgLmZvckVhY2goeCA9PiB0aGlzLm9uQ2hlY2tOb2RlKHgpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLmlzU2VsZWN0ZWROb2RlKG5vZGUpKSB7XG4gICAgICAgIHRoaXMub25DaGVja05vZGUobm9kZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG5lc3RlZE5vZGUgPSB0aGlzLmNvbnZlcnRUb05lc3RlZE5vZGUobm9kZSk7XG4gICAgICBpZiAobmVzdGVkTm9kZS5pc0dyb3VwICYmIHRoaXMuaXNDaGVja0FsbChub2RlKSB8fCAhbm9kZS5leHBhbmRhYmxlKVxuICAgICAgICByZXR1cm47XG4gICAgICB0aGlzLmdldExpc3RDaGlsZHJlbk9mTm9kZShub2RlKVxuICAgICAgICAuZmlsdGVyKGl0ZW0gPT4gIXRoaXMuaXNTZWxlY3RlZE5vZGUoaXRlbSkpXG4gICAgICAgIC5mb3JFYWNoKGl0ZW0gPT4gIXRoaXMuaXNTZWxlY3RlZE5vZGUoaXRlbSkgJiYgdGhpcy5vbkNoZWNrTm9kZShpdGVtKSk7XG4gICAgICBpZiAoIW5lc3RlZE5vZGUuaXNHcm91cCkge1xuICAgICAgICB0aGlzLmNoZWNrTGlzdFNlbGVjdGlvbi5kZXNlbGVjdChub2RlKTtcbiAgICAgICAgdGhpcy5vbkNoZWNrTm9kZShub2RlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgb25DaGVja05vZGUobm9kZTogUU1TRmxhdE5vZGVUcmVlLCBmaXJlRXZlbnRDaGVja05vZGU6IGJvb2xlYW4gPSB0cnVlKSB7XG4gICAgaWYgKCFub2RlKVxuICAgICAgcmV0dXJuO1xuICAgIGlmIChmaXJlRXZlbnRDaGVja05vZGUpXG4gICAgICB0aGlzLm9uQ2hlY2tOb2RlRXZlbnQuZW1pdChub2RlKTtcbiAgICB0aGlzLmNoZWNrTGlzdFNlbGVjdGlvbi50b2dnbGUobm9kZSk7XG4gICAgaWYgKHRoaXMuY29uZmlnLmlzU2VsZWN0T25lKSB7XG4gICAgICB0aGlzLl9oYW5kbGVTZWxlY3RPbmUobm9kZS5pZCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmNvbmZpZy5sYXp5ICYmIG5vZGUuZXhwYW5kYWJsZSAmJiAhbm9kZS5tYXJrZWRHZXRDaGlsZHJlbiAmJiBmaXJlRXZlbnRDaGVja05vZGUpIHtcbiAgICAgIGlmICghdGhpcy5faGFuZGxpbmdMYXp5T2JqZWN0LmNoZWNrTm9kZSkge1xuICAgICAgICB0aGlzLmhhbmRsZUNoZWNrTm9kZShub2RlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgbm9kZS5pc0xvYWRpbmcgPSB0aGlzLmlzSW5jbHVkZUNoaWxkcmVuO1xuICAgICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLmdldExpc3RDaGlsZHJlbk9mTm9kZShub2RlKS5maWx0ZXIoeCA9PiB4LmV4cGFuZGFibGUgJiYgIXgubWFya2VkR2V0Q2hpbGRyZW4pO1xuICAgICAgY2hpbGRyZW4uZm9yRWFjaCh4ID0+IHguaXNMb2FkaW5nID0gdGhpcy5pc0luY2x1ZGVDaGlsZHJlbik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuaGFuZGxlQ2hlY2tOb2RlKG5vZGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaGFuZGxlU2VsZWN0T25lKG5vZGVJZDogc3RyaW5nKSB7XG4gICAgY29uc3Qgbm9kZVRyZWUgPSB0aGlzLnRyZWVDb250cm9sLmRhdGFOb2Rlcy5maW5kKG5vZGUgPT4gbm9kZS5pZCA9PT0gbm9kZUlkKTtcbiAgICBjb25zdCByZVNlbGVjdFNlbGVjdGlvbiA9ICguLi5wYXJhbXM6IFNlbGVjdGlvbk1vZGVsPGFueT5bXSk6IHZvaWQgPT4ge1xuICAgICAgcGFyYW1zLmZvckVhY2goc2VsZWN0aW9uID0+IHtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWQgPSBzZWxlY3Rpb24uc2VsZWN0ZWQuZmlsdGVyKHggPT4geC5pZCAhPT0gbm9kZUlkKTtcbiAgICAgICAgc2VsZWN0aW9uLmRlc2VsZWN0KC4uLnNlbGVjdGVkKTtcbiAgICAgIH0pO1xuICAgIH07XG4gICAgaWYgKCFub2RlVHJlZSkge1xuICAgICAgY29uc3QgaXRlbSA9IHRoaXMuY2hlY2tMaXN0U2VsZWN0aW9uU2VhcmNoLnNlbGVjdGVkLmZpbmQoeCA9PiB4LmlkID09PSBub2RlSWQpO1xuICAgICAgaWYgKCFpdGVtKVxuICAgICAgICByZXR1cm47XG4gICAgICB0aGlzLnJlc3VsdFNlbGVjdGVkID0gW3tcbiAgICAgICAgaWQ6IGl0ZW0uaWQsXG4gICAgICAgIHBhcmVudElkOiBpdGVtLnBhcmVudElkLFxuICAgICAgICBuYW1lOiBpdGVtLm5hbWUsXG4gICAgICAgIGV4dGVybmFsTmFtZTogaXRlbS5leHRlcm5hbE5hbWUsXG4gICAgICAgIGNoaWxkcmVuOiBbXVxuICAgICAgfSBhcyBRTVNUcmVlTm9kZV07XG4gICAgICB0aGlzLl9zZWxlY3RlZExpc3QgPSBbLi4udGhpcy5yZXN1bHRTZWxlY3RlZF07XG4gICAgICB0aGlzLm9uVmFsdWVDaGFuZ2VFdmVudC5lbWl0KHRoaXMucmVzdWx0U2VsZWN0ZWQpO1xuICAgICAgcmVTZWxlY3RTZWxlY3Rpb24odGhpcy5jaGVja0xpc3RTZWxlY3Rpb24sIHRoaXMuY2hlY2tMaXN0U2VsZWN0aW9uU2VhcmNoKTtcbiAgICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc1NlbGVjdGVkTm9kZShub2RlVHJlZSkpIHtcbiAgICAgIGNvbnN0IG5lc3RlZE5vZGUgPSB0aGlzLmNvbnZlcnRUb05lc3RlZE5vZGUodGhpcy5jaGVja0xpc3RTZWxlY3Rpb24uc2VsZWN0ZWRbMF0pO1xuICAgICAgdGhpcy5fc2VsZWN0ZWRMaXN0ID0gWy4uLnRoaXMucmVzdWx0U2VsZWN0ZWRdO1xuICAgICAgcmVTZWxlY3RTZWxlY3Rpb24odGhpcy5jaGVja0xpc3RTZWxlY3Rpb24sIHRoaXMuY2hlY2tMaXN0U2VsZWN0aW9uU2VhcmNoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5yZXN1bHRTZWxlY3RlZCA9IFtdO1xuICAgIHRoaXMuX3NlbGVjdGVkTGlzdCA9IFtdO1xuICB9XG5cbiAgb25FeHBhbmRBbGxQYXJlbnQobm9kZTogUU1TRmxhdE5vZGVUcmVlKSB7XG4gICAgY29uc3QgcGFyZW50cyA9IHRoaXMuZ2V0QWxsUGFyZW50Tm9kZShub2RlKTtcbiAgICBpZiAocGFyZW50cz8ubGVuZ3RoKSB7XG4gICAgICBwYXJlbnRzLmZvckVhY2gocGFyZW50ID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLnRyZWVDb250cm9sLmlzRXhwYW5kZWQocGFyZW50KSlcbiAgICAgICAgICB0aGlzLm9uRXhwYW5kTm9kZShwYXJlbnQpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgb25SZW1vdmVOb2RlKG5vZGVJZDogc3RyaW5nKSB7XG4gICAgY29uc3QgZmxhdE5vZGUgPSB0aGlzLmdldE5vZGVCeUlkKG5vZGVJZCk7XG4gICAgaWYgKCFmbGF0Tm9kZSkge1xuICAgICAgY29uc3QgaXRlbSA9IHRoaXMuX3NlbGVjdGVkTGlzdC5maW5kKHggPT4geC5pZCA9PT0gbm9kZUlkKTtcbiAgICAgIGlmICghaXRlbSlcbiAgICAgICAgcmV0dXJuO1xuICAgICAgdGhpcy5fdXBkYXRlU2VsZWN0ZWRMaXN0KCdyZW1vdmUnLCBpdGVtLCB0aGlzLl9zZWxlY3RlZExpc3QsIHRoaXMucmVzdWx0U2VsZWN0ZWQpO1xuICAgICAgdGhpcy5jZFJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuY2hlY2tMaXN0U2VsZWN0aW9uLmRlc2VsZWN0KGZsYXROb2RlKTtcbiAgICB0aGlzLmhhbmRsZUNoZWNrTm9kZShmbGF0Tm9kZSk7XG4gIH1cblxuICBvblNlbGVjdE5vZGUoLi4ubm9kZUlkczogc3RyaW5nW10pIHtcbiAgICBjb25zdCBub2RlcyA9IHRoaXMudHJlZUNvbnRyb2wuZGF0YU5vZGVzLmZpbHRlcih4ID0+IG5vZGVJZHMuaW5jbHVkZXMoeC5pZCkpO1xuICAgIGlmICghbm9kZXMubGVuZ3RoKVxuICAgICAgcmV0dXJuO1xuICAgIHRoaXMuY2hlY2tMaXN0U2VsZWN0aW9uLnNlbGVjdCguLi5ub2Rlcyk7XG4gIH1cblxuICBvbkRlc2VsZWN0Tm9kZSguLi5ub2RlSWRzOiBzdHJpbmdbXSkge1xuICAgIGNvbnN0IG5vZGVzID0gdGhpcy50cmVlQ29udHJvbC5kYXRhTm9kZXMuZmlsdGVyKHggPT4gbm9kZUlkcy5pbmNsdWRlcyh4LmlkKSk7XG4gICAgaWYgKCFub2Rlcy5sZW5ndGgpXG4gICAgICByZXR1cm47XG4gICAgdGhpcy5jaGVja0xpc3RTZWxlY3Rpb24uZGVzZWxlY3QoLi4ubm9kZXMpO1xuICB9XG4gIC8qKlxuICAgKiBUb2dnbGVzIGEgdmFsdWUgYmV0d2VlbiBzZWxlY3RlZCBhbmQgZGVzZWxlY3RlZC5cbiAgICogQHBhcmFtIG5vZGVJZCA6aWQgb2Ygbm9kZVxuICAgKi9cbiAgb25Ub2dnbGVOb2RlKG5vZGVJZDogc3RyaW5nKSB7XG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuZ2V0Tm9kZUJ5SWQobm9kZUlkKTtcbiAgICBpZiAoIW5vZGUpXG4gICAgICByZXR1cm47XG4gICAgdGhpcy5jaGVja0xpc3RTZWxlY3Rpb24udG9nZ2xlKG5vZGUpO1xuICB9XG5cbiAgaXNJbmRldGVybWluYXRlKG5vZGU6IFFNU0ZsYXROb2RlVHJlZSkge1xuICAgIGNvbnN0IGNoaWxkU2VsZWN0ZWQgPSB0aGlzLmdldExpc3RDaGlsZHJlbk9mTm9kZShub2RlKS5maWx0ZXIoaXRlbSA9PiB0aGlzLmlzU2VsZWN0ZWROb2RlKGl0ZW0pKTtcbiAgICByZXR1cm4gKCEhY2hpbGRTZWxlY3RlZC5sZW5ndGggJiYgIXRoaXMuaXNTZWxlY3RlZE5vZGUobm9kZSkpO1xuICB9XG5cbiAgaXNDaGVja0FsbChub2RlOiBRTVNGbGF0Tm9kZVRyZWUpIHtcbiAgICBjb25zdCBsaXN0Q2hlY2sgPSBbLi4udGhpcy5nZXRMaXN0Q2hpbGRyZW5PZk5vZGUobm9kZSksIG5vZGVdO1xuICAgIHJldHVybiBsaXN0Q2hlY2suZXZlcnkoaXRlbSA9PiB0aGlzLmlzU2VsZWN0ZWROb2RlKGl0ZW0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZSBjaGVjayBub2RlIG9mIHRyZWVcbiAgICogQHBhcmFtIG5vZGUgbm9kZSBvZiB0cmVlXG4gICAqIEBwYXJhbSBjYWxsYmFjayBkbyBzb21ldGhpbmcgYmVmb3JlIGhhbmRsZSBjaGVjayBub2RlXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBhc3luYyBvbkJlZm9yZUNoZWNrTm9kZShub2RlOiBRTVNGbGF0Tm9kZVRyZWUsIGNhbGxiYWNrPzogKG5vZGU6IFFNU0ZsYXROb2RlVHJlZSkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD4pIHtcbiAgICB0aGlzLl9oYW5kbGluZ0xhenlPYmplY3QuY2hlY2tOb2RlID0gdHJ1ZTtcbiAgICBpZiAoISFjYWxsYmFjaylcbiAgICAgIGF3YWl0IGNhbGxiYWNrKG5vZGUpO1xuICAgIHRoaXMuaGFuZGxlQ2hlY2tOb2RlKG5vZGUpO1xuICAgIHRoaXMuX2hhbmRsaW5nTGF6eU9iamVjdC5jaGVja05vZGUgPSBmYWxzZTtcbiAgfVxuXG4gIGhhbmRsZUNoZWNrTm9kZShub2RlOiBRTVNGbGF0Tm9kZVRyZWUpIHtcbiAgICBjb25zdCBpc1NlbGVjdGVkID0gdGhpcy5pc1NlbGVjdGVkTm9kZShub2RlKTtcbiAgICBjb25zdCBjaGlsZFNlbGVjdGVkID0gdGhpcy5nZXRDaGlsZHJlblNlbGVjdGVkKG5vZGUpO1xuICAgIGNvbnN0IG5lc3RlZE5vZGUgPSB0aGlzLmNvbnZlcnRUb05lc3RlZE5vZGUobm9kZSk7XG5cbiAgICBpZiAoaXNTZWxlY3RlZCkge1xuICAgICAgLy8gQ2hlY2sgZXhpc3RlZCBncm91cFxuICAgICAgY29uc3QgZXhpc3RlZEdyb3VwID0gdGhpcy5nZXRBbGxQYXJlbnROb2RlKG5vZGUpLmZpbmQoeCA9PiB0aGlzLmNvbnZlcnRUb05lc3RlZE5vZGUoeCkuaXNHcm91cCk7XG4gICAgICBpZiAoIXRoaXMuaXNJbmNsdWRlQ2hpbGRyZW4pIHtcbiAgICAgICAgbmVzdGVkTm9kZS5ncm91cElkID0gZXhpc3RlZEdyb3VwPy5pZFxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuZ2V0TGlzdENoaWxkcmVuT2ZOb2RlKG5vZGUpO1xuICAgICAgbmVzdGVkTm9kZS5pc0dyb3VwID0gIWV4aXN0ZWRHcm91cCAmJiAhIWNoaWxkcmVuLmxlbmd0aDtcbiAgICAgIGlmICghY2hpbGRyZW4ubGVuZ3RoKVxuICAgICAgICByZXR1cm47XG4gICAgICBjaGlsZHJlbi5mb3JFYWNoKHggPT4ge1xuICAgICAgICBjb25zdCBfbm9kZSA9IHRoaXMuY29udmVydFRvTmVzdGVkTm9kZSh4KTtcbiAgICAgICAgX25vZGUuZ3JvdXBJZCA9IGV4aXN0ZWRHcm91cCA/IGV4aXN0ZWRHcm91cC5pZCA6IG5vZGUuaWQ7XG4gICAgICAgIF9ub2RlLmlzR3JvdXAgPSBmYWxzZTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy51cGRhdGVEYXRhVHJlZSh0aGlzLmN1cnJlbnRUcmVlRGF0YSk7XG4gICAgICB0aGlzLmNoZWNrTGlzdFNlbGVjdGlvbi5kZXNlbGVjdCguLi5jaGlsZFNlbGVjdGVkLm1hcCh4ID0+IHRoaXMucmVzZXROb2RlKHgpKSk7XG4gICAgICB0aGlzLmNoZWNrTGlzdFNlbGVjdGlvbi5zZWxlY3QoLi4uY2hpbGRyZW4ubWFwKHggPT4gdGhpcy5yZXNldE5vZGUoeCkpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgX3NlbGVjdGVkSW5kZXggPSB0aGlzLl9zZWxlY3RlZExpc3QuZmluZEluZGV4KHggPT4geC5pZCA9PT0gbm9kZS5pZCk7XG4gICAgX3NlbGVjdGVkSW5kZXggPiAtMSAmJiB0aGlzLl9zZWxlY3RlZExpc3Quc3BsaWNlKF9zZWxlY3RlZEluZGV4LCAxKTtcbiAgICBjb25zdCBkZXNlbGVjdE5vZGVzID0gKHRoaXMuaXNJbmNsdWRlQ2hpbGRyZW4gfHwgbmVzdGVkTm9kZS5pc0dyb3VwKSA/IGNoaWxkU2VsZWN0ZWQgOiBbbm9kZV07XG4gICAgdGhpcy5jaGVja0xpc3RTZWxlY3Rpb24uZGVzZWxlY3QoLi4uZGVzZWxlY3ROb2Rlcyk7XG4gICAgbmVzdGVkTm9kZS5pc0dyb3VwID0gZmFsc2U7XG4gICAgdGhpcy51cGRhdGVEYXRhVHJlZSh0aGlzLmN1cnJlbnRUcmVlRGF0YSlcbiAgICByZXR1cm47XG4gIH1cblxuICBwcml2YXRlIHJlc2V0Tm9kZShub2RlOiBRTVNGbGF0Tm9kZVRyZWUpIHtcbiAgICBub2RlLmlzR3JvdXAgPSBmYWxzZTtcbiAgICByZXR1cm4gbm9kZTtcbiAgfVxuXG4gIGlzU2VsZWN0ZWROb2RlKG5vZGU6IFFNU0ZsYXROb2RlVHJlZSkge1xuICAgIHJldHVybiBub2RlICYmIHRoaXMuY2hlY2tMaXN0U2VsZWN0aW9uLmlzU2VsZWN0ZWQobm9kZSk7XG4gIH1cblxuICBnZXRDaGlsZHJlblNlbGVjdGVkKG5vZGU6IFFNU0ZsYXROb2RlVHJlZSk6IFFNU0ZsYXROb2RlVHJlZVtdIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMaXN0Q2hpbGRyZW5PZk5vZGUobm9kZSkuZmlsdGVyKHggPT4gdGhpcy5pc1NlbGVjdGVkTm9kZSh4KSk7XG4gIH1cbiAgLyoqXG4gICAqIEdldHMgYSBsaXN0IG9mIHRoZSBkYXRhIG5vZGUncyBzdWJ0cmVlIG9mIGRlc2NlbmRlbnQgZGF0YSBub2Rlcy5cbiAgICogQHBhcmFtIG5vZGVcbiAgICogQHJldHVybnNcbiAgICovXG4gIGdldExpc3RDaGlsZHJlbk9mTm9kZShub2RlOiBRTVNGbGF0Tm9kZVRyZWUpIHtcbiAgICBjb25zdCBmbGF0Tm9kZSA9IHRoaXMuZ2V0Tm9kZUJ5SWQobm9kZS5pZCk7XG4gICAgaWYgKCFmbGF0Tm9kZSlcbiAgICAgIHJldHVybiBbXTtcbiAgICByZXR1cm4gdGhpcy50cmVlQ29udHJvbC5nZXREZXNjZW5kYW50cyhmbGF0Tm9kZSk7XG4gIH1cblxuICBwcml2YXRlIF9tYXBUb05lc3RlZExpc3ROb2RlKGZsYXROb2RlTGlzdDogUU1TRmxhdE5vZGVUcmVlW10pOiBRTVNUcmVlTm9kZVtdIHtcbiAgICByZXR1cm4gZmxhdE5vZGVMaXN0Lm1hcChpdGVtID0+IHRoaXMuY29udmVydFRvTmVzdGVkTm9kZShpdGVtKSk7XG4gIH1cblxuICBjb252ZXJ0VG9OZXN0ZWROb2RlKG5vZGU6IFFNU0ZsYXROb2RlVHJlZSk6IFFNU1RyZWVOb2RlIHtcbiAgICByZXR1cm4gdGhpcy5mbGF0VHJlZU5vZGVNYXAuZ2V0KG5vZGUpIHx8IHt9IGFzIFFNU1RyZWVOb2RlO1xuICB9XG5cbiAgY29udmVydFRvRmxhdE5vZGUobm9kZTogUU1TVHJlZU5vZGUpIHtcbiAgICByZXR1cm4gdGhpcy5uZXN0ZWRUcmVlTm9kZU1hcC5nZXQobm9kZSk7XG4gIH1cblxuICBnZXRBbGxQYXJlbnROb2RlKG5vZGU6IFFNU0ZsYXROb2RlVHJlZSk6IFFNU0ZsYXROb2RlVHJlZVtdIHtcbiAgICBjb25zdCBsaXN0UGFyZW50OiBRTVNGbGF0Tm9kZVRyZWVbXSA9IFtdO1xuICAgIGxldCBwYXJlbnQgPSB0aGlzLmdldFBhcmVudE5vZGUobm9kZSk7XG4gICAgd2hpbGUgKHBhcmVudCkge1xuICAgICAgbGlzdFBhcmVudC5wdXNoKHBhcmVudCk7XG4gICAgICBwYXJlbnQgPSB0aGlzLmdldFBhcmVudE5vZGUocGFyZW50KTtcbiAgICB9XG4gICAgcmV0dXJuIGxpc3RQYXJlbnQ7XG4gIH1cblxuICBnZXRQYXJlbnROb2RlKG5vZGU6IFFNU0ZsYXROb2RlVHJlZSk6IFFNU0ZsYXROb2RlVHJlZSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgY3VycmVudExldmVsID0gdGhpcy5nZXRMZXZlbChub2RlKTtcbiAgICBpZiAoY3VycmVudExldmVsIDwgMSkgcmV0dXJuO1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy50cmVlQ29udHJvbC5kYXRhTm9kZXMuaW5kZXhPZihub2RlKSAtIDE7XG4gICAgZm9yIChsZXQgaSA9IGluZGV4OyBpID49IDA7IGktLSkge1xuICAgICAgY29uc3QgY3VycmVudE5vZGUgPSB0aGlzLnRyZWVDb250cm9sLmRhdGFOb2Rlc1tpXTtcbiAgICAgIGlmICh0aGlzLmdldExldmVsKGN1cnJlbnROb2RlKSA8IGN1cnJlbnRMZXZlbCkge1xuICAgICAgICByZXR1cm4gY3VycmVudE5vZGU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIGdldEl0ZW1JY29uVHlwZShpdGVtOiBRTVNGbGF0Tm9kZVRyZWUpIHtcbiAgICBpZiAoISFpdGVtLml0ZW1NYXRJY29uKSByZXR1cm4gdGhpcy5pdGVtSWNvblR5cGUubmFtZTtcbiAgICBpZiAoISFpdGVtLml0ZW1JY29uU3ZnKSByZXR1cm4gdGhpcy5pdGVtSWNvblR5cGUuc3ZnO1xuICAgIGlmICghIWl0ZW0uaXRlbUljb24pIHJldHVybiB0aGlzLml0ZW1JY29uVHlwZS5wYXRoO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHByaXZhdGUgb25TY3JvbGxJbnRvTm9kZShub2RlSWQ6IHN0cmluZykge1xuICAgIGNvbnN0IGZsYXROb2RlID0gdGhpcy5nZXROb2RlQnlJZChub2RlSWQpO1xuICAgIGlmICghbm9kZUlkKSByZXR1cm47XG4gICAgdGhpcy5vbkV4cGFuZE5vZGUoZmxhdE5vZGUpO1xuICAgIHRoaXMub25FeHBhbmRBbGxQYXJlbnQoZmxhdE5vZGUpO1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy50cmVlQ29udHJvbC5kYXRhTm9kZXMuZmluZEluZGV4KHggPT4geC5pZCA9PT0gZmxhdE5vZGUuaWQpO1xuICAgIGlmICghdGhpcy5jZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQpXG4gICAgICByZXR1cm47XG4gICAgdGhpcy5jZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQuc2Nyb2xsVG9JbmRleChpbmRleCwgJ3Ntb290aCcpO1xuICAgIHRoaXMuZ2V0QWN0aXZlTm9kZUV2ZW50JC5uZXh0KG5vZGVJZCk7XG4gIH1cblxuICBvblNlYXJjaCgpIHtcbiAgICBpZiAoIXRoaXMuZm9ybVNlYXJjaENvbnRyb2wudmFsdWUgfHwgdGhpcy5mb3JtU2VhcmNoQ29udHJvbC52YWx1ZT8udHJpbSgpID09PSAnJylcbiAgICAgIHJldHVybjtcbiAgICB0aGlzLmdldExvYWRpbmckLm5leHQodHJ1ZSk7XG4gICAgdGhpcy5zZXRJbmRleFZpZXcoMSk7XG4gICAgdGhpcy5vblNlYXJjaEV2ZW50LmVtaXQodGhpcy5mb3JtU2VhcmNoQ29udHJvbC52YWx1ZSk7XG4gICAgaWYgKCF0aGlzLnBhZ2luYXRvclNlYXJjaClcbiAgICAgIHJldHVybjtcbiAgICB0aGlzLnBhZ2luYXRvclNlYXJjaC5jaGFuZ2VQYWdlKDApO1xuICAgIHRoaXMucGFnaW5hdG9yU2VhcmNoLnJlbmRlckRpc3BsYXlOdW1iZXJPZnBhZ2VzKCk7XG4gIH1cblxuICBzZXRSZXN1bHRTZWFyY2goZGF0YTogUU1TRGVwYXJ0bWVudFBhZ2luZ01vZGVsPFFNU0ZsYXROb2RlVHJlZT4pIHtcbiAgICB0aGlzLnNlYXJjaERlcGFydG1lbnQkLm5leHQoZGF0YSk7XG4gIH1cblxuICBvbkNsaWNrUmVzdWx0SXRlbShpdGVtOiBEZXBhcnRtZW50U2VhcmNoUmVzdWx0TW9kZWwpIHtcbiAgICBjb25zdCBub2RlID0gdGhpcy5nZXROb2RlQnlJZChpdGVtLmlkKTtcbiAgICBpZiAobm9kZSkge1xuICAgICAgdGhpcy5zY3JvbGxUb05vZGUobm9kZS5pZCk7XG4gICAgfVxuICB9XG5cbiAgb25CcmVhZENydW1iSXRlbUNsaWNrKGl0ZW06IERlcGFydG1lbnRMb2NhdGlvbkJyZWFkQ3J1bWIpIHtcbiAgICBjb25zdCBub2RlID0gdGhpcy5nZXROb2RlQnlJZChpdGVtLmlkKTtcbiAgICBpZiAobm9kZSkge1xuICAgICAgdGhpcy5zZXRJbmRleFZpZXcoMCk7XG4gICAgICBvZihub2RlLmlkKS5waXBlKGRlbGF5KDcwMCksIHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpKS5zdWJzY3JpYmUocmVzID0+IHtcbiAgICAgICAgdGhpcy5vblNjcm9sbEludG9Ob2RlKHJlcyk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBvbkNoZWNrSXRlbVNlYXJjaFJlc3VsdChpdGVtOiBEZXBhcnRtZW50U2VhcmNoUmVzdWx0TW9kZWwpIHtcbiAgICB0aGlzLmNoZWNrTGlzdFNlbGVjdGlvblNlYXJjaC50b2dnbGUoaXRlbSk7XG4gICAgaWYgKHRoaXMuY29uZmlnLmlzU2VsZWN0T25lKSB7XG4gICAgICB0aGlzLmNoZWNrTGlzdFNlbGVjdGlvblNlYXJjaC5kZXNlbGVjdCguLi50aGlzLmNoZWNrTGlzdFNlbGVjdGlvblNlYXJjaC5zZWxlY3RlZC5maWx0ZXIoeCA9PiB4LmlkICE9IGl0ZW0uaWQpKTtcbiAgICB9XG4gICAgdGhpcy5vbkNoZWNrSXRlbVNlYXJjaEV2ZW50LmVtaXQoXG4gICAgICB7XG4gICAgICAgIHN0YXRlOiB0aGlzLmNoZWNrTGlzdFNlbGVjdGlvblNlYXJjaC5pc1NlbGVjdGVkKGl0ZW0pLFxuICAgICAgICBpdGVtOiBpdGVtXG4gICAgICB9KTtcbiAgICBpZiAodGhpcy5jb25maWcubGF6eSkge1xuICAgICAgaWYgKCF0aGlzLl9oYW5kbGluZ0xhenlPYmplY3QuY2hlY2tJdGVtU2VhcmNoKSB7XG4gICAgICAgIHRoaXMuX2hhbmRsZUNoZWNrUmVzdXRsU2VhcmNoKGl0ZW0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2hhbmRsZUNoZWNrUmVzdXRsU2VhcmNoKGl0ZW0pO1xuICAgIHRoaXMub25WYWx1ZUNoYW5nZUV2ZW50LmVtaXQodGhpcy5yZXN1bHRTZWxlY3RlZCk7XG4gIH1cblxuICBhc3luYyBvbkJlZm9yZUNoZWNrSXRlbVNlYXJjaChpdGVtOiBEZXBhcnRtZW50U2VhcmNoUmVzdWx0TW9kZWwsIGNhbGxiYWNrPzogKGl0ZW06IERlcGFydG1lbnRTZWFyY2hSZXN1bHRNb2RlbCkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD4pIHtcbiAgICBpdGVtLmlzTG9hZGluZyA9IHRydWU7XG4gICAgdGhpcy5faGFuZGxpbmdMYXp5T2JqZWN0LmNoZWNrSXRlbVNlYXJjaCA9IHRydWU7XG4gICAgLy8gaG9sZCBzdGF0ZSBiZWZvcmUgY2FsbCBtZXRob2QgY2FsbGJhY2sgdG8gcHJldmVudCBsb3N0IGl0J3Mgc3RhdGUgdW5leHBlY3RlZFxuICAgIGNvbnN0IGlzU2VsZWN0ID0gdGhpcy5pc1NlbGVjdEl0ZW1TZWFyY2goaXRlbS5pZCk7XG4gICAgaWYgKCEhY2FsbGJhY2spXG4gICAgICBhd2FpdCBjYWxsYmFjayhpdGVtKTtcbiAgICBpdGVtLmlzTG9hZGluZyA9IGZhbHNlO1xuICAgIHRoaXMuX2hhbmRsZUNoZWNrUmVzdXRsU2VhcmNoKGl0ZW0sIGlzU2VsZWN0KTtcbiAgICB0aGlzLm9uVmFsdWVDaGFuZ2VFdmVudC5lbWl0KHRoaXMucmVzdWx0U2VsZWN0ZWQpO1xuICAgIHRoaXMuX2hhbmRsaW5nTGF6eU9iamVjdC5jaGVja0l0ZW1TZWFyY2ggPSBmYWxzZTtcbiAgfVxuXG4gIGFzeW5jIG9uQmVmb3JlQ2hlY2tBbGxTZWFyY2goY2FsbGJhY2s/OiAoZGF0YSkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD4pIHtcbiAgICB0aGlzLl9oYW5kbGluZ0xhenlPYmplY3QuY2hlY2tBbGxTZWFyY2ggPSB0cnVlO1xuICAgIGlmICghIWNhbGxiYWNrKVxuICAgICAgYXdhaXQgY2FsbGJhY2sodGhpcy5yZXN1bHRTZWFyY2gpO1xuICAgIHRoaXMuX2hhbmRsaW5nTGF6eU9iamVjdC5jaGVja0FsbFNlYXJjaCA9IGZhbHNlO1xuICAgIGlmICghdGhpcy5yZXN1bHRTZWFyY2gubGVuZ3RoKVxuICAgICAgcmV0dXJuO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5yZXN1bHRTZWFyY2gubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLnJlc3VsdFNlYXJjaFtpXTtcbiAgICAgIHRoaXMuX2hhbmRsZUNoZWNrUmVzdXRsU2VhcmNoKGl0ZW0pO1xuICAgIH1cbiAgfVxuXG4gIGNhbkhhbmRsZUl0ZW1TZWFyY2hSZXN1bHQoaXRlbTogRGVwYXJ0bWVudFNlYXJjaFJlc3VsdE1vZGVsKSB7XG4gICAgaWYgKCF0aGlzLnRyZWVDb250cm9sKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRoaXMudHJlZUNvbnRyb2wuZGF0YU5vZGVzLnNvbWUobm9kZSA9PiBub2RlLmlkID09PSBpdGVtLmlkKSB8fCB0aGlzLmNvbmZpZy5sYXp5O1xuICB9XG5cbiAgcHJpdmF0ZSBfbWFwVG9SZXN1bHRTZWFyY2goKSB7XG4gICAgaWYgKCEhdGhpcy5yZXN1bHRTZWFyY2gubGVuZ3RoKVxuICAgICAgdGhpcy5yZXN1bHRTZWFyY2guZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgY29uc3QgaXNFeGlzdEluUmVzdWx0U2VsZWN0ZWQgPSB0aGlzLnJlc3VsdFNlbGVjdGVkPy5zb21lKHggPT4geC5pZCA9PT0gaXRlbS5pZCB8fCB4LmNoaWxkcmVuPy5zb21lKHkgPT4geS5pZCA9PT0gaXRlbS5pZCkpO1xuICAgICAgICBpc0V4aXN0SW5SZXN1bHRTZWxlY3RlZCA/IHRoaXMuY2hlY2tMaXN0U2VsZWN0aW9uU2VhcmNoLnNlbGVjdChpdGVtKSA6IHRoaXMuY2hlY2tMaXN0U2VsZWN0aW9uU2VhcmNoLmRlc2VsZWN0KGl0ZW0pO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9oYW5kbGVDaGVja1Jlc3V0bFNlYXJjaChpdGVtOiBEZXBhcnRtZW50U2VhcmNoUmVzdWx0TW9kZWwsIHN0YXRlOiBib29sZWFuID0gdGhpcy5pc1NlbGVjdEl0ZW1TZWFyY2goaXRlbS5pZCkpIHtcbiAgICBpdGVtLmlzTG9hZGluZyA9IGZhbHNlO1xuICAgIGNvbnN0IGN1cnJlbnROb2RlID0gdGhpcy5nZXROb2RlQnlJZChpdGVtLmlkLnRvU3RyaW5nKCkpO1xuICAgIGlmICghIWN1cnJlbnROb2RlKSB7XG4gICAgICBpZiAoc3RhdGUpIHtcbiAgICAgICAgaWYgKHRoaXMuY2hlY2tMaXN0U2VsZWN0aW9uLmlzU2VsZWN0ZWQoY3VycmVudE5vZGUpKVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgaWYgKHRoaXMuY2hlY2tMaXN0U2VsZWN0aW9uU2VhcmNoLmlzU2VsZWN0ZWQoaXRlbSkpXG4gICAgICAgICAgdGhpcy5jaGVja0xpc3RTZWxlY3Rpb24uc2VsZWN0KGN1cnJlbnROb2RlKTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICB0aGlzLmNoZWNrTGlzdFNlbGVjdGlvbi5kZXNlbGVjdChjdXJyZW50Tm9kZSk7XG4gICAgICB9XG4gICAgICB0aGlzLmNvbmZpZy5pc1NlbGVjdE9uZSA/IHRoaXMuX2hhbmRsZVNlbGVjdE9uZShjdXJyZW50Tm9kZS5pZCkgOiB0aGlzLmhhbmRsZUNoZWNrTm9kZShjdXJyZW50Tm9kZSk7XG4gICAgICB0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuY29uZmlnLmlzU2VsZWN0T25lKSB7XG4gICAgICB0aGlzLl9oYW5kbGVTZWxlY3RPbmUoaXRlbS5pZCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX3VwZGF0ZVNlbGVjdGVkTGlzdChzdGF0ZSA/ICdhZGQnIDogJ3JlbW92ZScsIGl0ZW0sIHRoaXMuX3NlbGVjdGVkTGlzdCwgdGhpcy5yZXN1bHRTZWxlY3RlZCk7XG4gIH1cblxuICBpc1NlbGVjdEl0ZW1TZWFyY2goaWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNoZWNrTGlzdFNlbGVjdGlvblNlYXJjaC5zZWxlY3RlZC5zb21lKHggPT4geC5pZCA9PT0gaWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBfdXBkYXRlU2VsZWN0ZWRMaXN0KHN0YXRlOiAnYWRkJyB8ICdyZW1vdmUnLCBpdGVtOiBRTVNUcmVlTm9kZSwgLi4uc2VsZWN0ZWRMaXN0czogUU1TVHJlZU5vZGVbXVtdKSB7XG4gICAgaWYgKCFpdGVtKVxuICAgICAgcmV0dXJuO1xuICAgIHNlbGVjdGVkTGlzdHMuZm9yRWFjaChzZWxlY3RlZExpc3QgPT4ge1xuICAgICAgY29uc3QgaXRlbUV4aXN0ZWQgPSBzZWxlY3RlZExpc3QuZmluZCh4ID0+IHguaWQgPT09IGl0ZW0uaWQpO1xuICAgICAgc3dpdGNoIChzdGF0ZSkge1xuICAgICAgICBjYXNlICdhZGQnOlxuICAgICAgICAgIGlmIChpdGVtLmdyb3VwSWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGdyb3VwID0gc2VsZWN0ZWRMaXN0LmZpbmQoeCA9PiB4LmlkID09PSBpdGVtLmdyb3VwSWQpO1xuICAgICAgICAgICAgaWYgKCFncm91cCAmJiAhaXRlbUV4aXN0ZWQpIHtcbiAgICAgICAgICAgICAgc2VsZWN0ZWRMaXN0LnB1c2goaXRlbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAhZ3JvdXAuY2hpbGRyZW4uc29tZSh4ID0+IHguaWQgPT09IGl0ZW0uaWQpICYmIGdyb3VwLmNoaWxkcmVuLnB1c2goaXRlbSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgICFpdGVtRXhpc3RlZCAmJiBzZWxlY3RlZExpc3QucHVzaChpdGVtKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAncmVtb3ZlJzpcbiAgICAgICAgICBpZiAoIWl0ZW1FeGlzdGVkKSB7XG4gICAgICAgICAgICBjb25zdCBncm91cCA9IHNlbGVjdGVkTGlzdC5maW5kKHggPT4geC5jaGlsZHJlbi5zb21lKHgxID0+IHgxLmlkID09PSBpdGVtLmlkKSk7XG4gICAgICAgICAgICBpZiAoIWdyb3VwKVxuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IGdyb3VwLmNoaWxkcmVuLmZpbmRJbmRleCh4ID0+IHguaWQgPT09IGl0ZW0uaWQpO1xuICAgICAgICAgICAgaWYgKGluZGV4IDwgMClcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgZ3JvdXAuY2hpbGRyZW4uc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2VsZWN0ZWRMaXN0LnNwbGljZShzZWxlY3RlZExpc3QuaW5kZXhPZihpdGVtRXhpc3RlZCksIDEpO1xuICAgICAgICAgIGNvbnN0IGl0ZW1TZWxlY3Rpb25TZWFyY2ggPSB0aGlzLmNoZWNrTGlzdFNlbGVjdGlvblNlYXJjaC5zZWxlY3RlZC5maW5kKHggPT4geC5pZCA9PT0gaXRlbUV4aXN0ZWQuaWQpO1xuICAgICAgICAgIGl0ZW1TZWxlY3Rpb25TZWFyY2ggJiYgdGhpcy5jaGVja0xpc3RTZWxlY3Rpb25TZWFyY2guZGVzZWxlY3QoaXRlbVNlbGVjdGlvblNlYXJjaCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIG9uU2VsZWN0QWxsU2VhcmNoUmVzdWx0KGNoZWNrZWQpIHtcbiAgICBjaGVja2VkID0gIWNoZWNrZWQ7XG4gICAgaWYgKCF0aGlzLnJlc3VsdFNlYXJjaC5sZW5ndGgpXG4gICAgICByZXR1cm47XG4gICAgaWYgKHRoaXMuY29uZmlnLmhhbmRsZUNoZWNrQWxsSXRlbVNlYXJjaCkge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnJlc3VsdFNlYXJjaC5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5yZXN1bHRTZWFyY2hbaV07XG4gICAgICAgIGlmIChjaGVja2VkKSB7XG4gICAgICAgICAgY29uc3QgdHJlZU5vZGUgPSB0aGlzLnRyZWVDb250cm9sLmRhdGFOb2Rlcy5maW5kKG5vZGUgPT4gbm9kZS5pZCA9PT0gaXRlbS5pZCk7XG4gICAgICAgICAgY29uc3QgY2FuU2VsZWN0ID0gKCEhdHJlZU5vZGUgfHwgdGhpcy5jb25maWcubGF6eSk7XG4gICAgICAgICAgaWYgKCFjYW5TZWxlY3QpXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAhdGhpcy5jaGVja0xpc3RTZWxlY3Rpb25TZWFyY2guaXNTZWxlY3RlZChpdGVtKSAmJiB0aGlzLmNoZWNrTGlzdFNlbGVjdGlvblNlYXJjaC5zZWxlY3QoaXRlbSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgY29uc3QgX2l0ZW1TZWxlY3Rpb25zID0gdGhpcy5jaGVja0xpc3RTZWxlY3Rpb25TZWFyY2guc2VsZWN0ZWQuZmlsdGVyKHggPT4geC5pZCA9PT0gaXRlbS5pZCk7XG4gICAgICAgICAgaWYgKF9pdGVtU2VsZWN0aW9ucy5sZW5ndGgpXG4gICAgICAgICAgICB0aGlzLmNoZWNrTGlzdFNlbGVjdGlvblNlYXJjaC5kZXNlbGVjdCguLi5faXRlbVNlbGVjdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5jb25maWcubGF6eSB8fCAhdGhpcy5faGFuZGxpbmdMYXp5T2JqZWN0LmNoZWNrQWxsU2VhcmNoKVxuICAgICAgICAgIHRoaXMuX2hhbmRsZUNoZWNrUmVzdXRsU2VhcmNoKGl0ZW0sIGNoZWNrZWQpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLm9uQ2hlY2tBbGxJdGVtU2VhcmNoRXZlbnQuZW1pdChjaGVja2VkKTtcbiAgICB0aGlzLm9uVmFsdWVDaGFuZ2VFdmVudC5lbWl0KHRoaXMucmVzdWx0U2VsZWN0ZWQpO1xuICB9XG5cbiAgcHVibGljIGlzRGlzYWJsZUNoZWNib3hBbGxTZWFyY2goKSB7XG4gICAgcmV0dXJuIHRoaXMucmVzdWx0U2VhcmNoICYmIHRoaXMucmVzdWx0U2VhcmNoLmV2ZXJ5KHggPT4geC5kaXNhYmxlZCk7XG4gIH1cblxuICBvblBhZ2luZ1NlYXJjaFJlc3VsdCh2YWw6IFBhZ2VFdmVudCkge1xuICAgIHRoaXMuZ2V0TG9hZGluZyQubmV4dCh0cnVlKTtcbiAgICB0aGlzLm9uUGFnaW5nU2VhcmNoRXZlbnQuZW1pdCh2YWwpO1xuICB9XG5cbiAgc2Nyb2xsVG9Ob2RlKG5vZGVJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5zY3JvbGxUb05vZGVFdmVudCQubmV4dChub2RlSWQpO1xuICB9XG5cbiAgc2V0SW5kZXhWaWV3KGluZGV4OiBudW1iZXIpIHtcbiAgICBpZiAoaW5kZXggPT09IDEgJiYgdGhpcy5jb25maWcucmVzZXRUb2dnbGVJbmNsdWRlQ2hpbGRXaGVuQ2hhbmdlVmlldykge1xuICAgICAgdGhpcy5pc0luY2x1ZGVDaGlsZHJlbiA9IGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLmdldEluZGV4VmlldyQubmV4dChpbmRleCk7XG4gIH1cblxuICBjYW5BY3RpdmVOb2RlRXh0ZXJuYWwobm9kZTogUU1TRmxhdE5vZGVUcmVlKSB7XG4gICAgY29uc3QgYWxsUGFyZW50ID0gdGhpcy5nZXRBbGxQYXJlbnROb2RlKG5vZGUpO1xuICAgIHJldHVybiAhYWxsUGFyZW50IHx8IGFsbFBhcmVudC5ldmVyeShpdGVtID0+IHRoaXMudHJlZUNvbnRyb2wuaXNFeHBhbmRlZChpdGVtKSk7XG4gIH1cblxuICBnZXRIZWlnaHRTdHlsZVJlZk5vZGUobm9kZUlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBub2RlRWxlID0gdGhpcy5lbGVSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKGAubWF0LXRyZWUtbm9kZSNtYXQtbm9kZS0ke25vZGVJZH1gKSBhcyBFbGVtZW50O1xuICAgIHJldHVybiBgJHtub2RlRWxlPy5jbGllbnRIZWlnaHQgfHwgMH1weGA7XG4gIH1cblxuICBwcml2YXRlIGdldFNlbGVjdGVkTm9kZVN0b3JhZ2UoKTogUU1TRmxhdE5vZGVUcmVlIHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnc2VsZWN0ZWROb2RlJykpIGFzIFFNU0ZsYXROb2RlVHJlZTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0U2VsZWN0ZWROb2RlU3RvcmFnZShub2RlOiBRTVNGbGF0Tm9kZVRyZWUpIHtcbiAgICB0aGlzLmlzSW5jbHVkZUNoaWxkcmVuICYmIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdzZWxlY3RlZE5vZGUnLCBKU09OLnN0cmluZ2lmeShub2RlKSk7XG4gIH1cblxuICBzZXREZWZhdWx0UGFnaW5hdG9yU2l6ZShvcHRpb25zOiBudW1iZXJbXSkge1xuICAgIHRoaXMuUEFHRV9TSVpFX09QVElPTiA9IG9wdGlvbnM7XG4gIH1cblxuICB0cmFja0J5KGluZGV4OiBudW1iZXIsIGl0ZW06IFFNU0ZsYXROb2RlVHJlZSk6IFFNU0ZsYXROb2RlVHJlZSB7XG4gICAgcmV0dXJuIGl0ZW07XG4gIH1cblxuICAvKipcbiAgICAgICAqIFRoaXMgZnVuY3Rpb24gdXNlIGZvciBsYXp5IGxvYWQgY2hpbGRyZW4gb2Ygbm9kZVxuICAgICAgICogQHBhcmFtIG5vZGUgbm9kZSB1cGRhdGUuIGlmIG5vZGUgaXMgbnVsbCBkYXRhIGF1dG8gaW5zZXJ0IGFzIHJvb3RzXG4gICAgICAgKiBAcGFyYW0gZGF0YSBsaXN0IGNoaWxkcmVuIHRvIHVwZGF0ZSBub2RlLlxuICAgICAgICogQHBhcmFtIG1vZGUgZGVmYXVsdCBpcyB1cGRhdGUgdGhhdCByZXBsYWNlIGN1cnJlbnQgbGlzdCBjaGlsZHJlbiBieSBuZXcgbGlzdCBjaGlsZHJlbiAsIGlmIG1vZGUgPSAnaW5zZXJ0JyB3aWxsIGluc2VydCBuZXcgdmFsdWVzIHRvIGxpc3QgY2hpbGRyZW4gZXhpc3RlZCBiZWZvcmUuXG4gICovXG4gIHVwZGF0ZUNoaWxkT2ZOb2RlKG5vZGU6IFFNU0ZsYXROb2RlVHJlZSwgZGF0YTogUU1TRmxhdE5vZGVUcmVlW10gPSBbXSwgbW9kZTogJ2luc2VydCcgfCAndXBkYXRlJyA9ICd1cGRhdGUnKSB7XG4gICAgbm9kZS5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmNoZWNrTG9hZGluZ09mUGFyZW50KG5vZGUpO1xuICAgIGNvbnN0IG5lc3RlZE5vZGUgPSB0aGlzLmNvbnZlcnRUb05lc3RlZE5vZGUobm9kZSk7XG4gICAgY29uc3QgZGF0YU5vZGVzID0gdGhpcy50cmVlRGVwYXJ0bWVudFNlcnZpY2UuY29udmVydFRvVHJlZURhdGEoZGF0YSkuZmlsdGVyKHggPT4geC5wYXJlbnRJZCA9PT0gbm9kZS5pZCk7XG4gICAgaWYgKCFuZXN0ZWROb2RlKVxuICAgICAgcmV0dXJuO1xuICAgIHN3aXRjaCAobW9kZSkge1xuICAgICAgY2FzZSAnaW5zZXJ0JzpcbiAgICAgICAgbmVzdGVkTm9kZS5jaGlsZHJlbi5wdXNoKC4uLmRhdGFOb2Rlcyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndXBkYXRlJzpcbiAgICAgICAgbmVzdGVkTm9kZS5jaGlsZHJlbiA9IGRhdGFOb2RlcztcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHRoaXMudXBkYXRlRGF0YVRyZWUodGhpcy5jdXJyZW50VHJlZURhdGEpO1xuICAgIGNvbnN0IF9ub2RlID0gdGhpcy5nZXROb2RlQnlJZChub2RlLmlkKTtcbiAgICBjb25zdCBub2RlcyA9IHRoaXMudHJlZUNvbnRyb2wuZ2V0RGVzY2VuZGFudHMoX25vZGUpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5yZXN1bHRTZWxlY3RlZC5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgaXRlbSA9IHRoaXMucmVzdWx0U2VsZWN0ZWRbaV07XG4gICAgICB0aGlzLl9yZVVwZGF0ZVNlbGVjdGlvbk5vZGUoaXRlbS5pZCk7XG4gICAgICBjb25zdCBkZXNjZW5kYW50cyA9IHRoaXMudHJlZURlcGFydG1lbnRTZXJ2aWNlLmdldERlc2NlbmRhbnRzT2ZOb2RlKGl0ZW0pO1xuICAgICAgaWYgKCFkZXNjZW5kYW50cy5sZW5ndGgpXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBkZXNjZW5kYW50cy5sZW5ndGg7IGorKykge1xuICAgICAgICBjb25zdCBjaGlsZCA9IGRlc2NlbmRhbnRzW2pdO1xuICAgICAgICB0aGlzLl9yZVVwZGF0ZVNlbGVjdGlvbk5vZGUoY2hpbGQuaWQpXG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuc2VsZWN0ZWRMaXN0QWZ0ZXJEYXRhTm9kZUNoYW5nZSQubmV4dChbX25vZGUsIC4uLm5vZGVzXSk7XG4gIH1cblxuICAvL3JlLXNlbGVjdCB3aGVuIHVwZGF0ZSBjaGlsZHJlbiBvZiBub2RlXG4gIHByaXZhdGUgX3JlVXBkYXRlU2VsZWN0aW9uTm9kZShub2RlSWQ6IHN0cmluZykge1xuICAgIGNvbnN0IG5vZGUgPSB0aGlzLmdldE5vZGVCeUlkKG5vZGVJZCk7XG4gICAgaWYgKCFub2RlIHx8IHRoaXMuY2hlY2tMaXN0U2VsZWN0aW9uLmlzU2VsZWN0ZWQobm9kZSkpXG4gICAgICByZXR1cm47XG4gICAgY29uc3QgZXhpc3RJblNlbGVjdGlvbiA9IHRoaXMuY2hlY2tMaXN0U2VsZWN0aW9uLnNlbGVjdGVkLmZpbmQoeCA9PiB4LmlkID09IG5vZGUuaWQpO1xuICAgIGlmIChleGlzdEluU2VsZWN0aW9uKVxuICAgICAgdGhpcy5jaGVja0xpc3RTZWxlY3Rpb24uZGVzZWxlY3QoZXhpc3RJblNlbGVjdGlvbik7XG4gICAgdGhpcy5jaGVja0xpc3RTZWxlY3Rpb24uc2VsZWN0KG5vZGUpO1xuICB9XG5cbiAgY2hlY2tMb2FkaW5nT2ZQYXJlbnQobm9kZTogUU1TRmxhdE5vZGVUcmVlKSB7XG4gICAgY29uc3QgYWxsUGFyZW50ID0gdGhpcy5nZXRBbGxQYXJlbnROb2RlKG5vZGUpO1xuICAgIGlmICghYWxsUGFyZW50Lmxlbmd0aClcbiAgICAgIHJldHVybjtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFsbFBhcmVudC5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgcGFyZW50ID0gYWxsUGFyZW50W2ldO1xuICAgICAgY29uc3QgZGVzY2VuZGFudHMgPSB0aGlzLnRyZWVDb250cm9sLmdldERlc2NlbmRhbnRzKHBhcmVudCk7XG4gICAgICBwYXJlbnQuaXNMb2FkaW5nID0gZGVzY2VuZGFudHMuc29tZSh4ID0+IHguaXNMb2FkaW5nKTtcbiAgICB9XG4gIH1cblxuICBnZXROb2RlQnlJZChpZDogc3RyaW5nKTogUU1TRmxhdE5vZGVUcmVlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy50cmVlQ29udHJvbC5kYXRhTm9kZXMuZmluZChub2RlID0+IG5vZGUuaWQgPT09IGlkKSB8fCB1bmRlZmluZWQ7XG4gIH1cblxuICBnZXRSb290T2ZOb2RlKG5vZGU6IFFNU0ZsYXROb2RlVHJlZSk6IFFNU0ZsYXROb2RlVHJlZSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgYWxsUGFyZW50ID0gdGhpcy5nZXRBbGxQYXJlbnROb2RlKG5vZGUpO1xuICAgIGlmICghYWxsUGFyZW50Lmxlbmd0aClcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIGFsbFBhcmVudC5wb3AoKTtcbiAgfVxuXG4gIGFkZFJvb3RUcmVlKGRhdGE6IFFNU0ZsYXROb2RlVHJlZVtdID0gW10pIHtcbiAgICB0aGlzLmdldExvYWRpbmdNb3JlJC5uZXh0KGZhbHNlKTtcbiAgICBpZiAoIWRhdGEubGVuZ3RoKVxuICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IHRyZWVOb2RlRGF0YSA9IHRoaXMudHJlZURlcGFydG1lbnRTZXJ2aWNlLmNvbnZlcnRUb1RyZWVEYXRhKGRhdGEpO1xuICAgIC8vIHJlLWNoZWNrIHJvb3Qgd2FzIGV4aXN0ZWQgaW4gdHJlZVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdHJlZU5vZGVEYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBpdGVtID0gdHJlZU5vZGVEYXRhW2ldO1xuICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuZ2V0Tm9kZUJ5SWQoaXRlbS5pZCk7XG4gICAgICBpZiAoISFub2RlICYmIG5vZGUuZXhwYW5kYWJsZSAmJiAhbm9kZS5tYXJrZWRHZXRDaGlsZHJlbikge1xuICAgICAgICBjb25zdCBuZXN0ZWROb2RlID0gdGhpcy5jb252ZXJ0VG9OZXN0ZWROb2RlKG5vZGUpO1xuICAgICAgICBuZXN0ZWROb2RlLmNoaWxkcmVuID0gaXRlbS5jaGlsZHJlbjtcbiAgICAgICAgbmVzdGVkTm9kZS5tYXJrZWRHZXRDaGlsZHJlbiA9IHRydWU7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICghbm9kZSlcbiAgICAgICAgdGhpcy5jdXJyZW50VHJlZURhdGEucHVzaChpdGVtKTtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVEYXRhVHJlZSh0aGlzLmN1cnJlbnRUcmVlRGF0YSk7XG4gICAgdGhpcy5zZWxlY3RlZExpc3RBZnRlckRhdGFOb2RlQ2hhbmdlJC5uZXh0KGRhdGEpO1xuICB9XG5cbiAgZ2V0Q2hlY2tlZFN0YXR1c05vZGUobm9kZTogUU1TRmxhdE5vZGVUcmVlKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNTZWxlY3RlZE5vZGUobm9kZSk7XG4gIH1cblxuICB1cGRhdGVOb2RlSW5mb3JtYXRpb24obm9kZTogUU1TRmxhdE5vZGVUcmVlKSB7XG4gICAgbGV0IG5lc3RlZE5vZGUgPSB0aGlzLmNvbnZlcnRUb05lc3RlZE5vZGUobm9kZSk7XG4gICAgaWYgKCFuZXN0ZWROb2RlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbmVzdGVkTm9kZS5jaGlsZENvdW50ID0gbm9kZS5jaGlsZENvdW50O1xuICAgIG5lc3RlZE5vZGUubmFtZSA9IG5vZGUubmFtZTtcbiAgICBuZXN0ZWROb2RlLml0ZW1JY29uID0gbm9kZS5pdGVtSWNvbjtcbiAgICBuZXN0ZWROb2RlLml0ZW1JY29uU3ZnID0gbm9kZS5pdGVtSWNvblN2ZztcbiAgICBuZXN0ZWROb2RlLnNlbGVjdGVkQ2hpbGRDb3VudCA9IG5vZGUuc2VsZWN0ZWRDaGlsZENvdW50O1xuICAgIG5lc3RlZE5vZGUubWFya2VkR2V0Q2hpbGRDb3VudFJlY3VycnNpdmUgPSBub2RlLm1hcmtlZEdldENoaWxkQ291bnRSZWN1cnJzaXZlO1xuICAgIG5lc3RlZE5vZGUuaXNJbmNsdWRlQ2hpbGRXaGVuQ2hlY2tlZCA9IG5vZGUuaXNJbmNsdWRlQ2hpbGRXaGVuQ2hlY2tlZDtcbiAgfVxuXG4gIHVwZGF0ZVNlbGVjdGVkUmVzdWx0RGF0YShub2RlOiBRTVNGbGF0Tm9kZVRyZWUpIHtcbiAgICBjb25zdCBub2RlUmVzdWx0ID0gdGhpcy5yZXN1bHRTZWxlY3RlZC5maW5kKCh4KSA9PiB4LmlkID09PSBub2RlLmlkKTtcbiAgICBpZiAobm9kZVJlc3VsdCkge1xuICAgICAgbm9kZVJlc3VsdC5jaGlsZENvdW50ID0gbm9kZS5jaGlsZENvdW50O1xuICAgICAgbm9kZVJlc3VsdC5zZWxlY3RlZENoaWxkQ291bnQgPSBub2RlLnNlbGVjdGVkQ2hpbGRDb3VudDtcbiAgICB9XG4gIH1cblxuICBjYWxsQ2hlY2tOb2RlT3V0c2lkZShub2RlOiBRTVNGbGF0Tm9kZVRyZWUpIHtcbiAgICB0aGlzLmNoZWNrTGlzdFNlbGVjdGlvbi50b2dnbGUobm9kZSk7XG4gICAgLy90aGlzLmhhbmRsZUNoZWNrTm9kZShub2RlKTtcbiAgfVxufVxuIl19