@libs-ui/components-tags 0.2.10-6.2
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/esm2022/index.mjs +3 -0
- package/esm2022/interfaces/tags.interface.mjs +2 -0
- package/esm2022/libs-ui-components-tags.mjs +5 -0
- package/esm2022/pipes/get-color.pipe.mjs +40 -0
- package/esm2022/tags.component.mjs +716 -0
- package/fesm2022/libs-ui-components-tags.mjs +759 -0
- package/fesm2022/libs-ui-components-tags.mjs.map +1 -0
- package/index.d.ts +2 -0
- package/interfaces/tags.interface.d.ts +44 -0
- package/package.json +25 -0
- package/pipes/get-color.pipe.d.ts +7 -0
- package/tags.component.d.ts +143 -0
|
@@ -0,0 +1,716 @@
|
|
|
1
|
+
import { NgStyle, NgTemplateOutlet } from '@angular/common';
|
|
2
|
+
import { ChangeDetectionStrategy, Component, computed, effect, inject, input, model, output, signal, untracked, viewChild } from '@angular/core';
|
|
3
|
+
import { LibsUiComponentsAvatarComponent } from '@libs-ui/components-avatar';
|
|
4
|
+
import { LibsUiComponentsInputsInputComponent } from '@libs-ui/components-inputs-input';
|
|
5
|
+
import { LibsUiComponentsLabelComponent } from '@libs-ui/components-label';
|
|
6
|
+
import { getFieldKeyByType, LibsUiComponentsListComponent } from '@libs-ui/components-list';
|
|
7
|
+
import { LibsUiComponentsPopoverComponent } from '@libs-ui/components-popover';
|
|
8
|
+
import { LibsUiHttpRequestService } from '@libs-ui/services-http-request';
|
|
9
|
+
import { cloneDeep, ERROR_MESSAGE_EMPTY_VALID, ERROR_MESSAGE_MAX_VALID, ERROR_MESSAGE_PATTEN_VALID, escapeHtml, get, isNil, set, uuid } from '@libs-ui/utils';
|
|
10
|
+
import { TranslateModule } from '@ngx-translate/core';
|
|
11
|
+
import { debounceTime, Subject, takeUntil } from 'rxjs';
|
|
12
|
+
import { LibsUiComponentsTagsGetColorPipe } from './pipes/get-color.pipe';
|
|
13
|
+
import { LibsUiComponentsClickOutsideDirective } from '@libs-ui/components-click-outside';
|
|
14
|
+
import * as i0 from "@angular/core";
|
|
15
|
+
import * as i1 from "@ngx-translate/core";
|
|
16
|
+
export class LibsUiComponentsTagsComponent {
|
|
17
|
+
/* PROPERTY */
|
|
18
|
+
flagMouse = signal({ isMouseEnter: false, isMouseEnterContent: false });
|
|
19
|
+
loading = signal(false);
|
|
20
|
+
loadingDetail = signal(false);
|
|
21
|
+
keySearch = signal('');
|
|
22
|
+
valueInput = signal('');
|
|
23
|
+
itemsSelected = signal([]);
|
|
24
|
+
showList = signal(false);
|
|
25
|
+
positionList = signal(undefined);
|
|
26
|
+
keysSelected = signal([]);
|
|
27
|
+
disableWhenMaxItem = signal(false);
|
|
28
|
+
itemChangeUnSelect = signal(undefined);
|
|
29
|
+
focus = signal(false);
|
|
30
|
+
error = signal(undefined);
|
|
31
|
+
fieldKey = signal('id');
|
|
32
|
+
functionGetItemAutoAddList = computed(() => {
|
|
33
|
+
if (!this.enterAutoAddTagToList()) {
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
return () => this.itemsSelected().filter(item => `${item[this.fieldKey()]}`.search(this.fakeId()) === 0).reverse();
|
|
37
|
+
});
|
|
38
|
+
fakeId = signal(uuid());
|
|
39
|
+
timeOutFlag = signal(undefined);
|
|
40
|
+
timeOutChangeSearch = signal(undefined);
|
|
41
|
+
timeOutCheckViewChange = signal(undefined);
|
|
42
|
+
timeoutClickOutside = signal(undefined);
|
|
43
|
+
clientHeight = signal(undefined);
|
|
44
|
+
itemsOfList = signal([]);
|
|
45
|
+
keySearchChange = new Subject();
|
|
46
|
+
keySearchChangeSub = signal(undefined);
|
|
47
|
+
tempIgnoreEmit = signal(false);
|
|
48
|
+
popoverFunctionControl = signal(undefined);
|
|
49
|
+
inputFunctionControl = signal(undefined);
|
|
50
|
+
typePopover = signal(undefined);
|
|
51
|
+
listFunctionControl = signal(undefined);
|
|
52
|
+
defaultItemsSelectedCurrent = signal(undefined);
|
|
53
|
+
onDestroy = new Subject();
|
|
54
|
+
/* INPUT */
|
|
55
|
+
classIncludePopover = input();
|
|
56
|
+
enterAutoAddTagToList = input(false);
|
|
57
|
+
checkExitIsLabelInclude = input();
|
|
58
|
+
checkExitByFields = input();
|
|
59
|
+
parentBorderWidth = input();
|
|
60
|
+
functionCheckPermissionCreateTag = input(() => true);
|
|
61
|
+
placeholder = input();
|
|
62
|
+
httpRequestDetailItemByIds = input();
|
|
63
|
+
fieldLabel = input('label');
|
|
64
|
+
maxItemInput = input();
|
|
65
|
+
zIndex = input();
|
|
66
|
+
config = input();
|
|
67
|
+
disable = input();
|
|
68
|
+
readonly = input();
|
|
69
|
+
labelConfig = input();
|
|
70
|
+
defaultItemsSelected = input();
|
|
71
|
+
defaultKeysSelected = input();
|
|
72
|
+
listSearchConfig = input();
|
|
73
|
+
isSearchOnline = input(false);
|
|
74
|
+
listSearchPadding = input();
|
|
75
|
+
listDividerClassInclude = input();
|
|
76
|
+
listConfig = input();
|
|
77
|
+
listButtonsOther = input();
|
|
78
|
+
listClickExactly = input();
|
|
79
|
+
listBackgroundListCustom = input();
|
|
80
|
+
listMaxItemShow = input();
|
|
81
|
+
listHiddenInputSearchWhenHasSearchConfig = input();
|
|
82
|
+
removeTextSearchWhenBlurInput = input(true);
|
|
83
|
+
keysHiddenItem = model();
|
|
84
|
+
keysDisableItem = input();
|
|
85
|
+
ignoreEmitWhenSameDataSelected = input();
|
|
86
|
+
singleSelected = input();
|
|
87
|
+
classIncludeTagItem = input();
|
|
88
|
+
classIconRemoveTagItem = input();
|
|
89
|
+
showBorderActiveWhenFocusInput = input();
|
|
90
|
+
fieldGetImage = input();
|
|
91
|
+
imageSize = input(16);
|
|
92
|
+
fieldGetTextAvatar = input('user');
|
|
93
|
+
classAvatarInclude = input();
|
|
94
|
+
getLastTextAfterSpace = input();
|
|
95
|
+
validRequired = input();
|
|
96
|
+
validMaxItemSelected = input();
|
|
97
|
+
validPattern = input();
|
|
98
|
+
showListBellow = input();
|
|
99
|
+
hiddenInputWhenReadonly = input();
|
|
100
|
+
/* OUTPUT */
|
|
101
|
+
outSelectMultiItem = output();
|
|
102
|
+
outValidEvent = output();
|
|
103
|
+
outFunctionsControl = output();
|
|
104
|
+
outClickButtonOther = output();
|
|
105
|
+
outShowListEvent = output();
|
|
106
|
+
outChangStageFlagMouse = output();
|
|
107
|
+
outLoadingGetDetailSelected = output();
|
|
108
|
+
/* VIEW CHILD */
|
|
109
|
+
tagsEl = viewChild.required('tagsEl');
|
|
110
|
+
/* INJECT*/
|
|
111
|
+
httpRequestService = inject(LibsUiHttpRequestService);
|
|
112
|
+
constructor() {
|
|
113
|
+
effect(() => {
|
|
114
|
+
const maxItemInput = this.maxItemInput();
|
|
115
|
+
untracked(() => {
|
|
116
|
+
this.disableWhenMaxItem.set(false);
|
|
117
|
+
if (maxItemInput && maxItemInput <= this.itemsSelected().length) {
|
|
118
|
+
this.disableWhenMaxItem.set(true);
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
});
|
|
122
|
+
effect(() => {
|
|
123
|
+
const listConfig = this.listConfig();
|
|
124
|
+
untracked(() => {
|
|
125
|
+
if (listConfig) {
|
|
126
|
+
this.fieldKey.set(getFieldKeyByType(listConfig, 'id'));
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
effect(() => {
|
|
131
|
+
const currentItems = this.defaultItemsSelected() || [];
|
|
132
|
+
untracked(() => {
|
|
133
|
+
const previousItems = this.defaultItemsSelectedCurrent() || [];
|
|
134
|
+
this.defaultItemsSelectedCurrent.set(this.defaultItemsSelected());
|
|
135
|
+
if (previousItems.length !== currentItems.length) {
|
|
136
|
+
this.updateItemsSelected(currentItems);
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
for (const prevItem of previousItems) {
|
|
140
|
+
if (!currentItems.some(item => get(item, this.fieldKey()) === get(prevItem, this.fieldKey()))) {
|
|
141
|
+
this.updateItemsSelected(currentItems);
|
|
142
|
+
break;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
effect(() => {
|
|
148
|
+
const currentValue = this.defaultKeysSelected() || [];
|
|
149
|
+
untracked(() => {
|
|
150
|
+
const previousValue = this.keysSelected() || [];
|
|
151
|
+
if (previousValue.length !== currentValue.length) {
|
|
152
|
+
this.getDetailByIds(currentValue);
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
const keysNew = currentValue.filter(key => !this.itemsSelected().some(item => item[this.fieldKey()] === key));
|
|
156
|
+
if (keysNew.length) {
|
|
157
|
+
this.getDetailByIds(keysNew);
|
|
158
|
+
}
|
|
159
|
+
});
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
ngOnInit() {
|
|
163
|
+
if (!this.config()) {
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
const httpRequestDetailItemByIds = this.httpRequestDetailItemByIds();
|
|
167
|
+
if (httpRequestDetailItemByIds && (!httpRequestDetailItemByIds.guideAutoUpdateArgumentsValue || !httpRequestDetailItemByIds.guideAutoUpdateArgumentsValue?.detailById)) {
|
|
168
|
+
throw 'Config getDetailByIds yêu cầu tối thiểu các tham số guideAutoUpdateArgumentsValue, detailById';
|
|
169
|
+
}
|
|
170
|
+
const preprocessor = (keys) => {
|
|
171
|
+
if (!keys || !(keys instanceof Array) || !keys.length) {
|
|
172
|
+
return '';
|
|
173
|
+
}
|
|
174
|
+
return keys.join(';');
|
|
175
|
+
};
|
|
176
|
+
if (httpRequestDetailItemByIds?.guideAutoUpdateArgumentsValue?.detailById) {
|
|
177
|
+
httpRequestDetailItemByIds.guideAutoUpdateArgumentsValue.detailById.fieldGetValue = httpRequestDetailItemByIds.guideAutoUpdateArgumentsValue.detailById.fieldGetValue ?? 'keys';
|
|
178
|
+
httpRequestDetailItemByIds.guideAutoUpdateArgumentsValue.detailById.preprocessor = httpRequestDetailItemByIds.guideAutoUpdateArgumentsValue.detailById.preprocessor ?? preprocessor;
|
|
179
|
+
}
|
|
180
|
+
this.outFunctionsControl.emit({
|
|
181
|
+
valid: this.checkValid.bind(this),
|
|
182
|
+
removeList: async () => this.popoverFunctionControl()?.removePopoverOverlay(),
|
|
183
|
+
updateLabel: this.updateLabel.bind(this),
|
|
184
|
+
clearItemSelected: this.clearItemSelected.bind(this),
|
|
185
|
+
clearKeySearch: () => this.handlerValueChangeSearch(''),
|
|
186
|
+
focusInput: () => this.focusInput(),
|
|
187
|
+
getFakeId: async () => this.fakeId(),
|
|
188
|
+
createTag: this.handlerEnterEvent.bind(this),
|
|
189
|
+
removeItemSelected: this.handlerRemoveItemSelected.bind(this),
|
|
190
|
+
resetError: this.resetError.bind(this),
|
|
191
|
+
resetToDefaultDataSelected: this.resetToDefaultDataSelected.bind(this),
|
|
192
|
+
updateItemSelectedDisable: this.updateItemSelectedDisable.bind(this),
|
|
193
|
+
refreshListData: this.refreshListData.bind(this),
|
|
194
|
+
setError: this.setError.bind(this)
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
async setError(message) {
|
|
198
|
+
this.error.set({ message });
|
|
199
|
+
}
|
|
200
|
+
handlerPopoverFunctionControlEvent(event) {
|
|
201
|
+
this.popoverFunctionControl.set(event);
|
|
202
|
+
}
|
|
203
|
+
async updateLabel() {
|
|
204
|
+
if (!this.itemsSelected() || !this.itemsSelected().length) {
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
this.itemsSelected.update(items => {
|
|
208
|
+
items.forEach(item => this.updateFieldLabel(item));
|
|
209
|
+
return [...items];
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
updateFieldLabel(item) {
|
|
213
|
+
const ref = get(item, 'ref') || item;
|
|
214
|
+
const getValue = this.config()?.getValue;
|
|
215
|
+
set(item, 'fieldLabel', `${get(ref, this.fieldLabel()) || ref.label || ref.name || ' '}`);
|
|
216
|
+
if (getValue) {
|
|
217
|
+
set(item, 'fieldLabel', getValue(ref) || ' ');
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
async clearItemSelected(ignoreValid = false) {
|
|
221
|
+
if (!this.itemsSelected() || !this.itemsSelected().length) {
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
224
|
+
const length = this.itemsSelected().length - 1;
|
|
225
|
+
this.tempIgnoreEmit.set(true);
|
|
226
|
+
this.itemsSelected().forEach((item, index) => {
|
|
227
|
+
if (index === length) {
|
|
228
|
+
this.tempIgnoreEmit.set(false);
|
|
229
|
+
}
|
|
230
|
+
this.handlerRemoveItemSelected({ stopPropagation: () => { return; } }, item, ignoreValid);
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
updateItemsSelected(itemsSelected, ignoreValidate = true, ignoreEmitKeySelectedWhenItemsNotExitsEmpty) {
|
|
234
|
+
if (!itemsSelected || !itemsSelected.length) {
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
237
|
+
const itemsNotExits = [];
|
|
238
|
+
itemsSelected.forEach(item => {
|
|
239
|
+
if (!item) {
|
|
240
|
+
return;
|
|
241
|
+
}
|
|
242
|
+
let fieldLabel = `${get(item, this.fieldLabel()) || get(item, 'label') || get(item, 'name') || ' '}`;
|
|
243
|
+
const getValue = this.config()?.getValue;
|
|
244
|
+
if (getValue) {
|
|
245
|
+
fieldLabel = getValue(item) || ' ';
|
|
246
|
+
}
|
|
247
|
+
const itemExits = this.checkExits(fieldLabel, get(item, this.fieldKey()));
|
|
248
|
+
if (itemExits?.isItemSelected) {
|
|
249
|
+
Object.assign(itemExits.item, item);
|
|
250
|
+
return;
|
|
251
|
+
}
|
|
252
|
+
itemsNotExits.push(item);
|
|
253
|
+
});
|
|
254
|
+
this.processData(itemsNotExits, ignoreValidate, ignoreEmitKeySelectedWhenItemsNotExitsEmpty);
|
|
255
|
+
}
|
|
256
|
+
handlerPopoverEvent(type) {
|
|
257
|
+
this.typePopover.set(type);
|
|
258
|
+
if (type === 'click') {
|
|
259
|
+
return;
|
|
260
|
+
}
|
|
261
|
+
if (type === 'remove') {
|
|
262
|
+
this.showList.set(false);
|
|
263
|
+
this.outShowListEvent.emit(false);
|
|
264
|
+
this.inputFunctionControl()?.blur();
|
|
265
|
+
return;
|
|
266
|
+
}
|
|
267
|
+
this.showList.set(true);
|
|
268
|
+
this.outShowListEvent.emit(true);
|
|
269
|
+
this.inputFunctionControl()?.focus();
|
|
270
|
+
}
|
|
271
|
+
handlerPopoverContentEvent(position) {
|
|
272
|
+
if (this.positionList() === position) {
|
|
273
|
+
return;
|
|
274
|
+
}
|
|
275
|
+
this.positionList.set(position);
|
|
276
|
+
}
|
|
277
|
+
async handlerRemoveItemSelected(event, itemRemove, ignoreValid) {
|
|
278
|
+
event.stopPropagation();
|
|
279
|
+
this.flagMouse.set({ isMouseEnter: true, isMouseEnterContent: true });
|
|
280
|
+
this.timeOutFlag.set(setTimeout(() => this.flagMouse.set({ isMouseEnter: false, isMouseEnterContent: false }), 250));
|
|
281
|
+
this.itemsSelected.update(items => items.filter(item => ((isNil(get(itemRemove, this.fieldKey())) || isNil(get(item, this.fieldKey()))) && get(itemRemove, 'fieldLabel').trim() !== item.fieldLabel.trim() || (!isNil(get(itemRemove, this.fieldKey())) && !isNil(get(item, this.fieldKey())) && get(itemRemove, this.fieldKey()) !== get(item, this.fieldKey())))));
|
|
282
|
+
this.itemChangeUnSelect.set(itemRemove);
|
|
283
|
+
if (itemRemove && !isNil(get(itemRemove, this.fieldKey())) && `${get(itemRemove, this.fieldKey())}`.search(this.fakeId()) >= 0) {
|
|
284
|
+
this.keysHiddenItem.update(items => ([...items || [], get(itemRemove, this.fieldKey())]));
|
|
285
|
+
}
|
|
286
|
+
this.keysSelected.set(Array.from(new Set(this.itemsSelected().map(item => get(item, this.fieldKey())))));
|
|
287
|
+
this.disableWhenMaxItem.set(false);
|
|
288
|
+
const maxItemInput = this.maxItemInput();
|
|
289
|
+
if (maxItemInput && maxItemInput <= this.itemsSelected().length) {
|
|
290
|
+
this.disableWhenMaxItem.set(true);
|
|
291
|
+
}
|
|
292
|
+
if (!this.showList()) {
|
|
293
|
+
this.outSelectMultiItem.emit(this.getItemSelected());
|
|
294
|
+
this.checkViewChange(true, ignoreValid);
|
|
295
|
+
return;
|
|
296
|
+
}
|
|
297
|
+
if (this.showList()) {
|
|
298
|
+
this.tempIgnoreEmit.set(true);
|
|
299
|
+
}
|
|
300
|
+
if (!ignoreValid) {
|
|
301
|
+
this.checkValid();
|
|
302
|
+
}
|
|
303
|
+
this.tempIgnoreEmit.set(false);
|
|
304
|
+
}
|
|
305
|
+
handlerInputFunctionControl(event) {
|
|
306
|
+
this.inputFunctionControl.set(event);
|
|
307
|
+
}
|
|
308
|
+
handlerFocusAndBlurEvent(event) {
|
|
309
|
+
this.focus.set(false);
|
|
310
|
+
if (event.name === 'focus') {
|
|
311
|
+
this.focus.set(true);
|
|
312
|
+
}
|
|
313
|
+
if (event.name === 'blur' && this.typePopover()?.includes('mouseleave') && this.validRequired() && (!this.itemsSelected() || !this.itemsSelected().length)) {
|
|
314
|
+
this.checkValid();
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
handlerClickOutside(event) {
|
|
318
|
+
event.stopPropagation();
|
|
319
|
+
clearTimeout(this.timeoutClickOutside());
|
|
320
|
+
this.timeoutClickOutside.set(setTimeout(() => {
|
|
321
|
+
if (this.showList() || !this.removeTextSearchWhenBlurInput()) {
|
|
322
|
+
return;
|
|
323
|
+
}
|
|
324
|
+
this.valueInput.set('');
|
|
325
|
+
this.keySearch.set('');
|
|
326
|
+
this.inputFunctionControl()?.resetValue();
|
|
327
|
+
}, 250));
|
|
328
|
+
}
|
|
329
|
+
async handlerEnterEvent() {
|
|
330
|
+
if (!this.valueInput() || !`${this.valueInput()}`.trim()) {
|
|
331
|
+
return;
|
|
332
|
+
}
|
|
333
|
+
if (this.config()?.ignoreEnterCreateNewItem) {
|
|
334
|
+
const itemExits = this.checkExits();
|
|
335
|
+
if (!itemExits || itemExits.isItemSelected) {
|
|
336
|
+
return;
|
|
337
|
+
}
|
|
338
|
+
this.processData([itemExits.item]);
|
|
339
|
+
this.handlerValueChangeSearch('');
|
|
340
|
+
return;
|
|
341
|
+
}
|
|
342
|
+
if (!this.functionCheckPermissionCreateTag()()) {
|
|
343
|
+
return;
|
|
344
|
+
}
|
|
345
|
+
const itemExits = this.checkExits();
|
|
346
|
+
const valueInput = `${this.valueInput()}`.trim();
|
|
347
|
+
const newItem = { [this.fieldLabel()]: valueInput };
|
|
348
|
+
if (this.fieldKey()) {
|
|
349
|
+
newItem[this.fieldKey()] = `${this.fakeId()}${valueInput}${uuid()}`;
|
|
350
|
+
}
|
|
351
|
+
if (!itemExits) {
|
|
352
|
+
if (this.checkPattern([newItem])) {
|
|
353
|
+
const itemBuildValue = { ...newItem };
|
|
354
|
+
const buildValue = this.config()?.buildValue;
|
|
355
|
+
if (buildValue) {
|
|
356
|
+
buildValue(itemBuildValue, newItem[this.fieldLabel()]);
|
|
357
|
+
}
|
|
358
|
+
newItem[this.fieldLabel()] = itemBuildValue[this.fieldLabel()];
|
|
359
|
+
if (this.enterAutoAddTagToList()) {
|
|
360
|
+
this.listFunctionControl()?.updateData({ newData: signal([signal(newItem)]), functionCustomAddDataToStore: (newData, store) => store.update(value => ([...newData(), ...value])) });
|
|
361
|
+
}
|
|
362
|
+
this.processData([newItem]);
|
|
363
|
+
this.handlerValueChangeSearch('');
|
|
364
|
+
}
|
|
365
|
+
return;
|
|
366
|
+
}
|
|
367
|
+
if (itemExits.isItemSelected) {
|
|
368
|
+
return;
|
|
369
|
+
}
|
|
370
|
+
this.processData([itemExits.item]);
|
|
371
|
+
this.handlerValueChangeSearch('');
|
|
372
|
+
}
|
|
373
|
+
async handlerValueChangeSearch(value) {
|
|
374
|
+
this.valueInput.set(`${value}`);
|
|
375
|
+
if (!`${value || ''}`.trim()) {
|
|
376
|
+
this.keySearchChangeSub()?.unsubscribe();
|
|
377
|
+
this.keySearchChangeSub.set(undefined);
|
|
378
|
+
this.timeOutChangeSearch.set(setTimeout(() => this.keySearch.set('')));
|
|
379
|
+
if (!this.config()?.ignoreEnterCreateNewItem) {
|
|
380
|
+
this.checkValid();
|
|
381
|
+
}
|
|
382
|
+
return;
|
|
383
|
+
}
|
|
384
|
+
if (this.config()?.ignoreInput) {
|
|
385
|
+
return;
|
|
386
|
+
}
|
|
387
|
+
if (!this.keySearchChangeSub()) {
|
|
388
|
+
this.setEventKeySearch();
|
|
389
|
+
}
|
|
390
|
+
this.keySearchChange.next(`${(value || '')}`.trim());
|
|
391
|
+
}
|
|
392
|
+
setEventKeySearch() {
|
|
393
|
+
if (this.keySearchChangeSub()) {
|
|
394
|
+
return;
|
|
395
|
+
}
|
|
396
|
+
this.keySearchChangeSub.set(this.keySearchChange.pipe(debounceTime(1500), takeUntil(this.onDestroy)).subscribe(value => this.keySearch.set(`${(value || '')}`.trim())));
|
|
397
|
+
}
|
|
398
|
+
processData(items, ignoreValidate = false, ignoreEmitKeySelectedWhenItemsNotExitsEmpty) {
|
|
399
|
+
if (!items || !items.length) {
|
|
400
|
+
const itemsSelected = this.getItemSelected();
|
|
401
|
+
if (!ignoreEmitKeySelectedWhenItemsNotExitsEmpty) {
|
|
402
|
+
this.outSelectMultiItem.emit(itemsSelected);
|
|
403
|
+
}
|
|
404
|
+
this.keysSelected.set(Array.from(new Set(itemsSelected?.map(item => get(item, this.fieldKey())))));
|
|
405
|
+
this.checkViewChange(false, ignoreValidate);
|
|
406
|
+
return;
|
|
407
|
+
}
|
|
408
|
+
const itemsMapping = items.map(item => {
|
|
409
|
+
const ref = get(item, 'ref') || item;
|
|
410
|
+
item = cloneDeep(ref);
|
|
411
|
+
set(item, 'ref', ref);
|
|
412
|
+
this.updateFieldLabel(item);
|
|
413
|
+
const getDisableItem = this.config()?.getDisableItem;
|
|
414
|
+
const getStyles = this.config()?.getStyles;
|
|
415
|
+
const getStylesTagSpecific = this.config()?.getStylesTagSpecific;
|
|
416
|
+
if (getDisableItem) {
|
|
417
|
+
set(item, 'disableItem', getDisableItem(item));
|
|
418
|
+
}
|
|
419
|
+
if (getStyles) {
|
|
420
|
+
set(item, 'ngStyles', getStyles(item));
|
|
421
|
+
}
|
|
422
|
+
if (getStylesTagSpecific) {
|
|
423
|
+
const type = getStylesTagSpecific(item);
|
|
424
|
+
if (type === 'specific_violet_color') {
|
|
425
|
+
set(item, 'ngStyles', { color: '#7239EA', backgroundColor: '#F1EBFD' });
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
return item;
|
|
429
|
+
});
|
|
430
|
+
this.itemsSelected.update(items => [...items, ...itemsMapping]);
|
|
431
|
+
this.keysSelected.set(Array.from(new Set(this.itemsSelected().map(item => get(item, this.fieldKey())))));
|
|
432
|
+
this.outSelectMultiItem.emit(this.getItemSelected());
|
|
433
|
+
this.checkViewChange(false, ignoreValidate);
|
|
434
|
+
}
|
|
435
|
+
handlerDataChange(items) {
|
|
436
|
+
this.itemsOfList.set(items);
|
|
437
|
+
this.popoverFunctionControl()?.updatePopoverOverlayPosition();
|
|
438
|
+
if (!this.config()?.ignoreInput) {
|
|
439
|
+
this.inputFunctionControl()?.focus();
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
handlerLoading(event) {
|
|
443
|
+
this.loading.set(event);
|
|
444
|
+
}
|
|
445
|
+
checkViewChange(ignoreScrollBottom, ignoreValidate = false) {
|
|
446
|
+
this.disableWhenMaxItem.set(false);
|
|
447
|
+
const maxItemInput = this.maxItemInput();
|
|
448
|
+
if (maxItemInput && maxItemInput <= this.itemsSelected().length) {
|
|
449
|
+
this.disableWhenMaxItem.set(true);
|
|
450
|
+
}
|
|
451
|
+
this.timeOutCheckViewChange.set((setTimeout(() => {
|
|
452
|
+
const scrollHeight = this.tagsEl()?.nativeElement.scrollHeight;
|
|
453
|
+
if (!isNil(scrollHeight) && this.clientHeight() !== scrollHeight && this.positionList() !== 'top') {
|
|
454
|
+
this.popoverFunctionControl()?.updatePopoverOverlayPosition();
|
|
455
|
+
}
|
|
456
|
+
if (!ignoreScrollBottom && this.tagsEl() && this.tagsEl().nativeElement) {
|
|
457
|
+
this.tagsEl().nativeElement.scrollTop = scrollHeight;
|
|
458
|
+
}
|
|
459
|
+
this.clientHeight.set(scrollHeight);
|
|
460
|
+
}, 250)));
|
|
461
|
+
if (!ignoreValidate) {
|
|
462
|
+
this.checkValid();
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
checkExits(label, id) {
|
|
466
|
+
let itemExits;
|
|
467
|
+
if (!isNil(id) && !`${id}`.includes(this.fakeId()) && this.fieldKey()) {
|
|
468
|
+
itemExits = this.itemsSelected().find(item => !isNil(get(item, this.fieldKey())) && `${get(item, this.fieldKey())}`.trim() === `${id}`);
|
|
469
|
+
if (itemExits) {
|
|
470
|
+
return { item: itemExits, isItemSelected: !!itemExits };
|
|
471
|
+
}
|
|
472
|
+
return;
|
|
473
|
+
}
|
|
474
|
+
if (!label) {
|
|
475
|
+
label = `${(this.valueInput || '')}`.trim();
|
|
476
|
+
}
|
|
477
|
+
itemExits = this.itemsSelected().find(item => !isNil(get(item, 'fieldLabel')) && (get(item, 'fieldLabel').trim() === label?.trim()) || (this.checkExitIsLabelInclude() && get(item, 'fieldLabel').trim().includes(label?.trim())) || (this.checkExitByFields() && this.checkExitByFields()?.some(field => get(item, field)?.trim() === label?.trim() || get(item, field)?.trim() === escapeHtml(label?.trim() || '') || escapeHtml(get(item, field)?.trim() || ' ') === escapeHtml(label?.trim() || ''))));
|
|
478
|
+
if (itemExits) {
|
|
479
|
+
return { item: itemExits, isItemSelected: true };
|
|
480
|
+
}
|
|
481
|
+
itemExits = this.itemsOfList().find(item => !isNil(get(item, 'fieldLabel')) && (get(item, 'fieldLabel').trim().includes() === label?.trim()) || (this.checkExitIsLabelInclude() && get(item, 'fieldLabel').trim().includes(label?.trim())) || (this.checkExitByFields() && this.checkExitByFields()?.some(field => get(item, field)?.trim() === label?.trim() || escapeHtml(get(item, field)?.trim() || ' ') === escapeHtml(label?.trim() || '') || get(item, field)?.trim() === escapeHtml(label?.trim() || ''))));
|
|
482
|
+
if (itemExits) {
|
|
483
|
+
return { item: itemExits, isItemSelected: false };
|
|
484
|
+
}
|
|
485
|
+
return;
|
|
486
|
+
}
|
|
487
|
+
handlerSelectedKey(event) {
|
|
488
|
+
if (!event || !event.item) {
|
|
489
|
+
return;
|
|
490
|
+
}
|
|
491
|
+
if (!isNil(event?.key)) {
|
|
492
|
+
this.popoverFunctionControl()?.removePopoverOverlay();
|
|
493
|
+
}
|
|
494
|
+
if (this.itemsSelected()[0]) {
|
|
495
|
+
this.tempIgnoreEmit.set(true);
|
|
496
|
+
this.handlerRemoveItemSelected({ stopPropagation: () => { return; } }, this.itemsSelected()[0], this.itemsSelected()[0].disableItem);
|
|
497
|
+
this.tempIgnoreEmit.set(false);
|
|
498
|
+
}
|
|
499
|
+
this.updateItemsSelected([event.item], !!this.itemsSelected()[0]); // Bug #36075
|
|
500
|
+
}
|
|
501
|
+
getFlagEmitSelectedItem(keys) {
|
|
502
|
+
if (!this.ignoreEmitWhenSameDataSelected() || keys.length !== this.itemsSelected().length) {
|
|
503
|
+
return false;
|
|
504
|
+
}
|
|
505
|
+
for (const key of keys) {
|
|
506
|
+
if (!this.itemsSelected().some(item => get(item, this.fieldKey()) === key)) {
|
|
507
|
+
return false;
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
return true;
|
|
511
|
+
}
|
|
512
|
+
async handlerSelectMultiKey(event) {
|
|
513
|
+
if (!event) {
|
|
514
|
+
return;
|
|
515
|
+
}
|
|
516
|
+
const keys = [];
|
|
517
|
+
const items = [];
|
|
518
|
+
if (event.keys && event.keys.length && (!event.mapKeys || !event.mapKeys.length)) {
|
|
519
|
+
keys.push(...event.keys);
|
|
520
|
+
}
|
|
521
|
+
const ignoreEmitKeySelectedWhenItemsNotExitsEmpty = this.getFlagEmitSelectedItem(cloneDeep(event.keys ?? []));
|
|
522
|
+
event.mapKeys.forEach(mapKey => {
|
|
523
|
+
if (isNil(mapKey.key)) {
|
|
524
|
+
return;
|
|
525
|
+
}
|
|
526
|
+
if (mapKey.item) {
|
|
527
|
+
return items.push(mapKey.item);
|
|
528
|
+
}
|
|
529
|
+
if (!Array.isArray(this.itemsSelected)) {
|
|
530
|
+
return keys.push(mapKey.key);
|
|
531
|
+
}
|
|
532
|
+
const item = this.itemsSelected.find(item => get(item, this.fieldKey()) === mapKey.key);
|
|
533
|
+
if (item) {
|
|
534
|
+
return items.push(item);
|
|
535
|
+
}
|
|
536
|
+
return keys.push(mapKey.key);
|
|
537
|
+
});
|
|
538
|
+
if (keys.length) {
|
|
539
|
+
const resultData = await this.getDetailByIds(keys, true);
|
|
540
|
+
items.push(...resultData);
|
|
541
|
+
}
|
|
542
|
+
const messageEmpty = this.validRequired()?.message || ERROR_MESSAGE_EMPTY_VALID;
|
|
543
|
+
let ignoreValidate = true;
|
|
544
|
+
if (messageEmpty === this.error()?.message) {
|
|
545
|
+
ignoreValidate = false;
|
|
546
|
+
}
|
|
547
|
+
const itemRemove = this.itemsSelected().find(itemSelected => get(itemSelected, this.fieldKey()) && !(items.some(item => get(itemSelected, this.fieldKey()) === get(item, this.fieldKey()))));
|
|
548
|
+
this.itemsSelected.update(itemsSelected => itemsSelected.filter(itemSelected => !get(itemSelected, this.fieldKey()) || (event.keys.length && items.some(item => get(itemSelected, this.fieldKey()) === get(item, this.fieldKey())))));
|
|
549
|
+
if (itemRemove) {
|
|
550
|
+
if (this.enterAutoAddTagToList() && !isNil(get(itemRemove, this.fieldKey())) && `${get(itemRemove, this.fieldKey())}`.search(this.fakeId()) >= 0) {
|
|
551
|
+
this.keysHiddenItem.update(items => [...(items || []), get(itemRemove, this.fieldKey())]);
|
|
552
|
+
}
|
|
553
|
+
}
|
|
554
|
+
if (!event.keys.length) {
|
|
555
|
+
this.checkValid();
|
|
556
|
+
this.keysSelected.set(Array.from(new Set(this.itemsSelected()?.map(item => get(item, this.fieldKey())))));
|
|
557
|
+
this.outSelectMultiItem.emit(this.getItemSelected());
|
|
558
|
+
this.checkViewChange(false, ignoreValidate);
|
|
559
|
+
return;
|
|
560
|
+
}
|
|
561
|
+
this.updateItemsSelected(items, ignoreValidate, ignoreEmitKeySelectedWhenItemsNotExitsEmpty);
|
|
562
|
+
this.checkValid();
|
|
563
|
+
}
|
|
564
|
+
async getDetailByIds(keys, isResponseData) {
|
|
565
|
+
const httpRequestDetailItemByIds = this.httpRequestDetailItemByIds();
|
|
566
|
+
if (!httpRequestDetailItemByIds || this.loadingDetail() || !(keys instanceof Array) || !keys.length) {
|
|
567
|
+
return [];
|
|
568
|
+
}
|
|
569
|
+
this.updateLoadingDetail(true);
|
|
570
|
+
const cloneHttpDetailConfig = cloneDeep(httpRequestDetailItemByIds);
|
|
571
|
+
try {
|
|
572
|
+
const { argumentsValue, guideAutoUpdateArgumentsValue } = cloneHttpDetailConfig;
|
|
573
|
+
if (!guideAutoUpdateArgumentsValue || !guideAutoUpdateArgumentsValue.detailById) {
|
|
574
|
+
return [];
|
|
575
|
+
}
|
|
576
|
+
guideAutoUpdateArgumentsValue.detailById.fieldGetValue = 'keys';
|
|
577
|
+
this.httpRequestService.updateArguments(argumentsValue, { keys: keys }, {}, '', false, false, guideAutoUpdateArgumentsValue);
|
|
578
|
+
const result = (await this.httpRequestService.callApi(cloneHttpDetailConfig));
|
|
579
|
+
if (!isResponseData) {
|
|
580
|
+
this.updateItemsSelected(result.data || []);
|
|
581
|
+
this.updateLoadingDetail(false);
|
|
582
|
+
return [];
|
|
583
|
+
}
|
|
584
|
+
this.updateLoadingDetail(false);
|
|
585
|
+
return result.data || [];
|
|
586
|
+
}
|
|
587
|
+
catch (error) {
|
|
588
|
+
console.log(error);
|
|
589
|
+
this.updateLoadingDetail(false);
|
|
590
|
+
}
|
|
591
|
+
return [];
|
|
592
|
+
}
|
|
593
|
+
async checkValid() {
|
|
594
|
+
const valid = this.itemsSelected() && this.itemsSelected().length ? true : false;
|
|
595
|
+
const stateError = !!this.error();
|
|
596
|
+
this.error.set(undefined);
|
|
597
|
+
if (this.validRequired() && !valid) {
|
|
598
|
+
this.error.set({ ...this.validRequired(), message: this.validRequired()?.message || ERROR_MESSAGE_EMPTY_VALID });
|
|
599
|
+
}
|
|
600
|
+
if (!this.error()) {
|
|
601
|
+
this.checkPattern(this.itemsSelected());
|
|
602
|
+
this.checkMaxItemSelectedValid();
|
|
603
|
+
}
|
|
604
|
+
if (!this.tempIgnoreEmit()) {
|
|
605
|
+
this.outValidEvent.emit(!this.error());
|
|
606
|
+
}
|
|
607
|
+
if (stateError !== !!this.error()) {
|
|
608
|
+
this.popoverFunctionControl()?.updatePopoverOverlayPosition();
|
|
609
|
+
}
|
|
610
|
+
return !this.error();
|
|
611
|
+
}
|
|
612
|
+
checkMaxItemSelectedValid() {
|
|
613
|
+
const validMaxItemSelected = this.validMaxItemSelected();
|
|
614
|
+
if (validMaxItemSelected && this.itemsSelected().length > validMaxItemSelected.value) {
|
|
615
|
+
this.error.set({ ...validMaxItemSelected, message: validMaxItemSelected.message || ERROR_MESSAGE_MAX_VALID, interpolateParams: { value: validMaxItemSelected.value } });
|
|
616
|
+
return false;
|
|
617
|
+
}
|
|
618
|
+
return true;
|
|
619
|
+
}
|
|
620
|
+
checkPattern(items) {
|
|
621
|
+
const validPattern = this.validPattern();
|
|
622
|
+
if (!validPattern || !validPattern.length || !items || !items.length) {
|
|
623
|
+
return true;
|
|
624
|
+
}
|
|
625
|
+
for (const valid of validPattern) {
|
|
626
|
+
if (valid.pattern && items.some(item => !valid.pattern.test(get(item, this.fieldLabel())))) {
|
|
627
|
+
this.error.set({ ...valid, message: valid.message || ERROR_MESSAGE_PATTEN_VALID });
|
|
628
|
+
return false;
|
|
629
|
+
}
|
|
630
|
+
}
|
|
631
|
+
return true;
|
|
632
|
+
}
|
|
633
|
+
handlerClickButtonOther(event) {
|
|
634
|
+
this.outClickButtonOther.emit(event);
|
|
635
|
+
}
|
|
636
|
+
getItemSelected() {
|
|
637
|
+
return this.itemsSelected().map(item => {
|
|
638
|
+
const itemMap = { ...item };
|
|
639
|
+
if (!isNil(get(itemMap, this.fieldKey())) && `${get(itemMap, this.fieldKey())}`.search(this.fakeId()) === 0) {
|
|
640
|
+
set(itemMap, this.fieldKey(), '');
|
|
641
|
+
}
|
|
642
|
+
return itemMap;
|
|
643
|
+
});
|
|
644
|
+
}
|
|
645
|
+
async resetToDefaultDataSelected(itemSelected) {
|
|
646
|
+
if (itemSelected && Array.isArray(itemSelected)) {
|
|
647
|
+
this.itemsSelected.set([]);
|
|
648
|
+
this.updateItemsSelected(itemSelected);
|
|
649
|
+
return;
|
|
650
|
+
}
|
|
651
|
+
itemSelected = new Array();
|
|
652
|
+
if (!this.fieldKey()) {
|
|
653
|
+
return;
|
|
654
|
+
}
|
|
655
|
+
const defaultKeysSelected = this.defaultKeysSelected();
|
|
656
|
+
if (defaultKeysSelected && Array.isArray(defaultKeysSelected)) {
|
|
657
|
+
this.itemsSelected.set([]);
|
|
658
|
+
this.getDetailByIds(defaultKeysSelected);
|
|
659
|
+
return;
|
|
660
|
+
}
|
|
661
|
+
const defaultItemsSelected = this.defaultItemsSelected();
|
|
662
|
+
if (defaultItemsSelected && Array.isArray(defaultItemsSelected)) {
|
|
663
|
+
this.itemsSelected.set([]);
|
|
664
|
+
this.updateItemsSelected(defaultItemsSelected);
|
|
665
|
+
return;
|
|
666
|
+
}
|
|
667
|
+
}
|
|
668
|
+
handlerFunctionControlList(event) {
|
|
669
|
+
this.listFunctionControl.set(event);
|
|
670
|
+
}
|
|
671
|
+
async focusInput() {
|
|
672
|
+
this.inputFunctionControl()?.focus();
|
|
673
|
+
}
|
|
674
|
+
handlerChangeFlagMouse(event) {
|
|
675
|
+
this.outChangStageFlagMouse.emit(event);
|
|
676
|
+
}
|
|
677
|
+
handlerChangStageFlagMouse(flag) {
|
|
678
|
+
this.flagMouse.set(flag);
|
|
679
|
+
}
|
|
680
|
+
async resetError() {
|
|
681
|
+
this.error.set(undefined);
|
|
682
|
+
}
|
|
683
|
+
updateLoadingDetail(event) {
|
|
684
|
+
this.loadingDetail.set(event);
|
|
685
|
+
this.outLoadingGetDetailSelected.emit(event);
|
|
686
|
+
}
|
|
687
|
+
async updateItemSelectedDisable() {
|
|
688
|
+
const getDisableItem = this.config()?.getDisableItem;
|
|
689
|
+
if (!getDisableItem) {
|
|
690
|
+
return;
|
|
691
|
+
}
|
|
692
|
+
this.itemsSelected.update(itemsSelected => itemsSelected.map(item => ({ ...item, disableItem: getDisableItem(item) })));
|
|
693
|
+
}
|
|
694
|
+
async refreshListData() {
|
|
695
|
+
this.listFunctionControl()?.refresh();
|
|
696
|
+
}
|
|
697
|
+
ngOnDestroy() {
|
|
698
|
+
this.onDestroy.next();
|
|
699
|
+
clearTimeout(this.timeOutFlag());
|
|
700
|
+
clearTimeout(this.timeOutChangeSearch());
|
|
701
|
+
clearTimeout(this.timeOutCheckViewChange());
|
|
702
|
+
clearTimeout(this.timeoutClickOutside());
|
|
703
|
+
}
|
|
704
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LibsUiComponentsTagsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
705
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: LibsUiComponentsTagsComponent, isStandalone: true, selector: "libs_ui-components-tags", inputs: { classIncludePopover: { classPropertyName: "classIncludePopover", publicName: "classIncludePopover", isSignal: true, isRequired: false, transformFunction: null }, enterAutoAddTagToList: { classPropertyName: "enterAutoAddTagToList", publicName: "enterAutoAddTagToList", isSignal: true, isRequired: false, transformFunction: null }, checkExitIsLabelInclude: { classPropertyName: "checkExitIsLabelInclude", publicName: "checkExitIsLabelInclude", isSignal: true, isRequired: false, transformFunction: null }, checkExitByFields: { classPropertyName: "checkExitByFields", publicName: "checkExitByFields", isSignal: true, isRequired: false, transformFunction: null }, parentBorderWidth: { classPropertyName: "parentBorderWidth", publicName: "parentBorderWidth", isSignal: true, isRequired: false, transformFunction: null }, functionCheckPermissionCreateTag: { classPropertyName: "functionCheckPermissionCreateTag", publicName: "functionCheckPermissionCreateTag", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, httpRequestDetailItemByIds: { classPropertyName: "httpRequestDetailItemByIds", publicName: "httpRequestDetailItemByIds", isSignal: true, isRequired: false, transformFunction: null }, fieldLabel: { classPropertyName: "fieldLabel", publicName: "fieldLabel", isSignal: true, isRequired: false, transformFunction: null }, maxItemInput: { classPropertyName: "maxItemInput", publicName: "maxItemInput", isSignal: true, isRequired: false, transformFunction: null }, zIndex: { classPropertyName: "zIndex", publicName: "zIndex", isSignal: true, isRequired: false, transformFunction: null }, config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: false, transformFunction: null }, disable: { classPropertyName: "disable", publicName: "disable", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, labelConfig: { classPropertyName: "labelConfig", publicName: "labelConfig", isSignal: true, isRequired: false, transformFunction: null }, defaultItemsSelected: { classPropertyName: "defaultItemsSelected", publicName: "defaultItemsSelected", isSignal: true, isRequired: false, transformFunction: null }, defaultKeysSelected: { classPropertyName: "defaultKeysSelected", publicName: "defaultKeysSelected", isSignal: true, isRequired: false, transformFunction: null }, listSearchConfig: { classPropertyName: "listSearchConfig", publicName: "listSearchConfig", isSignal: true, isRequired: false, transformFunction: null }, isSearchOnline: { classPropertyName: "isSearchOnline", publicName: "isSearchOnline", isSignal: true, isRequired: false, transformFunction: null }, listSearchPadding: { classPropertyName: "listSearchPadding", publicName: "listSearchPadding", isSignal: true, isRequired: false, transformFunction: null }, listDividerClassInclude: { classPropertyName: "listDividerClassInclude", publicName: "listDividerClassInclude", isSignal: true, isRequired: false, transformFunction: null }, listConfig: { classPropertyName: "listConfig", publicName: "listConfig", isSignal: true, isRequired: false, transformFunction: null }, listButtonsOther: { classPropertyName: "listButtonsOther", publicName: "listButtonsOther", isSignal: true, isRequired: false, transformFunction: null }, listClickExactly: { classPropertyName: "listClickExactly", publicName: "listClickExactly", isSignal: true, isRequired: false, transformFunction: null }, listBackgroundListCustom: { classPropertyName: "listBackgroundListCustom", publicName: "listBackgroundListCustom", isSignal: true, isRequired: false, transformFunction: null }, listMaxItemShow: { classPropertyName: "listMaxItemShow", publicName: "listMaxItemShow", isSignal: true, isRequired: false, transformFunction: null }, listHiddenInputSearchWhenHasSearchConfig: { classPropertyName: "listHiddenInputSearchWhenHasSearchConfig", publicName: "listHiddenInputSearchWhenHasSearchConfig", isSignal: true, isRequired: false, transformFunction: null }, removeTextSearchWhenBlurInput: { classPropertyName: "removeTextSearchWhenBlurInput", publicName: "removeTextSearchWhenBlurInput", isSignal: true, isRequired: false, transformFunction: null }, keysHiddenItem: { classPropertyName: "keysHiddenItem", publicName: "keysHiddenItem", isSignal: true, isRequired: false, transformFunction: null }, keysDisableItem: { classPropertyName: "keysDisableItem", publicName: "keysDisableItem", isSignal: true, isRequired: false, transformFunction: null }, ignoreEmitWhenSameDataSelected: { classPropertyName: "ignoreEmitWhenSameDataSelected", publicName: "ignoreEmitWhenSameDataSelected", isSignal: true, isRequired: false, transformFunction: null }, singleSelected: { classPropertyName: "singleSelected", publicName: "singleSelected", isSignal: true, isRequired: false, transformFunction: null }, classIncludeTagItem: { classPropertyName: "classIncludeTagItem", publicName: "classIncludeTagItem", isSignal: true, isRequired: false, transformFunction: null }, classIconRemoveTagItem: { classPropertyName: "classIconRemoveTagItem", publicName: "classIconRemoveTagItem", isSignal: true, isRequired: false, transformFunction: null }, showBorderActiveWhenFocusInput: { classPropertyName: "showBorderActiveWhenFocusInput", publicName: "showBorderActiveWhenFocusInput", isSignal: true, isRequired: false, transformFunction: null }, fieldGetImage: { classPropertyName: "fieldGetImage", publicName: "fieldGetImage", isSignal: true, isRequired: false, transformFunction: null }, imageSize: { classPropertyName: "imageSize", publicName: "imageSize", isSignal: true, isRequired: false, transformFunction: null }, fieldGetTextAvatar: { classPropertyName: "fieldGetTextAvatar", publicName: "fieldGetTextAvatar", isSignal: true, isRequired: false, transformFunction: null }, classAvatarInclude: { classPropertyName: "classAvatarInclude", publicName: "classAvatarInclude", isSignal: true, isRequired: false, transformFunction: null }, getLastTextAfterSpace: { classPropertyName: "getLastTextAfterSpace", publicName: "getLastTextAfterSpace", isSignal: true, isRequired: false, transformFunction: null }, validRequired: { classPropertyName: "validRequired", publicName: "validRequired", isSignal: true, isRequired: false, transformFunction: null }, validMaxItemSelected: { classPropertyName: "validMaxItemSelected", publicName: "validMaxItemSelected", isSignal: true, isRequired: false, transformFunction: null }, validPattern: { classPropertyName: "validPattern", publicName: "validPattern", isSignal: true, isRequired: false, transformFunction: null }, showListBellow: { classPropertyName: "showListBellow", publicName: "showListBellow", isSignal: true, isRequired: false, transformFunction: null }, hiddenInputWhenReadonly: { classPropertyName: "hiddenInputWhenReadonly", publicName: "hiddenInputWhenReadonly", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { keysHiddenItem: "keysHiddenItemChange", outSelectMultiItem: "outSelectMultiItem", outValidEvent: "outValidEvent", outFunctionsControl: "outFunctionsControl", outClickButtonOther: "outClickButtonOther", outShowListEvent: "outShowListEvent", outChangStageFlagMouse: "outChangStageFlagMouse", outLoadingGetDetailSelected: "outLoadingGetDetailSelected" }, viewQueries: [{ propertyName: "tagsEl", first: true, predicate: ["tagsEl"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"flex flex-col w-full h-full\">\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() || loading() || loadingDetail()\"\n [disableButtonsRight]=\"labelConfig.disableButtonsRight || disable() || loading() || loadingDetail()\"\n [hasToggle]=\"labelConfig.hasToggle\"\n [toggleActive]=\"labelConfig.toggleActive\"\n [toggleActive]=\"labelConfig.toggleDisable || disable() || loading() || loadingDetail()\"\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 <libs_ui-components-popover class=\"w-full h-full\"\n [ignoreShowPopover]=\"disable() || readonly() || !!config()?.ignoreShowList || false\"\n [ignoreCursorPointerModeLikeClick]=\"true\"\n [elementRefCustom]=\"tagsEl\"\n [mode]=\"!config()?.ignoreInput ? 'click' : 'click-toggle'\"\n [ignoreHiddenPopoverContentWhenMouseLeave]=\"true\"\n [flagMouse]=\"flagMouse()\"\n [config]=\"{\n animationConfig: config()?.animationConfig || {},\n zIndex: zIndex() || 1000,\n widthByParent: true,\n parentBorderWidth: parentBorderWidth() ?? 0,\n maxHeight: 2048,\n maxWidth: 2048,\n direction: config()?.directionList || 'bottom',\n directionDistance: 2,\n template: !showListBellow() ? listViewEl : undefined,\n whiteTheme: true,\n ignoreArrow: true,\n classInclude: 'rounded-[4px] ' + classIncludePopover() + ((!listConfig()?.ignoreShowDataWhenNotSearch || keySearch()) ? ' libs-ui-border-general' : ''),\n position: { mode: 'start', distance: 0 }\n }\"\n (outFunctionsControl)=\"handlerPopoverFunctionControlEvent($event)\"\n (outEvent)=\"handlerPopoverEvent($event)\"\n (outEventPopoverContent)=\"handlerPopoverContentEvent($event)\"\n (outChangStageFlagMouse)=\"handlerChangeFlagMouse($event)\">\n <div class=\"relative\"\n [class.cursor-pointer]=\"!disable() && !readonly()\">\n @if (config()?.uiLikeDropdown) {\n <i class=\"flex text-[16px] absolute right-[16px] top-[8px] libs-ui-icon-move-right rotate-90 z-[1]\"\n [class.text-[#6a7383]]=\"!readonly() && !disable()\"\n [class.libs-ui-readonly]=\"readonly()\"\n [class.libs-ui-disable]=\"disable()\">\n </i>\n }\n <div #tagsEl\n [class]=\"'libs-ui-tags ' + (config()?.classInclude || '') + (readonly() ? (config()?.classCustomWhenReadOnly || ' libs-ui-readonly') : '')\"\n [class.libs-ui-tags-not-popup]=\"(!showList() && !showBorderActiveWhenFocusInput()) || (!focus() && showBorderActiveWhenFocusInput())\"\n [class.libs-ui-tags-error]=\"!!error() && !config()?.ignoreShowError\"\n [class.!pr-[32px]]=\"config()?.uiLikeDropdown\"\n [class.libs-ui-readonly-background]]=\"readonly()\"\n [class.libs-ui-disable-background]]=\"disable()\"\n [class.libs-ui-border-primary-general]=\"focus() && showBorderActiveWhenFocusInput()\"\n LibsUiComponentsClickOutsideDirective\n (outOutside)=\"handlerClickOutside($event)\">\n @for (item of itemsSelected(); track item[fieldKey()]) {\n <div [ngStyle]=\"item?.bullet || item?.ngStyles\"\n [class]=\"classIncludeTagItem() || ''\"\n [class.libs-ui-tags-readonly]=\"item.disableItem\"\n [class.libs-ui-tags-item]=\"!item.disableItem\"\n [class.cursor-default]=\"disable() || readonly()\">\n @if (fieldGetImage(); as fieldGetImage) {\n <div class=\"flex items-center justify-center h-full\">\n <libs_ui-components-avatar [classInclude]=\"classAvatarInclude() || 'mr-[8px]'\"\n [size]=\"imageSize()\"\n [linkAvatar]=\"item[fieldGetImage]\"\n [linkAvatarError]=\"config()?.linkImageError\"\n [idGenColor]=\"item[fieldGetTextAvatar()]\"\n [textAvatar]=\"item[fieldGetTextAvatar()]\"\n [getLastTextAfterSpace]=\"getLastTextAfterSpace()\" />\n </div>\n }\n <span class=\"libs-ui-font-h6r\"\n [innerHtml]=\"(item.fieldLabel || ' ') | translate\">\n </span>\n @if (!disable() && !item.disableItem && !readonly()) {\n <div class=\"flex items-center justify-center ml-[8px]\">\n <i #iconCloseEl\n [attr.specificStyle]=\"!!(item?.bullet || item?.ngStyles)\"\n [class]=\"'flex text-[16px] ' + (classIconRemoveTagItem() || 'libs-ui-icon-close')\"\n [class.cursor-pointer]=\"!disable() && !loading() && !loadingDetail()\"\n [class.pointer-events-none]=\"disable() || loading() || loadingDetail()\"\n [ngStyle]=\"(item?.bullet || item?.ngStyles) | LibsUiComponentsTagsGetColorPipe:iconCloseEl\"\n (click)=\"handlerRemoveItemSelected($event,item)\"></i>\n </div>\n }\n </div>\n }\n @if (!singleSelected() || (singleSelected() && !itemsSelected().length)) {\n @if (!config()?.ignoreInput && !config()?.uiLikeDropdown && (!hiddenInputWhenReadonly() || (hiddenInputWhenReadonly() && !readonly()))) {\n <libs_ui-components-inputs-input class=\"grow\"\n [class.mb-[4px]]=\"itemsSelected().length\"\n [classInclude]=\"'w-full bg-transparent' + (config()?.classInputInclude || 'px-[4px] min-w-[30px]')\"\n [defaultHeight]=\"24\"\n [placeholder]=\"readonly() ? '' : (placeholder() || 'i18n_import_content')\"\n [noBorder]=\"true\"\n [(value)]=\"valueInput\"\n [disable]=\"disable() || loading() || loadingDetail() || disableWhenMaxItem()\"\n [readonly]=\"readonly()\"\n (outEnterEvent)=\"handlerEnterEvent()\"\n (valueChange)=\"handlerValueChangeSearch($event)\"\n (outFocusAndBlurEvent)=\"handlerFocusAndBlurEvent($event)\"\n (outFunctionsControl)=\"handlerInputFunctionControl($event)\" />\n }\n @if (config()?.ignoreInput && config()?.uiLikeDropdown && !itemsSelected().length) {\n <div class=\"flex items-center pb-[4px] pt-[2px] ml-[11px] libs-ui-font-h5r\"\n [class.text-[#9ca2ad]]=\"disable()\">\n {{ (placeholder() || 'i18n_select_value') | translate }}\n </div>\n }\n }\n </div>\n @if (error() && !config()?.ignoreShowError) {\n <div class=\"text-[#ee2d41] libs-ui-font-h7r mt-[8px]\">{{ (error()?.message || ' ') | translate:(error()?.interpolateParams || {}) }}</div>\n }\n </div>\n </libs_ui-components-popover>\n</div>\n@if (showListBellow()) {\n <ng-container *ngTemplateOutlet=\"listViewEl\"></ng-container>\n}\n<ng-template #listViewEl>\n @if (listConfig(); as listConfig) {\n <libs_ui-components-list [searchConfig]=\"listSearchConfig() || {classInclude: 'hidden', iconLeftClass: 'hidden'}\"\n [isSearchOnline]=\"isSearchOnline()\"\n [zIndex]=\"zIndex()\"\n [keySearch]=\"keySearch()\"\n [config]=\"listConfig\"\n [disable]=\"disable() || loadingDetail() || disableWhenMaxItem()\"\n [searchPadding]=\"listSearchPadding()\"\n [maxItemShow]=\"listMaxItemShow() || 6\"\n [multiKeySelected]=\"keysSelected()\"\n [clickExactly]=\"false\"\n [keysHiddenItem]=\"keysHiddenItem()\"\n [keysDisableItem]=\"keysDisableItem()\"\n [dividerClassInclude]=\"listDividerClassInclude() ?? 'hidden'\"\n [buttonsOther]=\"listButtonsOther()\"\n [backgroundListCustom]=\"listBackgroundListCustom()\"\n [itemChangeUnSelect]=\"itemChangeUnSelect()\"\n [functionGetItemsAutoAddList]=\"functionGetItemAutoAddList()\"\n [hiddenInputSearch]=\"listHiddenInputSearchWhenHasSearchConfig()\"\n (outFunctionsControl)=\"handlerFunctionControlList($event)\"\n (outSelectKey)=\"handlerSelectedKey($event)\"\n (outSelectMultiKey)=\"handlerSelectMultiKey($event)\"\n (outChangeView)=\"handlerDataChange($event)\"\n (outClickButtonOther)=\"handlerClickButtonOther($event)\"\n (outChangStageFlagMousePopover)=\"handlerChangStageFlagMouse($event)\"\n (outLoading)=\"handlerLoading($event)\" />\n }\n</ng-template>\n", styles: [".libs-ui-tags{position:relative;display:flex;flex-wrap:wrap;border:1px solid var(--libs-ui-color-default, #226FF5);max-height:100px;overflow:auto;border-radius:4px;padding:3px 0 0 4px;min-height:32px}.libs-ui-tags-not-popup{border:1px solid #E6E7EA}.libs-ui-tags-error{border-color:#ff5454}.libs-ui-tags .libs-ui-tags-item{display:flex;align-items:center;margin:0 4px 3px 0;padding:4px 8px;color:var(--libs-ui-color-default, #226FF5);border-radius:20px;background-color:var(--libs-ui-color-light-2, #E9F1FE);word-break:break-word!important;overflow-wrap:break-word!important;cursor:default}.libs-ui-tags .libs-ui-tags-item i[class*=libs-ui-icon-]{border-radius:50%}.libs-ui-tags .libs-ui-tags-item i[class*=libs-ui-icon-]:before{border-radius:50%;font-size:16px;color:var(--libs-ui-color-default, #226FF5)}.libs-ui-tags .libs-ui-tags-item i[class*=libs-ui-icon-]:hover:before{background:var(--libs-ui-color-light-6, #D3E2FD)}.libs-ui-tags .libs-ui-tags-item i[class*=libs-ui-icon-]:active:before{background:var(--libs-ui-color-light-5, #BDD4FC)}.libs-ui-tags .libs-ui-tags-item [specificStyle=true] i[class*=libs-ui-icon-]{border-radius:50%}.libs-ui-tags .libs-ui-tags-item [specificStyle=true] i[class*=libs-ui-icon-]:before{border-radius:50%;font-size:16px;color:var(--libs-ui-tags-item-icon-default)}.libs-ui-tags .libs-ui-tags-item [specificStyle=true] i[class*=libs-ui-icon-]:hover:before{color:var(--libs-ui-tags-item-icon-hover);background:var(--libs-ui-tags-item-icon-background-hover)}.libs-ui-tags .libs-ui-tags-item [specificStyle=true] i[class*=libs-ui-icon-]:active:before{color:var(--libs-ui-tags-item-icon-active);background:var(--libs-ui-tags-item-icon-background-active)}.libs-ui-tags-disable{background:#f8f9fa;color:#9ca2ad}.libs-ui-tags-readonly{background:#f1ebfd;color:#7239ea;display:flex;align-items:center;margin:0 4px 4px 0;padding:4px 8px;border-radius:20px;word-break:break-word!important;overflow-wrap:break-word!important}\n"], dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: LibsUiComponentsClickOutsideDirective, selector: "[LibsUiComponentsClickOutsideDirective]", outputs: ["outOutside", "outInSide"] }, { kind: "component", type: LibsUiComponentsLabelComponent, selector: "libs_ui-components-label", inputs: ["iconPopoverClass", "classInclude", "labelLeft", "labelLeftClass", "labelLeftBehindToggleButton", "popover", "required", "buttonsLeft", "disableButtonsLeft", "buttonsRight", "disableButtonsRight", "labelRight", "labelRightClass", "labelRightRequired", "hasToggle", "toggleSize", "toggleActive", "toggleDisable", "description", "descriptionClass", "buttonsDescription", "disableButtonsDescription", "buttonsDescriptionContainerClass", "onlyShowCount", "zIndexPopover", "timerDestroyPopover", "count", "limitLength"], outputs: ["outClickButton", "outSwitchEvent", "outLabelRightClick", "outLabelLeftClick"] }, { kind: "component", type: LibsUiComponentsPopoverComponent, selector: "libs_ui-components-popover,[LibsUiComponentsPopoverDirective]", inputs: ["debugId", "flagMouse", "type", "mode", "config", "ignoreShowPopover", "elementRefCustom", "classInclude", "ignoreHiddenPopoverContentWhenMouseLeave", "ignoreStopPropagationEvent", "ignoreCursorPointerModeLikeClick", "isAddContentToParentDocument", "ignoreClickOutside"], outputs: ["outEvent", "outChangStageFlagMouse", "outEventPopoverContent", "outFunctionsControl"] }, { kind: "component", type: LibsUiComponentsInputsInputComponent, selector: "libs_ui-components-inputs-input", inputs: ["tagInput", "dataType", "tabInsertContentTagInput", "textAreaEnterNotNewLine", "emitEmptyInDataTypeNumber", "keepZeroInTypeInt", "autoAddZeroLessThan10InTypeInt", "ignoreBlockInputMaxValue", "hiddenContent", "maxValueNumber", "minValueNumber", "fixedFloat", "acceptNegativeValue", "valueUpDownNumber", "classInclude", "maxLength", "readonly", "disable", "noBorder", "backgroundNone", "borderError", "useColorModeExist", "placeholder", "keepPlaceholderOnly", "value", "autoRemoveEmoji", "defaultHeight", "minHeightTextArea", "maxHeightTextArea", "focusTimeOut", "blurTimeOut", "zIndexPopoverContent", "classContainerInput", "showCount", "ignoreStopPropagationEvent", "resize", "templateLeftBottomInput", "templateRightBottomInput", "classContainerBottomInput", "ignoreWidthInput100", "iconLeftClass", "popoverContentIconLeft", "iconRightClass", "popoverContentIconRight", "resetAutoCompletePassword", "acceptOnlyClickIcon", "setIconRightColorSameColorDisableReadOnly", "onlyAcceptNegativeValue", "maxLengthNumberCount", "focusInput"], outputs: ["maxValueNumberChange", "minValueNumberChange", "fixedFloatChange", "acceptNegativeValueChange", "maxLengthChange", "valueChange", "maxLengthNumberCountChange", "outHeightAreaChange", "outChange", "outFocusAndBlurEvent", "outEnterEvent", "outInputEvent", "outIconLeft", "outIconRight", "outFunctionsControl", "outFilesDrop", "outFileDrop", "outChangeValueByButtonUpDown"] }, { kind: "component", type: LibsUiComponentsAvatarComponent, selector: "libs_ui-components-avatar", inputs: ["getLastTextAfterSpace", "typeShape", "classInclude", "size", "linkAvatar", "linkAvatarError", "idGenColor", "textAvatar", "classImageInclude"], outputs: ["outAvatarError"] }, { kind: "component", type: LibsUiComponentsListComponent, selector: "libs_ui-components-list", inputs: ["hiddenInputSearch", "dropdownTabKeyActive", "keySearch", "itemChangeUnSelect", "paddingLeftItem", "config", "autoSelectedFirstItemCallOutsideBefore", "isSearchOnline", "disable", "disableLabel", "labelConfig", "searchConfig", "searchPadding", "dividerClassInclude", "hasDivider", "buttonsOther", "hasButtonUnSelectOption", "clickExactly", "backgroundListCustom", "maxItemShow", "keySelected", "multiKeySelected", "keysDisableItem", "keysHiddenItem", "focusInputSearch", "skipFocusInputWhenKeySearchStoreUndefined", "functionGetItemsAutoAddList", "validRequired", "showValidateBottom", "zIndex", "loadingIconSize", "templateRefSearchNoData", "resetKeyWhenSelectAllKeyDropdown", "ignoreClassDisableDefaultWhenUseKeysDisableItem"], outputs: ["outSelectKey", "outSelectMultiKey", "outUnSelectMultiKey", "outClickButtonOther", "outFieldKey", "outChangeView", "outLoading", "outFunctionsControl", "outChangStageFlagMousePopover", "outLoadItemsComplete"] }, { kind: "pipe", type: LibsUiComponentsTagsGetColorPipe, name: "LibsUiComponentsTagsGetColorPipe" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
706
|
+
}
|
|
707
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LibsUiComponentsTagsComponent, decorators: [{
|
|
708
|
+
type: Component,
|
|
709
|
+
args: [{ selector: 'libs_ui-components-tags', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [
|
|
710
|
+
TranslateModule, NgTemplateOutlet, NgStyle, LibsUiComponentsClickOutsideDirective,
|
|
711
|
+
LibsUiComponentsLabelComponent, LibsUiComponentsPopoverComponent,
|
|
712
|
+
LibsUiComponentsInputsInputComponent, LibsUiComponentsAvatarComponent,
|
|
713
|
+
LibsUiComponentsListComponent, LibsUiComponentsTagsGetColorPipe
|
|
714
|
+
], template: "<div class=\"flex flex-col w-full h-full\">\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() || loading() || loadingDetail()\"\n [disableButtonsRight]=\"labelConfig.disableButtonsRight || disable() || loading() || loadingDetail()\"\n [hasToggle]=\"labelConfig.hasToggle\"\n [toggleActive]=\"labelConfig.toggleActive\"\n [toggleActive]=\"labelConfig.toggleDisable || disable() || loading() || loadingDetail()\"\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 <libs_ui-components-popover class=\"w-full h-full\"\n [ignoreShowPopover]=\"disable() || readonly() || !!config()?.ignoreShowList || false\"\n [ignoreCursorPointerModeLikeClick]=\"true\"\n [elementRefCustom]=\"tagsEl\"\n [mode]=\"!config()?.ignoreInput ? 'click' : 'click-toggle'\"\n [ignoreHiddenPopoverContentWhenMouseLeave]=\"true\"\n [flagMouse]=\"flagMouse()\"\n [config]=\"{\n animationConfig: config()?.animationConfig || {},\n zIndex: zIndex() || 1000,\n widthByParent: true,\n parentBorderWidth: parentBorderWidth() ?? 0,\n maxHeight: 2048,\n maxWidth: 2048,\n direction: config()?.directionList || 'bottom',\n directionDistance: 2,\n template: !showListBellow() ? listViewEl : undefined,\n whiteTheme: true,\n ignoreArrow: true,\n classInclude: 'rounded-[4px] ' + classIncludePopover() + ((!listConfig()?.ignoreShowDataWhenNotSearch || keySearch()) ? ' libs-ui-border-general' : ''),\n position: { mode: 'start', distance: 0 }\n }\"\n (outFunctionsControl)=\"handlerPopoverFunctionControlEvent($event)\"\n (outEvent)=\"handlerPopoverEvent($event)\"\n (outEventPopoverContent)=\"handlerPopoverContentEvent($event)\"\n (outChangStageFlagMouse)=\"handlerChangeFlagMouse($event)\">\n <div class=\"relative\"\n [class.cursor-pointer]=\"!disable() && !readonly()\">\n @if (config()?.uiLikeDropdown) {\n <i class=\"flex text-[16px] absolute right-[16px] top-[8px] libs-ui-icon-move-right rotate-90 z-[1]\"\n [class.text-[#6a7383]]=\"!readonly() && !disable()\"\n [class.libs-ui-readonly]=\"readonly()\"\n [class.libs-ui-disable]=\"disable()\">\n </i>\n }\n <div #tagsEl\n [class]=\"'libs-ui-tags ' + (config()?.classInclude || '') + (readonly() ? (config()?.classCustomWhenReadOnly || ' libs-ui-readonly') : '')\"\n [class.libs-ui-tags-not-popup]=\"(!showList() && !showBorderActiveWhenFocusInput()) || (!focus() && showBorderActiveWhenFocusInput())\"\n [class.libs-ui-tags-error]=\"!!error() && !config()?.ignoreShowError\"\n [class.!pr-[32px]]=\"config()?.uiLikeDropdown\"\n [class.libs-ui-readonly-background]]=\"readonly()\"\n [class.libs-ui-disable-background]]=\"disable()\"\n [class.libs-ui-border-primary-general]=\"focus() && showBorderActiveWhenFocusInput()\"\n LibsUiComponentsClickOutsideDirective\n (outOutside)=\"handlerClickOutside($event)\">\n @for (item of itemsSelected(); track item[fieldKey()]) {\n <div [ngStyle]=\"item?.bullet || item?.ngStyles\"\n [class]=\"classIncludeTagItem() || ''\"\n [class.libs-ui-tags-readonly]=\"item.disableItem\"\n [class.libs-ui-tags-item]=\"!item.disableItem\"\n [class.cursor-default]=\"disable() || readonly()\">\n @if (fieldGetImage(); as fieldGetImage) {\n <div class=\"flex items-center justify-center h-full\">\n <libs_ui-components-avatar [classInclude]=\"classAvatarInclude() || 'mr-[8px]'\"\n [size]=\"imageSize()\"\n [linkAvatar]=\"item[fieldGetImage]\"\n [linkAvatarError]=\"config()?.linkImageError\"\n [idGenColor]=\"item[fieldGetTextAvatar()]\"\n [textAvatar]=\"item[fieldGetTextAvatar()]\"\n [getLastTextAfterSpace]=\"getLastTextAfterSpace()\" />\n </div>\n }\n <span class=\"libs-ui-font-h6r\"\n [innerHtml]=\"(item.fieldLabel || ' ') | translate\">\n </span>\n @if (!disable() && !item.disableItem && !readonly()) {\n <div class=\"flex items-center justify-center ml-[8px]\">\n <i #iconCloseEl\n [attr.specificStyle]=\"!!(item?.bullet || item?.ngStyles)\"\n [class]=\"'flex text-[16px] ' + (classIconRemoveTagItem() || 'libs-ui-icon-close')\"\n [class.cursor-pointer]=\"!disable() && !loading() && !loadingDetail()\"\n [class.pointer-events-none]=\"disable() || loading() || loadingDetail()\"\n [ngStyle]=\"(item?.bullet || item?.ngStyles) | LibsUiComponentsTagsGetColorPipe:iconCloseEl\"\n (click)=\"handlerRemoveItemSelected($event,item)\"></i>\n </div>\n }\n </div>\n }\n @if (!singleSelected() || (singleSelected() && !itemsSelected().length)) {\n @if (!config()?.ignoreInput && !config()?.uiLikeDropdown && (!hiddenInputWhenReadonly() || (hiddenInputWhenReadonly() && !readonly()))) {\n <libs_ui-components-inputs-input class=\"grow\"\n [class.mb-[4px]]=\"itemsSelected().length\"\n [classInclude]=\"'w-full bg-transparent' + (config()?.classInputInclude || 'px-[4px] min-w-[30px]')\"\n [defaultHeight]=\"24\"\n [placeholder]=\"readonly() ? '' : (placeholder() || 'i18n_import_content')\"\n [noBorder]=\"true\"\n [(value)]=\"valueInput\"\n [disable]=\"disable() || loading() || loadingDetail() || disableWhenMaxItem()\"\n [readonly]=\"readonly()\"\n (outEnterEvent)=\"handlerEnterEvent()\"\n (valueChange)=\"handlerValueChangeSearch($event)\"\n (outFocusAndBlurEvent)=\"handlerFocusAndBlurEvent($event)\"\n (outFunctionsControl)=\"handlerInputFunctionControl($event)\" />\n }\n @if (config()?.ignoreInput && config()?.uiLikeDropdown && !itemsSelected().length) {\n <div class=\"flex items-center pb-[4px] pt-[2px] ml-[11px] libs-ui-font-h5r\"\n [class.text-[#9ca2ad]]=\"disable()\">\n {{ (placeholder() || 'i18n_select_value') | translate }}\n </div>\n }\n }\n </div>\n @if (error() && !config()?.ignoreShowError) {\n <div class=\"text-[#ee2d41] libs-ui-font-h7r mt-[8px]\">{{ (error()?.message || ' ') | translate:(error()?.interpolateParams || {}) }}</div>\n }\n </div>\n </libs_ui-components-popover>\n</div>\n@if (showListBellow()) {\n <ng-container *ngTemplateOutlet=\"listViewEl\"></ng-container>\n}\n<ng-template #listViewEl>\n @if (listConfig(); as listConfig) {\n <libs_ui-components-list [searchConfig]=\"listSearchConfig() || {classInclude: 'hidden', iconLeftClass: 'hidden'}\"\n [isSearchOnline]=\"isSearchOnline()\"\n [zIndex]=\"zIndex()\"\n [keySearch]=\"keySearch()\"\n [config]=\"listConfig\"\n [disable]=\"disable() || loadingDetail() || disableWhenMaxItem()\"\n [searchPadding]=\"listSearchPadding()\"\n [maxItemShow]=\"listMaxItemShow() || 6\"\n [multiKeySelected]=\"keysSelected()\"\n [clickExactly]=\"false\"\n [keysHiddenItem]=\"keysHiddenItem()\"\n [keysDisableItem]=\"keysDisableItem()\"\n [dividerClassInclude]=\"listDividerClassInclude() ?? 'hidden'\"\n [buttonsOther]=\"listButtonsOther()\"\n [backgroundListCustom]=\"listBackgroundListCustom()\"\n [itemChangeUnSelect]=\"itemChangeUnSelect()\"\n [functionGetItemsAutoAddList]=\"functionGetItemAutoAddList()\"\n [hiddenInputSearch]=\"listHiddenInputSearchWhenHasSearchConfig()\"\n (outFunctionsControl)=\"handlerFunctionControlList($event)\"\n (outSelectKey)=\"handlerSelectedKey($event)\"\n (outSelectMultiKey)=\"handlerSelectMultiKey($event)\"\n (outChangeView)=\"handlerDataChange($event)\"\n (outClickButtonOther)=\"handlerClickButtonOther($event)\"\n (outChangStageFlagMousePopover)=\"handlerChangStageFlagMouse($event)\"\n (outLoading)=\"handlerLoading($event)\" />\n }\n</ng-template>\n", styles: [".libs-ui-tags{position:relative;display:flex;flex-wrap:wrap;border:1px solid var(--libs-ui-color-default, #226FF5);max-height:100px;overflow:auto;border-radius:4px;padding:3px 0 0 4px;min-height:32px}.libs-ui-tags-not-popup{border:1px solid #E6E7EA}.libs-ui-tags-error{border-color:#ff5454}.libs-ui-tags .libs-ui-tags-item{display:flex;align-items:center;margin:0 4px 3px 0;padding:4px 8px;color:var(--libs-ui-color-default, #226FF5);border-radius:20px;background-color:var(--libs-ui-color-light-2, #E9F1FE);word-break:break-word!important;overflow-wrap:break-word!important;cursor:default}.libs-ui-tags .libs-ui-tags-item i[class*=libs-ui-icon-]{border-radius:50%}.libs-ui-tags .libs-ui-tags-item i[class*=libs-ui-icon-]:before{border-radius:50%;font-size:16px;color:var(--libs-ui-color-default, #226FF5)}.libs-ui-tags .libs-ui-tags-item i[class*=libs-ui-icon-]:hover:before{background:var(--libs-ui-color-light-6, #D3E2FD)}.libs-ui-tags .libs-ui-tags-item i[class*=libs-ui-icon-]:active:before{background:var(--libs-ui-color-light-5, #BDD4FC)}.libs-ui-tags .libs-ui-tags-item [specificStyle=true] i[class*=libs-ui-icon-]{border-radius:50%}.libs-ui-tags .libs-ui-tags-item [specificStyle=true] i[class*=libs-ui-icon-]:before{border-radius:50%;font-size:16px;color:var(--libs-ui-tags-item-icon-default)}.libs-ui-tags .libs-ui-tags-item [specificStyle=true] i[class*=libs-ui-icon-]:hover:before{color:var(--libs-ui-tags-item-icon-hover);background:var(--libs-ui-tags-item-icon-background-hover)}.libs-ui-tags .libs-ui-tags-item [specificStyle=true] i[class*=libs-ui-icon-]:active:before{color:var(--libs-ui-tags-item-icon-active);background:var(--libs-ui-tags-item-icon-background-active)}.libs-ui-tags-disable{background:#f8f9fa;color:#9ca2ad}.libs-ui-tags-readonly{background:#f1ebfd;color:#7239ea;display:flex;align-items:center;margin:0 4px 4px 0;padding:4px 8px;border-radius:20px;word-break:break-word!important;overflow-wrap:break-word!important}\n"] }]
|
|
715
|
+
}], ctorParameters: () => [] });
|
|
716
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFncy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvdGFncy9zcmMvdGFncy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvdGFncy9zcmMvdGFncy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDNUQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFjLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEwsT0FBTyxFQUFFLCtCQUErQixFQUEyQixNQUFNLDRCQUE0QixDQUFDO0FBR3RHLE9BQU8sRUFBa0Qsb0NBQW9DLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUd4SSxPQUFPLEVBQVUsOEJBQThCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNuRixPQUFPLEVBQUUsaUJBQWlCLEVBQXVGLDZCQUE2QixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDakwsT0FBTyxFQUE0QyxnQ0FBZ0MsRUFBOEMsTUFBTSw2QkFBNkIsQ0FBQztBQUVySyxPQUFPLEVBQXNCLHdCQUF3QixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDOUYsT0FBTyxFQUFFLFNBQVMsRUFBRSx5QkFBeUIsRUFBRSx1QkFBdUIsRUFBRSwwQkFBMEIsRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUosT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxZQUFZLEVB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RSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsVUFBVSxFQUFFLFlBQVksQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFLLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLEtBQUssR0FBRyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3JXLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDeEMsSUFBSSxVQUFVLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUMvSCxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssSUFBSSxFQUFFLEVBQUUsR0FBRyxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM1RixDQUFDO1FBQ0QsSUFBSSxDQUFDLFlB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QUFDLENBQUM7UUFDakMsWUFBWSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLENBQUM7UUFDekMsWUFBWSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDLENBQUM7UUFDNUMsWUFBWSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLENBQUM7SUFDM0MsQ0FBQzt3R0E3dEJVLDZCQUE2Qjs0RkFBN0IsNkJBQTZCLG0vT0NsQzFDLDZsU0F1S0EsMjlERDNJSSxlQUFlLDRGQUFFLGdCQUFnQixvSkFBRSxPQUFPLDJFQUFFLHFDQUFxQywwSEFDakYsOEJBQThCLDRxQkFBRSxnQ0FBZ0MscWVBQ2hFLG9DQUFvQyw4OUNBQUUsK0JBQStCLDZQQUNyRSw2QkFBNkIsOC9CQUFFLGdDQUFnQzs7NEZBR3RELDZCQUE2QjtrQkFkekMsU0FBUzsrQkFFRSx5QkFBeUIsY0FHdkIsSUFBSSxtQkFDQyx1QkFBdUIsQ0FBQyxNQUFNLFdBQ3RDO3dCQUNQLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxPQUFPLEVBQUUscUNBQXFDO3dCQUNqRiw4QkFBOEIsRUFBRSxnQ0FBZ0M7d0JBQ2hFLG9DQUFvQyxFQUFFLCtCQUErQjt3QkFDckUsNkJBQTZCLEVBQUUsZ0NBQWdDO3FCQUNoRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nU3R5bGUsIE5nVGVtcGxhdGVPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgY29tcHV0ZWQsIGVmZmVjdCwgRWxlbWVudFJlZiwgaW5qZWN0LCBpbnB1dCwgbW9kZWwsIE9uRGVzdHJveSwgT25Jbml0LCBvdXRwdXQsIHNpZ25hbCwgdW50cmFja2VkLCB2aWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNBdmF0YXJDb21wb25lbnQsIFRZUEVfU0laRV9BVkFUQVJfQ09ORklHIH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1hdmF0YXInO1xuaW1wb3J0IHsgSUJ1dHRvbiB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtYnV0dG9ucy1idXR0b24nO1xuaW1wb3J0IHsgSVZhbGlkTWF4SXRlbVNlbGVjdGVkIH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1kcm9wZG93bic7XG5pbXBvcnQgeyBJRm9jdXNBbmRCbHVyRXZlbnQsIElJbnB1dEZ1bmN0aW9uQ29udHJvbEV2ZW50LCBMaWJzVWlDb21wb25lbnRzSW5wdXRzSW5wdXRDb21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWlucHV0cy1pbnB1dCc7XG5pbXBvcnQgeyBJSW5wdXRTZWFyY2hDb25maWcgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWlucHV0cy1zZWFyY2gnO1xuaW1wb3J0IHsgSVZhbGlkLCBJVmFsaWRQYXR0ZXJuIH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1pbnB1dHMtdmFsaWQnO1xuaW1wb3J0IHsgSUxhYmVsLCBMaWJzVWlDb21wb25lbnRzTGFiZWxDb21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWxhYmVsJztcbmltcG9ydCB7IGdldEZpZWxkS2V5QnlUeXBlLCBJTGlzdENvbmZpZ0l0ZW0sIElMaXN0RGF0YUVtaXRLZXksIElMaXN0RGF0YUVtaXRNdWx0aUtleSwgSUxpc3RGdW5jdGlvbkNvbnRyb2xFdmVudCwgTGlic1VpQ29tcG9uZW50c0xpc3RDb21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWxpc3QnO1xuaW1wb3J0IHsgSUZsYWdNb3VzZSwgSVBvcG92ZXJGdW5jdGlvbkNvbnRyb2xFdmVudCwgTGlic1VpQ29tcG9uZW50c1BvcG92ZXJDb21wb25lbnQsIFRZUEVfUE9QT1ZFUl9ESVJFQ1RJT04sIFRZUEVfUE9QT1ZFUl9FVkVOVCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtcG9wb3Zlcic7XG5pbXBvcnQgeyBJSHR0cFJlc3BvbnNlIH0gZnJvbSAnQGxpYnMtdWkvaW50ZXJmYWNlcy10eXBlcyc7XG5pbXBvcnQgeyBJSHR0cFJlcXVlc3RDb25maWcsIExpYnNVaUh0dHBSZXF1ZXN0U2VydmljZSB9IGZyb20gJ0BsaWJzLXVpL3NlcnZpY2VzLWh0dHAtcmVxdWVzdCc7XG5pbXBvcnQgeyBjbG9uZURlZXAsIEVSUk9SX01FU1NBR0VfRU1QVFlfVkFMSUQsIEVSUk9SX01FU1NBR0VfTUFYX1ZBTElELCBFUlJPUl9NRVNTQUdFX1BBVFRFTl9WQUxJRCwgZXNjYXBlSHRtbCwgZ2V0LCBpc05pbCwgc2V0LCB1dWlkIH0gZnJvbSAnQGxpYnMtdWkvdXRpbHMnO1xuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIFN1YmplY3QsIFN1YnNjcmlwdGlvbiwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBJVGFnc0NvbmZpZywgSVRhZ3NGdW5jdGlvbkNvbnRyb2xFdmVudCB9IGZyb20gJy4vaW50ZXJmYWNlcy90YWdzLmludGVyZmFjZSc7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzVGFnc0dldENvbG9yUGlwZSB9IGZyb20gJy4vcGlwZXMvZ2V0LWNvbG9yLnBpcGUnO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c0NsaWNrT3V0c2lkZURpcmVjdGl2ZSB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtY2xpY2stb3V0c2lkZSc7XG5cbkBDb21wb25lbnQoe1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2NvbXBvbmVudC1zZWxlY3RvclxuICBzZWxlY3RvcjogJ2xpYnNfdWktY29tcG9uZW50cy10YWdzJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3RhZ3MuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vdGFncy5jb21wb25lbnQuc2NzcycsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBpbXBvcnRzOiBbXG4gICAgVHJhbnNsYXRlTW9kdWxlLCBOZ1RlbXBsYXRlT3V0bGV0LCBOZ1N0eWxlLCBMaWJzVWlDb21wb25lbnRzQ2xpY2tPdXRzaWRlRGlyZWN0aXZlLFxuICAgIExpYnNVaUNvbXBvbmVudHNMYWJlbENvbXBvbmVudCwgTGlic1VpQ29tcG9uZW50c1BvcG92ZXJDb21wb25lbnQsXG4gICAgTGlic1VpQ29tcG9uZW50c0lucHV0c0lucHV0Q29tcG9uZW50LCBMaWJzVWlDb21wb25lbnRzQXZhdGFyQ29tcG9uZW50LFxuICAgIExpYnNVaUNvbXBvbmVudHNMaXN0Q29tcG9uZW50LCBMaWJzVWlDb21wb25lbnRzVGFnc0dldENvbG9yUGlwZVxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBMaWJzVWlDb21wb25lbnRzVGFnc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcblxuICAvKiBQUk9QRVJUWSAqL1xuICBwcm90ZWN0ZWQgZmxhZ01vdXNlID0gc2lnbmFsPElGbGFnTW91c2U+KHsgaXNNb3VzZUVudGVyOiBmYWxzZSwgaXNNb3VzZUVudGVyQ29udGVudDogZmFsc2UgfSk7XG4gIHByb3RlY3RlZCBsb2FkaW5nID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJvdGVjdGVkIGxvYWRpbmdEZXRhaWwgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcm90ZWN0ZWQga2V5U2VhcmNoID0gc2lnbmFsPHN0cmluZz4oJycpO1xuICBwcm90ZWN0ZWQgdmFsdWVJbnB1dCA9IHNpZ25hbDxzdHJpbmc+KCcnKTtcbiAgcHJvdGVjdGVkIGl0ZW1zU2VsZWN0ZWQgPSBzaWduYWw8QXJyYXk8YW55Pj4oW10pO1xuICBwcm90ZWN0ZWQgc2hvd0xpc3QgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcm90ZWN0ZWQgcG9zaXRpb25MaXN0ID0gc2lnbmFsPFRZUEVfUE9QT1ZFUl9ESVJFQ1RJT04gfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHByb3RlY3RlZCBrZXlzU2VsZWN0ZWQgPSBzaWduYWw8QXJyYXk8dW5rbm93bj4+KFtdKTtcbiAgcHJvdGVjdGVkIGRpc2FibGVXaGVuTWF4SXRlbSA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHByb3RlY3RlZCBpdGVtQ2hhbmdlVW5TZWxlY3QgPSBzaWduYWw8dW5rbm93biB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcHJvdGVjdGVkIGZvY3VzID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJvdGVjdGVkIGVycm9yID0gc2lnbmFsPElWYWxpZCB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcHJvdGVjdGVkIGZpZWxkS2V5ID0gc2lnbmFsPHN0cmluZz4oJ2lkJyk7XG4gIHByb3RlY3RlZCBmdW5jdGlvbkdldEl0ZW1BdXRvQWRkTGlzdCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBpZiAoIXRoaXMuZW50ZXJBdXRvQWRkVGFnVG9MaXN0KCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuICgpID0+IHRoaXMuaXRlbXNTZWxlY3RlZCgpLmZpbHRlcihpdGVtID0+IGAke2l0ZW1bdGhpcy5maWVsZEtleSgpXX1gLnNlYXJjaCh0aGlzLmZha2VJZCgpKSA9PT0gMCkucmV2ZXJzZSgpO1xuICB9KTtcblxuICBwcml2YXRlIGZha2VJZCA9IHNpZ25hbDxzdHJpbmc+KHV1aWQoKSk7XG4gIHByaXZhdGUgdGltZU91dEZsYWcgPSBzaWduYWw8bnVtYmVyIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcml2YXRlIHRpbWVPdXRDaGFuZ2VTZWFyY2ggPSBzaWduYWw8bnVtYmVyIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcml2YXRlIHRpbWVPdXRDaGVja1ZpZXdDaGFuZ2UgPSBzaWduYWw8bnVtYmVyIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcml2YXRlIHRpbWVvdXRDbGlja091dHNpZGUgPSBzaWduYWw8bnVtYmVyIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcml2YXRlIGNsaWVudEhlaWdodCA9IHNpZ25hbDxudW1iZXIgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHByaXZhdGUgaXRlbXNPZkxpc3QgPSBzaWduYWw8QXJyYXk8dW5rbm93bj4+KFtdKTtcbiAgcHJpdmF0ZSBrZXlTZWFyY2hDaGFuZ2UgPSBuZXcgU3ViamVjdDxzdHJpbmc+KCk7XG4gIHByaXZhdGUga2V5U2VhcmNoQ2hhbmdlU3ViID0gc2lnbmFsPFN1YnNjcmlwdGlvbiB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcHJpdmF0ZSB0ZW1wSWdub3JlRW1pdCA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHByaXZhdGUgcG9wb3ZlckZ1bmN0aW9uQ29udHJvbCA9IHNpZ25hbDxJUG9wb3ZlckZ1bmN0aW9uQ29udHJvbEV2ZW50IHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcml2YXRlIGlucHV0RnVuY3Rpb25Db250cm9sID0gc2lnbmFsPElJbnB1dEZ1bmN0aW9uQ29udHJvbEV2ZW50IHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcml2YXRlIHR5cGVQb3BvdmVyID0gc2lnbmFsPFRZUEVfUE9QT1ZFUl9FVkVOVCB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcHJpdmF0ZSBsaXN0RnVuY3Rpb25Db250cm9sID0gc2lnbmFsPElMaXN0RnVuY3Rpb25Db250cm9sRXZlbnQgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHByaXZhdGUgZGVmYXVsdEl0ZW1zU2VsZWN0ZWRDdXJyZW50ID0gc2lnbmFsPEFycmF5PHVua25vd24+IHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcml2YXRlIG9uRGVzdHJveSA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgLyogSU5QVVQgKi9cbiAgcmVhZG9ubHkgY2xhc3NJbmNsdWRlUG9wb3ZlciA9IGlucHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgZW50ZXJBdXRvQWRkVGFnVG9MaXN0ID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xuICByZWFkb25seSBjaGVja0V4aXRJc0xhYmVsSW5jbHVkZSA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGNoZWNrRXhpdEJ5RmllbGRzID0gaW5wdXQ8QXJyYXk8c3RyaW5nPj4oKTtcbiAgcmVhZG9ubHkgcGFyZW50Qm9yZGVyV2lkdGggPSBpbnB1dDxudW1iZXI+KCk7XG4gIHJlYWRvbmx5IGZ1bmN0aW9uQ2hlY2tQZXJtaXNzaW9uQ3JlYXRlVGFnID0gaW5wdXQ8KCkgPT4gYm9vbGVhbj4oKCkgPT4gdHJ1ZSk7XG4gIHJlYWRvbmx5IHBsYWNlaG9sZGVyID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBodHRwUmVxdWVzdERldGFpbEl0ZW1CeUlkcyA9IGlucHV0PElIdHRwUmVxdWVzdENvbmZpZz4oKTtcbiAgcmVhZG9ubHkgZmllbGRMYWJlbCA9IGlucHV0PHN0cmluZz4oJ2xhYmVsJyk7XG4gIHJlYWRvbmx5IG1heEl0ZW1JbnB1dCA9IGlucHV0PG51bWJlcj4oKTtcbiAgcmVhZG9ubHkgekluZGV4ID0gaW5wdXQ8bnVtYmVyPigpO1xuICByZWFkb25seSBjb25maWcgPSBpbnB1dDxJVGFnc0NvbmZpZz4oKTtcbiAgcmVhZG9ubHkgZGlzYWJsZSA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IHJlYWRvbmx5ID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgbGFiZWxDb25maWcgPSBpbnB1dDxJTGFiZWw+KCk7XG4gIHJlYWRvbmx5IGRlZmF1bHRJdGVtc1NlbGVjdGVkID0gaW5wdXQ8QXJyYXk8dW5rbm93bj4+KCk7XG4gIHJlYWRvbmx5IGRlZmF1bHRLZXlzU2VsZWN0ZWQgPSBpbnB1dDxBcnJheTx1bmtub3duPj4oKTtcbiAgcmVhZG9ubHkgbGlzdFNlYXJjaENvbmZpZyA9IGlucHV0PElJbnB1dFNlYXJjaENvbmZpZz4oKTtcbiAgcmVhZG9ubHkgaXNTZWFyY2hPbmxpbmUgPSBpbnB1dDxib29sZWFuPihmYWxzZSk7XG4gIHJlYWRvbmx5IGxpc3RTZWFyY2hQYWRkaW5nID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgbGlzdERpdmlkZXJDbGFzc0luY2x1ZGUgPSBpbnB1dDxzdHJpbmc+KCk7XG4gIHJlYWRvbmx5IGxpc3RDb25maWcgPSBpbnB1dDxJTGlzdENvbmZpZ0l0ZW0+KCk7XG4gIHJlYWRvbmx5IGxpc3RCdXR0b25zT3RoZXIgPSBpbnB1dDxBcnJheTxJQnV0dG9uPj4oKTtcbiAgcmVhZG9ubHkgbGlzdENsaWNrRXhhY3RseSA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGxpc3RCYWNrZ3JvdW5kTGlzdEN1c3RvbSA9IGlucHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgbGlzdE1heEl0ZW1TaG93ID0gaW5wdXQ8bnVtYmVyPigpO1xuICByZWFkb25seSBsaXN0SGlkZGVuSW5wdXRTZWFyY2hXaGVuSGFzU2VhcmNoQ29uZmlnID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgcmVtb3ZlVGV4dFNlYXJjaFdoZW5CbHVySW5wdXQgPSBpbnB1dDxib29sZWFuPih0cnVlKTtcbiAgcmVhZG9ubHkga2V5c0hpZGRlbkl0ZW0gPSBtb2RlbDxBcnJheTx1bmtub3duPj4oKVxuICByZWFkb25seSBrZXlzRGlzYWJsZUl0ZW0gPSBpbnB1dDxBcnJheTx1bmtub3duPj4oKVxuICByZWFkb25seSBpZ25vcmVFbWl0V2hlblNhbWVEYXRhU2VsZWN0ZWQgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBzaW5nbGVTZWxlY3RlZCA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGNsYXNzSW5jbHVkZVRhZ0l0ZW0gPSBpbnB1dDxzdHJpbmc+KClcbiAgcmVhZG9ubHkgY2xhc3NJY29uUmVtb3ZlVGFnSXRlbSA9IGlucHV0PHN0cmluZz4oKVxuICByZWFkb25seSBzaG93Qm9yZGVyQWN0aXZlV2hlbkZvY3VzSW5wdXQgPSBpbnB1dDxib29sZWFuPigpXG4gIHJlYWRvbmx5IGZpZWxkR2V0SW1hZ2UgPSBpbnB1dDxzdHJpbmc+KCk7XG4gIHJlYWRvbmx5IGltYWdlU2l6ZSA9IGlucHV0PFRZUEVfU0laRV9BVkFUQVJfQ09ORklHPigxNik7XG4gIHJlYWRvbmx5IGZpZWxkR2V0VGV4dEF2YXRhciA9IGlucHV0PHN0cmluZz4oJ3VzZXInKTtcbiAgcmVhZG9ubHkgY2xhc3NBdmF0YXJJbmNsdWRlID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBnZXRMYXN0VGV4dEFmdGVyU3BhY2UgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSB2YWxpZFJlcXVpcmVkID0gaW5wdXQ8SVZhbGlkPigpO1xuICByZWFkb25seSB2YWxpZE1heEl0ZW1TZWxlY3RlZCA9IGlucHV0PElWYWxpZE1heEl0ZW1TZWxlY3RlZD4oKTtcbiAgcmVhZG9ubHkgdmFsaWRQYXR0ZXJuID0gaW5wdXQ8QXJyYXk8SVZhbGlkUGF0dGVybj4+KCk7XG4gIHJlYWRvbmx5IHNob3dMaXN0QmVsbG93ID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgaGlkZGVuSW5wdXRXaGVuUmVhZG9ubHkgPSBpbnB1dDxib29sZWFuPigpO1xuXG4gIC8qIE9VVFBVVCAqL1xuICByZWFkb25seSBvdXRTZWxlY3RNdWx0aUl0ZW0gPSBvdXRwdXQ8QXJyYXk8dW5rbm93bj4+KCk7XG4gIHJlYWRvbmx5IG91dFZhbGlkRXZlbnQgPSBvdXRwdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgb3V0RnVuY3Rpb25zQ29udHJvbCA9IG91dHB1dDxJVGFnc0Z1bmN0aW9uQ29udHJvbEV2ZW50PigpO1xuICByZWFkb25seSBvdXRDbGlja0J1dHRvbk90aGVyID0gb3V0cHV0PElCdXR0b24+KCk7XG4gIHJlYWRvbmx5IG91dFNob3dMaXN0RXZlbnQgPSBvdXRwdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgb3V0Q2hhbmdTdGFnZUZsYWdNb3VzZSA9IG91dHB1dDxJRmxhZ01vdXNlPigpO1xuICByZWFkb25seSBvdXRMb2FkaW5nR2V0RGV0YWlsU2VsZWN0ZWQgPSBvdXRwdXQ8Ym9vbGVhbj4oKTtcblxuICAvKiBWSUVXIENISUxEICovXG4gIHByaXZhdGUgcmVhZG9ubHkgdGFnc0VsID0gdmlld0NoaWxkLnJlcXVpcmVkPEVsZW1lbnRSZWY+KCd0YWdzRWwnKTtcblxuICAvKiBJTkpFQ1QqL1xuICBwcml2YXRlIGh0dHBSZXF1ZXN0U2VydmljZSA9IGluamVjdChMaWJzVWlIdHRwUmVxdWVzdFNlcnZpY2UpO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCBtYXhJdGVtSW5wdXQgPSB0aGlzLm1heEl0ZW1JbnB1dCgpO1xuICAgICAgdW50cmFja2VkKCgpID0+IHtcbiAgICAgICAgdGhpcy5kaXNhYmxlV2hlbk1heEl0ZW0uc2V0KGZhbHNlKTtcbiAgICAgICAgaWYgKG1heEl0ZW1JbnB1dCAmJiBtYXhJdGVtSW5wdXQgPD0gdGhpcy5pdGVtc1NlbGVjdGVkKCkubGVuZ3RoKSB7XG4gICAgICAgICAgdGhpcy5kaXNhYmxlV2hlbk1heEl0ZW0uc2V0KHRydWUpO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0pXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IGxpc3RDb25maWcgPSB0aGlzLmxpc3RDb25maWcoKTtcbiAgICAgIHVudHJhY2tlZCgoKSA9PiB7XG4gICAgICAgIGlmIChsaXN0Q29uZmlnKSB7XG4gICAgICAgICAgdGhpcy5maWVsZEtleS5zZXQoZ2V0RmllbGRLZXlCeVR5cGUobGlzdENvbmZpZywgJ2lkJykpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfSlcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgY29uc3QgY3VycmVudEl0ZW1zID0gdGhpcy5kZWZhdWx0SXRlbXNTZWxlY3RlZCgpIHx8IFtdO1xuICAgICAgdW50cmFja2VkKCgpID0+IHtcbiAgICAgICAgY29uc3QgcHJldmlvdXNJdGVtcyA9IHRoaXMuZGVmYXVsdEl0ZW1zU2VsZWN0ZWRDdXJyZW50KCkgfHwgW107XG4gICAgICAgIHRoaXMuZGVmYXVsdEl0ZW1zU2VsZWN0ZWRDdXJyZW50LnNldCh0aGlzLmRlZmF1bHRJdGVtc1NlbGVjdGVkKCkpO1xuICAgICAgICBpZiAocHJldmlvdXNJdGVtcy5sZW5ndGggIT09IGN1cnJlbnRJdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLnVwZGF0ZUl0ZW1zU2VsZWN0ZWQoY3VycmVudEl0ZW1zKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBwcmV2SXRlbSBvZiBwcmV2aW91c0l0ZW1zKSB7XG4gICAgICAgICAgaWYgKCFjdXJyZW50SXRlbXMuc29tZShpdGVtID0+IGdldChpdGVtLCB0aGlzLmZpZWxkS2V5KCkpID09PSBnZXQocHJldkl0ZW0sIHRoaXMuZmllbGRLZXkoKSkpKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUl0ZW1zU2VsZWN0ZWQoY3VycmVudEl0ZW1zKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9KVxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSB0aGlzLmRlZmF1bHRLZXlzU2VsZWN0ZWQoKSB8fCBbXTtcbiAgICAgIHVudHJhY2tlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzVmFsdWUgPSB0aGlzLmtleXNTZWxlY3RlZCgpIHx8IFtdO1xuICAgICAgICBpZiAocHJldmlvdXNWYWx1ZS5sZW5ndGggIT09IGN1cnJlbnRWYWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLmdldERldGFpbEJ5SWRzKGN1cnJlbnRWYWx1ZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGtleXNOZXcgPSBjdXJyZW50VmFsdWUuZmlsdGVyKGtleSA9PiAhdGhpcy5pdGVtc1NlbGVjdGVkKCkuc29tZShpdGVtID0+IGl0ZW1bdGhpcy5maWVsZEtleSgpXSA9PT0ga2V5KSk7XG4gICAgICAgIGlmIChrZXlzTmV3Lmxlbmd0aCkge1xuICAgICAgICAgIHRoaXMuZ2V0RGV0YWlsQnlJZHMoa2V5c05ldyk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfSlcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIGlmICghdGhpcy5jb25maWcoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBodHRwUmVxdWVzdERldGFpbEl0ZW1CeUlkcyA9IHRoaXMuaHR0cFJlcXVlc3REZXRhaWxJdGVtQnlJZHMoKTtcbiAgICBpZiAoaHR0cFJlcXVlc3REZXRhaWxJdGVtQnlJZHMgJiYgKCFodHRwUmVxdWVzdERldGFpbEl0ZW1CeUlkcy5ndWlkZUF1dG9VcGRhdGVBcmd1bWVudHNWYWx1ZSB8fCAhaHR0cFJlcXVlc3REZXRhaWxJdGVtQnlJZHMuZ3VpZGVBdXRvVXBkYXRlQXJndW1lbnRzVmFsdWU/LmRldGFpbEJ5SWQpKSB7XG4gICAgICB0aHJvdyAnQ29uZmlnIGdldERldGFpbEJ5SWRzIHnDqnUgY+G6p3UgdOG7kWkgdGhp4buDdSBjw6FjIHRoYW0gc+G7kSAgZ3VpZGVBdXRvVXBkYXRlQXJndW1lbnRzVmFsdWUsIGRldGFpbEJ5SWQnO1xuICAgIH1cbiAgICBjb25zdCBwcmVwcm9jZXNzb3IgPSAoa2V5czogQXJyYXk8dW5rbm93bj4pID0+IHtcbiAgICAgIGlmICgha2V5cyB8fCAhKGtleXMgaW5zdGFuY2VvZiBBcnJheSkgfHwgIWtleXMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiAnJztcbiAgICAgIH1cbiAgICAgIHJldHVybiBrZXlzLmpvaW4oJzsnKTtcbiAgICB9O1xuICAgIGlmIChodHRwUmVxdWVzdERldGFpbEl0ZW1CeUlkcz8uZ3VpZGVBdXRvVXBkYXRlQXJndW1lbnRzVmFsdWU/LmRldGFpbEJ5SWQpIHtcbiAgICAgIGh0dHBSZXF1ZXN0RGV0YWlsSXRlbUJ5SWRzLmd1aWRlQXV0b1VwZGF0ZUFyZ3VtZW50c1ZhbHVlLmRldGFpbEJ5SWQuZmllbGRHZXRWYWx1ZSA9IGh0dHBSZXF1ZXN0RGV0YWlsSXRlbUJ5SWRzLmd1aWRlQXV0b1VwZGF0ZUFyZ3VtZW50c1ZhbHVlLmRldGFpbEJ5SWQuZmllbGRHZXRWYWx1ZSA/PyAna2V5cyc7XG4gICAgICBodHRwUmVxdWVzdERldGFpbEl0ZW1CeUlkcy5ndWlkZUF1dG9VcGRhdGVBcmd1bWVudHNWYWx1ZS5kZXRhaWxCeUlkLnByZXByb2Nlc3NvciA9IGh0dHBSZXF1ZXN0RGV0YWlsSXRlbUJ5SWRzLmd1aWRlQXV0b1VwZGF0ZUFyZ3VtZW50c1ZhbHVlLmRldGFpbEJ5SWQucHJlcHJvY2Vzc29yID8/IHByZXByb2Nlc3NvcjtcbiAgICB9XG4gICAgdGhpcy5vdXRGdW5jdGlvbnNDb250cm9sLmVtaXQoe1xuICAgICAgdmFsaWQ6IHRoaXMuY2hlY2tWYWxpZC5iaW5kKHRoaXMpLFxuICAgICAgcmVtb3ZlTGlzdDogYXN5bmMgKCkgPT4gdGhpcy5wb3BvdmVyRnVuY3Rpb25Db250cm9sKCk/LnJlbW92ZVBvcG92ZXJPdmVybGF5KCksXG4gICAgICB1cGRhdGVMYWJlbDogdGhpcy51cGRhdGVMYWJlbC5iaW5kKHRoaXMpLFxuICAgICAgY2xlYXJJdGVtU2VsZWN0ZWQ6IHRoaXMuY2xlYXJJdGVtU2VsZWN0ZWQuYmluZCh0aGlzKSxcbiAgICAgIGNsZWFyS2V5U2VhcmNoOiAoKSA9PiB0aGlzLmhhbmRsZXJWYWx1ZUNoYW5nZVNlYXJjaCgnJyksXG4gICAgICBmb2N1c0lucHV0OiAoKSA9PiB0aGlzLmZvY3VzSW5wdXQoKSxcbiAgICAgIGdldEZha2VJZDogYXN5bmMgKCkgPT4gdGhpcy5mYWtlSWQoKSxcbiAgICAgIGNyZWF0ZVRhZzogdGhpcy5oYW5kbGVyRW50ZXJFdmVudC5iaW5kKHRoaXMpLFxuICAgICAgcmVtb3ZlSXRlbVNlbGVjdGVkOiB0aGlzLmhhbmRsZXJSZW1vdmVJdGVtU2VsZWN0ZWQuYmluZCh0aGlzKSxcbiAgICAgIHJlc2V0RXJyb3I6IHRoaXMucmVzZXRFcnJvci5iaW5kKHRoaXMpLFxuICAgICAgcmVzZXRUb0RlZmF1bHREYXRhU2VsZWN0ZWQ6IHRoaXMucmVzZXRUb0RlZmF1bHREYXRhU2VsZWN0ZWQuYmluZCh0aGlzKSxcbiAgICAgIHVwZGF0ZUl0ZW1TZWxlY3RlZERpc2FibGU6IHRoaXMudXBkYXRlSXRlbVNlbGVjdGVkRGlzYWJsZS5iaW5kKHRoaXMpLFxuICAgICAgcmVmcmVzaExpc3REYXRhOiB0aGlzLnJlZnJlc2hMaXN0RGF0YS5iaW5kKHRoaXMpLFxuICAgICAgc2V0RXJyb3I6IHRoaXMuc2V0RXJyb3IuYmluZCh0aGlzKVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzZXRFcnJvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICB0aGlzLmVycm9yLnNldCh7IG1lc3NhZ2UgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlclBvcG92ZXJGdW5jdGlvbkNvbnRyb2xFdmVudChldmVudDogSVBvcG92ZXJGdW5jdGlvbkNvbnRyb2xFdmVudCkge1xuICAgIHRoaXMucG9wb3ZlckZ1bmN0aW9uQ29udHJvbC5zZXQoZXZlbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB1cGRhdGVMYWJlbCgpIHtcbiAgICBpZiAoIXRoaXMuaXRlbXNTZWxlY3RlZCgpIHx8ICF0aGlzLml0ZW1zU2VsZWN0ZWQoKS5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5pdGVtc1NlbGVjdGVkLnVwZGF0ZShpdGVtcyA9PiB7XG4gICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4gdGhpcy51cGRhdGVGaWVsZExhYmVsKGl0ZW0pKTtcbiAgICAgIHJldHVybiBbLi4uaXRlbXNdXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUZpZWxkTGFiZWwoaXRlbTogdW5rbm93bikge1xuICAgIGNvbnN0IHJlZiA9IGdldChpdGVtLCAncmVmJykgfHwgaXRlbTtcbiAgICBjb25zdCBnZXRWYWx1ZSA9IHRoaXMuY29uZmlnKCk/LmdldFZhbHVlO1xuICAgIHNldChpdGVtLCAnZmllbGRMYWJlbCcsIGAke2dldChyZWYsIHRoaXMuZmllbGRMYWJlbCgpKSB8fCByZWYubGFiZWwgfHwgcmVmLm5hbWUgfHwgJyAnfWApO1xuICAgIGlmIChnZXRWYWx1ZSkge1xuICAgICAgc2V0KGl0ZW0sICdmaWVsZExhYmVsJywgZ2V0VmFsdWUocmVmKSB8fCAnICcpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY2xlYXJJdGVtU2VsZWN0ZWQoaWdub3JlVmFsaWQgPSBmYWxzZSkge1xuICAgIGlmICghdGhpcy5pdGVtc1NlbGVjdGVkKCkgfHwgIXRoaXMuaXRlbXNTZWxlY3RlZCgpLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBsZW5ndGggPSB0aGlzLml0ZW1zU2VsZWN0ZWQoKS5sZW5ndGggLSAxO1xuICAgIHRoaXMudGVtcElnbm9yZUVtaXQuc2V0KHRydWUpO1xuICAgIHRoaXMuaXRlbXNTZWxlY3RlZCgpLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICBpZiAoaW5kZXggPT09IGxlbmd0aCkge1xuICAgICAgICB0aGlzLnRlbXBJZ25vcmVFbWl0LnNldChmYWxzZSk7XG4gICAgICB9XG4gICAgICB0aGlzLmhhbmRsZXJSZW1vdmVJdGVtU2VsZWN0ZWQoeyBzdG9wUHJvcGFnYXRpb246ICgpID0+IHsgcmV0dXJuIH0gfSBhcyBFdmVudCwgaXRlbSwgaWdub3JlVmFsaWQpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVJdGVtc1NlbGVjdGVkKGl0ZW1zU2VsZWN0ZWQ6IEFycmF5PHVua25vd24+LCBpZ25vcmVWYWxpZGF0ZSA9IHRydWUsIGlnbm9yZUVtaXRLZXlTZWxlY3RlZFdoZW5JdGVtc05vdEV4aXRzRW1wdHk/OiBib29sZWFuKSB7XG4gICAgaWYgKCFpdGVtc1NlbGVjdGVkIHx8ICFpdGVtc1NlbGVjdGVkLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpdGVtc05vdEV4aXRzOiBBcnJheTx1bmtub3duPiA9IFtdO1xuICAgIGl0ZW1zU2VsZWN0ZWQuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgIGlmICghaXRlbSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBsZXQgZmllbGRMYWJlbCA9IGAke2dldChpdGVtLCB0aGlzLmZpZWxkTGFiZWwoKSkgfHwgZ2V0KGl0ZW0sICdsYWJlbCcpIHx8IGdldChpdGVtLCAnbmFtZScpIHx8ICcgJ31gO1xuICAgICAgY29uc3QgZ2V0VmFsdWUgPSB0aGlzLmNvbmZpZygpPy5nZXRWYWx1ZTtcbiAgICAgIGlmIChnZXRWYWx1ZSkge1xuICAgICAgICBmaWVsZExhYmVsID0gZ2V0VmFsdWUoaXRlbSkgfHwgJyAnO1xuICAgICAgfVxuICAgICAgY29uc3QgaXRlbUV4aXRzID0gdGhpcy5jaGVja0V4aXRzKGZpZWxkTGFiZWwsIGdldChpdGVtLCB0aGlzLmZpZWxkS2V5KCkpKTtcbiAgICAgIGlmIChpdGVtRXhpdHM/LmlzSXRlbVNlbGVjdGVkKSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24oaXRlbUV4aXRzLml0ZW0sIGl0ZW0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpdGVtc05vdEV4aXRzLnB1c2goaXRlbSk7XG4gICAgfSk7XG4gICAgdGhpcy5wcm9jZXNzRGF0YShpdGVtc05vdEV4aXRzLCBpZ25vcmVWYWxpZGF0ZSwgaWdub3JlRW1pdEtleVNlbGVjdGVkV2hlbkl0ZW1zTm90RXhpdHNFbXB0eSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlclBvcG92ZXJFdmVudCh0eXBlOiBUWVBFX1BPUE9WRVJfRVZFTlQpIHtcbiAgICB0aGlzLnR5cGVQb3BvdmVyLnNldCh0eXBlKTtcbiAgICBpZiAodHlwZSA9PT0gJ2NsaWNrJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodHlwZSA9PT0gJ3JlbW92ZScpIHtcbiAgICAgIHRoaXMuc2hvd0xpc3Quc2V0KGZhbHNlKTtcbiAgICAgIHRoaXMub3V0U2hvd0xpc3RFdmVudC5lbWl0KGZhbHNlKTtcbiAgICAgIHRoaXMuaW5wdXRGdW5jdGlvbkNvbnRyb2woKT8uYmx1cigpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnNob3dMaXN0LnNldCh0cnVlKTtcbiAgICB0aGlzLm91dFNob3dMaXN0RXZlbnQuZW1pdCh0cnVlKTtcbiAgICB0aGlzLmlucHV0RnVuY3Rpb25Db250cm9sKCk/LmZvY3VzKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlclBvcG92ZXJDb250ZW50RXZlbnQocG9zaXRpb246IFRZUEVfUE9QT1ZFUl9ESVJFQ1RJT04pIHtcbiAgICBpZiAodGhpcy5wb3NpdGlvbkxpc3QoKSA9PT0gcG9zaXRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5wb3NpdGlvbkxpc3Quc2V0KHBvc2l0aW9uKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVyUmVtb3ZlSXRlbVNlbGVjdGVkKGV2ZW50OiBFdmVudCwgaXRlbVJlbW92ZTogdW5rbm93biwgaWdub3JlVmFsaWQ/OiBib29sZWFuKSB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5mbGFnTW91c2Uuc2V0KHsgaXNNb3VzZUVudGVyOiB0cnVlLCBpc01vdXNlRW50ZXJDb250ZW50OiB0cnVlIH0pO1xuICAgIHRoaXMudGltZU91dEZsYWcuc2V0KHNldFRpbWVvdXQoKCkgPT4gdGhpcy5mbGFnTW91c2Uuc2V0KHsgaXNNb3VzZUVudGVyOiBmYWxzZSwgaXNNb3VzZUVudGVyQ29udGVudDogZmFsc2UgfSksIDI1MCkpO1xuICAgIHRoaXMuaXRlbXNTZWxlY3RlZC51cGRhdGUoaXRlbXMgPT4gaXRlbXMuZmlsdGVyKGl0ZW0gPT4gKChpc05pbChnZXQoaXRlbVJlbW92ZSwgdGhpcy5maWVsZEtleSgpKSkgfHwgaXNOaWwoZ2V0KGl0ZW0sIHRoaXMuZmllbGRLZXkoKSkpKSAmJiBnZXQoaXRlbVJlbW92ZSwgJ2ZpZWxkTGFiZWwnKS50cmltKCkgIT09IGl0ZW0uZmllbGRMYWJlbC50cmltKCkgfHwgKCFpc05pbChnZXQoaXRlbVJlbW92ZSwgdGhpcy5maWVsZEtleSgpKSkgJiYgIWlzTmlsKGdldChpdGVtLCB0aGlzLmZpZWxkS2V5KCkpKSAmJiBnZXQoaXRlbVJlbW92ZSwgdGhpcy5maWVsZEtleSgpKSAhPT0gZ2V0KGl0ZW0sIHRoaXMuZmllbGRLZXkoKSkpKSkpO1xuICAgIHRoaXMuaXRlbUNoYW5nZVVuU2VsZWN0LnNldChpdGVtUmVtb3ZlKTtcbiAgICBpZiAoaXRlbVJlbW92ZSAmJiAhaXNOaWwoZ2V0KGl0ZW1SZW1vdmUsIHRoaXMuZmllbGRLZXkoKSkpICYmIGAke2dldChpdGVtUmVtb3ZlLCB0aGlzLmZpZWxkS2V5KCkpfWAuc2VhcmNoKHRoaXMuZmFrZUlkKCkpID49IDApIHtcbiAgICAgIHRoaXMua2V5c0hpZGRlbkl0ZW0udXBkYXRlKGl0ZW1zID0+IChbLi4uaXRlbXMgfHwgW10sIGdldChpdGVtUmVtb3ZlLCB0aGlzLmZpZWxkS2V5KCkpXSkpO1xuICAgIH1cbiAgICB0aGlzLmtleXNTZWxlY3RlZC5zZXQoQXJyYXkuZnJvbShuZXcgU2V0KHRoaXMuaXRlbXNTZWxlY3RlZCgpLm1hcChpdGVtID0+IGdldChpdGVtLCB0aGlzLmZpZWxkS2V5KCkpKSkpKTtcbiAgICB0aGlzLmRpc2FibGVXaGVuTWF4SXRlbS5zZXQoZmFsc2UpO1xuICAgIGNvbnN0IG1heEl0ZW1JbnB1dCA9IHRoaXMubWF4SXRlbUlucHV0KCk7XG4gICAgaWYgKG1heEl0ZW1JbnB1dCAmJiBtYXhJdGVtSW5wdXQgPD0gdGhpcy5pdGVtc1NlbGVjdGVkKCkubGVuZ3RoKSB7XG4gICAgICB0aGlzLmRpc2FibGVXaGVuTWF4SXRlbS5zZXQodHJ1ZSk7XG4gICAgfVxuICAgIGlmICghdGhpcy5zaG93TGlzdCgpKSB7XG4gICAgICB0aGlzLm91dFNlbGVjdE11bHRpSXRlbS5lbWl0KHRoaXMuZ2V0SXRlbVNlbGVjdGVkKCkpO1xuICAgICAgdGhpcy5jaGVja1ZpZXdDaGFuZ2UodHJ1ZSwgaWdub3JlVmFsaWQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5zaG93TGlzdCgpKSB7XG4gICAgICB0aGlzLnRlbXBJZ25vcmVFbWl0LnNldCh0cnVlKTtcbiAgICB9XG4gICAgaWYgKCFpZ25vcmVWYWxpZCkge1xuICAgICAgdGhpcy5jaGVja1ZhbGlkKCk7XG4gICAgfVxuICAgIHRoaXMudGVtcElnbm9yZUVtaXQuc2V0KGZhbHNlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVySW5wdXRGdW5jdGlvbkNvbnRyb2woZXZlbnQ6IElJbnB1dEZ1bmN0aW9uQ29udHJvbEV2ZW50KSB7XG4gICAgdGhpcy5pbnB1dEZ1bmN0aW9uQ29udHJvbC5zZXQoZXZlbnQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJGb2N1c0FuZEJsdXJFdmVudChldmVudDogSUZvY3VzQW5kQmx1ckV2ZW50KSB7XG4gICAgdGhpcy5mb2N1cy5zZXQoZmFsc2UpO1xuICAgIGlmIChldmVudC5uYW1lID09PSAnZm9jdXMnKSB7XG4gICAgICB0aGlzLmZvY3VzLnNldCh0cnVlKTtcbiAgICB9XG4gICAgaWYgKGV2ZW50Lm5hbWUgPT09ICdibHVyJyAmJiB0aGlzLnR5cGVQb3BvdmVyKCk/LmluY2x1ZGVzKCdtb3VzZWxlYXZlJykgJiYgdGhpcy52YWxpZFJlcXVpcmVkKCkgJiYgKCF0aGlzLml0ZW1zU2VsZWN0ZWQoKSB8fCAhdGhpcy5pdGVtc1NlbGVjdGVkKCkubGVuZ3RoKSkge1xuICAgICAgdGhpcy5jaGVja1ZhbGlkKCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJDbGlja091dHNpZGUoZXZlbnQ6IEV2ZW50KSB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dENsaWNrT3V0c2lkZSgpKTtcbiAgICB0aGlzLnRpbWVvdXRDbGlja091dHNpZGUuc2V0KHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuc2hvd0xpc3QoKSB8fCAhdGhpcy5yZW1vdmVUZXh0U2VhcmNoV2hlbkJsdXJJbnB1dCgpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMudmFsdWVJbnB1dC5zZXQoJycpO1xuICAgICAgdGhpcy5rZXlTZWFyY2guc2V0KCcnKTtcbiAgICAgIHRoaXMuaW5wdXRGdW5jdGlvbkNvbnRyb2woKT8ucmVzZXRWYWx1ZSgpO1xuICAgIH0sIDI1MCkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGhhbmRsZXJFbnRlckV2ZW50KCkge1xuICAgIGlmICghdGhpcy52YWx1ZUlucHV0KCkgfHwgIWAke3RoaXMudmFsdWVJbnB1dCgpfWAudHJpbSgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmNvbmZpZygpPy5pZ25vcmVFbnRlckNyZWF0ZU5ld0l0ZW0pIHtcbiAgICAgIGNvbnN0IGl0ZW1FeGl0cyA9IHRoaXMuY2hlY2tFeGl0cygpO1xuICAgICAgaWYgKCFpdGVtRXhpdHMgfHwgaXRlbUV4aXRzLmlzSXRlbVNlbGVjdGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMucHJvY2Vzc0RhdGEoW2l0ZW1FeGl0cy5pdGVtXSk7XG4gICAgICB0aGlzLmhhbmRsZXJWYWx1ZUNoYW5nZVNlYXJjaCgnJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghdGhpcy5mdW5jdGlvbkNoZWNrUGVybWlzc2lvbkNyZWF0ZVRhZygpKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaXRlbUV4aXRzID0gdGhpcy5jaGVja0V4aXRzKCk7XG4gICAgY29uc3QgdmFsdWVJbnB1dCA9IGAke3RoaXMudmFsdWVJbnB1dCgpfWAudHJpbSgpO1xuICAgIGNvbnN0IG5ld0l0ZW0gPSB7IFt0aGlzLmZpZWxkTGFiZWwoKV06IHZhbHVlSW5wdXQgfTtcbiAgICBpZiAodGhpcy5maWVsZEtleSgpKSB7XG4gICAgICBuZXdJdGVtW3RoaXMuZmllbGRLZXkoKV0gPSBgJHt0aGlzLmZha2VJZCgpfSR7dmFsdWVJbnB1dH0ke3V1aWQoKX1gO1xuICAgIH1cbiAgICBpZiAoIWl0ZW1FeGl0cykge1xuICAgICAgaWYgKHRoaXMuY2hlY2tQYXR0ZXJuKFtuZXdJdGVtXSkpIHtcbiAgICAgICAgY29uc3QgaXRlbUJ1aWxkVmFsdWUgPSB7IC4uLm5ld0l0ZW0gfTtcbiAgICAgICAgY29uc3QgYnVpbGRWYWx1ZSA9IHRoaXMuY29uZmlnKCk/LmJ1aWxkVmFsdWU7XG4gICAgICAgIGlmIChidWlsZFZhbHVlKSB7XG4gICAgICAgICAgYnVpbGRWYWx1ZShpdGVtQnVpbGRWYWx1ZSwgbmV3SXRlbVt0aGlzLmZpZWxkTGFiZWwoKV0pO1xuICAgICAgICB9XG4gICAgICAgIG5ld0l0ZW1bdGhpcy5maWVsZExhYmVsKCldID0gaXRlbUJ1aWxkVmFsdWVbdGhpcy5maWVsZExhYmVsKCldO1xuICAgICAgICBpZiAodGhpcy5lbnRlckF1dG9BZGRUYWdUb0xpc3QoKSkge1xuICAgICAgICAgIHRoaXMubGlzdEZ1bmN0aW9uQ29udHJvbCgpPy51cGRhdGVEYXRhKHsgbmV3RGF0YTogc2lnbmFsKFtzaWduYWwobmV3SXRlbSldKSwgZnVuY3Rpb25DdXN0b21BZGREYXRhVG9TdG9yZTogKG5ld0RhdGEsIHN0b3JlKSA9PiBzdG9yZS51cGRhdGUodmFsdWUgPT4gKFsuLi5uZXdEYXRhKCksIC4uLnZhbHVlXSkpIH0pXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wcm9jZXNzRGF0YShbbmV3SXRlbV0pO1xuICAgICAgICB0aGlzLmhhbmRsZXJWYWx1ZUNoYW5nZVNlYXJjaCgnJyk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChpdGVtRXhpdHMuaXNJdGVtU2VsZWN0ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5wcm9jZXNzRGF0YShbaXRlbUV4aXRzLml0ZW1dKTtcbiAgICB0aGlzLmhhbmRsZXJWYWx1ZUNoYW5nZVNlYXJjaCgnJyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlclZhbHVlQ2hhbmdlU2VhcmNoKHZhbHVlOiBzdHJpbmcgfCBudW1iZXIpIHtcbiAgICB0aGlzLnZhbHVlSW5wdXQuc2V0KGAke3ZhbHVlfWApO1xuICAgIGlmICghYCR7dmFsdWUgfHwgJyd9YC50cmltKCkpIHtcbiAgICAgIHRoaXMua2V5U2VhcmNoQ2hhbmdlU3ViKCk/LnVuc3Vic2NyaWJlKCk7XG4gICAgICB0aGlzLmtleVNlYXJjaENoYW5nZVN1Yi5zZXQodW5kZWZpbmVkKTtcbiAgICAgIHRoaXMudGltZU91dENoYW5nZVNlYXJjaC5zZXQoc2V0VGltZW91dCgoKSA9PiB0aGlzLmtleVNlYXJjaC5zZXQoJycpKSk7XG4gICAgICBpZiAoIXRoaXMuY29uZmlnKCk/Lmlnbm9yZUVudGVyQ3JlYXRlTmV3SXRlbSkge1xuICAgICAgICB0aGlzLmNoZWNrVmFsaWQoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuY29uZmlnKCk/Lmlnbm9yZUlucHV0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghdGhpcy5rZXlTZWFyY2hDaGFuZ2VTdWIoKSkge1xuICAgICAgdGhpcy5zZXRFdmVudEtleVNlYXJjaCgpO1xuICAgIH1cbiAgICB0aGlzLmtleVNlYXJjaENoYW5nZS5uZXh0KGAkeyh2YWx1ZSB8fCAnJyl9YC50cmltKCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRFdmVudEtleVNlYXJjaCgpIHtcbiAgICBpZiAodGhpcy5rZXlTZWFyY2hDaGFuZ2VTdWIoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmtleVNlYXJjaENoYW5nZVN1Yi5zZXQodGhpcy5rZXlTZWFyY2hDaGFuZ2UucGlwZShkZWJvdW5jZVRpbWUoMTUwMCksIHRha2VVbnRpbCh0aGlzLm9uRGVzdHJveSkpLnN1YnNjcmliZSh2YWx1ZSA9PiB0aGlzLmtleVNlYXJjaC5zZXQoYCR7KHZhbHVlIHx8ICcnKX1gLnRyaW0oKSkpKTtcbiAgfVxuXG4gIHByaXZhdGUgcHJvY2Vzc0RhdGEoaXRlbXM6IEFycmF5PHVua25vd24+LCBpZ25vcmVWYWxpZGF0ZSA9IGZhbHNlLCBpZ25vcmVFbWl0S2V5U2VsZWN0ZWRXaGVuSXRlbXNOb3RFeGl0c0VtcHR5PzogYm9vbGVhbikge1xuICAgIGlmICghaXRlbXMgfHwgIWl0ZW1zLmxlbmd0aCkge1xuICAgICAgY29uc3QgaXRlbXNTZWxlY3RlZCA9IHRoaXMuZ2V0SXRlbVNlbGVjdGVkKCk7XG4gICAgICBpZiAoIWlnbm9yZUVtaXRLZXlTZWxlY3RlZFdoZW5JdGVtc05vdEV4aXRzRW1wdHkpIHtcbiAgICAgICAgdGhpcy5vdXRTZWxlY3RNdWx0aUl0ZW0uZW1pdChpdGVtc1NlbGVjdGVkKTtcbiAgICAgIH1cbiAgICAgIHRoaXMua2V5c1NlbGVjdGVkLnNldChBcnJheS5mcm9tKG5ldyBTZXQoaXRlbXNTZWxlY3RlZD8ubWFwKGl0ZW0gPT4gZ2V0KGl0ZW0sIHRoaXMuZmllbGRLZXkoKSkpKSkpO1xuICAgICAgdGhpcy5jaGVja1ZpZXdDaGFuZ2UoZmFsc2UsIGlnbm9yZVZhbGlkYXRlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaXRlbXNNYXBwaW5nID0gaXRlbXMubWFwKGl0ZW0gPT4ge1xuICAgICAgY29uc3QgcmVmID0gZ2V0KGl0ZW0sICdyZWYnKSB8fCBpdGVtO1xuICAgICAgaXRlbSA9IGNsb25lRGVlcChyZWYpO1xuICAgICAgc2V0KGl0ZW0sICdyZWYnLCByZWYpO1xuICAgICAgdGhpcy51cGRhdGVGaWVsZExhYmVsKGl0ZW0pO1xuICAgICAgY29uc3QgZ2V0RGlzYWJsZUl0ZW0gPSB0aGlzLmNvbmZpZygpPy5nZXREaXNhYmxlSXRlbTtcbiAgICAgIGNvbnN0IGdldFN0eWxlcyA9IHRoaXMuY29uZmlnKCk/LmdldFN0eWxlcztcbiAgICAgIGNvbnN0IGdldFN0eWxlc1RhZ1NwZWNpZmljID0gdGhpcy5jb25maWcoKT8uZ2V0U3R5bGVzVGFnU3BlY2lmaWM7XG4gICAgICBpZiAoZ2V0RGlzYWJsZUl0ZW0pIHtcbiAgICAgICAgc2V0KGl0ZW0sICdkaXNhYmxlSXRlbScsIGdldERpc2FibGVJdGVtKGl0ZW0pKTtcbiAgICAgIH1cbiAgICAgIGlmIChnZXRTdHlsZXMpIHtcbiAgICAgICAgc2V0KGl0ZW0sICduZ1N0eWxlcycsIGdldFN0eWxlcyhpdGVtKSk7XG4gICAgICB9XG4gICAgICBpZiAoZ2V0U3R5bGVzVGFnU3BlY2lmaWMpIHtcbiAgICAgICAgY29uc3QgdHlwZSA9IGdldFN0eWxlc1RhZ1NwZWNpZmljKGl0ZW0pO1xuICAgICAgICBpZiAodHlwZSA9PT0gJ3NwZWNpZmljX3Zpb2xldF9jb2xvcicpIHtcbiAgICAgICAgICBzZXQoaXRlbSwgJ25nU3R5bGVzJywgeyBjb2xvcjogJyM3MjM5RUEnLCBiYWNrZ3JvdW5kQ29sb3I6ICcjRjFFQkZEJyB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGl0ZW07XG4gICAgfSk7XG4gICAgdGhpcy5pdGVtc1NlbGVjdGVkLnVwZGF0ZShpdGVtcyA9PiBbLi4uaXRlbXMsIC4uLml0ZW1zTWFwcGluZ10pO1xuICAgIHRoaXMua2V5c1NlbGVjdGVkLnNldChBcnJheS5mcm9tKG5ldyBTZXQodGhpcy5pdGVtc1NlbGVjdGVkKCkubWFwKGl0ZW0gPT4gZ2V0KGl0ZW0sIHRoaXMuZmllbGRLZXkoKSkpKSkpO1xuICAgIHRoaXMub3V0U2VsZWN0TXVsdGlJdGVtLmVtaXQodGhpcy5nZXRJdGVtU2VsZWN0ZWQoKSk7XG4gICAgdGhpcy5jaGVja1ZpZXdDaGFuZ2UoZmFsc2UsIGlnbm9yZVZhbGlkYXRlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyRGF0YUNoYW5nZShpdGVtczogQXJyYXk8dW5rbm93bj4pIHtcbiAgICB0aGlzLml0ZW1zT2ZMaXN0LnNldChpdGVtcyk7XG4gICAgdGhpcy5wb3BvdmVyRnVuY3Rpb25Db250cm9sKCk/LnVwZGF0ZVBvcG92ZXJPdmVybGF5UG9zaXRpb24oKTtcbiAgICBpZiAoIXRoaXMuY29uZmlnKCk/Lmlnbm9yZUlucHV0KSB7XG4gICAgICB0aGlzLmlucHV0RnVuY3Rpb25Db250cm9sKCk/LmZvY3VzKCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJMb2FkaW5nKGV2ZW50OiBib29sZWFuKSB7XG4gICAgdGhpcy5sb2FkaW5nLnNldChldmVudCk7XG4gIH1cblxuICBwcml2YXRlIGNoZWNrVmlld0NoYW5nZShpZ25vcmVTY3JvbGxCb3R0b206IGJvb2xlYW4sIGlnbm9yZVZhbGlkYXRlID0gZmFsc2UpIHtcbiAgICB0aGlzLmRpc2FibGVXaGVuTWF4SXRlbS5zZXQoZmFsc2UpO1xuICAgIGNvbnN0IG1heEl0ZW1JbnB1dCA9IHRoaXMubWF4SXRlbUlucHV0KCk7XG4gICAgaWYgKG1heEl0ZW1JbnB1dCAmJiBtYXhJdGVtSW5wdXQgPD0gdGhpcy5pdGVtc1NlbGVjdGVkKCkubGVuZ3RoKSB7XG4gICAgICB0aGlzLmRpc2FibGVXaGVuTWF4SXRlbS5zZXQodHJ1ZSk7XG4gICAgfVxuICAgIHRoaXMudGltZU91dENoZWNrVmlld0NoYW5nZS5zZXQoKHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY29uc3Qgc2Nyb2xsSGVpZ2h0ID0gdGhpcy50YWdzRWwoKT8ubmF0aXZlRWxlbWVudC5zY3JvbGxIZWlnaHQ7XG4gICAgICBpZiAoIWlzTmlsKHNjcm9sbEhlaWdodCkgJiYgdGhpcy5jbGllbnRIZWlnaHQoKSAhPT0gc2Nyb2xsSGVpZ2h0ICYmIHRoaXMucG9zaXRpb25MaXN0KCkgIT09ICd0b3AnKSB7XG4gICAgICAgIHRoaXMucG9wb3ZlckZ1bmN0aW9uQ29udHJvbCgpPy51cGRhdGVQb3BvdmVyT3ZlcmxheVBvc2l0aW9uKCk7XG4gICAgICB9XG4gICAgICBpZiAoIWlnbm9yZVNjcm9sbEJvdHRvbSAmJiB0aGlzLnRhZ3NFbCgpICYmIHRoaXMudGFnc0VsKCkubmF0aXZlRWxlbWVudCkge1xuICAgICAgICB0aGlzLnRhZ3NFbCgpLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wID0gc2Nyb2xsSGVpZ2h0XG4gICAgICB9XG4gICAgICB0aGlzLmNsaWVudEhlaWdodC5zZXQoc2Nyb2xsSGVpZ2h0KTtcbiAgICB9LCAyNTApKSk7XG4gICAgaWYgKCFpZ25vcmVWYWxpZGF0ZSkge1xuICAgICAgdGhpcy5jaGVja1ZhbGlkKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjaGVja0V4aXRzKGxhYmVsPzogc3RyaW5nLCBpZD86IHN0cmluZykge1xuICAgIGxldCBpdGVtRXhpdHM7XG4gICAgaWYgKCFpc05pbChpZCkgJiYgIWAke2lkfWAuaW5jbHVkZXModGhpcy5mYWtlSWQoKSkgJiYgdGhpcy5maWVsZEtleSgpKSB7XG4gICAgICBpdGVtRXhpdHMgPSB0aGlzLml0ZW1zU2VsZWN0ZWQoKS5maW5kKGl0ZW0gPT4gIWlzTmlsKGdldChpdGVtLCB0aGlzLmZpZWxkS2V5KCkpKSAmJiBgJHtnZXQoaXRlbSwgdGhpcy5maWVsZEtleSgpKX1gLnRyaW0oKSA9PT0gYCR7aWR9YCk7XG4gICAgICBpZiAoaXRlbUV4aXRzKSB7XG4gICAgICAgIHJldHVybiB7IGl0ZW06IGl0ZW1FeGl0cywgaXNJdGVtU2VsZWN0ZWQ6ICEhaXRlbUV4aXRzIH07XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghbGFiZWwpIHtcbiAgICAgIGxhYmVsID0gYCR7KHRoaXMudmFsdWVJbnB1dCB8fCAnJyl9YC50cmltKCk7XG4gICAgfVxuICAgIGl0ZW1FeGl0cyA9IHRoaXMuaXRlbXNTZWxlY3RlZCgpLmZpbmQoaXRlbSA9PiAhaXNOaWwoZ2V0KGl0ZW0sICdmaWVsZExhYmVsJykpICYmIChnZXQoaXRlbSwgJ2ZpZWxkTGFiZWwnKS50cmltKCkgPT09IGxhYmVsPy50cmltKCkpIHx8ICh0aGlzLmNoZWNrRXhpdElzTGFiZWxJbmNsdWRlKCkgJiYgZ2V0KGl0ZW0sICdmaWVsZExhYmVsJykudHJpbSgpLmluY2x1ZGVzKGxhYmVsPy50cmltKCkpKSB8fCAodGhpcy5jaGVja0V4aXRCeUZpZWxkcygpICYmIHRoaXMuY2hlY2tFeGl0QnlGaWVsZHMoKT8uc29tZShmaWVsZCA9PiBnZXQoaXRlbSwgZmllbGQpPy50cmltKCkgPT09IGxhYmVsPy50cmltKCkgfHwgZ2V0KGl0ZW0sIGZpZWxkKT8udHJpbSgpID09PSBlc2NhcGVIdG1sKGxhYmVsPy50cmltKCkgfHwgJycpIHx8IGVzY2FwZUh0bWwoZ2V0KGl0ZW0sIGZpZWxkKT8udHJpbSgpIHx8ICcgJykgPT09IGVzY2FwZUh0bWwobGFiZWw/LnRyaW0oKSB8fCAnJykpKSk7XG4gICAgaWYgKGl0ZW1FeGl0cykge1xuICAgICAgcmV0dXJuIHsgaXRlbTogaXRlbUV4aXRzLCBpc0l0ZW1TZWxlY3RlZDogdHJ1ZSB9O1xuICAgIH1cbiAgICBpdGVtRXhpdHMgPSB0aGlzLml0ZW1zT2ZMaXN0KCkuZmluZChpdGVtID0+ICFpc05pbChnZXQoaXRlbSwgJ2ZpZWxkTGFiZWwnKSkgJiYgKGdldChpdGVtLCAnZmllbGRMYWJlbCcpLnRyaW0oKS5pbmNsdWRlcygpID09PSBsYWJlbD8udHJpbSgpKSB8fCAodGhpcy5jaGVja0V4aXRJc0xhYmVsSW5jbHVkZSgpICYmIGdldChpdGVtLCAnZmllbGRMYWJlbCcpLnRyaW0oKS5pbmNsdWRlcyhsYWJlbD8udHJpbSgpKSkgfHwgKHRoaXMuY2hlY2tFeGl0QnlGaWVsZHMoKSAmJiB0aGlzLmNoZWNrRXhpdEJ5RmllbGRzKCk/LnNvbWUoZmllbGQgPT4gZ2V0KGl0ZW0sIGZpZWxkKT8udHJpbSgpID09PSBsYWJlbD8udHJpbSgpIHx8IGVzY2FwZUh0bWwoZ2V0KGl0ZW0sIGZpZWxkKT8udHJpbSgpIHx8ICcgJykgPT09IGVzY2FwZUh0bWwobGFiZWw/LnRyaW0oKSB8fCAnJykgfHwgZ2V0KGl0ZW0sIGZpZWxkKT8udHJpbSgpID09PSBlc2NhcGVIdG1sKGxhYmVsPy50cmltKCkgfHwgJycpKSkpO1xuICAgIGlmIChpdGVtRXhpdHMpIHtcbiAgICAgIHJldHVybiB7IGl0ZW06IGl0ZW1FeGl0cywgaXNJdGVtU2VsZWN0ZWQ6IGZhbHNlIH07XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyU2VsZWN0ZWRLZXkoZXZlbnQ6IElMaXN0RGF0YUVtaXRLZXkgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAoIWV2ZW50IHx8ICFldmVudC5pdGVtKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghaXNOaWwoZXZlbnQ/LmtleSkpIHtcbiAgICAgIHRoaXMucG9wb3ZlckZ1bmN0aW9uQ29udHJvbCgpPy5yZW1vdmVQb3BvdmVyT3ZlcmxheSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5pdGVtc1NlbGVjdGVkKClbMF0pIHtcbiAgICAgIHRoaXMudGVtcElnbm9yZUVtaXQuc2V0KHRydWUpO1xuICAgICAgdGhpcy5oYW5kbGVyUmVtb3ZlSXRlbVNlbGVjdGVkKHsgc3RvcFByb3BhZ2F0aW9uOiAoKSA9PiB7IHJldHVybiB9IH0gYXMgRXZlbnQsIHRoaXMuaXRlbXNTZWxlY3RlZCgpWzBdLCB0aGlzLml0ZW1zU2VsZWN0ZWQoKVswXS5kaXNhYmxlSXRlbSk7XG4gICAgICB0aGlzLnRlbXBJZ25vcmVFbWl0LnNldChmYWxzZSk7XG4gICAgfVxuICAgIHRoaXMudXBkYXRlSXRlbXNTZWxlY3RlZChbZXZlbnQuaXRlbV0sICEhdGhpcy5pdGVtc1NlbGVjdGVkKClbMF0pOyAvLyBCdWcgIzM2MDc1XG4gIH1cblxuICBwcml2YXRlIGdldEZsYWdFbWl0U2VsZWN0ZWRJdGVtKGtleXM6IEFycmF5PHVua25vd24+KSB7XG4gICAgaWYgKCF0aGlzLmlnbm9yZUVtaXRXaGVuU2FtZURhdGFTZWxlY3RlZCgpIHx8IGtleXMubGVuZ3RoICE9PSB0aGlzLml0ZW1zU2VsZWN0ZWQoKS5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgaWYgKCF0aGlzLml0ZW1zU2VsZWN0ZWQoKS5zb21lKGl0ZW0gPT4gZ2V0KGl0ZW0sIHRoaXMuZmllbGRLZXkoKSkgPT09IGtleSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVyU2VsZWN0TXVsdGlLZXkoZXZlbnQ6IElMaXN0RGF0YUVtaXRNdWx0aUtleSB8IHVuZGVmaW5lZCkge1xuICAgIGlmICghZXZlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qga2V5cyA9IFtdO1xuICAgIGNvbnN0IGl0ZW1zOiBBcnJheTx1bmtub3duPiA9IFtdO1xuICAgIGlmIChldmVudC5rZXlzICYmIGV2ZW50LmtleXMubGVuZ3RoICYmICghZXZlbnQubWFwS2V5cyB8fCAhZXZlbnQubWFwS2V5cy5sZW5ndGgpKSB7XG4gICAgICBrZXlzLnB1c2goLi4uZXZlbnQua2V5cyk7XG4gICAgfVxuICAgIGNvbnN0IGlnbm9yZUVtaXRLZXlTZWxlY3RlZFdoZW5JdGVtc05vdEV4aXRzRW1wdHkgPSB0aGlzLmdldEZsYWdFbWl0U2VsZWN0ZWRJdGVtKGNsb25lRGVlcChldmVudC5rZXlzID8/IFtdKSk7XG4gICAgZXZlbnQubWFwS2V5cy5mb3JFYWNoKG1hcEtleSA9PiB7XG4gICAgICBpZiAoaXNOaWwobWFwS2V5LmtleSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKG1hcEtleS5pdGVtKSB7XG4gICAgICAgIHJldHVybiBpdGVtcy5wdXNoKG1hcEtleS5pdGVtKTtcbiAgICAgIH1cbiAgICAgIGlmICghQXJyYXkuaXNBcnJheSh0aGlzLml0ZW1zU2VsZWN0ZWQpKSB7XG4gICAgICAgIHJldHVybiBrZXlzLnB1c2gobWFwS2V5LmtleSk7XG4gICAgICB9XG4gICAgICBjb25zdCBpdGVtID0gdGhpcy5pdGVtc1NlbGVjdGVkLmZpbmQoaXRlbSA9PiBnZXQoaXRlbSwgdGhpcy5maWVsZEtleSgpKSA9PT0gbWFwS2V5LmtleSk7XG4gICAgICBpZiAoaXRlbSkge1xuICAgICAgICByZXR1cm4gaXRlbXMucHVzaChpdGVtKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBrZXlzLnB1c2gobWFwS2V5LmtleSk7XG4gICAgfSk7XG4gICAgaWYgKGtleXMubGVuZ3RoKSB7XG4gICAgICBjb25zdCByZXN1bHREYXRhOiBBcnJheTx1bmtub3duPiA9IGF3YWl0IHRoaXMuZ2V0RGV0YWlsQnlJZHMoa2V5cywgdHJ1ZSk7XG4gICAgICBpdGVtcy5wdXNoKC4uLnJlc3VsdERhdGEpO1xuICAgIH1cbiAgICBjb25zdCBtZXNzYWdlRW1wdHkgPSB0aGlzLnZhbGlkUmVxdWlyZWQoKT8ubWVzc2FnZSB8fCBFUlJPUl9NRVNTQUdFX0VNUFRZX1ZBTElEO1xuICAgIGxldCBpZ25vcmVWYWxpZGF0ZSA9IHRydWU7XG4gICAgaWYgKG1lc3NhZ2VFbXB0eSA9PT0gdGhpcy5lcnJvcigpPy5tZXNzYWdlKSB7XG4gICAgICBpZ25vcmVWYWxpZGF0ZSA9IGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBpdGVtUmVtb3ZlID0gdGhpcy5pdGVtc1NlbGVjdGVkKCkuZmluZChpdGVtU2VsZWN0ZWQgPT4gZ2V0KGl0ZW1TZWxlY3RlZCwgdGhpcy5maWVsZEtleSgpKSAmJiAhKGl0ZW1zLnNvbWUoaXRlbSA9PiBnZXQoaXRlbVNlbGVjdGVkLCB0aGlzLmZpZWxkS2V5KCkpID09PSBnZXQoaXRlbSwgdGhpcy5maWVsZEtleSgpKSkpKTtcbiAgICB0aGlzLml0ZW1zU2VsZWN0ZWQudXBkYXRlKGl0ZW1zU2VsZWN0ZWQgPT4gaXRlbXNTZWxlY3RlZC5maWx0ZXIoaXRlbVNlbGVjdGVkID0+ICFnZXQoaXRlbVNlbGVjdGVkLCB0aGlzLmZpZWxkS2V5KCkpIHx8IChldmVudC5rZXlzLmxlbmd0aCAmJiBpdGVtcy5zb21lKGl0ZW0gPT4gZ2V0KGl0ZW1TZWxlY3RlZCwgdGhpcy5maWVsZEtleSgpKSA9PT0gZ2V0KGl0ZW0sIHRoaXMuZmllbGRLZXkoKSkpKSkpO1xuICAgIGlmIChpdGVtUmVtb3ZlKSB7XG4gICAgICBpZiAodGhpcy5lbnRlckF1dG9BZGRUYWdUb0xpc3QoKSAmJiAhaXNOaWwoZ2V0KGl0ZW1SZW1vdmUsIHRoaXMuZmllbGRLZXkoKSkpICYmIGAke2dldChpdGVtUmVtb3ZlLCB0aGlzLmZpZWxkS2V5KCkpfWAuc2VhcmNoKHRoaXMuZmFrZUlkKCkpID49IDApIHtcbiAgICAgICAgdGhpcy5rZXlzSGlkZGVuSXRlbS51cGRhdGUoaXRlbXMgPT4gWy4uLihpdGVtcyB8fCBbXSksIGdldChpdGVtUmVtb3ZlLCB0aGlzLmZpZWxkS2V5KCkpXSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghZXZlbnQua2V5cy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuY2hlY2tWYWxpZCgpO1xuICAgICAgdGhpcy5rZXlzU2VsZWN0ZWQuc2V0KEFycmF5LmZyb20obmV3IFNldCh0aGlzLml0ZW1zU2VsZWN0ZWQoKT8ubWFwKGl0ZW0gPT4gZ2V0KGl0ZW0sIHRoaXMuZmllbGRLZXkoKSkpKSkpO1xuICAgICAgdGhpcy5vdXRTZWxlY3RNdWx0aUl0ZW0uZW1pdCh0aGlzLmdldEl0ZW1TZWxlY3RlZCgpKTtcbiAgICAgIHRoaXMuY2hlY2tWaWV3Q2hhbmdlKGZhbHNlLCBpZ25vcmVWYWxpZGF0ZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMudXBkYXRlSXRlbXNTZWxlY3RlZChpdGVtcywgaWdub3JlVmFsaWRhdGUsIGlnbm9yZUVtaXRLZXlTZWxlY3RlZFdoZW5JdGVtc05vdEV4aXRzRW1wdHkpO1xuICAgIHRoaXMuY2hlY2tWYWxpZCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZXREZXRhaWxCeUlkcyhrZXlzOiBBcnJheTx1bmtub3duPiwgaXNSZXNwb25zZURhdGE/OiBib29sZWFuKTogUHJvbWlzZTxBcnJheTx1bmtub3duPj4ge1xuICAgIGNvbnN0IGh0dHBSZXF1ZXN0RGV0YWlsSXRlbUJ5SWRzID0gdGhpcy5odHRwUmVxdWVzdERldGFpbEl0ZW1CeUlkcygpO1xuICAgIGlmICghaHR0cFJlcXVlc3REZXRhaWxJdGVtQnlJZHMgfHwgdGhpcy5sb2FkaW5nRGV0YWlsKCkgfHwgIShrZXlzIGluc3RhbmNlb2YgQXJyYXkpIHx8ICFrZXlzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZUxvYWRpbmdEZXRhaWwodHJ1ZSk7XG4gICAgY29uc3QgY2xvbmVIdHRwRGV0YWlsQ29uZmlnID0gY2xvbmVEZWVwKGh0dHBSZXF1ZXN0RGV0YWlsSXRlbUJ5SWRzKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBhcmd1bWVudHNWYWx1ZSwgZ3VpZGVBdXRvVXBkYXRlQXJndW1lbnRzVmFsdWUgfSA9IGNsb25lSHR0cERldGFpbENvbmZpZztcbiAgICAgIGlmICghZ3VpZGVBdXRvVXBkYXRlQXJndW1lbnRzVmFsdWUgfHwgIWd1aWRlQXV0b1VwZGF0ZUFyZ3VtZW50c1ZhbHVlLmRldGFpbEJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgZ3VpZGVBdXRvVXBkYXRlQXJndW1lbnRzVmFsdWUuZGV0YWlsQnlJZC5maWVsZEdldFZhbHVlID0gJ2tleXMnO1xuICAgICAgdGhpcy5odHRwUmVxdWVzdFNlcnZpY2UudXBkYXRlQXJndW1lbnRzKGFyZ3VtZW50c1ZhbHVlLCB7IGtleXM6IGtleXMgfSwge30sICcnLCBmYWxzZSwgZmFsc2UsIGd1aWRlQXV0b1VwZGF0ZUFyZ3VtZW50c1ZhbHVlKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IChhd2FpdCB0aGlzLmh0dHBSZXF1ZXN0U2VydmljZS5jYWxsQXBpKGNsb25lSHR0cERldGFpbENvbmZpZykpIGFzIElIdHRwUmVzcG9uc2U8QXJyYXk8dW5rbm93bj4+O1xuICAgICAgaWYgKCFpc1Jlc3BvbnNlRGF0YSkge1xuICAgICAgICB0aGlzLnVwZGF0ZUl0ZW1zU2VsZWN0ZWQocmVzdWx0LmRhdGEgfHwgW10pO1xuICAgICAgICB0aGlzLnVwZGF0ZUxvYWRpbmdEZXRhaWwoZmFsc2UpO1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICB0aGlzLnVwZGF0ZUxvYWRpbmdEZXRhaWwoZmFsc2UpO1xuICAgICAgcmV0dXJuIHJlc3VsdC5kYXRhIHx8IFtdO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmxvZyhlcnJvcik7XG4gICAgICB0aGlzLnVwZGF0ZUxvYWRpbmdEZXRhaWwoZmFsc2UpO1xuICAgIH1cbiAgICByZXR1cm4gW107XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNoZWNrVmFsaWQoKSB7XG4gICAgY29uc3QgdmFsaWQgPSB0aGlzLml0ZW1zU2VsZWN0ZWQoKSAmJiB0aGlzLml0ZW1zU2VsZWN0ZWQoKS5sZW5ndGggPyB0cnVlIDogZmFsc2U7XG4gICAgY29uc3Qgc3RhdGVFcnJvciA9ICEhdGhpcy5lcnJvcigpO1xuICAgIHRoaXMuZXJyb3Iuc2V0KHVuZGVmaW5lZCk7XG4gICAgaWYgKHRoaXMudmFsaWRSZXF1aXJlZCgpICYmICF2YWxpZCkge1xuICAgICAgdGhpcy5lcnJvci5zZXQoeyAuLi50aGlzLnZhbGlkUmVxdWlyZWQoKSwgbWVzc2FnZTogdGhpcy52YWxpZFJlcXVpcmVkKCk/Lm1lc3NhZ2UgfHwgRVJST1JfTUVTU0FHRV9FTVBUWV9WQUxJRCB9KTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmVycm9yKCkpIHtcbiAgICAgIHRoaXMuY2hlY2tQYXR0ZXJuKHRoaXMuaXRlbXNTZWxlY3RlZCgpKTtcbiAgICAgIHRoaXMuY2hlY2tNYXhJdGVtU2VsZWN0ZWRWYWxpZCgpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMudGVtcElnbm9yZUVtaXQoKSkge1xuICAgICAgdGhpcy5vdXRWYWxpZEV2ZW50LmVtaXQoIXRoaXMuZXJyb3IoKSk7XG4gICAgfVxuICAgIGlmIChzdGF0ZUVycm9yICE9PSAhIXRoaXMuZXJyb3IoKSkge1xuICAgICAgdGhpcy5wb3BvdmVyRnVuY3Rpb25Db250cm9sKCk/LnVwZGF0ZVBvcG92ZXJPdmVybGF5UG9zaXRpb24oKTtcbiAgICB9XG4gICAgcmV0dXJuICF0aGlzLmVycm9yKCk7XG4gIH1cblxuICBwcml2YXRlIGNoZWNrTWF4SXRlbVNlbGVjdGVkVmFsaWQoKSB7XG4gICAgY29uc3QgdmFsaWRNYXhJdGVtU2VsZWN0ZWQgPSB0aGlzLnZhbGlkTWF4SXRlbVNlbGVjdGVkKCk7XG4gICAgaWYgKHZhbGlkTWF4SXRlbVNlbGVjdGVkICYmIHRoaXMuaXRlbXNTZWxlY3RlZCgpLmxlbmd0aCA+IHZhbGlkTWF4SXRlbVNlbGVjdGVkLnZhbHVlKSB7XG4gICAgICB0aGlzLmVycm9yLnNldCh7IC4uLnZhbGlkTWF4SXRlbVNlbGVjdGVkLCBtZXNzYWdlOiB2YWxpZE1heEl0ZW1TZWxlY3RlZC5tZXNzYWdlIHx8IEVSUk9SX01FU1NBR0VfTUFYX1ZBTElELCBpbnRlcnBvbGF0ZVBhcmFtczogeyB2YWx1ZTogdmFsaWRNYXhJdGVtU2VsZWN0ZWQudmFsdWUgfSB9KTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwcml2YXRlIGNoZWNrUGF0dGVybihpdGVtczogQXJyYXk8dW5rbm93bj4pOiBib29sZWFuIHtcbiAgICBjb25zdCB2YWxpZFBhdHRlcm4gPSB0aGlzLnZhbGlkUGF0dGVybigpO1xuICAgIGlmICghdmFsaWRQYXR0ZXJuIHx8ICF2YWxpZFBhdHRlcm4ubGVuZ3RoIHx8ICFpdGVtcyB8fCAhaXRlbXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgZm9yIChjb25zdCB2YWxpZCBvZiB2YWxpZFBhdHRlcm4pIHtcbiAgICAgIGlmICh2YWxpZC5wYXR0ZXJuICYmIGl0ZW1zLnNvbWUoaXRlbSA9PiAhdmFsaWQucGF0dGVybi50ZXN0KGdldChpdGVtLCB0aGlzLmZpZWxkTGFiZWwoKSkpKSkge1xuICAgICAgICB0aGlzLmVycm9yLnNldCh7IC4uLnZhbGlkLCBtZXNzYWdlOiB2YWxpZC5tZXNzYWdlIHx8IEVSUk9SX01FU1NBR0VfUEFUVEVOX1ZBTElEIH0pO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJDbGlja0J1dHRvbk90aGVyKGV2ZW50OiBJQnV0dG9uKSB7XG4gICAgdGhpcy5vdXRDbGlja0J1dHRvbk90aGVyLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRJdGVtU2VsZWN0ZWQoKTogQXJyYXk8dW5rbm93bj4ge1xuICAgIHJldHVybiB0aGlzLml0ZW1zU2VsZWN0ZWQoKS5tYXAoaXRlbSA9PiB7XG4gICAgICBjb25zdCBpdGVtTWFwID0geyAuLi5pdGVtIH07XG4gICAgICBpZiAoIWlzTmlsKGdldChpdGVtTWFwLCB0aGlzLmZpZWxkS2V5KCkpKSAmJiBgJHtnZXQoaXRlbU1hcCwgdGhpcy5maWVsZEtleSgpKX1gLnNlYXJjaCh0aGlzLmZha2VJZCgpKSA9PT0gMCkge1xuICAgICAgICBzZXQoaXRlbU1hcCwgdGhpcy5maWVsZEtleSgpLCAnJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gaXRlbU1hcDtcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyByZXNldFRvRGVmYXVsdERhdGFTZWxlY3RlZChpdGVtU2VsZWN0ZWQ/OiBBcnJheTx1bmtub3duPikge1xuICAgIGlmIChpdGVtU2VsZWN0ZWQgJiYgQXJyYXkuaXNBcnJheShpdGVtU2VsZWN0ZWQpKSB7XG4gICAgICB0aGlzLml0ZW1zU2VsZWN0ZWQuc2V0KFtdKTtcbiAgICAgIHRoaXMudXBkYXRlSXRlbXNTZWxlY3RlZChpdGVtU2VsZWN0ZWQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpdGVtU2VsZWN0ZWQgPSBuZXcgQXJyYXk8dW5rbm93bj4oKTtcbiAgICBpZiAoIXRoaXMuZmllbGRLZXkoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBkZWZhdWx0S2V5c1NlbGVjdGVkID0gdGhpcy5kZWZhdWx0S2V5c1NlbGVjdGVkKCk7XG4gICAgaWYgKGRlZmF1bHRLZXlzU2VsZWN0ZWQgJiYgQXJyYXkuaXNBcnJheShkZWZhdWx0S2V5c1NlbGVjdGVkKSkge1xuICAgICAgdGhpcy5pdGVtc1NlbGVjdGVkLnNldChbXSk7XG4gICAgICB0aGlzLmdldERldGFpbEJ5SWRzKGRlZmF1bHRLZXlzU2VsZWN0ZWQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBkZWZhdWx0SXRlbXNTZWxlY3RlZCA9IHRoaXMuZGVmYXVsdEl0ZW1zU2VsZWN0ZWQoKTtcbiAgICBpZiAoZGVmYXVsdEl0ZW1zU2VsZWN0ZWQgJiYgQXJyYXkuaXNBcnJheShkZWZhdWx0SXRlbXNTZWxlY3RlZCkpIHtcbiAgICAgIHRoaXMuaXRlbXNTZWxlY3RlZC5zZXQoW10pO1xuICAgICAgdGhpcy51cGRhdGVJdGVtc1NlbGVjdGVkKGRlZmF1bHRJdGVtc1NlbGVjdGVkKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckZ1bmN0aW9uQ29udHJvbExpc3QoZXZlbnQ6IElMaXN0RnVuY3Rpb25Db250cm9sRXZlbnQpIHtcbiAgICB0aGlzLmxpc3RGdW5jdGlvbkNvbnRyb2wuc2V0KGV2ZW50KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBmb2N1c0lucHV0KCkge1xuICAgIHRoaXMuaW5wdXRGdW5jdGlvbkNvbnRyb2woKT8uZm9jdXMoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyQ2hhbmdlRmxhZ01vdXNlKGV2ZW50OiBJRmxhZ01vdXNlKSB7XG4gICAgdGhpcy5vdXRDaGFuZ1N0YWdlRmxhZ01vdXNlLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJDaGFuZ1N0YWdlRmxhZ01vdXNlKGZsYWc6IElGbGFnTW91c2UpIHtcbiAgICB0aGlzLmZsYWdNb3VzZS5zZXQoZmxhZyk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlc2V0RXJyb3IoKSB7XG4gICAgdGhpcy5lcnJvci5zZXQodW5kZWZpbmVkKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlTG9hZGluZ0RldGFpbChldmVudDogYm9vbGVhbikge1xuICAgIHRoaXMubG9hZGluZ0RldGFpbC5zZXQoZXZlbnQpO1xuICAgIHRoaXMub3V0TG9hZGluZ0dldERldGFpbFNlbGVjdGVkLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB1cGRhdGVJdGVtU2VsZWN0ZWREaXNhYmxlKCkge1xuICAgIGNvbnN0IGdldERpc2FibGVJdGVtID0gdGhpcy5jb25maWcoKT8uZ2V0RGlzYWJsZUl0ZW07XG4gICAgaWYgKCFnZXREaXNhYmxlSXRlbSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLml0ZW1zU2VsZWN0ZWQudXBkYXRlKGl0ZW1zU2VsZWN0ZWQgPT4gaXRlbXNTZWxlY3RlZC5tYXAoaXRlbSA9PiAoeyAuLi5pdGVtLCBkaXNhYmxlSXRlbTogZ2V0RGlzYWJsZUl0ZW0oaXRlbSkgfSkpKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVmcmVzaExpc3REYXRhKCkge1xuICAgIHRoaXMubGlzdEZ1bmN0aW9uQ29udHJvbCgpPy5yZWZyZXNoKCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLm9uRGVzdHJveS5uZXh0KCk7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZU91dEZsYWcoKSk7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZU91dENoYW5nZVNlYXJjaCgpKTtcbiAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lT3V0Q2hlY2tWaWV3Q2hhbmdlKCkpO1xuICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXRDbGlja091dHNpZGUoKSk7XG4gIH1cblxufVxuIiwiPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgdy1mdWxsIGgtZnVsbFwiPlxuICBAaWYgKGxhYmVsQ29uZmlnKCk7IGFzIGxhYmVsQ29uZmlnKSB7XG4gICAgPGxpYnNfdWktY29tcG9uZW50cy1sYWJlbCBbY2xhc3NJbmNsdWRlXT1cImxhYmVsQ29uZmlnLmNsYXNzSW5jbHVkZVwiXG4gICAgICBbbGFiZWxMZWZ0XT1cImxhYmVsQ29uZmlnLmxhYmVsTGVmdFwiXG4gICAgICBbbGFiZWxMZWZ0Q2xhc3NdPVwibGFiZWxDb25maWcubGFiZWxMZWZ0Q2xhc3NcIlxuICAgICAgW3JlcXVpcmVkXT1cImxhYmVsQ29uZmlnLnJlcXVpcmVkXCJcbiAgICAgIFtkZXNjcmlwdGlvbl09XCJsYWJlbENvbmZpZy5kZXNjcmlwdGlvblwiXG4gICAgICBbZGVzY3JpcHRpb25DbGFzc109XCJsYWJlbENvbmZpZy5kZXNjcmlwdGlvbkNsYXNzXCJcbiAgICAgIFtsYWJlbFJpZ2h0XT1cImxhYmVsQ29uZmlnLmxhYmVsUmlnaHRcIlxuICAgICAgW2xhYmVsUmlnaHRDbGFzc109XCJsYWJlbENvbmZpZy5sYWJlbFJpZ2h0Q2xhc3NcIlxuICAgICAgW29ubHlTaG93Q291bnRdPVwibGFiZWxDb25maWcub25seVNob3dDb3VudFwiXG4gICAgICBbYnV0dG9uc0xlZnRdPVwibGFiZWxDb25maWcuYnV0dG9uc0xlZnRcIlxuICAgICAgW2J1dHRvbnNSaWdodF09XCJsYWJlbENvbmZpZy5idXR0b25zUmlnaHRcIlxuICAgICAgW2Rpc2FibGVCdXR0b25zTGVmdF09XCJsYWJlbENvbmZpZy5kaXNhYmxlQnV0dG9uc0xlZnQgfHwgZGlzYWJsZSgpIHx8IGxvYWRpbmcoKSB8fCBsb2FkaW5nRGV0YWlsKClcIlxuICAgICAgW2Rpc2FibGVCdXR0b25zUmlnaHRdPVwibGFiZWxDb25maWcuZGlzYWJsZUJ1dHRvbnNSaWdodCB8fCBkaXNhYmxlKCkgfHwgbG9hZGluZygpIHx8IGxvYWRpbmdEZXRhaWwoKVwiXG4gICAgICBbaGFzVG9nZ2xlXT1cImxhYmVsQ29uZmlnLmhhc1RvZ2dsZVwiXG4gICAgICBbdG9nZ2xlQWN0aXZlXT1cImxhYmVsQ29uZmlnLnRvZ2dsZUFjdGl2ZVwiXG4gICAgICBbdG9nZ2xlQWN0aXZlXT1cImxhYmVsQ29uZmlnLnRvZ2dsZURpc2FibGUgfHwgZGlzYWJsZSgpIHx8IGxvYWRpbmcoKSB8fCBsb2FkaW5nRGV0YWlsKClcIlxuICAgICAgW3BvcG92ZXJdPVwibGFiZWxDb25maWcucG9wb3ZlclwiXG4gICAgICBbaWNvblBvcG92ZXJDbGFzc109XCJsYWJlbENvbmZpZy5pY29uUG9wb3ZlckNsYXNzXCJcbiAgICAgIFtvbmx5U2hvd0NvdW50XT1cImxhYmVsQ29uZmlnLm9ubHlTaG93Q291bnRcIlxuICAgICAgW2xpbWl0TGVuZ3RoXT1cImxhYmVsQ29uZmlnLmxpbWl0TGVuZ3RoXCJcbiAgICAgIFtidXR0b25zRGVzY3JpcHRpb25dPVwibGFiZWxDb25maWcuYnV0dG9uc0Rlc2NyaXB0aW9uXCJcbiAgICAgIFtkaXNhYmxlQnV0dG9uc0Rlc2NyaXB0aW9uXT1cImxhYmVsQ29uZmlnLmRpc2FibGVCdXR0b25zRGVzY3JpcHRpb24gfHwgZGlzYWJsZSgpXCJcbiAgICAgIFtidXR0b25zRGVzY3JpcHRpb25Db250YWluZXJDbGFzc109XCJsYWJlbENvbmZpZy5idXR0b25zRGVzY3JpcHRpb25Db250YWluZXJDbGFzc1wiXG4gICAgICBbY291bnRdPVwibGFiZWxDb25maWcuY291bnRcIiAvPlxuICB9XG4gIDxsaWJzX3VpLWNvbXBvbmVudHMtcG9wb3ZlciBjbGFzcz1cInctZnVsbCBoLWZ1bGxcIlxuICAgIFtpZ25vcmVTaG93UG9wb3Zlcl09XCJkaXNhYmxlKCkgfHwgcmVhZG9ubHkoKSB8fCAhIWNvbmZpZygpPy5pZ25vcmVTaG93TGlzdCB8fCBmYWxzZVwiXG4gICAgW2lnbm9yZUN1cnNvclBvaW50ZXJNb2RlTGlrZUNsaWNrXT1cInRydWVcIlxuICAgIFtlbGVtZW50UmVmQ3VzdG9tXT1cInRhZ3NFbFwiXG4gICAgW21vZGVdPVwiIWNvbmZpZygpPy5pZ25vcmVJbnB1dCA/ICdjbGljaycgOiAnY2xpY2stdG9nZ2xlJ1wiXG4gICAgW2lnbm9yZUhpZGRlblBvcG92ZXJDb250ZW50V2hlbk1vdXNlTGVhdmVdPVwidHJ1ZVwiXG4gICAgW2ZsYWdNb3VzZV09XCJmbGFnTW91c2UoKVwiXG4gICAgW2NvbmZpZ109XCJ7XG4gICAgICBhbmltYXRpb25Db25maWc6IGNvbmZpZygpPy5hbmltYXRpb25Db25maWcgfHwge30sXG4gICAgICB6SW5kZXg6IHpJbmRleCgpIHx8IDEwMDAsXG4gICAgICB3aWR0aEJ5UGFyZW50OiB0cnVlLFxuICAgICAgcGFyZW50Qm9yZGVyV2lkdGg6IHBhcmVudEJvcmRlcldpZHRoKCkgPz8gMCxcbiAgICAgIG1heEhlaWdodDogMjA0OCxcbiAgICAgIG1heFdpZHRoOiAyMDQ4LFxuICAgICAgZGlyZWN0aW9uOiBjb25maWcoKT8uZGlyZWN0aW9uTGlzdCB8fCAnYm90dG9tJyxcbiAgICAgIGRpcmVjdGlvbkRpc3RhbmNlOiAyLFxuICAgICAgdGVtcGxhdGU6ICFzaG93TGlzdEJlbGxvdygpID8gbGlzdFZpZXdFbCA6IHVuZGVmaW5lZCxcbiAgICAgIHdoaXRlVGhlbWU6IHRydWUsXG4gICAgICBpZ25vcmVBcnJvdzogdHJ1ZSxcbiAgICAgIGNsYXNzSW5jbHVkZTogJ3JvdW5kZWQtWzRweF0gJyArIGNsYXNzSW5jbHVkZVBvcG92ZXIoKSArICgoIWxpc3RDb25maWcoKT8uaWdub3JlU2hvd0RhdGFXaGVuTm90U2VhcmNoIHx8IGtleVNlYXJjaCgpKSA/ICcgbGlicy11aS1ib3JkZXItZ2VuZXJhbCcgOiAnJyksXG4gICAgICBwb3NpdGlvbjogeyBtb2RlOiAnc3RhcnQnLCBkaXN0YW5jZTogMCB9XG4gICAgfVwiXG4gICAgKG91dEZ1bmN0aW9uc0NvbnRyb2wpPVwiaGFuZGxlclBvcG92ZXJGdW5jdGlvbkNvbnRyb2xFdmVudCgkZXZlbnQpXCJcbiAgICAob3V0RXZlbnQpPVwiaGFuZGxlclBvcG92ZXJFdmVudCgkZXZlbnQpXCJcbiAgICAob3V0RXZlbnRQb3BvdmVyQ29udGVudCk9XCJoYW5kbGVyUG9wb3ZlckNvbnRlbnRFdmVudCgkZXZlbnQpXCJcbiAgICAob3V0Q2hhbmdTdGFnZUZsYWdNb3VzZSk9XCJoYW5kbGVyQ2hhbmdlRmxhZ01vdXNlKCRldmVudClcIj5cbiAgICA8ZGl2IGNsYXNzPVwicmVsYXRpdmVcIlxuICAgICAgW2NsYXNzLmN1cnNvci1wb2ludGVyXT1cIiFkaXNhYmxlKCkgJiYgIXJlYWRvbmx5KClcIj5cbiAgICAgIEBpZiAoY29uZmlnKCk/LnVpTGlrZURyb3Bkb3duKSB7XG4gICAgICAgIDxpIGNsYXNzPVwiZmxleCB0ZXh0LVsxNnB4XSBhYnNvbHV0ZSByaWdodC1bMTZweF0gdG9wLVs4cHhdIGxpYnMtdWktaWNvbi1tb3ZlLXJpZ2h0IHJvdGF0ZS05MCB6LVsxXVwiXG4gICAgICAgICAgW2NsYXNzLnRleHQtWyM2YTczODNdXT1cIiFyZWFkb25seSgpICYmICFkaXNhYmxlKClcIlxuICAgICAgICAgIFtjbGFzcy5saWJzLXVpLXJlYWRvbmx5XT1cInJlYWRvbmx5KClcIlxuICAgICAgICAgIFtjbGFzcy5saWJzLXVpLWRpc2FibGVdPVwiZGlzYWJsZSgpXCI+XG4gICAgICAgIDwvaT5cbiAgICAgIH1cbiAgICAgIDxkaXYgI3RhZ3NFbFxuICAgICAgICBbY2xhc3NdPVwiJ2xpYnMtdWktdGFncyAnICsgKGNvbmZpZygpPy5jbGFzc0luY2x1ZGUgfHwgJycpICsgKHJlYWRvbmx5KCkgPyAoY29uZmlnKCk/LmNsYXNzQ3VzdG9tV2hlblJlYWRPbmx5IHx8ICcgbGlicy11aS1yZWFkb25seScpIDogJycpXCJcbiAgICAgICAgW2NsYXNzLmxpYnMtdWktdGFncy1ub3QtcG9wdXBdPVwiKCFzaG93TGlzdCgpICYmICFzaG93Qm9yZGVyQWN0aXZlV2hlbkZvY3VzSW5wdXQoKSkgfHwgKCFmb2N1cygpICYmIHNob3dCb3JkZXJBY3RpdmVXaGVuRm9jdXNJbnB1dCgpKVwiXG4gICAgICAgIFtjbGFzcy5saWJzLXVpLXRhZ3MtZXJyb3JdPVwiISFlcnJvcigpICYmICFjb25maWcoKT8uaWdub3JlU2hvd0Vycm9yXCJcbiAgICAgICAgW2NsYXNzLiFwci1bMzJweF1dPVwiY29uZmlnKCk/LnVpTGlrZURyb3Bkb3duXCJcbiAgICAgICAgW2NsYXNzLmxpYnMtdWktcmVhZG9ubHktYmFja2dyb3VuZF1dPVwicmVhZG9ubHkoKVwiXG4gICAgICAgIFtjbGFzcy5saWJzLXVpLWRpc2FibGUtYmFja2dyb3VuZF1dPVwiZGlzYWJsZSgpXCJcbiAgICAgICAgW2NsYXNzLmxpYnMtdWktYm9yZGVyLXByaW1hcnktZ2VuZXJhbF09XCJmb2N1cygpICYmIHNob3dCb3JkZXJBY3RpdmVXaGVuRm9jdXNJbnB1dCgpXCJcbiAgICAgICAgTGlic1VpQ29tcG9uZW50c0NsaWNrT3V0c2lkZURpcmVjdGl2ZVxuICAgICAgICAob3V0T3V0c2lkZSk9XCJoYW5kbGVyQ2xpY2tPdXRzaWRlKCRldmVudClcIj5cbiAgICAgICAgQGZvciAoaXRlbSBvZiBpdGVtc1NlbGVjdGVkKCk7IHRyYWNrIGl0ZW1bZmllbGRLZXkoKV0pIHtcbiAgICAgICAgICA8ZGl2IFtuZ1N0eWxlXT1cIml0ZW0/LmJ1bGxldCB8fCBpdGVtPy5uZ1N0eWxlc1wiXG4gICAgICAgICAgICBbY2xhc3NdPVwiY2xhc3NJbmNsdWRlVGFnSXRlbSgpIHx8ICcnXCJcbiAgICAgICAgICAgIFtjbGFzcy5saWJzLXVpLXRhZ3MtcmVhZG9ubHldPVwiaXRlbS5kaXNhYmxlSXRlbVwiXG4gICAgICAgICAgICBbY2xhc3MubGlicy11aS10YWdzLWl0ZW1dPVwiIWl0ZW0uZGlzYWJsZUl0ZW1cIlxuICAgICAgICAgICAgW2NsYXNzLmN1cnNvci1kZWZhdWx0XT1cImRpc2FibGUoKSB8fCByZWFkb25seSgpXCI+XG4gICAgICAgICAgICBAaWYgKGZpZWxkR2V0SW1hZ2UoKTsgYXMgZmllbGRHZXRJbWFnZSkge1xuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgaC1mdWxsXCI+XG4gICAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1hdmF0YXIgW2NsYXNzSW5jbHVkZV09XCJjbGFzc0F2YXRhckluY2x1ZGUoKSB8fCAnbXItWzhweF0nXCJcbiAgICAgICAgICAgICAgICAgIFtzaXplXT1cImltYWdlU2l6ZSgpXCJcbiAgICAgICAgICAgICAgICAgIFtsaW5rQXZhdGFyXT1cIml0ZW1bZmllbGRHZXRJbWFnZV1cIlxuICAgICAgICAgICAgICAgICAgW2xpbmtBdmF0YXJFcnJvcl09XCJjb25maWcoKT8ubGlua0ltYWdlRXJyb3JcIlxuICAgICAgICAgICAgICAgICAgW2lkR2VuQ29sb3JdPVwiaXRlbVtmaWVsZEdldFRleHRBdmF0YXIoKV1cIlxuICAgICAgICAgICAgICAgICAgW3RleHRBdmF0YXJdPVwiaXRlbVtmaWVsZEdldFRleHRBdmF0YXIoKV1cIlxuICAgICAgICAgICAgICAgICAgW2dldExhc3RUZXh0QWZ0ZXJTcGFjZV09XCJnZXRMYXN0VGV4dEFmdGVyU3BhY2UoKVwiIC8+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsaWJzLXVpLWZvbnQtaDZyXCJcbiAgICAgICAgICAgICAgW2lubmVySHRtbF09XCIoaXRlbS5maWVsZExhYmVsIHx8ICcgJykgfCB0cmFuc2xhdGVcIj5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIEBpZiAoIWRpc2FibGUoKSAmJiAhaXRlbS5kaXNhYmxlSXRlbSAmJiAhcmVhZG9ubHkoKSkge1xuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgbWwtWzhweF1cIj5cbiAgICAgICAgICAgICAgICA8aSAjaWNvbkNsb3NlRWxcbiAgICAgICAgICAgICAgICAgIFthdHRyLnNwZWNpZmljU3R5bGVdPVwiISEoaXRlbT8uYnVsbGV0IHx8IGl0ZW0/Lm5nU3R5bGVzKVwiXG4gICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiJ2ZsZXggdGV4dC1bMTZweF0gJyArIChjbGFzc0ljb25SZW1vdmVUYWdJdGVtKCkgfHwgJ2xpYnMtdWktaWNvbi1jbG9zZScpXCJcbiAgICAgICAgICAgICAgICAgIFtjbGFzcy5jdXJzb3ItcG9pbnRlcl09XCIhZGlzYWJsZSgpICYmICFsb2FkaW5nKCkgJiYgIWxvYWRpbmdEZXRhaWwoKVwiXG4gICAgICAgICAgICAgICAgICBbY2xhc3MucG9pbnRlci1ldmVudHMtbm9uZV09XCJkaXNhYmxlKCkgfHwgbG9hZGluZygpIHx8IGxvYWRpbmdEZXRhaWwoKVwiXG4gICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCIoaXRlbT8uYnVsbGV0IHx8IGl0ZW0/Lm5nU3R5bGVzKSB8IExpYnNVaUNvbXBvbmVudHNUYWdzR2V0Q29sb3JQaXBlOmljb25DbG9zZUVsXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJoYW5kbGVyUmVtb3ZlSXRlbVNlbGVjdGVkKCRldmVudCxpdGVtKVwiPjwvaT5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgICAgQGlmICghc2luZ2xlU2VsZWN0ZWQoKSB8fCAoc2luZ2xlU2VsZWN0ZWQoKSAmJiAhaXRlbXNTZWxlY3RlZCgpLmxlbmd0aCkpIHtcbiAgICAgICAgICBAaWYgKCFjb25maWcoKT8uaWdub3JlSW5wdXQgJiYgIWNvbmZpZygpPy51aUxpa2VEcm9wZG93biAmJiAoIWhpZGRlbklucHV0V2hlblJlYWRvbmx5KCkgfHwgKGhpZGRlbklucHV0V2hlblJlYWRvbmx5KCkgJiYgIXJlYWRvbmx5KCkpKSkge1xuICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1pbnB1dHMtaW5wdXQgY2xhc3M9XCJncm93XCJcbiAgICAgICAgICAgICAgW2NsYXNzLm1iLVs0cHhdXT1cIml0ZW1zU2VsZWN0ZWQoKS5sZW5ndGhcIlxuICAgICAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cIid3LWZ1bGwgYmctdHJhbnNwYXJlbnQnICsgKGNvbmZpZygpPy5jbGFzc0lucHV0SW5jbHVkZSB8fCAncHgtWzRweF0gbWluLXctWzMwcHhdJylcIlxuICAgICAgICAgICAgICBbZGVmYXVsdEhlaWdodF09XCIyNFwiXG4gICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJyZWFkb25seSgpID8gJycgOiAocGxhY2Vob2xkZXIoKSB8fCAnaTE4bl9pbXBvcnRfY29udGVudCcpXCJcbiAgICAgICAgICAgICAgW25vQm9yZGVyXT1cInRydWVcIlxuICAgICAgICAgICAgICBbKHZhbHVlKV09XCJ2YWx1ZUlucHV0XCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVdPVwiZGlzYWJsZSgpIHx8IGxvYWRpbmcoKSB8fCBsb2FkaW5nRGV0YWlsKCkgfHwgZGlzYWJsZVdoZW5NYXhJdGVtKClcIlxuICAgICAgICAgICAgICBbcmVhZG9ubHldPVwicmVhZG9ubHkoKVwiXG4gICAgICAgICAgICAgIChvdXRFbnRlckV2ZW50KT1cImhhbmRsZXJFbnRlckV2ZW50KClcIlxuICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwiaGFuZGxlclZhbHVlQ2hhbmdlU2VhcmNoKCRldmVudClcIlxuICAgICAgICAgICAgICAob3V0Rm9jdXNBbmRCbHVyRXZlbnQpPVwiaGFuZGxlckZvY3VzQW5kQmx1ckV2ZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAob3V0RnVuY3Rpb25zQ29udHJvbCk9XCJoYW5kbGVySW5wdXRGdW5jdGlvbkNvbnRyb2woJGV2ZW50KVwiIC8+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBpZiAoY29uZmlnKCk/Lmlnbm9yZUlucHV0ICYmIGNvbmZpZygpPy51aUxpa2VEcm9wZG93biAmJiAhaXRlbXNTZWxlY3RlZCgpLmxlbmd0aCkge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIHBiLVs0cHhdIHB0LVsycHhdIG1sLVsxMXB4XSBsaWJzLXVpLWZvbnQtaDVyXCJcbiAgICAgICAgICAgICAgW2NsYXNzLnRleHQtWyM5Y2EyYWRdXT1cImRpc2FibGUoKVwiPlxuICAgICAgICAgICAgICB7eyAocGxhY2Vob2xkZXIoKSB8fCAnaTE4bl9zZWxlY3RfdmFsdWUnKSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICAgIEBpZiAoZXJyb3IoKSAmJiAhY29uZmlnKCk/Lmlnbm9yZVNob3dFcnJvcikge1xuICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1bI2VlMmQ0MV0gbGlicy11aS1mb250LWg3ciBtdC1bOHB4XVwiPnt7IChlcnJvcigpPy5tZXNzYWdlIHx8ICcgJykgfCB0cmFuc2xhdGU6KGVycm9yKCk/LmludGVycG9sYXRlUGFyYW1zIHx8IHt9KSB9fTwvZGl2PlxuICAgICAgfVxuICAgIDwvZGl2PlxuICA8L2xpYnNfdWktY29tcG9uZW50cy1wb3BvdmVyPlxuPC9kaXY+XG5AaWYgKHNob3dMaXN0QmVsbG93KCkpIHtcbiAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImxpc3RWaWV3RWxcIj48L25nLWNvbnRhaW5lcj5cbn1cbjxuZy10ZW1wbGF0ZSAjbGlzdFZpZXdFbD5cbiAgQGlmIChsaXN0Q29uZmlnKCk7IGFzIGxpc3RDb25maWcpIHtcbiAgICA8bGlic191aS1jb21wb25lbnRzLWxpc3QgW3NlYXJjaENvbmZpZ109XCJsaXN0U2VhcmNoQ29uZmlnKCkgfHwge2NsYXNzSW5jbHVkZTogJ2hpZGRlbicsIGljb25MZWZ0Q2xhc3M6ICdoaWRkZW4nfVwiXG4gICAgICBbaXNTZWFyY2hPbmxpbmVdPVwiaXNTZWFyY2hPbmxpbmUoKVwiXG4gICAgICBbekluZGV4XT1cInpJbmRleCgpXCJcbiAgICAgIFtrZXlTZWFyY2hdPVwia2V5U2VhcmNoKClcIlxuICAgICAgW2NvbmZpZ109XCJsaXN0Q29uZmlnXCJcbiAgICAgIFtkaXNhYmxlXT1cImRpc2FibGUoKSB8fCBsb2FkaW5nRGV0YWlsKCkgfHwgZGlzYWJsZVdoZW5NYXhJdGVtKClcIlxuICAgICAgW3NlYXJjaFBhZGRpbmddPVwibGlzdFNlYXJjaFBhZGRpbmcoKVwiXG4gICAgICBbbWF4SXRlbVNob3ddPVwibGlzdE1heEl0ZW1TaG93KCkgfHwgNlwiXG4gICAgICBbbXVsdGlLZXlTZWxlY3RlZF09XCJrZXlzU2VsZWN0ZWQoKVwiXG4gICAgICBbY2xpY2tFeGFjdGx5XT1cImZhbHNlXCJcbiAgICAgIFtrZXlzSGlkZGVuSXRlbV09XCJrZXlzSGlkZGVuSXRlbSgpXCJcbiAgICAgIFtrZXlzRGlzYWJsZUl0ZW1dPVwia2V5c0Rpc2FibGVJdGVtKClcIlxuICAgICAgW2RpdmlkZXJDbGFzc0luY2x1ZGVdPVwibGlzdERpdmlkZXJDbGFzc0luY2x1ZGUoKSA/PyAnaGlkZGVuJ1wiXG4gICAgICBbYnV0dG9uc090aGVyXT1cImxpc3RCdXR0b25zT3RoZXIoKVwiXG4gICAgICBbYmFja2dyb3VuZExpc3RDdXN0b21dPVwibGlzdEJhY2tncm91bmRMaXN0Q3VzdG9tKClcIlxuICAgICAgW2l0ZW1DaGFuZ2VVblNlbGVjdF09XCJpdGVtQ2hhbmdlVW5TZWxlY3QoKVwiXG4gICAgICBbZnVuY3Rpb25HZXRJdGVtc0F1dG9BZGRMaXN0XT1cImZ1bmN0aW9uR2V0SXRlbUF1dG9BZGRMaXN0KClcIlxuICAgICAgW2hpZGRlbklucHV0U2VhcmNoXT1cImxpc3RIaWRkZW5JbnB1dFNlYXJjaFdoZW5IYXNTZWFyY2hDb25maWcoKVwiXG4gICAgICAob3V0RnVuY3Rpb25zQ29udHJvbCk9XCJoYW5kbGVyRnVuY3Rpb25Db250cm9sTGlzdCgkZXZlbnQpXCJcbiAgICAgIChvdXRTZWxlY3RLZXkpPVwiaGFuZGxlclNlbGVjdGVkS2V5KCRldmVudClcIlxuICAgICAgKG91dFNlbGVjdE11bHRpS2V5KT1cImhhbmRsZXJTZWxlY3RNdWx0aUtleSgkZXZlbnQpXCJcbiAgICAgIChvdXRDaGFuZ2VWaWV3KT1cImhhbmRsZXJEYXRhQ2hhbmdlKCRldmVudClcIlxuICAgICAgKG91dENsaWNrQnV0dG9uT3RoZXIpPVwiaGFuZGxlckNsaWNrQnV0dG9uT3RoZXIoJGV2ZW50KVwiXG4gICAgICAob3V0Q2hhbmdTdGFnZUZsYWdNb3VzZVBvcG92ZXIpPVwiaGFuZGxlckNoYW5nU3RhZ2VGbGFnTW91c2UoJGV2ZW50KVwiXG4gICAgICAob3V0TG9hZGluZyk9XCJoYW5kbGVyTG9hZGluZygkZXZlbnQpXCIgLz5cbiAgfVxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
|