@libs-ui/components-list 0.2.36
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -0
- package/defines/list.define.d.ts +6 -0
- package/esm2022/defines/list.define.mjs +66 -0
- package/esm2022/highlight-key-search/highlight-key-search.directive.mjs +82 -0
- package/esm2022/index.mjs +3 -0
- package/esm2022/interfaces/config-item.interface.mjs +2 -0
- package/esm2022/interfaces/data-emit.interface.mjs +3 -0
- package/esm2022/interfaces/function-control-event.interface.mjs +2 -0
- package/esm2022/interfaces/index.mjs +6 -0
- package/esm2022/interfaces/tab.interface.mjs +2 -0
- package/esm2022/interfaces/templates-type.type.mjs +2 -0
- package/esm2022/libs-ui-components-list.mjs +5 -0
- package/esm2022/list.component.mjs +329 -0
- package/esm2022/pipes/call-function-in-template.pipe.mjs +28 -0
- package/esm2022/pipes/check-selected-by-key.pipe.mjs +21 -0
- package/esm2022/templates/templates.component.abstract.mjs +336 -0
- package/esm2022/templates/text/text.component.mjs +233 -0
- package/fesm2022/libs-ui-components-list.mjs +1077 -0
- package/fesm2022/libs-ui-components-list.mjs.map +1 -0
- package/highlight-key-search/highlight-key-search.directive.d.ts +13 -0
- package/index.d.ts +2 -0
- package/interfaces/config-item.interface.d.ts +225 -0
- package/interfaces/data-emit.interface.d.ts +10 -0
- package/interfaces/function-control-event.interface.d.ts +9 -0
- package/interfaces/index.d.ts +5 -0
- package/interfaces/tab.interface.d.ts +4 -0
- package/interfaces/templates-type.type.d.ts +1 -0
- package/list.component.d.ts +93 -0
- package/package.json +25 -0
- package/pipes/call-function-in-template.pipe.d.ts +8 -0
- package/pipes/check-selected-by-key.pipe.d.ts +7 -0
- package/templates/templates.component.abstract.d.ts +93 -0
- package/templates/text/text.component.d.ts +24 -0
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-unused-expressions */
|
|
2
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
3
|
+
import { NgTemplateOutlet } from "@angular/common";
|
|
4
|
+
import { ChangeDetectionStrategy, Component, effect, inject, input, output, signal, viewChild } from "@angular/core";
|
|
5
|
+
import { LibsUiComponentsButtonsButtonComponent } from "@libs-ui/components-buttons-button";
|
|
6
|
+
import { LibsUiComponentsInputsSearchComponent } from "@libs-ui/components-inputs-search";
|
|
7
|
+
import { LibsUiComponentsLabelComponent } from "@libs-ui/components-label";
|
|
8
|
+
import { LibsUiComponentsPopoverComponent } from "@libs-ui/components-popover";
|
|
9
|
+
import { LibsUiDynamicComponentService } from "@libs-ui/services-dynamic-component";
|
|
10
|
+
import { cloneDeep, ERROR_MESSAGE_EMPTY_VALID, isEmpty, isNil } from "@libs-ui/utils";
|
|
11
|
+
import { TranslateModule } from "@ngx-translate/core";
|
|
12
|
+
import { Subject, takeUntil, timer } from "rxjs";
|
|
13
|
+
import { getComponentByType, initConfig } from "./defines/list.define";
|
|
14
|
+
import * as i0 from "@angular/core";
|
|
15
|
+
import * as i1 from "@ngx-translate/core";
|
|
16
|
+
export class LibsUiComponentsListComponent {
|
|
17
|
+
/* PROPERTY */
|
|
18
|
+
ERROR_MESSAGE_EMPTY_VALID = ERROR_MESSAGE_EMPTY_VALID;
|
|
19
|
+
disableButtonUnSelectOption = signal(true);
|
|
20
|
+
isErrorRequired = signal(false);
|
|
21
|
+
loading = signal(false);
|
|
22
|
+
keySearchStore = signal(undefined);
|
|
23
|
+
onDestroy = new Subject();
|
|
24
|
+
onSearch = new Subject();
|
|
25
|
+
onRefresh = new Subject();
|
|
26
|
+
onSetHiddenItemByKey = new Subject();
|
|
27
|
+
onSetDataStore = new Subject();
|
|
28
|
+
onItemChangeUnSelect = new Subject();
|
|
29
|
+
onUpdateMultiKeySelectedGroup = new Subject();
|
|
30
|
+
onRemoveItems = new Subject();
|
|
31
|
+
componentRef;
|
|
32
|
+
configData = signal({
|
|
33
|
+
type: 'text',
|
|
34
|
+
configTemplateText: {
|
|
35
|
+
fieldKey: 'id',
|
|
36
|
+
getValue: (item) => {
|
|
37
|
+
return item.label || item.name;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
groupMultiKeySelected = signal([]);
|
|
42
|
+
functionControlInputSearch = signal(undefined);
|
|
43
|
+
/* INPUT */
|
|
44
|
+
hiddenInputSearch = input(false);
|
|
45
|
+
dropdownTabKeyActive = input();
|
|
46
|
+
keySearch = input();
|
|
47
|
+
itemChangeUnSelect = input();
|
|
48
|
+
paddingLeftItem = input();
|
|
49
|
+
config = input.required();
|
|
50
|
+
isSearchOnline = input();
|
|
51
|
+
disable = input();
|
|
52
|
+
disableLabel = input();
|
|
53
|
+
labelConfig = input();
|
|
54
|
+
searchConfig = input({});
|
|
55
|
+
searchPadding = input();
|
|
56
|
+
dividerClassInclude = input();
|
|
57
|
+
hasDivider = input(true);
|
|
58
|
+
buttonsOther = input(undefined);
|
|
59
|
+
hasButtonUnSelectOption = input();
|
|
60
|
+
clickExactly = input();
|
|
61
|
+
backgroundListCustom = input('bg-[#ffffff]');
|
|
62
|
+
maxItemShow = input();
|
|
63
|
+
keySelected = input();
|
|
64
|
+
multiKeySelected = input(undefined); // lưu ý khi sử dụng listview
|
|
65
|
+
keysDisableItem = input(undefined); // không dùng giá trị này kết hợp với template checkbox có config chứa configCheckboxCheckAll
|
|
66
|
+
keysHiddenItem = input(undefined); // không dùng giá trị này kết hợp với template checkbox có config chứa configCheckboxCheckAll
|
|
67
|
+
data = input(undefined);
|
|
68
|
+
focusInputSearch = input();
|
|
69
|
+
skipFocusInputWhenKeySearchStoreUndefined = input();
|
|
70
|
+
functionCustomAddDataToStore = input();
|
|
71
|
+
functionGetItemAutoAddList = input(undefined);
|
|
72
|
+
validRequired = input(undefined);
|
|
73
|
+
showValidateBottom = input();
|
|
74
|
+
zIndex = input();
|
|
75
|
+
loadingIconSize = input(undefined);
|
|
76
|
+
templateRefSearchNoData = input(undefined);
|
|
77
|
+
resetKeyWhenSelectAllKeyDropdown = input();
|
|
78
|
+
ignoreClassDisableDefaultWhenUseKeysDisableItem = input(); // bỏ chế độ disable item trên html để disable từng phần trong rows
|
|
79
|
+
/* OUTPUT */
|
|
80
|
+
outSelectKey = output(); // sử dụng cho type chọn 1
|
|
81
|
+
outSelectMultiKey = output(); // sử dụng cho type cho phép chọn nhiều.
|
|
82
|
+
outUnSelectMultiKey = output(); // sử dụng cho type cho phép chọn nhiều.
|
|
83
|
+
outClickButtonOther = output();
|
|
84
|
+
outFieldKey = output();
|
|
85
|
+
outChangeView = output();
|
|
86
|
+
outLoading = output();
|
|
87
|
+
outFunctionsControl = output();
|
|
88
|
+
outChangStageFlagMousePopover = output();
|
|
89
|
+
outLoadItemsComplete = output();
|
|
90
|
+
/* VIEW CHILD */
|
|
91
|
+
listViewElementRef = viewChild('listViewContainer');
|
|
92
|
+
contentElementRef = viewChild('contentContainer');
|
|
93
|
+
/* INJECT */
|
|
94
|
+
dynamicComponentService = inject(LibsUiDynamicComponentService);
|
|
95
|
+
constructor() {
|
|
96
|
+
effect(() => {
|
|
97
|
+
this.keySearchStore.set(this.keySearch());
|
|
98
|
+
this.onSearch.next(this.keySearch());
|
|
99
|
+
}, { allowSignalWrites: true });
|
|
100
|
+
effect(() => this.onItemChangeUnSelect.next(this.itemChangeUnSelect()));
|
|
101
|
+
effect(() => {
|
|
102
|
+
if (!this.componentRef) {
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
if (!isEmpty(this.keysDisableItem())) {
|
|
106
|
+
this.componentRef.setInput('keysDisableItem', this.keysDisableItem());
|
|
107
|
+
}
|
|
108
|
+
if (!isEmpty(this.keysHiddenItem())) {
|
|
109
|
+
this.onSetHiddenItemByKey.next(this.keysHiddenItem() || []);
|
|
110
|
+
}
|
|
111
|
+
if (!isEmpty(this.disable())) {
|
|
112
|
+
this.componentRef.setInput('disable', this.disable());
|
|
113
|
+
}
|
|
114
|
+
if (!isEmpty(this.data())) {
|
|
115
|
+
this.onSetDataStore.next(this.data() || []);
|
|
116
|
+
}
|
|
117
|
+
if (!isEmpty(this.keySelected())) {
|
|
118
|
+
this.componentRef.setInput('keySelected', this.keySelected());
|
|
119
|
+
}
|
|
120
|
+
if (this.configData()?.type !== 'group' && !isEmpty(this.multiKeySelected())) {
|
|
121
|
+
this.componentRef.setInput('multiKeySelected', this.multiKeySelected());
|
|
122
|
+
}
|
|
123
|
+
if (this.configData()?.type === 'group' && !isEmpty(this.multiKeySelected())) {
|
|
124
|
+
this.componentRef.setInput('multiKeySelected', this.multiKeySelected());
|
|
125
|
+
this.onUpdateMultiKeySelectedGroup.next();
|
|
126
|
+
}
|
|
127
|
+
}, { allowSignalWrites: true });
|
|
128
|
+
effect(() => {
|
|
129
|
+
this.refresh();
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
ngOnInit() {
|
|
133
|
+
this.outFunctionsControl.emit({
|
|
134
|
+
checkIsValid: this.checkIsValid.bind(this),
|
|
135
|
+
refresh: this.refresh.bind(this),
|
|
136
|
+
resetKeySelected: this.handlerRemoveKeySelected.bind(this),
|
|
137
|
+
getRectListView: async () => this.listViewElementRef()?.nativeElement.getBoundingClientRect(),
|
|
138
|
+
removeItems: async (keys) => this.onRemoveItems.next(keys)
|
|
139
|
+
});
|
|
140
|
+
const config = this.config();
|
|
141
|
+
if (config) {
|
|
142
|
+
this.configData.set(this.cloneConfig(config));
|
|
143
|
+
}
|
|
144
|
+
initConfig(this.configData());
|
|
145
|
+
const compClass = getComponentByType(this.configData().type);
|
|
146
|
+
this.componentRef = this.dynamicComponentService.resolveComponentFactory(compClass);
|
|
147
|
+
// const instance = this.componentRef.instance;
|
|
148
|
+
timer(0).pipe(takeUntil(this.onDestroy)).subscribe(() => {
|
|
149
|
+
this.dynamicComponentService.addToElement(this.componentRef, this.contentElementRef()?.nativeElement);
|
|
150
|
+
});
|
|
151
|
+
this.componentRef.setInput('onSetDataStore', this.onSetDataStore);
|
|
152
|
+
this.componentRef.setInput('onSetHiddenItemByKey', this.onSetHiddenItemByKey);
|
|
153
|
+
this.componentRef.setInput('config', this.configData());
|
|
154
|
+
if (this.searchConfig()) {
|
|
155
|
+
this.componentRef.setInput('searchConfig', this.searchConfig());
|
|
156
|
+
}
|
|
157
|
+
this.componentRef.setInput('onSearch', this.onSearch);
|
|
158
|
+
this.componentRef.setInput('onRefresh', this.onRefresh);
|
|
159
|
+
this.componentRef.setInput('keySearch', this.keySearchStore() ?? '');
|
|
160
|
+
this.componentRef.setInput('dropdownTabKeyActive', this.dropdownTabKeyActive());
|
|
161
|
+
this.componentRef.setInput('clickExactly', this.clickExactly() || false);
|
|
162
|
+
this.componentRef.setInput('disable', this.disable());
|
|
163
|
+
this.componentRef.setInput('paddingLeftItem', this.paddingLeftItem());
|
|
164
|
+
this.componentRef.setInput('resetKeyWhenSelectAllKeyDropdown', this.resetKeyWhenSelectAllKeyDropdown());
|
|
165
|
+
this.componentRef.setInput('ignoreClassDisableDefaultWhenUseKeysDisableItem', this.ignoreClassDisableDefaultWhenUseKeysDisableItem());
|
|
166
|
+
this.componentRef.setInput('functionCustomAddDataToStore', this.functionCustomAddDataToStore());
|
|
167
|
+
this.componentRef.setInput('functionGetItemAutoAddList', this.functionGetItemAutoAddList());
|
|
168
|
+
timer(0).pipe(takeUntil(this.onDestroy)).subscribe(() => {
|
|
169
|
+
if (this.data()) {
|
|
170
|
+
this.onSetDataStore.next(this.data() || []);
|
|
171
|
+
}
|
|
172
|
+
});
|
|
173
|
+
if (this.maxItemShow()) {
|
|
174
|
+
this.componentRef.setInput('maxItemShow', this.maxItemShow());
|
|
175
|
+
}
|
|
176
|
+
this.componentRef.setInput('keySelected', this.keySelected());
|
|
177
|
+
if (this.multiKeySelected()) {
|
|
178
|
+
this.componentRef.setInput('multiKeySelected', this.multiKeySelected());
|
|
179
|
+
}
|
|
180
|
+
this.componentRef.setInput('keysDisableItem', this.keysDisableItem() || []);
|
|
181
|
+
this.componentRef.setInput('keysHiddenItem', this.keysHiddenItem() || []);
|
|
182
|
+
if (!isNil(this.keySelected()) || this.multiKeySelected()?.length) {
|
|
183
|
+
this.disableButtonUnSelectOption.set(false);
|
|
184
|
+
}
|
|
185
|
+
this.componentRef.setInput('onItemChangeUnSelect', this.onItemChangeUnSelect);
|
|
186
|
+
this.componentRef.setInput('onUpdateMultiKeySelectedGroup', this.onUpdateMultiKeySelectedGroup);
|
|
187
|
+
this.componentRef.setInput('onRemoveItems', this.onRemoveItems);
|
|
188
|
+
this.componentRef.setInput('zIndex', this.zIndex());
|
|
189
|
+
this.componentRef.setInput('isSearchOnline', this.isSearchOnline());
|
|
190
|
+
this.componentRef.setInput('disableLabel', this.disableLabel() || false);
|
|
191
|
+
this.componentRef.setInput('loadingIconSize', this.loadingIconSize());
|
|
192
|
+
this.componentRef.setInput('templateRefSearchNoData', this.templateRefSearchNoData());
|
|
193
|
+
let keySearch = '';
|
|
194
|
+
const instance = this.componentRef.instance;
|
|
195
|
+
instance.outChangeView.subscribe(data => {
|
|
196
|
+
this.outChangeView.emit(data);
|
|
197
|
+
if (this.skipFocusInputWhenKeySearchStoreUndefined() && isNil(this.keySearchStore)) {
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
if (this.focusInputSearch() && this.keySearchStore() !== keySearch) {
|
|
201
|
+
keySearch = this.keySearchStore() || '';
|
|
202
|
+
this.functionControlInputSearch()?.focus();
|
|
203
|
+
}
|
|
204
|
+
});
|
|
205
|
+
instance.outSelectKey.subscribe(data => {
|
|
206
|
+
this.disableButtonUnSelectOption.set(false);
|
|
207
|
+
this.outSelectKey.emit(data);
|
|
208
|
+
this.checkIsValid();
|
|
209
|
+
});
|
|
210
|
+
instance.outFieldKey.subscribe((fieldKey) => {
|
|
211
|
+
this.outFieldKey.emit(fieldKey);
|
|
212
|
+
});
|
|
213
|
+
instance.outLoading.subscribe((loading) => {
|
|
214
|
+
this.loading.set(loading);
|
|
215
|
+
this.outLoading.emit(loading);
|
|
216
|
+
});
|
|
217
|
+
instance.outLoadItemsComplete.subscribe((event) => {
|
|
218
|
+
this.outLoadItemsComplete.emit(event);
|
|
219
|
+
});
|
|
220
|
+
if (this.config() && this.config()?.configTemplateText && this.config()?.configTemplateText?.actionSort) {
|
|
221
|
+
instance.outSortSingleSelect.subscribe(itemSort => {
|
|
222
|
+
const config = this.config();
|
|
223
|
+
if (config && config.configTemplateText && config.configTemplateText?.actionSort) {
|
|
224
|
+
config.configTemplateText.itemSort = itemSort;
|
|
225
|
+
config.configTemplateText.actionSort(itemSort);
|
|
226
|
+
}
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
instance.outChangStageFlagMousePopover.subscribe((flag) => {
|
|
230
|
+
this.outChangStageFlagMousePopover.emit(flag);
|
|
231
|
+
});
|
|
232
|
+
const type = this.configData()?.type;
|
|
233
|
+
if (type === 'text' || type === 'radio') {
|
|
234
|
+
return;
|
|
235
|
+
}
|
|
236
|
+
instance.outSelectMultiKey.subscribe(data => {
|
|
237
|
+
this.disableButtonUnSelectOption.set(false);
|
|
238
|
+
if (type === 'group') {
|
|
239
|
+
this.groupMultiKeySelected.set(data.keys);
|
|
240
|
+
}
|
|
241
|
+
this.outSelectMultiKey.emit(data);
|
|
242
|
+
this.checkIsValid();
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
handlerSearch(keySearch) {
|
|
246
|
+
this.keySearchStore.set(keySearch);
|
|
247
|
+
this.onSearch.next(keySearch);
|
|
248
|
+
}
|
|
249
|
+
async handlerRemoveKeySelected() {
|
|
250
|
+
if (!this.componentRef) {
|
|
251
|
+
return;
|
|
252
|
+
}
|
|
253
|
+
this.outSelectKey.emit(undefined);
|
|
254
|
+
this.outSelectMultiKey.emit(undefined);
|
|
255
|
+
this.componentRef.setInput('keySelected', '');
|
|
256
|
+
this.componentRef.setInput('multiKeySelected', undefined);
|
|
257
|
+
this.disableButtonUnSelectOption.set(true);
|
|
258
|
+
await this.checkIsValid();
|
|
259
|
+
}
|
|
260
|
+
handlerClickButtonOther(button) {
|
|
261
|
+
this.outClickButtonOther.emit(button);
|
|
262
|
+
}
|
|
263
|
+
handlerFunctionControlInputSearch(event) {
|
|
264
|
+
this.functionControlInputSearch.set(event);
|
|
265
|
+
}
|
|
266
|
+
async checkIsValid() {
|
|
267
|
+
if (!this.validRequired || !this.config()?.type || !this.componentRef?.instance) {
|
|
268
|
+
this.isErrorRequired.set(false);
|
|
269
|
+
return true;
|
|
270
|
+
}
|
|
271
|
+
const type = this.config()?.type;
|
|
272
|
+
let hasKey = !isEmpty(this.componentRef.instance.multiKeySelected);
|
|
273
|
+
if (type === 'group') {
|
|
274
|
+
hasKey = !isEmpty(this.groupMultiKeySelected);
|
|
275
|
+
}
|
|
276
|
+
if (type === 'text' || type === 'radio') {
|
|
277
|
+
hasKey = !isNil(this.componentRef.instance.keySelected);
|
|
278
|
+
}
|
|
279
|
+
this.isErrorRequired.set(!hasKey);
|
|
280
|
+
return hasKey;
|
|
281
|
+
}
|
|
282
|
+
async refresh() {
|
|
283
|
+
const config = this.config();
|
|
284
|
+
if (!config) {
|
|
285
|
+
return;
|
|
286
|
+
}
|
|
287
|
+
this.dropdownTabKeyActive();
|
|
288
|
+
Object.assign(this.configData, this.cloneConfig(config));
|
|
289
|
+
this.onRefresh.next();
|
|
290
|
+
}
|
|
291
|
+
cloneConfig(configInput) {
|
|
292
|
+
if (!configInput) {
|
|
293
|
+
return {};
|
|
294
|
+
}
|
|
295
|
+
const serviceOther = configInput.httpRequestData?.serviceOther;
|
|
296
|
+
const serviceOtherRequestAllIdSelectOrUnSelect = configInput.configTemplateCheckbox?.httpRequestAllIdSelectOrUnSelect?.serviceOther;
|
|
297
|
+
serviceOther && delete configInput.httpRequestData?.serviceOther;
|
|
298
|
+
serviceOtherRequestAllIdSelectOrUnSelect && delete configInput.configTemplateCheckbox?.httpRequestAllIdSelectOrUnSelect?.serviceOther;
|
|
299
|
+
const config = cloneDeep(configInput);
|
|
300
|
+
serviceOther && config.httpRequestData && (config.httpRequestData.serviceOther = serviceOther);
|
|
301
|
+
serviceOtherRequestAllIdSelectOrUnSelect && config.configTemplateCheckbox?.httpRequestAllIdSelectOrUnSelect && (config.configTemplateCheckbox.httpRequestAllIdSelectOrUnSelect.serviceOther = serviceOtherRequestAllIdSelectOrUnSelect);
|
|
302
|
+
serviceOther && configInput.httpRequestData && (configInput.httpRequestData.serviceOther = serviceOther);
|
|
303
|
+
serviceOtherRequestAllIdSelectOrUnSelect && configInput.configTemplateCheckbox?.httpRequestAllIdSelectOrUnSelect && (configInput.configTemplateCheckbox.httpRequestAllIdSelectOrUnSelect.serviceOther = serviceOtherRequestAllIdSelectOrUnSelect);
|
|
304
|
+
return config;
|
|
305
|
+
}
|
|
306
|
+
ngOnDestroy() {
|
|
307
|
+
this.outLoading.emit(false);
|
|
308
|
+
this.dynamicComponentService.remove(this.componentRef);
|
|
309
|
+
this.onRefresh.complete();
|
|
310
|
+
this.onSearch.complete();
|
|
311
|
+
this.onSetHiddenItemByKey.complete();
|
|
312
|
+
this.onUpdateMultiKeySelectedGroup.complete();
|
|
313
|
+
this.onDestroy.next();
|
|
314
|
+
this.onDestroy.complete();
|
|
315
|
+
}
|
|
316
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LibsUiComponentsListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
317
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: LibsUiComponentsListComponent, isStandalone: true, selector: "libs_ui-components-list", inputs: { hiddenInputSearch: { classPropertyName: "hiddenInputSearch", publicName: "hiddenInputSearch", isSignal: true, isRequired: false, transformFunction: null }, dropdownTabKeyActive: { classPropertyName: "dropdownTabKeyActive", publicName: "dropdownTabKeyActive", isSignal: true, isRequired: false, transformFunction: null }, keySearch: { classPropertyName: "keySearch", publicName: "keySearch", isSignal: true, isRequired: false, transformFunction: null }, itemChangeUnSelect: { classPropertyName: "itemChangeUnSelect", publicName: "itemChangeUnSelect", isSignal: true, isRequired: false, transformFunction: null }, paddingLeftItem: { classPropertyName: "paddingLeftItem", publicName: "paddingLeftItem", isSignal: true, isRequired: false, transformFunction: null }, config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: true, transformFunction: null }, isSearchOnline: { classPropertyName: "isSearchOnline", publicName: "isSearchOnline", isSignal: true, isRequired: false, transformFunction: null }, disable: { classPropertyName: "disable", publicName: "disable", isSignal: true, isRequired: false, transformFunction: null }, disableLabel: { classPropertyName: "disableLabel", publicName: "disableLabel", isSignal: true, isRequired: false, transformFunction: null }, labelConfig: { classPropertyName: "labelConfig", publicName: "labelConfig", isSignal: true, isRequired: false, transformFunction: null }, searchConfig: { classPropertyName: "searchConfig", publicName: "searchConfig", isSignal: true, isRequired: false, transformFunction: null }, searchPadding: { classPropertyName: "searchPadding", publicName: "searchPadding", isSignal: true, isRequired: false, transformFunction: null }, dividerClassInclude: { classPropertyName: "dividerClassInclude", publicName: "dividerClassInclude", isSignal: true, isRequired: false, transformFunction: null }, hasDivider: { classPropertyName: "hasDivider", publicName: "hasDivider", isSignal: true, isRequired: false, transformFunction: null }, buttonsOther: { classPropertyName: "buttonsOther", publicName: "buttonsOther", isSignal: true, isRequired: false, transformFunction: null }, hasButtonUnSelectOption: { classPropertyName: "hasButtonUnSelectOption", publicName: "hasButtonUnSelectOption", isSignal: true, isRequired: false, transformFunction: null }, clickExactly: { classPropertyName: "clickExactly", publicName: "clickExactly", isSignal: true, isRequired: false, transformFunction: null }, backgroundListCustom: { classPropertyName: "backgroundListCustom", publicName: "backgroundListCustom", isSignal: true, isRequired: false, transformFunction: null }, maxItemShow: { classPropertyName: "maxItemShow", publicName: "maxItemShow", isSignal: true, isRequired: false, transformFunction: null }, keySelected: { classPropertyName: "keySelected", publicName: "keySelected", isSignal: true, isRequired: false, transformFunction: null }, multiKeySelected: { classPropertyName: "multiKeySelected", publicName: "multiKeySelected", isSignal: true, isRequired: false, transformFunction: null }, keysDisableItem: { classPropertyName: "keysDisableItem", publicName: "keysDisableItem", isSignal: true, isRequired: false, transformFunction: null }, keysHiddenItem: { classPropertyName: "keysHiddenItem", publicName: "keysHiddenItem", isSignal: true, isRequired: false, transformFunction: null }, data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null }, focusInputSearch: { classPropertyName: "focusInputSearch", publicName: "focusInputSearch", isSignal: true, isRequired: false, transformFunction: null }, skipFocusInputWhenKeySearchStoreUndefined: { classPropertyName: "skipFocusInputWhenKeySearchStoreUndefined", publicName: "skipFocusInputWhenKeySearchStoreUndefined", isSignal: true, isRequired: false, transformFunction: null }, functionCustomAddDataToStore: { classPropertyName: "functionCustomAddDataToStore", publicName: "functionCustomAddDataToStore", isSignal: true, isRequired: false, transformFunction: null }, functionGetItemAutoAddList: { classPropertyName: "functionGetItemAutoAddList", publicName: "functionGetItemAutoAddList", isSignal: true, isRequired: false, transformFunction: null }, validRequired: { classPropertyName: "validRequired", publicName: "validRequired", isSignal: true, isRequired: false, transformFunction: null }, showValidateBottom: { classPropertyName: "showValidateBottom", publicName: "showValidateBottom", isSignal: true, isRequired: false, transformFunction: null }, zIndex: { classPropertyName: "zIndex", publicName: "zIndex", isSignal: true, isRequired: false, transformFunction: null }, loadingIconSize: { classPropertyName: "loadingIconSize", publicName: "loadingIconSize", isSignal: true, isRequired: false, transformFunction: null }, templateRefSearchNoData: { classPropertyName: "templateRefSearchNoData", publicName: "templateRefSearchNoData", isSignal: true, isRequired: false, transformFunction: null }, resetKeyWhenSelectAllKeyDropdown: { classPropertyName: "resetKeyWhenSelectAllKeyDropdown", publicName: "resetKeyWhenSelectAllKeyDropdown", isSignal: true, isRequired: false, transformFunction: null }, ignoreClassDisableDefaultWhenUseKeysDisableItem: { classPropertyName: "ignoreClassDisableDefaultWhenUseKeysDisableItem", publicName: "ignoreClassDisableDefaultWhenUseKeysDisableItem", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { outSelectKey: "outSelectKey", outSelectMultiKey: "outSelectMultiKey", outUnSelectMultiKey: "outUnSelectMultiKey", outClickButtonOther: "outClickButtonOther", outFieldKey: "outFieldKey", outChangeView: "outChangeView", outLoading: "outLoading", outFunctionsControl: "outFunctionsControl", outChangStageFlagMousePopover: "outChangStageFlagMousePopover", outLoadItemsComplete: "outLoadItemsComplete" }, viewQueries: [{ propertyName: "listViewElementRef", first: true, predicate: ["listViewContainer"], descendants: true, isSignal: true }, { propertyName: "contentElementRef", first: true, predicate: ["contentContainer"], descendants: true, isSignal: true }], ngImport: i0, template: "<div #listViewContainer\n class=\"flex flex-col\"\n [class.w-full]=\"!maxItemShow\"\n [class.h-full]=\"!maxItemShow\">\n @if (labelConfig(); as labelConfig) {\n <libs_ui-components-label [classInclude]=\"labelConfig.classInclude\"\n [labelLeft]=\"labelConfig.labelLeft\"\n [labelLeftClass]=\"labelConfig.labelLeftClass\"\n [required]=\"labelConfig.required \"\n [description]=\"labelConfig.description\"\n [descriptionClass]=\"labelConfig.descriptionClass\"\n [labelRight]=\"labelConfig.labelRight\"\n [labelRightClass]=\"labelConfig.labelRightClass\"\n [onlyShowCount]=\"labelConfig.onlyShowCount\"\n [buttonsLeft]=\"labelConfig.buttonsLeft\"\n [buttonsRight]=\"labelConfig.buttonsRight\"\n [disableButtonsLeft]=\"labelConfig.disableButtonsLeft || disable()\"\n [disableButtonsRight]=\"labelConfig.disableButtonsRight || disable()\"\n [hasToggle]=\"labelConfig.hasToggle\"\n [toggleActive]=\"labelConfig.toggleActive\"\n [toggleDisable]=\"labelConfig.toggleDisable || loading() || disable()\"\n [popover]=\"labelConfig.popover\"\n [iconPopoverClass]=\"labelConfig.iconPopoverClass\"\n [onlyShowCount]=\"labelConfig.onlyShowCount\"\n [limitLength]=\"labelConfig.limitLength\"\n [buttonsDescription]=\"labelConfig.buttonsDescription\"\n [disableButtonsDescription]=\"labelConfig.disableButtonsDescription || disable()\"\n [buttonsDescriptionContainerClass]=\"labelConfig.buttonsDescriptionContainerClass\"\n [count]=\"labelConfig.count\" />\n }\n\n @if (!showValidateBottom()) {\n <ng-container *ngTemplateOutlet=\"templateValidate\"></ng-container>\n }\n @if (!hiddenInputSearch()) {\n <libs_ui-components-inputs-search [searchConfig]=\"searchConfig()\"\n [class.px-[12px]]=\"searchPadding()\"\n [class]=\"searchConfig().classCoverInputSearch\"\n [disable]=\" disable() || loading() || false\"\n (outSearch)=\"handlerSearch($event)\"\n (outFunctionsControl)=\"handlerFunctionControlInputSearch($event)\" />\n }\n @if (config()?.configDescriptionGroup; as description) {\n <div [class]=\"description?.classInclude\">\n <libs_ui-components-popover [config]=\"description?.tooltipDescription\">\n <div [class]=\"description?.classTextDescriptionInclude\">{{ description.textDescription }}</div>\n </libs_ui-components-popover>\n </div>\n }\n @if (hasDivider() && (!config()?.ignoreShowDataWhenNotSearch || keySearchStore())) {\n <div class=\"libs-ui-border-top-general {{ dividerClassInclude() ? dividerClassInclude():'' }}\"\n [class.libs-ui-divider-default]=\"!!searchPadding() && !dividerClassInclude()\">\n </div>\n }\n <div class=\"flex flex-col {{ (config()?.ignoreShowDataWhenNotSearch && keySearchStore() && !config()?.ignoreFixHeightShowDataWhenNotSearch) ? 'h-[353px]' : 'h-full' }}\">\n <div #contentContainer\n class=\"w-full h-full {{ backgroundListCustom() }}\"\n [class.libs-ui-disable]=\"disable() && disableLabel()\"\n [class.pointer-events-none]=\"disable() && disableLabel()\">\n </div>\n\n @for (buttonOther of buttonsOther(); track $index) {\n <div class=\"bg-[#ffffff]\">\n <libs_ui-components-buttons-button [type]=\"buttonOther.type || 'button-link-primary'\"\n [label]=\"buttonOther.label || ' '\"\n [classIconLeft]=\"(buttonOther.classIconLeft || '')+' flex mr-[8px] text-[16px]'\"\n classInclude=\"w-full libs-ui-border-top-general text-left rounded-0 {{ buttonOther.classInclude ? buttonOther.classInclude:'' }}\"\n classLabel=\"libs-ui-font-h5r whitespace-normal\"\n [disable]=\"buttonOther.disable || disable() || loading() || false\"\n (outClick)=\"handlerClickButtonOther(buttonOther)\" />\n </div>\n }\n @if (hasButtonUnSelectOption()) {\n <div class=\"bg-[#ffffff] rounded-b-[4px]\">\n <libs_ui-components-buttons-button label=\"i18n_unselect_option\"\n type=\"button-link-danger-high\"\n classIconLeft=\"flex mr-[8px] libs-ui-icon-close\"\n classInclude=\"w-100 libs-ui-border-top-general text-left rounded-0\"\n classLabel=\"mo-lib-font-h5r whitespace-normal\"\n [disable]=\"disableButtonUnSelectOption() || disable() || loading() || false\"\n (outClick)=\"handlerRemoveKeySelected()\" />\n </div>\n }\n </div>\n @if (showValidateBottom()) {\n <ng-container *ngTemplateOutlet=\"templateValidate\"></ng-container>\n }\n</div>\n\n<ng-template #templateValidate>\n @if (isErrorRequired()) {\n <div [class.mb-[8px]]=\"!showValidateBottom()\"\n [class.mt-[8px]]=\"showValidateBottom()\">\n <span class=\"text-[#ee2d41] mo-lib-font-h7\"\n [innerHtml]=\"(validRequired()?.message || ERROR_MESSAGE_EMPTY_VALID)| translate:validRequired()?.interpolateParams\">\n </span>\n </div>\n }\n</ng-template>\n", styles: [":host{background-color:#fff}:host ::ng-deep .libs-ui-list-view-highlight-text-search{background-color:#ffdb80;border-radius:2px;display:inline-block;overflow:unset}.libs-ui-divider-default{width:calc(100% - 24px);margin:12px auto 0}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { 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: LibsUiComponentsInputsSearchComponent, selector: "libs_ui-components-inputs-search", inputs: ["disable", "readonly", "searchConfig", "ignoreAutoComplete", "debounceTime", "ignoreStopPropagationEvent", "focusTimeOut", "blurTimeOut"], outputs: ["outSearch", "outValueChange", "outIconLeft", "outIconRight", "outFocusAndBlur", "outFunctionsControl"] }, { 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: LibsUiComponentsButtonsButtonComponent, selector: "libs_ui-components-buttons-button", inputs: ["flagMouse", "type", "buttonCustom", "sizeButton", "label", "disable", "isPending", "imageLeft", "classInclude", "classIconLeft", "classIconRight", "classLabel", "iconOnlyType", "popover", "ignoreStopPropagationEvent", "zIndex", "widthLabelPopover", "styleIconLeft", "styleButton", "ignoreFocusWhenInputTab", "ignoreSetClickWhenShowPopover", "ignorePointerEvent", "isActive"], outputs: ["outClick", "outPopoverEvent", "outFunctionsControl"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
318
|
+
}
|
|
319
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LibsUiComponentsListComponent, decorators: [{
|
|
320
|
+
type: Component,
|
|
321
|
+
args: [{ selector: 'libs_ui-components-list', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [
|
|
322
|
+
NgTemplateOutlet, TranslateModule,
|
|
323
|
+
LibsUiComponentsLabelComponent,
|
|
324
|
+
LibsUiComponentsInputsSearchComponent,
|
|
325
|
+
LibsUiComponentsPopoverComponent,
|
|
326
|
+
LibsUiComponentsButtonsButtonComponent
|
|
327
|
+
], template: "<div #listViewContainer\n class=\"flex flex-col\"\n [class.w-full]=\"!maxItemShow\"\n [class.h-full]=\"!maxItemShow\">\n @if (labelConfig(); as labelConfig) {\n <libs_ui-components-label [classInclude]=\"labelConfig.classInclude\"\n [labelLeft]=\"labelConfig.labelLeft\"\n [labelLeftClass]=\"labelConfig.labelLeftClass\"\n [required]=\"labelConfig.required \"\n [description]=\"labelConfig.description\"\n [descriptionClass]=\"labelConfig.descriptionClass\"\n [labelRight]=\"labelConfig.labelRight\"\n [labelRightClass]=\"labelConfig.labelRightClass\"\n [onlyShowCount]=\"labelConfig.onlyShowCount\"\n [buttonsLeft]=\"labelConfig.buttonsLeft\"\n [buttonsRight]=\"labelConfig.buttonsRight\"\n [disableButtonsLeft]=\"labelConfig.disableButtonsLeft || disable()\"\n [disableButtonsRight]=\"labelConfig.disableButtonsRight || disable()\"\n [hasToggle]=\"labelConfig.hasToggle\"\n [toggleActive]=\"labelConfig.toggleActive\"\n [toggleDisable]=\"labelConfig.toggleDisable || loading() || disable()\"\n [popover]=\"labelConfig.popover\"\n [iconPopoverClass]=\"labelConfig.iconPopoverClass\"\n [onlyShowCount]=\"labelConfig.onlyShowCount\"\n [limitLength]=\"labelConfig.limitLength\"\n [buttonsDescription]=\"labelConfig.buttonsDescription\"\n [disableButtonsDescription]=\"labelConfig.disableButtonsDescription || disable()\"\n [buttonsDescriptionContainerClass]=\"labelConfig.buttonsDescriptionContainerClass\"\n [count]=\"labelConfig.count\" />\n }\n\n @if (!showValidateBottom()) {\n <ng-container *ngTemplateOutlet=\"templateValidate\"></ng-container>\n }\n @if (!hiddenInputSearch()) {\n <libs_ui-components-inputs-search [searchConfig]=\"searchConfig()\"\n [class.px-[12px]]=\"searchPadding()\"\n [class]=\"searchConfig().classCoverInputSearch\"\n [disable]=\" disable() || loading() || false\"\n (outSearch)=\"handlerSearch($event)\"\n (outFunctionsControl)=\"handlerFunctionControlInputSearch($event)\" />\n }\n @if (config()?.configDescriptionGroup; as description) {\n <div [class]=\"description?.classInclude\">\n <libs_ui-components-popover [config]=\"description?.tooltipDescription\">\n <div [class]=\"description?.classTextDescriptionInclude\">{{ description.textDescription }}</div>\n </libs_ui-components-popover>\n </div>\n }\n @if (hasDivider() && (!config()?.ignoreShowDataWhenNotSearch || keySearchStore())) {\n <div class=\"libs-ui-border-top-general {{ dividerClassInclude() ? dividerClassInclude():'' }}\"\n [class.libs-ui-divider-default]=\"!!searchPadding() && !dividerClassInclude()\">\n </div>\n }\n <div class=\"flex flex-col {{ (config()?.ignoreShowDataWhenNotSearch && keySearchStore() && !config()?.ignoreFixHeightShowDataWhenNotSearch) ? 'h-[353px]' : 'h-full' }}\">\n <div #contentContainer\n class=\"w-full h-full {{ backgroundListCustom() }}\"\n [class.libs-ui-disable]=\"disable() && disableLabel()\"\n [class.pointer-events-none]=\"disable() && disableLabel()\">\n </div>\n\n @for (buttonOther of buttonsOther(); track $index) {\n <div class=\"bg-[#ffffff]\">\n <libs_ui-components-buttons-button [type]=\"buttonOther.type || 'button-link-primary'\"\n [label]=\"buttonOther.label || ' '\"\n [classIconLeft]=\"(buttonOther.classIconLeft || '')+' flex mr-[8px] text-[16px]'\"\n classInclude=\"w-full libs-ui-border-top-general text-left rounded-0 {{ buttonOther.classInclude ? buttonOther.classInclude:'' }}\"\n classLabel=\"libs-ui-font-h5r whitespace-normal\"\n [disable]=\"buttonOther.disable || disable() || loading() || false\"\n (outClick)=\"handlerClickButtonOther(buttonOther)\" />\n </div>\n }\n @if (hasButtonUnSelectOption()) {\n <div class=\"bg-[#ffffff] rounded-b-[4px]\">\n <libs_ui-components-buttons-button label=\"i18n_unselect_option\"\n type=\"button-link-danger-high\"\n classIconLeft=\"flex mr-[8px] libs-ui-icon-close\"\n classInclude=\"w-100 libs-ui-border-top-general text-left rounded-0\"\n classLabel=\"mo-lib-font-h5r whitespace-normal\"\n [disable]=\"disableButtonUnSelectOption() || disable() || loading() || false\"\n (outClick)=\"handlerRemoveKeySelected()\" />\n </div>\n }\n </div>\n @if (showValidateBottom()) {\n <ng-container *ngTemplateOutlet=\"templateValidate\"></ng-container>\n }\n</div>\n\n<ng-template #templateValidate>\n @if (isErrorRequired()) {\n <div [class.mb-[8px]]=\"!showValidateBottom()\"\n [class.mt-[8px]]=\"showValidateBottom()\">\n <span class=\"text-[#ee2d41] mo-lib-font-h7\"\n [innerHtml]=\"(validRequired()?.message || ERROR_MESSAGE_EMPTY_VALID)| translate:validRequired()?.interpolateParams\">\n </span>\n </div>\n }\n</ng-template>\n", styles: [":host{background-color:#fff}:host ::ng-deep .libs-ui-list-view-highlight-text-search{background-color:#ffdb80;border-radius:2px;display:inline-block;overflow:unset}.libs-ui-divider-default{width:calc(100% - 24px);margin:12px auto 0}\n"] }]
|
|
328
|
+
}], ctorParameters: () => [] });
|
|
329
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvbGlzdC9zcmMvbGlzdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvbGlzdC9zcmMvbGlzdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSw2REFBNkQ7QUFDN0QsdURBQXVEO0FBQ3ZELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ25ELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQWdCLE1BQU0sRUFBYyxNQUFNLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQUUsTUFBTSxFQUFlLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvSyxPQUFPLEVBQVcsc0NBQXNDLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUVyRyxPQUFPLEVBQXNCLHFDQUFxQyxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFFOUcsT0FBTyxFQUFVLDhCQUE4QixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDbkYsT0FBTyxFQUFjLGdDQUFnQyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFFM0YsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDcEYsT0FBTyxFQUFFLFNBQVMsRUFBRSx5QkFBeUIsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxPQUFPLEVBQWdCLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0QsT0FBTyxFQUFFLGtCQUFrQixFQUFFLFVBQVUsRUFBRSxNQUFNLHVCQUF1QixDQUFDOzs7QUFvQnZFLE1BQU0sT0FBTyw2QkFBNkI7SUFDeEMsY0FBYztJQUNLLHlCQUF5QixHQUFHLHlCQUF5QixDQUFDO0lBQy9ELDJCQUEyQixHQUFHLE1BQU0sQ0FBVSxJQUFJLENBQUMsQ0FBQztJQUNwRCxlQUFlLEdBQUcsTUFBTSxDQUFVLEtBQUssQ0FBQyxDQUFDO0lBQ3pDLE9BQU8sR0FBRyxNQUFNLENBQVUsS0FBSyxDQUFDLENBQUM7SUFDakMsY0FBYyxHQUFHLE1BQU0sQ0FBcUIsU0FBUyxDQUFDLENBQUM7SUFFekQsU0FBUyxHQUFrQixJQUFJLE9BQU8sRUFBRSxDQUFDO0lBQ3pDLFFBQVEsR0FBZ0MsSUFBSSxPQUFPLEVBQUUsQ0FBQztJQUN0RCxTQUFTLEdBQWtCLElBQUksT0FBTyxFQUFFLENBQUM7SUFDekMsb0JBQW9CLEdBQTRCLElBQUksT0FBTyxFQUFFLENBQUM7SUFDOUQsY0FBYyxHQUF3QixJQUFJLE9BQU8sRUFBRSxDQUFDO0lBQ3BELG9CQUFvQixHQUFpQixJQUFJLE9BQU8sRUFBRSxDQUFDO0lBQ25ELDZCQUE2QixHQUFrQixJQUFJLE9BQU8sRUFBRSxDQUFDO0lBQzdELGFBQWEsR0FBNEIsSUFBSSxPQUFPLEVBQUUsQ0FBQztJQUV2RCxZQUFZLENBQWdFO0lBQzVFLFVBQVUsR0FBRyxNQUFNLENBQXNCO1FBQy9DLElBQUksRUFBRSxNQUFNO1FBQ1osa0JBQWtCLEVBQUU7WUFDbEIsUUFBUSxFQUFFLElBQUk7WUFDZCxRQUFRLEVBQUUsQ0FBQyxJQUFTLEVBQUUsRUFBRTtnQkFDdEIsT0FBTyxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDakMsQ0FBQztTQUNGO0tBQ0YsQ0FBQyxDQUFDO0lBQ0sscUJBQXFCLEdBQUcsTUFBTSxDQUFpQixFQUFFLENBQUMsQ0FBQztJQUNuRCwwQkFBMEIsR0FBRyxNQUFNLENBQXlDLFNBQVMsQ0FBQyxDQUFDO0lBRS9GLFdBQVc7SUFDRixpQkFBaUIsR0FBRyxLQUFLLENBQVUsS0FBSyxDQUFDLENBQUM7SUFDMUMsb0JBQW9CLEdBQUcsS0FBSyxFQUFVLENBQUM7SUFDdkMsU0FBUyxHQUFHLEtBQUssRUFBVSxDQUFDO0lBQzVCLGtCQUFrQixHQUFHLEtBQUssRUFBTyxDQUFDO0lBQ2xDLGVBQWUsR0FBRyxLQUFLLEVBQVcsQ0FBQztJQUNuQyxNQUFNLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBbUMsQ0FBQztJQUUzRCxjQUFjLEdBQUcsS0FBSyxFQUFXLENBQUM7SUFDbEMsT0FBTyxHQUFHLEtBQUssRUFBVyxDQUFDO0lBQzNCLFlBQVksR0FBRyxLQUFLLEVBQVcsQ0FBQztJQUNoQyxXQUFXLEdBQUcsS0FBSyxFQUFVLENBQUM7SUFDOUIsWUFBWSxHQUFHLEtBQUssQ0FBcUIsRUFBRSxDQUFDLENBQUM7SUFDN0MsYUFBYSxHQUFHLEtBQUssRUFBVyxDQUFDO0lBQ2pDLG1CQUFtQixHQUFHLEtBQUssRUFBVSxDQUFDO0lBQ3RDLFVBQVUsR0FBRyxLQUFLLENBQVUsSUFBSSxDQUFDLENBQUM7SUFDbEMsWUFBWSxHQUFHLEtBQUssQ0FBNkIsU0FBUyxDQUFDLENBQUM7SUFDNUQsdUJBQXVCLEdBQUcsS0FBSyxFQUFXLENBQUM7SUFDM0MsWUFBWSxHQUFHLEtBQUssRUFBVyxDQUFDO0lBQ2hDLG9CQUFvQixHQUFHLEtBQUssQ0FBUyxjQUFjLENBQUMsQ0FBQztJQUNyRCxXQUFXLEdBQUcsS0FBSyxFQUFVLENBQUM7SUFDOUIsV0FBVyxHQUFHLEtBQUssRUFBVyxDQUFDO0lBQy9CLGdCQUFnQixHQUFHLEtBQUssQ0FBNkIsU0FBUyxDQUFDLENBQUMsQ0FBQSw2QkFBNkI7SUFDN0YsZUFBZSxHQUFHLEtBQUssQ0FBNkIsU0FBUyxDQUFDLENBQUMsQ0FBQyw2RkFBNkY7SUFDN0osY0FBYyxHQUFHLEtBQUssQ0FBNkIsU0FBUyxDQUFDLENBQUMsQ0FBQyw2RkFBNkY7SUFDNUosSUFBSSxHQUFHLEtBQUssQ0FBeUIsU0FBUyxDQUFDLENBQUM7SUFDaEQsZ0JBQWdCLEdBQUcsS0FBSyxFQUFXLENBQUM7SUFDcEMseUNBQXlDLEdBQUcsS0FBSyxFQUFXLENBQUM7SUFDN0QsNEJBQTRCLEdBQUcsS0FBSyxFQUFtQyxDQUFDO0lBQ3hFLDBCQUEwQixHQUFHLEtBQUssQ0FBaUMsU0FBUyxDQUFDLENBQUM7SUFDOUUsYUFBYSxHQUFHLEtBQUssQ0FBNkIsU0FBUyxDQUFDLENBQUM7SUFDN0Qsa0JBQWtCLEdBQUcsS0FBSyxFQUFXLENBQUM7SUFDdEMsTUFBTSxHQUFHLEtBQUssRUFBVSxDQUFDO0lBQ3pCLGVBQWUsR0FBRyxLQUFLLENBQXVELFNBQVMsQ0FBQyxDQUFDO0lBQ3pGLHVCQUF1QixHQUFHLEtBQUssQ0FBNkMsU0FBUyxDQUFDLENBQUM7SUFDdkYsZ0NBQWdDLEdBQUcsS0FBSyxFQUFXLENBQUM7SUFDcEQsK0NBQStDLEdBQUcsS0FBSyxFQUFXLENBQUMsQ0FBQyxtRUFBbUU7SUFFaEosWUFBWTtJQUNILFlBQVksR0FBRyxNQUFNLEVBQWdDLENBQUMsQ0FBQywwQkFBMEI7SUFDakYsaUJBQWlCLEdBQUcsTUFBTSxFQUFxQyxDQUFDLENBQUMsd0NBQXdDO0lBQ3pHLG1CQUFtQixHQUFHLE1BQU0sRUFBa0IsQ0FBQyxDQUFDLHdDQUF3QztJQUN4RixtQkFBbUIsR0FBRyxNQUFNLEVBQVcsQ0FBQztJQUN4QyxXQUFXLEdBQUcsTUFBTSxFQUFXLENBQUM7SUFDaEMsYUFBYSxHQUFHLE1BQU0sRUFBYyxDQUFDO0lBQ3JDLFVBQVUsR0FBRyxNQUFNLEVBQVcsQ0FBQztJQUMvQixtQkFBbUIsR0FBRyxNQUFNLEVBQTZCLENBQUM7SUFDMUQsNkJBQTZCLEdBQUcsTUFBTSxFQUFjLENBQUM7SUFDckQsb0JBQW9CLEdBQUcsTUFBTSxFQUEyQyxDQUFDO0lBRWxGLGdCQUFnQjtJQUNOLGtCQUFrQixHQUFHLFNBQVMsQ0FBYSxtQkFBbUIsQ0FBQyxDQUFDO0lBQ2hFLGlCQUFpQixHQUFHLFNBQVMsQ0FBYSxrQkFBa0IsQ0FBQyxDQUFDO0lBRXhFLFlBQVk7SUFDSix1QkFBdUIsR0FBRyxNQUFNLENBQUMsNkJBQTZCLENBQUMsQ0FBQztJQUV4RTtRQUNFLE1BQU0sQ0FBQyxHQUFHLEVBQUU7WUFDVixJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztZQUMxQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztRQUN2QyxDQUFDLEVBQUUsRUFBRSxpQkFBaUIsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ2hDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN4RSxNQUFNLENBQUMsR0FBRyxFQUFFO1lBQ1YsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDdkIsT0FBTztZQUNULENBQUM7WUFDRCxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQyxFQUFFLENBQUM7Z0JBQ3JDLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDO1lBQ3hFLENBQUM7WUFDRCxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxFQUFFLENBQUM7Z0JBQ3BDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQzlELENBQUM7WUFDRCxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUM7Z0JBQzdCLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUN4RCxDQUFDO1lBQ0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDO2dCQUMxQixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFDOUMsQ0FBQztZQUNELElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLEVBQUUsQ0FBQztnQkFDakMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1lBQ2hFLENBQUM7WUFDRCxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRSxJQUFJLEtBQUssT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLEVBQUUsQ0FBQztnQkFDN0UsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQztZQUMxRSxDQUFDO1lBQ0QsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsSUFBSSxLQUFLLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxFQUFFLENBQUM7Z0JBQzdFLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLGtCQUFrQixFQUFFLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUM7Z0JBQ3hFLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUM1QyxDQUFDO1FBQ0gsQ0FBQyxFQUFFLEVBQUUsaUJBQWlCLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUVoQyxNQUFNLENBQUMsR0FBRyxFQUFFO1lBQ1YsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2pCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDO1lBQzVCLFlBQVksRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDMUMsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztZQUNoQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztZQUMxRCxlQUFlLEVBQUUsS0FBSyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsRUFBRSxhQUFhLENBQUMscUJBQXFCLEVBQUU7WUFDN0YsV0FBVyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztTQUMzRCxDQUFDLENBQUM7UUFFSCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDN0IsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNYLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQTtRQUMvQyxDQUFDO1FBQ0QsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBQzlCLE1BQU0sU0FBUyxHQUFHLGtCQUFrQixDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUU3RCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyx1QkFBdUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNwRiwrQ0FBK0M7UUFFL0MsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUN0RCxJQUFJLENBQUMsdUJBQXVCLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixFQUFFLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDeEcsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDbEUsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsc0JBQXNCLEVBQUUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDOUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBRXhELElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO1FBQ2xFLENBQUM7UUFDRCxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3RELElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDeEQsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNyRSxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxzQkFBc0IsRUFBRSxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQyxDQUFDO1FBQ2hGLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksS0FBSyxDQUFDLENBQUM7UUFDekUsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ3RELElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDO1FBQ3RFLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLGtDQUFrQyxFQUFFLElBQUksQ0FBQyxnQ0FBZ0MsRUFBRSxDQUFDLENBQUM7UUFDeEcsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsaURBQWlELEVBQUUsSUFBSSxDQUFDLCtDQUErQyxFQUFFLENBQUMsQ0FBQztRQUN0SSxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyw4QkFBOEIsRUFBRSxJQUFJLENBQUMsNEJBQTRCLEVBQUUsQ0FBQyxDQUFDO1FBQ2hHLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLDRCQUE0QixFQUFFLElBQUksQ0FBQywwQkFBMEIsRUFBRSxDQUFDLENBQUM7UUFDNUYsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUN0RCxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDO2dCQUNoQixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFDOUMsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7UUFDaEUsQ0FBQztRQUNELElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUM5RCxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLENBQUM7WUFDNUIsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQztRQUMxRSxDQUFDO1FBQ0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLGVBQWUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzVFLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUMxRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDO1lBQ2xFLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDOUMsQ0FBQztRQUNELElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLHNCQUFzQixFQUFFLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBQzlFLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLCtCQUErQixFQUFFLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO1FBQ2hHLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDaEUsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO1FBQ3BFLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksS0FBSyxDQUFDLENBQUM7UUFDekUsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUM7UUFDdEUsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMseUJBQXlCLEVBQUUsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUMsQ0FBQztRQUN0RixJQUFJLFNBQVMsR0FBRyxFQUFFLENBQUM7UUFFbkIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUM7UUFFNUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDdEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFFOUIsSUFBSSxJQUFJLENBQUMseUNBQXlDLEVBQUUsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUM7Z0JBQ25GLE9BQU87WUFDVCxDQUFDO1lBQ0QsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQ25FLFNBQVMsR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLElBQUksRUFBRSxDQUFDO2dCQUN4QyxJQUFJLENBQUMsMEJBQTBCLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQztZQUM3QyxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDSCxRQUFRLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNyQyxJQUFJLENBQUMsMkJBQTJCLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzVDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzdCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN0QixDQUFDLENBQUMsQ0FBQztRQUNILFFBQVEsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsUUFBaUIsRUFBRSxFQUFFO1lBQ25ELElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2xDLENBQUMsQ0FBQyxDQUFDO1FBQ0gsUUFBUSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFnQixFQUFFLEVBQUU7WUFDakQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDMUIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDaEMsQ0FBQyxDQUFDLENBQUM7UUFDSCxRQUFRLENBQUMsb0JBQW9CLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBOEMsRUFBRSxFQUFFO1lBQ3pGLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEMsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsa0JBQWtCLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLGtCQUFrQixFQUFFLFVBQVUsRUFBRSxDQUFDO1lBQ3hHLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEVBQUU7Z0JBQ2hELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDN0IsSUFBSSxNQUFNLElBQUksTUFBTSxDQUFDLGtCQUFrQixJQUFJLE1BQU0sQ0FBQyxrQkFBa0IsRUFBRSxVQUFVLEVBQUUsQ0FBQztvQkFDakYsTUFBTSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7b0JBQzlDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ2pELENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7UUFDRCxRQUFRLENBQUMsNkJBQTZCLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBZ0IsRUFBRSxFQUFFO1lBQ3BFLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDaEQsQ0FBQyxDQUFDLENBQUM7UUFDSCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsSUFBSSxDQUFDO1FBRXJDLElBQUksSUFBSSxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssT0FBTyxFQUFFLENBQUM7WUFDeEMsT0FBTztRQUNULENBQUM7UUFDRCxRQUFRLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQzFDLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDNUMsSUFBSSxJQUFJLEtBQUssT0FBTyxFQUFFLENBQUM7Z0JBQ3JCLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzVDLENBQUM7WUFDRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2xDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN0QixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFUyxhQUFhLENBQUMsU0FBaUI7UUFDdkMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDbkMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVTLEtBQUssQ0FBQyx3QkFBd0I7UUFDdEMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN2QixPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDdkMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLGtCQUFrQixFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQzFELElBQUksQ0FBQywyQkFBMkIsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDM0MsTUFBTSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVTLHVCQUF1QixDQUFDLE1BQWU7UUFDL0MsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRVMsaUNBQWlDLENBQUMsS0FBaUM7UUFDM0UsSUFBSSxDQUFDLDBCQUEwQixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRU8sS0FBSyxDQUFDLFlBQVk7UUFDeEIsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxRQUFRLEVBQUUsQ0FBQztZQUNoRixJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUVoQyxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFDRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsSUFBSSxDQUFDO1FBQ2pDLElBQUksTUFBTSxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFFbkUsSUFBSSxJQUFJLEtBQUssT0FBTyxFQUFFLENBQUM7WUFDckIsTUFBTSxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQ2hELENBQUM7UUFDRCxJQUFJLElBQUksS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLE9BQU8sRUFBRSxDQUFDO1lBQ3hDLE1BQU0sR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUMxRCxDQUFDO1FBQ0QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUVsQyxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRU8sS0FBSyxDQUFDLE9BQU87UUFDbkIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQzdCLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNaLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDNUIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUN6RCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFFTyxXQUFXLENBQUMsV0FBZ0M7UUFDbEQsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2pCLE9BQU8sRUFBUyxDQUFDO1FBQ25CLENBQUM7UUFDRCxNQUFNLFlBQVksR0FBRyxXQUFXLENBQUMsZUFBZSxFQUFFLFlBQVksQ0FBQztRQUMvRCxNQUFNLHdDQUF3QyxHQUFHLFdBQVcsQ0FBQyxzQkFBc0IsRUFBRSxnQ0FBZ0MsRUFBRSxZQUFZLENBQUM7UUFFcEksWUFBWSxJQUFJLE9BQU8sV0FBVyxDQUFDLGVBQWUsRUFBRSxZQUFZLENBQUM7UUFDakUsd0NBQXdDLElBQUksT0FBTyxXQUFXLENBQUMsc0JBQXNCLEVBQUUsZ0NBQWdDLEVBQUUsWUFBWSxDQUFDO1FBQ3RJLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUV0QyxZQUFZLElBQUksTUFBTSxDQUFDLGVBQWUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQyxDQUFDO1FBQy9GLHdDQUF3QyxJQUFJLE1BQU0sQ0FBQyxzQkFBc0IsRUFBRSxnQ0FBZ0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxnQ0FBZ0MsQ0FBQyxZQUFZLEdBQUcsd0NBQXdDLENBQUMsQ0FBQztRQUN4TyxZQUFZLElBQUksV0FBVyxDQUFDLGVBQWUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQyxDQUFDO1FBQ3pHLHdDQUF3QyxJQUFJLFdBQVcsQ0FBQyxzQkFBc0IsRUFBRSxnQ0FBZ0MsSUFBSSxDQUFDLFdBQVcsQ0FBQyxzQkFBc0IsQ0FBQyxnQ0FBZ0MsQ0FBQyxZQUFZLEdBQUcsd0NBQXdDLENBQUMsQ0FBQztRQUVsUCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVCLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3ZELElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsb0JBQW9CLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDckMsSUFBSSxDQUFDLDZCQUE2QixDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzlDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUM1QixDQUFDO3dHQTVVVSw2QkFBNkI7NEZBQTdCLDZCQUE2Qixtak1DbkMxQyx1MEpBbUdBLG9TRHZFSSxnQkFBZ0IsbUpBQUUsZUFBZSw0RkFDakMsOEJBQThCLDRxQkFDOUIscUNBQXFDLG9WQUNyQyxnQ0FBZ0MsMGRBQ2hDLHNDQUFzQzs7NEZBRzdCLDZCQUE2QjtrQkFmekMsU0FBUzsrQkFFRSx5QkFBeUIsY0FHdkIsSUFBSSxtQkFDQyx1QkFBdUIsQ0FBQyxNQUFNLFdBQ3RDO3dCQUNQLGdCQUFnQixFQUFFLGVBQWU7d0JBQ2pDLDhCQUE4Qjt3QkFDOUIscUNBQXFDO3dCQUNyQyxnQ0FBZ0M7d0JBQ2hDLHNDQUFzQztxQkFDdkMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLWV4cHJlc3Npb25zICovXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5pbXBvcnQgeyBOZ1RlbXBsYXRlT3V0bGV0IH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgQ29tcG9uZW50UmVmLCBlZmZlY3QsIEVsZW1lbnRSZWYsIGluamVjdCwgaW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBvdXRwdXQsIHNpZ25hbCwgVGVtcGxhdGVSZWYsIHZpZXdDaGlsZCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBJQnV0dG9uLCBMaWJzVWlDb21wb25lbnRzQnV0dG9uc0J1dHRvbkNvbXBvbmVudCB9IGZyb20gXCJAbGlicy11aS9jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uXCI7XG5pbXBvcnQgeyBJSW5wdXRGdW5jdGlvbkNvbnRyb2xFdmVudCB9IGZyb20gXCJAbGlicy11aS9jb21wb25lbnRzLWlucHV0cy1pbnB1dFwiO1xuaW1wb3J0IHsgSUlucHV0U2VhcmNoQ29uZmlnLCBMaWJzVWlDb21wb25lbnRzSW5wdXRzU2VhcmNoQ29tcG9uZW50IH0gZnJvbSBcIkBsaWJzLXVpL2NvbXBvbmVudHMtaW5wdXRzLXNlYXJjaFwiO1xuaW1wb3J0IHsgSVZhbGlkUmVxdWlyZWQgfSBmcm9tIFwiQGxpYnMtdWkvY29tcG9uZW50cy1pbnB1dHMtdmFsaWRcIjtcbmltcG9ydCB7IElMYWJlbCwgTGlic1VpQ29tcG9uZW50c0xhYmVsQ29tcG9uZW50IH0gZnJvbSBcIkBsaWJzLXVpL2NvbXBvbmVudHMtbGFiZWxcIjtcbmltcG9ydCB7IElGbGFnTW91c2UsIExpYnNVaUNvbXBvbmVudHNQb3BvdmVyQ29tcG9uZW50IH0gZnJvbSBcIkBsaWJzLXVpL2NvbXBvbmVudHMtcG9wb3ZlclwiO1xuaW1wb3J0IHsgSVBhZ2luZywgVFlQRV9URU1QTEFURV9SRUYgfSBmcm9tIFwiQGxpYnMtdWkvaW50ZXJmYWNlcy10eXBlc1wiO1xuaW1wb3J0IHsgTGlic1VpRHluYW1pY0NvbXBvbmVudFNlcnZpY2UgfSBmcm9tIFwiQGxpYnMtdWkvc2VydmljZXMtZHluYW1pYy1jb21wb25lbnRcIjtcbmltcG9ydCB7IGNsb25lRGVlcCwgRVJST1JfTUVTU0FHRV9FTVBUWV9WQUxJRCwgaXNFbXB0eSwgaXNOaWwgfSBmcm9tIFwiQGxpYnMtdWkvdXRpbHNcIjtcbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSB9IGZyb20gXCJAbmd4LXRyYW5zbGF0ZS9jb3JlXCI7XG5pbXBvcnQgeyBTdWJqZWN0LCBTdWJzY3JpcHRpb24sIHRha2VVbnRpbCwgdGltZXIgfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgZ2V0Q29tcG9uZW50QnlUeXBlLCBpbml0Q29uZmlnIH0gZnJvbSBcIi4vZGVmaW5lcy9saXN0LmRlZmluZVwiO1xuaW1wb3J0IHsgSUxpc3RGdW5jdGlvbkNvbnRyb2xFdmVudCwgSUxpc3RWaWV3Q29uZmlnSXRlbSB9IGZyb20gXCIuL2ludGVyZmFjZXNcIjtcbmltcG9ydCB7IElMaXN0RGF0YUVtaXRLZXksIElMaXN0RGF0YUVtaXRNdWx0aUtleSB9IGZyb20gXCIuL2ludGVyZmFjZXMvZGF0YS1lbWl0LmludGVyZmFjZVwiO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c0xpc3RUZW1wbGF0ZXNDb21wb25lbnRBYnN0cmFjdCB9IGZyb20gXCIuL3RlbXBsYXRlcy90ZW1wbGF0ZXMuY29tcG9uZW50LmFic3RyYWN0XCI7XG5cbkBDb21wb25lbnQoe1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2NvbXBvbmVudC1zZWxlY3RvclxuICBzZWxlY3RvcjogJ2xpYnNfdWktY29tcG9uZW50cy1saXN0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2xpc3QuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9saXN0LmNvbXBvbmVudC5zY3NzJ10sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBpbXBvcnRzOiBbXG4gICAgTmdUZW1wbGF0ZU91dGxldCwgVHJhbnNsYXRlTW9kdWxlLFxuICAgIExpYnNVaUNvbXBvbmVudHNMYWJlbENvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzSW5wdXRzU2VhcmNoQ29tcG9uZW50LFxuICAgIExpYnNVaUNvbXBvbmVudHNQb3BvdmVyQ29tcG9uZW50LFxuICAgIExpYnNVaUNvbXBvbmVudHNCdXR0b25zQnV0dG9uQ29tcG9uZW50XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgTGlic1VpQ29tcG9uZW50c0xpc3RDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIC8qIFBST1BFUlRZICovXG4gIHByb3RlY3RlZCByZWFkb25seSBFUlJPUl9NRVNTQUdFX0VNUFRZX1ZBTElEID0gRVJST1JfTUVTU0FHRV9FTVBUWV9WQUxJRDtcbiAgcHJvdGVjdGVkIGRpc2FibGVCdXR0b25VblNlbGVjdE9wdGlvbiA9IHNpZ25hbDxib29sZWFuPih0cnVlKTtcbiAgcHJvdGVjdGVkIGlzRXJyb3JSZXF1aXJlZCA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHByb3RlY3RlZCBsb2FkaW5nID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJvdGVjdGVkIGtleVNlYXJjaFN0b3JlID0gc2lnbmFsPHN0cmluZyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcblxuICBwcml2YXRlIG9uRGVzdHJveTogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0KCk7XG4gIHByaXZhdGUgb25TZWFyY2g6IFN1YmplY3Q8c3RyaW5nIHwgdW5kZWZpbmVkPiA9IG5ldyBTdWJqZWN0KCk7XG4gIHByaXZhdGUgb25SZWZyZXNoOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3QoKTtcbiAgcHJpdmF0ZSBvblNldEhpZGRlbkl0ZW1CeUtleTogU3ViamVjdDxBcnJheTx1bmtub3duPj4gPSBuZXcgU3ViamVjdCgpO1xuICBwcml2YXRlIG9uU2V0RGF0YVN0b3JlOiBTdWJqZWN0PEFycmF5PGFueT4+ID0gbmV3IFN1YmplY3QoKTtcbiAgcHJpdmF0ZSBvbkl0ZW1DaGFuZ2VVblNlbGVjdDogU3ViamVjdDxhbnk+ID0gbmV3IFN1YmplY3QoKTtcbiAgcHJpdmF0ZSBvblVwZGF0ZU11bHRpS2V5U2VsZWN0ZWRHcm91cDogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0KCk7XG4gIHByaXZhdGUgb25SZW1vdmVJdGVtczogU3ViamVjdDxBcnJheTx1bmtub3duPj4gPSBuZXcgU3ViamVjdCgpO1xuXG4gIHByaXZhdGUgY29tcG9uZW50UmVmPzogQ29tcG9uZW50UmVmPExpYnNVaUNvbXBvbmVudHNMaXN0VGVtcGxhdGVzQ29tcG9uZW50QWJzdHJhY3Q+O1xuICBwcml2YXRlIGNvbmZpZ0RhdGEgPSBzaWduYWw8SUxpc3RWaWV3Q29uZmlnSXRlbT4oe1xuICAgIHR5cGU6ICd0ZXh0JyxcbiAgICBjb25maWdUZW1wbGF0ZVRleHQ6IHtcbiAgICAgIGZpZWxkS2V5OiAnaWQnLFxuICAgICAgZ2V0VmFsdWU6IChpdGVtOiBhbnkpID0+IHtcbiAgICAgICAgcmV0dXJuIGl0ZW0ubGFiZWwgfHwgaXRlbS5uYW1lO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIHByaXZhdGUgZ3JvdXBNdWx0aUtleVNlbGVjdGVkID0gc2lnbmFsPEFycmF5PHVua25vd24+PihbXSk7XG4gIHByaXZhdGUgZnVuY3Rpb25Db250cm9sSW5wdXRTZWFyY2ggPSBzaWduYWw8SUlucHV0RnVuY3Rpb25Db250cm9sRXZlbnQgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG5cbiAgLyogSU5QVVQgKi9cbiAgcmVhZG9ubHkgaGlkZGVuSW5wdXRTZWFyY2ggPSBpbnB1dDxib29sZWFuPihmYWxzZSk7XG4gIHJlYWRvbmx5IGRyb3Bkb3duVGFiS2V5QWN0aXZlID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBrZXlTZWFyY2ggPSBpbnB1dDxzdHJpbmc+KCk7XG4gIHJlYWRvbmx5IGl0ZW1DaGFuZ2VVblNlbGVjdCA9IGlucHV0PGFueT4oKTtcbiAgcmVhZG9ubHkgcGFkZGluZ0xlZnRJdGVtID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgY29uZmlnID0gaW5wdXQucmVxdWlyZWQ8SUxpc3RWaWV3Q29uZmlnSXRlbSB8IHVuZGVmaW5lZD4oKTtcblxuICByZWFkb25seSBpc1NlYXJjaE9ubGluZSA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGRpc2FibGUgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBkaXNhYmxlTGFiZWwgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBsYWJlbENvbmZpZyA9IGlucHV0PElMYWJlbD4oKTtcbiAgcmVhZG9ubHkgc2VhcmNoQ29uZmlnID0gaW5wdXQ8SUlucHV0U2VhcmNoQ29uZmlnPih7fSk7XG4gIHJlYWRvbmx5IHNlYXJjaFBhZGRpbmcgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBkaXZpZGVyQ2xhc3NJbmNsdWRlID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBoYXNEaXZpZGVyID0gaW5wdXQ8Ym9vbGVhbj4odHJ1ZSk7XG4gIHJlYWRvbmx5IGJ1dHRvbnNPdGhlciA9IGlucHV0PEFycmF5PElCdXR0b24+IHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICByZWFkb25seSBoYXNCdXR0b25VblNlbGVjdE9wdGlvbiA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGNsaWNrRXhhY3RseSA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGJhY2tncm91bmRMaXN0Q3VzdG9tID0gaW5wdXQ8c3RyaW5nPignYmctWyNmZmZmZmZdJyk7XG4gIHJlYWRvbmx5IG1heEl0ZW1TaG93ID0gaW5wdXQ8bnVtYmVyPigpO1xuICByZWFkb25seSBrZXlTZWxlY3RlZCA9IGlucHV0PHVua25vd24+KCk7XG4gIHJlYWRvbmx5IG11bHRpS2V5U2VsZWN0ZWQgPSBpbnB1dDxBcnJheTx1bmtub3duPiB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTsvLyBsxrB1IMO9IGtoaSBz4butIGThu6VuZyBsaXN0dmlld1xuICByZWFkb25seSBrZXlzRGlzYWJsZUl0ZW0gPSBpbnB1dDxBcnJheTx1bmtub3duPiB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTsgLy8ga2jDtG5nIGTDuW5nIGdpw6EgdHLhu4sgbsOgeSBr4bq/dCBo4bujcCB24bubaSB0ZW1wbGF0ZSBjaGVja2JveCBjw7MgY29uZmlnIGNo4bupYSBjb25maWdDaGVja2JveENoZWNrQWxsXG4gIHJlYWRvbmx5IGtleXNIaWRkZW5JdGVtID0gaW5wdXQ8QXJyYXk8dW5rbm93bj4gfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7IC8vIGtow7RuZyBkw7luZyBnacOhIHRy4buLIG7DoHkga+G6v3QgaOG7o3AgduG7m2kgdGVtcGxhdGUgY2hlY2tib3ggY8OzIGNvbmZpZyBjaOG7qWEgY29uZmlnQ2hlY2tib3hDaGVja0FsbFxuICByZWFkb25seSBkYXRhID0gaW5wdXQ8QXJyYXk8YW55PiB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcmVhZG9ubHkgZm9jdXNJbnB1dFNlYXJjaCA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IHNraXBGb2N1c0lucHV0V2hlbktleVNlYXJjaFN0b3JlVW5kZWZpbmVkID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgZnVuY3Rpb25DdXN0b21BZGREYXRhVG9TdG9yZSA9IGlucHV0PChkYXRhOiBhbnksIHN0b3JlOiBhbnkpID0+IHZvaWQ+KCk7XG4gIHJlYWRvbmx5IGZ1bmN0aW9uR2V0SXRlbUF1dG9BZGRMaXN0ID0gaW5wdXQ8KCgpID0+IEFycmF5PGFueT4pIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICByZWFkb25seSB2YWxpZFJlcXVpcmVkID0gaW5wdXQ8SVZhbGlkUmVxdWlyZWQgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHJlYWRvbmx5IHNob3dWYWxpZGF0ZUJvdHRvbSA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IHpJbmRleCA9IGlucHV0PG51bWJlcj4oKTtcbiAgcmVhZG9ubHkgbG9hZGluZ0ljb25TaXplID0gaW5wdXQ8J2xhcmdlJyB8ICdtZWRpdW0nIHwgJ3NtYWxsJyB8ICdzbWFsbGVyJyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcmVhZG9ubHkgdGVtcGxhdGVSZWZTZWFyY2hOb0RhdGEgPSBpbnB1dDxUZW1wbGF0ZVJlZjxUWVBFX1RFTVBMQVRFX1JFRj4gfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHJlYWRvbmx5IHJlc2V0S2V5V2hlblNlbGVjdEFsbEtleURyb3Bkb3duID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgaWdub3JlQ2xhc3NEaXNhYmxlRGVmYXVsdFdoZW5Vc2VLZXlzRGlzYWJsZUl0ZW0gPSBpbnB1dDxib29sZWFuPigpOyAvLyBi4buPIGNo4bq/IMSR4buZIGRpc2FibGUgaXRlbSB0csOqbiBodG1sIMSR4buDIGRpc2FibGUgdOG7q25nIHBo4bqnbiB0cm9uZyByb3dzXG5cbiAgLyogT1VUUFVUICovXG4gIHJlYWRvbmx5IG91dFNlbGVjdEtleSA9IG91dHB1dDxJTGlzdERhdGFFbWl0S2V5IHwgdW5kZWZpbmVkPigpOyAvLyBz4butIGThu6VuZyBjaG8gdHlwZSBjaOG7jW4gMVxuICByZWFkb25seSBvdXRTZWxlY3RNdWx0aUtleSA9IG91dHB1dDxJTGlzdERhdGFFbWl0TXVsdGlLZXkgfCB1bmRlZmluZWQ+KCk7IC8vIHPhu60gZOG7pW5nIGNobyB0eXBlIGNobyBwaMOpcCBjaOG7jW4gbmhp4buBdS5cbiAgcmVhZG9ubHkgb3V0VW5TZWxlY3RNdWx0aUtleSA9IG91dHB1dDxBcnJheTx1bmtub3duPj4oKTsgLy8gc+G7rSBk4bulbmcgY2hvIHR5cGUgY2hvIHBow6lwIGNo4buNbiBuaGnhu4F1LlxuICByZWFkb25seSBvdXRDbGlja0J1dHRvbk90aGVyID0gb3V0cHV0PElCdXR0b24+KCk7XG4gIHJlYWRvbmx5IG91dEZpZWxkS2V5ID0gb3V0cHV0PHVua25vd24+KCk7XG4gIHJlYWRvbmx5IG91dENoYW5nZVZpZXcgPSBvdXRwdXQ8QXJyYXk8YW55Pj4oKTtcbiAgcmVhZG9ubHkgb3V0TG9hZGluZyA9IG91dHB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBvdXRGdW5jdGlvbnNDb250cm9sID0gb3V0cHV0PElMaXN0RnVuY3Rpb25Db250cm9sRXZlbnQ+KCk7XG4gIHJlYWRvbmx5IG91dENoYW5nU3RhZ2VGbGFnTW91c2VQb3BvdmVyID0gb3V0cHV0PElGbGFnTW91c2U+KCk7XG4gIHJlYWRvbmx5IG91dExvYWRJdGVtc0NvbXBsZXRlID0gb3V0cHV0PHsgaXRlbXM6IEFycmF5PGFueT4sIHBhZ2luZz86IElQYWdpbmcgfT4oKTtcblxuICAvKiBWSUVXIENISUxEICovXG4gIHByb3RlY3RlZCBsaXN0Vmlld0VsZW1lbnRSZWYgPSB2aWV3Q2hpbGQ8RWxlbWVudFJlZj4oJ2xpc3RWaWV3Q29udGFpbmVyJyk7XG4gIHByb3RlY3RlZCBjb250ZW50RWxlbWVudFJlZiA9IHZpZXdDaGlsZDxFbGVtZW50UmVmPignY29udGVudENvbnRhaW5lcicpO1xuXG4gIC8qIElOSkVDVCAqL1xuICBwcml2YXRlIGR5bmFtaWNDb21wb25lbnRTZXJ2aWNlID0gaW5qZWN0KExpYnNVaUR5bmFtaWNDb21wb25lbnRTZXJ2aWNlKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgdGhpcy5rZXlTZWFyY2hTdG9yZS5zZXQodGhpcy5rZXlTZWFyY2goKSk7XG4gICAgICB0aGlzLm9uU2VhcmNoLm5leHQodGhpcy5rZXlTZWFyY2goKSk7XG4gICAgfSwgeyBhbGxvd1NpZ25hbFdyaXRlczogdHJ1ZSB9KTtcbiAgICBlZmZlY3QoKCkgPT4gdGhpcy5vbkl0ZW1DaGFuZ2VVblNlbGVjdC5uZXh0KHRoaXMuaXRlbUNoYW5nZVVuU2VsZWN0KCkpKTtcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLmNvbXBvbmVudFJlZikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoIWlzRW1wdHkodGhpcy5rZXlzRGlzYWJsZUl0ZW0oKSkpIHtcbiAgICAgICAgdGhpcy5jb21wb25lbnRSZWYuc2V0SW5wdXQoJ2tleXNEaXNhYmxlSXRlbScsIHRoaXMua2V5c0Rpc2FibGVJdGVtKCkpO1xuICAgICAgfVxuICAgICAgaWYgKCFpc0VtcHR5KHRoaXMua2V5c0hpZGRlbkl0ZW0oKSkpIHtcbiAgICAgICAgdGhpcy5vblNldEhpZGRlbkl0ZW1CeUtleS5uZXh0KHRoaXMua2V5c0hpZGRlbkl0ZW0oKSB8fCBbXSk7XG4gICAgICB9XG4gICAgICBpZiAoIWlzRW1wdHkodGhpcy5kaXNhYmxlKCkpKSB7XG4gICAgICAgIHRoaXMuY29tcG9uZW50UmVmLnNldElucHV0KCdkaXNhYmxlJywgdGhpcy5kaXNhYmxlKCkpO1xuICAgICAgfVxuICAgICAgaWYgKCFpc0VtcHR5KHRoaXMuZGF0YSgpKSkge1xuICAgICAgICB0aGlzLm9uU2V0RGF0YVN0b3JlLm5leHQodGhpcy5kYXRhKCkgfHwgW10pO1xuICAgICAgfVxuICAgICAgaWYgKCFpc0VtcHR5KHRoaXMua2V5U2VsZWN0ZWQoKSkpIHtcbiAgICAgICAgdGhpcy5jb21wb25lbnRSZWYuc2V0SW5wdXQoJ2tleVNlbGVjdGVkJywgdGhpcy5rZXlTZWxlY3RlZCgpKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmNvbmZpZ0RhdGEoKT8udHlwZSAhPT0gJ2dyb3VwJyAmJiAhaXNFbXB0eSh0aGlzLm11bHRpS2V5U2VsZWN0ZWQoKSkpIHtcbiAgICAgICAgdGhpcy5jb21wb25lbnRSZWYuc2V0SW5wdXQoJ211bHRpS2V5U2VsZWN0ZWQnLCB0aGlzLm11bHRpS2V5U2VsZWN0ZWQoKSk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5jb25maWdEYXRhKCk/LnR5cGUgPT09ICdncm91cCcgJiYgIWlzRW1wdHkodGhpcy5tdWx0aUtleVNlbGVjdGVkKCkpKSB7XG4gICAgICAgIHRoaXMuY29tcG9uZW50UmVmLnNldElucHV0KCdtdWx0aUtleVNlbGVjdGVkJywgdGhpcy5tdWx0aUtleVNlbGVjdGVkKCkpO1xuICAgICAgICB0aGlzLm9uVXBkYXRlTXVsdGlLZXlTZWxlY3RlZEdyb3VwLm5leHQoKTtcbiAgICAgIH1cbiAgICB9LCB7IGFsbG93U2lnbmFsV3JpdGVzOiB0cnVlIH0pO1xuXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIHRoaXMucmVmcmVzaCgpO1xuICAgIH0pO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5vdXRGdW5jdGlvbnNDb250cm9sLmVtaXQoe1xuICAgICAgY2hlY2tJc1ZhbGlkOiB0aGlzLmNoZWNrSXNWYWxpZC5iaW5kKHRoaXMpLFxuICAgICAgcmVmcmVzaDogdGhpcy5yZWZyZXNoLmJpbmQodGhpcyksXG4gICAgICByZXNldEtleVNlbGVjdGVkOiB0aGlzLmhhbmRsZXJSZW1vdmVLZXlTZWxlY3RlZC5iaW5kKHRoaXMpLFxuICAgICAgZ2V0UmVjdExpc3RWaWV3OiBhc3luYyAoKSA9PiB0aGlzLmxpc3RWaWV3RWxlbWVudFJlZigpPy5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLFxuICAgICAgcmVtb3ZlSXRlbXM6IGFzeW5jIChrZXlzKSA9PiB0aGlzLm9uUmVtb3ZlSXRlbXMubmV4dChrZXlzKVxuICAgIH0pO1xuXG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5jb25maWcoKTtcbiAgICBpZiAoY29uZmlnKSB7XG4gICAgICB0aGlzLmNvbmZpZ0RhdGEuc2V0KHRoaXMuY2xvbmVDb25maWcoY29uZmlnKSlcbiAgICB9XG4gICAgaW5pdENvbmZpZyh0aGlzLmNvbmZpZ0RhdGEoKSk7XG4gICAgY29uc3QgY29tcENsYXNzID0gZ2V0Q29tcG9uZW50QnlUeXBlKHRoaXMuY29uZmlnRGF0YSgpLnR5cGUpO1xuXG4gICAgdGhpcy5jb21wb25lbnRSZWYgPSB0aGlzLmR5bmFtaWNDb21wb25lbnRTZXJ2aWNlLnJlc29sdmVDb21wb25lbnRGYWN0b3J5KGNvbXBDbGFzcyk7XG4gICAgLy8gY29uc3QgaW5zdGFuY2UgPSB0aGlzLmNvbXBvbmVudFJlZi5pbnN0YW5jZTtcblxuICAgIHRpbWVyKDApLnBpcGUodGFrZVVudGlsKHRoaXMub25EZXN0cm95KSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuZHluYW1pY0NvbXBvbmVudFNlcnZpY2UuYWRkVG9FbGVtZW50KHRoaXMuY29tcG9uZW50UmVmLCB0aGlzLmNvbnRlbnRFbGVtZW50UmVmKCk/Lm5hdGl2ZUVsZW1lbnQpO1xuICAgIH0pO1xuICAgIHRoaXMuY29tcG9uZW50UmVmLnNldElucHV0KCdvblNldERhdGFTdG9yZScsIHRoaXMub25TZXREYXRhU3RvcmUpO1xuICAgIHRoaXMuY29tcG9uZW50UmVmLnNldElucHV0KCdvblNldEhpZGRlbkl0ZW1CeUtleScsIHRoaXMub25TZXRIaWRkZW5JdGVtQnlLZXkpO1xuICAgIHRoaXMuY29tcG9uZW50UmVmLnNldElucHV0KCdjb25maWcnLCB0aGlzLmNvbmZpZ0RhdGEoKSk7XG5cbiAgICBpZiAodGhpcy5zZWFyY2hDb25maWcoKSkge1xuICAgICAgdGhpcy5jb21wb25lbnRSZWYuc2V0SW5wdXQoJ3NlYXJjaENvbmZpZycsIHRoaXMuc2VhcmNoQ29uZmlnKCkpO1xuICAgIH1cbiAgICB0aGlzLmNvbXBvbmVudFJlZi5zZXRJbnB1dCgnb25TZWFyY2gnLCB0aGlzLm9uU2VhcmNoKTtcbiAgICB0aGlzLmNvbXBvbmVudFJlZi5zZXRJbnB1dCgnb25SZWZyZXNoJywgdGhpcy5vblJlZnJlc2gpO1xuICAgIHRoaXMuY29tcG9uZW50UmVmLnNldElucHV0KCdrZXlTZWFyY2gnLCB0aGlzLmtleVNlYXJjaFN0b3JlKCkgPz8gJycpO1xuICAgIHRoaXMuY29tcG9uZW50UmVmLnNldElucHV0KCdkcm9wZG93blRhYktleUFjdGl2ZScsIHRoaXMuZHJvcGRvd25UYWJLZXlBY3RpdmUoKSk7XG4gICAgdGhpcy5jb21wb25lbnRSZWYuc2V0SW5wdXQoJ2NsaWNrRXhhY3RseScsIHRoaXMuY2xpY2tFeGFjdGx5KCkgfHwgZmFsc2UpO1xuICAgIHRoaXMuY29tcG9uZW50UmVmLnNldElucHV0KCdkaXNhYmxlJywgdGhpcy5kaXNhYmxlKCkpO1xuICAgIHRoaXMuY29tcG9uZW50UmVmLnNldElucHV0KCdwYWRkaW5nTGVmdEl0ZW0nLCB0aGlzLnBhZGRpbmdMZWZ0SXRlbSgpKTtcbiAgICB0aGlzLmNvbXBvbmVudFJlZi5zZXRJbnB1dCgncmVzZXRLZXlXaGVuU2VsZWN0QWxsS2V5RHJvcGRvd24nLCB0aGlzLnJlc2V0S2V5V2hlblNlbGVjdEFsbEtleURyb3Bkb3duKCkpO1xuICAgIHRoaXMuY29tcG9uZW50UmVmLnNldElucHV0KCdpZ25vcmVDbGFzc0Rpc2FibGVEZWZhdWx0V2hlblVzZUtleXNEaXNhYmxlSXRlbScsIHRoaXMuaWdub3JlQ2xhc3NEaXNhYmxlRGVmYXVsdFdoZW5Vc2VLZXlzRGlzYWJsZUl0ZW0oKSk7XG4gICAgdGhpcy5jb21wb25lbnRSZWYuc2V0SW5wdXQoJ2Z1bmN0aW9uQ3VzdG9tQWRkRGF0YVRvU3RvcmUnLCB0aGlzLmZ1bmN0aW9uQ3VzdG9tQWRkRGF0YVRvU3RvcmUoKSk7XG4gICAgdGhpcy5jb21wb25lbnRSZWYuc2V0SW5wdXQoJ2Z1bmN0aW9uR2V0SXRlbUF1dG9BZGRMaXN0JywgdGhpcy5mdW5jdGlvbkdldEl0ZW1BdXRvQWRkTGlzdCgpKTtcbiAgICB0aW1lcigwKS5waXBlKHRha2VVbnRpbCh0aGlzLm9uRGVzdHJveSkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5kYXRhKCkpIHtcbiAgICAgICAgdGhpcy5vblNldERhdGFTdG9yZS5uZXh0KHRoaXMuZGF0YSgpIHx8IFtdKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmICh0aGlzLm1heEl0ZW1TaG93KCkpIHtcbiAgICAgIHRoaXMuY29tcG9uZW50UmVmLnNldElucHV0KCdtYXhJdGVtU2hvdycsIHRoaXMubWF4SXRlbVNob3coKSk7XG4gICAgfVxuICAgIHRoaXMuY29tcG9uZW50UmVmLnNldElucHV0KCdrZXlTZWxlY3RlZCcsIHRoaXMua2V5U2VsZWN0ZWQoKSk7XG4gICAgaWYgKHRoaXMubXVsdGlLZXlTZWxlY3RlZCgpKSB7XG4gICAgICB0aGlzLmNvbXBvbmVudFJlZi5zZXRJbnB1dCgnbXVsdGlLZXlTZWxlY3RlZCcsIHRoaXMubXVsdGlLZXlTZWxlY3RlZCgpKTtcbiAgICB9XG4gICAgdGhpcy5jb21wb25lbnRSZWYuc2V0SW5wdXQoJ2tleXNEaXNhYmxlSXRlbScsIHRoaXMua2V5c0Rpc2FibGVJdGVtKCkgfHwgW10pO1xuICAgIHRoaXMuY29tcG9uZW50UmVmLnNldElucHV0KCdrZXlzSGlkZGVuSXRlbScsIHRoaXMua2V5c0hpZGRlbkl0ZW0oKSB8fCBbXSk7XG4gICAgaWYgKCFpc05pbCh0aGlzLmtleVNlbGVjdGVkKCkpIHx8IHRoaXMubXVsdGlLZXlTZWxlY3RlZCgpPy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuZGlzYWJsZUJ1dHRvblVuU2VsZWN0T3B0aW9uLnNldChmYWxzZSk7XG4gICAgfVxuICAgIHRoaXMuY29tcG9uZW50UmVmLnNldElucHV0KCdvbkl0ZW1DaGFuZ2VVblNlbGVjdCcsIHRoaXMub25JdGVtQ2hhbmdlVW5TZWxlY3QpO1xuICAgIHRoaXMuY29tcG9uZW50UmVmLnNldElucHV0KCdvblVwZGF0ZU11bHRpS2V5U2VsZWN0ZWRHcm91cCcsIHRoaXMub25VcGRhdGVNdWx0aUtleVNlbGVjdGVkR3JvdXApO1xuICAgIHRoaXMuY29tcG9uZW50UmVmLnNldElucHV0KCdvblJlbW92ZUl0ZW1zJywgdGhpcy5vblJlbW92ZUl0ZW1zKTtcbiAgICB0aGlzLmNvbXBvbmVudFJlZi5zZXRJbnB1dCgnekluZGV4JywgdGhpcy56SW5kZXgoKSk7XG4gICAgdGhpcy5jb21wb25lbnRSZWYuc2V0SW5wdXQoJ2lzU2VhcmNoT25saW5lJywgdGhpcy5pc1NlYXJjaE9ubGluZSgpKTtcbiAgICB0aGlzLmNvbXBvbmVudFJlZi5zZXRJbnB1dCgnZGlzYWJsZUxhYmVsJywgdGhpcy5kaXNhYmxlTGFiZWwoKSB8fCBmYWxzZSk7XG4gICAgdGhpcy5jb21wb25lbnRSZWYuc2V0SW5wdXQoJ2xvYWRpbmdJY29uU2l6ZScsIHRoaXMubG9hZGluZ0ljb25TaXplKCkpO1xuICAgIHRoaXMuY29tcG9uZW50UmVmLnNldElucHV0KCd0ZW1wbGF0ZVJlZlNlYXJjaE5vRGF0YScsIHRoaXMudGVtcGxhdGVSZWZTZWFyY2hOb0RhdGEoKSk7XG4gICAgbGV0IGtleVNlYXJjaCA9ICcnO1xuXG4gICAgY29uc3QgaW5zdGFuY2UgPSB0aGlzLmNvbXBvbmVudFJlZi5pbnN0YW5jZTtcblxuICAgIGluc3RhbmNlLm91dENoYW5nZVZpZXcuc3Vic2NyaWJlKGRhdGEgPT4ge1xuICAgICAgdGhpcy5vdXRDaGFuZ2VWaWV3LmVtaXQoZGF0YSk7XG5cbiAgICAgIGlmICh0aGlzLnNraXBGb2N1c0lucHV0V2hlbktleVNlYXJjaFN0b3JlVW5kZWZpbmVkKCkgJiYgaXNOaWwodGhpcy5rZXlTZWFyY2hTdG9yZSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuZm9jdXNJbnB1dFNlYXJjaCgpICYmIHRoaXMua2V5U2VhcmNoU3RvcmUoKSAhPT0ga2V5U2VhcmNoKSB7XG4gICAgICAgIGtleVNlYXJjaCA9IHRoaXMua2V5U2VhcmNoU3RvcmUoKSB8fCAnJztcbiAgICAgICAgdGhpcy5mdW5jdGlvbkNvbnRyb2xJbnB1dFNlYXJjaCgpPy5mb2N1cygpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGluc3RhbmNlLm91dFNlbGVjdEtleS5zdWJzY3JpYmUoZGF0YSA9PiB7XG4gICAgICB0aGlzLmRpc2FibGVCdXR0b25VblNlbGVjdE9wdGlvbi5zZXQoZmFsc2UpO1xuICAgICAgdGhpcy5vdXRTZWxlY3RLZXkuZW1pdChkYXRhKTtcbiAgICAgIHRoaXMuY2hlY2tJc1ZhbGlkKCk7XG4gICAgfSk7XG4gICAgaW5zdGFuY2Uub3V0RmllbGRLZXkuc3Vic2NyaWJlKChmaWVsZEtleTogdW5rbm93bikgPT4ge1xuICAgICAgdGhpcy5vdXRGaWVsZEtleS5lbWl0KGZpZWxkS2V5KTtcbiAgICB9KTtcbiAgICBpbnN0YW5jZS5vdXRMb2FkaW5nLnN1YnNjcmliZSgobG9hZGluZzogYm9vbGVhbikgPT4ge1xuICAgICAgdGhpcy5sb2FkaW5nLnNldChsb2FkaW5nKTtcbiAgICAgIHRoaXMub3V0TG9hZGluZy5lbWl0KGxvYWRpbmcpO1xuICAgIH0pO1xuICAgIGluc3RhbmNlLm91dExvYWRJdGVtc0NvbXBsZXRlLnN1YnNjcmliZSgoZXZlbnQ6IHsgaXRlbXM6IEFycmF5PGFueT4sIHBhZ2luZz86IElQYWdpbmcgfSkgPT4ge1xuICAgICAgdGhpcy5vdXRMb2FkSXRlbXNDb21wbGV0ZS5lbWl0KGV2ZW50KTtcbiAgICB9KTtcbiAgICBpZiAodGhpcy5jb25maWcoKSAmJiB0aGlzLmNvbmZpZygpPy5jb25maWdUZW1wbGF0ZVRleHQgJiYgdGhpcy5jb25maWcoKT8uY29uZmlnVGVtcGxhdGVUZXh0Py5hY3Rpb25Tb3J0KSB7XG4gICAgICBpbnN0YW5jZS5vdXRTb3J0U2luZ2xlU2VsZWN0LnN1YnNjcmliZShpdGVtU29ydCA9PiB7XG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuY29uZmlnKCk7XG4gICAgICAgIGlmIChjb25maWcgJiYgY29uZmlnLmNvbmZpZ1RlbXBsYXRlVGV4dCAmJiBjb25maWcuY29uZmlnVGVtcGxhdGVUZXh0Py5hY3Rpb25Tb3J0KSB7XG4gICAgICAgICAgY29uZmlnLmNvbmZpZ1RlbXBsYXRlVGV4dC5pdGVtU29ydCA9IGl0ZW1Tb3J0O1xuICAgICAgICAgIGNvbmZpZy5jb25maWdUZW1wbGF0ZVRleHQuYWN0aW9uU29ydChpdGVtU29ydCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICBpbnN0YW5jZS5vdXRDaGFuZ1N0YWdlRmxhZ01vdXNlUG9wb3Zlci5zdWJzY3JpYmUoKGZsYWc6IElGbGFnTW91c2UpID0+IHtcbiAgICAgIHRoaXMub3V0Q2hhbmdTdGFnZUZsYWdNb3VzZVBvcG92ZXIuZW1pdChmbGFnKTtcbiAgICB9KTtcbiAgICBjb25zdCB0eXBlID0gdGhpcy5jb25maWdEYXRhKCk/LnR5cGU7XG5cbiAgICBpZiAodHlwZSA9PT0gJ3RleHQnIHx8IHR5cGUgPT09ICdyYWRpbycpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaW5zdGFuY2Uub3V0U2VsZWN0TXVsdGlLZXkuc3Vic2NyaWJlKGRhdGEgPT4ge1xuICAgICAgdGhpcy5kaXNhYmxlQnV0dG9uVW5TZWxlY3RPcHRpb24uc2V0KGZhbHNlKTtcbiAgICAgIGlmICh0eXBlID09PSAnZ3JvdXAnKSB7XG4gICAgICAgIHRoaXMuZ3JvdXBNdWx0aUtleVNlbGVjdGVkLnNldChkYXRhLmtleXMpO1xuICAgICAgfVxuICAgICAgdGhpcy5vdXRTZWxlY3RNdWx0aUtleS5lbWl0KGRhdGEpO1xuICAgICAgdGhpcy5jaGVja0lzVmFsaWQoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyU2VhcmNoKGtleVNlYXJjaDogc3RyaW5nKSB7XG4gICAgdGhpcy5rZXlTZWFyY2hTdG9yZS5zZXQoa2V5U2VhcmNoKTtcbiAgICB0aGlzLm9uU2VhcmNoLm5leHQoa2V5U2VhcmNoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVyUmVtb3ZlS2V5U2VsZWN0ZWQoKSB7XG4gICAgaWYgKCF0aGlzLmNvbXBvbmVudFJlZikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLm91dFNlbGVjdEtleS5lbWl0KHVuZGVmaW5lZCk7XG4gICAgdGhpcy5vdXRTZWxlY3RNdWx0aUtleS5lbWl0KHVuZGVmaW5lZCk7XG4gICAgdGhpcy5jb21wb25lbnRSZWYuc2V0SW5wdXQoJ2tleVNlbGVjdGVkJywgJycpO1xuICAgIHRoaXMuY29tcG9uZW50UmVmLnNldElucHV0KCdtdWx0aUtleVNlbGVjdGVkJywgdW5kZWZpbmVkKTtcbiAgICB0aGlzLmRpc2FibGVCdXR0b25VblNlbGVjdE9wdGlvbi5zZXQodHJ1ZSk7XG4gICAgYXdhaXQgdGhpcy5jaGVja0lzVmFsaWQoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyQ2xpY2tCdXR0b25PdGhlcihidXR0b246IElCdXR0b24pIHtcbiAgICB0aGlzLm91dENsaWNrQnV0dG9uT3RoZXIuZW1pdChidXR0b24pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJGdW5jdGlvbkNvbnRyb2xJbnB1dFNlYXJjaChldmVudDogSUlucHV0RnVuY3Rpb25Db250cm9sRXZlbnQpIHtcbiAgICB0aGlzLmZ1bmN0aW9uQ29udHJvbElucHV0U2VhcmNoLnNldChldmVudCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNoZWNrSXNWYWxpZCgpIHtcbiAgICBpZiAoIXRoaXMudmFsaWRSZXF1aXJlZCB8fCAhdGhpcy5jb25maWcoKT8udHlwZSB8fCAhdGhpcy5jb21wb25lbnRSZWY/Lmluc3RhbmNlKSB7XG4gICAgICB0aGlzLmlzRXJyb3JSZXF1aXJlZC5zZXQoZmFsc2UpO1xuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgdHlwZSA9IHRoaXMuY29uZmlnKCk/LnR5cGU7XG4gICAgbGV0IGhhc0tleSA9ICFpc0VtcHR5KHRoaXMuY29tcG9uZW50UmVmLmluc3RhbmNlLm11bHRpS2V5U2VsZWN0ZWQpO1xuXG4gICAgaWYgKHR5cGUgPT09ICdncm91cCcpIHtcbiAgICAgIGhhc0tleSA9ICFpc0VtcHR5KHRoaXMuZ3JvdXBNdWx0aUtleVNlbGVjdGVkKTtcbiAgICB9XG4gICAgaWYgKHR5cGUgPT09ICd0ZXh0JyB8fCB0eXBlID09PSAncmFkaW8nKSB7XG4gICAgICBoYXNLZXkgPSAhaXNOaWwodGhpcy5jb21wb25lbnRSZWYuaW5zdGFuY2Uua2V5U2VsZWN0ZWQpO1xuICAgIH1cbiAgICB0aGlzLmlzRXJyb3JSZXF1aXJlZC5zZXQoIWhhc0tleSk7XG5cbiAgICByZXR1cm4gaGFzS2V5O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZWZyZXNoKCkge1xuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuY29uZmlnKCk7XG4gICAgaWYgKCFjb25maWcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5kcm9wZG93blRhYktleUFjdGl2ZSgpO1xuICAgIE9iamVjdC5hc3NpZ24odGhpcy5jb25maWdEYXRhLCB0aGlzLmNsb25lQ29uZmlnKGNvbmZpZykpO1xuICAgIHRoaXMub25SZWZyZXNoLm5leHQoKTtcbiAgfVxuXG4gIHByaXZhdGUgY2xvbmVDb25maWcoY29uZmlnSW5wdXQ6IElMaXN0Vmlld0NvbmZpZ0l0ZW0pOiBJTGlzdFZpZXdDb25maWdJdGVtIHtcbiAgICBpZiAoIWNvbmZpZ0lucHV0KSB7XG4gICAgICByZXR1cm4ge30gYXMgYW55O1xuICAgIH1cbiAgICBjb25zdCBzZXJ2aWNlT3RoZXIgPSBjb25maWdJbnB1dC5odHRwUmVxdWVzdERhdGE/LnNlcnZpY2VPdGhlcjtcbiAgICBjb25zdCBzZXJ2aWNlT3RoZXJSZXF1ZXN0QWxsSWRTZWxlY3RPclVuU2VsZWN0ID0gY29uZmlnSW5wdXQuY29uZmlnVGVtcGxhdGVDaGVja2JveD8uaHR0cFJlcXVlc3RBbGxJZFNlbGVjdE9yVW5TZWxlY3Q/LnNlcnZpY2VPdGhlcjtcblxuICAgIHNlcnZpY2VPdGhlciAmJiBkZWxldGUgY29uZmlnSW5wdXQuaHR0cFJlcXVlc3REYXRhPy5zZXJ2aWNlT3RoZXI7XG4gICAgc2VydmljZU90aGVyUmVxdWVzdEFsbElkU2VsZWN0T3JVblNlbGVjdCAmJiBkZWxldGUgY29uZmlnSW5wdXQuY29uZmlnVGVtcGxhdGVDaGVja2JveD8uaHR0cFJlcXVlc3RBbGxJZFNlbGVjdE9yVW5TZWxlY3Q/LnNlcnZpY2VPdGhlcjtcbiAgICBjb25zdCBjb25maWcgPSBjbG9uZURlZXAoY29uZmlnSW5wdXQpO1xuXG4gICAgc2VydmljZU90aGVyICYmIGNvbmZpZy5odHRwUmVxdWVzdERhdGEgJiYgKGNvbmZpZy5odHRwUmVxdWVzdERhdGEuc2VydmljZU90aGVyID0gc2VydmljZU90aGVyKTtcbiAgICBzZXJ2aWNlT3RoZXJSZXF1ZXN0QWxsSWRTZWxlY3RPclVuU2VsZWN0ICYmIGNvbmZpZy5jb25maWdUZW1wbGF0ZUNoZWNrYm94Py5odHRwUmVxdWVzdEFsbElkU2VsZWN0T3JVblNlbGVjdCAmJiAoY29uZmlnLmNvbmZpZ1RlbXBsYXRlQ2hlY2tib3guaHR0cFJlcXVlc3RBbGxJZFNlbGVjdE9yVW5TZWxlY3Quc2VydmljZU90aGVyID0gc2VydmljZU90aGVyUmVxdWVzdEFsbElkU2VsZWN0T3JVblNlbGVjdCk7XG4gICAgc2VydmljZU90aGVyICYmIGNvbmZpZ0lucHV0Lmh0dHBSZXF1ZXN0RGF0YSAmJiAoY29uZmlnSW5wdXQuaHR0cFJlcXVlc3REYXRhLnNlcnZpY2VPdGhlciA9IHNlcnZpY2VPdGhlcik7XG4gICAgc2VydmljZU90aGVyUmVxdWVzdEFsbElkU2VsZWN0T3JVblNlbGVjdCAmJiBjb25maWdJbnB1dC5jb25maWdUZW1wbGF0ZUNoZWNrYm94Py5odHRwUmVxdWVzdEFsbElkU2VsZWN0T3JVblNlbGVjdCAmJiAoY29uZmlnSW5wdXQuY29uZmlnVGVtcGxhdGVDaGVja2JveC5odHRwUmVxdWVzdEFsbElkU2VsZWN0T3JVblNlbGVjdC5zZXJ2aWNlT3RoZXIgPSBzZXJ2aWNlT3RoZXJSZXF1ZXN0QWxsSWRTZWxlY3RPclVuU2VsZWN0KTtcblxuICAgIHJldHVybiBjb25maWc7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLm91dExvYWRpbmcuZW1pdChmYWxzZSk7XG4gICAgdGhpcy5keW5hbWljQ29tcG9uZW50U2VydmljZS5yZW1vdmUodGhpcy5jb21wb25lbnRSZWYpO1xuICAgIHRoaXMub25SZWZyZXNoLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5vblNlYXJjaC5jb21wbGV0ZSgpO1xuICAgIHRoaXMub25TZXRIaWRkZW5JdGVtQnlLZXkuY29tcGxldGUoKTtcbiAgICB0aGlzLm9uVXBkYXRlTXVsdGlLZXlTZWxlY3RlZEdyb3VwLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5vbkRlc3Ryb3kubmV4dCgpO1xuICAgIHRoaXMub25EZXN0cm95LmNvbXBsZXRlKCk7XG4gIH1cbn0iLCI8ZGl2ICNsaXN0Vmlld0NvbnRhaW5lclxuICBjbGFzcz1cImZsZXggZmxleC1jb2xcIlxuICBbY2xhc3Mudy1mdWxsXT1cIiFtYXhJdGVtU2hvd1wiXG4gIFtjbGFzcy5oLWZ1bGxdPVwiIW1heEl0ZW1TaG93XCI+XG4gIEBpZiAobGFiZWxDb25maWcoKTsgYXMgbGFiZWxDb25maWcpIHtcbiAgICA8bGlic191aS1jb21wb25lbnRzLWxhYmVsIFtjbGFzc0luY2x1ZGVdPVwibGFiZWxDb25maWcuY2xhc3NJbmNsdWRlXCJcbiAgICAgIFtsYWJlbExlZnRdPVwibGFiZWxDb25maWcubGFiZWxMZWZ0XCJcbiAgICAgIFtsYWJlbExlZnRDbGFzc109XCJsYWJlbENvbmZpZy5sYWJlbExlZnRDbGFzc1wiXG4gICAgICBbcmVxdWlyZWRdPVwibGFiZWxDb25maWcucmVxdWlyZWQgXCJcbiAgICAgIFtkZXNjcmlwdGlvbl09XCJsYWJlbENvbmZpZy5kZXNjcmlwdGlvblwiXG4gICAgICBbZGVzY3JpcHRpb25DbGFzc109XCJsYWJlbENvbmZpZy5kZXNjcmlwdGlvbkNsYXNzXCJcbiAgICAgIFtsYWJlbFJpZ2h0XT1cImxhYmVsQ29uZmlnLmxhYmVsUmlnaHRcIlxuICAgICAgW2xhYmVsUmlnaHRDbGFzc109XCJsYWJlbENvbmZpZy5sYWJlbFJpZ2h0Q2xhc3NcIlxuICAgICAgW29ubHlTaG93Q291bnRdPVwibGFiZWxDb25maWcub25seVNob3dDb3VudFwiXG4gICAgICBbYnV0dG9uc0xlZnRdPVwibGFiZWxDb25maWcuYnV0dG9uc0xlZnRcIlxuICAgICAgW2J1dHRvbnNSaWdodF09XCJsYWJlbENvbmZpZy5idXR0b25zUmlnaHRcIlxuICAgICAgW2Rpc2FibGVCdXR0b25zTGVmdF09XCJsYWJlbENvbmZpZy5kaXNhYmxlQnV0dG9uc0xlZnQgfHwgZGlzYWJsZSgpXCJcbiAgICAgIFtkaXNhYmxlQnV0dG9uc1JpZ2h0XT1cImxhYmVsQ29uZmlnLmRpc2FibGVCdXR0b25zUmlnaHQgfHwgZGlzYWJsZSgpXCJcbiAgICAgIFtoYXNUb2dnbGVdPVwibGFiZWxDb25maWcuaGFzVG9nZ2xlXCJcbiAgICAgIFt0b2dnbGVBY3RpdmVdPVwibGFiZWxDb25maWcudG9nZ2xlQWN0aXZlXCJcbiAgICAgIFt0b2dnbGVEaXNhYmxlXT1cImxhYmVsQ29uZmlnLnRvZ2dsZURpc2FibGUgfHwgbG9hZGluZygpIHx8IGRpc2FibGUoKVwiXG4gICAgICBbcG9wb3Zlcl09XCJsYWJlbENvbmZpZy5wb3BvdmVyXCJcbiAgICAgIFtpY29uUG9wb3ZlckNsYXNzXT1cImxhYmVsQ29uZmlnLmljb25Qb3BvdmVyQ2xhc3NcIlxuICAgICAgW29ubHlTaG93Q291bnRdPVwibGFiZWxDb25maWcub25seVNob3dDb3VudFwiXG4gICAgICBbbGltaXRMZW5ndGhdPVwibGFiZWxDb25maWcubGltaXRMZW5ndGhcIlxuICAgICAgW2J1dHRvbnNEZXNjcmlwdGlvbl09XCJsYWJlbENvbmZpZy5idXR0b25zRGVzY3JpcHRpb25cIlxuICAgICAgW2Rpc2FibGVCdXR0b25zRGVzY3JpcHRpb25dPVwibGFiZWxDb25maWcuZGlzYWJsZUJ1dHRvbnNEZXNjcmlwdGlvbiB8fCBkaXNhYmxlKClcIlxuICAgICAgW2J1dHRvbnNEZXNjcmlwdGlvbkNvbnRhaW5lckNsYXNzXT1cImxhYmVsQ29uZmlnLmJ1dHRvbnNEZXNjcmlwdGlvbkNvbnRhaW5lckNsYXNzXCJcbiAgICAgIFtjb3VudF09XCJsYWJlbENvbmZpZy5jb3VudFwiIC8+XG4gIH1cblxuICBAaWYgKCFzaG93VmFsaWRhdGVCb3R0b20oKSkge1xuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZVZhbGlkYXRlXCI+PC9uZy1jb250YWluZXI+XG4gIH1cbiAgQGlmICghaGlkZGVuSW5wdXRTZWFyY2goKSkge1xuICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtaW5wdXRzLXNlYXJjaCBbc2VhcmNoQ29uZmlnXT1cInNlYXJjaENvbmZpZygpXCJcbiAgICAgIFtjbGFzcy5weC1bMTJweF1dPVwic2VhcmNoUGFkZGluZygpXCJcbiAgICAgIFtjbGFzc109XCJzZWFyY2hDb25maWcoKS5jbGFzc0NvdmVySW5wdXRTZWFyY2hcIlxuICAgICAgW2Rpc2FibGVdPVwiIGRpc2FibGUoKSB8fCBsb2FkaW5nKCkgfHwgZmFsc2VcIlxuICAgICAgKG91dFNlYXJjaCk9XCJoYW5kbGVyU2VhcmNoKCRldmVudClcIlxuICAgICAgKG91dEZ1bmN0aW9uc0NvbnRyb2wpPVwiaGFuZGxlckZ1bmN0aW9uQ29udHJvbElucHV0U2VhcmNoKCRldmVudClcIiAvPlxuICB9XG4gIEBpZiAoY29uZmlnKCk/LmNvbmZpZ0Rlc2NyaXB0aW9uR3JvdXA7IGFzIGRlc2NyaXB0aW9uKSB7XG4gICAgPGRpdiBbY2xhc3NdPVwiZGVzY3JpcHRpb24/LmNsYXNzSW5jbHVkZVwiPlxuICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1wb3BvdmVyIFtjb25maWddPVwiZGVzY3JpcHRpb24/LnRvb2x0aXBEZXNjcmlwdGlvblwiPlxuICAgICAgICA8ZGl2IFtjbGFzc109XCJkZXNjcmlwdGlvbj8uY2xhc3NUZXh0RGVzY3JpcHRpb25JbmNsdWRlXCI+e3sgZGVzY3JpcHRpb24udGV4dERlc2NyaXB0aW9uIH19PC9kaXY+XG4gICAgICA8L2xpYnNfdWktY29tcG9uZW50cy1wb3BvdmVyPlxuICAgIDwvZGl2PlxuICB9XG4gIEBpZiAoaGFzRGl2aWRlcigpICYmICghY29uZmlnKCk/Lmlnbm9yZVNob3dEYXRhV2hlbk5vdFNlYXJjaCB8fCBrZXlTZWFyY2hTdG9yZSgpKSkge1xuICAgIDxkaXYgY2xhc3M9XCJsaWJzLXVpLWJvcmRlci10b3AtZ2VuZXJhbCB7eyBkaXZpZGVyQ2xhc3NJbmNsdWRlKCkgPyBkaXZpZGVyQ2xhc3NJbmNsdWRlKCk6JycgfX1cIlxuICAgICAgW2NsYXNzLmxpYnMtdWktZGl2aWRlci1kZWZhdWx0XT1cIiEhc2VhcmNoUGFkZGluZygpICYmICFkaXZpZGVyQ2xhc3NJbmNsdWRlKClcIj5cbiAgICA8L2Rpdj5cbiAgfVxuICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCB7eyAoY29uZmlnKCk/Lmlnbm9yZVNob3dEYXRhV2hlbk5vdFNlYXJjaCAmJiBrZXlTZWFyY2hTdG9yZSgpICYmICFjb25maWcoKT8uaWdub3JlRml4SGVpZ2h0U2hvd0RhdGFXaGVuTm90U2VhcmNoKSA/ICdoLVszNTNweF0nIDogJ2gtZnVsbCcgfX1cIj5cbiAgICA8ZGl2ICNjb250ZW50Q29udGFpbmVyXG4gICAgICBjbGFzcz1cInctZnVsbCBoLWZ1bGwge3sgYmFja2dyb3VuZExpc3RDdXN0b20oKSB9fVwiXG4gICAgICBbY2xhc3MubGlicy11aS1kaXNhYmxlXT1cImRpc2FibGUoKSAmJiBkaXNhYmxlTGFiZWwoKVwiXG4gICAgICBbY2xhc3MucG9pbnRlci1ldmVudHMtbm9uZV09XCJkaXNhYmxlKCkgJiYgZGlzYWJsZUxhYmVsKClcIj5cbiAgICA8L2Rpdj5cblxuICAgIEBmb3IgKGJ1dHRvbk90aGVyIG9mIGJ1dHRvbnNPdGhlcigpOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJiZy1bI2ZmZmZmZl1cIj5cbiAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvbiBbdHlwZV09XCJidXR0b25PdGhlci50eXBlIHx8ICdidXR0b24tbGluay1wcmltYXJ5J1wiXG4gICAgICAgICAgW2xhYmVsXT1cImJ1dHRvbk90aGVyLmxhYmVsIHx8ICcgJ1wiXG4gICAgICAgICAgW2NsYXNzSWNvbkxlZnRdPVwiKGJ1dHRvbk90aGVyLmNsYXNzSWNvbkxlZnQgfHwgJycpKycgZmxleCBtci1bOHB4XSB0ZXh0LVsxNnB4XSdcIlxuICAgICAgICAgIGNsYXNzSW5jbHVkZT1cInctZnVsbCBsaWJzLXVpLWJvcmRlci10b3AtZ2VuZXJhbCB0ZXh0LWxlZnQgcm91bmRlZC0wIHt7IGJ1dHRvbk90aGVyLmNsYXNzSW5jbHVkZSA/IGJ1dHRvbk90aGVyLmNsYXNzSW5jbHVkZTonJyB9fVwiXG4gICAgICAgICAgY2xhc3NMYWJlbD1cImxpYnMtdWktZm9udC1oNXIgd2hpdGVzcGFjZS1ub3JtYWxcIlxuICAgICAgICAgIFtkaXNhYmxlXT1cImJ1dHRvbk90aGVyLmRpc2FibGUgfHwgZGlzYWJsZSgpIHx8IGxvYWRpbmcoKSB8fCBmYWxzZVwiXG4gICAgICAgICAgKG91dENsaWNrKT1cImhhbmRsZXJDbGlja0J1dHRvbk90aGVyKGJ1dHRvbk90aGVyKVwiIC8+XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gICAgQGlmIChoYXNCdXR0b25VblNlbGVjdE9wdGlvbigpKSB7XG4gICAgICA8ZGl2IGNsYXNzPVwiYmctWyNmZmZmZmZdIHJvdW5kZWQtYi1bNHB4XVwiPlxuICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uIGxhYmVsPVwiaTE4bl91bnNlbGVjdF9vcHRpb25cIlxuICAgICAgICAgIHR5cGU9XCJidXR0b24tbGluay1kYW5nZXItaGlnaFwiXG4gICAgICAgICAgY2xhc3NJY29uTGVmdD1cImZsZXggbXItWzhweF0gbGlicy11aS1pY29uLWNsb3NlXCJcbiAgICAgICAgICBjbGFzc0luY2x1ZGU9XCJ3LTEwMCBsaWJzLXVpLWJvcmRlci10b3AtZ2VuZXJhbCB0ZXh0LWxlZnQgcm91bmRlZC0wXCJcbiAgICAgICAgICBjbGFzc0xhYmVsPVwibW8tbGliLWZvbnQtaDVyIHdoaXRlc3BhY2Utbm9ybWFsXCJcbiAgICAgICAgICBbZGlzYWJsZV09XCJkaXNhYmxlQnV0dG9uVW5TZWxlY3RPcHRpb24oKSB8fCBkaXNhYmxlKCkgfHwgbG9hZGluZygpIHx8IGZhbHNlXCJcbiAgICAgICAgICAob3V0Q2xpY2spPVwiaGFuZGxlclJlbW92ZUtleVNlbGVjdGVkKClcIiAvPlxuICAgICAgPC9kaXY+XG4gICAgfVxuICA8L2Rpdj5cbiAgQGlmIChzaG93VmFsaWRhdGVCb3R0b20oKSkge1xuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZVZhbGlkYXRlXCI+PC9uZy1jb250YWluZXI+XG4gIH1cbjwvZGl2PlxuXG48bmctdGVtcGxhdGUgI3RlbXBsYXRlVmFsaWRhdGU+XG4gIEBpZiAoaXNFcnJvclJlcXVpcmVkKCkpIHtcbiAgICA8ZGl2IFtjbGFzcy5tYi1bOHB4XV09XCIhc2hvd1ZhbGlkYXRlQm90dG9tKClcIlxuICAgICAgW2NsYXNzLm10LVs4cHhdXT1cInNob3dWYWxpZGF0ZUJvdHRvbSgpXCI+XG4gICAgICA8c3BhbiBjbGFzcz1cInRleHQtWyNlZTJkNDFdIG1vLWxpYi1mb250LWg3XCJcbiAgICAgICAgW2lubmVySHRtbF09XCIodmFsaWRSZXF1aXJlZCgpPy5tZXNzYWdlIHx8IEVSUk9SX01FU1NBR0VfRU1QVFlfVkFMSUQpfCB0cmFuc2xhdGU6dmFsaWRSZXF1aXJlZCgpPy5pbnRlcnBvbGF0ZVBhcmFtc1wiPlxuICAgICAgPC9zcGFuPlxuICAgIDwvZGl2PlxuICB9XG48L25nLXRlbXBsYXRlPlxuIl19
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
|
+
import { Pipe } from '@angular/core';
|
|
3
|
+
import { CHARACTER_DATA_EMPTY } from '@libs-ui/utils';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
export class MoLibsSharedPipesCallFunctionInTemplatePipe {
|
|
6
|
+
async transform(value, functionCall, item, lang, otherData) {
|
|
7
|
+
if (!functionCall) {
|
|
8
|
+
return this.getValueOfType(value);
|
|
9
|
+
}
|
|
10
|
+
return this.getValueOfType(await functionCall(value, item, lang, otherData));
|
|
11
|
+
}
|
|
12
|
+
async getValueOfType(value) {
|
|
13
|
+
if ('object' === typeof value || value instanceof Array || typeof value === 'boolean') {
|
|
14
|
+
return value !== null ? value : CHARACTER_DATA_EMPTY;
|
|
15
|
+
}
|
|
16
|
+
return value ? `${value}` : value === 0 ? '0' : CHARACTER_DATA_EMPTY;
|
|
17
|
+
}
|
|
18
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MoLibsSharedPipesCallFunctionInTemplatePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
|
|
19
|
+
static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: MoLibsSharedPipesCallFunctionInTemplatePipe, isStandalone: true, name: "MoLibsSharedPipesCallFunctionInTemplate" });
|
|
20
|
+
}
|
|
21
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MoLibsSharedPipesCallFunctionInTemplatePipe, decorators: [{
|
|
22
|
+
type: Pipe,
|
|
23
|
+
args: [{
|
|
24
|
+
name: 'MoLibsSharedPipesCallFunctionInTemplate',
|
|
25
|
+
standalone: true
|
|
26
|
+
}]
|
|
27
|
+
}] });
|
|
28
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsbC1mdW5jdGlvbi1pbi10ZW1wbGF0ZS5waXBlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL2xpc3Qvc3JjL3BpcGVzL2NhbGwtZnVuY3Rpb24taW4tdGVtcGxhdGUucGlwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx1REFBdUQ7QUFDdkQsT0FBTyxFQUFFLElBQUksRUFBaUIsTUFBTSxlQUFlLENBQUM7QUFDcEQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7O0FBTXRELE1BQU0sT0FBTywyQ0FBMkM7SUFFdEQsS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFVLEVBQUUsWUFBOEUsRUFBRSxJQUFVLEVBQUUsSUFBYSxFQUFFLFNBQW1CO1FBQ3hKLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUNsQixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDcEMsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLFlBQVksQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQy9FLENBQUM7SUFFTyxLQUFLLENBQUMsY0FBYyxDQUFDLEtBQVU7UUFDckMsSUFBSSxRQUFRLEtBQUssT0FBTyxLQUFLLElBQUksS0FBSyxZQUFZLEtBQUssSUFBSSxPQUFPLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN0RixPQUFPLEtBQUssS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsb0JBQW9CLENBQUM7UUFDdkQsQ0FBQztRQUVELE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDO0lBQ3ZFLENBQUM7d0dBaEJVLDJDQUEyQztzR0FBM0MsMkNBQTJDOzs0RkFBM0MsMkNBQTJDO2tCQUp2RCxJQUFJO21CQUFDO29CQUNKLElBQUksRUFBRSx5Q0FBeUM7b0JBQy9DLFVBQVUsRUFBRSxJQUFJO2lCQUNqQiIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbmltcG9ydCB7IFBpcGUsIFBpcGVUcmFuc2Zvcm0gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENIQVJBQ1RFUl9EQVRBX0VNUFRZIH0gZnJvbSAnQGxpYnMtdWkvdXRpbHMnO1xuXG5AUGlwZSh7XG4gIG5hbWU6ICdNb0xpYnNTaGFyZWRQaXBlc0NhbGxGdW5jdGlvbkluVGVtcGxhdGUnLFxuICBzdGFuZGFsb25lOiB0cnVlXG59KVxuZXhwb3J0IGNsYXNzIE1vTGlic1NoYXJlZFBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGUgaW1wbGVtZW50cyBQaXBlVHJhbnNmb3JtIHtcblxuICBhc3luYyB0cmFuc2Zvcm0odmFsdWU6IGFueSwgZnVuY3Rpb25DYWxsPzogKHZhbHVlOiBhbnksIGl0ZW0/OiBhbnksIGxhbmc/OiBzdHJpbmcsIG90aGVyRGF0YT86IGFueSkgPT4gYW55LCBpdGVtPzogYW55LCBsYW5nPzogc3RyaW5nLCBvdGhlckRhdGE/OiB1bmtub3duKSB7XG4gICAgaWYgKCFmdW5jdGlvbkNhbGwpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldFZhbHVlT2ZUeXBlKHZhbHVlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5nZXRWYWx1ZU9mVHlwZShhd2FpdCBmdW5jdGlvbkNhbGwodmFsdWUsIGl0ZW0sIGxhbmcsIG90aGVyRGF0YSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZXRWYWx1ZU9mVHlwZSh2YWx1ZTogYW55KSB7XG4gICAgaWYgKCdvYmplY3QnID09PSB0eXBlb2YgdmFsdWUgfHwgdmFsdWUgaW5zdGFuY2VvZiBBcnJheSB8fCB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykge1xuICAgICAgcmV0dXJuIHZhbHVlICE9PSBudWxsID8gdmFsdWUgOiBDSEFSQUNURVJfREFUQV9FTVBUWTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWUgPyBgJHt2YWx1ZX1gIDogdmFsdWUgPT09IDAgPyAnMCcgOiBDSEFSQUNURVJfREFUQV9FTVBUWTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
|
+
import { Pipe } from '@angular/core';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
export class LibsUiCheckSelectedByKeyPipe {
|
|
5
|
+
transform(value, multiKeys, length) {
|
|
6
|
+
if (!multiKeys || !(multiKeys instanceof Array) || !multiKeys.length || !length) {
|
|
7
|
+
return false;
|
|
8
|
+
}
|
|
9
|
+
return multiKeys.some(key => key === value);
|
|
10
|
+
}
|
|
11
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LibsUiCheckSelectedByKeyPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
|
|
12
|
+
static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: LibsUiCheckSelectedByKeyPipe, isStandalone: true, name: "LibsUiCheckSelectedByKeyPipe" });
|
|
13
|
+
}
|
|
14
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LibsUiCheckSelectedByKeyPipe, decorators: [{
|
|
15
|
+
type: Pipe,
|
|
16
|
+
args: [{
|
|
17
|
+
name: 'LibsUiCheckSelectedByKeyPipe',
|
|
18
|
+
standalone: true
|
|
19
|
+
}]
|
|
20
|
+
}] });
|
|
21
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2stc2VsZWN0ZWQtYnkta2V5LnBpcGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvbGlzdC9zcmMvcGlwZXMvY2hlY2stc2VsZWN0ZWQtYnkta2V5LnBpcGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsdURBQXVEO0FBQ3ZELE9BQU8sRUFBRSxJQUFJLEVBQWlCLE1BQU0sZUFBZSxDQUFDOztBQUtwRCxNQUFNLE9BQU8sNEJBQTRCO0lBQ3ZDLFNBQVMsQ0FBQyxLQUFVLEVBQUUsU0FBaUMsRUFBRSxNQUEwQjtRQUNqRixJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQyxTQUFTLFlBQVksS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDaEYsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBRUQsT0FBTyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLEtBQUssQ0FBQyxDQUFDO0lBQzlDLENBQUM7d0dBUFUsNEJBQTRCO3NHQUE1Qiw0QkFBNEI7OzRGQUE1Qiw0QkFBNEI7a0JBSnhDLElBQUk7bUJBQUM7b0JBQ0osSUFBSSxFQUFFLDhCQUE4QjtvQkFDcEMsVUFBVSxFQUFFLElBQUk7aUJBQ2pCIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuaW1wb3J0IHsgUGlwZSwgUGlwZVRyYW5zZm9ybSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuQFBpcGUoe1xuICBuYW1lOiAnTGlic1VpQ2hlY2tTZWxlY3RlZEJ5S2V5UGlwZScsXG4gIHN0YW5kYWxvbmU6IHRydWVcbn0pXG5leHBvcnQgY2xhc3MgTGlic1VpQ2hlY2tTZWxlY3RlZEJ5S2V5UGlwZSBpbXBsZW1lbnRzIFBpcGVUcmFuc2Zvcm0ge1xuICB0cmFuc2Zvcm0odmFsdWU6IGFueSwgbXVsdGlLZXlzOiBBcnJheTxhbnk+IHwgdW5kZWZpbmVkLCBsZW5ndGg6IG51bWJlciB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICAgIGlmICghbXVsdGlLZXlzIHx8ICEobXVsdGlLZXlzIGluc3RhbmNlb2YgQXJyYXkpIHx8ICFtdWx0aUtleXMubGVuZ3RoIHx8ICFsZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gbXVsdGlLZXlzLnNvbWUoa2V5ID0+IGtleSA9PT0gdmFsdWUpO1xuICB9XG59Il19
|