@libs-ui/components-dropdown 0.2.52

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.
@@ -0,0 +1,455 @@
1
+ import { AsyncPipe } from '@angular/common';
2
+ import { ChangeDetectionStrategy, Component, computed, effect, inject, input, model, output, signal, untracked } from '@angular/core';
3
+ import { LibsUiComponentsAvatarComponent } from '@libs-ui/components-avatar';
4
+ import { LibsUiComponentsLabelComponent } from '@libs-ui/components-label';
5
+ import { getFieldKeyByType, LibsUiComponentsListComponent } from '@libs-ui/components-list';
6
+ import { LibsUiComponentsPopoverComponent } from '@libs-ui/components-popover';
7
+ import { LibsUiPipesSecurityTrustPipe } from '@libs-ui/pipes-security-trust';
8
+ import { LibsUiHttpRequestService } from '@libs-ui/services-http-request';
9
+ import { CHARACTER_DATA_EMPTY, cloneDeep, ERROR_MESSAGE_EMPTY_VALID, ERROR_MESSAGE_MAX_VALID, get, isNil, set } from '@libs-ui/utils';
10
+ import { TranslateModule, TranslateService } from '@ngx-translate/core';
11
+ import { LibsUiComponentsDropdownTabsComponent } from './tabs/tabs.component';
12
+ import * as i0 from "@angular/core";
13
+ import * as i1 from "@ngx-translate/core";
14
+ export class LibsUiComponentsDropdownComponent {
15
+ /* PROPERTY */
16
+ error = signal(undefined);
17
+ showList = signal(false);
18
+ itemsSelected = signal(undefined);
19
+ loadingDetail = signal(false);
20
+ loadingList = signal(false);
21
+ items = signal([]);
22
+ fieldLabel = signal('labelDisplay');
23
+ popoverItemSelected = signal(undefined);
24
+ labelItemSelectedComputed = computed(this.getLabelItemSelected.bind(this));
25
+ keysSelected = signal([]);
26
+ popoverFunctionControl = signal(undefined);
27
+ fieldKey = signal('id');
28
+ listFunctionControl = signal(undefined);
29
+ selectedKeyByInput = signal(false);
30
+ /* INPUT */
31
+ useXssFilter = input(false);
32
+ popoverElementRefCustom = input();
33
+ classInclude = input();
34
+ ignoreStopPropagationEvent = input(false);
35
+ flagMouse = model({ isMouseEnter: false, isMouseEnterContent: false });
36
+ flagMouseContent = model();
37
+ popoverCustomConfig = input();
38
+ isNgContent = input();
39
+ zIndex = input();
40
+ convertItemSelected = input(this.defaultConvertItemSelected.bind(this));
41
+ getPopoverItemSelected = input();
42
+ httpRequestDetailItemById = input();
43
+ lengthKeys = model(0);
44
+ textDisplayWhenNoSelect = input('i18n_select_value');
45
+ textDisplayWhenMultiSelect = input('i18n_selecting_options');
46
+ classIncludeTextDisplayWhenNoSelect = input('libs-ui-font-h5r');
47
+ fieldGetLabel = input();
48
+ labelPopoverConfig = input();
49
+ labelPopoverFullWidth = input(true);
50
+ hasContentUnitRight = input();
51
+ listSearchNoDataTemplateRef = input();
52
+ fieldGetImage = input();
53
+ imageSize = input(16);
54
+ typeShape = input('circle');
55
+ fieldGetIcon = input();
56
+ fieldGetTextAvatar = input('username');
57
+ fieldGetColorAvatar = input();
58
+ classAvatarInclude = input('mr-[8px]', { transform: value => value || 'mr-[8px]' });
59
+ getLastTextAfterSpace = input();
60
+ linkImageError = input();
61
+ showError = input(true);
62
+ showBorderError = model();
63
+ disable = input();
64
+ readonly = input();
65
+ labelConfig = input();
66
+ listSearchConfig = input();
67
+ listHiddenInputSearch = input();
68
+ listSearchPadding = input();
69
+ listKeySearch = input();
70
+ listDividerClassInclude = input();
71
+ listConfig = input();
72
+ listButtonsOther = input();
73
+ listHasButtonUnSelectOption = input();
74
+ listClickExactly = input();
75
+ listBackgroundCustom = input();
76
+ listMaxItemShow = input(6);
77
+ listKeySelected = model();
78
+ listMultiKeySelected = model();
79
+ listKeysDisable = input(); // không dùng giá trị này kết hợp với template checkbox có config chứa configCheckboxCheckAll
80
+ listKeysHidden = input(); // không dùng giá trị này kết hợp với template checkbox có config chứa configCheckboxCheckAll
81
+ validRequired = input();
82
+ validMaxItemSelected = input();
83
+ changeValidUndefinedResetError = input();
84
+ allowSelectItemMultiple = input();
85
+ listViewFunctionCustomAddDataToStore = input();
86
+ focusInputSearch = input(true);
87
+ onlyEmitDataWhenReset = input(); // true khi muốn emit sự kiện thay đổi key
88
+ resetKeyWhenSelectAllKey = input();
89
+ listConfigHasDivider = input(true);
90
+ classIncludeIcon = input('ml-[8px]', { transform: value => value || 'ml-[8px]' });
91
+ classIncludeContent = input();
92
+ listIgnoreClassDisableDefaultWhenUseKeysDisableItem = input(); // bỏ chế độ disable item trên html list view để disable từng phần trong rows
93
+ tabKeyActive = model();
94
+ tabsConfig = input();
95
+ ignoreBorderBottom = input();
96
+ /* OUTPUT */
97
+ outSelectKey = output(); // sử dụng cho type chọn 1.
98
+ outSelectMultiKey = output(); // sử dụng cho type cho phép chọn nhiều.
99
+ outFunctionsControl = output();
100
+ outValidEvent = output();
101
+ outChangStageFlagMouse = output();
102
+ outDataChange = output();
103
+ outClickButtonOther = output();
104
+ outShowList = output();
105
+ outChangeTabKeyActive = output();
106
+ /* INJECT*/
107
+ translate = inject(TranslateService);
108
+ httpRequestService = inject(LibsUiHttpRequestService);
109
+ constructor() {
110
+ effect(() => {
111
+ const listConfig = this.listConfig();
112
+ if (listConfig) {
113
+ untracked(() => this.fieldKey.set(getFieldKeyByType(listConfig, 'id')));
114
+ }
115
+ });
116
+ effect(() => {
117
+ if (this.listKeySelected() && !this.itemsSelected()) {
118
+ untracked(() => {
119
+ this.selectedKeyByInput.set(true);
120
+ this.handlerSelectedKey({ key: this.listKeySelected(), item: undefined, isClickManual: false });
121
+ });
122
+ }
123
+ });
124
+ effect(() => {
125
+ if (this.changeValidUndefinedResetError() && this.validRequired()) {
126
+ untracked(() => this.resetError());
127
+ }
128
+ });
129
+ effect(() => {
130
+ if (this.listMultiKeySelected()) {
131
+ untracked(() => {
132
+ const previousValue = this.keysSelected() || [];
133
+ const currentValue = this.listMultiKeySelected() || [];
134
+ if (previousValue.length !== currentValue.length) {
135
+ this.handlerSelectMultiKey({ keys: currentValue, mapKeys: [], isClickManual: false });
136
+ return;
137
+ }
138
+ for (const keyPrevious of previousValue) {
139
+ if (!currentValue.some(keyCurrent => keyCurrent === keyPrevious)) {
140
+ this.handlerSelectMultiKey({ keys: currentValue, mapKeys: [], isClickManual: false });
141
+ break;
142
+ }
143
+ }
144
+ });
145
+ }
146
+ });
147
+ }
148
+ async ngOnInit() {
149
+ const listConfig = this.listConfig();
150
+ if (!this.lengthKeys() && listConfig && (listConfig.autoSelectFirstItem || listConfig.configTemplateCheckbox?.autoSelectAllItem || listConfig.configTemplateGroup?.flatItemsSupportAutoSelect) && listConfig.httpRequestData) {
151
+ try {
152
+ this.loadingDetail.set(true);
153
+ const httpRequestData = listConfig.httpRequestData;
154
+ const { argumentsValue, guideAutoUpdateArgumentsValue } = httpRequestData;
155
+ this.httpRequestService.updateArguments(argumentsValue, { ...this.httpRequestService.fakeResponsePagingApi(), dropdownTabKeyActive: this.tabKeyActive }, {}, '', true, false, guideAutoUpdateArgumentsValue);
156
+ const result = await this.httpRequestService.callApi(httpRequestData);
157
+ this.loadingDetail.set(false);
158
+ if (result?.data) {
159
+ this.items.set(result.data);
160
+ this.emitAutoSelectKey(result.data, listConfig.type);
161
+ }
162
+ }
163
+ catch (error) {
164
+ console.log(error);
165
+ this.items.set([]);
166
+ this.loadingDetail.set(false);
167
+ }
168
+ this.outDataChange.emit(this.items());
169
+ }
170
+ this.outFunctionsControl.emit({
171
+ reset: this.reset.bind(this),
172
+ valid: this.valid.bind(this),
173
+ resetError: this.resetError.bind(this),
174
+ setMessageError: this.setMessageError.bind(this),
175
+ removeList: async () => this.popoverFunctionControl()?.removePopoverOverlay(),
176
+ getDisable: async () => this.disable() ?? false,
177
+ updateLabelItemSelected: async (label) => this.itemsSelected.update(value => ({ ...value, [this.fieldLabel()]: this.translate.instant(label) })),
178
+ refreshList: async () => this.listFunctionControl()?.refresh(),
179
+ setItemSelectedByKey: this.setItemSelectedByKey.bind(this)
180
+ });
181
+ this.checkValid(true);
182
+ }
183
+ /* FUNCTIONS */
184
+ defaultConvertItemSelected(item) {
185
+ if (!item) {
186
+ return;
187
+ }
188
+ const fieldGetLabel = this.fieldGetLabel();
189
+ const value = fieldGetLabel ? get(item, fieldGetLabel) : undefined;
190
+ set(item, this.fieldLabel(), value ?? item.label ?? item.name ?? ' ');
191
+ }
192
+ getLabelItemSelected() {
193
+ let label = ' ';
194
+ if (!this.lengthKeys()) {
195
+ label = this.textDisplayWhenNoSelect();
196
+ }
197
+ if (this.lengthKeys() > 1) {
198
+ label = this.textDisplayWhenMultiSelect();
199
+ }
200
+ if (this.lengthKeys() === 1) {
201
+ label = this.itemsSelected()[this.fieldLabel()] || this.textDisplayWhenNoSelect();
202
+ }
203
+ return label;
204
+ }
205
+ emitAutoSelectKey(items, type) {
206
+ const listConfig = this.listConfig();
207
+ if (!items || !items.length || !listConfig || (!listConfig.autoSelectFirstItem && !listConfig.configTemplateCheckbox?.autoSelectAllItem && !listConfig.configTemplateGroup?.flatItemsSupportAutoSelect)) {
208
+ return;
209
+ }
210
+ const flatItemsSupportAutoSelect = listConfig.configTemplateGroup?.flatItemsSupportAutoSelect;
211
+ if (type === 'group' && flatItemsSupportAutoSelect) {
212
+ items = flatItemsSupportAutoSelect(items);
213
+ }
214
+ if (listConfig.autoSelectFirstItem) {
215
+ const item = items[0];
216
+ const key = item[this.fieldKey()];
217
+ if (type === 'radio' || type === 'text') {
218
+ this.handlerSelectedKey({ key, item, isClickManual: false });
219
+ this.listKeySelected.set(key);
220
+ return;
221
+ }
222
+ this.handlerSelectMultiKey({ keys: [key], mapKeys: [{ key, item, isClickManual: false }], isClickManual: false });
223
+ this.listMultiKeySelected.set([key]);
224
+ }
225
+ if (type !== 'checkbox' && type !== 'group') {
226
+ return;
227
+ }
228
+ const keys = [];
229
+ const mapKeys = [];
230
+ items.forEach(item => {
231
+ const key = item[this.fieldKey()];
232
+ if (isNil(key)) {
233
+ return;
234
+ }
235
+ keys.push(key);
236
+ mapKeys.push({ key, item, isClickManual: false });
237
+ });
238
+ this.handlerSelectMultiKey({ keys, mapKeys, isClickManual: false });
239
+ this.listMultiKeySelected.set(keys);
240
+ }
241
+ handlerEvent(type) {
242
+ if (type === 'click') {
243
+ return;
244
+ }
245
+ if (type === 'remove') {
246
+ this.showList.set(false);
247
+ this.outShowList.emit(this.showList());
248
+ return;
249
+ }
250
+ this.showList.set(true);
251
+ this.outShowList.emit(this.showList());
252
+ }
253
+ handlerDataChange(items) {
254
+ this.items.set(items);
255
+ this.popoverFunctionControl()?.updatePopoverOverlayPosition();
256
+ this.outDataChange.emit(this.items());
257
+ }
258
+ handlerChangeFlagMouse(event) {
259
+ this.flagMouseContent.set(event);
260
+ this.mergeFlagMouse();
261
+ }
262
+ handlerClickButtonOther(button) {
263
+ this.outClickButtonOther.emit(button);
264
+ this.popoverFunctionControl()?.removePopoverOverlay();
265
+ }
266
+ handlerPopoverControlEvent(event) {
267
+ this.popoverFunctionControl.set(event);
268
+ }
269
+ async handlerSelectedKey(event, eventFromList = false) {
270
+ const key = event?.key;
271
+ const item = event?.item;
272
+ this.lengthKeys.set(!(isNil(key) || (typeof key === 'string' && key === '')) ? 1 : 0);
273
+ this.listKeySelected.set(key);
274
+ if (!this.allowSelectItemMultiple() && this.itemsSelected() && this.itemsSelected()[this.fieldKey()] === key) {
275
+ this.selectedKeyByInput.set(false);
276
+ return;
277
+ }
278
+ if (!this.selectedKeyByInput()) {
279
+ if (!(isNil(key) || (typeof key === 'string' && key === '')) && (item || this.itemsSelected())) {
280
+ this.popoverFunctionControl()?.removePopoverOverlay();
281
+ }
282
+ }
283
+ if (eventFromList) {
284
+ this.selectedKeyByInput.set(false);
285
+ }
286
+ this.checkValid();
287
+ if (this.lengthKeys() && !item && this.httpRequestDetailItemById()) {
288
+ let itemSelected = await this.setItemSelectedByKey(key);
289
+ if (!itemSelected) {
290
+ itemSelected = {
291
+ [this.fieldKey()]: key,
292
+ [this.fieldLabel()]: CHARACTER_DATA_EMPTY
293
+ };
294
+ this.itemsSelected.set(itemSelected);
295
+ }
296
+ if (event) {
297
+ event.item = itemSelected;
298
+ }
299
+ this.outSelectKey.emit({ ...event, tabKeyActive: this.tabKeyActive() });
300
+ return;
301
+ }
302
+ this.itemsSelected.set(cloneDeep(item));
303
+ this.buildDisplay();
304
+ this.outSelectKey.emit({ ...event, tabKeyActive: this.tabKeyActive() });
305
+ }
306
+ async handlerSelectMultiKey(event, isClickManual = false) {
307
+ if (this.listConfig()?.configTemplateGroup?.singleSelectItem && event?.mapKeys?.length) {
308
+ const itemClickManual = event.mapKeys.find(mapKey => mapKey.item && mapKey.item.isCheckManual);
309
+ if (itemClickManual) {
310
+ setTimeout(() => itemClickManual.item.isCheckManual = false);
311
+ event.keys = [itemClickManual.key];
312
+ event.mapKeys = [itemClickManual];
313
+ this.popoverFunctionControl()?.removePopoverOverlay();
314
+ }
315
+ }
316
+ this.keysSelected.set([...(event?.keys || [])]);
317
+ this.listMultiKeySelected.set([...(event?.keys || [])]);
318
+ this.lengthKeys.set(event?.keys?.length || 0);
319
+ this.checkValid();
320
+ if (this.lengthKeys() > 1) {
321
+ this.outSelectMultiKey.emit({ ...(event || {}), isClickManual, tabKeyActive: this.tabKeyActive() });
322
+ return;
323
+ }
324
+ const key = event?.keys[0];
325
+ let item = event?.mapKeys?.find(item => item.key === key)?.item;
326
+ if (this.lengthKeys() && !item && this.httpRequestDetailItemById()) {
327
+ item = await this.setItemSelectedByKey(key);
328
+ this.outSelectMultiKey.emit({ keys: [key], mapKeys: [{ key, item }], isClickManual, tabKeyActive: this.tabKeyActive() });
329
+ return;
330
+ }
331
+ this.itemsSelected.set(cloneDeep(item));
332
+ this.buildDisplay();
333
+ this.outSelectMultiKey.emit({ ...(event || {}), isClickManual, tabKeyActive: this.tabKeyActive() });
334
+ }
335
+ async setItemSelectedByKey(key) {
336
+ console.log(key);
337
+ const httpRequestDetailItemById = this.httpRequestDetailItemById();
338
+ if (!httpRequestDetailItemById || this.loadingDetail()) {
339
+ return;
340
+ }
341
+ try {
342
+ this.loadingDetail.set(true);
343
+ const { argumentsValue, guideAutoUpdateArgumentsValue } = httpRequestDetailItemById;
344
+ this.httpRequestService.updateArguments(argumentsValue, { key, dropdownTabKeyActive: this.tabKeyActive() }, {}, '', false, false, guideAutoUpdateArgumentsValue);
345
+ console.log(httpRequestDetailItemById);
346
+ const result = await this.httpRequestService.callApi(httpRequestDetailItemById);
347
+ const item = cloneDeep(result.data[0] || result.data);
348
+ this.itemsSelected.set(item);
349
+ this.buildDisplay();
350
+ this.loadingDetail.set(false);
351
+ return item;
352
+ }
353
+ catch (error) {
354
+ console.log(error);
355
+ this.loadingDetail.set(false);
356
+ return;
357
+ }
358
+ }
359
+ handlerChangeTab() {
360
+ this.outChangeTabKeyActive.emit(this.tabKeyActive());
361
+ }
362
+ handlerLoadingList(event) {
363
+ this.loadingList.set(event);
364
+ }
365
+ async setMessageError(error) {
366
+ this.error.set({ message: error });
367
+ this.showBorderError.set(true);
368
+ }
369
+ async valid() {
370
+ if (this.error()?.message) {
371
+ return false;
372
+ }
373
+ return this.checkValid();
374
+ }
375
+ checkValid(validateDefault) {
376
+ this.error.set(undefined);
377
+ const valid = { required: true, limitMaxItemSelect: true };
378
+ const validMaxItemSelected = this.validMaxItemSelected();
379
+ if (this.validRequired() && !this.lengthKeys()) {
380
+ valid.required = false;
381
+ }
382
+ if (validMaxItemSelected && this.lengthKeys() > validMaxItemSelected.value) {
383
+ valid.limitMaxItemSelect = false;
384
+ }
385
+ if (!validateDefault && valid.required === false) {
386
+ const validRequired = this.validRequired();
387
+ this.error.set({ ...(validRequired || {}), message: validRequired?.message || ERROR_MESSAGE_EMPTY_VALID });
388
+ }
389
+ if (!validateDefault && !this.error() && valid.limitMaxItemSelect === false) {
390
+ const validMaxItemSelected = this.validMaxItemSelected();
391
+ this.error.set({ ...(validMaxItemSelected || {}), message: validMaxItemSelected?.message || ERROR_MESSAGE_MAX_VALID, interpolateParams: { value: validMaxItemSelected?.value || 10 } });
392
+ }
393
+ this.outValidEvent.emit(valid.required && valid.limitMaxItemSelect);
394
+ return valid.required && valid.limitMaxItemSelect;
395
+ }
396
+ async resetError() {
397
+ this.error.set(undefined);
398
+ this.showBorderError.set(false);
399
+ }
400
+ handlerListFunctionsControl(event) {
401
+ this.listFunctionControl.set(event);
402
+ }
403
+ handlerChangStageFlagMouse(flag) {
404
+ this.flagMouse.set(flag);
405
+ this.mergeFlagMouse();
406
+ }
407
+ async reset() {
408
+ this.itemsSelected.set(undefined);
409
+ this.lengthKeys.set(0);
410
+ this.listFunctionControl()?.resetKeySelected();
411
+ if (!this.showList() && this.onlyEmitDataWhenReset()) {
412
+ this.outSelectKey.emit(undefined);
413
+ this.outSelectMultiKey.emit(undefined);
414
+ }
415
+ this.listKeySelected.set(undefined);
416
+ this.listMultiKeySelected.set(undefined);
417
+ this.keysSelected.set([]);
418
+ this.error.set(undefined);
419
+ this.selectedKeyByInput.set(false);
420
+ }
421
+ async buildDisplay() {
422
+ if (this.itemsSelected()) {
423
+ this.convertItemSelected()(this.itemsSelected(), this.translate);
424
+ const getPopoverItemSelected = this.getPopoverItemSelected();
425
+ if (getPopoverItemSelected) {
426
+ this.popoverItemSelected.set(await getPopoverItemSelected(this.itemsSelected, this.translate));
427
+ }
428
+ }
429
+ }
430
+ mergeFlagMouse() {
431
+ const flag = { isMouseEnter: false, isMouseEnterContent: false, isContainerHasScroll: false };
432
+ if (this.flagMouseContent()?.isMouseEnter || this.flagMouse()?.isMouseEnter) {
433
+ flag.isMouseEnter = true;
434
+ }
435
+ if (this.flagMouseContent()?.isMouseEnterContent || this.flagMouse()?.isMouseEnterContent) {
436
+ flag.isMouseEnterContent = true;
437
+ }
438
+ if (this.flagMouseContent()?.isContainerHasScroll || this.flagMouse()?.isContainerHasScroll) {
439
+ flag.isContainerHasScroll = true;
440
+ }
441
+ this.outChangStageFlagMouse.emit(flag);
442
+ }
443
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LibsUiComponentsDropdownComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
444
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: LibsUiComponentsDropdownComponent, isStandalone: true, selector: "libs_ui-components-dropdown", inputs: { useXssFilter: { classPropertyName: "useXssFilter", publicName: "useXssFilter", isSignal: true, isRequired: false, transformFunction: null }, popoverElementRefCustom: { classPropertyName: "popoverElementRefCustom", publicName: "popoverElementRefCustom", isSignal: true, isRequired: false, transformFunction: null }, classInclude: { classPropertyName: "classInclude", publicName: "classInclude", isSignal: true, isRequired: false, transformFunction: null }, ignoreStopPropagationEvent: { classPropertyName: "ignoreStopPropagationEvent", publicName: "ignoreStopPropagationEvent", isSignal: true, isRequired: false, transformFunction: null }, flagMouse: { classPropertyName: "flagMouse", publicName: "flagMouse", isSignal: true, isRequired: false, transformFunction: null }, flagMouseContent: { classPropertyName: "flagMouseContent", publicName: "flagMouseContent", isSignal: true, isRequired: false, transformFunction: null }, popoverCustomConfig: { classPropertyName: "popoverCustomConfig", publicName: "popoverCustomConfig", isSignal: true, isRequired: false, transformFunction: null }, isNgContent: { classPropertyName: "isNgContent", publicName: "isNgContent", isSignal: true, isRequired: false, transformFunction: null }, zIndex: { classPropertyName: "zIndex", publicName: "zIndex", isSignal: true, isRequired: false, transformFunction: null }, convertItemSelected: { classPropertyName: "convertItemSelected", publicName: "convertItemSelected", isSignal: true, isRequired: false, transformFunction: null }, getPopoverItemSelected: { classPropertyName: "getPopoverItemSelected", publicName: "getPopoverItemSelected", isSignal: true, isRequired: false, transformFunction: null }, httpRequestDetailItemById: { classPropertyName: "httpRequestDetailItemById", publicName: "httpRequestDetailItemById", isSignal: true, isRequired: false, transformFunction: null }, lengthKeys: { classPropertyName: "lengthKeys", publicName: "lengthKeys", isSignal: true, isRequired: false, transformFunction: null }, textDisplayWhenNoSelect: { classPropertyName: "textDisplayWhenNoSelect", publicName: "textDisplayWhenNoSelect", isSignal: true, isRequired: false, transformFunction: null }, textDisplayWhenMultiSelect: { classPropertyName: "textDisplayWhenMultiSelect", publicName: "textDisplayWhenMultiSelect", isSignal: true, isRequired: false, transformFunction: null }, classIncludeTextDisplayWhenNoSelect: { classPropertyName: "classIncludeTextDisplayWhenNoSelect", publicName: "classIncludeTextDisplayWhenNoSelect", isSignal: true, isRequired: false, transformFunction: null }, fieldGetLabel: { classPropertyName: "fieldGetLabel", publicName: "fieldGetLabel", isSignal: true, isRequired: false, transformFunction: null }, labelPopoverConfig: { classPropertyName: "labelPopoverConfig", publicName: "labelPopoverConfig", isSignal: true, isRequired: false, transformFunction: null }, labelPopoverFullWidth: { classPropertyName: "labelPopoverFullWidth", publicName: "labelPopoverFullWidth", isSignal: true, isRequired: false, transformFunction: null }, hasContentUnitRight: { classPropertyName: "hasContentUnitRight", publicName: "hasContentUnitRight", isSignal: true, isRequired: false, transformFunction: null }, listSearchNoDataTemplateRef: { classPropertyName: "listSearchNoDataTemplateRef", publicName: "listSearchNoDataTemplateRef", isSignal: true, isRequired: false, transformFunction: null }, fieldGetImage: { classPropertyName: "fieldGetImage", publicName: "fieldGetImage", isSignal: true, isRequired: false, transformFunction: null }, imageSize: { classPropertyName: "imageSize", publicName: "imageSize", isSignal: true, isRequired: false, transformFunction: null }, typeShape: { classPropertyName: "typeShape", publicName: "typeShape", isSignal: true, isRequired: false, transformFunction: null }, fieldGetIcon: { classPropertyName: "fieldGetIcon", publicName: "fieldGetIcon", isSignal: true, isRequired: false, transformFunction: null }, fieldGetTextAvatar: { classPropertyName: "fieldGetTextAvatar", publicName: "fieldGetTextAvatar", isSignal: true, isRequired: false, transformFunction: null }, fieldGetColorAvatar: { classPropertyName: "fieldGetColorAvatar", publicName: "fieldGetColorAvatar", isSignal: true, isRequired: false, transformFunction: null }, classAvatarInclude: { classPropertyName: "classAvatarInclude", publicName: "classAvatarInclude", isSignal: true, isRequired: false, transformFunction: null }, getLastTextAfterSpace: { classPropertyName: "getLastTextAfterSpace", publicName: "getLastTextAfterSpace", isSignal: true, isRequired: false, transformFunction: null }, linkImageError: { classPropertyName: "linkImageError", publicName: "linkImageError", isSignal: true, isRequired: false, transformFunction: null }, showError: { classPropertyName: "showError", publicName: "showError", isSignal: true, isRequired: false, transformFunction: null }, showBorderError: { classPropertyName: "showBorderError", publicName: "showBorderError", isSignal: true, isRequired: false, transformFunction: null }, disable: { classPropertyName: "disable", publicName: "disable", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, labelConfig: { classPropertyName: "labelConfig", publicName: "labelConfig", isSignal: true, isRequired: false, transformFunction: null }, listSearchConfig: { classPropertyName: "listSearchConfig", publicName: "listSearchConfig", isSignal: true, isRequired: false, transformFunction: null }, listHiddenInputSearch: { classPropertyName: "listHiddenInputSearch", publicName: "listHiddenInputSearch", isSignal: true, isRequired: false, transformFunction: null }, listSearchPadding: { classPropertyName: "listSearchPadding", publicName: "listSearchPadding", isSignal: true, isRequired: false, transformFunction: null }, listKeySearch: { classPropertyName: "listKeySearch", publicName: "listKeySearch", isSignal: true, isRequired: false, transformFunction: null }, listDividerClassInclude: { classPropertyName: "listDividerClassInclude", publicName: "listDividerClassInclude", isSignal: true, isRequired: false, transformFunction: null }, listConfig: { classPropertyName: "listConfig", publicName: "listConfig", isSignal: true, isRequired: false, transformFunction: null }, listButtonsOther: { classPropertyName: "listButtonsOther", publicName: "listButtonsOther", isSignal: true, isRequired: false, transformFunction: null }, listHasButtonUnSelectOption: { classPropertyName: "listHasButtonUnSelectOption", publicName: "listHasButtonUnSelectOption", isSignal: true, isRequired: false, transformFunction: null }, listClickExactly: { classPropertyName: "listClickExactly", publicName: "listClickExactly", isSignal: true, isRequired: false, transformFunction: null }, listBackgroundCustom: { classPropertyName: "listBackgroundCustom", publicName: "listBackgroundCustom", isSignal: true, isRequired: false, transformFunction: null }, listMaxItemShow: { classPropertyName: "listMaxItemShow", publicName: "listMaxItemShow", isSignal: true, isRequired: false, transformFunction: null }, listKeySelected: { classPropertyName: "listKeySelected", publicName: "listKeySelected", isSignal: true, isRequired: false, transformFunction: null }, listMultiKeySelected: { classPropertyName: "listMultiKeySelected", publicName: "listMultiKeySelected", isSignal: true, isRequired: false, transformFunction: null }, listKeysDisable: { classPropertyName: "listKeysDisable", publicName: "listKeysDisable", isSignal: true, isRequired: false, transformFunction: null }, listKeysHidden: { classPropertyName: "listKeysHidden", publicName: "listKeysHidden", isSignal: true, isRequired: false, transformFunction: null }, validRequired: { classPropertyName: "validRequired", publicName: "validRequired", isSignal: true, isRequired: false, transformFunction: null }, validMaxItemSelected: { classPropertyName: "validMaxItemSelected", publicName: "validMaxItemSelected", isSignal: true, isRequired: false, transformFunction: null }, changeValidUndefinedResetError: { classPropertyName: "changeValidUndefinedResetError", publicName: "changeValidUndefinedResetError", isSignal: true, isRequired: false, transformFunction: null }, allowSelectItemMultiple: { classPropertyName: "allowSelectItemMultiple", publicName: "allowSelectItemMultiple", isSignal: true, isRequired: false, transformFunction: null }, listViewFunctionCustomAddDataToStore: { classPropertyName: "listViewFunctionCustomAddDataToStore", publicName: "listViewFunctionCustomAddDataToStore", isSignal: true, isRequired: false, transformFunction: null }, focusInputSearch: { classPropertyName: "focusInputSearch", publicName: "focusInputSearch", isSignal: true, isRequired: false, transformFunction: null }, onlyEmitDataWhenReset: { classPropertyName: "onlyEmitDataWhenReset", publicName: "onlyEmitDataWhenReset", isSignal: true, isRequired: false, transformFunction: null }, resetKeyWhenSelectAllKey: { classPropertyName: "resetKeyWhenSelectAllKey", publicName: "resetKeyWhenSelectAllKey", isSignal: true, isRequired: false, transformFunction: null }, listConfigHasDivider: { classPropertyName: "listConfigHasDivider", publicName: "listConfigHasDivider", isSignal: true, isRequired: false, transformFunction: null }, classIncludeIcon: { classPropertyName: "classIncludeIcon", publicName: "classIncludeIcon", isSignal: true, isRequired: false, transformFunction: null }, classIncludeContent: { classPropertyName: "classIncludeContent", publicName: "classIncludeContent", isSignal: true, isRequired: false, transformFunction: null }, listIgnoreClassDisableDefaultWhenUseKeysDisableItem: { classPropertyName: "listIgnoreClassDisableDefaultWhenUseKeysDisableItem", publicName: "listIgnoreClassDisableDefaultWhenUseKeysDisableItem", isSignal: true, isRequired: false, transformFunction: null }, tabKeyActive: { classPropertyName: "tabKeyActive", publicName: "tabKeyActive", isSignal: true, isRequired: false, transformFunction: null }, tabsConfig: { classPropertyName: "tabsConfig", publicName: "tabsConfig", isSignal: true, isRequired: false, transformFunction: null }, ignoreBorderBottom: { classPropertyName: "ignoreBorderBottom", publicName: "ignoreBorderBottom", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { flagMouse: "flagMouseChange", flagMouseContent: "flagMouseContentChange", lengthKeys: "lengthKeysChange", showBorderError: "showBorderErrorChange", listKeySelected: "listKeySelectedChange", listMultiKeySelected: "listMultiKeySelectedChange", tabKeyActive: "tabKeyActiveChange", outSelectKey: "outSelectKey", outSelectMultiKey: "outSelectMultiKey", outFunctionsControl: "outFunctionsControl", outValidEvent: "outValidEvent", outChangStageFlagMouse: "outChangStageFlagMouse", outDataChange: "outDataChange", outClickButtonOther: "outClickButtonOther", outShowList: "outShowList", outChangeTabKeyActive: "outChangeTabKeyActive" }, ngImport: i0, template: "<div class=\"flex flex-col w-full\">\n @if (labelConfig(); as label) {\n <libs_ui-components-label [classInclude]=\"label.classInclude\"\n [labelLeft]=\"label.labelLeft\"\n [labelLeftClass]=\"label.labelLeftClass\"\n [required]=\"label.required \"\n [description]=\"label.description\"\n [descriptionClass]=\"label.descriptionClass\"\n [labelRight]=\"label.labelRight\"\n [labelRightClass]=\"label.labelRightClass\"\n [onlyShowCount]=\"label.onlyShowCount\"\n [buttonsLeft]=\"label.buttonsLeft\"\n [buttonsRight]=\"label.buttonsRight\"\n [disableButtonsLeft]=\"label.disableButtonsLeft || disable() || loadingDetail()\"\n [disableButtonsRight]=\"label.disableButtonsRight || disable() || loadingDetail()\"\n [hasToggle]=\"label.hasToggle\"\n [toggleActive]=\"label.toggleActive\"\n [toggleDisable]=\"label.toggleDisable || disable() || loadingDetail()\"\n [popover]=\"label.popover\"\n [iconPopoverClass]=\"label.iconPopoverClass\"\n [onlyShowCount]=\"label.onlyShowCount\"\n [limitLength]=\"label.limitLength\"\n [buttonsDescription]=\"label.buttonsDescription\"\n [disableButtonsDescription]=\"label.disableButtonsDescription || disable()\"\n [buttonsDescriptionContainerClass]=\"label.buttonsDescriptionContainerClass\"\n [count]=\"label.count\" />\n }\n <libs_ui-components-popover [ignoreShowPopover]=\"disable() || readonly() || loadingDetail()\"\n [class]=\"classInclude() || 'w-full'\"\n [mode]=\"'click-toggle'\"\n [flagMouse]=\"flagMouse()\"\n [ignoreHiddenPopoverContentWhenMouseLeave]=\"true\"\n [ignoreCursorPointerModeLikeClick]=\"true\"\n [ignoreStopPropagationEvent]=\"ignoreStopPropagationEvent()\"\n [elementRefCustom]=\"popoverElementRefCustom()\"\n [config]=\"{\n animationConfig: popoverCustomConfig()?.animationConfig || {},\n zIndex: zIndex() ?? 1000,\n widthByParent: popoverCustomConfig()?.widthByParent ?? true,\n parentBorderWidth: popoverCustomConfig()?.parentBorderWidth ?? 0,\n maxHeight: popoverCustomConfig()?.maxHeight ?? 2048,\n maxWidth: popoverCustomConfig()?.maxWidth ?? 2048,\n direction: popoverCustomConfig()?.direction ?? 'bottom',\n template: listViewEl,\n whiteTheme: true,\n timerDestroy: popoverCustomConfig()?.timerDestroy ?? 0,\n ignoreArrow: popoverCustomConfig()?.ignoreArrow ?? true,\n directionDistance: 2,\n classInclude: 'rounded-[4px] ' + (popoverCustomConfig()?.classInclude ?? 'libs-ui-border-general ') + ((listConfig()?.type === 'text' && listConfig()?.configTemplateText?.notUseVirtualScroll) ? ' overflow-hidden' : ''),\n position: popoverCustomConfig()?.position || { mode: 'start', distance: 0 },\n width: popoverCustomConfig()?.width\n }\"\n (outFunctionsControl)=\"handlerPopoverControlEvent($event)\"\n (outEvent)=\"handlerEvent($event)\"\n (outChangStageFlagMouse)=\"handlerChangeFlagMouse($event)\">\n @if (!isNgContent()) {\n <div [class]=\"'libs-ui-dropdown ' + classIncludeContent()\"\n [class.libs-ui-border-general]=\"!error() && !showBorderError() && !showList()\"\n [class.libs-ui-border-primary-focus-general]=\"!error() && !showBorderError() && showList()\"\n [class.libs-ui-border-error-general]=\"error() || showBorderError()\"\n [class.libs-ui-readonly]=\"readonly()\"\n [class.libs-ui-readonly-background]=\"readonly()\"\n [class.cursor-pointer]=\"!(disable() || loadingDetail() || readonly())\"\n [class.libs-ui-disable]=\"disable() || loadingDetail()\"\n [class.libs-ui-disable-background]=\"disable() || loadingDetail()\"\n [class.pointer-events-none]=\"loadingDetail()\"\n [class.rounded-tr-0]=\"hasContentUnitRight()\"\n [class.rounded-br-0]=\"hasContentUnitRight()\"\n [class.text-[#071631]]=\"readonly()\"\n [class.bg-[#f8f9fa]]=\"disable() || loadingDetail() || readonly()\"\n [class.text-[#9ca2ad]]=\"disable() || loadingDetail() || readonly()\">\n <div class=\"flex items-center w-full\">\n <div class=\"flex items-center w-full relative\">\n <div class=\"flex items-center w-full absolute\">\n @if (lengthKeys() === 1) {\n @if (itemsSelected(); as itemsSelected) {\n @if (fieldGetImage(); as fieldGetImage) {\n <libs_ui-components-avatar [classInclude]=\"classAvatarInclude()\"\n [typeShape]=\"typeShape()\"\n [size]=\"imageSize()\"\n [linkAvatar]=\"itemsSelected[fieldGetImage]\"\n [linkAvatarError]=\"linkImageError()\"\n [idGenColor]=\"itemsSelected[fieldGetColorAvatar() || fieldGetTextAvatar()]\"\n [textAvatar]=\"itemsSelected[fieldGetTextAvatar()]\"\n [getLastTextAfterSpace]=\"getLastTextAfterSpace()\" />\n }\n @if (fieldGetIcon(); as fieldGetIcon) {\n <i [class]=\"itemsSelected[fieldGetIcon] + ' mr-[8px]'\"></i>\n }\n }\n }\n <libs_ui-components-popover [type]=\"'text'\"\n [classInclude]=\"(labelPopoverFullWidth() ? 'w-100 ' : '') + classIncludeTextDisplayWhenNoSelect()\"\n [innerHTML]=\"labelItemSelectedComputed() | translate:{value: lengthKeys()} | LibsUiPipesSecurityTrustPipe:'html':useXssFilter() | async\"\n [config]=\"{maxWidth: labelPopoverConfig()?.maxWidth || 250, direction: 'top', zIndex: labelPopoverConfig()?.zIndex, timerDestroy: labelPopoverConfig()?.timerDestroy || 0}\"\n [ignoreStopPropagationEvent]=\"true\" />\n @if (popoverItemSelected(); as popoverItemSelected) {\n <libs_ui-components-popover [type]=\"popoverItemSelected.type || 'other'\"\n [config]=\"popoverItemSelected.config || {}\">\n @if (popoverItemSelected.dataView) {\n <div [innerHtml]=\"popoverItemSelected.dataView | translate\"></div>\n } @else {\n <i class=\"libs-ui-icon-tooltip-outline text-[16px] mx-[8px]\"> </i>\n }\n </libs_ui-components-popover>\n }\n </div>\n </div>\n <i class=\"text-[16px] libs-ui-icon-move-right rotate-90 {{ classIncludeIcon() }}\"\n [class.text-[#6a7383]]=\"!readonly() && !classIncludeIcon()\"\n [class.text-[#9ca2ad]]=\"(readonly() || disable()) && !classIncludeIcon()\"></i>\n </div>\n </div>\n } @else {\n <ng-content></ng-content>\n }\n </libs_ui-components-popover>\n @if (showError()) {\n @if (error(); as error) {\n <div class=\"mt-[8px] text-[#ee2d41] libs-ui-font-h7r\"\n [innerHtml]=\"(error.message || ' ') | translate:(error.interpolateParams || {})\">\n </div>\n }\n }\n</div>\n<ng-template #listViewEl>\n <div style=\"display: flex; flex-direction: column;\">\n @if (!!tabsConfig) {\n <libs_ui-components-dropdown-tabs [tabsConfig]=\"tabsConfig()\"\n [(tabKeyActive)]=\"tabKeyActive\"\n [ignoreBorderBottom]=\"ignoreBorderBottom()\"\n [disable]=\"disable() || loadingDetail() || loadingList()\"\n (outChange)=\"handlerChangeTab()\" />\n }\n <libs_ui-components-list [searchConfig]=\"listSearchConfig()\"\n [dropdownTabKeyActive]=\"tabKeyActive()\"\n [keySearch]=\"listKeySearch()\"\n [config]=\"listConfig()\"\n [paddingLeftItem]=\"popoverCustomConfig()?.paddingLeftItem ?? true\"\n [disable]=\"disable() || loadingDetail()\"\n [hiddenInputSearch]=\"listHiddenInputSearch()\"\n [searchPadding]=\"listSearchPadding()\"\n [maxItemShow]=\"(listConfig()?.type === 'text' && listConfig()?.configTemplateText?.notUseVirtualScroll) ? 0 : listMaxItemShow()\"\n [keySelected]=\"listKeySelected()\"\n [multiKeySelected]=\"listMultiKeySelected()\"\n [clickExactly]=\"popoverCustomConfig()?.clickExactly ?? false\"\n [dividerClassInclude]=\"listSearchConfig() ? listDividerClassInclude() : 'hidden'\"\n [buttonsOther]=\"listButtonsOther()\"\n [backgroundListCustom]=\"listBackgroundCustom()\"\n [keysDisableItem]=\"listKeysDisable()\"\n [keysHiddenItem]=\"listKeysHidden()\"\n [hasButtonUnSelectOption]=\"listHasButtonUnSelectOption() ?? (!popoverCustomConfig() && !labelConfig()?.required && (listConfig()?.type === 'text' || listConfig()?.type === 'radio'))\"\n [templateRefSearchNoData]=\"listSearchNoDataTemplateRef()\"\n [focusInputSearch]=\"focusInputSearch()\"\n [functionCustomAddDataToStore]=\"listViewFunctionCustomAddDataToStore()\"\n [zIndex]=\"zIndex()\"\n [resetKeyWhenSelectAllKeyDropdown]=\"resetKeyWhenSelectAllKey()\"\n [ignoreClassDisableDefaultWhenUseKeysDisableItem]=\"listIgnoreClassDisableDefaultWhenUseKeysDisableItem()\"\n [hasDivider]=\"listConfigHasDivider()\"\n (outSelectKey)=\"handlerSelectedKey($event, true)\"\n (outSelectMultiKey)=\"handlerSelectMultiKey($event, true)\"\n (outChangeView)=\"handlerDataChange($event)\"\n (outClickButtonOther)=\"handlerClickButtonOther($event)\"\n (outFunctionsControl)=\"handlerListFunctionsControl($event)\"\n (outChangStageFlagMousePopover)=\"handlerChangStageFlagMouse($event)\"\n (outLoading)=\"handlerLoadingList($event)\" />\n </div>\n</ng-template>\n", styles: [":host{width:100%;display:flex;flex-direction:column}:host .libs-ui-dropdown{position:relative;width:100%;min-height:32px;display:flex;align-items:center;background-color:#fff;padding:0 16px;border-radius:4px;cursor:pointer}\n"], dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "pipe", type: LibsUiPipesSecurityTrustPipe, name: "LibsUiPipesSecurityTrustPipe" }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "component", type: LibsUiComponentsLabelComponent, selector: "libs_ui-components-label", inputs: ["iconPopoverClass", "classInclude", "labelLeft", "labelLeftClass", "labelLeftBehindToggleButton", "popover", "required", "buttonsLeft", "disableButtonsLeft", "buttonsRight", "disableButtonsRight", "labelRight", "labelRightClass", "labelRightRequired", "hasToggle", "toggleSize", "toggleActive", "toggleDisable", "description", "descriptionClass", "buttonsDescription", "disableButtonsDescription", "buttonsDescriptionContainerClass", "onlyShowCount", "zIndexPopover", "timerDestroyPopover", "count", "limitLength"], outputs: ["outClickButton", "outSwitchEvent", "outLabelRightClick", "outLabelLeftClick"] }, { kind: "component", type: LibsUiComponentsPopoverComponent, selector: "libs_ui-components-popover,[LibsUiComponentsPopoverDirective]", inputs: ["flagMouse", "type", "mode", "config", "ignoreShowPopover", "elementRefCustom", "classInclude", "ignoreHiddenPopoverContentWhenMouseLeave", "ignoreStopPropagationEvent", "ignoreCursorPointerModeLikeClick", "isAddContentToParentDocument", "ignoreClickOutside"], outputs: ["outEvent", "outChangStageFlagMouse", "outEventPopoverContent", "outFunctionsControl"] }, { kind: "component", type: LibsUiComponentsAvatarComponent, selector: "libs_ui-components-avatar", inputs: ["getLastTextAfterSpace", "typeShape", "classInclude", "size", "linkAvatar", "linkAvatarError", "idGenColor", "textAvatar", "classImageInclude"], outputs: ["outAvatarError"] }, { kind: "component", type: LibsUiComponentsListComponent, selector: "libs_ui-components-list", inputs: ["hiddenInputSearch", "dropdownTabKeyActive", "keySearch", "itemChangeUnSelect", "paddingLeftItem", "config", "isSearchOnline", "disable", "disableLabel", "labelConfig", "searchConfig", "searchPadding", "dividerClassInclude", "hasDivider", "buttonsOther", "hasButtonUnSelectOption", "clickExactly", "backgroundListCustom", "maxItemShow", "keySelected", "multiKeySelected", "keysDisableItem", "keysHiddenItem", "focusInputSearch", "skipFocusInputWhenKeySearchStoreUndefined", "functionCustomAddDataToStore", "functionGetItemsAutoAddList", "validRequired", "showValidateBottom", "zIndex", "loadingIconSize", "templateRefSearchNoData", "resetKeyWhenSelectAllKeyDropdown", "ignoreClassDisableDefaultWhenUseKeysDisableItem"], outputs: ["outSelectKey", "outSelectMultiKey", "outUnSelectMultiKey", "outClickButtonOther", "outFieldKey", "outChangeView", "outLoading", "outFunctionsControl", "outChangStageFlagMousePopover", "outLoadItemsComplete"] }, { kind: "component", type: LibsUiComponentsDropdownTabsComponent, selector: "libs_ui-components-dropdown-tabs", inputs: ["ignoreBorderBottom", "tabsConfig", "tabKeyActive", "disable"], outputs: ["tabKeyActiveChange", "outChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
445
+ }
446
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LibsUiComponentsDropdownComponent, decorators: [{
447
+ type: Component,
448
+ args: [{ selector: 'libs_ui-components-dropdown', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [
449
+ TranslateModule, LibsUiPipesSecurityTrustPipe, AsyncPipe,
450
+ LibsUiComponentsLabelComponent, LibsUiComponentsPopoverComponent,
451
+ LibsUiComponentsAvatarComponent, LibsUiComponentsListComponent,
452
+ LibsUiComponentsDropdownTabsComponent
453
+ ], template: "<div class=\"flex flex-col w-full\">\n @if (labelConfig(); as label) {\n <libs_ui-components-label [classInclude]=\"label.classInclude\"\n [labelLeft]=\"label.labelLeft\"\n [labelLeftClass]=\"label.labelLeftClass\"\n [required]=\"label.required \"\n [description]=\"label.description\"\n [descriptionClass]=\"label.descriptionClass\"\n [labelRight]=\"label.labelRight\"\n [labelRightClass]=\"label.labelRightClass\"\n [onlyShowCount]=\"label.onlyShowCount\"\n [buttonsLeft]=\"label.buttonsLeft\"\n [buttonsRight]=\"label.buttonsRight\"\n [disableButtonsLeft]=\"label.disableButtonsLeft || disable() || loadingDetail()\"\n [disableButtonsRight]=\"label.disableButtonsRight || disable() || loadingDetail()\"\n [hasToggle]=\"label.hasToggle\"\n [toggleActive]=\"label.toggleActive\"\n [toggleDisable]=\"label.toggleDisable || disable() || loadingDetail()\"\n [popover]=\"label.popover\"\n [iconPopoverClass]=\"label.iconPopoverClass\"\n [onlyShowCount]=\"label.onlyShowCount\"\n [limitLength]=\"label.limitLength\"\n [buttonsDescription]=\"label.buttonsDescription\"\n [disableButtonsDescription]=\"label.disableButtonsDescription || disable()\"\n [buttonsDescriptionContainerClass]=\"label.buttonsDescriptionContainerClass\"\n [count]=\"label.count\" />\n }\n <libs_ui-components-popover [ignoreShowPopover]=\"disable() || readonly() || loadingDetail()\"\n [class]=\"classInclude() || 'w-full'\"\n [mode]=\"'click-toggle'\"\n [flagMouse]=\"flagMouse()\"\n [ignoreHiddenPopoverContentWhenMouseLeave]=\"true\"\n [ignoreCursorPointerModeLikeClick]=\"true\"\n [ignoreStopPropagationEvent]=\"ignoreStopPropagationEvent()\"\n [elementRefCustom]=\"popoverElementRefCustom()\"\n [config]=\"{\n animationConfig: popoverCustomConfig()?.animationConfig || {},\n zIndex: zIndex() ?? 1000,\n widthByParent: popoverCustomConfig()?.widthByParent ?? true,\n parentBorderWidth: popoverCustomConfig()?.parentBorderWidth ?? 0,\n maxHeight: popoverCustomConfig()?.maxHeight ?? 2048,\n maxWidth: popoverCustomConfig()?.maxWidth ?? 2048,\n direction: popoverCustomConfig()?.direction ?? 'bottom',\n template: listViewEl,\n whiteTheme: true,\n timerDestroy: popoverCustomConfig()?.timerDestroy ?? 0,\n ignoreArrow: popoverCustomConfig()?.ignoreArrow ?? true,\n directionDistance: 2,\n classInclude: 'rounded-[4px] ' + (popoverCustomConfig()?.classInclude ?? 'libs-ui-border-general ') + ((listConfig()?.type === 'text' && listConfig()?.configTemplateText?.notUseVirtualScroll) ? ' overflow-hidden' : ''),\n position: popoverCustomConfig()?.position || { mode: 'start', distance: 0 },\n width: popoverCustomConfig()?.width\n }\"\n (outFunctionsControl)=\"handlerPopoverControlEvent($event)\"\n (outEvent)=\"handlerEvent($event)\"\n (outChangStageFlagMouse)=\"handlerChangeFlagMouse($event)\">\n @if (!isNgContent()) {\n <div [class]=\"'libs-ui-dropdown ' + classIncludeContent()\"\n [class.libs-ui-border-general]=\"!error() && !showBorderError() && !showList()\"\n [class.libs-ui-border-primary-focus-general]=\"!error() && !showBorderError() && showList()\"\n [class.libs-ui-border-error-general]=\"error() || showBorderError()\"\n [class.libs-ui-readonly]=\"readonly()\"\n [class.libs-ui-readonly-background]=\"readonly()\"\n [class.cursor-pointer]=\"!(disable() || loadingDetail() || readonly())\"\n [class.libs-ui-disable]=\"disable() || loadingDetail()\"\n [class.libs-ui-disable-background]=\"disable() || loadingDetail()\"\n [class.pointer-events-none]=\"loadingDetail()\"\n [class.rounded-tr-0]=\"hasContentUnitRight()\"\n [class.rounded-br-0]=\"hasContentUnitRight()\"\n [class.text-[#071631]]=\"readonly()\"\n [class.bg-[#f8f9fa]]=\"disable() || loadingDetail() || readonly()\"\n [class.text-[#9ca2ad]]=\"disable() || loadingDetail() || readonly()\">\n <div class=\"flex items-center w-full\">\n <div class=\"flex items-center w-full relative\">\n <div class=\"flex items-center w-full absolute\">\n @if (lengthKeys() === 1) {\n @if (itemsSelected(); as itemsSelected) {\n @if (fieldGetImage(); as fieldGetImage) {\n <libs_ui-components-avatar [classInclude]=\"classAvatarInclude()\"\n [typeShape]=\"typeShape()\"\n [size]=\"imageSize()\"\n [linkAvatar]=\"itemsSelected[fieldGetImage]\"\n [linkAvatarError]=\"linkImageError()\"\n [idGenColor]=\"itemsSelected[fieldGetColorAvatar() || fieldGetTextAvatar()]\"\n [textAvatar]=\"itemsSelected[fieldGetTextAvatar()]\"\n [getLastTextAfterSpace]=\"getLastTextAfterSpace()\" />\n }\n @if (fieldGetIcon(); as fieldGetIcon) {\n <i [class]=\"itemsSelected[fieldGetIcon] + ' mr-[8px]'\"></i>\n }\n }\n }\n <libs_ui-components-popover [type]=\"'text'\"\n [classInclude]=\"(labelPopoverFullWidth() ? 'w-100 ' : '') + classIncludeTextDisplayWhenNoSelect()\"\n [innerHTML]=\"labelItemSelectedComputed() | translate:{value: lengthKeys()} | LibsUiPipesSecurityTrustPipe:'html':useXssFilter() | async\"\n [config]=\"{maxWidth: labelPopoverConfig()?.maxWidth || 250, direction: 'top', zIndex: labelPopoverConfig()?.zIndex, timerDestroy: labelPopoverConfig()?.timerDestroy || 0}\"\n [ignoreStopPropagationEvent]=\"true\" />\n @if (popoverItemSelected(); as popoverItemSelected) {\n <libs_ui-components-popover [type]=\"popoverItemSelected.type || 'other'\"\n [config]=\"popoverItemSelected.config || {}\">\n @if (popoverItemSelected.dataView) {\n <div [innerHtml]=\"popoverItemSelected.dataView | translate\"></div>\n } @else {\n <i class=\"libs-ui-icon-tooltip-outline text-[16px] mx-[8px]\"> </i>\n }\n </libs_ui-components-popover>\n }\n </div>\n </div>\n <i class=\"text-[16px] libs-ui-icon-move-right rotate-90 {{ classIncludeIcon() }}\"\n [class.text-[#6a7383]]=\"!readonly() && !classIncludeIcon()\"\n [class.text-[#9ca2ad]]=\"(readonly() || disable()) && !classIncludeIcon()\"></i>\n </div>\n </div>\n } @else {\n <ng-content></ng-content>\n }\n </libs_ui-components-popover>\n @if (showError()) {\n @if (error(); as error) {\n <div class=\"mt-[8px] text-[#ee2d41] libs-ui-font-h7r\"\n [innerHtml]=\"(error.message || ' ') | translate:(error.interpolateParams || {})\">\n </div>\n }\n }\n</div>\n<ng-template #listViewEl>\n <div style=\"display: flex; flex-direction: column;\">\n @if (!!tabsConfig) {\n <libs_ui-components-dropdown-tabs [tabsConfig]=\"tabsConfig()\"\n [(tabKeyActive)]=\"tabKeyActive\"\n [ignoreBorderBottom]=\"ignoreBorderBottom()\"\n [disable]=\"disable() || loadingDetail() || loadingList()\"\n (outChange)=\"handlerChangeTab()\" />\n }\n <libs_ui-components-list [searchConfig]=\"listSearchConfig()\"\n [dropdownTabKeyActive]=\"tabKeyActive()\"\n [keySearch]=\"listKeySearch()\"\n [config]=\"listConfig()\"\n [paddingLeftItem]=\"popoverCustomConfig()?.paddingLeftItem ?? true\"\n [disable]=\"disable() || loadingDetail()\"\n [hiddenInputSearch]=\"listHiddenInputSearch()\"\n [searchPadding]=\"listSearchPadding()\"\n [maxItemShow]=\"(listConfig()?.type === 'text' && listConfig()?.configTemplateText?.notUseVirtualScroll) ? 0 : listMaxItemShow()\"\n [keySelected]=\"listKeySelected()\"\n [multiKeySelected]=\"listMultiKeySelected()\"\n [clickExactly]=\"popoverCustomConfig()?.clickExactly ?? false\"\n [dividerClassInclude]=\"listSearchConfig() ? listDividerClassInclude() : 'hidden'\"\n [buttonsOther]=\"listButtonsOther()\"\n [backgroundListCustom]=\"listBackgroundCustom()\"\n [keysDisableItem]=\"listKeysDisable()\"\n [keysHiddenItem]=\"listKeysHidden()\"\n [hasButtonUnSelectOption]=\"listHasButtonUnSelectOption() ?? (!popoverCustomConfig() && !labelConfig()?.required && (listConfig()?.type === 'text' || listConfig()?.type === 'radio'))\"\n [templateRefSearchNoData]=\"listSearchNoDataTemplateRef()\"\n [focusInputSearch]=\"focusInputSearch()\"\n [functionCustomAddDataToStore]=\"listViewFunctionCustomAddDataToStore()\"\n [zIndex]=\"zIndex()\"\n [resetKeyWhenSelectAllKeyDropdown]=\"resetKeyWhenSelectAllKey()\"\n [ignoreClassDisableDefaultWhenUseKeysDisableItem]=\"listIgnoreClassDisableDefaultWhenUseKeysDisableItem()\"\n [hasDivider]=\"listConfigHasDivider()\"\n (outSelectKey)=\"handlerSelectedKey($event, true)\"\n (outSelectMultiKey)=\"handlerSelectMultiKey($event, true)\"\n (outChangeView)=\"handlerDataChange($event)\"\n (outClickButtonOther)=\"handlerClickButtonOther($event)\"\n (outFunctionsControl)=\"handlerListFunctionsControl($event)\"\n (outChangStageFlagMousePopover)=\"handlerChangStageFlagMouse($event)\"\n (outLoading)=\"handlerLoadingList($event)\" />\n </div>\n</ng-template>\n", styles: [":host{width:100%;display:flex;flex-direction:column}:host .libs-ui-dropdown{position:relative;width:100%;min-height:32px;display:flex;align-items:center;background-color:#fff;padding:0 16px;border-radius:4px;cursor:pointer}\n"] }]
454
+ }], ctorParameters: () => [] });
455
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL2Ryb3Bkb3duL3NyYy9kcm9wZG93bi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvZHJvcGRvd24vc3JjL2Ryb3Bkb3duLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM1QyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLE1BQU0sRUFBZSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0osT0FBTyxFQUFFLCtCQUErQixFQUE4QyxNQUFNLDRCQUE0QixDQUFDO0FBSXpILE9BQU8sRUFBVSw4QkFBOEIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ25GLE9BQU8sRUFBRSxpQkFBaUIsRUFBMkYsNkJBQTZCLEVBQWlCLE1BQU0sMEJBQTBCLENBQUM7QUFDcE0sT0FBTyxFQUF1RSxnQ0FBZ0MsRUFBc0IsTUFBTSw2QkFBNkIsQ0FBQztBQUN4SyxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUM3RSxPQUFPLEVBQXNCLHdCQUF3QixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDOUYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLFNBQVMsRUFBRSx5QkFBeUIsRUFBRSx1QkFBdUIsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3RJLE9BQU8sRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUd4RSxPQUFPLEVBQUUscUNBQXFDLEVBQUUsTUFBTSx1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QUE2Qjt3QkFDOUQscUNBQXFDO3FCQUN0QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFzeW5jUGlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBjb21wdXRlZCwgZWZmZWN0LCBpbmplY3QsIGlucHV0LCBtb2RlbCwgT25Jbml0LCBvdXRwdXQsIHNpZ25hbCwgVGVtcGxhdGVSZWYsIHVudHJhY2tlZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c0F2YXRhckNvbXBvbmVudCwgVFlQRV9TSEFQRV9BVkFUQVIsIFRZUEVfU0laRV9BVkFUQVJfQ09ORklHIH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1hdmF0YXInO1xuaW1wb3J0IHsgSUJ1dHRvbiB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtYnV0dG9ucy1idXR0b24nO1xuaW1wb3J0IHsgSUlucHV0U2VhcmNoQ29uZmlnIH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1pbnB1dHMtc2VhcmNoJztcbmltcG9ydCB7IElWYWxpZCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtaW5wdXRzLXZhbGlkJztcbmltcG9ydCB7IElMYWJlbCwgTGlic1VpQ29tcG9uZW50c0xhYmVsQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1sYWJlbCc7XG5pbXBvcnQgeyBnZXRGaWVsZEtleUJ5VHlwZSwgSUxpc3REYXRhRW1pdEtleSwgSUxpc3REYXRhRW1pdE11bHRpS2V5LCBJTGlzdEZ1bmN0aW9uQ29udHJvbEV2ZW50LCBJTGlzdFZpZXdDb25maWdJdGVtLCBMaWJzVWlDb21wb25lbnRzTGlzdENvbXBvbmVudCwgVFlQRV9URU1QTEFURSB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtbGlzdCc7XG5pbXBvcnQgeyBJRmxhZ01vdXNlLCBJUG9wb3ZlciwgSVBvcG92ZXJGdW5jdGlvbkNvbnRyb2xFdmVudCwgSVBvcG92ZXJPdmVybGF5LCBMaWJzVWlDb21wb25lbnRzUG9wb3ZlckNvbXBvbmVudCwgVFlQRV9QT1BPVkVSX0VWRU5UIH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1wb3BvdmVyJztcbmltcG9ydCB7IExpYnNVaVBpcGVzU2VjdXJpdHlUcnVzdFBpcGUgfSBmcm9tICdAbGlicy11aS9waXBlcy1zZWN1cml0eS10cnVzdCc7XG5pbXBvcnQgeyBJSHR0cFJlcXVlc3RDb25maWcsIExpYnNVaUh0dHBSZXF1ZXN0U2VydmljZSB9IGZyb20gJ0BsaWJzLXVpL3NlcnZpY2VzLWh0dHAtcmVxdWVzdCc7XG5pbXBvcnQgeyBDSEFSQUNURVJfREFUQV9FTVBUWSwgY2xvbmVEZWVwLCBFUlJPUl9NRVNTQUdFX0VNUFRZX1ZBTElELCBFUlJPUl9NRVNTQUdFX01BWF9WQUxJRCwgZ2V0LCBpc05pbCwgc2V0IH0gZnJvbSAnQGxpYnMtdWkvdXRpbHMnO1xuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlLCBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBJRHJvcGRvd25UYWJzSXRlbSwgSUVtaXRNdWx0aUtleSwgSUVtaXRTZWxlY3RLZXksIElQb3BvdmVyQ3VzdG9tQ29uZmlnLCBJVmFsaWRNYXhJdGVtU2VsZWN0ZWQgfSBmcm9tICcuL2ludGVyZmFjZXMvZHJvcGRvd24uaW50ZXJmYWNlJztcbmltcG9ydCB7IElEcm9wZG93bkZ1bmN0aW9uQ29udHJvbEV2ZW50IH0gZnJvbSAnLi9pbnRlcmZhY2VzL2Z1bmN0aW9uLWNvbnRyb2wtZXZlbnQuaW50ZXJmYWNlJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNEcm9wZG93blRhYnNDb21wb25lbnQgfSBmcm9tICcuL3RhYnMvdGFicy5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9jb21wb25lbnQtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICdsaWJzX3VpLWNvbXBvbmVudHMtZHJvcGRvd24nLFxuICB0ZW1wbGF0ZVVybDogJy4vZHJvcGRvd24uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vZHJvcGRvd24uY29tcG9uZW50LnNjc3MnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgaW1wb3J0czogW1xuICAgIFRyYW5zbGF0ZU1vZHVsZSwgTGlic1VpUGlwZXNTZWN1cml0eVRydXN0UGlwZSwgQXN5bmNQaXBlLFxuICAgIExpYnNVaUNvbXBvbmVudHNMYWJlbENvbXBvbmVudCwgTGlic1VpQ29tcG9uZW50c1BvcG92ZXJDb21wb25lbnQsXG4gICAgTGlic1VpQ29tcG9uZW50c0F2YXRhckNvbXBvbmVudCwgTGlic1VpQ29tcG9uZW50c0xpc3RDb21wb25lbnQsXG4gICAgTGlic1VpQ29tcG9uZW50c0Ryb3Bkb3duVGFic0NvbXBvbmVudFxuICBdXG59KVxuZXhwb3J0IGNsYXNzIExpYnNVaUNvbXBvbmVudHNEcm9wZG93bkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgLyogUFJPUEVSVFkgKi9cbiAgcHJvdGVjdGVkIGVycm9yID0gc2lnbmFsPElWYWxpZCB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcHJvdGVjdGVkIHNob3dMaXN0ID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJvdGVjdGVkIGl0ZW1zU2VsZWN0ZWQgPSBzaWduYWw8YW55Pih1bmRlZmluZWQpO1xuICBwcm90ZWN0ZWQgbG9hZGluZ0RldGFpbCA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHByb3RlY3RlZCBsb2FkaW5nTGlzdCA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHByb3RlY3RlZCBpdGVtcyA9IHNpZ25hbDxBcnJheTxhbnk+PihbXSk7XG4gIHByb3RlY3RlZCBmaWVsZExhYmVsID0gc2lnbmFsPHN0cmluZz4oJ2xhYmVsRGlzcGxheScpO1xuICBwcm90ZWN0ZWQgcG9wb3Zlckl0ZW1TZWxlY3RlZCA9IHNpZ25hbDxJUG9wb3ZlciB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcHJvdGVjdGVkIGxhYmVsSXRlbVNlbGVjdGVkQ29tcHV0ZWQgPSBjb21wdXRlZCh0aGlzLmdldExhYmVsSXRlbVNlbGVjdGVkLmJpbmQodGhpcykpO1xuXG4gIHByaXZhdGUga2V5c1NlbGVjdGVkID0gc2lnbmFsPEFycmF5PGFueT4+KFtdKTtcbiAgcHJpdmF0ZSBwb3BvdmVyRnVuY3Rpb25Db250cm9sID0gc2lnbmFsPElQb3BvdmVyRnVuY3Rpb25Db250cm9sRXZlbnQgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHByaXZhdGUgZmllbGRLZXkgPSBzaWduYWw8c3RyaW5nPignaWQnKTtcbiAgcHJpdmF0ZSBsaXN0RnVuY3Rpb25Db250cm9sID0gc2lnbmFsPElMaXN0RnVuY3Rpb25Db250cm9sRXZlbnQgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHByaXZhdGUgc2VsZWN0ZWRLZXlCeUlucHV0ID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcblxuICAvKiBJTlBVVCAqL1xuICByZWFkb25seSB1c2VYc3NGaWx0ZXIgPSBpbnB1dDxib29sZWFuPihmYWxzZSk7XG4gIHJlYWRvbmx5IHBvcG92ZXJFbGVtZW50UmVmQ3VzdG9tID0gaW5wdXQ8SFRNTEVsZW1lbnQ+KCk7XG4gIHJlYWRvbmx5IGNsYXNzSW5jbHVkZSA9IGlucHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgaWdub3JlU3RvcFByb3BhZ2F0aW9uRXZlbnQgPSBpbnB1dDxib29sZWFuPihmYWxzZSk7XG4gIHJlYWRvbmx5IGZsYWdNb3VzZSA9IG1vZGVsPElGbGFnTW91c2U+KHsgaXNNb3VzZUVudGVyOiBmYWxzZSwgaXNNb3VzZUVudGVyQ29udGVudDogZmFsc2UgfSk7XG4gIHJlYWRvbmx5IGZsYWdNb3VzZUNvbnRlbnQgPSBtb2RlbDxJRmxhZ01vdXNlPigpO1xuICByZWFkb25seSBwb3BvdmVyQ3VzdG9tQ29uZmlnID0gaW5wdXQ8SVBvcG92ZXJDdXN0b21Db25maWc+KCk7XG4gIHJlYWRvbmx5IGlzTmdDb250ZW50ID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgekluZGV4ID0gaW5wdXQ8bnVtYmVyPigpO1xuICByZWFkb25seSBjb252ZXJ0SXRlbVNlbGVjdGVkID0gaW5wdXQ8KGl0ZW06IGFueSwgdHJhbnNsYXRlPzogVHJhbnNsYXRlU2VydmljZSkgPT4gdm9pZD4odGhpcy5kZWZhdWx0Q29udmVydEl0ZW1TZWxlY3RlZC5iaW5kKHRoaXMpKTtcbiAgcmVhZG9ubHkgZ2V0UG9wb3Zlckl0ZW1TZWxlY3RlZCA9IGlucHV0PChpdGVtOiBhbnksIHRyYW5zbGF0ZT86IFRyYW5zbGF0ZVNlcnZpY2UpID0+IFByb21pc2U8SVBvcG92ZXIgfCB1bmRlZmluZWQ+PigpO1xuICByZWFkb25seSBodHRwUmVxdWVzdERldGFpbEl0ZW1CeUlkID0gaW5wdXQ8SUh0dHBSZXF1ZXN0Q29uZmlnPigpO1xuICByZWFkb25seSBsZW5ndGhLZXlzID0gbW9kZWw8bnVtYmVyPigwKTtcbiAgcmVhZG9ubHkgdGV4dERpc3BsYXlXaGVuTm9TZWxlY3QgPSBpbnB1dDxzdHJpbmc+KCdpMThuX3NlbGVjdF92YWx1ZScpO1xuICByZWFkb25seSB0ZXh0RGlzcGxheVdoZW5NdWx0aVNlbGVjdCA9IGlucHV0PHN0cmluZz4oJ2kxOG5fc2VsZWN0aW5nX29wdGlvbnMnKTtcbiAgcmVhZG9ubHkgY2xhc3NJbmNsdWRlVGV4dERpc3BsYXlXaGVuTm9TZWxlY3QgPSBpbnB1dDxzdHJpbmc+KCdsaWJzLXVpLWZvbnQtaDVyJyk7XG4gIHJlYWRvbmx5IGZpZWxkR2V0TGFiZWwgPSBpbnB1dDxzdHJpbmc+KCk7XG4gIHJlYWRvbmx5IGxhYmVsUG9wb3ZlckNvbmZpZyA9IGlucHV0PElQb3BvdmVyT3ZlcmxheT4oKTtcbiAgcmVhZG9ubHkgbGFiZWxQb3BvdmVyRnVsbFdpZHRoID0gaW5wdXQ8Ym9vbGVhbj4odHJ1ZSk7XG4gIHJlYWRvbmx5IGhhc0NvbnRlbnRVbml0UmlnaHQgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBsaXN0U2VhcmNoTm9EYXRhVGVtcGxhdGVSZWYgPSBpbnB1dDxUZW1wbGF0ZVJlZjx1bmtub3duPj4oKTtcbiAgcmVhZG9ubHkgZmllbGRHZXRJbWFnZSA9IGlucHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgaW1hZ2VTaXplID0gaW5wdXQ8VFlQRV9TSVpFX0FWQVRBUl9DT05GSUc+KDE2KTtcbiAgcmVhZG9ubHkgdHlwZVNoYXBlID0gaW5wdXQ8VFlQRV9TSEFQRV9BVkFUQVI+KCdjaXJjbGUnKTtcbiAgcmVhZG9ubHkgZmllbGRHZXRJY29uID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBmaWVsZEdldFRleHRBdmF0YXIgPSBpbnB1dDxzdHJpbmc+KCd1c2VybmFtZScpO1xuICByZWFkb25seSBmaWVsZEdldENvbG9yQXZhdGFyID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBjbGFzc0F2YXRhckluY2x1ZGUgPSBpbnB1dDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4oJ21yLVs4cHhdJywgeyB0cmFuc2Zvcm06IHZhbHVlID0+IHZhbHVlIHx8ICdtci1bOHB4XScgfSk7XG4gIHJlYWRvbmx5IGdldExhc3RUZXh0QWZ0ZXJTcGFjZSA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGxpbmtJbWFnZUVycm9yID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBzaG93RXJyb3IgPSBpbnB1dDxib29sZWFuPih0cnVlKTtcbiAgcmVhZG9ubHkgc2hvd0JvcmRlckVycm9yID0gbW9kZWw8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgZGlzYWJsZSA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IHJlYWRvbmx5ID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgbGFiZWxDb25maWcgPSBpbnB1dDxJTGFiZWw+KCk7XG4gIHJlYWRvbmx5IGxpc3RTZWFyY2hDb25maWcgPSBpbnB1dDxJSW5wdXRTZWFyY2hDb25maWc+KCk7XG4gIHJlYWRvbmx5IGxpc3RIaWRkZW5JbnB1dFNlYXJjaCA9IGlucHV0PGJvb2xlYW4+KClcbiAgcmVhZG9ubHkgbGlzdFNlYXJjaFBhZGRpbmcgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBsaXN0S2V5U2VhcmNoID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBsaXN0RGl2aWRlckNsYXNzSW5jbHVkZSA9IGlucHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgbGlzdENvbmZpZyA9IGlucHV0PElMaXN0Vmlld0NvbmZpZ0l0ZW0+KCk7XG4gIHJlYWRvbmx5IGxpc3RCdXR0b25zT3RoZXIgPSBpbnB1dDxBcnJheTxJQnV0dG9uPj4oKTtcbiAgcmVhZG9ubHkgbGlzdEhhc0J1dHRvblVuU2VsZWN0T3B0aW9uID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgbGlzdENsaWNrRXhhY3RseSA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGxpc3RCYWNrZ3JvdW5kQ3VzdG9tID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBsaXN0TWF4SXRlbVNob3cgPSBpbnB1dDxudW1iZXI+KDYsKTtcbiAgcmVhZG9ubHkgbGlzdEtleVNlbGVjdGVkID0gbW9kZWw8c3RyaW5nPigpO1xuICByZWFkb25seSBsaXN0TXVsdGlLZXlTZWxlY3RlZCA9IG1vZGVsPEFycmF5PHN0cmluZz4+KCk7XG4gIHJlYWRvbmx5IGxpc3RLZXlzRGlzYWJsZSA9IGlucHV0PEFycmF5PHN0cmluZz4+KCk7IC8vIGtow7RuZyBkw7luZyBnacOhIHRy4buLIG7DoHkga+G6v3QgaOG7o3AgduG7m2kgdGVtcGxhdGUgY2hlY2tib3ggY8OzIGNvbmZpZyBjaOG7qWEgY29uZmlnQ2hlY2tib3hDaGVja0FsbFxuICByZWFkb25seSBsaXN0S2V5c0hpZGRlbiA9IGlucHV0PEFycmF5PHN0cmluZz4+KCk7IC8vIGtow7RuZyBkw7luZyBnacOhIHRy4buLIG7DoHkga+G6v3QgaOG7o3AgduG7m2kgdGVtcGxhdGUgY2hlY2tib3ggY8OzIGNvbmZpZyBjaOG7qWEgY29uZmlnQ2hlY2tib3hDaGVja0FsbFxuICByZWFkb25seSB2YWxpZFJlcXVpcmVkID0gaW5wdXQ8SVZhbGlkPigpO1xuICByZWFkb25seSB2YWxpZE1heEl0ZW1TZWxlY3RlZCA9IGlucHV0PElWYWxpZE1heEl0ZW1TZWxlY3RlZD4oKTtcbiAgcmVhZG9ubHkgY2hhbmdlVmFsaWRVbmRlZmluZWRSZXNldEVycm9yID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgYWxsb3dTZWxlY3RJdGVtTXVsdGlwbGUgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBsaXN0Vmlld0Z1bmN0aW9uQ3VzdG9tQWRkRGF0YVRvU3RvcmUgPSBpbnB1dDwoZGF0YTogYW55LCBzdG9yZTogYW55KSA9PiB2b2lkPigpO1xuICByZWFkb25seSBmb2N1c0lucHV0U2VhcmNoID0gaW5wdXQ8Ym9vbGVhbj4odHJ1ZSk7XG4gIHJlYWRvbmx5IG9ubHlFbWl0RGF0YVdoZW5SZXNldCA9IGlucHV0PGJvb2xlYW4+KCk7IC8vIHRydWUga2hpIG114buRbiBlbWl0IHPhu7Ega2nhu4duIHRoYXkgxJHhu5VpIGtleVxuICByZWFkb25seSByZXNldEtleVdoZW5TZWxlY3RBbGxLZXkgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBsaXN0Q29uZmlnSGFzRGl2aWRlciA9IGlucHV0PGJvb2xlYW4+KHRydWUpO1xuICByZWFkb25seSBjbGFzc0luY2x1ZGVJY29uID0gaW5wdXQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KCdtbC1bOHB4XScsIHsgdHJhbnNmb3JtOiB2YWx1ZSA9PiB2YWx1ZSB8fCAnbWwtWzhweF0nIH0pO1xuICByZWFkb25seSBjbGFzc0luY2x1ZGVDb250ZW50ID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBsaXN0SWdub3JlQ2xhc3NEaXNhYmxlRGVmYXVsdFdoZW5Vc2VLZXlzRGlzYWJsZUl0ZW0gPSBpbnB1dDxib29sZWFuPigpOyAvLyBi4buPIGNo4bq/IMSR4buZIGRpc2FibGUgaXRlbSB0csOqbiBodG1sIGxpc3QgdmlldyDEkeG7gyBkaXNhYmxlIHThu6tuZyBwaOG6p24gdHJvbmcgcm93c1xuICByZWFkb25seSB0YWJLZXlBY3RpdmUgPSBtb2RlbDxzdHJpbmc+KCk7XG4gIHJlYWRvbmx5IHRhYnNDb25maWcgPSBpbnB1dDxBcnJheTxJRHJvcGRvd25UYWJzSXRlbT4+KCk7XG4gIHJlYWRvbmx5IGlnbm9yZUJvcmRlckJvdHRvbSA9IGlucHV0PGJvb2xlYW4+KCk7XG5cbiAgLyogT1VUUFVUICovXG4gIHJlYWRvbmx5IG91dFNlbGVjdEtleSA9IG91dHB1dDxJRW1pdFNlbGVjdEtleSB8IHVuZGVmaW5lZD4oKTsgLy8gc+G7rSBk4bulbmcgY2hvIHR5cGUgY2jhu41uIDEuXG4gIHJlYWRvbmx5IG91dFNlbGVjdE11bHRpS2V5ID0gb3V0cHV0PElFbWl0TXVsdGlLZXkgfCB1bmRlZmluZWQ+KCk7IC8vIHPhu60gZOG7pW5nIGNobyB0eXBlIGNobyBwaMOpcCBjaOG7jW4gbmhp4buBdS5cbiAgcmVhZG9ubHkgb3V0RnVuY3Rpb25zQ29udHJvbCA9IG91dHB1dDxJRHJvcGRvd25GdW5jdGlvbkNvbnRyb2xFdmVudD4oKTtcbiAgcmVhZG9ubHkgb3V0VmFsaWRFdmVudCA9IG91dHB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBvdXRDaGFuZ1N0YWdlRmxhZ01vdXNlID0gb3V0cHV0PElGbGFnTW91c2U+KCk7XG4gIHJlYWRvbmx5IG91dERhdGFDaGFuZ2UgPSBvdXRwdXQ8QXJyYXk8YW55Pj4oKTtcbiAgcmVhZG9ubHkgb3V0Q2xpY2tCdXR0b25PdGhlciA9IG91dHB1dDxJQnV0dG9uPigpO1xuICByZWFkb25seSBvdXRTaG93TGlzdCA9IG91dHB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBvdXRDaGFuZ2VUYWJLZXlBY3RpdmUgPSBvdXRwdXQ8c3RyaW5nIHwgdW5kZWZpbmVkPigpO1xuXG4gIC8qIElOSkVDVCovXG4gIHByaXZhdGUgdHJhbnNsYXRlID0gaW5qZWN0KFRyYW5zbGF0ZVNlcnZpY2UpO1xuICBwcml2YXRlIGh0dHBSZXF1ZXN0U2VydmljZSA9IGluamVjdChMaWJzVWlIdHRwUmVxdWVzdFNlcnZpY2UpO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCBsaXN0Q29uZmlnID0gdGhpcy5saXN0Q29uZmlnKCk7XG4gICAgICBpZiAobGlzdENvbmZpZykge1xuICAgICAgICB1bnRyYWNrZWQoKCkgPT4gdGhpcy5maWVsZEtleS5zZXQoZ2V0RmllbGRLZXlCeVR5cGUobGlzdENvbmZpZywgJ2lkJykgYXMgc3RyaW5nKSk7XG4gICAgICB9XG4gICAgfSlcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMubGlzdEtleVNlbGVjdGVkKCkgJiYgIXRoaXMuaXRlbXNTZWxlY3RlZCgpKSB7XG4gICAgICAgIHVudHJhY2tlZCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5zZWxlY3RlZEtleUJ5SW5wdXQuc2V0KHRydWUpXG4gICAgICAgICAgdGhpcy5oYW5kbGVyU2VsZWN0ZWRLZXkoeyBrZXk6IHRoaXMubGlzdEtleVNlbGVjdGVkKCksIGl0ZW06IHVuZGVmaW5lZCwgaXNDbGlja01hbnVhbDogZmFsc2UgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLmNoYW5nZVZhbGlkVW5kZWZpbmVkUmVzZXRFcnJvcigpICYmIHRoaXMudmFsaWRSZXF1aXJlZCgpKSB7XG4gICAgICAgIHVudHJhY2tlZCgoKSA9PiB0aGlzLnJlc2V0RXJyb3IoKSk7XG4gICAgICB9XG4gICAgfSlcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMubGlzdE11bHRpS2V5U2VsZWN0ZWQoKSkge1xuICAgICAgICB1bnRyYWNrZWQoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHByZXZpb3VzVmFsdWUgPSB0aGlzLmtleXNTZWxlY3RlZCgpIHx8IFtdO1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHRoaXMubGlzdE11bHRpS2V5U2VsZWN0ZWQoKSB8fCBbXTtcblxuICAgICAgICAgIGlmIChwcmV2aW91c1ZhbHVlLmxlbmd0aCAhPT0gY3VycmVudFZhbHVlLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVyU2VsZWN0TXVsdGlLZXkoeyBrZXlzOiBjdXJyZW50VmFsdWUsIG1hcEtleXM6IFtdLCBpc0NsaWNrTWFudWFsOiBmYWxzZSB9KTtcblxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmb3IgKGNvbnN0IGtleVByZXZpb3VzIG9mIHByZXZpb3VzVmFsdWUpIHtcbiAgICAgICAgICAgIGlmICghY3VycmVudFZhbHVlLnNvbWUoa2V5Q3VycmVudCA9PiBrZXlDdXJyZW50ID09PSBrZXlQcmV2aW91cykpIHtcbiAgICAgICAgICAgICAgdGhpcy5oYW5kbGVyU2VsZWN0TXVsdGlLZXkoeyBrZXlzOiBjdXJyZW50VmFsdWUsIG1hcEtleXM6IFtdLCBpc0NsaWNrTWFudWFsOiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBhc3luYyBuZ09uSW5pdCgpIHtcbiAgICBjb25zdCBsaXN0Q29uZmlnID0gdGhpcy5saXN0Q29uZmlnKCk7XG4gICAgaWYgKCF0aGlzLmxlbmd0aEtleXMoKSAmJiBsaXN0Q29uZmlnICYmIChsaXN0Q29uZmlnLmF1dG9TZWxlY3RGaXJzdEl0ZW0gfHwgbGlzdENvbmZpZy5jb25maWdUZW1wbGF0ZUNoZWNrYm94Py5hdXRvU2VsZWN0QWxsSXRlbSB8fCBsaXN0Q29uZmlnLmNvbmZpZ1RlbXBsYXRlR3JvdXA/LmZsYXRJdGVtc1N1cHBvcnRBdXRvU2VsZWN0KSAmJiBsaXN0Q29uZmlnLmh0dHBSZXF1ZXN0RGF0YSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5sb2FkaW5nRGV0YWlsLnNldCh0cnVlKTtcbiAgICAgICAgY29uc3QgaHR0cFJlcXVlc3REYXRhID0gbGlzdENvbmZpZy5odHRwUmVxdWVzdERhdGE7XG4gICAgICAgIGNvbnN0IHsgYXJndW1lbnRzVmFsdWUsIGd1aWRlQXV0b1VwZGF0ZUFyZ3VtZW50c1ZhbHVlIH0gPSBodHRwUmVxdWVzdERhdGE7XG4gICAgICAgIHRoaXMuaHR0cFJlcXVlc3RTZXJ2aWNlLnVwZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHNWYWx1ZSwgeyAuLi50aGlzLmh0dHBSZXF1ZXN0U2VydmljZS5mYWtlUmVzcG9uc2VQYWdpbmdBcGkoKSwgZHJvcGRvd25UYWJLZXlBY3RpdmU6IHRoaXMudGFiS2V5QWN0aXZlIH0sIHt9LCAnJywgdHJ1ZSwgZmFsc2UsIGd1aWRlQXV0b1VwZGF0ZUFyZ3VtZW50c1ZhbHVlKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5odHRwUmVxdWVzdFNlcnZpY2UuY2FsbEFwaShodHRwUmVxdWVzdERhdGEpO1xuICAgICAgICB0aGlzLmxvYWRpbmdEZXRhaWwuc2V0KGZhbHNlKTtcbiAgICAgICAgaWYgKHJlc3VsdD8uZGF0YSkge1xuICAgICAgICAgIHRoaXMuaXRlbXMuc2V0KHJlc3VsdC5kYXRhKTtcbiAgICAgICAgICB0aGlzLmVtaXRBdXRvU2VsZWN0S2V5KHJlc3VsdC5kYXRhLCBsaXN0Q29uZmlnLnR5cGUpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XG4gICAgICAgIHRoaXMuaXRlbXMuc2V0KFtdKTtcbiAgICAgICAgdGhpcy5sb2FkaW5nRGV0YWlsLnNldChmYWxzZSk7XG4gICAgICB9XG4gICAgICB0aGlzLm91dERhdGFDaGFuZ2UuZW1pdCh0aGlzLml0ZW1zKCkpO1xuICAgIH1cbiAgICB0aGlzLm91dEZ1bmN0aW9uc0NvbnRyb2wuZW1pdCh7XG4gICAgICByZXNldDogdGhpcy5yZXNldC5iaW5kKHRoaXMpLFxuICAgICAgdmFsaWQ6IHRoaXMudmFsaWQuYmluZCh0aGlzKSxcbiAgICAgIHJlc2V0RXJyb3I6IHRoaXMucmVzZXRFcnJvci5iaW5kKHRoaXMpLFxuICAgICAgc2V0TWVzc2FnZUVycm9yOiB0aGlzLnNldE1lc3NhZ2VFcnJvci5iaW5kKHRoaXMpLFxuICAgICAgcmVtb3ZlTGlzdDogYXN5bmMgKCkgPT4gdGhpcy5wb3BvdmVyRnVuY3Rpb25Db250cm9sKCk/LnJlbW92ZVBvcG92ZXJPdmVybGF5KCksXG4gICAgICBnZXREaXNhYmxlOiBhc3luYyAoKSA9PiB0aGlzLmRpc2FibGUoKSA/PyBmYWxzZSxcbiAgICAgIHVwZGF0ZUxhYmVsSXRlbVNlbGVjdGVkOiBhc3luYyAobGFiZWwpID0+IHRoaXMuaXRlbXNTZWxlY3RlZC51cGRhdGUodmFsdWUgPT4gKHsgLi4udmFsdWUsIFt0aGlzLmZpZWxkTGFiZWwoKV06IHRoaXMudHJhbnNsYXRlLmluc3RhbnQobGFiZWwpIH0pKSxcbiAgICAgIHJlZnJlc2hMaXN0OiBhc3luYyAoKSA9PiB0aGlzLmxpc3RGdW5jdGlvbkNvbnRyb2woKT8ucmVmcmVzaCgpLFxuICAgICAgc2V0SXRlbVNlbGVjdGVkQnlLZXk6IHRoaXMuc2V0SXRlbVNlbGVjdGVkQnlLZXkuYmluZCh0aGlzKVxuICAgIH0pO1xuICAgIHRoaXMuY2hlY2tWYWxpZCh0cnVlKTtcbiAgfVxuXG4gIC8qIEZVTkNUSU9OUyAqL1xuICBwcml2YXRlIGRlZmF1bHRDb252ZXJ0SXRlbVNlbGVjdGVkKGl0ZW06IGFueSkge1xuICAgIGlmICghaXRlbSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBmaWVsZEdldExhYmVsID0gdGhpcy5maWVsZEdldExhYmVsKCk7XG4gICAgY29uc3QgdmFsdWUgPSBmaWVsZEdldExhYmVsID8gZ2V0KGl0ZW0sIGZpZWxkR2V0TGFiZWwpIDogdW5kZWZpbmVkO1xuICAgIHNldChpdGVtLCB0aGlzLmZpZWxkTGFiZWwoKSwgdmFsdWUgPz8gaXRlbS5sYWJlbCA/PyBpdGVtLm5hbWUgPz8gJyAnKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TGFiZWxJdGVtU2VsZWN0ZWQoKSB7XG4gICAgbGV0IGxhYmVsID0gJyAnO1xuICAgIGlmICghdGhpcy5sZW5ndGhLZXlzKCkpIHtcbiAgICAgIGxhYmVsID0gdGhpcy50ZXh0RGlzcGxheVdoZW5Ob1NlbGVjdCgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5sZW5ndGhLZXlzKCkgPiAxKSB7XG4gICAgICBsYWJlbCA9IHRoaXMudGV4dERpc3BsYXlXaGVuTXVsdGlTZWxlY3QoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMubGVuZ3RoS2V5cygpID09PSAxKSB7XG4gICAgICBsYWJlbCA9IHRoaXMuaXRlbXNTZWxlY3RlZCgpW3RoaXMuZmllbGRMYWJlbCgpXSB8fCB0aGlzLnRleHREaXNwbGF5V2hlbk5vU2VsZWN0KCk7XG4gICAgfVxuICAgIHJldHVybiBsYWJlbDtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdEF1dG9TZWxlY3RLZXkoaXRlbXM6IEFycmF5PGFueT4sIHR5cGU6IFRZUEVfVEVNUExBVEUpIHtcbiAgICBjb25zdCBsaXN0Q29uZmlnID0gdGhpcy5saXN0Q29uZmlnKCk7XG4gICAgaWYgKCFpdGVtcyB8fCAhaXRlbXMubGVuZ3RoIHx8ICFsaXN0Q29uZmlnIHx8ICghbGlzdENvbmZpZy5hdXRvU2VsZWN0Rmlyc3RJdGVtICYmICFsaXN0Q29uZmlnLmNvbmZpZ1RlbXBsYXRlQ2hlY2tib3g/LmF1dG9TZWxlY3RBbGxJdGVtICYmICFsaXN0Q29uZmlnLmNvbmZpZ1RlbXBsYXRlR3JvdXA/LmZsYXRJdGVtc1N1cHBvcnRBdXRvU2VsZWN0KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBmbGF0SXRlbXNTdXBwb3J0QXV0b1NlbGVjdCA9IGxpc3RDb25maWcuY29uZmlnVGVtcGxhdGVHcm91cD8uZmxhdEl0ZW1zU3VwcG9ydEF1dG9TZWxlY3Q7XG4gICAgaWYgKHR5cGUgPT09ICdncm91cCcgJiYgZmxhdEl0ZW1zU3VwcG9ydEF1dG9TZWxlY3QpIHtcbiAgICAgIGl0ZW1zID0gZmxhdEl0ZW1zU3VwcG9ydEF1dG9TZWxlY3QoaXRlbXMpO1xuICAgIH1cbiAgICBpZiAobGlzdENvbmZpZy5hdXRvU2VsZWN0Rmlyc3RJdGVtKSB7XG4gICAgICBjb25zdCBpdGVtID0gaXRlbXNbMF07XG4gICAgICBjb25zdCBrZXkgPSBpdGVtW3RoaXMuZmllbGRLZXkoKV07XG4gICAgICBpZiAodHlwZSA9PT0gJ3JhZGlvJyB8fCB0eXBlID09PSAndGV4dCcpIHtcbiAgICAgICAgdGhpcy5oYW5kbGVyU2VsZWN0ZWRLZXkoeyBrZXksIGl0ZW0sIGlzQ2xpY2tNYW51YWw6IGZhbHNlIH0pO1xuICAgICAgICB0aGlzLmxpc3RLZXlTZWxlY3RlZC5zZXQoa2V5KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5oYW5kbGVyU2VsZWN0TXVsdGlLZXkoeyBrZXlzOiBba2V5XSwgbWFwS2V5czogW3sga2V5LCBpdGVtLCBpc0NsaWNrTWFudWFsOiBmYWxzZSB9XSwgaXNDbGlja01hbnVhbDogZmFsc2UgfSk7XG4gICAgICB0aGlzLmxpc3RNdWx0aUtleVNlbGVjdGVkLnNldChba2V5XSk7XG4gICAgfVxuICAgIGlmICh0eXBlICE9PSAnY2hlY2tib3gnICYmIHR5cGUgIT09ICdncm91cCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qga2V5czogQXJyYXk8c3RyaW5nPiA9IFtdO1xuICAgIGNvbnN0IG1hcEtleXM6IEFycmF5PGFueT4gPSBbXTtcbiAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgY29uc3Qga2V5ID0gaXRlbVt0aGlzLmZpZWxkS2V5KCldO1xuICAgICAgaWYgKGlzTmlsKGtleSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgICBtYXBLZXlzLnB1c2goeyBrZXksIGl0ZW0sIGlzQ2xpY2tNYW51YWw6IGZhbHNlIH0pO1xuICAgIH0pO1xuICAgIHRoaXMuaGFuZGxlclNlbGVjdE11bHRpS2V5KHsga2V5cywgbWFwS2V5cywgaXNDbGlja01hbnVhbDogZmFsc2UgfSk7XG4gICAgdGhpcy5saXN0TXVsdGlLZXlTZWxlY3RlZC5zZXQoa2V5cyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckV2ZW50KHR5cGU6IFRZUEVfUE9QT1ZFUl9FVkVOVCkge1xuICAgIGlmICh0eXBlID09PSAnY2xpY2snKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0eXBlID09PSAncmVtb3ZlJykge1xuICAgICAgdGhpcy5zaG93TGlzdC5zZXQoZmFsc2UpO1xuICAgICAgdGhpcy5vdXRTaG93TGlzdC5lbWl0KHRoaXMuc2hvd0xpc3QoKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc2hvd0xpc3Quc2V0KHRydWUpO1xuICAgIHRoaXMub3V0U2hvd0xpc3QuZW1pdCh0aGlzLnNob3dMaXN0KCkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJEYXRhQ2hhbmdlKGl0ZW1zOiBBcnJheTxhbnk+KSB7XG4gICAgdGhpcy5pdGVtcy5zZXQoaXRlbXMpO1xuICAgIHRoaXMucG9wb3ZlckZ1bmN0aW9uQ29udHJvbCgpPy51cGRhdGVQb3BvdmVyT3ZlcmxheVBvc2l0aW9uKCk7XG4gICAgdGhpcy5vdXREYXRhQ2hhbmdlLmVtaXQodGhpcy5pdGVtcygpKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyQ2hhbmdlRmxhZ01vdXNlKGV2ZW50OiBJRmxhZ01vdXNlKSB7XG4gICAgdGhpcy5mbGFnTW91c2VDb250ZW50LnNldChldmVudCk7XG4gICAgdGhpcy5tZXJnZUZsYWdNb3VzZSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJDbGlja0J1dHRvbk90aGVyKGJ1dHRvbjogSUJ1dHRvbikge1xuICAgIHRoaXMub3V0Q2xpY2tCdXR0b25PdGhlci5lbWl0KGJ1dHRvbik7XG4gICAgdGhpcy5wb3BvdmVyRnVuY3Rpb25Db250cm9sKCk/LnJlbW92ZVBvcG92ZXJPdmVybGF5KCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlclBvcG92ZXJDb250cm9sRXZlbnQoZXZlbnQ6IElQb3BvdmVyRnVuY3Rpb25Db250cm9sRXZlbnQpIHtcbiAgICB0aGlzLnBvcG92ZXJGdW5jdGlvbkNvbnRyb2wuc2V0KGV2ZW50KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVyU2VsZWN0ZWRLZXkoZXZlbnQ6IElMaXN0RGF0YUVtaXRLZXkgfCB1bmRlZmluZWQsIGV2ZW50RnJvbUxpc3QgPSBmYWxzZSkge1xuICAgIGNvbnN0IGtleSA9IGV2ZW50Py5rZXkgYXMgc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IGl0ZW0gPSBldmVudD8uaXRlbTtcbiAgICB0aGlzLmxlbmd0aEtleXMuc2V0KCEoaXNOaWwoa2V5KSB8fCAodHlwZW9mIGtleSA9PT0gJ3N0cmluZycgJiYga2V5ID09PSAnJykpID8gMSA6IDApO1xuICAgIHRoaXMubGlzdEtleVNlbGVjdGVkLnNldChrZXkpO1xuICAgIGlmICghdGhpcy5hbGxvd1NlbGVjdEl0ZW1NdWx0aXBsZSgpICYmIHRoaXMuaXRlbXNTZWxlY3RlZCgpICYmIHRoaXMuaXRlbXNTZWxlY3RlZCgpW3RoaXMuZmllbGRLZXkoKV0gPT09IGtleSkge1xuICAgICAgdGhpcy5zZWxlY3RlZEtleUJ5SW5wdXQuc2V0KGZhbHNlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkS2V5QnlJbnB1dCgpKSB7XG4gICAgICBpZiAoIShpc05pbChrZXkpIHx8ICh0eXBlb2Yga2V5ID09PSAnc3RyaW5nJyAmJiBrZXkgPT09ICcnKSkgJiYgKGl0ZW0gfHwgdGhpcy5pdGVtc1NlbGVjdGVkKCkpKSB7XG4gICAgICAgIHRoaXMucG9wb3ZlckZ1bmN0aW9uQ29udHJvbCgpPy5yZW1vdmVQb3BvdmVyT3ZlcmxheSgpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZXZlbnRGcm9tTGlzdCkge1xuICAgICAgdGhpcy5zZWxlY3RlZEtleUJ5SW5wdXQuc2V0KGZhbHNlKTtcbiAgICB9XG4gICAgdGhpcy5jaGVja1ZhbGlkKCk7XG4gICAgaWYgKHRoaXMubGVuZ3RoS2V5cygpICYmICFpdGVtICYmIHRoaXMuaHR0cFJlcXVlc3REZXRhaWxJdGVtQnlJZCgpKSB7XG4gICAgICBsZXQgaXRlbVNlbGVjdGVkID0gYXdhaXQgdGhpcy5zZXRJdGVtU2VsZWN0ZWRCeUtleShrZXkpO1xuICAgICAgaWYgKCFpdGVtU2VsZWN0ZWQpIHtcbiAgICAgICAgaXRlbVNlbGVjdGVkID0ge1xuICAgICAgICAgIFt0aGlzLmZpZWxkS2V5KCldOiBrZXksXG4gICAgICAgICAgW3RoaXMuZmllbGRMYWJlbCgpXTogQ0hBUkFDVEVSX0RBVEFfRU1QVFlcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5pdGVtc1NlbGVjdGVkLnNldChpdGVtU2VsZWN0ZWQpO1xuICAgICAgfVxuICAgICAgaWYgKGV2ZW50KSB7XG4gICAgICAgIGV2ZW50Lml0ZW0gPSBpdGVtU2VsZWN0ZWQ7XG4gICAgICB9XG4gICAgICB0aGlzLm91dFNlbGVjdEtleS5lbWl0KHsgLi4uZXZlbnQsIHRhYktleUFjdGl2ZTogdGhpcy50YWJLZXlBY3RpdmUoKSB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5pdGVtc1NlbGVjdGVkLnNldChjbG9uZURlZXAoaXRlbSkpO1xuICAgIHRoaXMuYnVpbGREaXNwbGF5KCk7XG4gICAgdGhpcy5vdXRTZWxlY3RLZXkuZW1pdCh7IC4uLmV2ZW50LCB0YWJLZXlBY3RpdmU6IHRoaXMudGFiS2V5QWN0aXZlKCkgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlclNlbGVjdE11bHRpS2V5KGV2ZW50OiBJTGlzdERhdGFFbWl0TXVsdGlLZXkgfCB1bmRlZmluZWQsIGlzQ2xpY2tNYW51YWwgPSBmYWxzZSkge1xuICAgIGlmICh0aGlzLmxpc3RDb25maWcoKT8uY29uZmlnVGVtcGxhdGVHcm91cD8uc2luZ2xlU2VsZWN0SXRlbSAmJiBldmVudD8ubWFwS2V5cz8ubGVuZ3RoKSB7XG4gICAgICBjb25zdCBpdGVtQ2xpY2tNYW51YWwgPSBldmVudC5tYXBLZXlzLmZpbmQobWFwS2V5ID0+IG1hcEtleS5pdGVtICYmIG1hcEtleS5pdGVtLmlzQ2hlY2tNYW51YWwpO1xuICAgICAgaWYgKGl0ZW1DbGlja01hbnVhbCkge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IGl0ZW1DbGlja01hbnVhbC5pdGVtLmlzQ2hlY2tNYW51YWwgPSBmYWxzZSk7XG4gICAgICAgIGV2ZW50LmtleXMgPSBbaXRlbUNsaWNrTWFudWFsLmtleV07XG4gICAgICAgIGV2ZW50Lm1hcEtleXMgPSBbaXRlbUNsaWNrTWFudWFsXTtcbiAgICAgICAgdGhpcy5wb3BvdmVyRnVuY3Rpb25Db250cm9sKCk/LnJlbW92ZVBvcG92ZXJPdmVybGF5KCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMua2V5c1NlbGVjdGVkLnNldChbLi4uKGV2ZW50Py5rZXlzIHx8IFtdKV0pO1xuICAgIHRoaXMubGlzdE11bHRpS2V5U2VsZWN0ZWQuc2V0KFsuLi4oZXZlbnQ/LmtleXMgfHwgW10pIGFzIEFycmF5PHN0cmluZz5dKTtcbiAgICB0aGlzLmxlbmd0aEtleXMuc2V0KGV2ZW50Py5rZXlzPy5sZW5ndGggfHwgMCk7XG4gICAgdGhpcy5jaGVja1ZhbGlkKCk7XG4gICAgaWYgKHRoaXMubGVuZ3RoS2V5cygpID4gMSkge1xuICAgICAgdGhpcy5vdXRTZWxlY3RNdWx0aUtleS5lbWl0KHsgLi4uKGV2ZW50IHx8IHt9KSwgaXNDbGlja01hbnVhbCwgdGFiS2V5QWN0aXZlOiB0aGlzLnRhYktleUFjdGl2ZSgpIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBrZXkgPSBldmVudD8ua2V5c1swXTtcbiAgICBsZXQgaXRlbSA9IGV2ZW50Py5tYXBLZXlzPy5maW5kKGl0ZW0gPT4gaXRlbS5rZXkgPT09IGtleSk/Lml0ZW07XG5cbiAgICBpZiAodGhpcy5sZW5ndGhLZXlzKCkgJiYgIWl0ZW0gJiYgdGhpcy5odHRwUmVxdWVzdERldGFpbEl0ZW1CeUlkKCkpIHtcbiAgICAgIGl0ZW0gPSBhd2FpdCB0aGlzLnNldEl0ZW1TZWxlY3RlZEJ5S2V5KGtleSk7XG4gICAgICB0aGlzLm91dFNlbGVjdE11bHRpS2V5LmVtaXQoeyBrZXlzOiBba2V5XSwgbWFwS2V5czogW3sga2V5LCBpdGVtIH1dLCBpc0NsaWNrTWFudWFsLCB0YWJLZXlBY3RpdmU6IHRoaXMudGFiS2V5QWN0aXZlKCkgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuaXRlbXNTZWxlY3RlZC5zZXQoY2xvbmVEZWVwKGl0ZW0pKTtcbiAgICB0aGlzLmJ1aWxkRGlzcGxheSgpO1xuICAgIHRoaXMub3V0U2VsZWN0TXVsdGlLZXkuZW1pdCh7IC4uLihldmVudCB8fCB7fSksIGlzQ2xpY2tNYW51YWwsIHRhYktleUFjdGl2ZTogdGhpcy50YWJLZXlBY3RpdmUoKSB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2V0SXRlbVNlbGVjdGVkQnlLZXkoa2V5OiBhbnkpIHtcbiAgICBjb25zb2xlLmxvZyhrZXkpO1xuXG4gICAgY29uc3QgaHR0cFJlcXVlc3REZXRhaWxJdGVtQnlJZCA9IHRoaXMuaHR0cFJlcXVlc3REZXRhaWxJdGVtQnlJZCgpO1xuICAgIGlmICghaHR0cFJlcXVlc3REZXRhaWxJdGVtQnlJZCB8fCB0aGlzLmxvYWRpbmdEZXRhaWwoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgdGhpcy5sb2FkaW5nRGV0YWlsLnNldCh0cnVlKTtcbiAgICAgIGNvbnN0IHsgYXJndW1lbnRzVmFsdWUsIGd1aWRlQXV0b1VwZGF0ZUFyZ3VtZW50c1ZhbHVlIH0gPSBodHRwUmVxdWVzdERldGFpbEl0ZW1CeUlkO1xuICAgICAgdGhpcy5odHRwUmVxdWVzdFNlcnZpY2UudXBkYXRlQXJndW1lbnRzKGFyZ3VtZW50c1ZhbHVlLCB7IGtleSwgZHJvcGRvd25UYWJLZXlBY3RpdmU6IHRoaXMudGFiS2V5QWN0aXZlKCkgfSwge30sICcnLCBmYWxzZSwgZmFsc2UsIGd1aWRlQXV0b1VwZGF0ZUFyZ3VtZW50c1ZhbHVlKTtcbiAgICAgIGNvbnNvbGUubG9nKGh0dHBSZXF1ZXN0RGV0YWlsSXRlbUJ5SWQpO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmh0dHBSZXF1ZXN0U2VydmljZS5jYWxsQXBpKGh0dHBSZXF1ZXN0RGV0YWlsSXRlbUJ5SWQpO1xuICAgICAgY29uc3QgaXRlbSA9IGNsb25lRGVlcChyZXN1bHQuZGF0YVswXSB8fCByZXN1bHQuZGF0YSk7XG4gICAgICB0aGlzLml0ZW1zU2VsZWN0ZWQuc2V0KGl0ZW0pO1xuICAgICAgdGhpcy5idWlsZERpc3BsYXkoKTtcbiAgICAgIHRoaXMubG9hZGluZ0RldGFpbC5zZXQoZmFsc2UpO1xuICAgICAgcmV0dXJuIGl0ZW07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcbiAgICAgIHRoaXMubG9hZGluZ0RldGFpbC5zZXQoZmFsc2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyQ2hhbmdlVGFiKCkge1xuICAgIHRoaXMub3V0Q2hhbmdlVGFiS2V5QWN0aXZlLmVtaXQodGhpcy50YWJLZXlBY3RpdmUoKSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckxvYWRpbmdMaXN0KGV2ZW50OiBib29sZWFuKSB7XG4gICAgdGhpcy5sb2FkaW5nTGlzdC5zZXQoZXZlbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzZXRNZXNzYWdlRXJyb3IoZXJyb3I6IHN0cmluZykge1xuICAgIHRoaXMuZXJyb3Iuc2V0KHsgbWVzc2FnZTogZXJyb3IgfSk7XG4gICAgdGhpcy5zaG93Qm9yZGVyRXJyb3Iuc2V0KHRydWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB2YWxpZCgpIHtcbiAgICBpZiAodGhpcy5lcnJvcigpPy5tZXNzYWdlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNoZWNrVmFsaWQoKTtcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tWYWxpZCh2YWxpZGF0ZURlZmF1bHQ/OiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgdGhpcy5lcnJvci5zZXQodW5kZWZpbmVkKTtcbiAgICBjb25zdCB2YWxpZCA9IHsgcmVxdWlyZWQ6IHRydWUsIGxpbWl0TWF4SXRlbVNlbGVjdDogdHJ1ZSB9O1xuICAgIGNvbnN0IHZhbGlkTWF4SXRlbVNlbGVjdGVkID0gdGhpcy52YWxpZE1heEl0ZW1TZWxlY3RlZCgpO1xuICAgIGlmICh0aGlzLnZhbGlkUmVxdWlyZWQoKSAmJiAhdGhpcy5sZW5ndGhLZXlzKCkpIHtcbiAgICAgIHZhbGlkLnJlcXVpcmVkID0gZmFsc2U7XG4gICAgfVxuICAgIGlmICh2YWxpZE1heEl0ZW1TZWxlY3RlZCAmJiB0aGlzLmxlbmd0aEtleXMoKSA+IHZhbGlkTWF4SXRlbVNlbGVjdGVkLnZhbHVlKSB7XG4gICAgICB2YWxpZC5saW1pdE1heEl0ZW1TZWxlY3QgPSBmYWxzZTtcbiAgICB9XG4gICAgaWYgKCF2YWxpZGF0ZURlZmF1bHQgJiYgdmFsaWQucmVxdWlyZWQgPT09IGZhbHNlKSB7XG4gICAgICBjb25zdCB2YWxpZFJlcXVpcmVkID0gdGhpcy52YWxpZFJlcXVpcmVkKCk7XG4gICAgICB0aGlzLmVycm9yLnNldCh7IC4uLih2YWxpZFJlcXVpcmVkIHx8IHt9KSwgbWVzc2FnZTogdmFsaWRSZXF1aXJlZD8ubWVzc2FnZSB8fCBFUlJPUl9NRVNTQUdFX0VNUFRZX1ZBTElEIH0pO1xuICAgIH1cbiAgICBpZiAoIXZhbGlkYXRlRGVmYXVsdCAmJiAhdGhpcy5lcnJvcigpICYmIHZhbGlkLmxpbWl0TWF4SXRlbVNlbGVjdCA9PT0gZmFsc2UpIHtcbiAgICAgIGNvbnN0IHZhbGlkTWF4SXRlbVNlbGVjdGVkID0gdGhpcy52YWxpZE1heEl0ZW1TZWxlY3RlZCgpO1xuICAgICAgdGhpcy5lcnJvci5zZXQoeyAuLi4odmFsaWRNYXhJdGVtU2VsZWN0ZWQgfHwge30pLCBtZXNzYWdlOiB2YWxpZE1heEl0ZW1TZWxlY3RlZD8ubWVzc2FnZSB8fCBFUlJPUl9NRVNTQUdFX01BWF9WQUxJRCwgaW50ZXJwb2xhdGVQYXJhbXM6IHsgdmFsdWU6IHZhbGlkTWF4SXRlbVNlbGVjdGVkPy52YWx1ZSB8fCAxMCB9IH0pXG4gICAgfVxuICAgIHRoaXMub3V0VmFsaWRFdmVudC5lbWl0KHZhbGlkLnJlcXVpcmVkICYmIHZhbGlkLmxpbWl0TWF4SXRlbVNlbGVjdCk7XG4gICAgcmV0dXJuIHZhbGlkLnJlcXVpcmVkICYmIHZhbGlkLmxpbWl0TWF4SXRlbVNlbGVjdDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVzZXRFcnJvcigpIHtcbiAgICB0aGlzLmVycm9yLnNldCh1bmRlZmluZWQpO1xuICAgIHRoaXMuc2hvd0JvcmRlckVycm9yLnNldChmYWxzZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckxpc3RGdW5jdGlvbnNDb250cm9sKGV2ZW50OiBJTGlzdEZ1bmN0aW9uQ29udHJvbEV2ZW50KSB7XG4gICAgdGhpcy5saXN0RnVuY3Rpb25Db250cm9sLnNldChldmVudCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckNoYW5nU3RhZ2VGbGFnTW91c2UoZmxhZzogSUZsYWdNb3VzZSkge1xuICAgIHRoaXMuZmxhZ01vdXNlLnNldChmbGFnKTtcbiAgICB0aGlzLm1lcmdlRmxhZ01vdXNlKCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlc2V0KCkge1xuICAgIHRoaXMuaXRlbXNTZWxlY3RlZC5zZXQodW5kZWZpbmVkKTtcbiAgICB0aGlzLmxlbmd0aEtleXMuc2V0KDApO1xuICAgIHRoaXMubGlzdEZ1bmN0aW9uQ29udHJvbCgpPy5yZXNldEtleVNlbGVjdGVkKCk7XG4gICAgaWYgKCF0aGlzLnNob3dMaXN0KCkgJiYgdGhpcy5vbmx5RW1pdERhdGFXaGVuUmVzZXQoKSkge1xuICAgICAgdGhpcy5vdXRTZWxlY3RLZXkuZW1pdCh1bmRlZmluZWQpO1xuICAgICAgdGhpcy5vdXRTZWxlY3RNdWx0aUtleS5lbWl0KHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIHRoaXMubGlzdEtleVNlbGVjdGVkLnNldCh1bmRlZmluZWQpO1xuICAgIHRoaXMubGlzdE11bHRpS2V5U2VsZWN0ZWQuc2V0KHVuZGVmaW5lZCk7XG4gICAgdGhpcy5rZXlzU2VsZWN0ZWQuc2V0KFtdKTtcbiAgICB0aGlzLmVycm9yLnNldCh1bmRlZmluZWQpO1xuICAgIHRoaXMuc2VsZWN0ZWRLZXlCeUlucHV0LnNldChmYWxzZSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGJ1aWxkRGlzcGxheSgpIHtcbiAgICBpZiAodGhpcy5pdGVtc1NlbGVjdGVkKCkpIHtcbiAgICAgIHRoaXMuY29udmVydEl0ZW1TZWxlY3RlZCgpKHRoaXMuaXRlbXNTZWxlY3RlZCgpLCB0aGlzLnRyYW5zbGF0ZSk7XG4gICAgICBjb25zdCBnZXRQb3BvdmVySXRlbVNlbGVjdGVkID0gdGhpcy5nZXRQb3BvdmVySXRlbVNlbGVjdGVkKCk7XG4gICAgICBpZiAoZ2V0UG9wb3Zlckl0ZW1TZWxlY3RlZCkge1xuICAgICAgICB0aGlzLnBvcG92ZXJJdGVtU2VsZWN0ZWQuc2V0KGF3YWl0IGdldFBvcG92ZXJJdGVtU2VsZWN0ZWQodGhpcy5pdGVtc1NlbGVjdGVkLCB0aGlzLnRyYW5zbGF0ZSkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbWVyZ2VGbGFnTW91c2UoKSB7XG4gICAgY29uc3QgZmxhZzogSUZsYWdNb3VzZSA9IHsgaXNNb3VzZUVudGVyOiBmYWxzZSwgaXNNb3VzZUVudGVyQ29udGVudDogZmFsc2UsIGlzQ29udGFpbmVySGFzU2Nyb2xsOiBmYWxzZSB9O1xuICAgIGlmICh0aGlzLmZsYWdNb3VzZUNvbnRlbnQoKT8uaXNNb3VzZUVudGVyIHx8IHRoaXMuZmxhZ01vdXNlKCk/LmlzTW91c2VFbnRlcikge1xuICAgICAgZmxhZy5pc01vdXNlRW50ZXIgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAodGhpcy5mbGFnTW91c2VDb250ZW50KCk/LmlzTW91c2VFbnRlckNvbnRlbnQgfHwgdGhpcy5mbGFnTW91c2UoKT8uaXNNb3VzZUVudGVyQ29udGVudCkge1xuICAgICAgZmxhZy5pc01vdXNlRW50ZXJDb250ZW50ID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZmxhZ01vdXNlQ29udGVudCgpPy5pc0NvbnRhaW5lckhhc1Njcm9sbCB8fCB0aGlzLmZsYWdNb3VzZSgpPy5pc0NvbnRhaW5lckhhc1Njcm9sbCkge1xuICAgICAgZmxhZy5pc0NvbnRhaW5lckhhc1Njcm9sbCA9IHRydWU7XG4gICAgfVxuICAgIHRoaXMub3V0Q2hhbmdTdGFnZUZsYWdNb3VzZS5lbWl0KGZsYWcpO1xuICB9XG5cbn1cbiIsIjxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIHctZnVsbFwiPlxuICBAaWYgKGxhYmVsQ29uZmlnKCk7IGFzIGxhYmVsKSB7XG4gICAgPGxpYnNfdWktY29tcG9uZW50cy1sYWJlbCBbY2xhc3NJbmNsdWRlXT1cImxhYmVsLmNsYXNzSW5jbHVkZVwiXG4gICAgICBbbGFiZWxMZWZ0XT1cImxhYmVsLmxhYmVsTGVmdFwiXG4gICAgICBbbGFiZWxMZWZ0Q2xhc3NdPVwibGFiZWwubGFiZWxMZWZ0Q2xhc3NcIlxuICAgICAgW3JlcXVpcmVkXT1cImxhYmVsLnJlcXVpcmVkIFwiXG4gICAgICBbZGVzY3JpcHRpb25dPVwibGFiZWwuZGVzY3JpcHRpb25cIlxuICAgICAgW2Rlc2NyaXB0aW9uQ2xhc3NdPVwibGFiZWwuZGVzY3JpcHRpb25DbGFzc1wiXG4gICAgICBbbGFiZWxSaWdodF09XCJsYWJlbC5sYWJlbFJpZ2h0XCJcbiAgICAgIFtsYWJlbFJpZ2h0Q2xhc3NdPVwibGFiZWwubGFiZWxSaWdodENsYXNzXCJcbiAgICAgIFtvbmx5U2hvd0NvdW50XT1cImxhYmVsLm9ubHlTaG93Q291bnRcIlxuICAgICAgW2J1dHRvbnNMZWZ0XT1cImxhYmVsLmJ1dHRvbnNMZWZ0XCJcbiAgICAgIFtidXR0b25zUmlnaHRdPVwibGFiZWwuYnV0dG9uc1JpZ2h0XCJcbiAgICAgIFtkaXNhYmxlQnV0dG9uc0xlZnRdPVwibGFiZWwuZGlzYWJsZUJ1dHRvbnNMZWZ0IHx8IGRpc2FibGUoKSB8fCBsb2FkaW5nRGV0YWlsKClcIlxuICAgICAgW2Rpc2FibGVCdXR0b25zUmlnaHRdPVwibGFiZWwuZGlzYWJsZUJ1dHRvbnNSaWdodCB8fCBkaXNhYmxlKCkgfHwgbG9hZGluZ0RldGFpbCgpXCJcbiAgICAgIFtoYXNUb2dnbGVdPVwibGFiZWwuaGFzVG9nZ2xlXCJcbiAgICAgIFt0b2dnbGVBY3RpdmVdPVwibGFiZWwudG9nZ2xlQWN0aXZlXCJcbiAgICAgIFt0b2dnbGVEaXNhYmxlXT1cImxhYmVsLnRvZ2dsZURpc2FibGUgfHwgZGlzYWJsZSgpIHx8IGxvYWRpbmdEZXRhaWwoKVwiXG4gICAgICBbcG9wb3Zlcl09XCJsYWJlbC5wb3BvdmVyXCJcbiAgICAgIFtpY29uUG9wb3ZlckNsYXNzXT1cImxhYmVsLmljb25Qb3BvdmVyQ2xhc3NcIlxuICAgICAgW29ubHlTaG93Q291bnRdPVwibGFiZWwub25seVNob3dDb3VudFwiXG4gICAgICBbbGltaXRMZW5ndGhdPVwibGFiZWwubGltaXRMZW5ndGhcIlxuICAgICAgW2J1dHRvbnNEZXNjcmlwdGlvbl09XCJsYWJlbC5idXR0b25zRGVzY3JpcHRpb25cIlxuICAgICAgW2Rpc2FibGVCdXR0b25zRGVzY3JpcHRpb25dPVwibGFiZWwuZGlzYWJsZUJ1dHRvbnNEZXNjcmlwdGlvbiB8fCBkaXNhYmxlKClcIlxuICAgICAgW2J1dHRvbnNEZXNjcmlwdGlvbkNvbnRhaW5lckNsYXNzXT1cImxhYmVsLmJ1dHRvbnNEZXNjcmlwdGlvbkNvbnRhaW5lckNsYXNzXCJcbiAgICAgIFtjb3VudF09XCJsYWJlbC5jb3VudFwiIC8+XG4gIH1cbiAgPGxpYnNfdWktY29tcG9uZW50cy1wb3BvdmVyIFtpZ25vcmVTaG93UG9wb3Zlcl09XCJkaXNhYmxlKCkgfHwgcmVhZG9ubHkoKSB8fCBsb2FkaW5nRGV0YWlsKClcIlxuICAgIFtjbGFzc109XCJjbGFzc0luY2x1ZGUoKSB8fCAndy1mdWxsJ1wiXG4gICAgW21vZGVdPVwiJ2NsaWNrLXRvZ2dsZSdcIlxuICAgIFtmbGFnTW91c2VdPVwiZmxhZ01vdXNlKClcIlxuICAgIFtpZ25vcmVIaWRkZW5Qb3BvdmVyQ29udGVudFdoZW5Nb3VzZUxlYXZlXT1cInRydWVcIlxuICAgIFtpZ25vcmVDdXJzb3JQb2ludGVyTW9kZUxpa2VDbGlja109XCJ0cnVlXCJcbiAgICBbaWdub3JlU3RvcFByb3BhZ2F0aW9uRXZlbnRdPVwiaWdub3JlU3RvcFByb3BhZ2F0aW9uRXZlbnQoKVwiXG4gICAgW2VsZW1lbnRSZWZDdXN0b21dPVwicG9wb3ZlckVsZW1lbnRSZWZDdXN0b20oKVwiXG4gICAgW2NvbmZpZ109XCJ7XG4gICAgICBhbmltYXRpb25Db25maWc6IHBvcG92ZXJDdXN0b21Db25maWcoKT8uYW5pbWF0aW9uQ29uZmlnIHx8IHt9LFxuICAgICAgekluZGV4OiB6SW5kZXgoKSA/PyAxMDAwLFxuICAgICAgd2lkdGhCeVBhcmVudDogcG9wb3ZlckN1c3RvbUNvbmZpZygpPy53aWR0aEJ5UGFyZW50ID8/IHRydWUsXG4gICAgICBwYXJlbnRCb3JkZXJXaWR0aDogcG9wb3ZlckN1c3RvbUNvbmZpZygpPy5wYXJlbnRCb3JkZXJXaWR0aCA/PyAwLFxuICAgICAgbWF4SGVpZ2h0OiBwb3BvdmVyQ3VzdG9tQ29uZmlnKCk/Lm1heEhlaWdodCA/PyAyMDQ4LFxuICAgICAgbWF4V2lkdGg6IHBvcG92ZXJDdXN0b21Db25maWcoKT8ubWF4V2lkdGggPz8gMjA0OCxcbiAgICAgIGRpcmVjdGlvbjogcG9wb3ZlckN1c3RvbUNvbmZpZygpPy5kaXJlY3Rpb24gPz8gJ2JvdHRvbScsXG4gICAgICB0ZW1wbGF0ZTogbGlzdFZpZXdFbCxcbiAgICAgIHdoaXRlVGhlbWU6IHRydWUsXG4gICAgICB0aW1lckRlc3Ryb3k6IHBvcG92ZXJDdXN0b21Db25maWcoKT8udGltZXJEZXN0cm95ID8/IDAsXG4gICAgICBpZ25vcmVBcnJvdzogcG9wb3ZlckN1c3RvbUNvbmZpZygpPy5pZ25vcmVBcnJvdyA/PyB0cnVlLFxuICAgICAgZGlyZWN0aW9uRGlzdGFuY2U6IDIsXG4gICAgICBjbGFzc0luY2x1ZGU6ICdyb3VuZGVkLVs0cHhdICcgKyAocG9wb3ZlckN1c3RvbUNvbmZpZygpPy5jbGFzc0luY2x1ZGUgPz8gJ2xpYnMtdWktYm9yZGVyLWdlbmVyYWwgJykgKyAoKGxpc3RDb25maWcoKT8udHlwZSA9PT0gJ3RleHQnICYmIGxpc3RDb25maWcoKT8uY29uZmlnVGVtcGxhdGVUZXh0Py5ub3RVc2VWaXJ0dWFsU2Nyb2xsKSA/ICcgb3ZlcmZsb3ctaGlkZGVuJyA6ICcnKSxcbiAgICAgIHBvc2l0aW9uOiBwb3BvdmVyQ3VzdG9tQ29uZmlnKCk/LnBvc2l0aW9uIHx8IHsgbW9kZTogJ3N0YXJ0JywgZGlzdGFuY2U6IDAgfSxcbiAgICAgIHdpZHRoOiBwb3BvdmVyQ3VzdG9tQ29uZmlnKCk/LndpZHRoXG4gICAgfVwiXG4gICAgKG91dEZ1bmN0aW9uc0NvbnRyb2wpPVwiaGFuZGxlclBvcG92ZXJDb250cm9sRXZlbnQoJGV2ZW50KVwiXG4gICAgKG91dEV2ZW50KT1cImhhbmRsZXJFdmVudCgkZXZlbnQpXCJcbiAgICAob3V0Q2hhbmdTdGFnZUZsYWdNb3VzZSk9XCJoYW5kbGVyQ2hhbmdlRmxhZ01vdXNlKCRldmVudClcIj5cbiAgICBAaWYgKCFpc05nQ29udGVudCgpKSB7XG4gICAgICA8ZGl2IFtjbGFzc109XCInbGlicy11aS1kcm9wZG93biAnICsgY2xhc3NJbmNsdWRlQ29udGVudCgpXCJcbiAgICAgICAgW2NsYXNzLmxpYnMtdWktYm9yZGVyLWdlbmVyYWxdPVwiIWVycm9yKCkgJiYgIXNob3dCb3JkZXJFcnJvcigpICYmICFzaG93TGlzdCgpXCJcbiAgICAgICAgW2NsYXNzLmxpYnMtdWktYm9yZGVyLXByaW1hcnktZm9jdXMtZ2VuZXJhbF09XCIhZXJyb3IoKSAmJiAhc2hvd0JvcmRlckVycm9yKCkgJiYgc2hvd0xpc3QoKVwiXG4gICAgICAgIFtjbGFzcy5saWJzLXVpLWJvcmRlci1lcnJvci1nZW5lcmFsXT1cImVycm9yKCkgfHwgc2hvd0JvcmRlckVycm9yKClcIlxuICAgICAgICBbY2xhc3MubGlicy11aS1yZWFkb25seV09XCJyZWFkb25seSgpXCJcbiAgICAgICAgW2NsYXNzLmxpYnMtdWktcmVhZG9ubHktYmFja2dyb3VuZF09XCJyZWFkb25seSgpXCJcbiAgICAgICAgW2NsYXNzLmN1cnNvci1wb2ludGVyXT1cIiEoZGlzYWJsZSgpIHx8IGxvYWRpbmdEZXRhaWwoKSB8fCByZWFkb25seSgpKVwiXG4gICAgICAgIFtjbGFzcy5saWJzLXVpLWRpc2FibGVdPVwiZGlzYWJsZSgpIHx8IGxvYWRpbmdEZXRhaWwoKVwiXG4gICAgICAgIFtjbGFzcy5saWJzLXVpLWRpc2FibGUtYmFja2dyb3VuZF09XCJkaXNhYmxlKCkgfHwgbG9hZGluZ0RldGFpbCgpXCJcbiAgICAgICAgW2NsYXNzLnBvaW50ZXItZXZlbnRzLW5vbmVdPVwibG9hZGluZ0RldGFpbCgpXCJcbiAgICAgICAgW2NsYXNzLnJvdW5kZWQtdHItMF09XCJoYXNDb250ZW50VW5pdFJpZ2h0KClcIlxuICAgICAgICBbY2xhc3Mucm91bmRlZC1ici0wXT1cImhhc0NvbnRlbnRVbml0UmlnaHQoKVwiXG4gICAgICAgIFtjbGFzcy50ZXh0LVsjMDcxNjMxXV09XCJyZWFkb25seSgpXCJcbiAgICAgICAgW2NsYXNzLmJnLVsjZjhmOWZhXV09XCJkaXNhYmxlKCkgfHwgbG9hZGluZ0RldGFpbCgpIHx8IHJlYWRvbmx5KClcIlxuICAgICAgICBbY2xhc3MudGV4dC1bIzljYTJhZF1dPVwiZGlzYWJsZSgpIHx8IGxvYWRpbmdEZXRhaWwoKSB8fCByZWFkb25seSgpXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciB3LWZ1bGxcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgdy1mdWxsIHJlbGF0aXZlXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgdy1mdWxsIGFic29sdXRlXCI+XG4gICAgICAgICAgICAgIEBpZiAobGVuZ3RoS2V5cygpID09PSAxKSB7XG4gICAgICAgICAgICAgICAgQGlmIChpdGVtc1NlbGVjdGVkKCk7IGFzIGl0ZW1zU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICAgIEBpZiAoZmllbGRHZXRJbWFnZSgpOyBhcyBmaWVsZEdldEltYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYXZhdGFyIFtjbGFzc0luY2x1ZGVdPVwiY2xhc3NBdmF0YXJJbmNsdWRlKClcIlxuICAgICAgICAgICAgICAgICAgICAgIFt0eXBlU2hhcGVdPVwidHlwZVNoYXBlKClcIlxuICAgICAgICAgICAgICAgICAgICAgIFtzaXplXT1cImltYWdlU2l6ZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICBbbGlua0F2YXRhcl09XCJpdGVtc1NlbGVjdGVkW2ZpZWxkR2V0SW1hZ2VdXCJcbiAgICAgICAgICAgICAgICAgICAgICBbbGlua0F2YXRhckVycm9yXT1cImxpbmtJbWFnZUVycm9yKClcIlxuICAgICAgICAgICAgICAgICAgICAgIFtpZEdlbkNvbG9yXT1cIml0ZW1zU2VsZWN0ZWRbZmllbGRHZXRDb2xvckF2YXRhcigpIHx8IGZpZWxkR2V0VGV4dEF2YXRhcigpXVwiXG4gICAgICAgICAgICAgICAgICAgICAgW3RleHRBdmF0YXJdPVwiaXRlbXNTZWxlY3RlZFtmaWVsZEdldFRleHRBdmF0YXIoKV1cIlxuICAgICAgICAgICAgICAgICAgICAgIFtnZXRMYXN0VGV4dEFmdGVyU3BhY2VdPVwiZ2V0TGFzdFRleHRBZnRlclNwYWNlKClcIiAvPlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgQGlmIChmaWVsZEdldEljb24oKTsgYXMgZmllbGRHZXRJY29uKSB7XG4gICAgICAgICAgICAgICAgICAgIDxpIFtjbGFzc109XCJpdGVtc1NlbGVjdGVkW2ZpZWxkR2V0SWNvbl0gKyAnIG1yLVs4cHhdJ1wiPjwvaT5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1wb3BvdmVyIFt0eXBlXT1cIid0ZXh0J1wiXG4gICAgICAgICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCIobGFiZWxQb3BvdmVyRnVsbFdpZHRoKCkgPyAndy0xMDAgJyA6ICcnKSArIGNsYXNzSW5jbHVkZVRleHREaXNwbGF5V2hlbk5vU2VsZWN0KClcIlxuICAgICAgICAgICAgICAgIFtpbm5lckhUTUxdPVwibGFiZWxJdGVtU2VsZWN0ZWRDb21wdXRlZCgpIHwgdHJhbnNsYXRlOnt2YWx1ZTogbGVuZ3RoS2V5cygpfSB8IExpYnNVaVBpcGVzU2VjdXJpdHlUcnVzdFBpcGU6J2h0bWwnOnVzZVhzc0ZpbHRlcigpIHwgYXN5bmNcIlxuICAgICAgICAgICAgICAgIFtjb25maWddPVwie21heFdpZHRoOiBsYWJlbFBvcG92ZXJDb25maWcoKT8ubWF4V2lkdGggfHwgMjUwLCBkaXJlY3Rpb246ICd0b3AnLCB6SW5kZXg6IGxhYmVsUG9wb3ZlckNvbmZpZygpPy56SW5kZXgsIHRpbWVyRGVzdHJveTogbGFiZWxQb3BvdmVyQ29uZmlnKCk/LnRpbWVyRGVzdHJveSB8fCAwfVwiXG4gICAgICAgICAgICAgICAgW2lnbm9yZVN0b3BQcm9wYWdhdGlvbkV2ZW50XT1cInRydWVcIiAvPlxuICAgICAgICAgICAgICBAaWYgKHBvcG92ZXJJdGVtU2VsZWN0ZWQoKTsgYXMgcG9wb3Zlckl0ZW1TZWxlY3RlZCkge1xuICAgICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtcG9wb3ZlciBbdHlwZV09XCJwb3BvdmVySXRlbVNlbGVjdGVkLnR5cGUgfHwgJ290aGVyJ1wiXG4gICAgICAgICAgICAgICAgICBbY29uZmlnXT1cInBvcG92ZXJJdGVtU2VsZWN0ZWQuY29uZmlnIHx8IHt9XCI+XG4gICAgICAgICAgICAgICAgICBAaWYgKHBvcG92ZXJJdGVtU2VsZWN0ZWQuZGF0YVZpZXcpIHtcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBbaW5uZXJIdG1sXT1cInBvcG92ZXJJdGVtU2VsZWN0ZWQuZGF0YVZpZXcgfCB0cmFuc2xhdGVcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImxpYnMtdWktaWNvbi10b29sdGlwLW91dGxpbmUgdGV4dC1bMTZweF0gbXgtWzhweF1cIj4gPC9pPlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvbGlic191aS1jb21wb25lbnRzLXBvcG92ZXI+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxpIGNsYXNzPVwidGV4dC1bMTZweF0gbGlicy11aS1pY29uLW1vdmUtcmlnaHQgcm90YXRlLTkwIHt7IGNsYXNzSW5jbHVkZUljb24oKSB9fVwiXG4gICAgICAgICAgICBbY2xhc3MudGV4dC1bIzZhNzM4M11dPVwiIXJlYWRvbmx5KCkgJiYgIWNsYXNzSW5jbHVkZUljb24oKVwiXG4gICAgICAgICAgICBbY2xhc3MudGV4dC1bIzljYTJhZF1dPVwiKHJlYWRvbmx5KCkgfHwgZGlzYWJsZSgpKSAmJiAhY2xhc3NJbmNsdWRlSWNvbigpXCI+PC9pPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIH0gQGVsc2Uge1xuICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgIH1cbiAgPC9saWJzX3VpLWNvbXBvbmVudHMtcG9wb3Zlcj5cbiAgQGlmIChzaG93RXJyb3IoKSkge1xuICAgIEBpZiAoZXJyb3IoKTsgYXMgZXJyb3IpIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJtdC1bOHB4XSB0ZXh0LVsjZWUyZDQxXSBsaWJzLXVpLWZvbnQtaDdyXCJcbiAgICAgICAgW2lubmVySHRtbF09XCIoZXJyb3IubWVzc2FnZSB8fCAnICcpIHwgdHJhbnNsYXRlOihlcnJvci5pbnRlcnBvbGF0ZVBhcmFtcyB8fCB7fSlcIj5cbiAgICAgIDwvZGl2PlxuICAgIH1cbiAgfVxuPC9kaXY+XG48bmctdGVtcGxhdGUgI2xpc3RWaWV3RWw+XG4gIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1wiPlxuICAgIEBpZiAoISF0YWJzQ29uZmlnKSB7XG4gICAgICA8bGlic191aS1jb21wb25lbnRzLWRyb3Bkb3duLXRhYnMgW3RhYnNDb25maWddPVwidGFic0NvbmZpZygpXCJcbiAgICAgICAgWyh0YWJLZXlBY3RpdmUpXT1cInRhYktleUFjdGl2ZVwiXG4gICAgICAgIFtpZ25vcmVCb3JkZXJCb3R0b21dPVwiaWdub3JlQm9yZGVyQm90dG9tKClcIlxuICAgICAgICBbZGlzYWJsZV09XCJkaXNhYmxlKCkgfHwgbG9hZGluZ0RldGFpbCgpIHx8IGxvYWRpbmdMaXN0KClcIlxuICAgICAgICAob3V0Q2hhbmdlKT1cImhhbmRsZXJDaGFuZ2VUYWIoKVwiIC8+XG4gICAgfVxuICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtbGlzdCBbc2VhcmNoQ29uZmlnXT1cImxpc3RTZWFyY2hDb25maWcoKVwiXG4gICAgICBbZHJvcGRvd25UYWJLZXlBY3RpdmVdPVwidGFiS2V5QWN0aXZlKClcIlxuICAgICAgW2tleVNlYXJjaF09XCJsaXN0S2V5U2VhcmNoKClcIlxuICAgICAgW2NvbmZpZ109XCJsaXN0Q29uZmlnKClcIlxuICAgICAgW3BhZGRpbmdMZWZ0SXRlbV09XCJwb3BvdmVyQ3VzdG9tQ29uZmlnKCk/LnBhZGRpbmdMZWZ0SXRlbSA/PyB0cnVlXCJcbiAgICAgIFtkaXNhYmxlXT1cImRpc2FibGUoKSB8fCBsb2FkaW5nRGV0YWlsKClcIlxuICAgICAgW2hpZGRlbklucHV0U2VhcmNoXT1cImxpc3RIaWRkZW5JbnB1dFNlYXJjaCgpXCJcbiAgICAgIFtzZWFyY2hQYWRkaW5nXT1cImxpc3RTZWFyY2hQYWRkaW5nKClcIlxuICAgICAgW21heEl0ZW1TaG93XT1cIihsaXN0Q29uZmlnKCk/LnR5cGUgPT09ICd0ZXh0JyAmJiBsaXN0Q29uZmlnKCk/LmNvbmZpZ1RlbXBsYXRlVGV4dD8ubm90VXNlVmlydHVhbFNjcm9sbCkgPyAwIDogbGlzdE1heEl0ZW1TaG93KClcIlxuICAgICAgW2tleVNlbGVjdGVkXT1cImxpc3RLZXlTZWxlY3RlZCgpXCJcbiAgICAgIFttdWx0aUtleVNlbGVjdGVkXT1cImxpc3RNdWx0aUtleVNlbGVjdGVkKClcIlxuICAgICAgW2NsaWNrRXhhY3RseV09XCJwb3BvdmVyQ3VzdG9tQ29uZmlnKCk/LmNsaWNrRXhhY3RseSA/PyBmYWxzZVwiXG4gICAgICBbZGl2aWRlckNsYXNzSW5jbHVkZV09XCJsaXN0U2VhcmNoQ29uZmlnKCkgPyBsaXN0RGl2aWRlckNsYXNzSW5jbHVkZSgpIDogJ2hpZGRlbidcIlxuICAgICAgW2J1dHRvbnNPdGhlcl09XCJsaXN0QnV0dG9uc090aGVyKClcIlxuICAgICAgW2JhY2tncm91bmRMaXN0Q3VzdG9tXT1cImxpc3RCYWNrZ3JvdW5kQ3VzdG9tKClcIlxuICAgICAgW2tleXNEaXNhYmxlSXRlbV09XCJsaXN0S2V5c0Rpc2FibGUoKVwiXG4gICAgICBba2V5c0hpZGRlbkl0ZW1dPVwibGlzdEtleXNIaWRkZW4oKVwiXG4gICAgICBbaGFzQnV0dG9uVW5TZWxlY3RPcHRpb25dPVwibGlzdEhhc0J1dHRvblVuU2VsZWN0T3B0aW9uKCkgPz8gKCFwb3BvdmVyQ3VzdG9tQ29uZmlnKCkgJiYgIWxhYmVsQ29uZmlnKCk/LnJlcXVpcmVkICYmIChsaXN0Q29uZmlnKCk/LnR5cGUgPT09ICd0ZXh0JyB8fCBsaXN0Q29uZmlnKCk/LnR5cGUgPT09ICdyYWRpbycpKVwiXG4gICAgICBbdGVtcGxhdGVSZWZTZWFyY2hOb0RhdGFdPVwibGlzdFNlYXJjaE5vRGF0YVRlbXBsYXRlUmVmKClcIlxuICAgICAgW2ZvY3VzSW5wdXRTZWFyY2hdPVwiZm9jdXNJbnB1dFNlYXJjaCgpXCJcbiAgICAgIFtmdW5jdGlvbkN1c3RvbUFkZERhdGFUb1N0b3JlXT1cImxpc3RWaWV3RnVuY3Rpb25DdXN0b21BZGREYXRhVG9TdG9yZSgpXCJcbiAgICAgIFt6SW5kZXhdPVwiekluZGV4KClcIlxuICAgICAgW3Jlc2V0S2V5V2hlblNlbGVjdEFsbEtleURyb3Bkb3duXT1cInJlc2V0S2V5V2hlblNlbGVjdEFsbEtleSgpXCJcbiAgICAgIFtpZ25vcmVDbGFzc0Rpc2FibGVEZWZhdWx0V2hlblVzZUtleXNEaXNhYmxlSXRlbV09XCJsaXN0SWdub3JlQ2xhc3NEaXNhYmxlRGVmYXVsdFdoZW5Vc2VLZXlzRGlzYWJsZUl0ZW0oKVwiXG4gICAgICBbaGFzRGl2aWRlcl09XCJsaXN0Q29uZmlnSGFzRGl2aWRlcigpXCJcbiAgICAgIChvdXRTZWxlY3RLZXkpPVwiaGFuZGxlclNlbGVjdGVkS2V5KCRldmVudCwgdHJ1ZSlcIlxuICAgICAgKG91dFNlbGVjdE11bHRpS2V5KT1cImhhbmRsZXJTZWxlY3RNdWx0aUtleSgkZXZlbnQsIHRydWUpXCJcbiAgICAgIChvdXRDaGFuZ2VWaWV3KT1cImhhbmRsZXJEYXRhQ2hhbmdlKCRldmVudClcIlxuICAgICAgKG91dENsaWNrQnV0dG9uT3RoZXIpPVwiaGFuZGxlckNsaWNrQnV0dG9uT3RoZXIoJGV2ZW50KVwiXG4gICAgICAob3V0RnVuY3Rpb25zQ29udHJvbCk9XCJoYW5kbGVyTGlzdEZ1bmN0aW9uc0NvbnRyb2woJGV2ZW50KVwiXG4gICAgICAob3V0Q2hhbmdTdGFnZUZsYWdNb3VzZVBvcG92ZXIpPVwiaGFuZGxlckNoYW5nU3RhZ2VGbGFnTW91c2UoJGV2ZW50KVwiXG4gICAgICAob3V0TG9hZGluZyk9XCJoYW5kbGVyTG9hZGluZ0xpc3QoJGV2ZW50KVwiIC8+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==