@libs-ui/components-list 0.2.64 → 0.2.65
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/defines/list.define.d.ts +2 -1
- package/esm2022/defines/list.define.mjs +14 -13
- package/esm2022/interfaces/config-item.interface.mjs +1 -1
- package/esm2022/list.component.mjs +40 -18
- package/esm2022/templates/checkbox/checkbox.component.mjs +10 -9
- package/esm2022/templates/group/group.component.mjs +773 -0
- package/esm2022/templates/group/item/item.component.mjs +77 -0
- package/esm2022/templates/group/pipes/calculator-left-line-vertical-item.pipe.mjs +38 -0
- package/esm2022/templates/group/pipes/calculator-margin-left-item.pipe.mjs +40 -0
- package/esm2022/templates/group/pipes/calculator-padding-left-item.pipe.mjs +26 -0
- package/esm2022/templates/radio/radio.component.mjs +5 -5
- package/esm2022/templates/rows/rows.component.mjs +4 -4
- package/esm2022/templates/tag/tag.component.mjs +3 -3
- package/esm2022/templates/templates.component.abstract.mjs +21 -16
- package/esm2022/templates/text/text.component.mjs +4 -4
- package/fesm2022/libs-ui-components-list.mjs +1013 -69
- package/fesm2022/libs-ui-components-list.mjs.map +1 -1
- package/interfaces/config-item.interface.d.ts +24 -29
- package/list.component.d.ts +2 -2
- package/package.json +1 -1
- package/templates/checkbox/checkbox.component.d.ts +1 -1
- package/templates/group/group.component.d.ts +50 -0
- package/templates/group/item/item.component.d.ts +27 -0
- package/templates/group/pipes/calculator-left-line-vertical-item.pipe.d.ts +7 -0
- package/templates/group/pipes/calculator-margin-left-item.pipe.d.ts +7 -0
- package/templates/group/pipes/calculator-padding-left-item.pipe.d.ts +7 -0
- package/templates/rows/rows.component.d.ts +2 -2
- package/templates/templates.component.abstract.d.ts +1 -1
|
@@ -0,0 +1,773 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
|
+
import { AsyncPipe } from '@angular/common';
|
|
3
|
+
import { ChangeDetectionStrategy, Component, signal } from '@angular/core';
|
|
4
|
+
import { VirtualScrollerModule } from '@iharbeck/ngx-virtual-scroller';
|
|
5
|
+
import { LibsUiComponentsButtonsButtonComponent } from '@libs-ui/components-buttons-button';
|
|
6
|
+
import { LibsUiComponentsCheckboxSingleComponent } from '@libs-ui/components-checkbox-single';
|
|
7
|
+
import { LibsUiComponentsRadioSingleComponent } from '@libs-ui/components-radio-single';
|
|
8
|
+
import { LibsUiComponentsScrollOverlayDirective } from '@libs-ui/components-scroll-overlay';
|
|
9
|
+
import { LibsUiComponentsSpinnerComponent } from '@libs-ui/components-spinner';
|
|
10
|
+
import { LibsUiPipesCallFunctionInTemplatePipe } from '@libs-ui/pipes-call-function-in-template';
|
|
11
|
+
import { cloneDeep, deleteUnicode, escapeHtml, isEmpty, isNil, uuid } from '@libs-ui/utils';
|
|
12
|
+
import { TranslateModule } from '@ngx-translate/core';
|
|
13
|
+
import { range } from 'rxjs';
|
|
14
|
+
import { takeUntil } from 'rxjs/operators';
|
|
15
|
+
import { LibsUiCheckSelectedByKeyPipe } from '../../pipes/check-selected-by-key.pipe';
|
|
16
|
+
import { LibsUiComponentsListTemplatesComponentAbstract } from '../templates.component.abstract';
|
|
17
|
+
import { LibsUiComponentsListGroupItemComponent } from './item/item.component';
|
|
18
|
+
import { LibsUiComponentsListGroupCalculatorMarginLeftItemPipe } from './pipes/calculator-margin-left-item.pipe';
|
|
19
|
+
import * as i0 from "@angular/core";
|
|
20
|
+
import * as i1 from "@ngx-translate/core";
|
|
21
|
+
export class LibsUiComponentsListGroupComponent extends LibsUiComponentsListTemplatesComponentAbstract {
|
|
22
|
+
/* PROPERTY */
|
|
23
|
+
configTemplateGroup = signal(undefined);
|
|
24
|
+
level = signal(1);
|
|
25
|
+
keysChecked = signal([]);
|
|
26
|
+
keysStillOtherOptions = signal([]);
|
|
27
|
+
totalItem = signal(0);
|
|
28
|
+
totalItemChecked = signal(0);
|
|
29
|
+
calculatorHeighItemSuccess = signal(false);
|
|
30
|
+
keyFetch = signal('');
|
|
31
|
+
PATTERN_FAKE_ID = 'fake-id-';
|
|
32
|
+
mappingItemsChecked = signal(new Map());
|
|
33
|
+
selectFirstItem = signal(false);
|
|
34
|
+
firstItemSelected = signal(undefined);
|
|
35
|
+
constructor() {
|
|
36
|
+
super();
|
|
37
|
+
}
|
|
38
|
+
ngOnInit() {
|
|
39
|
+
if (!this.config()?.configTemplateGroup?.()) {
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
super.ngOnInit();
|
|
43
|
+
this.configTemplateGroup.set(this.config()?.configTemplateGroup?.());
|
|
44
|
+
this.timeIntervalIntervalSetHeightViewPort.set(this.configTemplateGroup()?.timeIntervalCalculatorHeight ?? 0);
|
|
45
|
+
this.fieldKey.set(this.configTemplateGroup()?.fieldKey ?? this.fieldKeyDefault());
|
|
46
|
+
if (this.paddingLeftItem() === false) {
|
|
47
|
+
this.level.set(0);
|
|
48
|
+
}
|
|
49
|
+
this.selectFirstItem.set(false);
|
|
50
|
+
if (this.configTemplateGroup()?.onlySelectFirstItem || (!this.multiKeySelected()?.length && this.config()?.autoSelectFirstItem)) {
|
|
51
|
+
this.selectFirstItem.set(true);
|
|
52
|
+
}
|
|
53
|
+
this.callApiByService();
|
|
54
|
+
this.onUpdateMultiKeySelectedGroup()?.pipe(takeUntil(this.onDestroy)).subscribe(() => {
|
|
55
|
+
if (!this.store() || !this.store().length) {
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
this.keysChecked.set([]);
|
|
59
|
+
this.mappingItemsChecked().clear();
|
|
60
|
+
const configTemplateGroup = this.configTemplateGroup();
|
|
61
|
+
if (!configTemplateGroup) {
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
this.store().forEach(item => {
|
|
65
|
+
if (isEmpty(item()[this.fieldKey()])) {
|
|
66
|
+
item.update(current => {
|
|
67
|
+
current[this.fieldKey()] = `${this.PATTERN_FAKE_ID}${uuid()}`;
|
|
68
|
+
return current;
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
const itemGroup = item()[configTemplateGroup.fieldGetItems];
|
|
72
|
+
const itemMap = cloneDeep(item);
|
|
73
|
+
itemMap.update(current => {
|
|
74
|
+
current.ref = item;
|
|
75
|
+
return current;
|
|
76
|
+
});
|
|
77
|
+
this.checkedGroupItems(itemGroup(), item);
|
|
78
|
+
if (this.multiKeySelected() && this.multiKeySelected()?.length && this.multiKeySelected()?.find(key => key === item()[this.fieldKey()])) {
|
|
79
|
+
this.handlerChangeChecked(true, itemMap, !configTemplateGroup.singleSelectItem);
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
this.multiKeySelected.set([]);
|
|
84
|
+
return;
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
handlerCheckedOrUnCheckedAll(checked) {
|
|
88
|
+
const configTemplateGroup = this.configTemplateGroup();
|
|
89
|
+
if (!configTemplateGroup) {
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
if (!checked) {
|
|
93
|
+
this.items().forEach(item => {
|
|
94
|
+
this.mappingItemsChecked().delete(item()[this.fieldKey()]);
|
|
95
|
+
const itemsOfGroup = item()[configTemplateGroup.fieldGetItems];
|
|
96
|
+
if (itemsOfGroup() && itemsOfGroup().length) {
|
|
97
|
+
this.removeCheckedItemsChild(itemsOfGroup());
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
this.setKeysCheckedByMappingChecked();
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
this.items().forEach(item => {
|
|
104
|
+
this.mappingItemsChecked().set(item()[this.fieldKey()], item());
|
|
105
|
+
const itemsOfGroup = item()[configTemplateGroup.fieldGetItems];
|
|
106
|
+
if (itemsOfGroup() && itemsOfGroup().length) {
|
|
107
|
+
this.setCheckCheckedItemsChild(itemsOfGroup());
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
this.setKeysCheckedByMappingChecked();
|
|
111
|
+
}
|
|
112
|
+
checkedGroupItems(items, parent) {
|
|
113
|
+
const configTemplateGroup = this.configTemplateGroup();
|
|
114
|
+
if (!configTemplateGroup || !items || !items.length) {
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
items.forEach(item => {
|
|
118
|
+
if (isNil(item()[this.fieldKey()]) || item()[this.fieldKey()] === '') {
|
|
119
|
+
item.update(current => {
|
|
120
|
+
current[this.fieldKey()] = `${this.PATTERN_FAKE_ID}${uuid()}`;
|
|
121
|
+
return;
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
const itemGroup = item()[configTemplateGroup.fieldGetItems];
|
|
125
|
+
const itemMap = cloneDeep(item);
|
|
126
|
+
itemMap.update(current => {
|
|
127
|
+
current.ref = item;
|
|
128
|
+
current.parentItem = parent;
|
|
129
|
+
return current;
|
|
130
|
+
});
|
|
131
|
+
this.checkedGroupItems(itemGroup(), item);
|
|
132
|
+
if (this.multiKeySelected() && this.multiKeySelected()?.length && this.multiKeySelected()?.find(key => key === item()[this.fieldKey()])) {
|
|
133
|
+
this.handlerChangeChecked(true, itemMap, !configTemplateGroup.singleSelectItem);
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
if (configTemplateGroup.singleSelectItem) {
|
|
137
|
+
this.handlerChangeChecked(false, itemMap, !configTemplateGroup.singleSelectItem);
|
|
138
|
+
}
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
handlerClickButtonGroup(buttonInGroup, item) {
|
|
142
|
+
buttonInGroup.action?.(item);
|
|
143
|
+
}
|
|
144
|
+
handlerToggleExpand(e, item, acceptEvent = true) {
|
|
145
|
+
if (!acceptEvent || this.configTemplateGroup()?.ignoreClickLabelGroup) {
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
if (e instanceof Event) {
|
|
149
|
+
e.stopPropagation();
|
|
150
|
+
}
|
|
151
|
+
item.expand = !item.expand;
|
|
152
|
+
this.refreshView();
|
|
153
|
+
}
|
|
154
|
+
handlerChangeView() {
|
|
155
|
+
this.refreshView();
|
|
156
|
+
}
|
|
157
|
+
processKeyChangeUnSelect(item) {
|
|
158
|
+
if (isNil(item()[this.fieldKey()]) || item()[this.fieldKey()] === '') {
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
this.handlerChangeItemChecked(item);
|
|
162
|
+
}
|
|
163
|
+
handlerChangeItemChecked(item) {
|
|
164
|
+
const checked = !this.keysChecked().some(key => item()[this.fieldKey()] === key);
|
|
165
|
+
if (!checked && this.configTemplateGroup()?.isViewRadio) {
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
this.handlerChangeChecked(checked, item);
|
|
169
|
+
}
|
|
170
|
+
handlerChangeChecked(checked, item, isCheckedByDefaultKey) {
|
|
171
|
+
const configTemplateGroup = this.configTemplateGroup();
|
|
172
|
+
if (!configTemplateGroup) {
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
if (!configTemplateGroup.isViewTreeJson && item().level !== item().maxLevelGroup && (configTemplateGroup.ignoreCheckboxGroup || configTemplateGroup.singleSelectItem)) {
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
const refItem = (item().ref || item);
|
|
179
|
+
if (configTemplateGroup.singleSelectItem) {
|
|
180
|
+
checked = true;
|
|
181
|
+
const mappingItemsCheckedTemp = cloneDeep(this.mappingItemsChecked);
|
|
182
|
+
for (const [key, itemCheck] of mappingItemsCheckedTemp()) {
|
|
183
|
+
const itemByKey = this.mappingItemsChecked().get(key);
|
|
184
|
+
itemByKey.isCheckManual = false;
|
|
185
|
+
delete itemByKey.ref.isCheckManual;
|
|
186
|
+
if (!itemCheck.ref.isCheckedByDefaultKey) {
|
|
187
|
+
this.mappingItemsChecked().delete(key);
|
|
188
|
+
this.outUnSelectMultiKey.emit([key]);
|
|
189
|
+
continue;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
if (!isCheckedByDefaultKey) {
|
|
193
|
+
item.update(current => {
|
|
194
|
+
current.isCheckManual = true;
|
|
195
|
+
return current;
|
|
196
|
+
});
|
|
197
|
+
refItem.update(current => {
|
|
198
|
+
current.isCheckManual = true;
|
|
199
|
+
return current;
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
const itemsOfGroup = item()[configTemplateGroup.fieldGetItems];
|
|
204
|
+
// bỏ chọn tất cả các item để thực hiện check lại
|
|
205
|
+
if (configTemplateGroup.isViewTreeJson || (configTemplateGroup.singleSelectItemByTree && !isCheckedByDefaultKey && !configTemplateGroup.notChangeStateItemCheckOther)) {
|
|
206
|
+
Array.from(this.mappingItemsChecked().values()).forEach(item => {
|
|
207
|
+
delete item.isCheckManual;
|
|
208
|
+
refItem.update(current => {
|
|
209
|
+
delete current.isCheckManual;
|
|
210
|
+
return current;
|
|
211
|
+
});
|
|
212
|
+
});
|
|
213
|
+
this.outUnSelectMultiKey.emit(this.keysChecked());
|
|
214
|
+
this.mappingItemsChecked().clear();
|
|
215
|
+
this.setKeysCheckedByMappingChecked(item);
|
|
216
|
+
}
|
|
217
|
+
if (checked) {
|
|
218
|
+
this.expandAllItemsInGroup(item);
|
|
219
|
+
this.mappingItemsChecked().set(item()[this.fieldKey()], item());
|
|
220
|
+
if (isCheckedByDefaultKey) {
|
|
221
|
+
refItem.update(current => {
|
|
222
|
+
current.isCheckedByDefaultKey = isCheckedByDefaultKey;
|
|
223
|
+
return current;
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
item.update(current => {
|
|
227
|
+
current.isCheckedByDefaultKey = refItem().isCheckedByDefaultKey;
|
|
228
|
+
return current;
|
|
229
|
+
});
|
|
230
|
+
if (configTemplateGroup.chooseChildThenAutoChooseParent) { // chỉ chọn các thằng cha trên cùng tree, ko quan tâm node cha có các con đã đc tích hết chưa
|
|
231
|
+
item.update(current => {
|
|
232
|
+
current.isCheckManual = true;
|
|
233
|
+
return current;
|
|
234
|
+
});
|
|
235
|
+
refItem.update(current => {
|
|
236
|
+
current.isCheckManual = true;
|
|
237
|
+
return current;
|
|
238
|
+
});
|
|
239
|
+
this.recursivelyCheckedParentByTree(item().parentItem);
|
|
240
|
+
if (!configTemplateGroup.ignoreChooseParentThenAutoChooseChildren && !isCheckedByDefaultKey) {
|
|
241
|
+
this.setCheckCheckedItemsChild(itemsOfGroup());
|
|
242
|
+
}
|
|
243
|
+
this.setKeysCheckedByMappingChecked(item);
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
if (configTemplateGroup.ignoreChooseParentThenAutoChooseChildren) { // lựa chọn node cha sẽ bỏ qua việc chọn tất cả node con
|
|
247
|
+
this.setKeysCheckedByMappingChecked(item);
|
|
248
|
+
return;
|
|
249
|
+
}
|
|
250
|
+
if (itemsOfGroup() && itemsOfGroup().length && !isCheckedByDefaultKey && !configTemplateGroup.isViewTreeJson) {
|
|
251
|
+
const itemsChange = configTemplateGroup.ignoreChangeChildrenDisableWhenChangeParent ?
|
|
252
|
+
itemsOfGroup().filter((item) => !this.keysDisableItem()?.find(key => key === item()[this.fieldKey()])) : itemsOfGroup();
|
|
253
|
+
this.setCheckCheckedItemsChild(itemsChange);
|
|
254
|
+
}
|
|
255
|
+
if (!configTemplateGroup.notChangeStateItemCheckOther && !configTemplateGroup.isViewTreeJson) {
|
|
256
|
+
this.setCheckCheckedItemsParent(item().parentItem);
|
|
257
|
+
}
|
|
258
|
+
this.setKeysCheckedByMappingChecked(item);
|
|
259
|
+
return;
|
|
260
|
+
}
|
|
261
|
+
item.update(current => {
|
|
262
|
+
current.isCheckManual = false;
|
|
263
|
+
if (isCheckedByDefaultKey) {
|
|
264
|
+
current.isCheckedByDefaultKey = false;
|
|
265
|
+
}
|
|
266
|
+
return current;
|
|
267
|
+
});
|
|
268
|
+
refItem.update(current => {
|
|
269
|
+
current.isCheckManual = false;
|
|
270
|
+
if (isCheckedByDefaultKey) {
|
|
271
|
+
current.isCheckedByDefaultKey = false;
|
|
272
|
+
}
|
|
273
|
+
return current;
|
|
274
|
+
});
|
|
275
|
+
this.mappingItemsChecked().delete(item()[this.fieldKey()]);
|
|
276
|
+
this.keysChecked.set(Array.from(this.mappingItemsChecked().keys()));
|
|
277
|
+
if (configTemplateGroup.notChangeStateItemCheckOther) {
|
|
278
|
+
this.mappingItemsChecked().delete(item()[this.fieldKey()]);
|
|
279
|
+
this.outUnSelectMultiKey.emit(!isEmpty(item()[this.fieldKey()]) ? [item()[this.fieldKey()]] : []);
|
|
280
|
+
this.setKeysCheckedByMappingChecked(item);
|
|
281
|
+
return;
|
|
282
|
+
}
|
|
283
|
+
if (configTemplateGroup.ignoreUnselectChildrenRemoveSelectParent) {
|
|
284
|
+
this.recursivelyCheckedParentByTree(item().parentItem);
|
|
285
|
+
}
|
|
286
|
+
// nếu ko phải trường hơp của bank và danh mục sản phẩm thì bỏ cha sẽ bỏ con
|
|
287
|
+
if (itemsOfGroup() && itemsOfGroup().length) {
|
|
288
|
+
const itemsChange = configTemplateGroup.ignoreChangeChildrenDisableWhenChangeParent ?
|
|
289
|
+
itemsOfGroup().filter((item) => !this.keysDisableItem()?.find(key => key === item()[this.fieldKey()])) : itemsOfGroup();
|
|
290
|
+
this.removeCheckedItemsChild(itemsChange);
|
|
291
|
+
}
|
|
292
|
+
if (item().parentItem && !configTemplateGroup.ignoreUnselectChildrenRemoveSelectParent) {
|
|
293
|
+
this.mappingItemsChecked().delete(item().parentItem[this.fieldKey()]);
|
|
294
|
+
}
|
|
295
|
+
this.setKeysCheckedByMappingChecked(item);
|
|
296
|
+
}
|
|
297
|
+
getItemsOfGroup(item, stores) {
|
|
298
|
+
const configTemplateGroup = this.configTemplateGroup();
|
|
299
|
+
if (!configTemplateGroup || !stores || !stores.length) {
|
|
300
|
+
return;
|
|
301
|
+
}
|
|
302
|
+
for (const group of stores()) {
|
|
303
|
+
if (group()[this.fieldKey()] === item()[this.fieldKey()]) {
|
|
304
|
+
return group()[configTemplateGroup.fieldGetItems];
|
|
305
|
+
}
|
|
306
|
+
const result = this.getItemsOfGroup(item, group()[configTemplateGroup.fieldGetItems]);
|
|
307
|
+
return result;
|
|
308
|
+
}
|
|
309
|
+
return;
|
|
310
|
+
}
|
|
311
|
+
setKeysStillOtherOptions(item) {
|
|
312
|
+
if (!item?.()) {
|
|
313
|
+
this.keysStillOtherOptions.set([]);
|
|
314
|
+
return;
|
|
315
|
+
}
|
|
316
|
+
const keysChecked = Array.from(this.mappingItemsChecked().keys());
|
|
317
|
+
const itemParent = item().parentItem;
|
|
318
|
+
const indexItem = this.keysStillOtherOptions().findIndex(key => key === item()[this.fieldKey()]);
|
|
319
|
+
if (indexItem >= 0) {
|
|
320
|
+
this.keysStillOtherOptions.update(current => {
|
|
321
|
+
current.splice(indexItem, 1);
|
|
322
|
+
return current;
|
|
323
|
+
});
|
|
324
|
+
}
|
|
325
|
+
if (!itemParent()) {
|
|
326
|
+
return;
|
|
327
|
+
}
|
|
328
|
+
const itemsOfGroupParent = this.getItemsOfGroup(itemParent, this.store);
|
|
329
|
+
if (!itemsOfGroupParent || !itemsOfGroupParent() || !itemsOfGroupParent().length) {
|
|
330
|
+
return;
|
|
331
|
+
}
|
|
332
|
+
const indexParent = this.keysStillOtherOptions().findIndex(key => key === itemParent()[this.fieldKey()]);
|
|
333
|
+
if (itemsOfGroupParent().every((element) => keysChecked.includes(element()[this.fieldKey()])) && indexParent >= 0) {
|
|
334
|
+
this.keysStillOtherOptions.update(current => {
|
|
335
|
+
current.splice(indexItem, 1);
|
|
336
|
+
return current;
|
|
337
|
+
});
|
|
338
|
+
return;
|
|
339
|
+
}
|
|
340
|
+
if (itemsOfGroupParent().some(element => keysChecked.includes(element()[this.fieldKey()])) && indexParent < 0) {
|
|
341
|
+
this.keysStillOtherOptions.update(current => [...current, itemParent()[this.fieldKey()]]);
|
|
342
|
+
return;
|
|
343
|
+
}
|
|
344
|
+
if (indexParent >= 0) {
|
|
345
|
+
this.keysStillOtherOptions.update(current => {
|
|
346
|
+
current.splice(indexItem, 1);
|
|
347
|
+
return current;
|
|
348
|
+
});
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
setKeysCheckedByMappingChecked(item) {
|
|
352
|
+
this.keysChecked.set(Array.from(this.mappingItemsChecked().keys()));
|
|
353
|
+
this.emitMultiKeyChecked();
|
|
354
|
+
this.setKeysStillOtherOptions(item);
|
|
355
|
+
}
|
|
356
|
+
emitMultiKeyChecked(isClickManual = true) {
|
|
357
|
+
const configTemplateGroup = this.configTemplateGroup();
|
|
358
|
+
if (!configTemplateGroup) {
|
|
359
|
+
return;
|
|
360
|
+
}
|
|
361
|
+
const dataMultiKeyChecked = { keys: new Array(), mapKeys: new Array(), isClickManual };
|
|
362
|
+
if ((configTemplateGroup.emitAllItemChecked || configTemplateGroup.chooseChildThenAutoChooseParent) && !configTemplateGroup.ignoreEmitAllItemCheckedWhenChooseChildThenAutoChooseParent) {
|
|
363
|
+
for (const [key, item] of this.mappingItemsChecked()) {
|
|
364
|
+
dataMultiKeyChecked.keys.push(key);
|
|
365
|
+
dataMultiKeyChecked.mapKeys.push({ key, item: item.ref || item, isClickManual });
|
|
366
|
+
}
|
|
367
|
+
this.outSelectMultiKey.emit(dataMultiKeyChecked);
|
|
368
|
+
this.totalItemChecked.set(dataMultiKeyChecked.keys.length);
|
|
369
|
+
return;
|
|
370
|
+
}
|
|
371
|
+
for (const [key, item] of this.mappingItemsChecked()) {
|
|
372
|
+
if (item[this.fieldKey()] && !String(item[this.fieldKey()]).includes(this.PATTERN_FAKE_ID) && (!item[configTemplateGroup.fieldGetItems]?.length || !item[configTemplateGroup.fieldGetItems]().some((itemGroup) => this.mappingItemsChecked().get(itemGroup()[this.fieldKey()])))) {
|
|
373
|
+
dataMultiKeyChecked.keys.push(key);
|
|
374
|
+
dataMultiKeyChecked.mapKeys.push({ key, item: item.ref || item, isClickManual });
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
this.outSelectMultiKey.emit(dataMultiKeyChecked);
|
|
378
|
+
this.totalItemChecked.set(dataMultiKeyChecked.keys.length);
|
|
379
|
+
}
|
|
380
|
+
recursivelyCheckedParentByTree(item) {
|
|
381
|
+
if (!item) {
|
|
382
|
+
return;
|
|
383
|
+
}
|
|
384
|
+
this.mappingItemsChecked().set(item[this.fieldKey()], item());
|
|
385
|
+
this.recursivelyCheckedParentByTree(item.parentItem);
|
|
386
|
+
}
|
|
387
|
+
setCheckCheckedItemsParent(item) {
|
|
388
|
+
const configTemplateGroup = this.configTemplateGroup();
|
|
389
|
+
if (!configTemplateGroup || !item) {
|
|
390
|
+
return;
|
|
391
|
+
}
|
|
392
|
+
const itemsOfGroup = item()[configTemplateGroup.fieldGetItems];
|
|
393
|
+
if (!itemsOfGroup() || !itemsOfGroup().length) {
|
|
394
|
+
return;
|
|
395
|
+
}
|
|
396
|
+
for (const itemGroup of itemsOfGroup()) {
|
|
397
|
+
if (!this.mappingItemsChecked().has(itemGroup()[this.fieldKey()])) {
|
|
398
|
+
return;
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
this.mappingItemsChecked().set(item()[this.fieldKey()], item());
|
|
402
|
+
if (item().parentItem) {
|
|
403
|
+
this.setCheckCheckedItemsParent(item().parentItem);
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
setCheckCheckedItemsChild(items) {
|
|
407
|
+
const configTemplateGroup = this.configTemplateGroup();
|
|
408
|
+
if (!configTemplateGroup || !items || !items.length) {
|
|
409
|
+
return;
|
|
410
|
+
}
|
|
411
|
+
items.forEach(item => {
|
|
412
|
+
this.mappingItemsChecked().set(item()[this.fieldKey()], item());
|
|
413
|
+
const itemsOfGroup = item()[configTemplateGroup.fieldGetItems];
|
|
414
|
+
if (itemsOfGroup() && itemsOfGroup().length) {
|
|
415
|
+
this.setCheckCheckedItemsChild(itemsOfGroup());
|
|
416
|
+
}
|
|
417
|
+
});
|
|
418
|
+
}
|
|
419
|
+
removeCheckedItemsChild(items) {
|
|
420
|
+
const configTemplateGroup = this.configTemplateGroup();
|
|
421
|
+
if (!configTemplateGroup || !items || !items.length) {
|
|
422
|
+
return;
|
|
423
|
+
}
|
|
424
|
+
items.forEach(item => {
|
|
425
|
+
item.update(current => {
|
|
426
|
+
current.isCheckManual = false;
|
|
427
|
+
return current;
|
|
428
|
+
});
|
|
429
|
+
this.mappingItemsChecked().delete(item()[this.fieldKey()]);
|
|
430
|
+
this.outUnSelectMultiKey.emit([item()[this.fieldKey()]]);
|
|
431
|
+
const itemsOfGroup = item()[configTemplateGroup.fieldGetItems];
|
|
432
|
+
if (itemsOfGroup() && itemsOfGroup().length) {
|
|
433
|
+
this.removeCheckedItemsChild(itemsOfGroup());
|
|
434
|
+
}
|
|
435
|
+
});
|
|
436
|
+
}
|
|
437
|
+
processSearch() {
|
|
438
|
+
this.processData();
|
|
439
|
+
}
|
|
440
|
+
processData() {
|
|
441
|
+
this.totalItem.set(0);
|
|
442
|
+
const configTemplateGroup = this.configTemplateGroup();
|
|
443
|
+
if (!configTemplateGroup) {
|
|
444
|
+
return;
|
|
445
|
+
}
|
|
446
|
+
let items = this.store().map((item) => {
|
|
447
|
+
if (isNil(item()[this.fieldKey()]) || item()[this.fieldKey()] === '') {
|
|
448
|
+
item.update(current => {
|
|
449
|
+
current[this.fieldKey()] = `${this.PATTERN_FAKE_ID}${uuid()}`;
|
|
450
|
+
return;
|
|
451
|
+
});
|
|
452
|
+
}
|
|
453
|
+
const itemMap = cloneDeep(item);
|
|
454
|
+
itemMap.update(current => {
|
|
455
|
+
current.ref = item;
|
|
456
|
+
current.isRoot = true;
|
|
457
|
+
current.expand = this.keySearch() ? true : false;
|
|
458
|
+
current.maxLevelGroup = this.configTemplateGroup()?.getMaxLevelGroup(item());
|
|
459
|
+
current.level = this.level();
|
|
460
|
+
current.textDescriptionGroupWhenNoData = this.configTemplateGroup()?.getDescriptionGroupWhenNoData?.(item());
|
|
461
|
+
current.iconEmptyDataInGroup = this.configTemplateGroup()?.getIconEmptyDataInGroup?.(item());
|
|
462
|
+
return current;
|
|
463
|
+
});
|
|
464
|
+
if ((itemMap().level === itemMap().maxLevelGroup || !this.configTemplateGroup()?.ignoreCheckboxGroup) && !String(item()[this.fieldKey()])?.includes(this.PATTERN_FAKE_ID)) {
|
|
465
|
+
this.totalItem.update(current => current++);
|
|
466
|
+
}
|
|
467
|
+
if (!this.keySearch() && this.configTemplateGroup()?.getExpandGroup) {
|
|
468
|
+
itemMap.update(current => {
|
|
469
|
+
current.expand = this.configTemplateGroup()?.getExpandGroup?.(item);
|
|
470
|
+
return current;
|
|
471
|
+
});
|
|
472
|
+
}
|
|
473
|
+
if (this.configTemplateGroup()?.getPopoverGroup) {
|
|
474
|
+
itemMap.update(current => {
|
|
475
|
+
current.dataPopover = this.configTemplateGroup()?.getPopoverGroup?.(item);
|
|
476
|
+
return current;
|
|
477
|
+
});
|
|
478
|
+
}
|
|
479
|
+
if (this.configTemplateGroup()?.getButtonGroup) {
|
|
480
|
+
itemMap.update(current => {
|
|
481
|
+
current.buttonInGroup = this.configTemplateGroup()?.getButtonGroup?.(item);
|
|
482
|
+
return current;
|
|
483
|
+
});
|
|
484
|
+
}
|
|
485
|
+
const text = deleteUnicode(this.buildValueByConfig(itemMap)).toLocaleLowerCase();
|
|
486
|
+
const textEscape = escapeHtml(text);
|
|
487
|
+
const keySearch = deleteUnicode(escapeHtml((this.keySearch() || '').trim().toLocaleLowerCase()));
|
|
488
|
+
itemMap.update(current => {
|
|
489
|
+
current.displayAllChild = false;
|
|
490
|
+
return current;
|
|
491
|
+
});
|
|
492
|
+
if (!keySearch || (this.configTemplateGroup()?.searchAllLevel && (text.includes(keySearch) || textEscape.includes(keySearch)))) {
|
|
493
|
+
itemMap.update(current => {
|
|
494
|
+
current.displayAllChild = false;
|
|
495
|
+
current.hasDisplay = false;
|
|
496
|
+
return current;
|
|
497
|
+
});
|
|
498
|
+
}
|
|
499
|
+
const itemGroup = item()[configTemplateGroup.fieldGetItems];
|
|
500
|
+
itemMap.update(current => {
|
|
501
|
+
const children = current[configTemplateGroup.fieldGetItems];
|
|
502
|
+
const data = this.filterItemsDisplay(this.convertDataByGroupInItem(itemGroup(), itemMap));
|
|
503
|
+
children.set(data);
|
|
504
|
+
if (current[configTemplateGroup.fieldGetItems]?.()) {
|
|
505
|
+
current[configTemplateGroup.fieldGetItems].update((itemFields) => {
|
|
506
|
+
if (!itemFields.length) {
|
|
507
|
+
return itemFields;
|
|
508
|
+
}
|
|
509
|
+
itemFields[0].isFirst = true;
|
|
510
|
+
const lastIndex = itemFields?.length - 1;
|
|
511
|
+
if (lastIndex >= 0) {
|
|
512
|
+
itemFields[lastIndex].isLast = true;
|
|
513
|
+
}
|
|
514
|
+
return itemFields;
|
|
515
|
+
});
|
|
516
|
+
}
|
|
517
|
+
current.bonusPaddingLeft = 0;
|
|
518
|
+
if (configTemplateGroup.getBonusPaddingLeftItem) {
|
|
519
|
+
current.bonusPaddingLeft = configTemplateGroup.getBonusPaddingLeftItem(current);
|
|
520
|
+
}
|
|
521
|
+
if (configTemplateGroup.getClassIncludeItemNoData) {
|
|
522
|
+
current.classIncludeItemNoData = configTemplateGroup.getClassIncludeItemNoData(current);
|
|
523
|
+
}
|
|
524
|
+
current.avatarConfig = configTemplateGroup.getAvatarConfig && configTemplateGroup.getAvatarConfig(current);
|
|
525
|
+
return current;
|
|
526
|
+
});
|
|
527
|
+
if (this.multiKeySelected() && this.multiKeySelected()?.length && this.multiKeySelected()?.some(key => key === itemMap()[this.fieldKey()])) {
|
|
528
|
+
this.handlerChangeChecked(true, itemMap(), true);
|
|
529
|
+
}
|
|
530
|
+
this.buildValueByConfig(itemMap());
|
|
531
|
+
return itemMap;
|
|
532
|
+
});
|
|
533
|
+
if (this.configTemplateGroup()?.searchAllLevel && this.keySearch()) {
|
|
534
|
+
items = items.filter(item => item().hasDisplay);
|
|
535
|
+
}
|
|
536
|
+
console.log('items', items);
|
|
537
|
+
this.config()?.sort?.(items);
|
|
538
|
+
this.items.set(items);
|
|
539
|
+
this.multiKeySelected.set([]);
|
|
540
|
+
const callBackCalculatorHeightSuccess = () => {
|
|
541
|
+
this.calculatorHeighItemSuccess.set(true);
|
|
542
|
+
if (configTemplateGroup.expandFirstItem && this.items()[0]) {
|
|
543
|
+
this.expandAllItemsInGroup(this.items()[0]);
|
|
544
|
+
}
|
|
545
|
+
this.setHeightViewPort();
|
|
546
|
+
if (this.firstItemSelected()) {
|
|
547
|
+
this.handlerChangeChecked(true, this.firstItemSelected);
|
|
548
|
+
this.firstItemSelected.set(undefined);
|
|
549
|
+
}
|
|
550
|
+
};
|
|
551
|
+
const checkLoadItem = (preStateHasScroll, currentHasScroll) => {
|
|
552
|
+
if (this.keysHiddenItem()?.length && preStateHasScroll && !currentHasScroll && (this.isSearchOnline())) {
|
|
553
|
+
this.callApiByService(false);
|
|
554
|
+
}
|
|
555
|
+
};
|
|
556
|
+
setTimeout(() => {
|
|
557
|
+
this.loading.set(false);
|
|
558
|
+
this.outLoading.emit(this.loading());
|
|
559
|
+
this.refreshView(callBackCalculatorHeightSuccess, checkLoadItem);
|
|
560
|
+
this.outLoadItemsComplete.emit({ items: this.items() });
|
|
561
|
+
});
|
|
562
|
+
return;
|
|
563
|
+
}
|
|
564
|
+
refreshView(callBackCalculatorHeightSuccess, checkLoadItem) {
|
|
565
|
+
this.setHeightViewPort(callBackCalculatorHeightSuccess);
|
|
566
|
+
this.checkViewPortScroll(checkLoadItem);
|
|
567
|
+
}
|
|
568
|
+
expandAllItemsInGroup(item) {
|
|
569
|
+
const configTemplateGroup = this.configTemplateGroup();
|
|
570
|
+
if (!configTemplateGroup || !item) {
|
|
571
|
+
return;
|
|
572
|
+
}
|
|
573
|
+
item.expand = true;
|
|
574
|
+
const items = item[configTemplateGroup.fieldGetItems];
|
|
575
|
+
if (!items || !items.length) {
|
|
576
|
+
return;
|
|
577
|
+
}
|
|
578
|
+
items.forEach(itemGroup => this.expandAllItemsInGroup(itemGroup));
|
|
579
|
+
}
|
|
580
|
+
convertDataByGroupInItem(items, parentItem) {
|
|
581
|
+
const configTemplateGroup = this.configTemplateGroup();
|
|
582
|
+
if (!configTemplateGroup || !items || !items.length) {
|
|
583
|
+
return [];
|
|
584
|
+
}
|
|
585
|
+
const itemsMap = items.map(item => {
|
|
586
|
+
if (isNil(item()[this.fieldKey()]) || item()[this.fieldKey()] === '') {
|
|
587
|
+
item()[this.fieldKey()] = `${this.PATTERN_FAKE_ID}${uuid()}`;
|
|
588
|
+
}
|
|
589
|
+
const itemMap = cloneDeep(item);
|
|
590
|
+
itemMap.update(current => {
|
|
591
|
+
current.ref = item;
|
|
592
|
+
current.parentItem = parentItem;
|
|
593
|
+
current[this.fieldKey()] = item()[this.fieldKey()];
|
|
594
|
+
current.maxLevelGroup = parentItem().maxLevelGroup;
|
|
595
|
+
current.level = parentItem().level + 1;
|
|
596
|
+
current.arrayLevel = range(2, current.level + 1);
|
|
597
|
+
if ((current.level === current.maxLevelGroup || !configTemplateGroup.ignoreCheckboxItem) && !String(item()[this.fieldKey()])?.includes(this.PATTERN_FAKE_ID)) {
|
|
598
|
+
this.totalItem.update(current => current++);
|
|
599
|
+
}
|
|
600
|
+
current.expand = this.keySearch() ? true : false;
|
|
601
|
+
if (!this.keySearch() && configTemplateGroup.getExpandItem) {
|
|
602
|
+
current.expand = configTemplateGroup.getExpandItem(current);
|
|
603
|
+
}
|
|
604
|
+
current.displayAllChild = parentItem().displayAllChild;
|
|
605
|
+
if (configTemplateGroup.getPopoverItem) {
|
|
606
|
+
current.dataPopover = configTemplateGroup.getPopoverItem(current);
|
|
607
|
+
}
|
|
608
|
+
if (configTemplateGroup.getIconImageClass) {
|
|
609
|
+
current.iconImageClass = configTemplateGroup.getIconImageClass(current);
|
|
610
|
+
}
|
|
611
|
+
const text = deleteUnicode(this.buildValueByConfig(current).toLocaleLowerCase());
|
|
612
|
+
const keySearch = deleteUnicode(escapeHtml((this.keySearch() || '').trim().toLocaleLowerCase()));
|
|
613
|
+
const textEscape = escapeHtml(text);
|
|
614
|
+
if ((!this.keysHiddenItem()?.some(key => key === current[this.fieldKey()])) && ((parentItem().displayAllChild || !keySearch) || ((configTemplateGroup.searchAllLevel || !current[this.fieldKey()].includes(this.PATTERN_FAKE_ID)) && (text.includes(keySearch) || textEscape.includes(keySearch))))) {
|
|
615
|
+
current.displayAllChild = true;
|
|
616
|
+
this.setDisplayItem(current);
|
|
617
|
+
}
|
|
618
|
+
const itemGroup = current[configTemplateGroup.fieldGetItems];
|
|
619
|
+
console.log(itemGroup, current);
|
|
620
|
+
if (itemGroup?.()) {
|
|
621
|
+
const data = this.filterItemsDisplay(this.convertDataByGroupInItem(itemGroup?.(), signal(current)));
|
|
622
|
+
itemGroup.set(data);
|
|
623
|
+
}
|
|
624
|
+
if (current[configTemplateGroup.fieldGetItems]?.()) {
|
|
625
|
+
current[configTemplateGroup.fieldGetItems].update((itemFields) => {
|
|
626
|
+
if (!itemFields.length) {
|
|
627
|
+
return itemFields;
|
|
628
|
+
}
|
|
629
|
+
itemFields[0].isFirst = true;
|
|
630
|
+
const lastIndex = itemFields?.length - 1;
|
|
631
|
+
if (lastIndex >= 0) {
|
|
632
|
+
itemFields[lastIndex].isLast = true;
|
|
633
|
+
}
|
|
634
|
+
return itemFields;
|
|
635
|
+
});
|
|
636
|
+
}
|
|
637
|
+
current.bonusPaddingLeft = 0;
|
|
638
|
+
if (configTemplateGroup.getBonusPaddingLeftItem) {
|
|
639
|
+
current.bonusPaddingLeft = configTemplateGroup.getBonusPaddingLeftItem(current, parentItem);
|
|
640
|
+
}
|
|
641
|
+
if (configTemplateGroup.getClassIncludeItemNoData) {
|
|
642
|
+
current.classIncludeItemNoData = configTemplateGroup.getClassIncludeItemNoData(current, parentItem);
|
|
643
|
+
}
|
|
644
|
+
if (configTemplateGroup.getLinkImageError) {
|
|
645
|
+
current.linkImageError = configTemplateGroup.getLinkImageError(current);
|
|
646
|
+
}
|
|
647
|
+
if (configTemplateGroup.getClassIncludeItemContent) {
|
|
648
|
+
current.classInclude = configTemplateGroup.getClassIncludeItemContent(item);
|
|
649
|
+
}
|
|
650
|
+
current.avatarConfig = configTemplateGroup.getAvatarConfig && configTemplateGroup.getAvatarConfig(current);
|
|
651
|
+
if (this.multiKeySelected() && this.multiKeySelected()?.length && this.multiKeySelected()?.some(key => key === current[this.fieldKey()])) {
|
|
652
|
+
this.handlerChangeChecked(true, current, true);
|
|
653
|
+
}
|
|
654
|
+
if (this.selectFirstItem() && current.level === current.maxLevelGroup) {
|
|
655
|
+
this.firstItemSelected.set(current);
|
|
656
|
+
this.selectFirstItem.set(false);
|
|
657
|
+
}
|
|
658
|
+
return current;
|
|
659
|
+
});
|
|
660
|
+
return itemMap;
|
|
661
|
+
});
|
|
662
|
+
return itemsMap;
|
|
663
|
+
}
|
|
664
|
+
setDisplayItem(item) {
|
|
665
|
+
if (!item) {
|
|
666
|
+
return;
|
|
667
|
+
}
|
|
668
|
+
item.hasDisplay = true;
|
|
669
|
+
if (item.parentItem) {
|
|
670
|
+
this.setDisplayItem(item.parentItem);
|
|
671
|
+
}
|
|
672
|
+
}
|
|
673
|
+
filterItemsDisplay(items) {
|
|
674
|
+
const configTemplateGroup = this.configTemplateGroup();
|
|
675
|
+
if (!configTemplateGroup || !items || !items.length) {
|
|
676
|
+
return [];
|
|
677
|
+
}
|
|
678
|
+
const itemsDisplay = items.filter(item => item().hasDisplay);
|
|
679
|
+
itemsDisplay.forEach(item => {
|
|
680
|
+
const itemGroup = item()[configTemplateGroup.fieldGetItems];
|
|
681
|
+
item()[configTemplateGroup.fieldGetItems]?.set(this.filterItemsDisplay(itemGroup()));
|
|
682
|
+
});
|
|
683
|
+
return itemsDisplay;
|
|
684
|
+
}
|
|
685
|
+
getLengthItem() {
|
|
686
|
+
const data = { length: this.items.length };
|
|
687
|
+
if (data.length > this.maxItemShow()) {
|
|
688
|
+
return data.length;
|
|
689
|
+
}
|
|
690
|
+
this.getLengthAllGroup(this.items(), data);
|
|
691
|
+
return data.length;
|
|
692
|
+
}
|
|
693
|
+
getLengthAllGroup(items, data) {
|
|
694
|
+
const configTemplateGroup = this.configTemplateGroup();
|
|
695
|
+
if (!configTemplateGroup || !items) {
|
|
696
|
+
return;
|
|
697
|
+
}
|
|
698
|
+
for (const item of items) {
|
|
699
|
+
if (!item().expand) {
|
|
700
|
+
continue;
|
|
701
|
+
}
|
|
702
|
+
const group = item()[configTemplateGroup.fieldGetItems];
|
|
703
|
+
data.length += (group()?.length || 0);
|
|
704
|
+
if ((!group() || !group().length) && item().level === 1 && (!configTemplateGroup.searchAllLevel || configTemplateGroup.autoCountWhenGroupEmptyItemLevel1)) {
|
|
705
|
+
data.length += 1;
|
|
706
|
+
}
|
|
707
|
+
if (data.length > this.maxItemShow()) {
|
|
708
|
+
return;
|
|
709
|
+
}
|
|
710
|
+
this.getLengthAllGroup(group(), data);
|
|
711
|
+
if (data.length > this.maxItemShow()) {
|
|
712
|
+
return;
|
|
713
|
+
}
|
|
714
|
+
}
|
|
715
|
+
}
|
|
716
|
+
getHeightGroupHasLine() {
|
|
717
|
+
const configTemplateGroup = this.configTemplateGroup();
|
|
718
|
+
if (!configTemplateGroup || configTemplateGroup?.ignoreGroupLine || !this.items?.length) {
|
|
719
|
+
return 0;
|
|
720
|
+
}
|
|
721
|
+
let length = 0;
|
|
722
|
+
let count = 0;
|
|
723
|
+
for (const item of this.items()) {
|
|
724
|
+
if (length >= this.maxItemShow()) {
|
|
725
|
+
break;
|
|
726
|
+
}
|
|
727
|
+
count += 1;
|
|
728
|
+
length += 1;
|
|
729
|
+
const group = item()[configTemplateGroup.fieldGetItems];
|
|
730
|
+
const data = { length: item().expand ? group()?.length || 0 : 0 };
|
|
731
|
+
this.getLengthAllGroup(group(), data);
|
|
732
|
+
length += data.length;
|
|
733
|
+
}
|
|
734
|
+
const marginTopHasLine = configTemplateGroup.marginTopHasLine || 4;
|
|
735
|
+
const height = count === 1 ? marginTopHasLine : (count - 1) * (marginTopHasLine * 3 + 1);
|
|
736
|
+
return height;
|
|
737
|
+
}
|
|
738
|
+
buildValueByConfig(item) {
|
|
739
|
+
const labelSearch = this.configTemplateGroup()?.getLabelSearch?.(item);
|
|
740
|
+
if (item.isRoot) {
|
|
741
|
+
if (this.configTemplateGroup()?.getLabelGroup) {
|
|
742
|
+
item.fieldLabel = this.translateService.instant(this.configTemplateGroup()?.getLabelGroup(item) || ' ');
|
|
743
|
+
return labelSearch ?? item.fieldLabel;
|
|
744
|
+
}
|
|
745
|
+
item.fieldLabel = this.translateService.instant(item.label || item.name || ' ');
|
|
746
|
+
return item.fieldLabel;
|
|
747
|
+
}
|
|
748
|
+
if (this.configTemplateGroup()?.getLabelItem) {
|
|
749
|
+
item.fieldLabel = this.translateService.instant(this.configTemplateGroup()?.getLabelItem(item) || ' ');
|
|
750
|
+
return labelSearch ?? item.fieldLabel;
|
|
751
|
+
}
|
|
752
|
+
item.fieldLabel = this.translateService.instant(item.label || item.name || ' ');
|
|
753
|
+
return labelSearch ?? item.fieldLabel;
|
|
754
|
+
}
|
|
755
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LibsUiComponentsListGroupComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
756
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: LibsUiComponentsListGroupComponent, isStandalone: true, selector: "libs_ui-components-list-templates_group", usesInheritance: true, ngImport: i0, template: "@if (configTemplateGroup(); as configTemplateGroup) {\n <div class=\"libs-ui-list-group overflow-[hidden]\"\n [style.height]=\"heightViewPort() ? heightViewPort()+'px':'100%'\">\n <div class=\"flex flex-col w-full h-full relative min-h-[28px]\">\n @if (items().length && configTemplateGroup.configButtonSelectAndUndSelectItem?.(); as configButtonSelectItem) {\n <div [class]=\"'flex items-center bg-[#ffffff] '+(configButtonSelectItem.classInclude ?? 'libs-ui-border-bottom-general')\">\n <libs_ui-components-buttons-button [type]=\"configButtonSelectItem.buttonCheckAll?.type ?? 'button-link-primary'\"\n [label]=\"configButtonSelectItem.buttonCheckAll?.label ?? 'i18n_select_all_searched_results'\"\n [classInclude]=\"configButtonSelectItem.buttonCheckAll?.classInclude || 'pr-[8px]'\"\n [classLabel]=\"configButtonSelectItem.buttonCheckAll?.classLabel || 'libs-ui-font-h6r'\"\n [disable]=\"loading() || disable() || false\"\n (outClick)=\"handlerCheckedOrUnCheckedAll(true)\" />\n <div class=\"text-[#999999]\">|</div>\n <libs_ui-components-buttons-button [type]=\"configButtonSelectItem.buttonUncheckAll?.type ?? 'button-link-primary'\"\n [label]=\"configButtonSelectItem.buttonUncheckAll?.label ?? 'i18n_unselect_all_searched_results'\"\n [classInclude]=\"configButtonSelectItem.buttonUncheckAll?.classInclude || 'pl-[8px]'\"\n [classLabel]=\"configButtonSelectItem.buttonUncheckAll?.classLabel || 'libs-ui-font-h6s'\"\n [disable]=\"loading() || disable() || false\"\n (outClick)=\"handlerCheckedOrUnCheckedAll(false)\" />\n </div>\n }\n @if (items().length && configTemplateGroup.configCheckboxCheckAll?.(); as configCheckBox) {\n <div [class]=\"'flex libs-ui-border-bottom-general '+(configTemplateGroup.classIncludeHasConfigCheckBoxAll ?? ' bg-[#ffffff]')\">\n <libs_ui-components-checkbox-single [label]=\"configCheckBox.label ?? 'i18n_all'\"\n [classLabelInclude]=\"configCheckBox.classLabelInclude || ''\"\n [checked]=\"totalItemChecked() >= totalItem() && totalItem() > 0\"\n [disable]=\"loading() || disable() || false\"\n (outChangStageFlagMousePopover)='handlerChangStageFlagMouse($event)'\n (outChange)=\"handlerCheckedOrUnCheckedAll($event.checked)\" />\n </div>\n }\n @if (items() && items().length) {\n <div class=\"w-full h-full relative flex\">\n <div LibsUiComponentsScrollOverlayDirective\n class=\"w-full h-full absolute top-0 left-0 {{ configTemplateGroup.classIncludeGroup ? configTemplateGroup.classIncludeGroup : '' }}\">\n @for (item of items(); track item()[fieldKey()]; let first = $first; let last = $last) {\n <div #itemRef\n [style.marginTop.px]=\"!configTemplateGroup.ignoreGroupLine ? configTemplateGroup.marginTopHasLine || 4 : 0\"\n class=\"flex flex-col relative \">\n <div class=\"flex items-center py-[6px] \"\n [class.libs-ui-bg-list-hover]=\"!configTemplateGroup.ignoreClickLabelGroup\"\n [class.libs-ui-bg-list-hover-active]=\"!configTemplateGroup.ignoreClickLabelGroup\"\n [class.!cursor-pointer]=\"!configTemplateGroup.ignoreClickLabelGroup && (configTemplateGroup.ignoreCheckboxGroup || configTemplateGroup.singleSelectItem)\"\n [style.paddingLeft.px]=\"level()*(configTemplateGroup.isViewTree ? 8 : 16)\"\n (click)=\"(configTemplateGroup.ignoreCheckboxGroup || configTemplateGroup.singleSelectItem) ? handlerToggleExpand($event,item()) : undefined\">\n @if (configTemplateGroup.iconExpand === 'left' || configTemplateGroup.isViewTree) {\n <i class=\"cursor-pointer libs-ui-icon-chevron-right\"\n [class.rotate-90]=\"item().expand\"\n (click)=\"handlerToggleExpand($event,item())\">\n </i>\n }\n <div class=\"flex\"\n [class.mo-lib-calc-w-32px]=\"configTemplateGroup.iconExpand === 'right' && !configTemplateGroup.isViewTree && (!configTemplateGroup.searchAllLevel || !!item()[configTemplateGroup.fieldGetItems]?.length)\"\n [class.mo-lib-calc-w-16px]=\"configTemplateGroup.iconExpand === 'left' || configTemplateGroup.isViewTree\">\n @if (!configTemplateGroup.isViewRadio) {\n <libs_ui-components-checkbox-single [avatarConfig]=\"item().avatarConfig\"\n [class.ml-[8px]]=\"configTemplateGroup.iconExpand === 'left' || configTemplateGroup.isViewTree\"\n [ignoreCheckbox]=\"configTemplateGroup.ignoreCheckboxGroup || configTemplateGroup.singleSelectItem\"\n [class]=\"configTemplateGroup.classIncludeItem || ''\"\n [class.w-auto]=\"configTemplateGroup.isViewTree\"\n [class.w-full]=\"!item()[configTemplateGroup.fieldGetItems]?.length && !((configTemplateGroup.isViewTree || configTemplateGroup.widthLabelSub24WhenNotTreeView) && (configTemplateGroup.iconExpand === 'left' || configTemplateGroup.iconExpand === 'right' && (!configTemplateGroup.searchAllLevel || !!item()[configTemplateGroup.fieldGetItems]?.length)))\"\n [class.max-w-[calc(100%-24px)]]=\"(configTemplateGroup.isViewTree || configTemplateGroup.widthLabelSub24WhenNotTreeView) && (configTemplateGroup.iconExpand === 'left' || configTemplateGroup.iconExpand === 'right' && (!configTemplateGroup.searchAllLevel || !!item()[configTemplateGroup.fieldGetItems]?.length))\"\n [label]=\"item().fieldLabel\"\n [popover]=\"item().dataPopover\"\n [zIndexLabel]=\"configTemplateGroup.zIndexLabel ?? zIndex()\"\n [linkImage]=\"configTemplateGroup.getImage ? (('avatar' | LibsUiPipesCallFunctionInTemplatePipe:(item().specific_loadImgError && configTemplateGroup.getLinkImageError ? configTemplateGroup.getLinkImageError : configTemplateGroup.getImage):item()) | async) : item()[configTemplateGroup.fieldGetAvatarItem || '']\"\n [imgTypeIcon]=\"configTemplateGroup.imgTypeIcon\"\n [classLabelInclude]=\"(configTemplateGroup.classLabelItem ? configTemplateGroup.classLabelItem : (configTemplateGroup.isViewTree ? ' mo-lib-font-head-6 ':' mo-lib-font-head-6s ')) + ((configTemplateGroup.ignoreTextUppercaseLabelGroup || configTemplateGroup.isViewTree) ? '':' text-uppercase ')\"\n [disable]=\"disable() || (item()[fieldKey()] | LibsUiCheckSelectedByKeyPipe:keysDisableItem():keysDisableItem()?.length)\"\n [checked]=\"item()[fieldKey()] | LibsUiCheckSelectedByKeyPipe:keysChecked():keysChecked().length\"\n [stillOtherOptions]=\"item()[fieldKey()] | LibsUiCheckSelectedByKeyPipe:keysStillOtherOptions():keysStillOtherOptions().length\"\n (outChange)=\"handlerChangeChecked($event.checked,item())\"\n (outChangStageFlagMousePopover)='handlerChangStageFlagMouse($event)'\n (outClickLabel)=\"handlerToggleExpand('clickLabel',item(),configTemplateGroup.ignoreCheckboxGroup || configTemplateGroup.singleSelectItem)\" />\n }\n\n @if (configTemplateGroup.isViewRadio) {\n <libs_ui-components-radio-single [class.ml-[8px]]=\"configTemplateGroup.iconExpand === 'left' || configTemplateGroup.isViewTree\"\n [avatarConfig]=\"item().avatarConfig\"\n [ignoreRadio]=\"configTemplateGroup.ignoreRadioGroup || configTemplateGroup.singleSelectItem\"\n [class]=\"configTemplateGroup.classIncludeItem || ''\"\n [class.w-auto]=\"configTemplateGroup.isViewTree\"\n [class.w-full]=\"!item()[configTemplateGroup.fieldGetItems]?.length && !((configTemplateGroup.isViewTree || configTemplateGroup.widthLabelSub24WhenNotTreeView) && (configTemplateGroup.iconExpand === 'left' || configTemplateGroup.iconExpand === 'right' && (!configTemplateGroup.searchAllLevel || !!item()[configTemplateGroup.fieldGetItems]?.length)))\"\n [class.max-w-[calc(100%-24px)]]=\"(configTemplateGroup.isViewTree || configTemplateGroup.widthLabelSub24WhenNotTreeView) && (configTemplateGroup.iconExpand === 'left' || configTemplateGroup.iconExpand === 'right' && (!configTemplateGroup.searchAllLevel || !!item()[configTemplateGroup.fieldGetItems]?.length))\"\n [label]=\"item().fieldLabel\"\n [popover]=\"item().dataPopover\"\n [zIndexLabel]=\"configTemplateGroup.zIndexLabel ?? zIndex()\"\n [imgTypeIcon]=\"configTemplateGroup.imgTypeIcon\"\n [linkImage]=\"configTemplateGroup.getImage ? (('avatar' | LibsUiPipesCallFunctionInTemplatePipe:(item().specific_loadImgError && configTemplateGroup.getLinkImageError ? configTemplateGroup.getLinkImageError : configTemplateGroup.getImage):item()) | async) : item()[configTemplateGroup.fieldGetAvatarItem || '']\"\n [classLabelInclude]=\"(configTemplateGroup.classLabelItem ? configTemplateGroup.classLabelItem : 'libs-ui-font-h6s ') + (configTemplateGroup.ignoreTextUppercaseLabelGroup ? '':' uppercase')\"\n [disable]=\"disable() || (configTemplateGroup.disableItemNotLastLevel && !!item()[configTemplateGroup.fieldGetItems]?.length) || configTemplateGroup.ignoreCheckboxGroup || configTemplateGroup.singleSelectItem || (item()[fieldKey()] | LibsUiCheckSelectedByKeyPipe:keysDisableItem():keysDisableItem()?.length)\"\n [active]=\"item()[fieldKey()] | LibsUiCheckSelectedByKeyPipe:keysChecked():keysChecked().length\"\n (outChange)=\"handlerChangeChecked($event.active,item())\"\n (outChangStageFlagMousePopover)='handlerChangStageFlagMouse($event)'\n (outClickLabel)=\"handlerToggleExpand('clickLabel',item(),configTemplateGroup.ignoreRadioGroup || configTemplateGroup.singleSelectItem)\" />\n }\n\n @if (item().buttonInGroup; as buttonInGroup) {\n <libs_ui-components-buttons-button [type]=\"buttonInGroup.type || 'button-link-primary'\"\n [label]=\"buttonInGroup.label || ' '\"\n [classIconLeft]=\"(buttonInGroup.classIconLeft || '')+' flex mr-[8px] !text-[8px]'\"\n [classInclude]=\"buttonInGroup.classInclude\"\n [classLabel]=\"buttonInGroup.classLabel || 'libs-ui-font-h5r'\"\n [disable]=\"buttonInGroup.disable || disable() || false\"\n (outClick)=\"handlerClickButtonGroup(buttonInGroup,item())\" />\n }\n </div>\n\n @if (configTemplateGroup.iconExpand === 'right' && !configTemplateGroup.isViewTree && (!configTemplateGroup.searchAllLevel || !!item()[configTemplateGroup.fieldGetItems]?.length)) {\n <i class=\"flex items-center cursor-pointer mr-[16px] libs-ui-icon-chevron-right\"\n [class.ml-[8px]]=\"item().dataPopover\"\n [class.rotate-90]=\"item().expand\"\n (click)=\"handlerToggleExpand($event,item)\">\n </i>\n }\n </div>\n @if (item().expand && calculatorHeighItemSuccess()) {\n <libs_ui-components-list-templates_group-item [keySearch]=\"keySearch()\"\n [items]=\"item()[configTemplateGroup.fieldGetItems]\"\n [parentItem]=\"item()\"\n [fieldKey]=\"fieldKey()\"\n [keysChecked]=\"keysChecked()\"\n [disable]=\"disable()\"\n [keysDisableItem]=\"keysDisableItem() || []\"\n [configTemplateGroup]=\"configTemplateGroup\"\n [config]=\"config()\"\n [keysStillOtherOptions]=\"keysStillOtherOptions()\"\n (outChangeView)=\"handlerChangeView()\"\n (outChangStageFlagMouseTooltip)='handlerChangStageFlagMouse($event)'\n (outChange)=\"handlerChangeItemChecked($event.item)\" />\n }\n @if (!last && !configTemplateGroup.ignoreGroupLine && calculatorHeighItemSuccess()) {\n <div class=\"libs-ui-list-group-line\"\n [style.marginTop.px]=\"!configTemplateGroup.ignoreGroupLine ? configTemplateGroup.marginTopHasLine || 4 : 0\">\n </div>\n }\n </div>\n }\n </div>\n </div>\n }\n @if (!items() || !items().length) {\n <div class=\"libs-ui-font-h5r text-[#c1c1c1] relative {{ configTemplateGroup.classIncludeNodata?configTemplateGroup.classIncludeNodata:'' }}\"\n [style.marginLeft.px]=\"0 | LibsUiComponentsListGroupCalculatorMarginLeftItemPipe:2:(configTemplateGroup.isViewTree || configTemplateGroup.iconExpand === 'left'):configTemplateGroup.isViewTreeJson:!(configTemplateGroup.ignoreCheckboxItem || configTemplateGroup.ignoreRadioItem || configTemplateGroup.singleSelectItem):true\"\n [class.py-[8px]]=\"configTemplateGroup.fieldGetAvatarItem\"\n [class.py-[4px]]=\"!configTemplateGroup.fieldGetAvatarItem\">\n @if (!keySearch() && !loading()) {\n <div>{{ (config()?.textNoData ?? 'i18n_no_data_yet') | translate }}</div>\n }\n @if (keySearch() && !loading()) {\n <div>{{ (config()?.textSearchNoData ??'i18n_no_result') | translate }}</div>\n }\n </div>\n }\n @if (loading()) {\n <libs_ui-components-spinner [size]=\"'medium'\" />\n }\n </div>\n </div>\n}\n", styles: [".libs-ui-list-group{display:flex;flex-direction:column;width:100%}.libs-ui-list-group .libs-ui-list-group-line{width:100%;height:1px;background-color:#e6e7ea}.libs-ui-list-group [class*=libs-ui-icon-chevron]:before{color:#6a7383}\n"], dependencies: [{ kind: "ngmodule", type: VirtualScrollerModule }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "component", type: LibsUiComponentsButtonsButtonComponent, selector: "libs_ui-components-buttons-button", inputs: ["flagMouse", "type", "buttonCustom", "sizeButton", "label", "disable", "isPending", "imageLeft", "classInclude", "classIconLeft", "classIconRight", "classLabel", "iconOnlyType", "popover", "ignoreStopPropagationEvent", "zIndex", "widthLabelPopover", "styleIconLeft", "styleButton", "ignoreFocusWhenInputTab", "ignoreSetClickWhenShowPopover", "ignorePointerEvent", "isActive"], outputs: ["outClick", "outPopoverEvent", "outFunctionsControl"] }, { kind: "component", type: LibsUiComponentsCheckboxSingleComponent, selector: "libs_ui-components-checkbox-single", inputs: ["key", "checked", "label", "classLabelInclude", "ignoreShowPopoverLabel", "typeLabelPopover", "popover", "linkImage", "linkImageError", "avatarConfig", "classImageInclude", "imgTypeIcon", "bullet", "classInclude", "clickExactly", "disable", "disableLabel", "ignoreCheckbox", "zIndexLabel", "stillOtherOptions", "error", "showBorderError", "description", "iconImageClass", "classIconInclude", "modeBorder"], outputs: ["checkedChange", "linkImageChange", "outChange", "outEventPopover", "outClickLabel", "outChangStageFlagMousePopover"] }, { kind: "component", type: LibsUiComponentsRadioSingleComponent, selector: "libs_ui-components-radio-single", inputs: ["key", "active", "classInclude", "label", "labelInterpolateParams", "ignorePopoverLabe", "classLabelInclude", "linkImage", "linkImageError", "avatarConfig", "classImageInclude", "imgTypeIcon", "bullet", "popover", "disable", "disableLabel", "clickExactly", "typeRadio", "ignoreRadio", "zIndexLabel", "classIncludeIcon"], outputs: ["activeChange", "outClickLabel", "outChange", "outChangStageFlagMousePopover"] }, { kind: "component", type: LibsUiComponentsSpinnerComponent, selector: "libs_ui-components-spinner", inputs: ["type", "size"] }, { kind: "directive", type: LibsUiComponentsScrollOverlayDirective, selector: "[LibsUiComponentsScrollOverlayDirective]", inputs: ["classContainer", "options"], outputs: ["outScroll", "outScrollX", "outScrollY", "outScrollTop", "outScrollBottom"] }, { kind: "pipe", type: LibsUiCheckSelectedByKeyPipe, name: "LibsUiCheckSelectedByKeyPipe" }, { kind: "pipe", type: LibsUiPipesCallFunctionInTemplatePipe, name: "LibsUiPipesCallFunctionInTemplatePipe" }, { kind: "pipe", type: LibsUiComponentsListGroupCalculatorMarginLeftItemPipe, name: "LibsUiComponentsListGroupCalculatorMarginLeftItemPipe" }, { kind: "component", type: LibsUiComponentsListGroupItemComponent, selector: "libs_ui-components-list-templates_group-item", inputs: ["items", "configTemplateGroup", "keySearch", "fieldKey", "keysChecked", "keysDisableItem", "parentItem", "disable", "disableLabel", "config", "keysStillOtherOptions"], outputs: ["outChangeView", "outChange", "outChangStageFlagMouseTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
757
|
+
}
|
|
758
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LibsUiComponentsListGroupComponent, decorators: [{
|
|
759
|
+
type: Component,
|
|
760
|
+
args: [{ selector: 'libs_ui-components-list-templates_group', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [
|
|
761
|
+
VirtualScrollerModule, AsyncPipe, TranslateModule,
|
|
762
|
+
LibsUiComponentsButtonsButtonComponent,
|
|
763
|
+
LibsUiComponentsCheckboxSingleComponent,
|
|
764
|
+
LibsUiComponentsRadioSingleComponent,
|
|
765
|
+
LibsUiComponentsSpinnerComponent,
|
|
766
|
+
LibsUiComponentsScrollOverlayDirective,
|
|
767
|
+
LibsUiCheckSelectedByKeyPipe,
|
|
768
|
+
LibsUiPipesCallFunctionInTemplatePipe,
|
|
769
|
+
LibsUiComponentsListGroupCalculatorMarginLeftItemPipe,
|
|
770
|
+
LibsUiComponentsListGroupItemComponent
|
|
771
|
+
], template: "@if (configTemplateGroup(); as configTemplateGroup) {\n <div class=\"libs-ui-list-group overflow-[hidden]\"\n [style.height]=\"heightViewPort() ? heightViewPort()+'px':'100%'\">\n <div class=\"flex flex-col w-full h-full relative min-h-[28px]\">\n @if (items().length && configTemplateGroup.configButtonSelectAndUndSelectItem?.(); as configButtonSelectItem) {\n <div [class]=\"'flex items-center bg-[#ffffff] '+(configButtonSelectItem.classInclude ?? 'libs-ui-border-bottom-general')\">\n <libs_ui-components-buttons-button [type]=\"configButtonSelectItem.buttonCheckAll?.type ?? 'button-link-primary'\"\n [label]=\"configButtonSelectItem.buttonCheckAll?.label ?? 'i18n_select_all_searched_results'\"\n [classInclude]=\"configButtonSelectItem.buttonCheckAll?.classInclude || 'pr-[8px]'\"\n [classLabel]=\"configButtonSelectItem.buttonCheckAll?.classLabel || 'libs-ui-font-h6r'\"\n [disable]=\"loading() || disable() || false\"\n (outClick)=\"handlerCheckedOrUnCheckedAll(true)\" />\n <div class=\"text-[#999999]\">|</div>\n <libs_ui-components-buttons-button [type]=\"configButtonSelectItem.buttonUncheckAll?.type ?? 'button-link-primary'\"\n [label]=\"configButtonSelectItem.buttonUncheckAll?.label ?? 'i18n_unselect_all_searched_results'\"\n [classInclude]=\"configButtonSelectItem.buttonUncheckAll?.classInclude || 'pl-[8px]'\"\n [classLabel]=\"configButtonSelectItem.buttonUncheckAll?.classLabel || 'libs-ui-font-h6s'\"\n [disable]=\"loading() || disable() || false\"\n (outClick)=\"handlerCheckedOrUnCheckedAll(false)\" />\n </div>\n }\n @if (items().length && configTemplateGroup.configCheckboxCheckAll?.(); as configCheckBox) {\n <div [class]=\"'flex libs-ui-border-bottom-general '+(configTemplateGroup.classIncludeHasConfigCheckBoxAll ?? ' bg-[#ffffff]')\">\n <libs_ui-components-checkbox-single [label]=\"configCheckBox.label ?? 'i18n_all'\"\n [classLabelInclude]=\"configCheckBox.classLabelInclude || ''\"\n [checked]=\"totalItemChecked() >= totalItem() && totalItem() > 0\"\n [disable]=\"loading() || disable() || false\"\n (outChangStageFlagMousePopover)='handlerChangStageFlagMouse($event)'\n (outChange)=\"handlerCheckedOrUnCheckedAll($event.checked)\" />\n </div>\n }\n @if (items() && items().length) {\n <div class=\"w-full h-full relative flex\">\n <div LibsUiComponentsScrollOverlayDirective\n class=\"w-full h-full absolute top-0 left-0 {{ configTemplateGroup.classIncludeGroup ? configTemplateGroup.classIncludeGroup : '' }}\">\n @for (item of items(); track item()[fieldKey()]; let first = $first; let last = $last) {\n <div #itemRef\n [style.marginTop.px]=\"!configTemplateGroup.ignoreGroupLine ? configTemplateGroup.marginTopHasLine || 4 : 0\"\n class=\"flex flex-col relative \">\n <div class=\"flex items-center py-[6px] \"\n [class.libs-ui-bg-list-hover]=\"!configTemplateGroup.ignoreClickLabelGroup\"\n [class.libs-ui-bg-list-hover-active]=\"!configTemplateGroup.ignoreClickLabelGroup\"\n [class.!cursor-pointer]=\"!configTemplateGroup.ignoreClickLabelGroup && (configTemplateGroup.ignoreCheckboxGroup || configTemplateGroup.singleSelectItem)\"\n [style.paddingLeft.px]=\"level()*(configTemplateGroup.isViewTree ? 8 : 16)\"\n (click)=\"(configTemplateGroup.ignoreCheckboxGroup || configTemplateGroup.singleSelectItem) ? handlerToggleExpand($event,item()) : undefined\">\n @if (configTemplateGroup.iconExpand === 'left' || configTemplateGroup.isViewTree) {\n <i class=\"cursor-pointer libs-ui-icon-chevron-right\"\n [class.rotate-90]=\"item().expand\"\n (click)=\"handlerToggleExpand($event,item())\">\n </i>\n }\n <div class=\"flex\"\n [class.mo-lib-calc-w-32px]=\"configTemplateGroup.iconExpand === 'right' && !configTemplateGroup.isViewTree && (!configTemplateGroup.searchAllLevel || !!item()[configTemplateGroup.fieldGetItems]?.length)\"\n [class.mo-lib-calc-w-16px]=\"configTemplateGroup.iconExpand === 'left' || configTemplateGroup.isViewTree\">\n @if (!configTemplateGroup.isViewRadio) {\n <libs_ui-components-checkbox-single [avatarConfig]=\"item().avatarConfig\"\n [class.ml-[8px]]=\"configTemplateGroup.iconExpand === 'left' || configTemplateGroup.isViewTree\"\n [ignoreCheckbox]=\"configTemplateGroup.ignoreCheckboxGroup || configTemplateGroup.singleSelectItem\"\n [class]=\"configTemplateGroup.classIncludeItem || ''\"\n [class.w-auto]=\"configTemplateGroup.isViewTree\"\n [class.w-full]=\"!item()[configTemplateGroup.fieldGetItems]?.length && !((configTemplateGroup.isViewTree || configTemplateGroup.widthLabelSub24WhenNotTreeView) && (configTemplateGroup.iconExpand === 'left' || configTemplateGroup.iconExpand === 'right' && (!configTemplateGroup.searchAllLevel || !!item()[configTemplateGroup.fieldGetItems]?.length)))\"\n [class.max-w-[calc(100%-24px)]]=\"(configTemplateGroup.isViewTree || configTemplateGroup.widthLabelSub24WhenNotTreeView) && (configTemplateGroup.iconExpand === 'left' || configTemplateGroup.iconExpand === 'right' && (!configTemplateGroup.searchAllLevel || !!item()[configTemplateGroup.fieldGetItems]?.length))\"\n [label]=\"item().fieldLabel\"\n [popover]=\"item().dataPopover\"\n [zIndexLabel]=\"configTemplateGroup.zIndexLabel ?? zIndex()\"\n [linkImage]=\"configTemplateGroup.getImage ? (('avatar' | LibsUiPipesCallFunctionInTemplatePipe:(item().specific_loadImgError && configTemplateGroup.getLinkImageError ? configTemplateGroup.getLinkImageError : configTemplateGroup.getImage):item()) | async) : item()[configTemplateGroup.fieldGetAvatarItem || '']\"\n [imgTypeIcon]=\"configTemplateGroup.imgTypeIcon\"\n [classLabelInclude]=\"(configTemplateGroup.classLabelItem ? configTemplateGroup.classLabelItem : (configTemplateGroup.isViewTree ? ' mo-lib-font-head-6 ':' mo-lib-font-head-6s ')) + ((configTemplateGroup.ignoreTextUppercaseLabelGroup || configTemplateGroup.isViewTree) ? '':' text-uppercase ')\"\n [disable]=\"disable() || (item()[fieldKey()] | LibsUiCheckSelectedByKeyPipe:keysDisableItem():keysDisableItem()?.length)\"\n [checked]=\"item()[fieldKey()] | LibsUiCheckSelectedByKeyPipe:keysChecked():keysChecked().length\"\n [stillOtherOptions]=\"item()[fieldKey()] | LibsUiCheckSelectedByKeyPipe:keysStillOtherOptions():keysStillOtherOptions().length\"\n (outChange)=\"handlerChangeChecked($event.checked,item())\"\n (outChangStageFlagMousePopover)='handlerChangStageFlagMouse($event)'\n (outClickLabel)=\"handlerToggleExpand('clickLabel',item(),configTemplateGroup.ignoreCheckboxGroup || configTemplateGroup.singleSelectItem)\" />\n }\n\n @if (configTemplateGroup.isViewRadio) {\n <libs_ui-components-radio-single [class.ml-[8px]]=\"configTemplateGroup.iconExpand === 'left' || configTemplateGroup.isViewTree\"\n [avatarConfig]=\"item().avatarConfig\"\n [ignoreRadio]=\"configTemplateGroup.ignoreRadioGroup || configTemplateGroup.singleSelectItem\"\n [class]=\"configTemplateGroup.classIncludeItem || ''\"\n [class.w-auto]=\"configTemplateGroup.isViewTree\"\n [class.w-full]=\"!item()[configTemplateGroup.fieldGetItems]?.length && !((configTemplateGroup.isViewTree || configTemplateGroup.widthLabelSub24WhenNotTreeView) && (configTemplateGroup.iconExpand === 'left' || configTemplateGroup.iconExpand === 'right' && (!configTemplateGroup.searchAllLevel || !!item()[configTemplateGroup.fieldGetItems]?.length)))\"\n [class.max-w-[calc(100%-24px)]]=\"(configTemplateGroup.isViewTree || configTemplateGroup.widthLabelSub24WhenNotTreeView) && (configTemplateGroup.iconExpand === 'left' || configTemplateGroup.iconExpand === 'right' && (!configTemplateGroup.searchAllLevel || !!item()[configTemplateGroup.fieldGetItems]?.length))\"\n [label]=\"item().fieldLabel\"\n [popover]=\"item().dataPopover\"\n [zIndexLabel]=\"configTemplateGroup.zIndexLabel ?? zIndex()\"\n [imgTypeIcon]=\"configTemplateGroup.imgTypeIcon\"\n [linkImage]=\"configTemplateGroup.getImage ? (('avatar' | LibsUiPipesCallFunctionInTemplatePipe:(item().specific_loadImgError && configTemplateGroup.getLinkImageError ? configTemplateGroup.getLinkImageError : configTemplateGroup.getImage):item()) | async) : item()[configTemplateGroup.fieldGetAvatarItem || '']\"\n [classLabelInclude]=\"(configTemplateGroup.classLabelItem ? configTemplateGroup.classLabelItem : 'libs-ui-font-h6s ') + (configTemplateGroup.ignoreTextUppercaseLabelGroup ? '':' uppercase')\"\n [disable]=\"disable() || (configTemplateGroup.disableItemNotLastLevel && !!item()[configTemplateGroup.fieldGetItems]?.length) || configTemplateGroup.ignoreCheckboxGroup || configTemplateGroup.singleSelectItem || (item()[fieldKey()] | LibsUiCheckSelectedByKeyPipe:keysDisableItem():keysDisableItem()?.length)\"\n [active]=\"item()[fieldKey()] | LibsUiCheckSelectedByKeyPipe:keysChecked():keysChecked().length\"\n (outChange)=\"handlerChangeChecked($event.active,item())\"\n (outChangStageFlagMousePopover)='handlerChangStageFlagMouse($event)'\n (outClickLabel)=\"handlerToggleExpand('clickLabel',item(),configTemplateGroup.ignoreRadioGroup || configTemplateGroup.singleSelectItem)\" />\n }\n\n @if (item().buttonInGroup; as buttonInGroup) {\n <libs_ui-components-buttons-button [type]=\"buttonInGroup.type || 'button-link-primary'\"\n [label]=\"buttonInGroup.label || ' '\"\n [classIconLeft]=\"(buttonInGroup.classIconLeft || '')+' flex mr-[8px] !text-[8px]'\"\n [classInclude]=\"buttonInGroup.classInclude\"\n [classLabel]=\"buttonInGroup.classLabel || 'libs-ui-font-h5r'\"\n [disable]=\"buttonInGroup.disable || disable() || false\"\n (outClick)=\"handlerClickButtonGroup(buttonInGroup,item())\" />\n }\n </div>\n\n @if (configTemplateGroup.iconExpand === 'right' && !configTemplateGroup.isViewTree && (!configTemplateGroup.searchAllLevel || !!item()[configTemplateGroup.fieldGetItems]?.length)) {\n <i class=\"flex items-center cursor-pointer mr-[16px] libs-ui-icon-chevron-right\"\n [class.ml-[8px]]=\"item().dataPopover\"\n [class.rotate-90]=\"item().expand\"\n (click)=\"handlerToggleExpand($event,item)\">\n </i>\n }\n </div>\n @if (item().expand && calculatorHeighItemSuccess()) {\n <libs_ui-components-list-templates_group-item [keySearch]=\"keySearch()\"\n [items]=\"item()[configTemplateGroup.fieldGetItems]\"\n [parentItem]=\"item()\"\n [fieldKey]=\"fieldKey()\"\n [keysChecked]=\"keysChecked()\"\n [disable]=\"disable()\"\n [keysDisableItem]=\"keysDisableItem() || []\"\n [configTemplateGroup]=\"configTemplateGroup\"\n [config]=\"config()\"\n [keysStillOtherOptions]=\"keysStillOtherOptions()\"\n (outChangeView)=\"handlerChangeView()\"\n (outChangStageFlagMouseTooltip)='handlerChangStageFlagMouse($event)'\n (outChange)=\"handlerChangeItemChecked($event.item)\" />\n }\n @if (!last && !configTemplateGroup.ignoreGroupLine && calculatorHeighItemSuccess()) {\n <div class=\"libs-ui-list-group-line\"\n [style.marginTop.px]=\"!configTemplateGroup.ignoreGroupLine ? configTemplateGroup.marginTopHasLine || 4 : 0\">\n </div>\n }\n </div>\n }\n </div>\n </div>\n }\n @if (!items() || !items().length) {\n <div class=\"libs-ui-font-h5r text-[#c1c1c1] relative {{ configTemplateGroup.classIncludeNodata?configTemplateGroup.classIncludeNodata:'' }}\"\n [style.marginLeft.px]=\"0 | LibsUiComponentsListGroupCalculatorMarginLeftItemPipe:2:(configTemplateGroup.isViewTree || configTemplateGroup.iconExpand === 'left'):configTemplateGroup.isViewTreeJson:!(configTemplateGroup.ignoreCheckboxItem || configTemplateGroup.ignoreRadioItem || configTemplateGroup.singleSelectItem):true\"\n [class.py-[8px]]=\"configTemplateGroup.fieldGetAvatarItem\"\n [class.py-[4px]]=\"!configTemplateGroup.fieldGetAvatarItem\">\n @if (!keySearch() && !loading()) {\n <div>{{ (config()?.textNoData ?? 'i18n_no_data_yet') | translate }}</div>\n }\n @if (keySearch() && !loading()) {\n <div>{{ (config()?.textSearchNoData ??'i18n_no_result') | translate }}</div>\n }\n </div>\n }\n @if (loading()) {\n <libs_ui-components-spinner [size]=\"'medium'\" />\n }\n </div>\n </div>\n}\n", styles: [".libs-ui-list-group{display:flex;flex-direction:column;width:100%}.libs-ui-list-group .libs-ui-list-group-line{width:100%;height:1px;background-color:#e6e7ea}.libs-ui-list-group [class*=libs-ui-icon-chevron]:before{color:#6a7383}\n"] }]
|
|
772
|
+
}], ctorParameters: () => [] });
|
|
773
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JvdXAuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL2xpc3Qvc3JjL3RlbXBsYXRlcy9ncm91cC9ncm91cC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvbGlzdC9zcmMvdGVtcGxhdGVzL2dyb3VwL2dyb3VwLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHVEQUF1RDtBQUN2RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDNUMsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBVSxNQUFNLEVBQWtCLE1BQU0sZUFBZSxDQUFDO0FBQ25HLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBVyxzQ0FBc0MsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3JHLE9BQU8sRUFBRSx1Q0FBdUMsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQzlGLE9BQU8sRUFBRSxvQ0FBb0MsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3hGLE9BQU8sRUFBRSxzQ0FBc0MsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzVGLE9BQU8sRUFBRSxnQ0FBZ0MsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQy9FLE9BQU8sRUFBRSxxQ0FBcUMsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQ2pHLE9BQU8sRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzVGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sRUFBRSxTQUFTLEVB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R0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxFQUFFLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztZQUV2RyxPQUFPLFdBQVcsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQ3hDLENBQUM7UUFDRCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDO1FBRWhGLE9BQU8sV0FBVyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDeEMsQ0FBQzt3R0FoNEJVLGtDQUFrQzs0RkFBbEMsa0NBQWtDLDBIQ3pDL0MsZzNiQWdLQSxnU0RuSUkscUJBQXFCLDBCQUFFLFNBQVMsNkNBQUUsZUFBZSw0RkFDakQsc0NBQXNDLGloQkFDdEMsdUNBQXVDLGduQkFDdkMsb0NBQW9DLGdmQUNwQyxnQ0FBZ0MsaUdBQ2hDLHNDQUFzQyw4TUFDdEMsNEJBQTRCLGdFQUM1QixxQ0FBcUMseUVBQ3JDLHFEQUFxRCw4RkFDckQsc0NBQXNDOzs0RkFHN0Isa0NBQWtDO2tCQXBCOUMsU0FBUzsrQkFFRSx5Q0FBeUMsY0FHdkMsSUFBSSxtQkFDQyx1QkFBdUIsQ0FBQyxNQUFNLFdBQ3RDO3dCQUNQLHFCQUFxQixFQUFFLFNBQVMsRUFBRSxlQUFlO3dCQUNqRCxzQ0FBc0M7d0JBQ3RDLHVDQUF1Qzt3QkFDdkMsb0NBQW9DO3dCQUNwQyxnQ0FBZ0M7d0JBQ2hDLHNDQUFzQzt3QkFDdEMsNEJBQTRCO3dCQUM1QixxQ0FBcUM7d0JBQ3JDLHFEQUFxRDt3QkFDckQsc0NBQXNDO3FCQUN2QyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbmltcG9ydCB7IEFzeW5jUGlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBPbkluaXQsIHNpZ25hbCwgV3JpdGFibGVTaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFZpcnR1YWxTY3JvbGxlck1vZHVsZSB9IGZyb20gJ0BpaGFyYmVjay9uZ3gtdmlydHVhbC1zY3JvbGxlcic7XG5pbXBvcnQgeyBJQnV0dG9uLCBMaWJzVWlDb21wb25lbnRzQnV0dG9uc0J1dHRvbkNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtYnV0dG9ucy1idXR0b24nO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c0NoZWNrYm94U2luZ2xlQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1jaGVja2JveC1zaW5nbGUnO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c1JhZGlvU2luZ2xlQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1yYWRpby1zaW5nbGUnO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c1Njcm9sbE92ZXJsYXlEaXJlY3RpdmUgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLXNjcm9sbC1vdmVybGF5JztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNTcGlubmVyQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1zcGlubmVyJztcbmltcG9ydCB7IExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGUgfSBmcm9tICdAbGlicy11aS9waXBlcy1jYWxsLWZ1bmN0aW9uLWluLXRlbXBsYXRlJztcbmltcG9ydCB7IGNsb25lRGVlcCwgZGVsZXRlVW5pY29kZSwgZXNjYXBlSHRtbCwgaXNFbXB0eSwgaXNOaWwsIHV1aWQgfSBmcm9tICdAbGlicy11aS91dGlscyc7XG5pbXBvcnQgeyBUcmFuc2xhdGVNb2R1bGUgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IHJhbmdlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBJTGlzdENvbmZpZ0l0ZW1Hcm91cCB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvY29uZmlnLWl0ZW0uaW50ZXJmYWNlJztcbmltcG9ydCB7IElMaXN0RGF0YUVtaXRLZXksIElMaXN0RGF0YUVtaXRNdWx0aUtleSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvZGF0YS1lbWl0LmludGVyZmFjZSc7XG5pbXBvcnQgeyBMaWJzVWlDaGVja1NlbGVjdGVkQnlLZXlQaXBlIH0gZnJvbSAnLi4vLi4vcGlwZXMvY2hlY2stc2VsZWN0ZWQtYnkta2V5LnBpcGUnO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c0xpc3RUZW1wbGF0ZXNDb21wb25lbnRBYnN0cmFjdCB9IGZyb20gJy4uL3RlbXBsYXRlcy5jb21wb25lbnQuYWJzdHJhY3QnO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c0xpc3RHcm91cEl0ZW1Db21wb25lbnQgfSBmcm9tICcuL2l0ZW0vaXRlbS5jb21wb25lbnQnO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c0xpc3RHcm91cENhbGN1bGF0b3JNYXJnaW5MZWZ0SXRlbVBpcGUgfSBmcm9tICcuL3BpcGVzL2NhbGN1bGF0b3ItbWFyZ2luLWxlZnQtaXRlbS5waXBlJztcblxuQENvbXBvbmVudCh7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvY29tcG9uZW50LXNlbGVjdG9yXG4gIHNlbGVjdG9yOiAnbGlic191aS1jb21wb25lbnRzLWxpc3QtdGVtcGxhdGVzX2dyb3VwJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2dyb3VwLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZ3JvdXAuY29tcG9uZW50LnNjc3MnXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGltcG9ydHM6IFtcbiAgICBWaXJ0dWFsU2Nyb2xsZXJNb2R1bGUsIEFzeW5jUGlwZSwgVHJhbnNsYXRlTW9kdWxlLFxuICAgIExpYnNVaUNvbXBvbmVudHNCdXR0b25zQnV0dG9uQ29tcG9uZW50LFxuICAgIExpYnNVaUNvbXBvbmVudHNDaGVja2JveFNpbmdsZUNvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzUmFkaW9TaW5nbGVDb21wb25lbnQsXG4gICAgTGlic1VpQ29tcG9uZW50c1NwaW5uZXJDb21wb25lbnQsXG4gICAgTGlic1VpQ29tcG9uZW50c1Njcm9sbE92ZXJsYXlEaXJlY3RpdmUsXG4gICAgTGlic1VpQ2hlY2tTZWxlY3RlZEJ5S2V5UGlwZSxcbiAgICBMaWJzVWlQaXBlc0NhbGxGdW5jdGlvbkluVGVtcGxhdGVQaXBlLFxuICAgIExpYnNVaUNvbXBvbmVudHNMaXN0R3JvdXBDYWxjdWxhdG9yTWFyZ2luTGVmdEl0ZW1QaXBlLFxuICAgIExpYnNVaUNvbXBvbmVudHNMaXN0R3JvdXBJdGVtQ29tcG9uZW50XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgTGlic1VpQ29tcG9uZW50c0xpc3RHcm91cENvbXBvbmVudCBleHRlbmRzIExpYnNVaUNvbXBvbmVudHNMaXN0VGVtcGxhdGVzQ29tcG9uZW50QWJzdHJhY3QgaW1wbGVtZW50cyBPbkluaXQge1xuICAvKiBQUk9QRVJUWSAqL1xuICBwcm90ZWN0ZWQgY29uZmlnVGVtcGxhdGVHcm91cCA9IHNpZ25hbDxJTGlzdENvbmZpZ0l0ZW1Hcm91cCB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcHJvdGVjdGVkIGxldmVsID0gc2lnbmFsPG51bWJlcj4oMSk7XG4gIHByb3RlY3RlZCBrZXlzQ2hlY2tlZCA9IHNpZ25hbDxBcnJheTxzdHJpbmc+PihbXSk7XG4gIHByb3RlY3RlZCBrZXlzU3RpbGxPdGhlck9wdGlvbnMgPSBzaWduYWw8QXJyYXk8c3RyaW5nPj4oW10pO1xuICBwcm90ZWN0ZWQgdG90YWxJdGVtID0gc2lnbmFsPG51bWJlcj4oMCk7XG4gIHByb3RlY3RlZCB0b3RhbEl0ZW1DaGVja2VkID0gc2lnbmFsPG51bWJlcj4oMCk7XG4gIHByb3RlY3RlZCBjYWxjdWxhdG9ySGVpZ2hJdGVtU3VjY2VzcyA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHByb3RlY3RlZCBrZXlGZXRjaCA9IHNpZ25hbDxzdHJpbmc+KCcnKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IFBBVFRFUk5fRkFLRV9JRCA9ICdmYWtlLWlkLSc7XG4gIHByaXZhdGUgbWFwcGluZ0l0ZW1zQ2hlY2tlZCA9IHNpZ25hbDxNYXA8c3RyaW5nLCBhbnk+PihuZXcgTWFwKCkpO1xuICBwcml2YXRlIHNlbGVjdEZpcnN0SXRlbSA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHByaXZhdGUgZmlyc3RJdGVtU2VsZWN0ZWQgPSBzaWduYWw8YW55Pih1bmRlZmluZWQpO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBvdmVycmlkZSBuZ09uSW5pdCgpIHtcbiAgICBpZiAoIXRoaXMuY29uZmlnKCk/LmNvbmZpZ1RlbXBsYXRlR3JvdXA/LigpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHN1cGVyLm5nT25Jbml0KCk7XG4gICAgdGhpcy5jb25maWdUZW1wbGF0ZUdyb3VwLnNldCh0aGlzLmNvbmZpZygpPy5jb25maWdUZW1wbGF0ZUdyb3VwPy4oKSk7XG4gICAgdGhpcy50aW1lSW50ZXJ2YWxJbnRlcnZhbFNldEhlaWdodFZpZXdQb3J0LnNldCh0aGlzLmNvbmZpZ1RlbXBsYXRlR3JvdXAoKT8udGltZUludGVydmFsQ2FsY3VsYXRvckhlaWdodCA/PyAwKTtcbiAgICB0aGlzLmZpZWxkS2V5LnNldCh0aGlzLmNvbmZpZ1RlbXBsYXRlR3JvdXAoKT8uZmllbGRLZXkgPz8gdGhpcy5maWVsZEtleURlZmF1bHQoKSk7XG4gICAgaWYgKHRoaXMucGFkZGluZ0xlZnRJdGVtKCkgPT09IGZhbHNlKSB7XG4gICAgICB0aGlzLmxldmVsLnNldCgwKTtcbiAgICB9XG4gICAgdGhpcy5zZWxlY3RGaXJzdEl0ZW0uc2V0KGZhbHNlKTtcbiAgICBpZiAodGhpcy5jb25maWdUZW1wbGF0ZUdyb3VwKCk/Lm9ubHlTZWxlY3RGaXJzdEl0ZW0gfHwgKCF0aGlzLm11bHRpS2V5U2VsZWN0ZWQoKT8ubGVuZ3RoICYmIHRoaXMuY29uZmlnKCk/LmF1dG9TZWxlY3RGaXJzdEl0ZW0pKSB7XG4gICAgICB0aGlzLnNlbGVjdEZpcnN0SXRlbS5zZXQodHJ1ZSk7XG4gICAgfVxuICAgIHRoaXMuY2FsbEFwaUJ5U2VydmljZSgpO1xuXG5cbiAgICB0aGlzLm9uVXBkYXRlTXVsdGlLZXlTZWxlY3RlZEdyb3VwKCk/LnBpcGUodGFrZVVudGlsKHRoaXMub25EZXN0cm95KSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIGlmICghdGhpcy5zdG9yZSgpIHx8ICF0aGlzLnN0b3JlKCkubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMua2V5c0NoZWNrZWQuc2V0KFtdKTtcblxuICAgICAgdGhpcy5tYXBwaW5nSXRlbXNDaGVja2VkKCkuY2xlYXIoKTtcbiAgICAgIGNvbnN0IGNvbmZpZ1RlbXBsYXRlR3JvdXAgPSB0aGlzLmNvbmZpZ1RlbXBsYXRlR3JvdXAoKTtcblxuICAgICAgaWYgKCFjb25maWdUZW1wbGF0ZUdyb3VwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuc3RvcmUoKS5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICBpZiAoaXNFbXB0eShpdGVtKClbdGhpcy5maWVsZEtleSgpXSkpIHtcbiAgICAgICAgICBpdGVtLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgICAgIGN1cnJlbnRbdGhpcy5maWVsZEtleSgpXSA9IGAke3RoaXMuUEFUVEVSTl9GQUtFX0lEfSR7dXVpZCgpfWA7XG5cbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGl0ZW1Hcm91cCA9IGl0ZW0oKVtjb25maWdUZW1wbGF0ZUdyb3VwLmZpZWxkR2V0SXRlbXNdIGFzIFdyaXRhYmxlU2lnbmFsPEFycmF5PFdyaXRhYmxlU2lnbmFsPGFueT4+PjtcbiAgICAgICAgY29uc3QgaXRlbU1hcCA9IGNsb25lRGVlcChpdGVtKSBhcyBXcml0YWJsZVNpZ25hbDxhbnk+O1xuXG4gICAgICAgIGl0ZW1NYXAudXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgICAgIGN1cnJlbnQucmVmID0gaXRlbTtcblxuICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jaGVja2VkR3JvdXBJdGVtcyhpdGVtR3JvdXAoKSwgaXRlbSk7XG4gICAgICAgIGlmICh0aGlzLm11bHRpS2V5U2VsZWN0ZWQoKSAmJiB0aGlzLm11bHRpS2V5U2VsZWN0ZWQoKT8ubGVuZ3RoICYmIHRoaXMubXVsdGlLZXlTZWxlY3RlZCgpPy5maW5kKGtleSA9PiBrZXkgPT09IGl0ZW0oKVt0aGlzLmZpZWxkS2V5KCldKSkge1xuICAgICAgICAgIHRoaXMuaGFuZGxlckNoYW5nZUNoZWNrZWQodHJ1ZSwgaXRlbU1hcCwgIWNvbmZpZ1RlbXBsYXRlR3JvdXAuc2luZ2xlU2VsZWN0SXRlbSk7XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdGhpcy5tdWx0aUtleVNlbGVjdGVkLnNldChbXSk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyQ2hlY2tlZE9yVW5DaGVja2VkQWxsKGNoZWNrZWQ6IGJvb2xlYW4pIHtcbiAgICBjb25zdCBjb25maWdUZW1wbGF0ZUdyb3VwID0gdGhpcy5jb25maWdUZW1wbGF0ZUdyb3VwKCk7XG5cbiAgICBpZiAoIWNvbmZpZ1RlbXBsYXRlR3JvdXApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFjaGVja2VkKSB7XG4gICAgICB0aGlzLml0ZW1zKCkuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgdGhpcy5tYXBwaW5nSXRlbXNDaGVja2VkKCkuZGVsZXRlKGl0ZW0oKVt0aGlzLmZpZWxkS2V5KCldKTtcbiAgICAgICAgY29uc3QgaXRlbXNPZkdyb3VwID0gaXRlbSgpW2NvbmZpZ1RlbXBsYXRlR3JvdXAuZmllbGRHZXRJdGVtc10gYXMgV3JpdGFibGVTaWduYWw8QXJyYXk8V3JpdGFibGVTaWduYWw8YW55Pj4+O1xuXG4gICAgICAgIGlmIChpdGVtc09mR3JvdXAoKSAmJiBpdGVtc09mR3JvdXAoKS5sZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLnJlbW92ZUNoZWNrZWRJdGVtc0NoaWxkKGl0ZW1zT2ZHcm91cCgpKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLnNldEtleXNDaGVja2VkQnlNYXBwaW5nQ2hlY2tlZCgpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5pdGVtcygpLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICB0aGlzLm1hcHBpbmdJdGVtc0NoZWNrZWQoKS5zZXQoaXRlbSgpW3RoaXMuZmllbGRLZXkoKV0sIGl0ZW0oKSk7XG4gICAgICBjb25zdCBpdGVtc09mR3JvdXAgPSBpdGVtKClbY29uZmlnVGVtcGxhdGVHcm91cC5maWVsZEdldEl0ZW1zXSBhcyBXcml0YWJsZVNpZ25hbDxBcnJheTxXcml0YWJsZVNpZ25hbDxhbnk+Pj47XG5cbiAgICAgIGlmIChpdGVtc09mR3JvdXAoKSAmJiBpdGVtc09mR3JvdXAoKS5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5zZXRDaGVja0NoZWNrZWRJdGVtc0NoaWxkKGl0ZW1zT2ZHcm91cCgpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnNldEtleXNDaGVja2VkQnlNYXBwaW5nQ2hlY2tlZCgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNoZWNrZWRHcm91cEl0ZW1zKGl0ZW1zPzogQXJyYXk8V3JpdGFibGVTaWduYWw8YW55Pj4sIHBhcmVudD86IFdyaXRhYmxlU2lnbmFsPGFueT4pIHtcbiAgICBjb25zdCBjb25maWdUZW1wbGF0ZUdyb3VwID0gdGhpcy5jb25maWdUZW1wbGF0ZUdyb3VwKCk7XG5cbiAgICBpZiAoIWNvbmZpZ1RlbXBsYXRlR3JvdXAgfHwgIWl0ZW1zIHx8ICFpdGVtcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgIGlmIChpc05pbChpdGVtKClbdGhpcy5maWVsZEtleSgpXSkgfHwgaXRlbSgpW3RoaXMuZmllbGRLZXkoKV0gPT09ICcnKSB7XG4gICAgICAgIGl0ZW0udXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgICAgIGN1cnJlbnRbdGhpcy5maWVsZEtleSgpXSA9IGAke3RoaXMuUEFUVEVSTl9GQUtFX0lEfSR7dXVpZCgpfWA7XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgaXRlbUdyb3VwID0gaXRlbSgpW2NvbmZpZ1RlbXBsYXRlR3JvdXAuZmllbGRHZXRJdGVtc10gYXMgV3JpdGFibGVTaWduYWw8QXJyYXk8V3JpdGFibGVTaWduYWw8YW55Pj4+O1xuICAgICAgY29uc3QgaXRlbU1hcCA9IGNsb25lRGVlcChpdGVtKSBhcyBXcml0YWJsZVNpZ25hbDxhbnk+O1xuXG4gICAgICBpdGVtTWFwLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgY3VycmVudC5yZWYgPSBpdGVtO1xuICAgICAgICBjdXJyZW50LnBhcmVudEl0ZW0gPSBwYXJlbnQ7XG5cbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5jaGVja2VkR3JvdXBJdGVtcyhpdGVtR3JvdXAoKSwgaXRlbSk7XG4gICAgICBpZiAodGhpcy5tdWx0aUtleVNlbGVjdGVkKCkgJiYgdGhpcy5tdWx0aUtleVNlbGVjdGVkKCk/Lmxlbmd0aCAmJiB0aGlzLm11bHRpS2V5U2VsZWN0ZWQoKT8uZmluZChrZXkgPT4ga2V5ID09PSBpdGVtKClbdGhpcy5maWVsZEtleSgpXSkpIHtcbiAgICAgICAgdGhpcy5oYW5kbGVyQ2hhbmdlQ2hlY2tlZCh0cnVlLCBpdGVtTWFwLCAhY29uZmlnVGVtcGxhdGVHcm91cC5zaW5nbGVTZWxlY3RJdGVtKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnVGVtcGxhdGVHcm91cC5zaW5nbGVTZWxlY3RJdGVtKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlckNoYW5nZUNoZWNrZWQoZmFsc2UsIGl0ZW1NYXAsICFjb25maWdUZW1wbGF0ZUdyb3VwLnNpbmdsZVNlbGVjdEl0ZW0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJDbGlja0J1dHRvbkdyb3VwKGJ1dHRvbkluR3JvdXA6IElCdXR0b24sIGl0ZW06IGFueSkge1xuICAgIGJ1dHRvbkluR3JvdXAuYWN0aW9uPy4oaXRlbSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlclRvZ2dsZUV4cGFuZChlOiB1bmtub3duLCBpdGVtOiBhbnksIGFjY2VwdEV2ZW50ID0gdHJ1ZSkge1xuICAgIGlmICghYWNjZXB0RXZlbnQgfHwgdGhpcy5jb25maWdUZW1wbGF0ZUdyb3VwKCk/Lmlnbm9yZUNsaWNrTGFiZWxHcm91cCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoZSBpbnN0YW5jZW9mIEV2ZW50KSB7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cbiAgICBpdGVtLmV4cGFuZCA9ICFpdGVtLmV4cGFuZDtcbiAgICB0aGlzLnJlZnJlc2hWaWV3KCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckNoYW5nZVZpZXcoKSB7XG4gICAgdGhpcy5yZWZyZXNoVmlldygpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHByb2Nlc3NLZXlDaGFuZ2VVblNlbGVjdChpdGVtOiBXcml0YWJsZVNpZ25hbDxhbnk+KTogdm9pZCB7XG4gICAgaWYgKGlzTmlsKGl0ZW0oKVt0aGlzLmZpZWxkS2V5KCldKSB8fCBpdGVtKClbdGhpcy5maWVsZEtleSgpXSA9PT0gJycpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5oYW5kbGVyQ2hhbmdlSXRlbUNoZWNrZWQoaXRlbSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckNoYW5nZUl0ZW1DaGVja2VkKGl0ZW06IFdyaXRhYmxlU2lnbmFsPGFueT4pIHtcbiAgICBjb25zdCBjaGVja2VkID0gIXRoaXMua2V5c0NoZWNrZWQoKS5zb21lKGtleSA9PiBpdGVtKClbdGhpcy5maWVsZEtleSgpXSA9PT0ga2V5KTtcblxuICAgIGlmICghY2hlY2tlZCAmJiB0aGlzLmNvbmZpZ1RlbXBsYXRlR3JvdXAoKT8uaXNWaWV3UmFkaW8pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5oYW5kbGVyQ2hhbmdlQ2hlY2tlZChjaGVja2VkLCBpdGVtKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyQ2hhbmdlQ2hlY2tlZChjaGVja2VkOiBib29sZWFuLCBpdGVtOiBXcml0YWJsZVNpZ25hbDxhbnk+LCBpc0NoZWNrZWRCeURlZmF1bHRLZXk/OiBib29sZWFuKSB7XG4gICAgY29uc3QgY29uZmlnVGVtcGxhdGVHcm91cCA9IHRoaXMuY29uZmlnVGVtcGxhdGVHcm91cCgpO1xuXG4gICAgaWYgKCFjb25maWdUZW1wbGF0ZUdyb3VwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghY29uZmlnVGVtcGxhdGVHcm91cC5pc1ZpZXdUcmVlSnNvbiAmJiBpdGVtKCkubGV2ZWwgIT09IGl0ZW0oKS5tYXhMZXZlbEdyb3VwICYmIChjb25maWdUZW1wbGF0ZUdyb3VwLmlnbm9yZUNoZWNrYm94R3JvdXAgfHwgY29uZmlnVGVtcGxhdGVHcm91cC5zaW5nbGVTZWxlY3RJdGVtKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCByZWZJdGVtID0gKGl0ZW0oKS5yZWYgfHwgaXRlbSkgYXMgV3JpdGFibGVTaWduYWw8YW55PjtcblxuICAgIGlmIChjb25maWdUZW1wbGF0ZUdyb3VwLnNpbmdsZVNlbGVjdEl0ZW0pIHtcbiAgICAgIGNoZWNrZWQgPSB0cnVlO1xuICAgICAgY29uc3QgbWFwcGluZ0l0ZW1zQ2hlY2tlZFRlbXAgPSBjbG9uZURlZXAodGhpcy5tYXBwaW5nSXRlbXNDaGVja2VkKSBhcyBXcml0YWJsZVNpZ25hbDxNYXA8c3RyaW5nLCBhbnk+PjtcblxuICAgICAgZm9yIChjb25zdCBba2V5LCBpdGVtQ2hlY2tdIG9mIG1hcHBpbmdJdGVtc0NoZWNrZWRUZW1wKCkpIHtcbiAgICAgICAgY29uc3QgaXRlbUJ5S2V5ID0gdGhpcy5tYXBwaW5nSXRlbXNDaGVja2VkKCkuZ2V0KGtleSk7XG5cbiAgICAgICAgaXRlbUJ5S2V5LmlzQ2hlY2tNYW51YWwgPSBmYWxzZTtcbiAgICAgICAgZGVsZXRlIGl0ZW1CeUtleS5yZWYuaXNDaGVja01hbnVhbDtcbiAgICAgICAgaWYgKCFpdGVtQ2hlY2sucmVmLmlzQ2hlY2tlZEJ5RGVmYXVsdEtleSkge1xuICAgICAgICAgIHRoaXMubWFwcGluZ0l0ZW1zQ2hlY2tlZCgpLmRlbGV0ZShrZXkpO1xuICAgICAgICAgIHRoaXMub3V0VW5TZWxlY3RNdWx0aUtleS5lbWl0KFtrZXldKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCFpc0NoZWNrZWRCeURlZmF1bHRLZXkpIHtcbiAgICAgICAgaXRlbS51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICAgICAgY3VycmVudC5pc0NoZWNrTWFudWFsID0gdHJ1ZTtcblxuICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICB9KTtcbiAgICAgICAgcmVmSXRlbS51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICAgICAgY3VycmVudC5pc0NoZWNrTWFudWFsID0gdHJ1ZTtcblxuICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgaXRlbXNPZkdyb3VwID0gaXRlbSgpW2NvbmZpZ1RlbXBsYXRlR3JvdXAuZmllbGRHZXRJdGVtc10gYXMgV3JpdGFibGVTaWduYWw8QXJyYXk8V3JpdGFibGVTaWduYWw8YW55Pj4+O1xuXG4gICAgLy8gYuG7jyBjaOG7jW4gdOG6pXQgY+G6oyBjw6FjIGl0ZW0gxJHhu4MgdGjhu7FjIGhp4buHbiBjaGVjayBs4bqhaVxuICAgIGlmIChjb25maWdUZW1wbGF0ZUdyb3VwLmlzVmlld1RyZWVKc29uIHx8IChjb25maWdUZW1wbGF0ZUdyb3VwLnNpbmdsZVNlbGVjdEl0ZW1CeVRyZWUgJiYgIWlzQ2hlY2tlZEJ5RGVmYXVsdEtleSAmJiAhY29uZmlnVGVtcGxhdGVHcm91cC5ub3RDaGFuZ2VTdGF0ZUl0ZW1DaGVja090aGVyKSkge1xuICAgICAgQXJyYXkuZnJvbSh0aGlzLm1hcHBpbmdJdGVtc0NoZWNrZWQoKS52YWx1ZXMoKSkuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgZGVsZXRlIGl0ZW0uaXNDaGVja01hbnVhbDtcbiAgICAgICAgcmVmSXRlbS51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICAgICAgZGVsZXRlIGN1cnJlbnQuaXNDaGVja01hbnVhbDtcblxuICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLm91dFVuU2VsZWN0TXVsdGlLZXkuZW1pdCh0aGlzLmtleXNDaGVja2VkKCkpO1xuICAgICAgdGhpcy5tYXBwaW5nSXRlbXNDaGVja2VkKCkuY2xlYXIoKTtcbiAgICAgIHRoaXMuc2V0S2V5c0NoZWNrZWRCeU1hcHBpbmdDaGVja2VkKGl0ZW0pO1xuICAgIH1cblxuICAgIGlmIChjaGVja2VkKSB7XG4gICAgICB0aGlzLmV4cGFuZEFsbEl0ZW1zSW5Hcm91cChpdGVtKTtcbiAgICAgIHRoaXMubWFwcGluZ0l0ZW1zQ2hlY2tlZCgpLnNldChpdGVtKClbdGhpcy5maWVsZEtleSgpXSwgaXRlbSgpKTtcbiAgICAgIGlmIChpc0NoZWNrZWRCeURlZmF1bHRLZXkpIHtcbiAgICAgICAgcmVmSXRlbS51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICAgICAgY3VycmVudC5pc0NoZWNrZWRCeURlZmF1bHRLZXkgPSBpc0NoZWNrZWRCeURlZmF1bHRLZXk7XG5cbiAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpdGVtLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgY3VycmVudC5pc0NoZWNrZWRCeURlZmF1bHRLZXkgPSByZWZJdGVtKCkuaXNDaGVja2VkQnlEZWZhdWx0S2V5O1xuXG4gICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgfSk7XG4gICAgICBpZiAoY29uZmlnVGVtcGxhdGVHcm91cC5jaG9vc2VDaGlsZFRoZW5BdXRvQ2hvb3NlUGFyZW50KSB7IC8vIGNo4buJIGNo4buNbiBjw6FjIHRo4bqxbmcgY2hhIHRyw6puIGPDuW5nIHRyZWUsIGtvIHF1YW4gdMOibSBub2RlIGNoYSBjw7MgY8OhYyBjb24gxJHDoyDEkWMgdMOtY2ggaOG6v3QgY2jGsGFcbiAgICAgICAgaXRlbS51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICAgICAgY3VycmVudC5pc0NoZWNrTWFudWFsID0gdHJ1ZTtcblxuICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICB9KTtcbiAgICAgICAgcmVmSXRlbS51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICAgICAgY3VycmVudC5pc0NoZWNrTWFudWFsID0gdHJ1ZTtcblxuICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5yZWN1cnNpdmVseUNoZWNrZWRQYXJlbnRCeVRyZWUoaXRlbSgpLnBhcmVudEl0ZW0pO1xuXG4gICAgICAgIGlmICghY29uZmlnVGVtcGxhdGVHcm91cC5pZ25vcmVDaG9vc2VQYXJlbnRUaGVuQXV0b0Nob29zZUNoaWxkcmVuICYmICFpc0NoZWNrZWRCeURlZmF1bHRLZXkpIHtcbiAgICAgICAgICB0aGlzLnNldENoZWNrQ2hlY2tlZEl0ZW1zQ2hpbGQoaXRlbXNPZkdyb3VwKCkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0S2V5c0NoZWNrZWRCeU1hcHBpbmdDaGVja2VkKGl0ZW0pO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWdUZW1wbGF0ZUdyb3VwLmlnbm9yZUNob29zZVBhcmVudFRoZW5BdXRvQ2hvb3NlQ2hpbGRyZW4pIHsgLy8gbOG7sWEgY2jhu41uIG5vZGUgY2hhIHPhur0gYuG7jyBxdWEgdmnhu4djIGNo4buNbiB04bqldCBj4bqjIG5vZGUgY29uXG4gICAgICAgIHRoaXMuc2V0S2V5c0NoZWNrZWRCeU1hcHBpbmdDaGVja2VkKGl0ZW0pO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChpdGVtc09mR3JvdXAoKSAmJiBpdGVtc09mR3JvdXAoKS5sZW5ndGggJiYgIWlzQ2hlY2tlZEJ5RGVmYXVsdEtleSAmJiAhY29uZmlnVGVtcGxhdGVHcm91cC5pc1ZpZXdUcmVlSnNvbikge1xuICAgICAgICBjb25zdCBpdGVtc0NoYW5nZSA9IGNvbmZpZ1RlbXBsYXRlR3JvdXAuaWdub3JlQ2hhbmdlQ2hpbGRyZW5EaXNhYmxlV2hlbkNoYW5nZVBhcmVudCA/XG4gICAgICAgICAgaXRlbXNPZkdyb3VwKCkuZmlsdGVyKChpdGVtOiBhbnkpID0+ICF0aGlzLmtleXNEaXNhYmxlSXRlbSgpPy5maW5kKGtleSA9PiBrZXkgPT09IGl0ZW0oKVt0aGlzLmZpZWxkS2V5KCldKSkgOiBpdGVtc09mR3JvdXAoKTtcblxuICAgICAgICB0aGlzLnNldENoZWNrQ2hlY2tlZEl0ZW1zQ2hpbGQoaXRlbXNDaGFuZ2UpO1xuICAgICAgfVxuICAgICAgaWYgKCFjb25maWdUZW1wbGF0ZUdyb3VwLm5vdENoYW5nZVN0YXRlSXRlbUNoZWNrT3RoZXIgJiYgIWNvbmZpZ1RlbXBsYXRlR3JvdXAuaXNWaWV3VHJlZUpzb24pIHtcbiAgICAgICAgdGhpcy5zZXRDaGVja0NoZWNrZWRJdGVtc1BhcmVudChpdGVtKCkucGFyZW50SXRlbSk7XG4gICAgICB9XG4gICAgICB0aGlzLnNldEtleXNDaGVja2VkQnlNYXBwaW5nQ2hlY2tlZChpdGVtKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpdGVtLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgIGN1cnJlbnQuaXNDaGVja01hbnVhbCA9IGZhbHNlO1xuXG4gICAgICBpZiAoaXNDaGVja2VkQnlEZWZhdWx0S2V5KSB7XG4gICAgICAgIGN1cnJlbnQuaXNDaGVja2VkQnlEZWZhdWx0S2V5ID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjdXJyZW50O1xuICAgIH0pO1xuICAgIHJlZkl0ZW0udXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgY3VycmVudC5pc0NoZWNrTWFudWFsID0gZmFsc2U7XG5cbiAgICAgIGlmIChpc0NoZWNrZWRCeURlZmF1bHRLZXkpIHtcbiAgICAgICAgY3VycmVudC5pc0NoZWNrZWRCeURlZmF1bHRLZXkgPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgfSk7XG4gICAgdGhpcy5tYXBwaW5nSXRlbXNDaGVja2VkKCkuZGVsZXRlKGl0ZW0oKVt0aGlzLmZpZWxkS2V5KCldKTtcbiAgICB0aGlzLmtleXNDaGVja2VkLnNldChBcnJheS5mcm9tKHRoaXMubWFwcGluZ0l0ZW1zQ2hlY2tlZCgpLmtleXMoKSkpO1xuXG4gICAgaWYgKGNvbmZpZ1RlbXBsYXRlR3JvdXAubm90Q2hhbmdlU3RhdGVJdGVtQ2hlY2tPdGhlcikge1xuICAgICAgdGhpcy5tYXBwaW5nSXRlbXNDaGVja2VkKCkuZGVsZXRlKGl0ZW0oKVt0aGlzLmZpZWxkS2V5KCldKTtcbiAgICAgIHRoaXMub3V0VW5TZWxlY3RNdWx0aUtleS5lbWl0KCFpc0VtcHR5KGl0ZW0oKVt0aGlzLmZpZWxkS2V5KCldKSA/IFtpdGVtKClbdGhpcy5maWVsZEtleSgpXV0gOiBbXSk7XG4gICAgICB0aGlzLnNldEtleXNDaGVja2VkQnlNYXBwaW5nQ2hlY2tlZChpdGVtKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoY29uZmlnVGVtcGxhdGVHcm91cC5pZ25vcmVVbnNlbGVjdENoaWxkcmVuUmVtb3ZlU2VsZWN0UGFyZW50KSB7XG4gICAgICB0aGlzLnJlY3Vyc2l2ZWx5Q2hlY2tlZFBhcmVudEJ5VHJlZShpdGVtKCkucGFyZW50SXRlbSk7XG4gICAgfVxuXG4gICAgLy8gbuG6v3Uga28gcGjhuqNpIHRyxrDhu51uZyBoxqFwIGPhu6dhIGJhbmsgdsOgIGRhbmggbeG7pWMgc+G6o24gcGjhuqltIHRow6wgYuG7jyBjaGEgc+G6vSBi4buPIGNvblxuICAgIGlmIChpdGVtc09mR3JvdXAoKSAmJiBpdGVtc09mR3JvdXAoKS5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IGl0ZW1zQ2hhbmdlID0gY29uZmlnVGVtcGxhdGVHcm91cC5pZ25vcmVDaGFuZ2VDaGlsZHJlbkRpc2FibGVXaGVuQ2hhbmdlUGFyZW50ID9cbiAgICAgICAgaXRlbXNPZkdyb3VwKCkuZmlsdGVyKChpdGVtKSA9PiAhdGhpcy5rZXlzRGlzYWJsZUl0ZW0oKT8uZmluZChrZXkgPT4ga2V5ID09PSBpdGVtKClbdGhpcy5maWVsZEtleSgpXSkpIDogaXRlbXNPZkdyb3VwKCk7XG5cbiAgICAgIHRoaXMucmVtb3ZlQ2hlY2tlZEl0ZW1zQ2hpbGQoaXRlbXNDaGFuZ2UpO1xuICAgIH1cbiAgICBpZiAoaXRlbSgpLnBhcmVudEl0ZW0gJiYgIWNvbmZpZ1RlbXBsYXRlR3JvdXAuaWdub3JlVW5zZWxlY3RDaGlsZHJlblJlbW92ZVNlbGVjdFBhcmVudCkge1xuICAgICAgdGhpcy5tYXBwaW5nSXRlbXNDaGVja2VkKCkuZGVsZXRlKGl0ZW0oKS5wYXJlbnRJdGVtW3RoaXMuZmllbGRLZXkoKV0pO1xuICAgIH1cbiAgICB0aGlzLnNldEtleXNDaGVja2VkQnlNYXBwaW5nQ2hlY2tlZChpdGVtKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0SXRlbXNPZkdyb3VwKGl0ZW06IFdyaXRhYmxlU2lnbmFsPGFueT4sIHN0b3JlczogV3JpdGFibGVTaWduYWw8QXJyYXk8V3JpdGFibGVTaWduYWw8YW55Pj4+KSB7XG4gICAgY29uc3QgY29uZmlnVGVtcGxhdGVHcm91cCA9IHRoaXMuY29uZmlnVGVtcGxhdGVHcm91cCgpO1xuXG4gICAgaWYgKCFjb25maWdUZW1wbGF0ZUdyb3VwIHx8ICFzdG9yZXMgfHwgIXN0b3Jlcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGdyb3VwIG9mIHN0b3JlcygpKSB7XG4gICAgICBpZiAoZ3JvdXAoKVt0aGlzLmZpZWxkS2V5KCldID09PSBpdGVtKClbdGhpcy5maWVsZEtleSgpXSkge1xuICAgICAgICByZXR1cm4gZ3JvdXAoKVtjb25maWdUZW1wbGF0ZUdyb3VwLmZpZWxkR2V0SXRlbXNdIGFzIFdyaXRhYmxlU2lnbmFsPEFycmF5PFdyaXRhYmxlU2lnbmFsPGFueT4+PjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5nZXRJdGVtc09mR3JvdXAoaXRlbSwgZ3JvdXAoKVtjb25maWdUZW1wbGF0ZUdyb3VwLmZpZWxkR2V0SXRlbXNdKSBhcyBXcml0YWJsZVNpZ25hbDxBcnJheTxXcml0YWJsZVNpZ25hbDxhbnk+Pj47XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRLZXlzU3RpbGxPdGhlck9wdGlvbnMoaXRlbT86IFdyaXRhYmxlU2lnbmFsPGFueT4pIHtcbiAgICBpZiAoIWl0ZW0/LigpKSB7XG4gICAgICB0aGlzLmtleXNTdGlsbE90aGVyT3B0aW9ucy5zZXQoW10pO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGtleXNDaGVja2VkID0gQXJyYXkuZnJvbSh0aGlzLm1hcHBpbmdJdGVtc0NoZWNrZWQoKS5rZXlzKCkpO1xuICAgIGNvbnN0IGl0ZW1QYXJlbnQgPSBpdGVtKCkucGFyZW50SXRlbSBhcyBXcml0YWJsZVNpZ25hbDxhbnk+O1xuICAgIGNvbnN0IGluZGV4SXRlbSA9IHRoaXMua2V5c1N0aWxsT3RoZXJPcHRpb25zKCkuZmluZEluZGV4KGtleSA9PiBrZXkgPT09IGl0ZW0oKVt0aGlzLmZpZWxkS2V5KCldKTtcblxuICAgIGlmIChpbmRleEl0ZW0gPj0gMCkge1xuICAgICAgdGhpcy5rZXlzU3RpbGxPdGhlck9wdGlvbnMudXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgICBjdXJyZW50LnNwbGljZShpbmRleEl0ZW0sIDEpO1xuXG4gICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKCFpdGVtUGFyZW50KCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaXRlbXNPZkdyb3VwUGFyZW50ID0gdGhpcy5nZXRJdGVtc09mR3JvdXAoaXRlbVBhcmVudCwgdGhpcy5zdG9yZSk7XG5cbiAgICBpZiAoIWl0ZW1zT2ZHcm91cFBhcmVudCB8fCAhaXRlbXNPZkdyb3VwUGFyZW50KCkgfHwgIWl0ZW1zT2ZHcm91cFBhcmVudCgpLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpbmRleFBhcmVudCA9IHRoaXMua2V5c1N0aWxsT3RoZXJPcHRpb25zKCkuZmluZEluZGV4KGtleSA9PiBrZXkgPT09IGl0ZW1QYXJlbnQoKVt0aGlzLmZpZWxkS2V5KCldKTtcblxuICAgIGlmIChpdGVtc09mR3JvdXBQYXJlbnQoKS5ldmVyeSgoZWxlbWVudCkgPT4ga2V5c0NoZWNrZWQuaW5jbHVkZXMoZWxlbWVudCgpW3RoaXMuZmllbGRLZXkoKV0pKSAmJiBpbmRleFBhcmVudCA+PSAwKSB7XG4gICAgICB0aGlzLmtleXNTdGlsbE90aGVyT3B0aW9ucy51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICAgIGN1cnJlbnQuc3BsaWNlKGluZGV4SXRlbSwgMSk7XG5cbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChpdGVtc09mR3JvdXBQYXJlbnQoKS5zb21lKGVsZW1lbnQgPT4ga2V5c0NoZWNrZWQuaW5jbHVkZXMoZWxlbWVudCgpW3RoaXMuZmllbGRLZXkoKV0pKSAmJiBpbmRleFBhcmVudCA8IDApIHtcbiAgICAgIHRoaXMua2V5c1N0aWxsT3RoZXJPcHRpb25zLnVwZGF0ZShjdXJyZW50ID0+IFsuLi5jdXJyZW50LCBpdGVtUGFyZW50KClbdGhpcy5maWVsZEtleSgpXV0pO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChpbmRleFBhcmVudCA+PSAwKSB7XG4gICAgICB0aGlzLmtleXNTdGlsbE90aGVyT3B0aW9ucy51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICAgIGN1cnJlbnQuc3BsaWNlKGluZGV4SXRlbSwgMSk7XG5cbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICB9KTtcblxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2V0S2V5c0NoZWNrZWRCeU1hcHBpbmdDaGVja2VkKGl0ZW0/OiBhbnkpIHtcbiAgICB0aGlzLmtleXNDaGVja2VkLnNldChBcnJheS5mcm9tKHRoaXMubWFwcGluZ0l0ZW1zQ2hlY2tlZCgpLmtleXMoKSkpO1xuICAgIHRoaXMuZW1pdE11bHRpS2V5Q2hlY2tlZCgpO1xuICAgIHRoaXMuc2V0S2V5c1N0aWxsT3RoZXJPcHRpb25zKGl0ZW0pO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0TXVsdGlLZXlDaGVja2VkKGlzQ2xpY2tNYW51YWwgPSB0cnVlKSB7XG4gICAgY29uc3QgY29uZmlnVGVtcGxhdGVHcm91cCA9IHRoaXMuY29uZmlnVGVtcGxhdGVHcm91cCgpO1xuXG4gICAgaWYgKCFjb25maWdUZW1wbGF0ZUdyb3VwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGRhdGFNdWx0aUtleUNoZWNrZWQ6IElMaXN0RGF0YUVtaXRNdWx0aUtleSA9IHsga2V5czogbmV3IEFycmF5PGFueT4oKSwgbWFwS2V5czogbmV3IEFycmF5PElMaXN0RGF0YUVtaXRLZXk+KCksIGlzQ2xpY2tNYW51YWwgfTtcblxuICAgIGlmICgoY29uZmlnVGVtcGxhdGVHcm91cC5lbWl0QWxsSXRlbUNoZWNrZWQgfHwgY29uZmlnVGVtcGxhdGVHcm91cC5jaG9vc2VDaGlsZFRoZW5BdXRvQ2hvb3NlUGFyZW50KSAmJiAhY29uZmlnVGVtcGxhdGVHcm91cC5pZ25vcmVFbWl0QWxsSXRlbUNoZWNrZWRXaGVuQ2hvb3NlQ2hpbGRUaGVuQXV0b0Nob29zZVBhcmVudCkge1xuICAgICAgZm9yIChjb25zdCBba2V5LCBpdGVtXSBvZiB0aGlzLm1hcHBpbmdJdGVtc0NoZWNrZWQoKSkge1xuICAgICAgICBkYXRhTXVsdGlLZXlDaGVja2VkLmtleXMucHVzaChrZXkpO1xuICAgICAgICBkYXRhTXVsdGlLZXlDaGVja2VkLm1hcEtleXMucHVzaCh7IGtleSwgaXRlbTogaXRlbS5yZWYgfHwgaXRlbSwgaXNDbGlja01hbnVhbCB9KTtcbiAgICAgIH1cbiAgICAgIHRoaXMub3V0U2VsZWN0TXVsdGlLZXkuZW1pdChkYXRhTXVsdGlLZXlDaGVja2VkKTtcbiAgICAgIHRoaXMudG90YWxJdGVtQ2hlY2tlZC5zZXQoZGF0YU11bHRpS2V5Q2hlY2tlZC5rZXlzLmxlbmd0aCk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChjb25zdCBba2V5LCBpdGVtXSBvZiB0aGlzLm1hcHBpbmdJdGVtc0NoZWNrZWQoKSkge1xuICAgICAgaWYgKGl0ZW1bdGhpcy5maWVsZEtleSgpXSAmJiAhU3RyaW5nKGl0ZW1bdGhpcy5maWVsZEtleSgpXSkuaW5jbHVkZXModGhpcy5QQVRURVJOX0ZBS0VfSUQpICYmICghaXRlbVtjb25maWdUZW1wbGF0ZUdyb3VwLmZpZWxkR2V0SXRlbXNdPy5sZW5ndGggfHwgIWl0ZW1bY29uZmlnVGVtcGxhdGVHcm91cC5maWVsZEdldEl0ZW1zXSgpLnNvbWUoKGl0ZW1Hcm91cDogV3JpdGFibGVTaWduYWw8YW55PikgPT4gdGhpcy5tYXBwaW5nSXRlbXNDaGVja2VkKCkuZ2V0KGl0ZW1Hcm91cCgpW3RoaXMuZmllbGRLZXkoKV0pKSkpIHtcbiAgICAgICAgZGF0YU11bHRpS2V5Q2hlY2tlZC5rZXlzLnB1c2goa2V5KTtcbiAgICAgICAgZGF0YU11bHRpS2V5Q2hlY2tlZC5tYXBLZXlzLnB1c2goeyBrZXksIGl0ZW06IGl0ZW0ucmVmIHx8IGl0ZW0sIGlzQ2xpY2tNYW51YWwgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5vdXRTZWxlY3RNdWx0aUtleS5lbWl0KGRhdGFNdWx0aUtleUNoZWNrZWQpO1xuICAgIHRoaXMudG90YWxJdGVtQ2hlY2tlZC5zZXQoZGF0YU11bHRpS2V5Q2hlY2tlZC5rZXlzLmxlbmd0aCk7XG4gIH1cblxuICBwcml2YXRlIHJlY3Vyc2l2ZWx5Q2hlY2tlZFBhcmVudEJ5VHJlZShpdGVtOiBhbnkpIHtcbiAgICBpZiAoIWl0ZW0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5tYXBwaW5nSXRlbXNDaGVja2VkKCkuc2V0KGl0ZW1bdGhpcy5maWVsZEtleSgpXSwgaXRlbSgpKTtcbiAgICB0aGlzLnJlY3Vyc2l2ZWx5Q2hlY2tlZFBhcmVudEJ5VHJlZShpdGVtLnBhcmVudEl0ZW0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRDaGVja0NoZWNrZWRJdGVtc1BhcmVudChpdGVtOiBXcml0YWJsZVNpZ25hbDxhbnk+KSB7XG4gICAgY29uc3QgY29uZmlnVGVtcGxhdGVHcm91cCA9IHRoaXMuY29uZmlnVGVtcGxhdGVHcm91cCgpO1xuXG4gICAgaWYgKCFjb25maWdUZW1wbGF0ZUdyb3VwIHx8ICFpdGVtKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGl0ZW1zT2ZHcm91cCA9IGl0ZW0oKVtjb25maWdUZW1wbGF0ZUdyb3VwLmZpZWxkR2V0SXRlbXNdIGFzIFdyaXRhYmxlU2lnbmFsPEFycmF5PFdyaXRhYmxlU2lnbmFsPGFueT4+PjtcblxuICAgIGlmICghaXRlbXNPZkdyb3VwKCkgfHwgIWl0ZW1zT2ZHcm91cCgpLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGl0ZW1Hcm91cCBvZiBpdGVtc09mR3JvdXAoKSkge1xuICAgICAgaWYgKCF0aGlzLm1hcHBpbmdJdGVtc0NoZWNrZWQoKS5oYXMoaXRlbUdyb3VwKClbdGhpcy5maWVsZEtleSgpXSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLm1hcHBpbmdJdGVtc0NoZWNrZWQoKS5zZXQoaXRlbSgpW3RoaXMuZmllbGRLZXkoKV0sIGl0ZW0oKSk7XG4gICAgaWYgKGl0ZW0oKS5wYXJlbnRJdGVtKSB7XG4gICAgICB0aGlzLnNldENoZWNrQ2hlY2tlZEl0ZW1zUGFyZW50KGl0ZW0oKS5wYXJlbnRJdGVtKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldENoZWNrQ2hlY2tlZEl0ZW1zQ2hpbGQoaXRlbXM6IEFycmF5PFdyaXRhYmxlU2lnbmFsPGFueT4+KSB7XG4gICAgY29uc3QgY29uZmlnVGVtcGxhdGVHcm91cCA9IHRoaXMuY29uZmlnVGVtcGxhdGVHcm91cCgpO1xuXG4gICAgaWYgKCFjb25maWdUZW1wbGF0ZUdyb3VwIHx8ICFpdGVtcyB8fCAhaXRlbXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICB0aGlzLm1hcHBpbmdJdGVtc0NoZWNrZWQoKS5zZXQoaXRlbSgpW3RoaXMuZmllbGRLZXkoKV0sIGl0ZW0oKSk7XG4gICAgICBjb25zdCBpdGVtc09mR3JvdXAgPSBpdGVtKClbY29uZmlnVGVtcGxhdGVHcm91cC5maWVsZEdldEl0ZW1zXSBhcyBXcml0YWJsZVNpZ25hbDxBcnJheTxXcml0YWJsZVNpZ25hbDxhbnk+Pj47XG5cbiAgICAgIGlmIChpdGVtc09mR3JvdXAoKSAmJiBpdGVtc09mR3JvdXAoKS5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5zZXRDaGVja0NoZWNrZWRJdGVtc0NoaWxkKGl0ZW1zT2ZHcm91cCgpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlQ2hlY2tlZEl0ZW1zQ2hpbGQoaXRlbXM6IEFycmF5PFdyaXRhYmxlU2lnbmFsPGFueT4+KSB7XG4gICAgY29uc3QgY29uZmlnVGVtcGxhdGVHcm91cCA9IHRoaXMuY29uZmlnVGVtcGxhdGVHcm91cCgpO1xuXG4gICAgaWYgKCFjb25maWdUZW1wbGF0ZUdyb3VwIHx8ICFpdGVtcyB8fCAhaXRlbXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICBpdGVtLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgY3VycmVudC5pc0NoZWNrTWFudWFsID0gZmFsc2U7XG5cbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICB9KTtcbiAgICAgIHRoaXMubWFwcGluZ0l0ZW1zQ2hlY2tlZCgpLmRlbGV0ZShpdGVtKClbdGhpcy5maWVsZEtleSgpXSk7XG4gICAgICB0aGlzLm91dFVuU2VsZWN0TXVsdGlLZXkuZW1pdChbaXRlbSgpW3RoaXMuZmllbGRLZXkoKV1dKTtcblxuICAgICAgY29uc3QgaXRlbXNPZkdyb3VwID0gaXRlbSgpW2NvbmZpZ1RlbXBsYXRlR3JvdXAuZmllbGRHZXRJdGVtc10gYXMgV3JpdGFibGVTaWduYWw8QXJyYXk8V3JpdGFibGVTaWduYWw8YW55Pj4+O1xuXG4gICAgICBpZiAoaXRlbXNPZkdyb3VwKCkgJiYgaXRlbXNPZkdyb3VwKCkubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlQ2hlY2tlZEl0ZW1zQ2hpbGQoaXRlbXNPZkdyb3VwKCkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIHByb2Nlc3NTZWFyY2goKSB7XG4gICAgdGhpcy5wcm9jZXNzRGF0YSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHByb2Nlc3NEYXRhKCk6IHZvaWQge1xuICAgIHRoaXMudG90YWxJdGVtLnNldCgwKTtcblxuICAgIGNvbnN0IGNvbmZpZ1RlbXBsYXRlR3JvdXAgPSB0aGlzLmNvbmZpZ1RlbXBsYXRlR3JvdXAoKTtcblxuICAgIGlmICghY29uZmlnVGVtcGxhdGVHcm91cCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBpdGVtcyA9IHRoaXMuc3RvcmUoKS5tYXAoKGl0ZW0pID0+IHtcbiAgICAgIGlmIChpc05pbChpdGVtKClbdGhpcy5maWVsZEtleSgpXSkgfHwgaXRlbSgpW3RoaXMuZmllbGRLZXkoKV0gPT09ICcnKSB7XG4gICAgICAgIGl0ZW0udXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgICAgIGN1cnJlbnRbdGhpcy5maWVsZEtleSgpXSA9IGAke3RoaXMuUEFUVEVSTl9GQUtFX0lEfSR7dXVpZCgpfWA7XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgaXRlbU1hcCA9IGNsb25lRGVlcChpdGVtKSBhcyBXcml0YWJsZVNpZ25hbDxhbnk+O1xuXG4gICAgICBpdGVtTWFwLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgY3VycmVudC5yZWYgPSBpdGVtO1xuICAgICAgICBjdXJyZW50LmlzUm9vdCA9IHRydWU7XG4gICAgICAgIGN1cnJlbnQuZXhwYW5kID0gdGhpcy5rZXlTZWFyY2goKSA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgY3VycmVudC5tYXhMZXZlbEdyb3VwID0gdGhpcy5jb25maWdUZW1wbGF0ZUdyb3VwKCk/LmdldE1heExldmVsR3JvdXAoaXRlbSgpKTtcbiAgICAgICAgY3VycmVudC5sZXZlbCA9IHRoaXMubGV2ZWwoKTtcbiAgICAgICAgY3VycmVudC50ZXh0RGVzY3JpcHRpb25Hcm91cFdoZW5Ob0RhdGEgPSB0aGlzLmNvbmZpZ1RlbXBsYXRlR3JvdXAoKT8uZ2V0RGVzY3JpcHRpb25Hcm91cFdoZW5Ob0RhdGE/LihpdGVtKCkpO1xuICAgICAgICBjdXJyZW50Lmljb25FbXB0eURhdGFJbkdyb3VwID0gdGhpcy5jb25maWdUZW1wbGF0ZUdyb3VwKCk/LmdldEljb25FbXB0eURhdGFJbkdyb3VwPy4oaXRlbSgpKTtcblxuICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgIH0pO1xuICAgICAgaWYgKChpdGVtTWFwKCkubGV2ZWwgPT09IGl0ZW1NYXAoKS5tYXhMZXZlbEdyb3VwIHx8ICF0aGlzLmNvbmZpZ1RlbXBsYXRlR3JvdXAoKT8uaWdub3JlQ2hlY2tib3hHcm91cCkgJiYgIVN0cmluZyhpdGVtKClbdGhpcy5maWVsZEtleSgpXSk/LmluY2x1ZGVzKHRoaXMuUEFUVEVSTl9GQUtFX0lEKSkge1xuICAgICAgICB0aGlzLnRvdGFsSXRlbS51cGRhdGUoY3VycmVudCA9PiBjdXJyZW50KyspO1xuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLmtleVNlYXJjaCgpICYmIHRoaXMuY29uZmlnVGVtcGxhdGVHcm91cCgpPy5nZXRFeHBhbmRHcm91cCkge1xuICAgICAgICBpdGVtTWFwLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgICBjdXJyZW50LmV4cGFuZCA9IHRoaXMuY29uZmlnVGVtcGxhdGVHcm91cCgpPy5nZXRFeHBhbmRHcm91cD8uKGl0ZW0pO1xuXG4gICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuY29uZmlnVGVtcGxhdGVHcm91cCgpPy5nZXRQb3BvdmVyR3JvdXApIHtcbiAgICAgICAgaXRlbU1hcC51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICAgICAgY3VycmVudC5kYXRhUG9wb3ZlciA9IHRoaXMuY29uZmlnVGVtcGxhdGVHcm91cCgpPy5nZXRQb3BvdmVyR3JvdXA/LihpdGVtKTtcblxuICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmNvbmZpZ1RlbXBsYXRlR3JvdXAoKT8uZ2V0QnV0dG9uR3JvdXApIHtcbiAgICAgICAgaXRlbU1hcC51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICAgICAgY3VycmVudC5idXR0b25Jbkdyb3VwID0gdGhpcy5jb25maWdUZW1wbGF0ZUdyb3VwKCk/LmdldEJ1dHRvbkdyb3VwPy4oaXRlbSk7XG5cbiAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCB0ZXh0ID0gZGVsZXRlVW5pY29kZSh0aGlzLmJ1aWxkVmFsdWVCeUNvbmZpZyhpdGVtTWFwKSkudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICAgIGNvbnN0IHRleHRFc2NhcGUgPSBlc2NhcGVIdG1sKHRleHQpO1xuICAgICAgY29uc3Qga2V5U2VhcmNoID0gZGVsZXRlVW5pY29kZShlc2NhcGVIdG1sKCh0aGlzLmtleVNlYXJjaCgpIHx8ICcnKS50cmltKCkudG9Mb2NhbGVMb3dlckNhc2UoKSkpO1xuXG4gICAgICBpdGVtTWFwLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgY3VycmVudC5kaXNwbGF5QWxsQ2hpbGQgPSBmYWxzZTtcblxuICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgIH0pO1xuICAgICAgaWYgKCFrZXlTZWFyY2ggfHwgKHRoaXMuY29uZmlnVGVtcGxhdGVHcm91cCgpPy5zZWFyY2hBbGxMZXZlbCAmJiAodGV4dC5pbmNsdWRlcyhrZXlTZWFyY2gpIHx8IHRleHRFc2NhcGUuaW5jbHVkZXMoa2V5U2VhcmNoKSkpKSB7XG4gICAgICAgIGl0ZW1NYXAudXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgICAgIGN1cnJlbnQuZGlzcGxheUFsbENoaWxkID0gZmFsc2U7XG4gICAgICAgICAgY3VycmVudC5oYXNEaXNwbGF5ID0gZmFsc2U7XG5cbiAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCBpdGVtR3JvdXAgPSBpdGVtKClbY29uZmlnVGVtcGxhdGVHcm91cC5maWVsZEdldEl0ZW1zXSBhcyBXcml0YWJsZVNpZ25hbDxBcnJheTxXcml0YWJsZVNpZ25hbDxhbnk+Pj47XG5cbiAgICAgIGl0ZW1NYXAudXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IGN1cnJlbnRbY29uZmlnVGVtcGxhdGVHcm91cC5maWVsZEdldEl0ZW1zXSBhcyBXcml0YWJsZVNpZ25hbDxBcnJheTxXcml0YWJsZVNpZ25hbDxhbnk+Pj47XG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmZpbHRlckl0ZW1zRGlzcGxheSh0aGlzLmNvbnZlcnREYXRhQnlHcm91cEluSXRlbShpdGVtR3JvdXAoKSwgaXRlbU1hcCkpO1xuXG4gICAgICAgIGNoaWxkcmVuLnNldChkYXRhKTtcbiAgICAgICAgaWYgKGN1cnJlbnRbY29uZmlnVGVtcGxhdGVHcm91cC5maWVsZEdldEl0ZW1zXT8uKCkpIHtcbiAgICAgICAgICBjdXJyZW50W2NvbmZpZ1RlbXBsYXRlR3JvdXAuZmllbGRHZXRJdGVtc10udXBkYXRlKChpdGVtRmllbGRzOiBBcnJheTxhbnk+KSA9PiB7XG4gICAgICAgICAgICBpZiAoIWl0ZW1GaWVsZHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIHJldHVybiBpdGVtRmllbGRzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaXRlbUZpZWxkc1swXS5pc0ZpcnN0ID0gdHJ1ZTtcbiAgICAgICAgICAgIGNvbnN0IGxhc3RJbmRleCA9IGl0ZW1GaWVsZHM/Lmxlbmd0aCAtIDE7XG5cbiAgICAgICAgICAgIGlmIChsYXN0SW5kZXggPj0gMCkge1xuICAgICAgICAgICAgICBpdGVtRmllbGRzW2xhc3RJbmRleF0uaXNMYXN0ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGl0ZW1GaWVsZHM7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY3VycmVudC5ib251c1BhZGRpbmdMZWZ0ID0gMDtcbiAgICAgICAgaWYgKGNvbmZpZ1RlbXBsYXRlR3JvdXAuZ2V0Qm9udXNQYWRkaW5nTGVmdEl0ZW0pIHtcbiAgICAgICAgICBjdXJyZW50LmJvbnVzUGFkZGluZ0xlZnQgPSBjb25maWdUZW1wbGF0ZUdyb3VwLmdldEJvbnVzUGFkZGluZ0xlZnRJdGVtKGN1cnJlbnQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25maWdUZW1wbGF0ZUdyb3VwLmdldENsYXNzSW5jbHVkZUl0ZW1Ob0RhdGEpIHtcbiAgICAgICAgICBjdXJyZW50LmNsYXNzSW5jbHVkZUl0ZW1Ob0RhdGEgPSBjb25maWdUZW1wbGF0ZUdyb3VwLmdldENsYXNzSW5jbHVkZUl0ZW1Ob0RhdGEoY3VycmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgY3VycmVudC5hdmF0YXJDb25maWcgPSBjb25maWdUZW1wbGF0ZUdyb3VwLmdldEF2YXRhckNvbmZpZyAmJiBjb25maWdUZW1wbGF0ZUdyb3VwLmdldEF2YXRhckNvbmZpZyhjdXJyZW50KTtcblxuICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgIH0pO1xuICAgICAgaWYgKHRoaXMubXVsdGlLZXlTZWxlY3RlZCgpICYmIHRoaXMubXVsdGlLZXlTZWxlY3RlZCgpPy5sZW5ndGggJiYgdGhpcy5tdWx0aUtleVNlbGVjdGVkKCk/LnNvbWUoa2V5ID0+IGtleSA9PT0gaXRlbU1hcCgpW3RoaXMuZmllbGRLZXkoKV0pKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlckNoYW5nZUNoZWNrZWQodHJ1ZSwgaXRlbU1hcCgpLCB0cnVlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuYnVpbGRWYWx1ZUJ5Q29uZmlnKGl0ZW1NYXAoKSk7XG5cbiAgICAgIHJldHVybiBpdGVtTWFwO1xuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMuY29uZmlnVGVtcGxhdGVHcm91cCgpPy5zZWFyY2hBbGxMZXZlbCAmJiB0aGlzLmtleVNlYXJjaCgpKSB7XG4gICAgICBpdGVtcyA9IGl0ZW1zLmZpbHRlcihpdGVtID0+IGl0ZW0oKS5oYXNEaXNwbGF5KTtcbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZygnaXRlbXMnLCBpdGVtcyk7XG5cbiAgICB0aGlzLmNvbmZpZygpPy5zb3J0Py4oaXRlbXMpO1xuICAgIHRoaXMuaXRlbXMuc2V0KGl0ZW1zKTtcbiAgICB0aGlzLm11bHRpS2V5U2VsZWN0ZWQuc2V0KFtdKVxuICAgIGNvbnN0IGNhbGxCYWNrQ2FsY3VsYXRvckhlaWdodFN1Y2Nlc3MgPSAoKSA9PiB7XG4gICAgICB0aGlzLmNhbGN1bGF0b3JIZWlnaEl0ZW1TdWNjZXNzLnNldCh0cnVlKTtcblxuICAgICAgaWYgKGNvbmZpZ1RlbXBsYXRlR3JvdXAuZXhwYW5kRmlyc3RJdGVtICYmIHRoaXMuaXRlbXMoKVswXSkge1xuICAgICAgICB0aGlzLmV4cGFuZEFsbEl0ZW1zSW5Hcm91cCh0aGlzLml0ZW1zKClbMF0pO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnNldEhlaWdodFZpZXdQb3J0KCk7XG4gICAgICBpZiAodGhpcy5maXJzdEl0ZW1TZWxlY3RlZCgpKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlckNoYW5nZUNoZWNrZWQodHJ1ZSwgdGhpcy5maXJzdEl0ZW1TZWxlY3RlZCk7XG4gICAgICAgIHRoaXMuZmlyc3RJdGVtU2VsZWN0ZWQuc2V0KHVuZGVmaW5lZCk7XG4gICAgICB9XG4gICAgfTtcbiAgICBjb25zdCBjaGVja0xvYWRJdGVtID0gKHByZVN0YXRlSGFzU2Nyb2xsOiBib29sZWFuLCBjdXJyZW50SGFzU2Nyb2xsOiBib29sZWFuKSA9PiB7XG4gICAgICBpZiAodGhpcy5rZXlzSGlkZGVuSXRlbSgpPy5sZW5ndGggJiYgcHJlU3RhdGVIYXNTY3JvbGwgJiYgIWN1cnJlbnRIYXNTY3JvbGwgJiYgKHRoaXMuaXNTZWFyY2hPbmxpbmUoKSkpIHtcbiAgICAgICAgdGhpcy5jYWxsQXBpQnlTZXJ2aWNlKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmxvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICAgIHRoaXMub3V0TG9hZGluZy5lbWl0KHRoaXMubG9hZGluZygpKTtcbiAgICAgIHRoaXMucmVmcmVzaFZpZXcoY2FsbEJhY2tDYWxjdWxhdG9ySGVpZ2h0U3VjY2VzcywgY2hlY2tMb2FkSXRlbSk7XG4gICAgICB0aGlzLm91dExvYWRJdGVtc0NvbXBsZXRlLmVtaXQoeyBpdGVtczogdGhpcy5pdGVtcygpIH0pO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcHJpdmF0ZSByZWZyZXNoVmlldyhjYWxsQmFja0NhbGN1bGF0b3JIZWlnaHRTdWNjZXNzPzogKCkgPT4gdm9pZCwgY2hlY2tMb2FkSXRlbT86IChwcmVTdGF0ZUhhc1Njcm9sbDogYm9vbGVhbiwgY3VycmVudEhhc1Njcm9sbDogYm9vbGVhbikgPT4gdm9pZCkge1xuICAgIHRoaXMuc2V0SGVpZ2h0Vmlld1BvcnQoY2FsbEJhY2tDYWxjdWxhdG9ySGVpZ2h0U3VjY2Vzcyk7XG4gICAgdGhpcy5jaGVja1ZpZXdQb3J0U2Nyb2xsKGNoZWNrTG9hZEl0ZW0pO1xuICB9XG5cbiAgcHJpdmF0ZSBleHBhbmRBbGxJdGVtc0luR3JvdXAoaXRlbTogYW55KSB7XG4gICAgY29uc3QgY29uZmlnVGVtcGxhdGVHcm91cCA9IHRoaXMuY29uZmlnVGVtcGxhdGVHcm91cCgpO1xuICAgIGlmICghY29uZmlnVGVtcGxhdGVHcm91cCB8fCAhaXRlbSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpdGVtLmV4cGFuZCA9IHRydWU7XG4gICAgY29uc3QgaXRlbXM6IEFycmF5PGFueT4gPSBpdGVtW2NvbmZpZ1RlbXBsYXRlR3JvdXAuZmllbGRHZXRJdGVtc107XG5cbiAgICBpZiAoIWl0ZW1zIHx8ICFpdGVtcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaXRlbXMuZm9yRWFjaChpdGVtR3JvdXAgPT4gdGhpcy5leHBhbmRBbGxJdGVtc0luR3JvdXAoaXRlbUdyb3VwKSk7XG4gIH1cblxuXG4gIHByaXZhdGUgY29udmVydERhdGFCeUdyb3VwSW5JdGVtKGl0ZW1zOiBBcnJheTxXcml0YWJsZVNpZ25hbDxhbnk+PiwgcGFyZW50SXRlbTogV3JpdGFibGVTaWduYWw8YW55Pikge1xuICAgIGNvbnN0IGNvbmZpZ1RlbXBsYXRlR3JvdXAgPSB0aGlzLmNvbmZpZ1RlbXBsYXRlR3JvdXAoKTtcbiAgICBpZiAoIWNvbmZpZ1RlbXBsYXRlR3JvdXAgfHwgIWl0ZW1zIHx8ICFpdGVtcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgY29uc3QgaXRlbXNNYXAgPSBpdGVtcy5tYXAoaXRlbSA9PiB7XG4gICAgICBpZiAoaXNOaWwoaXRlbSgpW3RoaXMuZmllbGRLZXkoKV0pIHx8IGl0ZW0oKVt0aGlzLmZpZWxkS2V5KCldID09PSAnJykge1xuICAgICAgICBpdGVtKClbdGhpcy5maWVsZEtleSgpXSA9IGAke3RoaXMuUEFUVEVSTl9GQUtFX0lEfSR7dXVpZCgpfWA7XG4gICAgICB9XG4gICAgICBjb25zdCBpdGVtTWFwID0gY2xvbmVEZWVwKGl0ZW0pIGFzIFdyaXRhYmxlU2lnbmFsPGFueT47XG5cbiAgICAgIGl0ZW1NYXAudXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgICBjdXJyZW50LnJlZiA9IGl0ZW07XG4gICAgICAgIGN1cnJlbnQucGFyZW50SXRlbSA9IHBhcmVudEl0ZW07XG4gICAgICAgIGN1cnJlbnRbdGhpcy5maWVsZEtleSgpXSA9IGl0ZW0oKVt0aGlzLmZpZWxkS2V5KCldO1xuXG4gICAgICAgIGN1cnJlbnQubWF4TGV2ZWxHcm91cCA9IHBhcmVudEl0ZW0oKS5tYXhMZXZlbEdyb3VwO1xuICAgICAgICBjdXJyZW50LmxldmVsID0gcGFyZW50SXRlbSgpLmxldmVsICsgMTtcbiAgICAgICAgY3VycmVudC5hcnJheUxldmVsID0gcmFuZ2UoMiwgY3VycmVudC5sZXZlbCArIDEpO1xuICAgICAgICBpZiAoKGN1cnJlbnQubGV2ZWwgPT09IGN1cnJlbnQubWF4TGV2ZWxHcm91cCB8fCAhY29uZmlnVGVtcGxhdGVHcm91cC5pZ25vcmVDaGVja2JveEl0ZW0pICYmICFTdHJpbmcoaXRlbSgpW3RoaXMuZmllbGRLZXkoKV0pPy5pbmNsdWRlcyh0aGlzLlBBVFRFUk5fRkFLRV9JRCkpIHtcbiAgICAgICAgICB0aGlzLnRvdGFsSXRlbS51cGRhdGUoY3VycmVudCA9PiBjdXJyZW50KyspO1xuICAgICAgICB9XG5cbiAgICAgICAgY3VycmVudC5leHBhbmQgPSB0aGlzLmtleVNlYXJjaCgpID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICBpZiAoIXRoaXMua2V5U2VhcmNoKCkgJiYgY29uZmlnVGVtcGxhdGVHcm91cC5nZXRFeHBhbmRJdGVtKSB7XG4gICAgICAgICAgY3VycmVudC5leHBhbmQgPSBjb25maWdUZW1wbGF0ZUdyb3VwLmdldEV4cGFuZEl0ZW0oY3VycmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgY3VycmVudC5kaXNwbGF5QWxsQ2hpbGQgPSBwYXJlbnRJdGVtKCkuZGlzcGxheUFsbENoaWxkO1xuICAgICAgICBpZiAoY29uZmlnVGVtcGxhdGVHcm91cC5nZXRQb3BvdmVySXRlbSkge1xuICAgICAgICAgIGN1cnJlbnQuZGF0YVBvcG92ZXIgPSBjb25maWdUZW1wbGF0ZUdyb3VwLmdldFBvcG92ZXJJdGVtKGN1cnJlbnQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25maWdUZW1wbGF0ZUdyb3VwLmdldEljb25JbWFnZUNsYXNzKSB7XG4gICAgICAgICAgY3VycmVudC5pY29uSW1hZ2VDbGFzcyA9IGNvbmZpZ1RlbXBsYXRlR3JvdXAuZ2V0SWNvbkltYWdlQ2xhc3MoY3VycmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdGV4dCA9IGRlbGV0ZVVuaWNvZGUodGhpcy5idWlsZFZhbHVlQnlDb25maWcoY3VycmVudCkudG9Mb2NhbGVMb3dlckNhc2UoKSk7XG4gICAgICAgIGNvbnN0IGtleVNlYXJjaCA9IGRlbGV0ZVVuaWNvZGUoZXNjYXBlSHRtbCgodGhpcy5rZXlTZWFyY2goKSB8fCAnJykudHJpbSgpLnRvTG9jYWxlTG93ZXJDYXNlKCkpKTtcbiAgICAgICAgY29uc3QgdGV4dEVzY2FwZSA9IGVzY2FwZUh0bWwodGV4dCk7XG5cbiAgICAgICAgaWYgKCghdGhpcy5rZXlzSGlkZGVuSXRlbSgpPy5zb21lKGtleSA9PiBrZXkgPT09IGN1cnJlbnRbdGhpcy5maWVsZEtleSgpXSkpICYmICgocGFyZW50SXRlbSgpLmRpc3BsYXlBbGxDaGlsZCB8fCAha2V5U2VhcmNoKSB8fCAoKGNvbmZpZ1RlbXBsYXRlR3JvdXAuc2VhcmNoQWxsTGV2ZWwgfHwgIWN1cnJlbnRbdGhpcy5maWVsZEtleSgpXS5pbmNsdWRlcyh0aGlzLlBBVFRFUk5fRkFLRV9JRCkpICYmICh0ZXh0LmluY2x1ZGVzKGtleVNlYXJjaCkgfHwgdGV4dEVzY2FwZS5pbmNsdWRlcyhrZXlTZWFyY2gpKSkpKSB7XG4gICAgICAgICAgY3VycmVudC5kaXNwbGF5QWxsQ2hpbGQgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuc2V0RGlzcGxheUl0ZW0oY3VycmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaXRlbUdyb3VwID0gY3VycmVudFtjb25maWdUZW1wbGF0ZUdyb3VwLmZpZWxkR2V0SXRlbXNdIGFzIFdyaXRhYmxlU2lnbmFsPEFycmF5PFdyaXRhYmxlU2lnbmFsPGFueT4+PjtcbiAgICAgICAgY29uc29sZS5sb2coaXRlbUdyb3VwLCBjdXJyZW50LCk7XG5cbiAgICAgICAgaWYgKGl0ZW1Hcm91cD8uKCkpIHtcbiAgICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5maWx0ZXJJdGVtc0Rpc3BsYXkodGhpcy5jb252ZXJ0RGF0YUJ5R3JvdXBJbkl0ZW0oaXRlbUdyb3VwPy4oKSwgc2lnbmFsKGN1cnJlbnQpKSk7XG5cbiAgICAgICAgICBpdGVtR3JvdXAuc2V0KGRhdGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGN1cnJlbnRbY29uZmlnVGVtcGxhdGVHcm91cC5maWVsZEdldEl0ZW1zXT8uKCkpIHtcbiAgICAgICAgICBjdXJyZW50W2NvbmZpZ1RlbXBsYXRlR3JvdXAuZmllbGRHZXRJdGVtc10udXBkYXRlKChpdGVtRmllbGRzOiBBcnJheTxhbnk+KSA9PiB7XG4gICAgICAgICAgICBpZiAoIWl0ZW1GaWVsZHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIHJldHVybiBpdGVtRmllbGRzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaXRlbUZpZWxkc1swXS5pc0ZpcnN0ID0gdHJ1ZTtcbiAgICAgICAgICAgIGNvbnN0IGxhc3RJbmRleCA9IGl0ZW1GaWVsZHM/Lmxlbmd0aCAtIDE7XG5cbiAgICAgICAgICAgIGlmIChsYXN0SW5kZXggPj0gMCkge1xuICAgICAgICAgICAgICBpdGVtRmllbGRzW2xhc3RJbmRleF0uaXNMYXN0ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGl0ZW1GaWVsZHM7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY3VycmVudC5ib251c1BhZGRpbmdMZWZ0ID0gMDtcbiAgICAgICAgaWYgKGNvbmZpZ1RlbXBsYXRlR3JvdXAuZ2V0Qm9udXNQYWRkaW5nTGVmdEl0ZW0pIHtcbiAgICAgICAgICBjdXJyZW50LmJvbnVzUGFkZGluZ0xlZnQgPSBjb25maWdUZW1wbGF0ZUdyb3VwLmdldEJvbnVzUGFkZGluZ0xlZnRJdGVtKGN1cnJlbnQsIHBhcmVudEl0ZW0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25maWdUZW1wbGF0ZUdyb3VwLmdldENsYXNzSW5jbHVkZUl0ZW1Ob0RhdGEpIHtcbiAgICAgICAgICBjdXJyZW50LmNsYXNzSW5jbHVkZUl0ZW1Ob0RhdGEgPSBjb25maWdUZW1wbGF0ZUdyb3VwLmdldENsYXNzSW5jbHVkZUl0ZW1Ob0RhdGEoY3VycmVudCwgcGFyZW50SXRlbSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbmZpZ1RlbXBsYXRlR3JvdXAuZ2V0TGlua0ltYWdlRXJyb3IpIHtcbiAgICAgICAgICBjdXJyZW50LmxpbmtJbWFnZUVycm9yID0gY29uZmlnVGVtcGxhdGVHcm91cC5nZXRMaW5rSW1hZ2VFcnJvcihjdXJyZW50KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uZmlnVGVtcGxhdGVHcm91cC5nZXRDbGFzc0luY2x1ZGVJdGVtQ29udGVudCkge1xuICAgICAgICAgIGN1cnJlbnQuY2xhc3NJbmNsdWRlID0gY29uZmlnVGVtcGxhdGVHcm91cC5nZXRDbGFzc0luY2x1ZGVJdGVtQ29udGVudChpdGVtKTtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50LmF2YXRhckNvbmZpZyA9IGNvbmZpZ1RlbXBsYXRlR3JvdXAuZ2V0QXZhdGFyQ29uZmlnICYmIGNvbmZpZ1RlbXBsYXRlR3JvdXAuZ2V0QXZhdGFyQ29uZmlnKGN1cnJlbnQpO1xuICAgICAgICBpZiAodGhpcy5tdWx0aUtleVNlbGVjdGVkKCkgJiYgdGhpcy5tdWx0aUtleVNlbGVjdGVkKCk/Lmxlbmd0aCAmJiB0aGlzLm11bHRpS2V5U2VsZWN0ZWQoKT8uc29tZShrZXkgPT4ga2V5ID09PSBjdXJyZW50W3RoaXMuZmllbGRLZXkoKV0pKSB7XG4gICAgICAgICAgdGhpcy5oYW5kbGVyQ2hhbmdlQ2hlY2tlZCh0cnVlLCBjdXJyZW50LCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5zZWxlY3RGaXJzdEl0ZW0oKSAmJiBjdXJyZW50LmxldmVsID09PSBjdXJyZW50Lm1heExldmVsR3JvdXApIHtcbiAgICAgICAgICB0aGlzLmZpcnN0SXRlbVNlbGVjdGVkLnNldChjdXJyZW50KTtcbiAgICAgICAgICB0aGlzLnNlbGVjdEZpcnN0SXRlbS5zZXQoZmFsc2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGl0ZW1NYXA7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gaXRlbXNNYXA7XG4gIH1cblxuICBwcml2YXRlIHNldERpc3BsYXlJdGVtKGl0ZW06IGFueSkge1xuICAgIGlmICghaXRlbSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpdGVtLmhhc0Rpc3BsYXkgPSB0cnVlO1xuXG4gICAgaWYgKGl0ZW0ucGFyZW50SXRlbSkge1xuICAgICAgdGhpcy5zZXREaXNwbGF5SXRlbShpdGVtLnBhcmVudEl0ZW0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZmlsdGVySXRlbXNEaXNwbGF5KGl0ZW1zOiBBcnJheTxXcml0YWJsZVNpZ25hbDxhbnk+Pik6IEFycmF5PFdyaXRhYmxlU2lnbmFsPGFueT4+IHtcbiAgICBjb25zdCBjb25maWdUZW1wbGF0ZUdyb3VwID0gdGhpcy5jb25maWdUZW1wbGF0ZUdyb3VwKCk7XG4gICAgaWYgKCFjb25maWdUZW1wbGF0ZUdyb3VwIHx8ICFpdGVtcyB8fCAhaXRlbXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGNvbnN0IGl0ZW1zRGlzcGxheSA9IGl0ZW1zLmZpbHRlcihpdGVtID0+IGl0ZW0oKS5oYXNEaXNwbGF5KTtcblxuICAgIGl0ZW1zRGlzcGxheS5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgY29uc3QgaXRlbUdyb3VwID0gaXRlbSgpW2NvbmZpZ1RlbXBsYXRlR3JvdXAuZmllbGRHZXRJdGVtc107XG4gICAgICBpdGVtKClbY29uZmlnVGVtcGxhdGVHcm91cC5maWVsZEdldEl0ZW1zXT8uc2V0KHRoaXMuZmlsdGVySXRlbXNEaXNwbGF5KGl0ZW1Hcm91cCgpKSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gaXRlbXNEaXNwbGF5O1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldExlbmd0aEl0ZW0oKTogbnVtYmVyIHtcbiAgICBjb25zdCBkYXRhID0geyBsZW5ndGg6IHRoaXMuaXRlbXMubGVuZ3RoIH07XG5cbiAgICBpZiAoZGF0YS5sZW5ndGggPiB0aGlzLm1heEl0ZW1TaG93KCkpIHtcbiAgICAgIHJldHVybiBkYXRhLmxlbmd0aDtcbiAgICB9XG4gICAgdGhpcy5nZXRMZW5ndGhBbGxHcm91cCh0aGlzLml0ZW1zKCksIGRhdGEpO1xuXG4gICAgcmV0dXJuIGRhdGEubGVuZ3RoO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRMZW5ndGhBbGxHcm91cChpdGVtczogQXJyYXk8V3JpdGFibGVTaWduYWw8YW55Pj4sIGRhdGE6IHsgbGVuZ3RoOiBudW1iZXIgfSkge1xuICAgIGNvbnN0IGNvbmZpZ1RlbXBsYXRlR3JvdXAgPSB0aGlzLmNvbmZpZ1RlbXBsYXRlR3JvdXAoKTtcblxuICAgIGlmICghY29uZmlnVGVtcGxhdGVHcm91cCB8fCAhaXRlbXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgICBpZiAoIWl0ZW0oKS5leHBhbmQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBncm91cCA9IGl0ZW0oKVtjb25maWdUZW1wbGF0ZUdyb3VwLmZpZWxkR2V0SXRlbXNdIGFzIFdyaXRhYmxlU2lnbmFsPEFycmF5PFdyaXRhYmxlU2lnbmFsPGFueT4+PjtcblxuICAgICAgZGF0YS5sZW5ndGggKz0gKGdyb3VwKCk/Lmxlbmd0aCB8fCAwKTtcbiAgICAgIGlmICgoIWdyb3VwKCkgfHwgIWdyb3VwKCkubGVuZ3RoKSAmJiBpdGVtKCkubGV2ZWwgPT09IDEgJiYgKCFjb25maWdUZW1wbGF0ZUdyb3VwLnNlYXJjaEFsbExldmVsIHx8IGNvbmZpZ1RlbXBsYXRlR3JvdXAuYXV0b0NvdW50V2hlbkdyb3VwRW1wdHlJdGVtTGV2ZWwxKSkge1xuICAgICAgICBkYXRhLmxlbmd0aCArPSAxO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGF0YS5sZW5ndGggPiB0aGlzLm1heEl0ZW1TaG93KCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5nZXRMZW5ndGhBbGxHcm91cChncm91cCgpLCBkYXRhKTtcbiAgICAgIGlmIChkYXRhLmxlbmd0aCA+IHRoaXMubWF4SXRlbVNob3coKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGdldEhlaWdodEdyb3VwSGFzTGluZSgpIHtcbiAgICBjb25zdCBjb25maWdUZW1wbGF0ZUdyb3VwID0gdGhpcy5jb25maWdUZW1wbGF0ZUdyb3VwKCk7XG5cbiAgICBpZiAoIWNvbmZpZ1RlbXBsYXRlR3JvdXAgfHwgY29uZmlnVGVtcGxhdGVHcm91cD8uaWdub3JlR3JvdXBMaW5lIHx8ICF0aGlzLml0ZW1zPy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICBsZXQgbGVuZ3RoID0gMDtcbiAgICBsZXQgY291bnQgPSAwO1xuXG4gICAgZm9yIChjb25zdCBpdGVtIG9mIHRoaXMuaXRlbXMoKSkge1xuICAgICAgaWYgKGxlbmd0aCA+PSB0aGlzLm1heEl0ZW1TaG93KCkpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjb3VudCArPSAxO1xuICAgICAgbGVuZ3RoICs9IDE7XG4gICAgICBjb25zdCBncm91cCA9IGl0ZW0oKVtjb25maWdUZW1wbGF0ZUdyb3VwLmZpZWxkR2V0SXRlbXNdIGFzIFdyaXRhYmxlU2lnbmFsPEFycmF5PFdyaXRhYmxlU2lnbmFsPGFueT4+PjtcbiAgICAgIGNvbnN0IGRhdGEgPSB7IGxlbmd0aDogaXRlbSgpLmV4cGFuZCA/IGdyb3VwKCk/Lmxlbmd0aCB8fCAwIDogMCB9O1xuXG4gICAgICB0aGlzLmdldExlbmd0aEFsbEdyb3VwKGdyb3VwKCksIGRhdGEpO1xuICAgICAgbGVuZ3RoICs9IGRhdGEubGVuZ3RoO1xuICAgIH1cbiAgICBjb25zdCBtYXJnaW5Ub3BIYXNMaW5lID0gY29uZmlnVGVtcGxhdGVHcm91cC5tYXJnaW5Ub3BIYXNMaW5lIHx8IDQ7XG4gICAgY29uc3QgaGVpZ2h0ID0gY291bnQgPT09IDEgPyBtYXJnaW5Ub3BIYXNMaW5lIDogKGNvdW50IC0gMSkgKiAobWFyZ2luVG9wSGFzTGluZSAqIDMgKyAxKTtcblxuICAgIHJldHVybiBoZWlnaHQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYnVpbGRWYWx1ZUJ5Q29uZmlnKGl0ZW06IGFueSk6IHN0cmluZyB7XG4gICAgY29uc3QgbGFiZWxTZWFyY2ggPSB0aGlzLmNvbmZpZ1RlbXBsYXRlR3JvdXAoKT8uZ2V0TGFiZWxTZWFyY2g/LihpdGVtKTtcblxuICAgIGlmIChpdGVtLmlzUm9vdCkge1xuICAgICAgaWYgKHRoaXMuY29uZmlnVGVtcGxhdGVHcm91cCgpPy5nZXRMYWJlbEdyb3VwKSB7XG4gICAgICAgIGl0ZW0uZmllbGRMYWJlbCA9IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KHRoaXMuY29uZmlnVGVtcGxhdGVHcm91cCgpPy5nZXRMYWJlbEdyb3VwKGl0ZW0pIHx8ICcgJyk7XG5cbiAgICAgICAgcmV0dXJuIGxhYmVsU2VhcmNoID8/IGl0ZW0uZmllbGRMYWJlbDtcbiAgICAgIH1cbiAgICAgIGl0ZW0uZmllbGRMYWJlbCA9IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KGl0ZW0ubGFiZWwgfHwgaXRlbS5uYW1lIHx8ICcgJyk7XG5cbiAgICAgIHJldHVybiBpdGVtLmZpZWxkTGFiZWw7XG4gICAgfVxuICAgIGlmICh0aGlzLmNvbmZpZ1RlbXBsYXRlR3JvdXAoKT8uZ2V0TGFiZWxJdGVtKSB7XG4gICAgICBpdGVtLmZpZWxkTGFiZWwgPSB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCh0aGlzLmNvbmZpZ1RlbXBsYXRlR3JvdXAoKT8uZ2V0TGFiZWxJdGVtKGl0ZW0pIHx8ICcgJyk7XG5cbiAgICAgIHJldHVybiBsYWJlbFNlYXJjaCA/PyBpdGVtLmZpZWxkTGFiZWw7XG4gICAgfVxuICAgIGl0ZW0uZmllbGRMYWJlbCA9IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KGl0ZW0ubGFiZWwgfHwgaXRlbS5uYW1lIHx8ICcgJyk7XG5cbiAgICByZXR1cm4gbGFiZWxTZWFyY2ggPz8gaXRlbS5maWVsZExhYmVsO1xuICB9XG59XG4iLCJAaWYgKGNvbmZpZ1RlbXBsYXRlR3JvdXAoKTsgYXMgY29uZmlnVGVtcGxhdGVHcm91cCkge1xuICA8ZGl2IGNsYXNzPVwibGlicy11aS1saXN0LWdyb3VwIG92ZXJmbG93LVtoaWRkZW5dXCJcbiAgICBbc3R5bGUuaGVpZ2h0XT1cImhlaWdodFZpZXdQb3J0KCkgPyBoZWlnaHRWaWV3UG9ydCgpKydweCc6JzEwMCUnXCI+XG4gICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgdy1mdWxsIGgtZnVsbCByZWxhdGl2ZSBtaW4taC1bMjhweF1cIj5cbiAgICAgIEBpZiAoaXRlbXMoKS5sZW5ndGggJiYgY29uZmlnVGVtcGxhdGVHcm91cC5jb25maWdCdXR0b25TZWxlY3RBbmRVbmRTZWxlY3RJdGVtPy4oKTsgYXMgY29uZmlnQnV0dG9uU2VsZWN0SXRlbSkge1xuICAgICAgICA8ZGl2IFtjbGFzc109XCInZmxleCBpdGVtcy1jZW50ZXIgYmctWyNmZmZmZmZdICcrKGNvbmZpZ0J1dHRvblNlbGVjdEl0ZW0uY2xhc3NJbmNsdWRlID8/ICdsaWJzLXVpLWJvcmRlci1ib3R0b20tZ2VuZXJhbCcpXCI+XG4gICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvbiBbdHlwZV09XCJjb25maWdCdXR0b25TZWxlY3RJdGVtLmJ1dHRvbkNoZWNrQWxsPy50eXBlID8/ICdidXR0b24tbGluay1wcmltYXJ5J1wiXG4gICAgICAgICAgICBbbGFiZWxdPVwiY29uZmlnQnV0dG9uU2VsZWN0SXRlbS5idXR0b25DaGVja0FsbD8ubGFiZWwgPz8gJ2kxOG5fc2VsZWN0X2FsbF9zZWFyY2hlZF9yZXN1bHRzJ1wiXG4gICAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cImNvbmZpZ0J1dHRvblNlbGVjdEl0ZW0uYnV0dG9uQ2hlY2tBbGw/LmNsYXNzSW5jbHVkZSB8fCAncHItWzhweF0nXCJcbiAgICAgICAgICAgIFtjbGFzc0xhYmVsXT1cImNvbmZpZ0J1dHRvblNlbGVjdEl0ZW0uYnV0dG9uQ2hlY2tBbGw/LmNsYXNzTGFiZWwgfHwgJ2xpYnMtdWktZm9udC1oNnInXCJcbiAgICAgICAgICAgIFtkaXNhYmxlXT1cImxvYWRpbmcoKSB8fCBkaXNhYmxlKCkgfHwgZmFsc2VcIlxuICAgICAgICAgICAgKG91dENsaWNrKT1cImhhbmRsZXJDaGVja2VkT3JVbkNoZWNrZWRBbGwodHJ1ZSlcIiAvPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LVsjOTk5OTk5XVwiPnw8L2Rpdj5cbiAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uIFt0eXBlXT1cImNvbmZpZ0J1dHRvblNlbGVjdEl0ZW0uYnV0dG9uVW5jaGVja0FsbD8udHlwZSA/PyAnYnV0dG9uLWxpbmstcHJpbWFyeSdcIlxuICAgICAgICAgICAgW2xhYmVsXT1cImNvbmZpZ0J1dHRvblNlbGVjdEl0ZW0uYnV0dG9uVW5jaGVja0FsbD8ubGFiZWwgPz8gJ2kxOG5fdW5zZWxlY3RfYWxsX3NlYXJjaGVkX3Jlc3VsdHMnXCJcbiAgICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiY29uZmlnQnV0dG9uU2VsZWN0SXRlbS5idXR0b25VbmNoZWNrQWxsPy5jbGFzc0luY2x1ZGUgfHwgJ3BsLVs4cHhdJ1wiXG4gICAgICAgICAgICBbY2xhc3NMYWJlbF09XCJjb25maWdCdXR0b25TZWxlY3RJdGVtLmJ1dHRvblVuY2hlY2tBbGw/LmNsYXNzTGFiZWwgfHwgJ2xpYnMtdWktZm9udC1oNnMnXCJcbiAgICAgICAgICAgIFtkaXNhYmxlXT1cImxvYWRpbmcoKSB8fCBkaXNhYmxlKCkgfHwgZmFsc2VcIlxuICAgICAgICAgICAgKG91dENsaWNrKT1cImhhbmRsZXJDaGVja2VkT3JVbkNoZWNrZWRBbGwoZmFsc2UpXCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgICBAaWYgKGl0ZW1zKCkubGVuZ3RoICYmIGNvbmZpZ1RlbXBsYXRlR3JvdXAuY29uZmlnQ2hlY2tib3hDaGVja0FsbD8uKCk7IGFzIGNvbmZpZ0NoZWNrQm94KSB7XG4gICAgICAgIDxkaXYgW2NsYXNzXT1cIidmbGV4IGxpYnMtdWktYm9yZGVyLWJvdHRvbS1nZW5lcmFsICcrKGNvbmZpZ1RlbXBsYXRlR3JvdXAuY2xhc3NJbmNsdWRlSGFzQ29uZmlnQ2hlY2tCb3hBbGwgPz8gJyBiZy1bI2ZmZmZmZl0nKVwiPlxuICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtY2hlY2tib3gtc2luZ2xlIFtsYWJlbF09XCJjb25maWdDaGVja0JveC5sYWJlbCA/PyAnaTE4bl9hbGwnXCJcbiAgICAgICAgICAgIFtjbGFzc0xhYmVsSW5jbHVkZV09XCJjb25maWdDaGVja0JveC5jbGFzc0xhYmVsSW5jbHVkZSB8fCAnJ1wiXG4gICAgICAgICAgICBbY2hlY2tlZF09XCJ0b3RhbEl0ZW1DaGVja2VkKCkgPj0gdG90YWxJdGVtKCkgJiYgdG90YWxJdGVtKCkgPiAwXCJcbiAgICAgICAgICAgIFtkaXNhYmxlXT1cImxvYWRpbmcoKSB8fCBkaXNhYmxlKCkgfHwgZmFsc2VcIlxuICAgICAgICAgICAgKG91dENoYW5nU3RhZ2VGbGFnTW91c2VQb3BvdmVyKT0naGFuZGxlckNoYW5nU3RhZ2VGbGFnTW91c2UoJGV2ZW50KSdcbiAgICAgICAgICAgIChvdXRDaGFuZ2UpPVwiaGFuZGxlckNoZWNrZWRPclVuQ2hlY2tlZEFsbCgkZXZlbnQuY2hlY2tlZClcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICAgIEBpZiAoaXRlbXMoKSAmJiBpdGVtcygpLmxlbmd0aCkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwidy1mdWxsIGgtZnVsbCByZWxhdGl2ZSBmbGV4XCI+XG4gICAgICAgICAgPGRpdiBMaWJzVWlDb21wb25lbnRzU2Nyb2xsT3ZlcmxheURpcmVjdGl2ZVxuICAgICAgICAgICAgY2xhc3M9XCJ3LWZ1bGwgaC1mdWxsIGFic29sdXRlIHRvcC0wIGxlZnQtMCB7eyBjb25maWdUZW1wbGF0ZUdyb3VwLmNsYXNzSW5jbHVkZUdyb3VwID8gY29uZmlnVGVtcGxhdGVHcm91cC5jbGFzc0luY2x1ZGVHcm91cCA6ICcnIH19XCI+XG4gICAgICAgICAgICBAZm9yIChpdGVtIG9mIGl0ZW1zKCk7IHRyYWNrIGl0ZW0oKVtmaWVsZEtleSgpXTsgbGV0IGZpcnN0ID0gJGZpcnN0OyBsZXQgbGFzdCA9ICRsYXN0KSB7XG4gICAgICAgICAgICAgIDxkaXYgI2l0ZW1SZWZcbiAgICAgICAgICAgICAgICBbc3R5bGUubWFyZ2luVG9wLnB4XT1cIiFjb25maWdUZW1wbGF0ZUdyb3VwLmlnbm9yZUdyb3VwTGluZSA/IGNvbmZpZ1RlbXBsYXRlR3JvdXAubWFyZ2luVG9wSGFzTGluZSB8fCA0IDogMFwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGZsZXgtY29sIHJlbGF0aXZlIFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBweS1bNnB4XSBcIlxuICAgICAgICAgICAgICAgICAgW2NsYXNzLmxpYnMtdWktYmctbGlzdC1ob3Zlcl09XCIhY29uZmlnVGVtcGxhdGVHcm91cC5pZ25vcmVDbGlja0xhYmVsR3JvdXBcIlxuICAgICAgICAgICAgICAgICAgW2NsYXNzLmxpYnMtdWktYmctbGlzdC1ob3Zlci1hY3RpdmVdPVwiIWNvbmZpZ1RlbXBsYXRlR3JvdXAuaWdub3JlQ2xpY2tMYWJlbEdyb3VwXCJcbiAgICAgICAgICAgICAgICAgIFtjbGFzcy4hY3Vyc29yLXBvaW50ZXJdPVwiIWNvbmZpZ1RlbXBsYXRlR3JvdXAuaWdub3JlQ2xpY2tMYWJlbEdyb3VwICAmJiAoY29uZmlnVGVtcGxhdGVHcm91cC5pZ25vcmVDaGVja2JveEdyb3VwIHx8IGNvbmZpZ1RlbXBsYXRlR3JvdXAuc2luZ2xlU2VsZWN0SXRlbSlcIlxuICAgICAgICAgICAgICAgICAgW3N0eWxlLnBhZGRpbmdMZWZ0LnB4XT1cImxldmVsKCkqKGNvbmZpZ1RlbXBsYXRlR3JvdXAuaXNWaWV3VHJlZSA/IDggOiAxNilcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIihjb25maWdUZW1wbGF0ZUdyb3VwLmlnbm9yZUNoZWNrYm94R3JvdXAgfHwgY29uZmlnVGVtcGxhdGVHcm91cC5zaW5nbGVTZWxlY3RJdGVtKSA/IGhhbmRsZXJUb2dnbGVFeHBhbmQoJGV2ZW50LGl0ZW0oKSkgOiB1bmRlZmluZWRcIj5cbiAgICAgICAgICAgICAgICAgIEBpZiAoY29uZmlnVGVtcGxhdGVHcm91cC5pY29uRXhwYW5kID09PSAnbGVmdCcgfHwgY29uZmlnVGVtcGxhdGVHcm91cC5pc1ZpZXdUcmVlKSB7XG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgbGlicy11aS1pY29uLWNoZXZyb24tcmlnaHRcIlxuICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5yb3RhdGUtOTBdPVwiaXRlbSgpLmV4cGFuZFwiXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImhhbmRsZXJUb2dnbGVFeHBhbmQoJGV2ZW50LGl0ZW0oKSlcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9pPlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXhcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3MubW8tbGliLWNhbGMtdy0zMnB4XT1cImNvbmZpZ1RlbXBsYXRlR3JvdXAuaWNvbkV4cGFuZCA9PT0gJ3JpZ2h0JyAmJiAhY29uZmlnVGVtcGxhdGVHcm91cC5pc1ZpZXdUcmVlICYmICghY29uZmlnVGVtcGxhdGVHcm91cC5zZWFyY2hBbGxMZXZlbCB8fCAhIWl0ZW0oKVtjb25maWdUZW1wbGF0ZUdyb3VwLmZpZWxkR2V0SXRlbXNdPy5sZW5ndGgpXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm1vLWxpYi1jYWxjLXctMTZweF09XCJjb25maWdUZW1wbGF0ZUdyb3VwLmljb25FeHBhbmQgPT09ICdsZWZ0JyB8fCBjb25maWdUZW1wbGF0ZUdyb3VwLmlzVmlld1RyZWVcIj5cbiAgICAgICAgICAgICAgICAgICAgQGlmICghY29uZmlnVGVtcGxhdGVHcm91cC5pc1ZpZXdSYWRpbykge1xuICAgICAgICAgICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtY2hlY2tib3gtc2luZ2xlIFthdmF0YXJDb25maWddPVwiaXRlbSgpLmF2YXRhckNvbmZpZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubWwtWzhweF1dPVwiY29uZmlnVGVtcGxhdGVHcm91cC5pY29uRXhwYW5kID09PSAnbGVmdCcgfHwgY29uZmlnVGVtcGxhdGVHcm91cC5pc1ZpZXdUcmVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpZ25vcmVDaGVja2JveF09XCJjb25maWdUZW1wbGF0ZUdyb3VwLmlnbm9yZUNoZWNrYm94R3JvdXAgfHwgY29uZmlnVGVtcGxhdGVHcm91cC5zaW5nbGVTZWxlY3RJdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJjb25maWdUZW1wbGF0ZUdyb3VwLmNsYXNzSW5jbHVkZUl0ZW0gfHwgJydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnctYXV0b109XCJjb25maWdUZW1wbGF0ZUdyb3VwLmlzVmlld1RyZWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnctZnVsbF09XCIhaXRlbSgpW2NvbmZpZ1RlbXBsYXRlR3JvdXAuZmllbGRHZXRJdGVtc10/Lmxlbmd0aCAmJiAhKChjb25maWdUZW1wbGF0ZUdyb3VwLmlzVmlld1RyZWUgfHwgY29uZmlnVGVtcGxhdGVHcm91cC53aWR0aExhYmVsU3ViMjRXaGVuTm90VHJlZVZpZXcpICYmIChjb25maWdUZW1wbGF0ZUdyb3VwLmljb25FeHBhbmQgPT09ICdsZWZ0JyB8fCBjb25maWdUZW1wbGF0ZUdyb3VwLmljb25FeHBhbmQgPT09ICdyaWdodCcgJiYgKCFjb25maWdUZW1wbGF0ZUdyb3VwLnNlYXJjaEFsbExldmVsIHx8ICEhaXRlbSgpW2NvbmZpZ1RlbXBsYXRlR3JvdXAuZmllbGRHZXRJdGVtc10/Lmxlbmd0aCkpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubWF4LXctW2NhbGMoMTAwJS0yNHB4KV1dPVwiKGNvbmZpZ1RlbXBsYXRlR3JvdXAuaXNWaWV3VHJlZSB8fCBjb25maWdUZW1wbGF0ZUdyb3VwLndpZHRoTGFiZWxTdWIyNFdoZW5Ob3RUcmVlVmlldykgJiYgKGNvbmZpZ1RlbXBsYXRlR3JvdXAuaWNvbkV4cGFuZCA9PT0gJ2xlZnQnIHx8IGNvbmZpZ1RlbXBsYXRlR3JvdXAuaWNvbkV4cGFuZCA9PT0gJ3JpZ2h0JyAmJiAoIWNvbmZpZ1RlbXBsYXRlR3JvdXAuc2VhcmNoQWxsTGV2ZWwgfHwgISFpdGVtKClbY29uZmlnVGVtcGxhdGVHcm91cC5maWVsZEdldEl0ZW1zXT8ubGVuZ3RoKSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIml0ZW0oKS5maWVsZExhYmVsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwb3BvdmVyXT1cIml0ZW0oKS5kYXRhUG9wb3ZlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbekluZGV4TGFiZWxdPVwiY29uZmlnVGVtcGxhdGVHcm91cC56SW5kZXhMYWJlbCA/PyB6SW5kZXgoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbGlua0ltYWdlXT1cImNvbmZpZ1RlbXBsYXRlR3JvdXAuZ2V0SW1hZ2UgPyAoKCdhdmF0YXInIHwgTGlic1VpUGlwZXNDYWxsRnVuY3Rpb25JblRlbXBsYXRlUGlwZTooaXRlbSgpLnNwZWNpZmljX2xvYWRJbWdFcnJvciAmJiBjb25maWdUZW1wbGF0ZUdyb3VwLmdldExpbmtJbWFnZUVycm9yID8gY29uZmlnVGVtcGxhdGVHcm91cC5nZXRMaW5rSW1hZ2VFcnJvciA6IGNvbmZpZ1RlbXBsYXRlR3JvdXAuZ2V0SW1hZ2UpOml0ZW0oKSkgfCBhc3luYykgOiBpdGVtKClbY29uZmlnVGVtcGxhdGVHcm91cC5maWVsZEdldEF2YXRhckl0ZW0gfHwgJyddXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpbWdUeXBlSWNvbl09XCJjb25maWdUZW1wbGF0ZUdyb3VwLmltZ1R5cGVJY29uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc0xhYmVsSW5jbHVkZV09XCIoY29uZmlnVGVtcGxhdGVHcm91cC5jbGFzc0xhYmVsSXRlbSA/IGNvbmZpZ1RlbXBsYXRlR3JvdXAuY2xhc3NMYWJlbEl0ZW0gOiAoY29uZmlnVGVtcGxhdGVHcm91cC5pc1ZpZXdUcmVlID8gJyBtby1saWItZm9udC1oZWFkLTYgJzonIG1vLWxpYi1mb250LWhlYWQtNnMgJykpICsgKChjb25maWdUZW1wbGF0ZUdyb3VwLmlnbm9yZVRleHRVcHBlcmNhc2VMYWJlbEdyb3VwIHx8IGNvbmZpZ1RlbXBsYXRlR3JvdXAuaXNWaWV3VHJlZSkgPyAnJzonIHRleHQtdXBwZXJjYXNlICcpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlXT1cImRpc2FibGUoKSB8fCAoaXRlbSgpW2ZpZWxkS2V5KCldIHwgTGlic1VpQ2hlY2tTZWxlY3RlZEJ5S2V5UGlwZTprZXlzRGlzYWJsZUl0ZW0oKTprZXlzRGlzYWJsZUl0ZW0oKT8ubGVuZ3RoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJpdGVtKClbZmllbGRLZXkoKV0gfCBMaWJzVWlDaGVja1NlbGVjdGVkQnlLZXlQaXBlOmtleXNDaGVja2VkKCk6a2V5c0NoZWNrZWQoKS5sZW5ndGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3N0aWxsT3RoZXJPcHRpb25zXT1cIml0ZW0oKVtmaWVsZEtleSgpXSB8IExpYnNVaUNoZWNrU2VsZWN0ZWRCeUtleVBpcGU6a2V5c1N0aWxsT3RoZXJPcHRpb25zKCk6a2V5c1N0aWxsT3RoZXJPcHRpb25zKCkubGVuZ3RoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChvdXRDaGFuZ2UpPVwiaGFuZGxlckNoYW5nZUNoZWNrZWQoJGV2ZW50LmNoZWNrZWQsaXRlbSgpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAob3V0Q2hhbmdTdGFnZUZsYWdNb3VzZVBvcG92ZXIpPSdoYW5kbGVyQ2hhbmdTdGFnZUZsYWdNb3VzZSgkZXZlbnQpJ1xuICAgICAgICAgICAgICAgICAgICAgICAgKG91dENsaWNrTGFiZWwpPVwiaGFuZGxlclRvZ2dsZUV4cGFuZCgnY2xpY2tMYWJlbCcsaXRlbSgpLGNvbmZpZ1RlbXBsYXRlR3JvdXAuaWdub3JlQ2hlY2tib3hHcm91cCB8fCBjb25maWdUZW1wbGF0ZUdyb3VwLnNpbmdsZVNlbGVjdEl0ZW0pXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIEBpZiAoY29uZmlnVGVtcGxhdGVHcm91cC5pc1ZpZXdSYWRpbykge1xuICAgICAgICAgICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtcmFkaW8tc2luZ2xlIFtjbGFzcy5tbC1bOHB4XV09XCJjb25maWdUZW1wbGF0ZUdyb3VwLmljb25FeHBhbmQgPT09ICdsZWZ0JyB8fCBjb25maWdUZW1wbGF0ZUdyb3VwLmlzVmlld1RyZWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F2YXRhckNvbmZpZ109XCJpdGVtKCkuYXZhdGFyQ29uZmlnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpZ25vcmVSYWRpb109XCJjb25maWdUZW1wbGF0ZUdyb3VwLmlnbm9yZVJhZGlvR3JvdXAgfHwgY29uZmlnVGVtcGxhdGVHcm91cC5zaW5nbGVTZWxlY3RJdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJjb25maWdUZW1wbGF0ZUdyb3VwLmNsYXNzSW5jbHVkZUl0ZW0gfHwgJydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnctYXV0b109XCJjb25maWdUZW1wbGF0ZUdyb3VwLmlzVmlld1RyZWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnctZnVsbF09XCIhaXRlbSgpW2NvbmZpZ1RlbXBsYXRlR3JvdXAuZmllbGRHZXRJdGVtc10/Lmxlbmd0aCAmJiAhKChjb25maWdUZW1wbGF0ZUdyb3VwLmlzVmlld1RyZWUgfHwgY29uZmlnVGVtcGxhdGVHcm91cC53aWR0aExhYmVsU3ViMjRXaGVuTm90VHJlZVZpZXcpICYmIChjb25maWdUZW1wbGF0ZUdyb3VwLmljb25FeHBhbmQgPT09ICdsZWZ0JyB8fCBjb25maWdUZW1wbGF0ZUdyb3VwLmljb25FeHBhbmQgPT09ICdyaWdodCcgJiYgKCFjb25maWdUZW1wbGF0ZUdyb3VwLnNlYXJjaEFsbExldmVsIHx8ICEhaXRlbSgpW2NvbmZpZ1RlbXBsYXRlR3JvdXAuZmllbGRHZXRJdGVtc10/Lmxlbmd0aCkpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubWF4LXctW2NhbGMoMTAwJS0yNHB4KV1dPVwiKGNvbmZpZ1RlbXBsYXRlR3JvdXAuaXNWaWV3VHJlZSB8fCBjb25maWdUZW1wbGF0ZUdyb3VwLndpZHRoTGFiZWxTdWIyNFdoZW5Ob3RUcmVlVmlldykgJiYgKGNvbmZpZ1RlbXBsYXRlR3JvdXAuaWNvbkV4cGFuZCA9PT0gJ2xlZnQnIHx8IGNvbmZpZ1RlbXBsYXRlR3JvdXAuaWNvbkV4cGFuZCA9PT0gJ3JpZ2h0JyAmJiAoIWNvbmZpZ1RlbXBsYXRlR3JvdXAuc2VhcmNoQWxsTGV2ZWwgfHwgISFpdGVtKClbY29uZmlnVGVtcGxhdGVHcm91cC5maWVsZEdldEl0ZW1zXT8ubGVuZ3RoKSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIml0ZW0oKS5maWVsZExhYmVsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwb3BvdmVyXT1cIml0ZW0oKS5kYXRhUG9wb3ZlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbekluZGV4TGFiZWxdPVwiY29uZmlnVGVtcGxhdGVHcm91cC56SW5kZXhMYWJlbCA/PyB6SW5kZXgoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaW1nVHlwZUljb25dPVwiY29uZmlnVGVtcGxhdGVHcm91cC5pbWdUeXBlSWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbGlua0ltYWdlXT1cImNvbmZpZ1RlbXBsYXRlR3JvdXAuZ2V0SW1hZ2UgPyAoKCdhdmF0YXInIHwgTGlic1VpUGlwZXNDYWxsRnVuY3Rpb25JblRlbXBsYXRlUGlwZTooaXRlbSgpLnNwZWNpZmljX2xvYWRJbWdFcnJvciAmJiBjb25maWdUZW1wbGF0ZUdyb3VwLmdldExpbmtJbWFnZUVycm9yID8gY29uZmlnVGVtcGxhdGVHcm91cC5nZXRMaW5rSW1hZ2VFcnJvciA6IGNvbmZpZ1RlbXBsYXRlR3JvdXAuZ2V0SW1hZ2UpOml0ZW0oKSkgfCBhc3luYykgOiBpdGVtKClbY29uZmlnVGVtcGxhdGVHcm91cC5maWVsZEdldEF2YXRhckl0ZW0gfHwgJyddXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc0xhYmVsSW5jbHVkZV09XCIoY29uZmlnVGVtcGxhdGVHcm91cC5jbGFzc0xhYmVsSXRlbSA/IGNvbmZpZ1RlbXBsYXRlR3JvdXAuY2xhc3NMYWJlbEl0ZW0gOiAnbGlicy11aS1mb250LWg2cyAnKSArIChjb25maWdUZW1wbGF0ZUdyb3VwLmlnbm9yZVRleHRVcHBlcmNhc2VMYWJlbEdyb3VwID8gJyc6JyB1cHBlcmNhc2UnKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZV09XCJkaXNhYmxlKCkgfHwgKGNvbmZpZ1RlbXBsYXRlR3JvdXAuZGlzYWJsZUl0ZW1Ob3RMYXN0TGV2ZWwgJiYgISFpdGVtKClbY29uZmlnVGVtcGxhdGVHcm91cC5maWVsZEdldEl0ZW1zXT8ubGVuZ3RoKSB8fCBjb25maWdUZW1wbGF0ZUdyb3VwLmlnbm9yZUNoZWNrYm94R3JvdXAgfHwgY29uZmlnVGVtcGxhdGVHcm91cC5zaW5nbGVTZWxlY3RJdGVtIHx8IChpdGVtKClbZmllbGRLZXkoKV0gfCBMaWJzVWlDaGVja1NlbGVjdGVkQnlLZXlQaXBlOmtleXNEaXNhYmxlSXRlbSgpOmtleXNEaXNhYmxlSXRlbSgpPy5sZW5ndGgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthY3RpdmVdPVwiaXRlbSgpW2ZpZWxkS2V5KCldIHwgTGlic1VpQ2hlY2tTZWxlY3RlZEJ5S2V5UGlwZTprZXlzQ2hlY2tlZCgpOmtleXNDaGVja2VkKCkubGVuZ3RoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChvdXRDaGFuZ2UpPVwiaGFuZGxlckNoYW5nZUNoZWNrZWQoJGV2ZW50LmFjdGl2ZSxpdGVtKCkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChvdXRDaGFuZ1N0YWdlRmxhZ01vdXNlUG9wb3Zlcik9J2hhbmRsZXJDaGFuZ1N0YWdlRmxhZ01vdXNlKCRldmVudCknXG4gICAgICAgICAgICAgICAgICAgICAgICAob3V0Q2xpY2tMYWJlbCk9XCJoYW5kbGVyVG9nZ2xlRXhwYW5kKCdjbGlja0xhYmVsJyxpdGVtKCksY29uZmlnVGVtcGxhdGVHcm91cC5pZ25vcmVSYWRpb0dyb3VwIHx8IGNvbmZpZ1RlbXBsYXRlR3JvdXAuc2luZ2xlU2VsZWN0SXRlbSlcIiAvPlxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgQGlmIChpdGVtKCkuYnV0dG9uSW5Hcm91cDsgYXMgYnV0dG9uSW5Hcm91cCkge1xuICAgICAgICAgICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b24gW3R5cGVdPVwiYnV0dG9uSW5Hcm91cC50eXBlIHx8ICdidXR0b24tbGluay1wcmltYXJ5J1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiYnV0dG9uSW5Hcm91cC5sYWJlbCB8fCAnICdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzSWNvbkxlZnRdPVwiKGJ1dHRvbkluR3JvdXAuY2xhc3NJY29uTGVmdCB8fCAnJykrJyBmbGV4IG1yLVs4cHhdICF0ZXh0LVs4cHhdJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cImJ1dHRvbkluR3JvdXAuY2xhc3NJbmNsdWRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc0xhYmVsXT1cImJ1dHRvbkluR3JvdXAuY2xhc3NMYWJlbCB8fCAnbGlicy11aS1mb250LWg1cidcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVdPVwiYnV0dG9uSW5Hcm91cC5kaXNhYmxlIHx8IGRpc2FibGUoKSB8fCBmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAob3V0Q2xpY2spPVwiaGFuZGxlckNsaWNrQnV0dG9uR3JvdXAoYnV0dG9uSW5Hcm91cCxpdGVtKCkpXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgIEBpZiAoY29uZmlnVGVtcGxhdGVHcm91cC5pY29uRXhwYW5kID09PSAncmlnaHQnICYmICFjb25maWdUZW1wbGF0ZUdyb3VwLmlzVmlld1RyZWUgJiYgKCFjb25maWdUZW1wbGF0ZUdyb3VwLnNlYXJjaEFsbExldmVsIHx8ICEhaXRlbSgpW2NvbmZpZ1RlbXBsYXRlR3JvdXAuZmllbGRHZXRJdGVtc10/Lmxlbmd0aCkpIHtcbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBjdXJzb3ItcG9pbnRlciBtci1bMTZweF0gbGlicy11aS1pY29uLWNoZXZyb24tcmlnaHRcIlxuICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5tbC1bOHB4XV09XCJpdGVtKCkuZGF0YVBvcG92ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5yb3RhdGUtOTBdPVwiaXRlbSgpLmV4cGFuZFwiXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImhhbmRsZXJUb2dnbGVFeHBhbmQoJGV2ZW50LGl0ZW0pXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvaT5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICBAaWYgKGl0ZW0oKS5leHBhbmQgJiYgY2FsY3VsYXRvckhlaWdoSXRlbVN1Y2Nlc3MoKSkge1xuICAgICAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1saXN0LXRlbXBsYXRlc19ncm91cC1pdGVtIFtrZXlTZWFyY2hdPVwia2V5U2VhcmNoKClcIlxuICAgICAgICAgICAgICAgICAgICBbaXRlbXNdPVwiaXRlbSgpW2NvbmZpZ1RlbXBsYXRlR3JvdXAuZmllbGRHZXRJdGVtc11cIlxuICAgICAgICAgICAgICAgICAgICBbcGFyZW50SXRlbV09XCJpdGVtKClcIlxuICAgICAgICAgICAgICAgICAgICBbZmllbGRLZXldPVwiZmllbGRLZXkoKVwiXG4gICAgICAgICAgICAgICAgICAgIFtrZXlzQ2hlY2tlZF09XCJrZXlzQ2hlY2tlZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVdPVwiZGlzYWJsZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgW2tleXNEaXNhYmxlSXRlbV09XCJrZXlzRGlzYWJsZUl0ZW0oKSB8fCBbXVwiXG4gICAgICAgICAgICAgICAgICAgIFtjb25maWdUZW1wbGF0ZUdyb3VwXT1cImNvbmZpZ1RlbXBsYXRlR3JvdXBcIlxuICAgICAgICAgICAgICAgICAgICBbY29uZmlnXT1cImNvbmZpZygpXCJcbiAgICAgICAgICAgICAgICAgICAgW2tleXNTdGlsbE90aGVyT3B0aW9uc109XCJrZXlzU3RpbGxPdGhlck9wdGlvbnMoKVwiXG4gICAgICAgICAgICAgICAgICAgIChvdXRDaGFuZ2VWaWV3KT1cImhhbmRsZXJDaGFuZ2VWaWV3KClcIlxuICAgICAgICAgICAgICAgICAgICAob3V0Q2hhbmdTdGFnZUZsYWdNb3VzZVRvb2x0aXApPSdoYW5kbGVyQ2hhbmdTdGFnZUZsYWdNb3VzZSgkZXZlbnQpJ1xuICAgICAgICAgICAgICAgICAgICAob3V0Q2hhbmdlKT1cImhhbmRsZXJDaGFuZ2VJdGVtQ2hlY2tlZCgkZXZlbnQuaXRlbSlcIiAvPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBAaWYgKCFsYXN0ICYmICFjb25maWdUZW1wbGF0ZUdyb3VwLmlnbm9yZUdyb3VwTGluZSAmJiBjYWxjdWxhdG9ySGVpZ2hJdGVtU3VjY2VzcygpKSB7XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGlicy11aS1saXN0LWdyb3VwLWxpbmVcIlxuICAgICAgICAgICAgICAgICAgICBbc3R5bGUubWFyZ2luVG9wLnB4XT1cIiFjb25maWdUZW1wbGF0ZUdyb3VwLmlnbm9yZUdyb3VwTGluZSA/IGNvbmZpZ1RlbXBsYXRlR3JvdXAubWFyZ2luVG9wSGFzTGluZSB8fCA0IDogMFwiPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgICBAaWYgKCFpdGVtcygpIHx8ICFpdGVtcygpLmxlbmd0aCkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwibGlicy11aS1mb250LWg1ciB0ZXh0LVsjYzFjMWMxXSByZWxhdGl2ZSB7eyBjb25maWdUZW1wbGF0ZUdyb3VwLmNsYXNzSW5jbHVkZU5vZGF0YT9jb25maWdUZW1wbGF0ZUdyb3VwLmNsYXNzSW5jbHVkZU5vZGF0YTonJyB9fVwiXG4gICAgICAgICAgW3N0eWxlLm1hcmdpbkxlZnQucHhdPVwiMCB8IExpYnNVaUNvbXBvbmVudHNMaXN0R3JvdXBDYWxjdWxhdG9yTWFyZ2luTGVmdEl0ZW1QaXBlOjI6KGNvbmZpZ1RlbXBsYXRlR3JvdXAuaXNWaWV3VHJlZSB8fCBjb25maWdUZW1wbGF0ZUdyb3VwLmljb25FeHBhbmQgPT09ICdsZWZ0Jyk6Y29uZmlnVGVtcGxhdGVHcm91cC5pc1ZpZXdUcmVlSnNvbjohKGNvbmZpZ1RlbXBsYXRlR3JvdXAuaWdub3JlQ2hlY2tib3hJdGVtIHx8IGNvbmZpZ1RlbXBsYXRlR3JvdXAuaWdub3JlUmFkaW9JdGVtIHx8IGNvbmZpZ1RlbXBsYXRlR3JvdXAuc2luZ2xlU2VsZWN0SXRlbSk6dHJ1ZVwiXG4gICAgICAgICAgW2NsYXNzLnB5LVs4cHhdXT1cImNvbmZpZ1RlbXBsYXRlR3JvdXAuZmllbGRHZXRBdmF0YXJJdGVtXCJcbiAgICAgICAgICBbY2xhc3MucHktWzRweF1dPVwiIWNvbmZpZ1RlbXBsYXRlR3JvdXAuZmllbGRHZXRBdmF0YXJJdGVtXCI+XG4gICAgICAgICAgQGlmICgha2V5U2VhcmNoKCkgJiYgIWxvYWRpbmcoKSkge1xuICAgICAgICAgICAgPGRpdj57eyAoY29uZmlnKCk/LnRleHROb0RhdGEgPz8gJ2kxOG5fbm9fZGF0YV95ZXQnKSB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuICAgICAgICAgIH1cbiAgICAgICAgICBAaWYgKGtleVNlYXJjaCgpICYmICFsb2FkaW5nKCkpIHtcbiAgICAgICAgICAgIDxkaXY+e3sgKGNvbmZpZygpPy50ZXh0U2VhcmNoTm9EYXRhID8/J2kxOG5fbm9fcmVzdWx0JykgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgICAgQGlmIChsb2FkaW5nKCkpIHtcbiAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1zcGlubmVyIFtzaXplXT1cIidtZWRpdW0nXCIgLz5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG59XG4iXX0=
|