@libs-ui/components-inputs-upload 0.2.306 → 0.2.307-0
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/avatar/avatar.component.d.ts +1 -1
- package/esm2022/avatar/avatar.component.mjs +12 -19
- package/esm2022/defines/helper.define.mjs +5 -5
- package/esm2022/index.mjs +1 -1
- package/esm2022/interfaces/upload.interface.mjs +1 -1
- package/esm2022/pipes/calc-duration-video.pipe.mjs +4 -4
- package/esm2022/pipes/check-file-extension.pipe.mjs +2 -2
- package/esm2022/upload-drop-file.directive.mjs +11 -5
- package/esm2022/upload-file.directive.mjs +10 -6
- package/esm2022/upload.component.mjs +79 -73
- package/fesm2022/libs-ui-components-inputs-upload.mjs +106 -97
- package/fesm2022/libs-ui-components-inputs-upload.mjs.map +1 -1
- package/package.json +14 -14
- package/upload.component.d.ts +1 -0
|
@@ -7,7 +7,7 @@ import { LibsUiComponentsPreviewFileComponent } from '@libs-ui/components-previe
|
|
|
7
7
|
import { LibsUiComponentsScrollOverlayDirective } from '@libs-ui/components-scroll-overlay';
|
|
8
8
|
import { LibsUiDynamicComponentService } from '@libs-ui/services-dynamic-component';
|
|
9
9
|
import { LibsUiNotificationService } from '@libs-ui/services-notification';
|
|
10
|
-
import { AudioExtList, convertBlobToFile, convertFileToBase64_ObjectUrl, DocumentExtList, downloadFileByUrl, ERROR_MESSAGE_EMPTY_VALID, getFileExtension, getLabelBySizeFile, ImageExtList, isIncludeAudioExtList, isIncludeDocumentExtList, isIncludeImageExtList, isIncludeVideoExtList, isTypeAudio, isTypeImage, isTypeVideo, uuid, VideoExtList } from '@libs-ui/utils';
|
|
10
|
+
import { AudioExtList, convertBlobToFile, convertFileToBase64_ObjectUrl, DocumentExtList, downloadFileByUrl, ERROR_MESSAGE_EMPTY_VALID, getFileExtension, getLabelBySizeFile, ImageExtList, isIncludeAudioExtList, isIncludeDocumentExtList, isIncludeImageExtList, isIncludeVideoExtList, isTypeAudio, isTypeImage, isTypeVideo, uuid, VideoExtList, } from '@libs-ui/utils';
|
|
11
11
|
import { TranslateModule, TranslateService } from '@ngx-translate/core';
|
|
12
12
|
import { Subject } from 'rxjs';
|
|
13
13
|
import { LibsUiComponentsInputsUploadAvatarComponent } from './avatar/avatar.component';
|
|
@@ -34,46 +34,46 @@ export class LibsUiComponentsInputsUploadComponent {
|
|
|
34
34
|
onDestroy = new Subject();
|
|
35
35
|
// #endregion
|
|
36
36
|
// #region INPUTS
|
|
37
|
-
originFiles = input([], { transform: val => val ?? [] });
|
|
38
|
-
fileType = input('image_video_document', { transform: val => val ?? 'image_video_document' });
|
|
37
|
+
originFiles = input([], { transform: (val) => val ?? [] });
|
|
38
|
+
fileType = input('image_video_document', { transform: (val) => val ?? 'image_video_document' });
|
|
39
39
|
multiple = input();
|
|
40
|
-
canUploadIfHasExistFile = input(false, { transform: val => val ?? false });
|
|
40
|
+
canUploadIfHasExistFile = input(false, { transform: (val) => val ?? false });
|
|
41
41
|
canSetAvatar = input(false);
|
|
42
|
-
limitFile = input(10, { transform: val => val ?? 10 });
|
|
43
|
-
maxTotalSize = input(10 * 1024 * 1024, { transform: val => val ?? 10 * 1024 * 1024 });
|
|
44
|
-
maxImageSize = input(5 * 1024 * 1024, { transform: val => val ?? 5 * 1024 * 1024 });
|
|
45
|
-
maxVideoSize = input(10 * 1024 * 1024, { transform: val => val ?? 10 * 1024 * 1024 });
|
|
46
|
-
maxDocumentSize = input(10 * 1024 * 1024, { transform: val => val ?? 10 * 1024 * 1024 });
|
|
47
|
-
maxAudioSize = input(10 * 1024 * 1024, { transform: val => val ?? 10 * 1024 * 1024 });
|
|
48
|
-
imageExtList = input(ImageExtList, { transform: val => val ?? ImageExtList });
|
|
49
|
-
videoExtList = input(VideoExtList, { transform: val => val ?? VideoExtList });
|
|
50
|
-
documentExtList = input(DocumentExtList, { transform: val => val ?? DocumentExtList });
|
|
51
|
-
audioExtList = input(AudioExtList, { transform: val => val ?? AudioExtList });
|
|
42
|
+
limitFile = input(10, { transform: (val) => val ?? 10 });
|
|
43
|
+
maxTotalSize = input(10 * 1024 * 1024, { transform: (val) => val ?? 10 * 1024 * 1024 });
|
|
44
|
+
maxImageSize = input(5 * 1024 * 1024, { transform: (val) => val ?? 5 * 1024 * 1024 });
|
|
45
|
+
maxVideoSize = input(10 * 1024 * 1024, { transform: (val) => val ?? 10 * 1024 * 1024 });
|
|
46
|
+
maxDocumentSize = input(10 * 1024 * 1024, { transform: (val) => val ?? 10 * 1024 * 1024 });
|
|
47
|
+
maxAudioSize = input(10 * 1024 * 1024, { transform: (val) => val ?? 10 * 1024 * 1024 });
|
|
48
|
+
imageExtList = input(ImageExtList, { transform: (val) => val ?? ImageExtList });
|
|
49
|
+
videoExtList = input(VideoExtList, { transform: (val) => val ?? VideoExtList });
|
|
50
|
+
documentExtList = input(DocumentExtList, { transform: (val) => val ?? DocumentExtList });
|
|
51
|
+
audioExtList = input(AudioExtList, { transform: (val) => val ?? AudioExtList });
|
|
52
52
|
classIncludeListItem = input();
|
|
53
53
|
validRequired = input();
|
|
54
|
-
disable = input(false, { transform: val => val ?? false });
|
|
55
|
-
readonly = input(false, { transform: val => val ?? false });
|
|
54
|
+
disable = input(false, { transform: (val) => val ?? false });
|
|
55
|
+
readonly = input(false, { transform: (val) => val ?? false });
|
|
56
56
|
aspectRatio = input();
|
|
57
|
-
zIndex = input(1200, { transform: val => val ?? 1200 });
|
|
58
|
-
ignoreShowSizeFile = input(false, { transform: val => val ?? false });
|
|
59
|
-
allowShowPushMessageMaxSizeError = input(false, { transform: val => val ?? false });
|
|
60
|
-
messageTypeFileError = input('i18n_the_file_support_format_is_not_correct', { transform: val => val || 'i18n_the_file_support_format_is_not_correct' });
|
|
61
|
-
messageMaxSizeError = input('i18n_file_size_exceeds_the_allowed_limit', { transform: val => val || 'i18n_file_size_exceeds_the_allowed_limit' });
|
|
62
|
-
messageFileUploadError = input('i18n_invalid_file_upload', { transform: val => val || 'i18n_invalid_file_upload' });
|
|
63
|
-
messageTotalFileExceedsError = input('i18n_file_number_exceeds_the_allowed_limit_please_delete_the_file', { transform: val => val || 'i18n_file_number_exceeds_the_allowed_limit_please_delete_the_file' });
|
|
57
|
+
zIndex = input(1200, { transform: (val) => val ?? 1200 });
|
|
58
|
+
ignoreShowSizeFile = input(false, { transform: (val) => val ?? false });
|
|
59
|
+
allowShowPushMessageMaxSizeError = input(false, { transform: (val) => val ?? false });
|
|
60
|
+
messageTypeFileError = input('i18n_the_file_support_format_is_not_correct', { transform: (val) => val || 'i18n_the_file_support_format_is_not_correct' });
|
|
61
|
+
messageMaxSizeError = input('i18n_file_size_exceeds_the_allowed_limit', { transform: (val) => val || 'i18n_file_size_exceeds_the_allowed_limit' });
|
|
62
|
+
messageFileUploadError = input('i18n_invalid_file_upload', { transform: (val) => val || 'i18n_invalid_file_upload' });
|
|
63
|
+
messageTotalFileExceedsError = input('i18n_file_number_exceeds_the_allowed_limit_please_delete_the_file', { transform: (val) => val || 'i18n_file_number_exceeds_the_allowed_limit_please_delete_the_file' });
|
|
64
64
|
configDescriptionInputUpload = input({ message: 'i18n_drag_file_here_to_upload_or_select_file' }, {
|
|
65
|
-
transform: val => val ?? { message: 'i18n_drag_file_here_to_upload_or_select_file' }
|
|
65
|
+
transform: (val) => val ?? { message: 'i18n_drag_file_here_to_upload_or_select_file' },
|
|
66
66
|
});
|
|
67
|
-
modeDisplayFile = input('full', { transform: val => val || 'full' });
|
|
67
|
+
modeDisplayFile = input('full', { transform: (val) => val || 'full' });
|
|
68
68
|
descriptionFormatAndSizeFile = input();
|
|
69
|
-
showVideoDuration = input(false, { transform: val => val ?? false });
|
|
69
|
+
showVideoDuration = input(false, { transform: (val) => val ?? false });
|
|
70
70
|
labelConfig = input();
|
|
71
|
-
showPopupUploadWhenHasFileAndModeSingle = input(false, { transform: val => val ?? false });
|
|
72
|
-
ignoreIconRemove = input(false, { transform: val => val ?? false });
|
|
73
|
-
ignoreIconEdit = input(false, { transform: val => val ?? false });
|
|
74
|
-
ignoreIconPreview = input(true, { transform: val => val ?? true });
|
|
71
|
+
showPopupUploadWhenHasFileAndModeSingle = input(false, { transform: (val) => val ?? false });
|
|
72
|
+
ignoreIconRemove = input(false, { transform: (val) => val ?? false });
|
|
73
|
+
ignoreIconEdit = input(false, { transform: (val) => val ?? false });
|
|
74
|
+
ignoreIconPreview = input(true, { transform: (val) => val ?? true });
|
|
75
75
|
classIncludeFileContent = input();
|
|
76
|
-
showBorderErrorAllItemWhenError = input(false, { transform: val => val ?? false });
|
|
76
|
+
showBorderErrorAllItemWhenError = input(false, { transform: (val) => val ?? false });
|
|
77
77
|
configDownloadSampleFile = input();
|
|
78
78
|
// #endregion
|
|
79
79
|
// #region OUTPUTS
|
|
@@ -102,26 +102,7 @@ export class LibsUiComponentsInputsUploadComponent {
|
|
|
102
102
|
}
|
|
103
103
|
// #region LIFECYCLE HOOKS
|
|
104
104
|
ngOnInit() {
|
|
105
|
-
this.outFunctionsControl.emit(
|
|
106
|
-
checkIsValid: this.validate.bind(this),
|
|
107
|
-
removeAll: this.removeAllFile.bind(this),
|
|
108
|
-
uploading: async (process, id) => {
|
|
109
|
-
const fileUploading = this.fileList().find(file => file().id === id);
|
|
110
|
-
if (fileUploading) {
|
|
111
|
-
fileUploading.update(file => ({ ...file, percentUploading: process.percent, isUploading: process.percent !== 100 }));
|
|
112
|
-
}
|
|
113
|
-
},
|
|
114
|
-
setMessageError: async (message, id) => {
|
|
115
|
-
this.messageError.set(message);
|
|
116
|
-
if (id) {
|
|
117
|
-
const fileError = this.fileList().find(file => file().id === id);
|
|
118
|
-
if (fileError) {
|
|
119
|
-
fileError.update(file => ({ ...file, error: message }));
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
},
|
|
123
|
-
handlerUploadFile: this.showUploadPopup.bind(this)
|
|
124
|
-
});
|
|
105
|
+
this.outFunctionsControl.emit(this.FunctionsControl);
|
|
125
106
|
}
|
|
126
107
|
ngAfterViewInit() {
|
|
127
108
|
setTimeout(() => {
|
|
@@ -145,7 +126,7 @@ export class LibsUiComponentsInputsUploadComponent {
|
|
|
145
126
|
if (typeSplit.includes('audio')) {
|
|
146
127
|
accessExts.push(...this.audioExtList());
|
|
147
128
|
}
|
|
148
|
-
this.accessFiles.set(accessExts.map(ext => `.${ext}`).join(','));
|
|
129
|
+
this.accessFiles.set(accessExts.map((ext) => `.${ext}`).join(','));
|
|
149
130
|
}
|
|
150
131
|
// #endregion
|
|
151
132
|
// #region FILE OPERATIONS
|
|
@@ -185,7 +166,7 @@ export class LibsUiComponentsInputsUploadComponent {
|
|
|
185
166
|
file: file,
|
|
186
167
|
size: getLabelBySizeFile(file.size),
|
|
187
168
|
type: isImage ? 'image' : isVideo ? 'video' : isAudio ? 'audio' : 'document',
|
|
188
|
-
id: uuid()
|
|
169
|
+
id: uuid(),
|
|
189
170
|
};
|
|
190
171
|
if (!(await this.checkValidFileExtension(file))) {
|
|
191
172
|
if (!errorExceedsMaxFile) {
|
|
@@ -209,11 +190,11 @@ export class LibsUiComponentsInputsUploadComponent {
|
|
|
209
190
|
}
|
|
210
191
|
await this.pushFileInList(file, newFile);
|
|
211
192
|
}
|
|
212
|
-
if (this.canSetAvatar() && this.fileList().length && !this.fileList().find(file => file().isAvatar)) {
|
|
213
|
-
this.fileList.update(fileList => {
|
|
214
|
-
const itemImage = fileList.find(file => file().type === 'image');
|
|
193
|
+
if (this.canSetAvatar() && this.fileList().length && !this.fileList().find((file) => file().isAvatar)) {
|
|
194
|
+
this.fileList.update((fileList) => {
|
|
195
|
+
const itemImage = fileList.find((file) => file().type === 'image');
|
|
215
196
|
if (itemImage) {
|
|
216
|
-
itemImage.update(file => ({ ...file, isAvatar: true }));
|
|
197
|
+
itemImage.update((file) => ({ ...file, isAvatar: true }));
|
|
217
198
|
}
|
|
218
199
|
return [...fileList];
|
|
219
200
|
});
|
|
@@ -222,8 +203,8 @@ export class LibsUiComponentsInputsUploadComponent {
|
|
|
222
203
|
this.validate();
|
|
223
204
|
}
|
|
224
205
|
async pushFileInList(file, newFile) {
|
|
225
|
-
newFile.url = await convertFileToBase64_ObjectUrl(file);
|
|
226
|
-
this.fileList.update(fileList => {
|
|
206
|
+
newFile.url = (await convertFileToBase64_ObjectUrl(file));
|
|
207
|
+
this.fileList.update((fileList) => {
|
|
227
208
|
fileList.splice(0, this.canUploadIfHasExistFile() ? 1 : 0, signal(newFile));
|
|
228
209
|
return [...fileList];
|
|
229
210
|
});
|
|
@@ -272,7 +253,7 @@ export class LibsUiComponentsInputsUploadComponent {
|
|
|
272
253
|
async handlerRemoveFile(event, item) {
|
|
273
254
|
event.stopPropagation();
|
|
274
255
|
this.removeFile(item);
|
|
275
|
-
if (this.originFiles().find(file => file().url === item().url)) {
|
|
256
|
+
if (this.originFiles().find((file) => file().url === item().url)) {
|
|
276
257
|
this.outFileRemoved.emit(item);
|
|
277
258
|
}
|
|
278
259
|
this.validate();
|
|
@@ -283,10 +264,10 @@ export class LibsUiComponentsInputsUploadComponent {
|
|
|
283
264
|
}
|
|
284
265
|
}
|
|
285
266
|
async removeFile(fileItem) {
|
|
286
|
-
this.fileList.update(fileList => fileList.filter(item => item().id !== fileItem().id));
|
|
267
|
+
this.fileList.update((fileList) => fileList.filter((item) => item().id !== fileItem().id));
|
|
287
268
|
if (this.canSetAvatar() && fileItem().isAvatar && this.fileList().length) {
|
|
288
|
-
this.fileList.update(fileList => {
|
|
289
|
-
fileList[0].update(file => ({ ...file, isAvatar: true }));
|
|
269
|
+
this.fileList.update((fileList) => {
|
|
270
|
+
fileList[0].update((file) => ({ ...file, isAvatar: true }));
|
|
290
271
|
return [...fileList];
|
|
291
272
|
});
|
|
292
273
|
}
|
|
@@ -309,7 +290,7 @@ export class LibsUiComponentsInputsUploadComponent {
|
|
|
309
290
|
this.imageEditorComponentRef.instance.outSaveFile.subscribe(async (result) => {
|
|
310
291
|
const messageError = !(await this.checkValidFileSize(result.file)) ? this.messageMaxSizeError() : undefined;
|
|
311
292
|
const nameFile = fileItem().file?.name || fileItem().name;
|
|
312
|
-
fileItem.update(data => ({ ...data, file: convertBlobToFile(result.file, nameFile), name: nameFile, origin_url: undefined, size: getLabelBySizeFile(result.file.size), error: messageError, url: result.url, isUpdate: true }));
|
|
293
|
+
fileItem.update((data) => ({ ...data, file: convertBlobToFile(result.file, nameFile), name: nameFile, origin_url: undefined, size: getLabelBySizeFile(result.file.size), error: messageError, url: result.url, isUpdate: true }));
|
|
313
294
|
this.outFileChanged.emit(this.fileList());
|
|
314
295
|
this.imageEditorComponentRef?.instance.outClose.emit({ isClickButtonClose: true });
|
|
315
296
|
});
|
|
@@ -374,7 +355,7 @@ export class LibsUiComponentsInputsUploadComponent {
|
|
|
374
355
|
this.messageError.set(this.messageTotalFileExceedsError());
|
|
375
356
|
return false;
|
|
376
357
|
}
|
|
377
|
-
const fileError = this.fileList().find(item => item().error);
|
|
358
|
+
const fileError = this.fileList().find((item) => item().error);
|
|
378
359
|
if (fileError) {
|
|
379
360
|
this.messageError.set(this.multiple() ? this.messageFileUploadError() : fileError().error);
|
|
380
361
|
return false;
|
|
@@ -384,12 +365,12 @@ export class LibsUiComponentsInputsUploadComponent {
|
|
|
384
365
|
}
|
|
385
366
|
async handlerSetAvatar(event, file) {
|
|
386
367
|
event.stopPropagation();
|
|
387
|
-
this.fileList().forEach(item => {
|
|
368
|
+
this.fileList().forEach((item) => {
|
|
388
369
|
if (item().id === file().id) {
|
|
389
|
-
item.update(file => ({ ...file, isAvatar: true }));
|
|
370
|
+
item.update((file) => ({ ...file, isAvatar: true }));
|
|
390
371
|
return;
|
|
391
372
|
}
|
|
392
|
-
item.update(file => ({ ...file, isAvatar: false }));
|
|
373
|
+
item.update((file) => ({ ...file, isAvatar: false }));
|
|
393
374
|
});
|
|
394
375
|
this.outFileChanged.emit(this.fileList());
|
|
395
376
|
}
|
|
@@ -416,22 +397,47 @@ export class LibsUiComponentsInputsUploadComponent {
|
|
|
416
397
|
this.uploadInputRef()?.nativeElement.setAttribute('accept', this.accessFiles());
|
|
417
398
|
}
|
|
418
399
|
// #endregion
|
|
400
|
+
// #region FUNCTIONS
|
|
401
|
+
get FunctionsControl() {
|
|
402
|
+
return {
|
|
403
|
+
checkIsValid: this.validate.bind(this),
|
|
404
|
+
removeAll: this.removeAllFile.bind(this),
|
|
405
|
+
uploading: async (process, id) => {
|
|
406
|
+
const fileUploading = this.fileList().find((file) => file().id === id);
|
|
407
|
+
if (fileUploading) {
|
|
408
|
+
fileUploading.update((file) => ({ ...file, percentUploading: process.percent, isUploading: process.percent !== 100 }));
|
|
409
|
+
}
|
|
410
|
+
},
|
|
411
|
+
setMessageError: async (message, id) => {
|
|
412
|
+
this.messageError.set(message);
|
|
413
|
+
if (id) {
|
|
414
|
+
const fileError = this.fileList().find((file) => file().id === id);
|
|
415
|
+
if (fileError) {
|
|
416
|
+
fileError.update((file) => ({ ...file, error: message }));
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
},
|
|
420
|
+
handlerUploadFile: this.showUploadPopup.bind(this),
|
|
421
|
+
};
|
|
422
|
+
}
|
|
423
|
+
// #endregion
|
|
419
424
|
ngOnDestroy() {
|
|
420
425
|
this.onDestroy.next();
|
|
421
426
|
this.onDestroy.complete();
|
|
422
427
|
}
|
|
423
428
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LibsUiComponentsInputsUploadComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
424
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: LibsUiComponentsInputsUploadComponent, isStandalone: true, selector: "libs_ui-components-inputs-upload", inputs: { originFiles: { classPropertyName: "originFiles", publicName: "originFiles", isSignal: true, isRequired: false, transformFunction: null }, fileType: { classPropertyName: "fileType", publicName: "fileType", isSignal: true, isRequired: false, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: true, isRequired: false, transformFunction: null }, canUploadIfHasExistFile: { classPropertyName: "canUploadIfHasExistFile", publicName: "canUploadIfHasExistFile", isSignal: true, isRequired: false, transformFunction: null }, canSetAvatar: { classPropertyName: "canSetAvatar", publicName: "canSetAvatar", isSignal: true, isRequired: false, transformFunction: null }, limitFile: { classPropertyName: "limitFile", publicName: "limitFile", isSignal: true, isRequired: false, transformFunction: null }, maxTotalSize: { classPropertyName: "maxTotalSize", publicName: "maxTotalSize", isSignal: true, isRequired: false, transformFunction: null }, maxImageSize: { classPropertyName: "maxImageSize", publicName: "maxImageSize", isSignal: true, isRequired: false, transformFunction: null }, maxVideoSize: { classPropertyName: "maxVideoSize", publicName: "maxVideoSize", isSignal: true, isRequired: false, transformFunction: null }, maxDocumentSize: { classPropertyName: "maxDocumentSize", publicName: "maxDocumentSize", isSignal: true, isRequired: false, transformFunction: null }, maxAudioSize: { classPropertyName: "maxAudioSize", publicName: "maxAudioSize", isSignal: true, isRequired: false, transformFunction: null }, imageExtList: { classPropertyName: "imageExtList", publicName: "imageExtList", isSignal: true, isRequired: false, transformFunction: null }, videoExtList: { classPropertyName: "videoExtList", publicName: "videoExtList", isSignal: true, isRequired: false, transformFunction: null }, documentExtList: { classPropertyName: "documentExtList", publicName: "documentExtList", isSignal: true, isRequired: false, transformFunction: null }, audioExtList: { classPropertyName: "audioExtList", publicName: "audioExtList", isSignal: true, isRequired: false, transformFunction: null }, classIncludeListItem: { classPropertyName: "classIncludeListItem", publicName: "classIncludeListItem", isSignal: true, isRequired: false, transformFunction: null }, validRequired: { classPropertyName: "validRequired", publicName: "validRequired", 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 }, aspectRatio: { classPropertyName: "aspectRatio", publicName: "aspectRatio", isSignal: true, isRequired: false, transformFunction: null }, zIndex: { classPropertyName: "zIndex", publicName: "zIndex", isSignal: true, isRequired: false, transformFunction: null }, ignoreShowSizeFile: { classPropertyName: "ignoreShowSizeFile", publicName: "ignoreShowSizeFile", isSignal: true, isRequired: false, transformFunction: null }, allowShowPushMessageMaxSizeError: { classPropertyName: "allowShowPushMessageMaxSizeError", publicName: "allowShowPushMessageMaxSizeError", isSignal: true, isRequired: false, transformFunction: null }, messageTypeFileError: { classPropertyName: "messageTypeFileError", publicName: "messageTypeFileError", isSignal: true, isRequired: false, transformFunction: null }, messageMaxSizeError: { classPropertyName: "messageMaxSizeError", publicName: "messageMaxSizeError", isSignal: true, isRequired: false, transformFunction: null }, messageFileUploadError: { classPropertyName: "messageFileUploadError", publicName: "messageFileUploadError", isSignal: true, isRequired: false, transformFunction: null }, messageTotalFileExceedsError: { classPropertyName: "messageTotalFileExceedsError", publicName: "messageTotalFileExceedsError", isSignal: true, isRequired: false, transformFunction: null }, configDescriptionInputUpload: { classPropertyName: "configDescriptionInputUpload", publicName: "configDescriptionInputUpload", isSignal: true, isRequired: false, transformFunction: null }, modeDisplayFile: { classPropertyName: "modeDisplayFile", publicName: "modeDisplayFile", isSignal: true, isRequired: false, transformFunction: null }, descriptionFormatAndSizeFile: { classPropertyName: "descriptionFormatAndSizeFile", publicName: "descriptionFormatAndSizeFile", isSignal: true, isRequired: false, transformFunction: null }, showVideoDuration: { classPropertyName: "showVideoDuration", publicName: "showVideoDuration", isSignal: true, isRequired: false, transformFunction: null }, labelConfig: { classPropertyName: "labelConfig", publicName: "labelConfig", isSignal: true, isRequired: false, transformFunction: null }, showPopupUploadWhenHasFileAndModeSingle: { classPropertyName: "showPopupUploadWhenHasFileAndModeSingle", publicName: "showPopupUploadWhenHasFileAndModeSingle", isSignal: true, isRequired: false, transformFunction: null }, ignoreIconRemove: { classPropertyName: "ignoreIconRemove", publicName: "ignoreIconRemove", isSignal: true, isRequired: false, transformFunction: null }, ignoreIconEdit: { classPropertyName: "ignoreIconEdit", publicName: "ignoreIconEdit", isSignal: true, isRequired: false, transformFunction: null }, ignoreIconPreview: { classPropertyName: "ignoreIconPreview", publicName: "ignoreIconPreview", isSignal: true, isRequired: false, transformFunction: null }, classIncludeFileContent: { classPropertyName: "classIncludeFileContent", publicName: "classIncludeFileContent", isSignal: true, isRequired: false, transformFunction: null }, showBorderErrorAllItemWhenError: { classPropertyName: "showBorderErrorAllItemWhenError", publicName: "showBorderErrorAllItemWhenError", isSignal: true, isRequired: false, transformFunction: null }, configDownloadSampleFile: { classPropertyName: "configDownloadSampleFile", publicName: "configDownloadSampleFile", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { outClose: "outClose", outFileChanged: "outFileChanged", outFileRemoved: "outFileRemoved", outFunctionsControl: "outFunctionsControl" }, viewQueries: [{ propertyName: "uploadRef", first: true, predicate: ["upload"], descendants: true, isSignal: true }, { propertyName: "uploadInputRef", first: true, predicate: ["uploadInput"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"flex flex-col w-full h-full\">\n <div>\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 [labelRight]=\"labelConfig.labelRight\"\n [labelRightClass]=\"labelConfig.labelRightClass\"\n [onlyShowCount]=\"labelConfig.onlyShowCount\"\n [buttonsLeft]=\"labelConfig.buttonsLeft\"\n [buttonsRight]=\"labelConfig.buttonsRight\"\n [disableButtonsLeft]=\"labelConfig.disableButtonsLeft || disable() || readonly() \"\n [disableButtonsRight]=\"labelConfig.disableButtonsRight || disable() || readonly() \"\n [hasToggle]=\"labelConfig.hasToggle\"\n [toggleActive]=\"labelConfig.toggleActive\"\n [toggleDisable]=\"labelConfig.toggleDisable || disable() || readonly() \"\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() || readonly() \"\n [buttonsDescriptionContainerClass]=\"labelConfig.buttonsDescriptionContainerClass\"\n [count]=\"labelConfig.count\" />\n }\n @if ((!configDownloadSampleFile()?.position || configDownloadSampleFile()?.position === 'top') && configDownloadSampleFile();as configDownloadSampleFile) {\n <libs_ui-components-buttons-button [type]=\"'button-link-primary'\"\n [classLabel]=\"'libs-ui-font-h7m'\"\n [classInclude]=\"'!mb-[8px] !p-0'\"\n [classIconLeft]=\"'libs-ui-icon-attachment before:!text-[12px]'\"\n [label]=\"configDownloadSampleFile?.title || ' '\"\n (outClick)=\"handlerDownloadSampleFile($event)\" />\n }\n @if (multiple() || !showPopupUploadWhenHasFileAndModeSingle() || (!fileList().length && !multiple())) {\n <div #upload\n LibsUiComponentsInputsUploadDirective\n LibsUiComponentsInputsUploadDropFileDirective\n class=\"libs-ui-components-inputs-upload\"\n [class.libs-ui-components-inputs-upload-disable]=\"disable() || readonly() || (!multiple() && fileList().length && !canUploadIfHasExistFile())\"\n [class.libs-ui-components-inputs-upload-readonly]=\"readonly()\"\n [class.libs-ui-components-inputs-upload-error]=\"messageError()\"\n [multiple]=\"multiple()\"\n [accessFiles]=\"accessFiles()\"\n (outUploadFiles)=\"handleUploadFiles($event)\"\n (outUploadFile)=\"handleUploadFiles([$event])\"\n (outDragOver)=\"handlerSetClassDrag(true)\"\n (outDragLeave)=\"handlerSetClassDrag(false)\"\n (outDrop)=\"handlerSetClassDrag(false)\"\n (outDropFiles)=\"handleUploadFiles($event)\"\n (outDropFile)=\"handleUploadFiles([$event])\">\n <div class=\"flex items-center\">\n <div class=\"mr-[16px]\">\n <i class=\"libs-ui-components-inputs-upload-icon libs-ui-icon-file-upload before:!text-[32px]\"></i>\n </div>\n <div class=\"libs-ui-components-inputs-upload-description\">\n <div class=\"mb-[4px] libs-ui-font-h6m\"\n [innerHTML]=\"(configDescriptionInputUpload().message || '') | translate:configDescriptionInputUpload().interpolateParams\">\n </div>\n @for (item of descriptionFormatAndSizeFileComputed(); track item; let last = $last) {\n <div class=\"libs-ui-font-h7r\"\n [class.mb-[4px]]=\"!last\"\n [innerHTML]=\"item.message | translate:item.interpolateParams\">\n </div>\n }\n </div>\n </div>\n @if (multiple()) {\n <input #uploadInput\n class=\"upload-input hidden\"\n type=\"file\"\n name=\"files[]\"\n multiple\n [accept]=\"accessFiles()\" />\n } @else {\n <input #uploadInput\n class=\"upload-input hidden\"\n type=\"file\"\n name=\"files[]\"\n [accept]=\"accessFiles()\" />\n }\n </div>\n }\n @if (messageError() && (multiple() || !showPopupUploadWhenHasFileAndModeSingle() || (!fileList().length && !multiple()))) {\n <div class=\"mt-[8px] text-[#ee2d41] libs-ui-font-h7r\">\n {{ (messageError() || '') | translate:{ value: limitFile() } }}\n </div>\n }\n @if (configDownloadSampleFile()?.position === 'bottom' && configDownloadSampleFile();as configDownloadSampleFile) {\n <libs_ui-components-buttons-button [type]=\"'button-link-primary'\"\n [classLabel]=\"'libs-ui-font-h7m'\"\n [classInclude]=\"'!mt-[8px] !p-0'\"\n [classIconLeft]=\"'libs-ui-icon-attachment before:!text-[12px]'\"\n [label]=\"configDownloadSampleFile.title || ' '\"\n (moClick)=\"handlerDownloadSampleFile($event)\" />\n }\n </div>\n @if (fileList().length) {\n <div LibsUiComponentsScrollOverlayDirective\n class=\"relative w-full h-full px-[10px] libs-ui-components-inputs-upload-view-list {{ classIncludeFileContent() || '' }}\"\n [class.mt-[12px]]=\"multiple() || !showPopupUploadWhenHasFileAndModeSingle()\">\n <ng-content select=\"[label-file]\"></ng-content>\n @for (item of fileList(); track item(); let first = $first) {\n <div class=\"libs-ui-components-inputs-upload-view-list-item {{ classIncludeListItem() || '' }}\"\n [class.libs-ui-components-inputs-upload-file-full]=\"modeDisplayFile() === 'full'\"\n [class.libs-ui-components-inputs-upload-file-short]=\"modeDisplayFile() === 'short'\"\n [class.libs-ui-border-error-general]=\"item().error || (messageError() && showBorderErrorAllItemWhenError())\"\n [class.mt-0]=\"first && !multiple() && !showPopupUploadWhenHasFileAndModeSingle()\">\n\n <div class=\"flex w-full\">\n <div class=\"flex items-center\">\n @if (canSetAvatar() && item().type === 'image') {\n <libs_ui-components-buttons-button [type]=\"'button-link-third'\"\n [classIconLeft]=\"'!mr-0' + (item().isAvatar ? ' libs-ui-icon-check-circle-solid before:!text-[#00bc62]': ' libs-ui-icon-check-circle-outline') + ((disable() || readonly() || item().isUploading || !!item().error) ? ' libs-ui-disable' : '')\"\n [popover]=\"{config:{ content: item().isAvatar ? 'i18n_avatar' : 'i18n_choose_as_your_avatar', zIndex: zIndex()}}\"\n [classInclude]=\"'!mr-[12px] !p-0'\"\n [disable]=\"disable() || readonly() || item().isUploading || !!item().error\"\n (outClick)=\"handlerSetAvatar($event, item)\" />\n }\n </div>\n <div class=\"flex\"\n [class.w-[calc(100%-28px)]]=\"canSetAvatar()\"\n [class.w-full]=\"!canSetAvatar()\">\n @if (modeDisplayFile() === 'full') {\n <libs_ui-components-inputs-upload-avatar [disable]=\"disable() || readonly() \"\n [(item)]=\"item\"\n [showVideoDuration]=\"showVideoDuration()\"\n (outOpenPreview)=\"handlerOpenPreviewFile($event)\" />\n }\n <div class=\"relative w-full\">\n <div class=\"flex absolute w-full h-full flex-col\"\n [class.flex-col]=\"modeDisplayFile() === 'full'\"\n [class.justify-center]=\"modeDisplayFile() === 'full'\"\n [class.items-center]=\"modeDisplayFile() === 'short'\">\n <libs_ui-components-label class=\"flex w-full\"\n [labelLeft]=\"item().name\"\n [zIndexPopover]=\"zIndex() + 1\"\n [labelLeftClass]=\"'libs-ui-font-h6m ' + ((disable() || readonly() || item().isUploading || item().error) ? 'text-[#6a7383]' : 'text-[#071631]')\"\n [classInclude]=\"modeDisplayFile() === 'short' ? '!mb-0' : ''\" />\n\n @if (!ignoreShowSizeFile()) {\n <div class=\"text-[#9ca2ad] libs-ui-font-h7r shrink-0\"\n [class.flex]=\"modeDisplayFile() === 'full'\"\n [class.items-center]=\"modeDisplayFile() === 'short'\"\n [class.ml-[12px]]=\"modeDisplayFile() === 'short'\">\n {{ item().size }}\n </div>\n }\n </div>\n </div>\n @if (item().isUploading && item().percentUploading) {\n <div class=\"flex items-center ml-[16px]\"\n [class.mr-[26px]]=\"modeDisplayFile() === 'full'\">\n <div class=\"w-[120px] h-[4px] rounded-[4px] bg-[#f8f9fa] relative\">\n <div class=\"absolute top-0 left-0 h-[4px] rounded-[4px] bg-[#00bc62]\"\n [style.width.px]=\"(item().percentUploading ?? 0)*1.2\"></div>\n </div>\n </div>\n }\n </div>\n </div>\n\n <div class=\"flex ml-[16px]\">\n @if (!ignoreIconPreview()) {\n <libs_ui-components-buttons-button [type]=\"'button-link-third'\"\n [classIconLeft]=\"'libs-ui-icon-eye-outline !mr-0'\"\n [popover]=\"{config:{ content: 'i18n_preview', zIndex: zIndex()+1}}\"\n [classInclude]=\"'!p-0' + (ignoreIconRemove() && !ignoreIconEdit() ? '' : ' !mr-[12px]')\"\n [disable]=\"item().isUploading || disable() || readonly() \"\n (outClick)=\"handlerOpenPreviewFile(item())\" />\n }\n @if (item().type === 'image' && !item().error && !ignoreIconEdit()) {\n <libs_ui-components-buttons-button [type]=\"'button-link-third'\"\n [classIconLeft]=\"'libs-ui-icon-edit-line !mr-0'\"\n [popover]=\"{config:{ content: 'i18n_edit', zIndex: zIndex()+1}}\"\n [classInclude]=\"'!p-0' + (ignoreIconRemove() ? '' : ' !mr-[12px]')\"\n [disable]=\"item().isUploading || disable() || readonly() \"\n (outClick)=\"handlerEditImage($event, item)\" />\n }\n @if (!ignoreIconRemove()) {\n <libs_ui-components-buttons-button [type]=\"'button-link-third'\"\n [classIconLeft]=\"'libs-ui-icon-close !mr-0'\"\n [popover]=\"{config: {content: 'i18n_delete', zIndex: zIndex()+1}}\"\n [classInclude]=\"'!p-0'\"\n [disable]=\"item().isUploading || disable() || readonly() \"\n (outClick)=\"handlerRemoveFile($event, item)\" />\n }\n </div>\n </div>\n @if (item().error && (multiple() || showPopupUploadWhenHasFileAndModeSingle())) {\n <div class=\"mt-[8px] text-[#ee2d41] libs-ui-font-h7r\">{{ (item().error || ' ') | translate }}</div>\n }\n }\n </div>\n }\n</div>\n", styles: [":host ::ng-deep .libs-ui-components-inputs-upload{width:100%;padding:16px;display:flex;align-items:center;justify-content:center;border-radius:8px;cursor:pointer;background-color:#fff;border:1px dashed #e6e7ea}:host ::ng-deep .libs-ui-components-inputs-upload .libs-ui-components-inputs-upload-icon:before{color:#9ca2ad}:host ::ng-deep .libs-ui-components-inputs-upload .libs-ui-components-inputs-upload-description{color:#9ca2ad}:host ::ng-deep .libs-ui-components-inputs-upload .libs-ui-components-inputs-upload-description span{color:var(--libs-ui-color-default, #226ff5)}:host ::ng-deep .libs-ui-components-inputs-upload:hover,:host ::ng-deep .libs-ui-components-inputs-upload.libs-ui-components-inputs-upload-drag-over{background-color:var(--libs-ui-color-light-3, #f4f8ff);border:1px dashed var(--libs-ui-color-light-1, #226ff5)}:host ::ng-deep .libs-ui-components-inputs-upload:hover .libs-ui-components-inputs-upload-icon:before,:host ::ng-deep .libs-ui-components-inputs-upload.libs-ui-components-inputs-upload-drag-over .libs-ui-components-inputs-upload-icon:before{color:#cdd0d6}:host ::ng-deep .libs-ui-components-inputs-upload:hover .libs-ui-components-inputs-upload-description,:host ::ng-deep .libs-ui-components-inputs-upload.libs-ui-components-inputs-upload-drag-over .libs-ui-components-inputs-upload-description{color:#cdd0d6}:host ::ng-deep .libs-ui-components-inputs-upload:hover .libs-ui-components-inputs-upload-description span,:host ::ng-deep .libs-ui-components-inputs-upload.libs-ui-components-inputs-upload-drag-over .libs-ui-components-inputs-upload-description span{color:#cdd0d6}:host ::ng-deep .libs-ui-components-inputs-upload-disable{cursor:default!important;text-decoration:none;pointer-events:none;background-color:var(--libs-ui-background-disable, #f8f9fa)!important;border:1px dashed #e6e7ea!important}:host ::ng-deep .libs-ui-components-inputs-upload-disable .libs-ui-components-inputs-upload-icon:before{color:var(--libs-ui-text-disable, #9ca2ad)}:host ::ng-deep .libs-ui-components-inputs-upload-disable .libs-ui-components-inputs-upload-description{color:var(--libs-ui-text-disable, #9ca2ad)}:host ::ng-deep .libs-ui-components-inputs-upload-disable .libs-ui-components-inputs-upload-description span{color:var(--libs-ui-text-disable, #9ca2ad)}:host ::ng-deep .libs-ui-components-inputs-upload-readonly{cursor:default!important;text-decoration:none;pointer-events:none;background-color:var(--libs-ui-backgrond-realonly, #f8f9fa)!important;border:1px dashed #e6e7ea!important}:host ::ng-deep .libs-ui-components-inputs-upload-readonly .libs-ui-components-inputs-upload-icon:before{color:#cdd0d6}:host ::ng-deep .libs-ui-components-inputs-upload-readonly .libs-ui-components-inputs-upload-description{color:var(--libs-ui-text-realonly, #071631)}:host ::ng-deep .libs-ui-components-inputs-upload-readonly .libs-ui-components-inputs-upload-description span{color:var(--libs-ui-text-realonly, #071631)}:host ::ng-deep .libs-ui-components-inputs-upload-error{background-color:#fef5f6!important;border:1px dashed #ee2d41!important}:host ::ng-deep .libs-ui-components-inputs-upload-error .libs-ui-components-inputs-upload-icon:before{color:#cdd0d6}:host ::ng-deep .libs-ui-components-inputs-upload-error .libs-ui-components-inputs-upload-description{color:#cdd0d6}:host ::ng-deep .libs-ui-components-inputs-upload-error .libs-ui-components-inputs-upload-description span{color:#cdd0d6}:host ::ng-deep .libs-ui-components-inputs-upload-file-full{background-color:#fff;padding:8px 12px}:host ::ng-deep .libs-ui-components-inputs-upload-file-short{background-color:#f4f8ff;padding:6px 12px}.libs-ui-components-inputs-upload-view-list{overflow-y:auto;max-height:100%;padding:0 10px}.libs-ui-components-inputs-upload-view-list .libs-ui-components-inputs-upload-view-list-item{width:100%;display:flex;align-items:center;justify-content:center;border-radius:4px;margin-bottom:8px}.libs-ui-components-inputs-upload-view-list .libs-ui-components-inputs-upload-view-list-item:hover{background-color:#f8f9fa}\n"], dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "component", type: LibsUiComponentsButtonsButtonComponent, selector: "libs_ui-components-buttons-button", inputs: ["flagMouse", "type", "buttonCustom", "sizeButton", "label", "disable", "isPending", "imageLeft", "classInclude", "classIconLeft", "classIconRight", "classLabel", "iconOnlyType", "popover", "ignoreStopPropagationEvent", "zIndex", "widthLabelPopover", "styleIconLeft", "styleButton", "ignoreFocusWhenInputTab", "ignoreSetClickWhenShowPopover", "ignorePointerEvent", "isActive", "isHandlerEnterDocumentClickButton"], outputs: ["outClick", "outPopoverEvent", "outFunctionsControl"] }, { 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: LibsUiComponentsInputsUploadAvatarComponent, selector: "libs_ui-components-inputs-upload-avatar", inputs: ["item", "showVideoDuration", "disable", "size"], outputs: ["itemChange", "outOpenPreview"] }, { kind: "directive", type: LibsUiComponentsScrollOverlayDirective, selector: "[LibsUiComponentsScrollOverlayDirective]", inputs: ["debugMode", "ignoreInit", "classContainer", "options", "elementCheckScrollX", "elementCheckScrollY", "elementScroll"], outputs: ["outScroll", "outScrollX", "outScrollY", "outScrollTop", "outScrollBottom"] }, { kind: "directive", type: LibsUiComponentsInputsUploadDirective, selector: "[LibsUiComponentsInputsUploadDirective]", inputs: ["multiple", "accessFiles"], outputs: ["outUploadFiles", "outUploadFile"] }, { kind: "directive", type: LibsUiComponentsInputsUploadDropFileDirective, selector: "[LibsUiComponentsInputsUploadDropFileDirective]", inputs: ["multiple"], outputs: ["outDragOver", "outDragLeave", "outDrop", "outDropFiles", "outDropFile"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
429
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: LibsUiComponentsInputsUploadComponent, isStandalone: true, selector: "libs_ui-components-inputs-upload", inputs: { originFiles: { classPropertyName: "originFiles", publicName: "originFiles", isSignal: true, isRequired: false, transformFunction: null }, fileType: { classPropertyName: "fileType", publicName: "fileType", isSignal: true, isRequired: false, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: true, isRequired: false, transformFunction: null }, canUploadIfHasExistFile: { classPropertyName: "canUploadIfHasExistFile", publicName: "canUploadIfHasExistFile", isSignal: true, isRequired: false, transformFunction: null }, canSetAvatar: { classPropertyName: "canSetAvatar", publicName: "canSetAvatar", isSignal: true, isRequired: false, transformFunction: null }, limitFile: { classPropertyName: "limitFile", publicName: "limitFile", isSignal: true, isRequired: false, transformFunction: null }, maxTotalSize: { classPropertyName: "maxTotalSize", publicName: "maxTotalSize", isSignal: true, isRequired: false, transformFunction: null }, maxImageSize: { classPropertyName: "maxImageSize", publicName: "maxImageSize", isSignal: true, isRequired: false, transformFunction: null }, maxVideoSize: { classPropertyName: "maxVideoSize", publicName: "maxVideoSize", isSignal: true, isRequired: false, transformFunction: null }, maxDocumentSize: { classPropertyName: "maxDocumentSize", publicName: "maxDocumentSize", isSignal: true, isRequired: false, transformFunction: null }, maxAudioSize: { classPropertyName: "maxAudioSize", publicName: "maxAudioSize", isSignal: true, isRequired: false, transformFunction: null }, imageExtList: { classPropertyName: "imageExtList", publicName: "imageExtList", isSignal: true, isRequired: false, transformFunction: null }, videoExtList: { classPropertyName: "videoExtList", publicName: "videoExtList", isSignal: true, isRequired: false, transformFunction: null }, documentExtList: { classPropertyName: "documentExtList", publicName: "documentExtList", isSignal: true, isRequired: false, transformFunction: null }, audioExtList: { classPropertyName: "audioExtList", publicName: "audioExtList", isSignal: true, isRequired: false, transformFunction: null }, classIncludeListItem: { classPropertyName: "classIncludeListItem", publicName: "classIncludeListItem", isSignal: true, isRequired: false, transformFunction: null }, validRequired: { classPropertyName: "validRequired", publicName: "validRequired", 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 }, aspectRatio: { classPropertyName: "aspectRatio", publicName: "aspectRatio", isSignal: true, isRequired: false, transformFunction: null }, zIndex: { classPropertyName: "zIndex", publicName: "zIndex", isSignal: true, isRequired: false, transformFunction: null }, ignoreShowSizeFile: { classPropertyName: "ignoreShowSizeFile", publicName: "ignoreShowSizeFile", isSignal: true, isRequired: false, transformFunction: null }, allowShowPushMessageMaxSizeError: { classPropertyName: "allowShowPushMessageMaxSizeError", publicName: "allowShowPushMessageMaxSizeError", isSignal: true, isRequired: false, transformFunction: null }, messageTypeFileError: { classPropertyName: "messageTypeFileError", publicName: "messageTypeFileError", isSignal: true, isRequired: false, transformFunction: null }, messageMaxSizeError: { classPropertyName: "messageMaxSizeError", publicName: "messageMaxSizeError", isSignal: true, isRequired: false, transformFunction: null }, messageFileUploadError: { classPropertyName: "messageFileUploadError", publicName: "messageFileUploadError", isSignal: true, isRequired: false, transformFunction: null }, messageTotalFileExceedsError: { classPropertyName: "messageTotalFileExceedsError", publicName: "messageTotalFileExceedsError", isSignal: true, isRequired: false, transformFunction: null }, configDescriptionInputUpload: { classPropertyName: "configDescriptionInputUpload", publicName: "configDescriptionInputUpload", isSignal: true, isRequired: false, transformFunction: null }, modeDisplayFile: { classPropertyName: "modeDisplayFile", publicName: "modeDisplayFile", isSignal: true, isRequired: false, transformFunction: null }, descriptionFormatAndSizeFile: { classPropertyName: "descriptionFormatAndSizeFile", publicName: "descriptionFormatAndSizeFile", isSignal: true, isRequired: false, transformFunction: null }, showVideoDuration: { classPropertyName: "showVideoDuration", publicName: "showVideoDuration", isSignal: true, isRequired: false, transformFunction: null }, labelConfig: { classPropertyName: "labelConfig", publicName: "labelConfig", isSignal: true, isRequired: false, transformFunction: null }, showPopupUploadWhenHasFileAndModeSingle: { classPropertyName: "showPopupUploadWhenHasFileAndModeSingle", publicName: "showPopupUploadWhenHasFileAndModeSingle", isSignal: true, isRequired: false, transformFunction: null }, ignoreIconRemove: { classPropertyName: "ignoreIconRemove", publicName: "ignoreIconRemove", isSignal: true, isRequired: false, transformFunction: null }, ignoreIconEdit: { classPropertyName: "ignoreIconEdit", publicName: "ignoreIconEdit", isSignal: true, isRequired: false, transformFunction: null }, ignoreIconPreview: { classPropertyName: "ignoreIconPreview", publicName: "ignoreIconPreview", isSignal: true, isRequired: false, transformFunction: null }, classIncludeFileContent: { classPropertyName: "classIncludeFileContent", publicName: "classIncludeFileContent", isSignal: true, isRequired: false, transformFunction: null }, showBorderErrorAllItemWhenError: { classPropertyName: "showBorderErrorAllItemWhenError", publicName: "showBorderErrorAllItemWhenError", isSignal: true, isRequired: false, transformFunction: null }, configDownloadSampleFile: { classPropertyName: "configDownloadSampleFile", publicName: "configDownloadSampleFile", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { outClose: "outClose", outFileChanged: "outFileChanged", outFileRemoved: "outFileRemoved", outFunctionsControl: "outFunctionsControl" }, viewQueries: [{ propertyName: "uploadRef", first: true, predicate: ["upload"], descendants: true, isSignal: true }, { propertyName: "uploadInputRef", first: true, predicate: ["uploadInput"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"flex flex-col w-full h-full\">\n <div>\n @if (labelConfig(); as labelConfig) {\n <libs_ui-components-label\n [classInclude]=\"labelConfig.classInclude\"\n [labelLeft]=\"labelConfig.labelLeft\"\n [labelLeftClass]=\"labelConfig.labelLeftClass\"\n [required]=\"labelConfig.required\"\n [description]=\"labelConfig.description\"\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() || readonly()\"\n [disableButtonsRight]=\"labelConfig.disableButtonsRight || disable() || readonly()\"\n [hasToggle]=\"labelConfig.hasToggle\"\n [toggleActive]=\"labelConfig.toggleActive\"\n [toggleDisable]=\"labelConfig.toggleDisable || disable() || readonly()\"\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() || readonly()\"\n [buttonsDescriptionContainerClass]=\"labelConfig.buttonsDescriptionContainerClass\"\n [count]=\"labelConfig.count\" />\n }\n @if ((!configDownloadSampleFile()?.position || configDownloadSampleFile()?.position === 'top') && configDownloadSampleFile(); as configDownloadSampleFile) {\n <libs_ui-components-buttons-button\n [type]=\"'button-link-primary'\"\n [classLabel]=\"'libs-ui-font-h7m'\"\n [classInclude]=\"'!mb-[8px] !p-0'\"\n [classIconLeft]=\"'libs-ui-icon-attachment before:!text-[12px]'\"\n [label]=\"configDownloadSampleFile?.title || ' '\"\n (outClick)=\"handlerDownloadSampleFile($event)\" />\n }\n @if (multiple() || !showPopupUploadWhenHasFileAndModeSingle() || (!fileList().length && !multiple())) {\n <div\n #upload\n LibsUiComponentsInputsUploadDirective\n LibsUiComponentsInputsUploadDropFileDirective\n class=\"libs-ui-components-inputs-upload\"\n [class.libs-ui-components-inputs-upload-disable]=\"disable() || readonly() || (!multiple() && fileList().length && !canUploadIfHasExistFile())\"\n [class.libs-ui-components-inputs-upload-readonly]=\"readonly()\"\n [class.libs-ui-components-inputs-upload-error]=\"messageError()\"\n [multiple]=\"multiple()\"\n [accessFiles]=\"accessFiles()\"\n (outUploadFiles)=\"handleUploadFiles($event)\"\n (outUploadFile)=\"handleUploadFiles([$event])\"\n (outDragOver)=\"handlerSetClassDrag(true)\"\n (outDragLeave)=\"handlerSetClassDrag(false)\"\n (outDrop)=\"handlerSetClassDrag(false)\"\n (outDropFiles)=\"handleUploadFiles($event)\"\n (outDropFile)=\"handleUploadFiles([$event])\">\n <div class=\"flex items-center\">\n <div class=\"mr-[16px]\">\n <i class=\"libs-ui-components-inputs-upload-icon libs-ui-icon-file-upload before:!text-[32px]\"></i>\n </div>\n <div class=\"libs-ui-components-inputs-upload-description\">\n <div\n class=\"mb-[4px] libs-ui-font-h6m\"\n [innerHTML]=\"configDescriptionInputUpload().message || '' | translate: configDescriptionInputUpload().interpolateParams\"></div>\n @for (item of descriptionFormatAndSizeFileComputed(); track item; let last = $last) {\n <div\n class=\"libs-ui-font-h7r\"\n [class.mb-[4px]]=\"!last\"\n [innerHTML]=\"item.message | translate: item.interpolateParams\"></div>\n }\n </div>\n </div>\n @if (multiple()) {\n <input\n #uploadInput\n class=\"upload-input hidden\"\n type=\"file\"\n name=\"files[]\"\n multiple\n [accept]=\"accessFiles()\" />\n } @else {\n <input\n #uploadInput\n class=\"upload-input hidden\"\n type=\"file\"\n name=\"files[]\"\n [accept]=\"accessFiles()\" />\n }\n </div>\n }\n @if (messageError() && (multiple() || !showPopupUploadWhenHasFileAndModeSingle() || (!fileList().length && !multiple()))) {\n <div class=\"mt-[8px] text-[#ee2d41] libs-ui-font-h7r\">\n {{ messageError() || '' | translate: { value: limitFile() } }}\n </div>\n }\n @if (configDownloadSampleFile()?.position === 'bottom' && configDownloadSampleFile(); as configDownloadSampleFile) {\n <libs_ui-components-buttons-button\n [type]=\"'button-link-primary'\"\n [classLabel]=\"'libs-ui-font-h7m'\"\n [classInclude]=\"'!mt-[8px] !p-0'\"\n [classIconLeft]=\"'libs-ui-icon-attachment before:!text-[12px]'\"\n [label]=\"configDownloadSampleFile.title || ' '\"\n (moClick)=\"handlerDownloadSampleFile($event)\" />\n }\n </div>\n @if (fileList().length) {\n <div\n LibsUiComponentsScrollOverlayDirective\n class=\"relative w-full h-full px-[10px] libs-ui-components-inputs-upload-view-list {{ classIncludeFileContent() || '' }}\"\n [class.mt-[12px]]=\"multiple() || !showPopupUploadWhenHasFileAndModeSingle()\">\n <ng-content select=\"[label-file]\"></ng-content>\n @for (item of fileList(); track item(); let first = $first) {\n <div\n class=\"libs-ui-components-inputs-upload-view-list-item {{ classIncludeListItem() || '' }}\"\n [class.libs-ui-components-inputs-upload-file-full]=\"modeDisplayFile() === 'full'\"\n [class.libs-ui-components-inputs-upload-file-short]=\"modeDisplayFile() === 'short'\"\n [class.libs-ui-border-error-general]=\"item().error || (messageError() && showBorderErrorAllItemWhenError())\"\n [class.mt-0]=\"first && !multiple() && !showPopupUploadWhenHasFileAndModeSingle()\">\n <div class=\"flex w-full\">\n <div class=\"flex items-center\">\n @if (canSetAvatar() && item().type === 'image') {\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [classIconLeft]=\"\n '!mr-0' + (item().isAvatar ? ' libs-ui-icon-check-circle-solid before:!text-[#00bc62]' : ' libs-ui-icon-check-circle-outline') + (disable() || readonly() || item().isUploading || !!item().error ? ' libs-ui-disable' : '')\n \"\n [popover]=\"{ config: { content: item().isAvatar ? 'i18n_avatar' : 'i18n_choose_as_your_avatar', zIndex: zIndex() } }\"\n [classInclude]=\"'!mr-[12px] !p-0'\"\n [disable]=\"disable() || readonly() || item().isUploading || !!item().error\"\n (outClick)=\"handlerSetAvatar($event, item)\" />\n }\n </div>\n <div\n class=\"flex\"\n [class.w-[calc(100%-28px)]]=\"canSetAvatar()\"\n [class.w-full]=\"!canSetAvatar()\">\n @if (modeDisplayFile() === 'full') {\n <libs_ui-components-inputs-upload-avatar\n [disable]=\"disable() || readonly()\"\n [(item)]=\"item\"\n [showVideoDuration]=\"showVideoDuration()\"\n (outOpenPreview)=\"handlerOpenPreviewFile($event)\" />\n }\n <div class=\"relative w-full\">\n <div\n class=\"flex absolute w-full h-full flex-col\"\n [class.flex-col]=\"modeDisplayFile() === 'full'\"\n [class.justify-center]=\"modeDisplayFile() === 'full'\"\n [class.items-center]=\"modeDisplayFile() === 'short'\">\n <libs_ui-components-label\n class=\"flex w-full\"\n [labelLeft]=\"item().name\"\n [zIndexPopover]=\"zIndex() + 1\"\n [labelLeftClass]=\"'libs-ui-font-h6m ' + (disable() || readonly() || item().isUploading || item().error ? 'text-[#6a7383]' : 'text-[#071631]')\"\n [classInclude]=\"modeDisplayFile() === 'short' ? '!mb-0' : ''\" />\n\n @if (!ignoreShowSizeFile()) {\n <div\n class=\"text-[#9ca2ad] libs-ui-font-h7r shrink-0\"\n [class.flex]=\"modeDisplayFile() === 'full'\"\n [class.items-center]=\"modeDisplayFile() === 'short'\"\n [class.ml-[12px]]=\"modeDisplayFile() === 'short'\">\n {{ item().size }}\n </div>\n }\n </div>\n </div>\n @if (item().isUploading && item().percentUploading) {\n <div\n class=\"flex items-center ml-[16px]\"\n [class.mr-[26px]]=\"modeDisplayFile() === 'full'\">\n <div class=\"w-[120px] h-[4px] rounded-[4px] bg-[#f8f9fa] relative\">\n <div\n class=\"absolute top-0 left-0 h-[4px] rounded-[4px] bg-[#00bc62]\"\n [style.width.px]=\"(item().percentUploading ?? 0) * 1.2\"></div>\n </div>\n </div>\n }\n </div>\n </div>\n\n <div class=\"flex ml-[16px]\">\n @if (!ignoreIconPreview()) {\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [classIconLeft]=\"'libs-ui-icon-eye-outline !mr-0'\"\n [popover]=\"{ config: { content: 'i18n_preview', zIndex: zIndex() + 1 } }\"\n [classInclude]=\"'!p-0' + (ignoreIconRemove() && !ignoreIconEdit() ? '' : ' !mr-[12px]')\"\n [disable]=\"item().isUploading || disable() || readonly()\"\n (outClick)=\"handlerOpenPreviewFile(item())\" />\n }\n @if (item().type === 'image' && !item().error && !ignoreIconEdit()) {\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [classIconLeft]=\"'libs-ui-icon-edit-line !mr-0'\"\n [popover]=\"{ config: { content: 'i18n_edit', zIndex: zIndex() + 1 } }\"\n [classInclude]=\"'!p-0' + (ignoreIconRemove() ? '' : ' !mr-[12px]')\"\n [disable]=\"item().isUploading || disable() || readonly()\"\n (outClick)=\"handlerEditImage($event, item)\" />\n }\n @if (!ignoreIconRemove()) {\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [classIconLeft]=\"'libs-ui-icon-close !mr-0'\"\n [popover]=\"{ config: { content: 'i18n_delete', zIndex: zIndex() + 1 } }\"\n [classInclude]=\"'!p-0'\"\n [disable]=\"item().isUploading || disable() || readonly()\"\n (outClick)=\"handlerRemoveFile($event, item)\" />\n }\n </div>\n </div>\n @if (item().error && (multiple() || showPopupUploadWhenHasFileAndModeSingle())) {\n <div class=\"mt-[8px] text-[#ee2d41] libs-ui-font-h7r\">{{ item().error || ' ' | translate }}</div>\n }\n }\n </div>\n }\n</div>\n", styles: [":host ::ng-deep .libs-ui-components-inputs-upload{width:100%;padding:16px;display:flex;align-items:center;justify-content:center;border-radius:8px;cursor:pointer;background-color:#fff;border:1px dashed #e6e7ea}:host ::ng-deep .libs-ui-components-inputs-upload .libs-ui-components-inputs-upload-icon:before{color:#9ca2ad}:host ::ng-deep .libs-ui-components-inputs-upload .libs-ui-components-inputs-upload-description{color:#9ca2ad}:host ::ng-deep .libs-ui-components-inputs-upload .libs-ui-components-inputs-upload-description span{color:var(--libs-ui-color-default, #226ff5)}:host ::ng-deep .libs-ui-components-inputs-upload:hover,:host ::ng-deep .libs-ui-components-inputs-upload.libs-ui-components-inputs-upload-drag-over{background-color:var(--libs-ui-color-light-3, #f4f8ff);border:1px dashed var(--libs-ui-color-light-1, #226ff5)}:host ::ng-deep .libs-ui-components-inputs-upload:hover .libs-ui-components-inputs-upload-icon:before,:host ::ng-deep .libs-ui-components-inputs-upload.libs-ui-components-inputs-upload-drag-over .libs-ui-components-inputs-upload-icon:before{color:#cdd0d6}:host ::ng-deep .libs-ui-components-inputs-upload:hover .libs-ui-components-inputs-upload-description,:host ::ng-deep .libs-ui-components-inputs-upload.libs-ui-components-inputs-upload-drag-over .libs-ui-components-inputs-upload-description{color:#cdd0d6}:host ::ng-deep .libs-ui-components-inputs-upload:hover .libs-ui-components-inputs-upload-description span,:host ::ng-deep .libs-ui-components-inputs-upload.libs-ui-components-inputs-upload-drag-over .libs-ui-components-inputs-upload-description span{color:#cdd0d6}:host ::ng-deep .libs-ui-components-inputs-upload-disable{cursor:default!important;text-decoration:none;pointer-events:none;background-color:var(--libs-ui-background-disable, #f8f9fa)!important;border:1px dashed #e6e7ea!important}:host ::ng-deep .libs-ui-components-inputs-upload-disable .libs-ui-components-inputs-upload-icon:before{color:var(--libs-ui-text-disable, #9ca2ad)}:host ::ng-deep .libs-ui-components-inputs-upload-disable .libs-ui-components-inputs-upload-description{color:var(--libs-ui-text-disable, #9ca2ad)}:host ::ng-deep .libs-ui-components-inputs-upload-disable .libs-ui-components-inputs-upload-description span{color:var(--libs-ui-text-disable, #9ca2ad)}:host ::ng-deep .libs-ui-components-inputs-upload-readonly{cursor:default!important;text-decoration:none;pointer-events:none;background-color:var(--libs-ui-backgrond-realonly, #f8f9fa)!important;border:1px dashed #e6e7ea!important}:host ::ng-deep .libs-ui-components-inputs-upload-readonly .libs-ui-components-inputs-upload-icon:before{color:#cdd0d6}:host ::ng-deep .libs-ui-components-inputs-upload-readonly .libs-ui-components-inputs-upload-description{color:var(--libs-ui-text-realonly, #071631)}:host ::ng-deep .libs-ui-components-inputs-upload-readonly .libs-ui-components-inputs-upload-description span{color:var(--libs-ui-text-realonly, #071631)}:host ::ng-deep .libs-ui-components-inputs-upload-error{background-color:#fef5f6!important;border:1px dashed #ee2d41!important}:host ::ng-deep .libs-ui-components-inputs-upload-error .libs-ui-components-inputs-upload-icon:before{color:#cdd0d6}:host ::ng-deep .libs-ui-components-inputs-upload-error .libs-ui-components-inputs-upload-description{color:#cdd0d6}:host ::ng-deep .libs-ui-components-inputs-upload-error .libs-ui-components-inputs-upload-description span{color:#cdd0d6}:host ::ng-deep .libs-ui-components-inputs-upload-file-full{background-color:#fff;padding:8px 12px}:host ::ng-deep .libs-ui-components-inputs-upload-file-short{background-color:#f4f8ff;padding:6px 12px}.libs-ui-components-inputs-upload-view-list{overflow-y:auto;max-height:100%;padding:0 10px}.libs-ui-components-inputs-upload-view-list .libs-ui-components-inputs-upload-view-list-item{width:100%;display:flex;align-items:center;justify-content:center;border-radius:4px;margin-bottom:8px}.libs-ui-components-inputs-upload-view-list .libs-ui-components-inputs-upload-view-list-item:hover{background-color:#f8f9fa}\n"], dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "component", type: LibsUiComponentsButtonsButtonComponent, selector: "libs_ui-components-buttons-button", inputs: ["flagMouse", "type", "buttonCustom", "sizeButton", "label", "disable", "isPending", "imageLeft", "classInclude", "classIconLeft", "classIconRight", "classLabel", "iconOnlyType", "popover", "ignoreStopPropagationEvent", "zIndex", "widthLabelPopover", "styleIconLeft", "styleButton", "ignoreFocusWhenInputTab", "ignoreSetClickWhenShowPopover", "ignorePointerEvent", "isActive", "isHandlerEnterDocumentClickButton"], outputs: ["outClick", "outPopoverEvent", "outFunctionsControl"] }, { 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: LibsUiComponentsInputsUploadAvatarComponent, selector: "libs_ui-components-inputs-upload-avatar", inputs: ["item", "showVideoDuration", "disable", "size"], outputs: ["itemChange", "outOpenPreview"] }, { kind: "directive", type: LibsUiComponentsScrollOverlayDirective, selector: "[LibsUiComponentsScrollOverlayDirective]", inputs: ["debugMode", "ignoreInit", "classContainer", "options", "elementCheckScrollX", "elementCheckScrollY", "elementScroll"], outputs: ["outScroll", "outScrollX", "outScrollY", "outScrollTop", "outScrollBottom"] }, { kind: "directive", type: LibsUiComponentsInputsUploadDirective, selector: "[LibsUiComponentsInputsUploadDirective]", inputs: ["multiple", "accessFiles"], outputs: ["outUploadFiles", "outUploadFile"] }, { kind: "directive", type: LibsUiComponentsInputsUploadDropFileDirective, selector: "[LibsUiComponentsInputsUploadDropFileDirective]", inputs: ["multiple"], outputs: ["outDragOver", "outDragLeave", "outDrop", "outDropFiles", "outDropFile"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
425
430
|
}
|
|
426
431
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LibsUiComponentsInputsUploadComponent, decorators: [{
|
|
427
432
|
type: Component,
|
|
428
|
-
args: [{ selector: 'libs_ui-components-inputs-upload', standalone: true, imports: [
|
|
433
|
+
args: [{ selector: 'libs_ui-components-inputs-upload', standalone: true, imports: [
|
|
434
|
+
TranslateModule,
|
|
429
435
|
LibsUiComponentsButtonsButtonComponent,
|
|
430
436
|
LibsUiComponentsLabelComponent,
|
|
431
437
|
LibsUiComponentsInputsUploadAvatarComponent,
|
|
432
438
|
LibsUiComponentsScrollOverlayDirective,
|
|
433
439
|
LibsUiComponentsInputsUploadDirective,
|
|
434
|
-
LibsUiComponentsInputsUploadDropFileDirective
|
|
435
|
-
], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"flex flex-col w-full h-full\">\n <div>\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 [labelRight]=\"labelConfig.labelRight\"\n [labelRightClass]=\"labelConfig.labelRightClass\"\n [onlyShowCount]=\"labelConfig.onlyShowCount\"\n [buttonsLeft]=\"labelConfig.buttonsLeft\"\n [buttonsRight]=\"labelConfig.buttonsRight\"\n [disableButtonsLeft]=\"labelConfig.disableButtonsLeft || disable() || readonly() \"\n [disableButtonsRight]=\"labelConfig.disableButtonsRight || disable() || readonly() \"\n [hasToggle]=\"labelConfig.hasToggle\"\n [toggleActive]=\"labelConfig.toggleActive\"\n [toggleDisable]=\"labelConfig.toggleDisable || disable() || readonly() \"\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() || readonly() \"\n [buttonsDescriptionContainerClass]=\"labelConfig.buttonsDescriptionContainerClass\"\n [count]=\"labelConfig.count\" />\n }\n @if ((!configDownloadSampleFile()?.position || configDownloadSampleFile()?.position === 'top') && configDownloadSampleFile();as configDownloadSampleFile) {\n <libs_ui-components-buttons-button [type]=\"'button-link-primary'\"\n [classLabel]=\"'libs-ui-font-h7m'\"\n [classInclude]=\"'!mb-[8px] !p-0'\"\n [classIconLeft]=\"'libs-ui-icon-attachment before:!text-[12px]'\"\n [label]=\"configDownloadSampleFile?.title || ' '\"\n (outClick)=\"handlerDownloadSampleFile($event)\" />\n }\n @if (multiple() || !showPopupUploadWhenHasFileAndModeSingle() || (!fileList().length && !multiple())) {\n <div #upload\n LibsUiComponentsInputsUploadDirective\n LibsUiComponentsInputsUploadDropFileDirective\n class=\"libs-ui-components-inputs-upload\"\n [class.libs-ui-components-inputs-upload-disable]=\"disable() || readonly() || (!multiple() && fileList().length && !canUploadIfHasExistFile())\"\n [class.libs-ui-components-inputs-upload-readonly]=\"readonly()\"\n [class.libs-ui-components-inputs-upload-error]=\"messageError()\"\n [multiple]=\"multiple()\"\n [accessFiles]=\"accessFiles()\"\n (outUploadFiles)=\"handleUploadFiles($event)\"\n (outUploadFile)=\"handleUploadFiles([$event])\"\n (outDragOver)=\"handlerSetClassDrag(true)\"\n (outDragLeave)=\"handlerSetClassDrag(false)\"\n (outDrop)=\"handlerSetClassDrag(false)\"\n (outDropFiles)=\"handleUploadFiles($event)\"\n (outDropFile)=\"handleUploadFiles([$event])\">\n <div class=\"flex items-center\">\n <div class=\"mr-[16px]\">\n <i class=\"libs-ui-components-inputs-upload-icon libs-ui-icon-file-upload before:!text-[32px]\"></i>\n </div>\n <div class=\"libs-ui-components-inputs-upload-description\">\n <div class=\"mb-[4px] libs-ui-font-h6m\"\n [innerHTML]=\"(configDescriptionInputUpload().message || '') | translate:configDescriptionInputUpload().interpolateParams\">\n </div>\n @for (item of descriptionFormatAndSizeFileComputed(); track item; let last = $last) {\n <div class=\"libs-ui-font-h7r\"\n [class.mb-[4px]]=\"!last\"\n [innerHTML]=\"item.message | translate:item.interpolateParams\">\n </div>\n }\n </div>\n </div>\n @if (multiple()) {\n <input #uploadInput\n class=\"upload-input hidden\"\n type=\"file\"\n name=\"files[]\"\n multiple\n [accept]=\"accessFiles()\" />\n } @else {\n <input #uploadInput\n class=\"upload-input hidden\"\n type=\"file\"\n name=\"files[]\"\n [accept]=\"accessFiles()\" />\n }\n </div>\n }\n @if (messageError() && (multiple() || !showPopupUploadWhenHasFileAndModeSingle() || (!fileList().length && !multiple()))) {\n <div class=\"mt-[8px] text-[#ee2d41] libs-ui-font-h7r\">\n {{ (messageError() || '') | translate:{ value: limitFile() } }}\n </div>\n }\n @if (configDownloadSampleFile()?.position === 'bottom' && configDownloadSampleFile();as configDownloadSampleFile) {\n <libs_ui-components-buttons-button [type]=\"'button-link-primary'\"\n [classLabel]=\"'libs-ui-font-h7m'\"\n [classInclude]=\"'!mt-[8px] !p-0'\"\n [classIconLeft]=\"'libs-ui-icon-attachment before:!text-[12px]'\"\n [label]=\"configDownloadSampleFile.title || ' '\"\n (moClick)=\"handlerDownloadSampleFile($event)\" />\n }\n </div>\n @if (fileList().length) {\n <div LibsUiComponentsScrollOverlayDirective\n class=\"relative w-full h-full px-[10px] libs-ui-components-inputs-upload-view-list {{ classIncludeFileContent() || '' }}\"\n [class.mt-[12px]]=\"multiple() || !showPopupUploadWhenHasFileAndModeSingle()\">\n <ng-content select=\"[label-file]\"></ng-content>\n @for (item of fileList(); track item(); let first = $first) {\n <div class=\"libs-ui-components-inputs-upload-view-list-item {{ classIncludeListItem() || '' }}\"\n [class.libs-ui-components-inputs-upload-file-full]=\"modeDisplayFile() === 'full'\"\n [class.libs-ui-components-inputs-upload-file-short]=\"modeDisplayFile() === 'short'\"\n [class.libs-ui-border-error-general]=\"item().error || (messageError() && showBorderErrorAllItemWhenError())\"\n [class.mt-0]=\"first && !multiple() && !showPopupUploadWhenHasFileAndModeSingle()\">\n\n <div class=\"flex w-full\">\n <div class=\"flex items-center\">\n @if (canSetAvatar() && item().type === 'image') {\n <libs_ui-components-buttons-button [type]=\"'button-link-third'\"\n [classIconLeft]=\"'!mr-0' + (item().isAvatar ? ' libs-ui-icon-check-circle-solid before:!text-[#00bc62]': ' libs-ui-icon-check-circle-outline') + ((disable() || readonly() || item().isUploading || !!item().error) ? ' libs-ui-disable' : '')\"\n [popover]=\"{config:{ content: item().isAvatar ? 'i18n_avatar' : 'i18n_choose_as_your_avatar', zIndex: zIndex()}}\"\n [classInclude]=\"'!mr-[12px] !p-0'\"\n [disable]=\"disable() || readonly() || item().isUploading || !!item().error\"\n (outClick)=\"handlerSetAvatar($event, item)\" />\n }\n </div>\n <div class=\"flex\"\n [class.w-[calc(100%-28px)]]=\"canSetAvatar()\"\n [class.w-full]=\"!canSetAvatar()\">\n @if (modeDisplayFile() === 'full') {\n <libs_ui-components-inputs-upload-avatar [disable]=\"disable() || readonly() \"\n [(item)]=\"item\"\n [showVideoDuration]=\"showVideoDuration()\"\n (outOpenPreview)=\"handlerOpenPreviewFile($event)\" />\n }\n <div class=\"relative w-full\">\n <div class=\"flex absolute w-full h-full flex-col\"\n [class.flex-col]=\"modeDisplayFile() === 'full'\"\n [class.justify-center]=\"modeDisplayFile() === 'full'\"\n [class.items-center]=\"modeDisplayFile() === 'short'\">\n <libs_ui-components-label class=\"flex w-full\"\n [labelLeft]=\"item().name\"\n [zIndexPopover]=\"zIndex() + 1\"\n [labelLeftClass]=\"'libs-ui-font-h6m ' + ((disable() || readonly() || item().isUploading || item().error) ? 'text-[#6a7383]' : 'text-[#071631]')\"\n [classInclude]=\"modeDisplayFile() === 'short' ? '!mb-0' : ''\" />\n\n @if (!ignoreShowSizeFile()) {\n <div class=\"text-[#9ca2ad] libs-ui-font-h7r shrink-0\"\n [class.flex]=\"modeDisplayFile() === 'full'\"\n [class.items-center]=\"modeDisplayFile() === 'short'\"\n [class.ml-[12px]]=\"modeDisplayFile() === 'short'\">\n {{ item().size }}\n </div>\n }\n </div>\n </div>\n @if (item().isUploading && item().percentUploading) {\n <div class=\"flex items-center ml-[16px]\"\n [class.mr-[26px]]=\"modeDisplayFile() === 'full'\">\n <div class=\"w-[120px] h-[4px] rounded-[4px] bg-[#f8f9fa] relative\">\n <div class=\"absolute top-0 left-0 h-[4px] rounded-[4px] bg-[#00bc62]\"\n [style.width.px]=\"(item().percentUploading ?? 0)*1.2\"></div>\n </div>\n </div>\n }\n </div>\n </div>\n\n <div class=\"flex ml-[16px]\">\n @if (!ignoreIconPreview()) {\n <libs_ui-components-buttons-button [type]=\"'button-link-third'\"\n [classIconLeft]=\"'libs-ui-icon-eye-outline !mr-0'\"\n [popover]=\"{config:{ content: 'i18n_preview', zIndex: zIndex()+1}}\"\n [classInclude]=\"'!p-0' + (ignoreIconRemove() && !ignoreIconEdit() ? '' : ' !mr-[12px]')\"\n [disable]=\"item().isUploading || disable() || readonly() \"\n (outClick)=\"handlerOpenPreviewFile(item())\" />\n }\n @if (item().type === 'image' && !item().error && !ignoreIconEdit()) {\n <libs_ui-components-buttons-button [type]=\"'button-link-third'\"\n [classIconLeft]=\"'libs-ui-icon-edit-line !mr-0'\"\n [popover]=\"{config:{ content: 'i18n_edit', zIndex: zIndex()+1}}\"\n [classInclude]=\"'!p-0' + (ignoreIconRemove() ? '' : ' !mr-[12px]')\"\n [disable]=\"item().isUploading || disable() || readonly() \"\n (outClick)=\"handlerEditImage($event, item)\" />\n }\n @if (!ignoreIconRemove()) {\n <libs_ui-components-buttons-button [type]=\"'button-link-third'\"\n [classIconLeft]=\"'libs-ui-icon-close !mr-0'\"\n [popover]=\"{config: {content: 'i18n_delete', zIndex: zIndex()+1}}\"\n [classInclude]=\"'!p-0'\"\n [disable]=\"item().isUploading || disable() || readonly() \"\n (outClick)=\"handlerRemoveFile($event, item)\" />\n }\n </div>\n </div>\n @if (item().error && (multiple() || showPopupUploadWhenHasFileAndModeSingle())) {\n <div class=\"mt-[8px] text-[#ee2d41] libs-ui-font-h7r\">{{ (item().error || ' ') | translate }}</div>\n }\n }\n </div>\n }\n</div>\n", styles: [":host ::ng-deep .libs-ui-components-inputs-upload{width:100%;padding:16px;display:flex;align-items:center;justify-content:center;border-radius:8px;cursor:pointer;background-color:#fff;border:1px dashed #e6e7ea}:host ::ng-deep .libs-ui-components-inputs-upload .libs-ui-components-inputs-upload-icon:before{color:#9ca2ad}:host ::ng-deep .libs-ui-components-inputs-upload .libs-ui-components-inputs-upload-description{color:#9ca2ad}:host ::ng-deep .libs-ui-components-inputs-upload .libs-ui-components-inputs-upload-description span{color:var(--libs-ui-color-default, #226ff5)}:host ::ng-deep .libs-ui-components-inputs-upload:hover,:host ::ng-deep .libs-ui-components-inputs-upload.libs-ui-components-inputs-upload-drag-over{background-color:var(--libs-ui-color-light-3, #f4f8ff);border:1px dashed var(--libs-ui-color-light-1, #226ff5)}:host ::ng-deep .libs-ui-components-inputs-upload:hover .libs-ui-components-inputs-upload-icon:before,:host ::ng-deep .libs-ui-components-inputs-upload.libs-ui-components-inputs-upload-drag-over .libs-ui-components-inputs-upload-icon:before{color:#cdd0d6}:host ::ng-deep .libs-ui-components-inputs-upload:hover .libs-ui-components-inputs-upload-description,:host ::ng-deep .libs-ui-components-inputs-upload.libs-ui-components-inputs-upload-drag-over .libs-ui-components-inputs-upload-description{color:#cdd0d6}:host ::ng-deep .libs-ui-components-inputs-upload:hover .libs-ui-components-inputs-upload-description span,:host ::ng-deep .libs-ui-components-inputs-upload.libs-ui-components-inputs-upload-drag-over .libs-ui-components-inputs-upload-description span{color:#cdd0d6}:host ::ng-deep .libs-ui-components-inputs-upload-disable{cursor:default!important;text-decoration:none;pointer-events:none;background-color:var(--libs-ui-background-disable, #f8f9fa)!important;border:1px dashed #e6e7ea!important}:host ::ng-deep .libs-ui-components-inputs-upload-disable .libs-ui-components-inputs-upload-icon:before{color:var(--libs-ui-text-disable, #9ca2ad)}:host ::ng-deep .libs-ui-components-inputs-upload-disable .libs-ui-components-inputs-upload-description{color:var(--libs-ui-text-disable, #9ca2ad)}:host ::ng-deep .libs-ui-components-inputs-upload-disable .libs-ui-components-inputs-upload-description span{color:var(--libs-ui-text-disable, #9ca2ad)}:host ::ng-deep .libs-ui-components-inputs-upload-readonly{cursor:default!important;text-decoration:none;pointer-events:none;background-color:var(--libs-ui-backgrond-realonly, #f8f9fa)!important;border:1px dashed #e6e7ea!important}:host ::ng-deep .libs-ui-components-inputs-upload-readonly .libs-ui-components-inputs-upload-icon:before{color:#cdd0d6}:host ::ng-deep .libs-ui-components-inputs-upload-readonly .libs-ui-components-inputs-upload-description{color:var(--libs-ui-text-realonly, #071631)}:host ::ng-deep .libs-ui-components-inputs-upload-readonly .libs-ui-components-inputs-upload-description span{color:var(--libs-ui-text-realonly, #071631)}:host ::ng-deep .libs-ui-components-inputs-upload-error{background-color:#fef5f6!important;border:1px dashed #ee2d41!important}:host ::ng-deep .libs-ui-components-inputs-upload-error .libs-ui-components-inputs-upload-icon:before{color:#cdd0d6}:host ::ng-deep .libs-ui-components-inputs-upload-error .libs-ui-components-inputs-upload-description{color:#cdd0d6}:host ::ng-deep .libs-ui-components-inputs-upload-error .libs-ui-components-inputs-upload-description span{color:#cdd0d6}:host ::ng-deep .libs-ui-components-inputs-upload-file-full{background-color:#fff;padding:8px 12px}:host ::ng-deep .libs-ui-components-inputs-upload-file-short{background-color:#f4f8ff;padding:6px 12px}.libs-ui-components-inputs-upload-view-list{overflow-y:auto;max-height:100%;padding:0 10px}.libs-ui-components-inputs-upload-view-list .libs-ui-components-inputs-upload-view-list-item{width:100%;display:flex;align-items:center;justify-content:center;border-radius:4px;margin-bottom:8px}.libs-ui-components-inputs-upload-view-list .libs-ui-components-inputs-upload-view-list-item:hover{background-color:#f8f9fa}\n"] }]
|
|
440
|
+
LibsUiComponentsInputsUploadDropFileDirective,
|
|
441
|
+
], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"flex flex-col w-full h-full\">\n <div>\n @if (labelConfig(); as labelConfig) {\n <libs_ui-components-label\n [classInclude]=\"labelConfig.classInclude\"\n [labelLeft]=\"labelConfig.labelLeft\"\n [labelLeftClass]=\"labelConfig.labelLeftClass\"\n [required]=\"labelConfig.required\"\n [description]=\"labelConfig.description\"\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() || readonly()\"\n [disableButtonsRight]=\"labelConfig.disableButtonsRight || disable() || readonly()\"\n [hasToggle]=\"labelConfig.hasToggle\"\n [toggleActive]=\"labelConfig.toggleActive\"\n [toggleDisable]=\"labelConfig.toggleDisable || disable() || readonly()\"\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() || readonly()\"\n [buttonsDescriptionContainerClass]=\"labelConfig.buttonsDescriptionContainerClass\"\n [count]=\"labelConfig.count\" />\n }\n @if ((!configDownloadSampleFile()?.position || configDownloadSampleFile()?.position === 'top') && configDownloadSampleFile(); as configDownloadSampleFile) {\n <libs_ui-components-buttons-button\n [type]=\"'button-link-primary'\"\n [classLabel]=\"'libs-ui-font-h7m'\"\n [classInclude]=\"'!mb-[8px] !p-0'\"\n [classIconLeft]=\"'libs-ui-icon-attachment before:!text-[12px]'\"\n [label]=\"configDownloadSampleFile?.title || ' '\"\n (outClick)=\"handlerDownloadSampleFile($event)\" />\n }\n @if (multiple() || !showPopupUploadWhenHasFileAndModeSingle() || (!fileList().length && !multiple())) {\n <div\n #upload\n LibsUiComponentsInputsUploadDirective\n LibsUiComponentsInputsUploadDropFileDirective\n class=\"libs-ui-components-inputs-upload\"\n [class.libs-ui-components-inputs-upload-disable]=\"disable() || readonly() || (!multiple() && fileList().length && !canUploadIfHasExistFile())\"\n [class.libs-ui-components-inputs-upload-readonly]=\"readonly()\"\n [class.libs-ui-components-inputs-upload-error]=\"messageError()\"\n [multiple]=\"multiple()\"\n [accessFiles]=\"accessFiles()\"\n (outUploadFiles)=\"handleUploadFiles($event)\"\n (outUploadFile)=\"handleUploadFiles([$event])\"\n (outDragOver)=\"handlerSetClassDrag(true)\"\n (outDragLeave)=\"handlerSetClassDrag(false)\"\n (outDrop)=\"handlerSetClassDrag(false)\"\n (outDropFiles)=\"handleUploadFiles($event)\"\n (outDropFile)=\"handleUploadFiles([$event])\">\n <div class=\"flex items-center\">\n <div class=\"mr-[16px]\">\n <i class=\"libs-ui-components-inputs-upload-icon libs-ui-icon-file-upload before:!text-[32px]\"></i>\n </div>\n <div class=\"libs-ui-components-inputs-upload-description\">\n <div\n class=\"mb-[4px] libs-ui-font-h6m\"\n [innerHTML]=\"configDescriptionInputUpload().message || '' | translate: configDescriptionInputUpload().interpolateParams\"></div>\n @for (item of descriptionFormatAndSizeFileComputed(); track item; let last = $last) {\n <div\n class=\"libs-ui-font-h7r\"\n [class.mb-[4px]]=\"!last\"\n [innerHTML]=\"item.message | translate: item.interpolateParams\"></div>\n }\n </div>\n </div>\n @if (multiple()) {\n <input\n #uploadInput\n class=\"upload-input hidden\"\n type=\"file\"\n name=\"files[]\"\n multiple\n [accept]=\"accessFiles()\" />\n } @else {\n <input\n #uploadInput\n class=\"upload-input hidden\"\n type=\"file\"\n name=\"files[]\"\n [accept]=\"accessFiles()\" />\n }\n </div>\n }\n @if (messageError() && (multiple() || !showPopupUploadWhenHasFileAndModeSingle() || (!fileList().length && !multiple()))) {\n <div class=\"mt-[8px] text-[#ee2d41] libs-ui-font-h7r\">\n {{ messageError() || '' | translate: { value: limitFile() } }}\n </div>\n }\n @if (configDownloadSampleFile()?.position === 'bottom' && configDownloadSampleFile(); as configDownloadSampleFile) {\n <libs_ui-components-buttons-button\n [type]=\"'button-link-primary'\"\n [classLabel]=\"'libs-ui-font-h7m'\"\n [classInclude]=\"'!mt-[8px] !p-0'\"\n [classIconLeft]=\"'libs-ui-icon-attachment before:!text-[12px]'\"\n [label]=\"configDownloadSampleFile.title || ' '\"\n (moClick)=\"handlerDownloadSampleFile($event)\" />\n }\n </div>\n @if (fileList().length) {\n <div\n LibsUiComponentsScrollOverlayDirective\n class=\"relative w-full h-full px-[10px] libs-ui-components-inputs-upload-view-list {{ classIncludeFileContent() || '' }}\"\n [class.mt-[12px]]=\"multiple() || !showPopupUploadWhenHasFileAndModeSingle()\">\n <ng-content select=\"[label-file]\"></ng-content>\n @for (item of fileList(); track item(); let first = $first) {\n <div\n class=\"libs-ui-components-inputs-upload-view-list-item {{ classIncludeListItem() || '' }}\"\n [class.libs-ui-components-inputs-upload-file-full]=\"modeDisplayFile() === 'full'\"\n [class.libs-ui-components-inputs-upload-file-short]=\"modeDisplayFile() === 'short'\"\n [class.libs-ui-border-error-general]=\"item().error || (messageError() && showBorderErrorAllItemWhenError())\"\n [class.mt-0]=\"first && !multiple() && !showPopupUploadWhenHasFileAndModeSingle()\">\n <div class=\"flex w-full\">\n <div class=\"flex items-center\">\n @if (canSetAvatar() && item().type === 'image') {\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [classIconLeft]=\"\n '!mr-0' + (item().isAvatar ? ' libs-ui-icon-check-circle-solid before:!text-[#00bc62]' : ' libs-ui-icon-check-circle-outline') + (disable() || readonly() || item().isUploading || !!item().error ? ' libs-ui-disable' : '')\n \"\n [popover]=\"{ config: { content: item().isAvatar ? 'i18n_avatar' : 'i18n_choose_as_your_avatar', zIndex: zIndex() } }\"\n [classInclude]=\"'!mr-[12px] !p-0'\"\n [disable]=\"disable() || readonly() || item().isUploading || !!item().error\"\n (outClick)=\"handlerSetAvatar($event, item)\" />\n }\n </div>\n <div\n class=\"flex\"\n [class.w-[calc(100%-28px)]]=\"canSetAvatar()\"\n [class.w-full]=\"!canSetAvatar()\">\n @if (modeDisplayFile() === 'full') {\n <libs_ui-components-inputs-upload-avatar\n [disable]=\"disable() || readonly()\"\n [(item)]=\"item\"\n [showVideoDuration]=\"showVideoDuration()\"\n (outOpenPreview)=\"handlerOpenPreviewFile($event)\" />\n }\n <div class=\"relative w-full\">\n <div\n class=\"flex absolute w-full h-full flex-col\"\n [class.flex-col]=\"modeDisplayFile() === 'full'\"\n [class.justify-center]=\"modeDisplayFile() === 'full'\"\n [class.items-center]=\"modeDisplayFile() === 'short'\">\n <libs_ui-components-label\n class=\"flex w-full\"\n [labelLeft]=\"item().name\"\n [zIndexPopover]=\"zIndex() + 1\"\n [labelLeftClass]=\"'libs-ui-font-h6m ' + (disable() || readonly() || item().isUploading || item().error ? 'text-[#6a7383]' : 'text-[#071631]')\"\n [classInclude]=\"modeDisplayFile() === 'short' ? '!mb-0' : ''\" />\n\n @if (!ignoreShowSizeFile()) {\n <div\n class=\"text-[#9ca2ad] libs-ui-font-h7r shrink-0\"\n [class.flex]=\"modeDisplayFile() === 'full'\"\n [class.items-center]=\"modeDisplayFile() === 'short'\"\n [class.ml-[12px]]=\"modeDisplayFile() === 'short'\">\n {{ item().size }}\n </div>\n }\n </div>\n </div>\n @if (item().isUploading && item().percentUploading) {\n <div\n class=\"flex items-center ml-[16px]\"\n [class.mr-[26px]]=\"modeDisplayFile() === 'full'\">\n <div class=\"w-[120px] h-[4px] rounded-[4px] bg-[#f8f9fa] relative\">\n <div\n class=\"absolute top-0 left-0 h-[4px] rounded-[4px] bg-[#00bc62]\"\n [style.width.px]=\"(item().percentUploading ?? 0) * 1.2\"></div>\n </div>\n </div>\n }\n </div>\n </div>\n\n <div class=\"flex ml-[16px]\">\n @if (!ignoreIconPreview()) {\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [classIconLeft]=\"'libs-ui-icon-eye-outline !mr-0'\"\n [popover]=\"{ config: { content: 'i18n_preview', zIndex: zIndex() + 1 } }\"\n [classInclude]=\"'!p-0' + (ignoreIconRemove() && !ignoreIconEdit() ? '' : ' !mr-[12px]')\"\n [disable]=\"item().isUploading || disable() || readonly()\"\n (outClick)=\"handlerOpenPreviewFile(item())\" />\n }\n @if (item().type === 'image' && !item().error && !ignoreIconEdit()) {\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [classIconLeft]=\"'libs-ui-icon-edit-line !mr-0'\"\n [popover]=\"{ config: { content: 'i18n_edit', zIndex: zIndex() + 1 } }\"\n [classInclude]=\"'!p-0' + (ignoreIconRemove() ? '' : ' !mr-[12px]')\"\n [disable]=\"item().isUploading || disable() || readonly()\"\n (outClick)=\"handlerEditImage($event, item)\" />\n }\n @if (!ignoreIconRemove()) {\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [classIconLeft]=\"'libs-ui-icon-close !mr-0'\"\n [popover]=\"{ config: { content: 'i18n_delete', zIndex: zIndex() + 1 } }\"\n [classInclude]=\"'!p-0'\"\n [disable]=\"item().isUploading || disable() || readonly()\"\n (outClick)=\"handlerRemoveFile($event, item)\" />\n }\n </div>\n </div>\n @if (item().error && (multiple() || showPopupUploadWhenHasFileAndModeSingle())) {\n <div class=\"mt-[8px] text-[#ee2d41] libs-ui-font-h7r\">{{ item().error || ' ' | translate }}</div>\n }\n }\n </div>\n }\n</div>\n", styles: [":host ::ng-deep .libs-ui-components-inputs-upload{width:100%;padding:16px;display:flex;align-items:center;justify-content:center;border-radius:8px;cursor:pointer;background-color:#fff;border:1px dashed #e6e7ea}:host ::ng-deep .libs-ui-components-inputs-upload .libs-ui-components-inputs-upload-icon:before{color:#9ca2ad}:host ::ng-deep .libs-ui-components-inputs-upload .libs-ui-components-inputs-upload-description{color:#9ca2ad}:host ::ng-deep .libs-ui-components-inputs-upload .libs-ui-components-inputs-upload-description span{color:var(--libs-ui-color-default, #226ff5)}:host ::ng-deep .libs-ui-components-inputs-upload:hover,:host ::ng-deep .libs-ui-components-inputs-upload.libs-ui-components-inputs-upload-drag-over{background-color:var(--libs-ui-color-light-3, #f4f8ff);border:1px dashed var(--libs-ui-color-light-1, #226ff5)}:host ::ng-deep .libs-ui-components-inputs-upload:hover .libs-ui-components-inputs-upload-icon:before,:host ::ng-deep .libs-ui-components-inputs-upload.libs-ui-components-inputs-upload-drag-over .libs-ui-components-inputs-upload-icon:before{color:#cdd0d6}:host ::ng-deep .libs-ui-components-inputs-upload:hover .libs-ui-components-inputs-upload-description,:host ::ng-deep .libs-ui-components-inputs-upload.libs-ui-components-inputs-upload-drag-over .libs-ui-components-inputs-upload-description{color:#cdd0d6}:host ::ng-deep .libs-ui-components-inputs-upload:hover .libs-ui-components-inputs-upload-description span,:host ::ng-deep .libs-ui-components-inputs-upload.libs-ui-components-inputs-upload-drag-over .libs-ui-components-inputs-upload-description span{color:#cdd0d6}:host ::ng-deep .libs-ui-components-inputs-upload-disable{cursor:default!important;text-decoration:none;pointer-events:none;background-color:var(--libs-ui-background-disable, #f8f9fa)!important;border:1px dashed #e6e7ea!important}:host ::ng-deep .libs-ui-components-inputs-upload-disable .libs-ui-components-inputs-upload-icon:before{color:var(--libs-ui-text-disable, #9ca2ad)}:host ::ng-deep .libs-ui-components-inputs-upload-disable .libs-ui-components-inputs-upload-description{color:var(--libs-ui-text-disable, #9ca2ad)}:host ::ng-deep .libs-ui-components-inputs-upload-disable .libs-ui-components-inputs-upload-description span{color:var(--libs-ui-text-disable, #9ca2ad)}:host ::ng-deep .libs-ui-components-inputs-upload-readonly{cursor:default!important;text-decoration:none;pointer-events:none;background-color:var(--libs-ui-backgrond-realonly, #f8f9fa)!important;border:1px dashed #e6e7ea!important}:host ::ng-deep .libs-ui-components-inputs-upload-readonly .libs-ui-components-inputs-upload-icon:before{color:#cdd0d6}:host ::ng-deep .libs-ui-components-inputs-upload-readonly .libs-ui-components-inputs-upload-description{color:var(--libs-ui-text-realonly, #071631)}:host ::ng-deep .libs-ui-components-inputs-upload-readonly .libs-ui-components-inputs-upload-description span{color:var(--libs-ui-text-realonly, #071631)}:host ::ng-deep .libs-ui-components-inputs-upload-error{background-color:#fef5f6!important;border:1px dashed #ee2d41!important}:host ::ng-deep .libs-ui-components-inputs-upload-error .libs-ui-components-inputs-upload-icon:before{color:#cdd0d6}:host ::ng-deep .libs-ui-components-inputs-upload-error .libs-ui-components-inputs-upload-description{color:#cdd0d6}:host ::ng-deep .libs-ui-components-inputs-upload-error .libs-ui-components-inputs-upload-description span{color:#cdd0d6}:host ::ng-deep .libs-ui-components-inputs-upload-file-full{background-color:#fff;padding:8px 12px}:host ::ng-deep .libs-ui-components-inputs-upload-file-short{background-color:#f4f8ff;padding:6px 12px}.libs-ui-components-inputs-upload-view-list{overflow-y:auto;max-height:100%;padding:0 10px}.libs-ui-components-inputs-upload-view-list .libs-ui-components-inputs-upload-view-list-item{width:100%;display:flex;align-items:center;justify-content:center;border-radius:4px;margin-bottom:8px}.libs-ui-components-inputs-upload-view-list .libs-ui-components-inputs-upload-view-list-item:hover{background-color:#f8f9fa}\n"] }]
|
|
436
442
|
}], ctorParameters: () => [] });
|
|
437
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBsb2FkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMtdWkvY29tcG9uZW50cy9pbnB1dHMvdXBsb2FkL3NyYy91cGxvYWQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL2lucHV0cy91cGxvYWQvc3JjL3VwbG9hZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWlCLHVCQUF1QixFQUFFLFNBQVMsRUFBZ0IsUUFBUSxFQUFFLE1BQU0sRUFBYyxNQUFNLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQWtCLE1BQU0sZUFBZSxDQUFDO0FBQ3ROLE9BQU8sRUFBRSxzQ0FBc0MsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzVGLE9BQU8sRUFBRSxzQ0FBc0MsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3JGLE9BQU8sRUFBYSxvQ0FBb0MsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ25HLE9BQU8sRUFBVSw4QkFBOEIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ25GLE9BQU8sRUFBRSxvQ0FBb0MsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3hGLE9BQU8sRUFBRSxzQ0FBc0MsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBRTVGLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ3BGLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQzNFLE9BQU8sRUFBRSxZQUFZLEVBQUUsaUJBQWlCLEVBQUUsNkJBQTZCLEVBQUUsZUFBZSxFQUFFLGlCQUFpQixFQUFFLHlCQUF5QixFQUFFLGdCQUFnQixFQUFFLGtCQUFrQixFQUFFLFlBQVksRUFBRSxxQkFBcUIsRUFBRSx3QkFBd0IsRUFBRSxxQkFBcUIsRUFBRSxx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QUFxQzt3QkFDckMsNkNBQTZDO3FCQUM5QyxtQkFDZ0IsdUJBQXVCLENBQUMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIENvbXBvbmVudFJlZiwgY29tcHV0ZWQsIGVmZmVjdCwgRWxlbWVudFJlZiwgaW5qZWN0LCBpbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIG91dHB1dCwgc2lnbmFsLCB1bnRyYWNrZWQsIHZpZXdDaGlsZCwgV3JpdGFibGVTaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNCdXR0b25zQnV0dG9uQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1idXR0b25zLWJ1dHRvbic7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzR2FsbGVyeVZpZXdlckNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtZ2FsbGVyeSc7XG5pbXBvcnQgeyBJU2F2ZUZpbGUsIExpYnNVaUNvbXBvbmVudHNJbWFnZUVkaXRvckNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtaW1hZ2UtZWRpdG9yJztcbmltcG9ydCB7IElMYWJlbCwgTGlic1VpQ29tcG9uZW50c0xhYmVsQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1sYWJlbCc7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzUHJldmlld0ZpbGVDb21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLXByZXZpZXctZmlsZSc7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzU2Nyb2xsT3ZlcmxheURpcmVjdGl2ZSB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtc2Nyb2xsLW92ZXJsYXknO1xuaW1wb3J0IHsgSUFzcGVjdFJhdGlvLCBJRmlsZSwgSUlzVmFsaWRSZXF1aXJlZCwgSU1lc3NhZ2VUcmFuc2xhdGUgfSBmcm9tICdAbGlicy11aS9pbnRlcmZhY2VzLXR5cGVzJztcbmltcG9ydCB7IExpYnNVaUR5bmFtaWNDb21wb25lbnRTZXJ2aWNlIH0gZnJvbSAnQGxpYnMtdWkvc2VydmljZXMtZHluYW1pYy1jb21wb25lbnQnO1xuaW1wb3J0IHsgTGlic1VpTm90aWZpY2F0aW9uU2VydmljZSB9IGZyb20gJ0BsaWJzLXVpL3NlcnZpY2VzLW5vdGlmaWNhdGlvbic7XG5pbXBvcnQgeyBBdWRpb0V4dExpc3QsIGNvbnZlcnRCbG9iVG9GaWxlLCBjb252ZXJ0RmlsZVRvQmFzZTY0X09iamVjdFVybCwgRG9jdW1lbnRFeHRMaXN0LCBkb3dubG9hZEZpbGVCeVVybCwgRVJST1JfTUVTU0FHRV9FTVBUWV9WQUxJRCwgZ2V0RmlsZUV4dGVuc2lvbiwgZ2V0TGFiZWxCeVNpemVGaWxlLCBJbWFnZUV4dExpc3QsIGlzSW5jbHVkZUF1ZGlvRXh0TGlzdCwgaXNJbmNsdWRlRG9jdW1lbnRFeHRMaXN0LCBpc0luY2x1ZGVJbWFnZUV4dExpc3QsIGlzSW5jbHVkZVZpZGVvRXh0TGlzdCwgaXNUeXBlQXVkaW8sIGlzVHlwZUltYWdlLCBpc1R5cGVWaWRlbywgdXVpZCwgVmlkZW9FeHRMaXN0IH0gZnJvbSAnQGxpYnMtdWkvdXRpbHMnO1xuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlLCBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzSW5wdXRzVXBsb2FkQXZhdGFyQ29tcG9uZW50IH0gZnJvbSAnLi9hdmF0YXIvYXZhdGFyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBnZXREZXNjcmlwdGlvbkZvcm1hdEFuZFNpemVGaWxlRGVmYXVsdCB9IGZyb20gJy4vZGVmaW5lcy9oZWxwZXIuZGVmaW5lJztcbmltcG9ydCB7IElVcGxvYWRDb25maWdEb3dubG9hZFNhbXBsZUZpbGUsIElVcGxvYWREZXNjcmlwdGlvbkZvcm1hdEFuZFNpemVGaWxlLCBJVXBsb2FkRnVuY3Rpb25Db250cm9sRXZlbnQsIFRZUEVfRklMRV9VUExPQUQsIFRZUEVfTU9ERV9GSUxFX0RJU1BMQVkgfSBmcm9tICcuL2ludGVyZmFjZXMvdXBsb2FkLmludGVyZmFjZSc7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzSW5wdXRzVXBsb2FkRHJvcEZpbGVEaXJlY3RpdmUgfSBmcm9tICcuL3VwbG9hZC1kcm9wLWZpbGUuZGlyZWN0aXZlJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNJbnB1dHNVcGxvYWREaXJlY3RpdmUgfSBmcm9tICcuL3VwbG9hZC1maWxlLmRpcmVjdGl2ZSc7XG5AQ29tcG9uZW50KHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9jb21wb25lbnQtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICdsaWJzX3VpLWNvbXBvbmVudHMtaW5wdXRzLXVwbG9hZCcsXG4gIHRlbXBsYXRlVXJsOiAnLi91cGxvYWQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi91cGxvYWQuY29tcG9uZW50LnNjc3MnXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1RyYW5zbGF0ZU1vZHVsZSxcbiAgICBMaWJzVWlDb21wb25lbnRzQnV0dG9uc0J1dHRvbkNvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzTGFiZWxDb21wb25lbnQsXG4gICAgTGlic1VpQ29tcG9uZW50c0lucHV0c1VwbG9hZEF2YXRhckNvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzU2Nyb2xsT3ZlcmxheURpcmVjdGl2ZSxcbiAgICBMaWJzVWlDb21wb25lbnRzSW5wdXRzVXBsb2FkRGlyZWN0aXZlLFxuICAgIExpYnNVaUNvbXBvbmVudHNJbnB1dHNVcGxvYWREcm9wRmlsZURpcmVjdGl2ZVxuICBdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBMaWJzVWlDb21wb25lbnRzSW5wdXRzVXBsb2FkQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICAvLyAjcmVnaW9uIFBST1BFUlRJRVNcbiAgcHJpdmF0ZSBpbWFnZUVkaXRvckNvbXBvbmVudFJlZj86IENvbXBvbmVudFJlZjxMaWJzVWlDb21wb25lbnRzSW1hZ2VFZGl0b3JDb21wb25lbnQ+O1xuICBwcml2YXRlIHByZXZpZXdGaWxlQ29tcG9uZW50UmVmPzogQ29tcG9uZW50UmVmPExpYnNVaUNvbXBvbmVudHNQcmV2aWV3RmlsZUNvbXBvbmVudD47XG4gIHByaXZhdGUgcHJldmlld0ZpbGVJbWFnZUNvbXBvbmVudFJlZj86IENvbXBvbmVudFJlZjxMaWJzVWlDb21wb25lbnRzR2FsbGVyeVZpZXdlckNvbXBvbmVudD47XG4gIHByb3RlY3RlZCBpc0RyYWdPdmVyID0gc2lnbmFsKGZhbHNlKTtcbiAgcHJvdGVjdGVkIGZpbGVMaXN0ID0gc2lnbmFsPEFycmF5PFdyaXRhYmxlU2lnbmFsPElGaWxlPj4+KFtdKTtcbiAgcHJvdGVjdGVkIGFjY2Vzc0ZpbGVzID0gc2lnbmFsPHN0cmluZz4oJycpO1xuICBwcm90ZWN0ZWQgbWVzc2FnZUVycm9yID0gc2lnbmFsPHN0cmluZyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcHJvdGVjdGVkIGRlc2NyaXB0aW9uRm9ybWF0QW5kU2l6ZUZpbGVDb21wdXRlZCA9IGNvbXB1dGVkPEFycmF5PElVcGxvYWREZXNjcmlwdGlvbkZvcm1hdEFuZFNpemVGaWxlPj4oKCkgPT4ge1xuICAgIGlmICh0aGlzLmRlc2NyaXB0aW9uRm9ybWF0QW5kU2l6ZUZpbGUoKT8ubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdGhpcy5kZXNjcmlwdGlvbkZvcm1hdEFuZFNpemVGaWxlKCkgYXMgdW5rbm93biBhcyBBcnJheTxJVXBsb2FkRGVzY3JpcHRpb25Gb3JtYXRBbmRTaXplRmlsZT47XG4gICAgfVxuICAgIHJldHVybiBnZXREZXNjcmlwdGlvbkZvcm1hdEFuZFNpemVGaWxlRGVmYXVsdCh0aGlzLmZpbGVUeXBlKCksIHRoaXMubWF4SW1hZ2VTaXplKCksIHRoaXMubWF4VmlkZW9TaXplKCksIHRoaXMubWF4RG9jdW1lbnRTaXplKCksIHRoaXMubWF4QXVkaW9TaXplKCkpO1xuICB9KTtcblxuICBwcml2YXRlIG9uRGVzdHJveSA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIC8vICNlbmRyZWdpb25cblxuICAvLyAjcmVnaW9uIElOUFVUU1xuICByZWFkb25seSBvcmlnaW5GaWxlcyA9IGlucHV0PEFycmF5PFdyaXRhYmxlU2lnbmFsPElGaWxlPj4sIEFycmF5PFdyaXRhYmxlU2lnbmFsPElGaWxlPj4gfCB1bmRlZmluZWQ+KFtdLCB7IHRyYW5zZm9ybTogdmFsID0+IHZhbCA/PyBbXSB9KTtcbiAgcmVhZG9ubHkgZmlsZVR5cGUgPSBpbnB1dDxUWVBFX0ZJTEVfVVBMT0FELCBUWVBFX0ZJTEVfVVBMT0FEIHwgdW5kZWZpbmVkPignaW1hZ2VfdmlkZW9fZG9jdW1lbnQnLCB7IHRyYW5zZm9ybTogdmFsID0+IHZhbCA/PyAnaW1hZ2VfdmlkZW9fZG9jdW1lbnQnIH0pO1xuICByZWFkb25seSBtdWx0aXBsZSA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGNhblVwbG9hZElmSGFzRXhpc3RGaWxlID0gaW5wdXQ8Ym9vbGVhbiwgYm9vbGVhbiB8IHVuZGVmaW5lZD4oZmFsc2UsIHsgdHJhbnNmb3JtOiB2YWwgPT4gdmFsID8/IGZhbHNlIH0pO1xuICByZWFkb25seSBjYW5TZXRBdmF0YXIgPSBpbnB1dDxib29sZWFuIHwgdW5kZWZpbmVkPihmYWxzZSk7XG4gIHJlYWRvbmx5IGxpbWl0RmlsZSA9IGlucHV0PG51bWJlciwgbnVtYmVyIHwgdW5kZWZpbmVkPigxMCwgeyB0cmFuc2Zvcm06IHZhbCA9PiB2YWwgPz8gMTAgfSk7XG4gIHJlYWRvbmx5IG1heFRvdGFsU2l6ZSA9IGlucHV0PG51bWJlciwgbnVtYmVyIHwgdW5kZWZpbmVkPigxMCAqIDEwMjQgKiAxMDI0LCB7IHRyYW5zZm9ybTogdmFsID0+IHZhbCA/PyAxMCAqIDEwMjQgKiAxMDI0IH0pO1xuICByZWFkb25seSBtYXhJbWFnZVNpemUgPSBpbnB1dDxudW1iZXIsIG51bWJlciB8IHVuZGVmaW5lZD4oNSAqIDEwMjQgKiAxMDI0LCB7IHRyYW5zZm9ybTogdmFsID0+IHZhbCA/PyA1ICogMTAyNCAqIDEwMjQgfSk7XG4gIHJlYWRvbmx5IG1heFZpZGVvU2l6ZSA9IGlucHV0PG51bWJlciwgbnVtYmVyIHwgdW5kZWZpbmVkPigxMCAqIDEwMjQgKiAxMDI0LCB7IHRyYW5zZm9ybTogdmFsID0+IHZhbCA/PyAxMCAqIDEwMjQgKiAxMDI0IH0pO1xuICByZWFkb25seSBtYXhEb2N1bWVudFNpemUgPSBpbnB1dDxudW1iZXIsIG51bWJlciB8IHVuZGVmaW5lZD4oMTAgKiAxMDI0ICogMTAyNCwgeyB0cmFuc2Zvcm06IHZhbCA9PiB2YWwgPz8gMTAgKiAxMDI0ICogMTAyNCB9KTtcbiAgcmVhZG9ubHkgbWF4QXVkaW9TaXplID0gaW5wdXQ8bnVtYmVyLCBudW1iZXIgfCB1bmRlZmluZWQ+KDEwICogMTAyNCAqIDEwMjQsIHsgdHJhbnNmb3JtOiB2YWwgPT4gdmFsID8/IDEwICogMTAyNCAqIDEwMjQgfSk7XG4gIHJlYWRvbmx5IGltYWdlRXh0TGlzdCA9IGlucHV0PHN0cmluZ1tdLCBzdHJpbmdbXSB8IHVuZGVmaW5lZD4oSW1hZ2VFeHRMaXN0LCB7IHRyYW5zZm9ybTogdmFsID0+IHZhbCA/PyBJbWFnZUV4dExpc3QgfSk7XG4gIHJlYWRvbmx5IHZpZGVvRXh0TGlzdCA9IGlucHV0PHN0cmluZ1tdLCBzdHJpbmdbXSB8IHVuZGVmaW5lZD4oVmlkZW9FeHRMaXN0LCB7IHRyYW5zZm9ybTogdmFsID0+IHZhbCA/PyBWaWRlb0V4dExpc3QgfSk7XG4gIHJlYWRvbmx5IGRvY3VtZW50RXh0TGlzdCA9IGlucHV0PHN0cmluZ1tdLCBzdHJpbmdbXSB8IHVuZGVmaW5lZD4oRG9jdW1lbnRFeHRMaXN0LCB7IHRyYW5zZm9ybTogdmFsID0+IHZhbCA/PyBEb2N1bWVudEV4dExpc3QgfSk7XG4gIHJlYWRvbmx5IGF1ZGlvRXh0TGlzdCA9IGlucHV0PHN0cmluZ1tdLCBzdHJpbmdbXSB8IHVuZGVmaW5lZD4oQXVkaW9FeHRMaXN0LCB7IHRyYW5zZm9ybTogdmFsID0+IHZhbCA/PyBBdWRpb0V4dExpc3QgfSk7XG4gIHJlYWRvbmx5IGNsYXNzSW5jbHVkZUxpc3RJdGVtID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSB2YWxpZFJlcXVpcmVkID0gaW5wdXQ8SUlzVmFsaWRSZXF1aXJlZD4oKTtcbiAgcmVhZG9ubHkgZGlzYWJsZSA9IGlucHV0PGJvb2xlYW4sIGJvb2xlYW4gfCB1bmRlZmluZWQ+KGZhbHNlLCB7IHRyYW5zZm9ybTogdmFsID0+IHZhbCA/PyBmYWxzZSB9KTtcbiAgcmVhZG9ubHkgcmVhZG9ubHkgPSBpbnB1dDxib29sZWFuLCBib29sZWFuIHwgdW5kZWZpbmVkPihmYWxzZSwgeyB0cmFuc2Zvcm06IHZhbCA9PiB2YWwgPz8gZmFsc2UgfSk7XG4gIHJlYWRvbmx5IGFzcGVjdFJhdGlvID0gaW5wdXQ8SUFzcGVjdFJhdGlvPigpO1xuICByZWFkb25seSB6SW5kZXggPSBpbnB1dDxudW1iZXIsIG51bWJlciB8IHVuZGVmaW5lZD4oMTIwMCwgeyB0cmFuc2Zvcm06IHZhbCA9PiB2YWwgPz8gMTIwMCB9KTtcbiAgcmVhZG9ubHkgaWdub3JlU2hvd1NpemVGaWxlID0gaW5wdXQ8Ym9vbGVhbiwgYm9vbGVhbiB8IHVuZGVmaW5lZD4oZmFsc2UsIHsgdHJhbnNmb3JtOiB2YWwgPT4gdmFsID8/IGZhbHNlIH0pO1xuICByZWFkb25seSBhbGxvd1Nob3dQdXNoTWVzc2FnZU1heFNpemVFcnJvciA9IGlucHV0PGJvb2xlYW4sIGJvb2xlYW4gfCB1bmRlZmluZWQ+KGZhbHNlLCB7IHRyYW5zZm9ybTogdmFsID0+IHZhbCA/PyBmYWxzZSB9KTtcbiAgcmVhZG9ubHkgbWVzc2FnZVR5cGVGaWxlRXJyb3IgPSBpbnB1dDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4oJ2kxOG5fdGhlX2ZpbGVfc3VwcG9ydF9mb3JtYXRfaXNfbm90X2NvcnJlY3QnLCB7IHRyYW5zZm9ybTogdmFsID0+IHZhbCB8fCAnaTE4bl90aGVfZmlsZV9zdXBwb3J0X2Zvcm1hdF9pc19ub3RfY29ycmVjdCcgfSk7XG4gIHJlYWRvbmx5IG1lc3NhZ2VNYXhTaXplRXJyb3IgPSBpbnB1dDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4oJ2kxOG5fZmlsZV9zaXplX2V4Y2VlZHNfdGhlX2FsbG93ZWRfbGltaXQnLCB7IHRyYW5zZm9ybTogdmFsID0+IHZhbCB8fCAnaTE4bl9maWxlX3NpemVfZXhjZWVkc190aGVfYWxsb3dlZF9saW1pdCcgfSk7XG4gIHJlYWRvbmx5IG1lc3NhZ2VGaWxlVXBsb2FkRXJyb3IgPSBpbnB1dDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4oJ2kxOG5faW52YWxpZF9maWxlX3VwbG9hZCcsIHsgdHJhbnNmb3JtOiB2YWwgPT4gdmFsIHx8ICdpMThuX2ludmFsaWRfZmlsZV91cGxvYWQnIH0pO1xuICByZWFkb25seSBtZXNzYWdlVG90YWxGaWxlRXhjZWVkc0Vycm9yID0gaW5wdXQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KCdpMThuX2ZpbGVfbnVtYmVyX2V4Y2VlZHNfdGhlX2FsbG93ZWRfbGltaXRfcGxlYXNlX2RlbGV0ZV90aGVfZmlsZScsIHsgdHJhbnNmb3JtOiB2YWwgPT4gdmFsIHx8ICdpMThuX2ZpbGVfbnVtYmVyX2V4Y2VlZHNfdGhlX2FsbG93ZWRfbGltaXRfcGxlYXNlX2RlbGV0ZV90aGVfZmlsZScgfSlcbiAgcmVhZG9ubHkgY29uZmlnRGVzY3JpcHRpb25JbnB1dFVwbG9hZCA9IGlucHV0PElNZXNzYWdlVHJhbnNsYXRlLCBJTWVzc2FnZVRyYW5zbGF0ZSB8IHVuZGVmaW5lZD4oeyBtZXNzYWdlOiAnaTE4bl9kcmFnX2ZpbGVfaGVyZV90b191cGxvYWRfb3Jfc2VsZWN0X2ZpbGUnIH0sIHtcbiAgICB0cmFuc2Zvcm06IHZhbCA9PiB2YWwgPz8geyBtZXNzYWdlOiAnaTE4bl9kcmFnX2ZpbGVfaGVyZV90b191cGxvYWRfb3Jfc2VsZWN0X2ZpbGUnIH1cbiAgfSk7XG5cbiAgcmVhZG9ubHkgbW9kZURpc3BsYXlGaWxlID0gaW5wdXQ8VFlQRV9NT0RFX0ZJTEVfRElTUExBWSwgVFlQRV9NT0RFX0ZJTEVfRElTUExBWSB8IHVuZGVmaW5lZD4oJ2Z1bGwnLCB7IHRyYW5zZm9ybTogdmFsID0+IHZhbCB8fCAnZnVsbCcgfSk7XG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uRm9ybWF0QW5kU2l6ZUZpbGUgPSBpbnB1dDxBcnJheTxJVXBsb2FkRGVzY3JpcHRpb25Gb3JtYXRBbmRTaXplRmlsZT4+KCk7XG4gIHJlYWRvbmx5IHNob3dWaWRlb0R1cmF0aW9uID0gaW5wdXQ8Ym9vbGVhbiwgYm9vbGVhbiB8IHVuZGVmaW5lZD4oZmFsc2UsIHsgdHJhbnNmb3JtOiB2YWwgPT4gdmFsID8/IGZhbHNlIH0pO1xuICByZWFkb25seSBsYWJlbENvbmZpZyA9IGlucHV0PElMYWJlbD4oKTtcbiAgcmVhZG9ubHkgc2hvd1BvcHVwVXBsb2FkV2hlbkhhc0ZpbGVBbmRNb2RlU2luZ2xlID0gaW5wdXQ8Ym9vbGVhbiwgYm9vbGVhbiB8IHVuZGVmaW5lZD4oZmFsc2UsIHsgdHJhbnNmb3JtOiB2YWwgPT4gdmFsID8/IGZhbHNlIH0pO1xuICByZWFkb25seSBpZ25vcmVJY29uUmVtb3ZlID0gaW5wdXQ8Ym9vbGVhbiwgYm9vbGVhbiB8IHVuZGVmaW5lZD4oZmFsc2UsIHsgdHJhbnNmb3JtOiB2YWwgPT4gdmFsID8/IGZhbHNlIH0pO1xuICByZWFkb25seSBpZ25vcmVJY29uRWRpdCA9IGlucHV0PGJvb2xlYW4sIGJvb2xlYW4gfCB1bmRlZmluZWQ+KGZhbHNlLCB7IHRyYW5zZm9ybTogdmFsID0+IHZhbCA/PyBmYWxzZSB9KTtcbiAgcmVhZG9ubHkgaWdub3JlSWNvblByZXZpZXcgPSBpbnB1dDxib29sZWFuLCBib29sZWFuIHwgdW5kZWZpbmVkPih0cnVlLCB7IHRyYW5zZm9ybTogdmFsID0+IHZhbCA/PyB0cnVlIH0pO1xuICByZWFkb25seSBjbGFzc0luY2x1ZGVGaWxlQ29udGVudCA9IGlucHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgc2hvd0JvcmRlckVycm9yQWxsSXRlbVdoZW5FcnJvciA9IGlucHV0PGJvb2xlYW4sIGJvb2xlYW4gfCB1bmRlZmluZWQ+KGZhbHNlLCB7IHRyYW5zZm9ybTogdmFsID0+IHZhbCA/PyBmYWxzZSB9KTtcbiAgcmVhZG9ubHkgY29uZmlnRG93bmxvYWRTYW1wbGVGaWxlID0gaW5wdXQ8SVVwbG9hZENvbmZpZ0Rvd25sb2FkU2FtcGxlRmlsZT4oKTtcbiAgLy8gI2VuZHJlZ2lvblxuXG4gIC8vICNyZWdpb24gT1VUUFVUU1xuICByZWFkb25seSBvdXRDbG9zZSA9IG91dHB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBvdXRGaWxlQ2hhbmdlZCA9IG91dHB1dDxBcnJheTxXcml0YWJsZVNpZ25hbDxJRmlsZT4+PigpO1xuICByZWFkb25seSBvdXRGaWxlUmVtb3ZlZCA9IG91dHB1dDxXcml0YWJsZVNpZ25hbDxJRmlsZT4+KCk7XG4gIHJlYWRvbmx5IG91dEZ1bmN0aW9uc0NvbnRyb2wgPSBvdXRwdXQ8SVVwbG9hZEZ1bmN0aW9uQ29udHJvbEV2ZW50PigpO1xuICAvLyAjZW5kcmVnaW9uXG5cbiAgLy8gI3JlZ2lvbiBWSUVXIENISUxEUkVOXG4gIHJlYWRvbmx5IHVwbG9hZFJlZiA9IHZpZXdDaGlsZDxFbGVtZW50UmVmPigndXBsb2FkJyk7XG4gIHJlYWRvbmx5IHVwbG9hZElucHV0UmVmID0gdmlld0NoaWxkPEVsZW1lbnRSZWY+KCd1cGxvYWRJbnB1dCcpO1xuICAvLyAjZW5kcmVnaW9uXG5cbiAgLy8gI3JlZ2lvbiBJTkpFQ1RJT05TXG4gIHByaXZhdGUgZHluYW1pY0NvbXBvbmVudFNlcnZpY2UgPSBpbmplY3QoTGlic1VpRHluYW1pY0NvbXBvbmVudFNlcnZpY2UpO1xuICBwcml2YXRlIHRyYW5zbGF0ZVNlcnZpY2UgPSBpbmplY3QoVHJhbnNsYXRlU2VydmljZSk7XG4gIHByaXZhdGUgbm90aWZpY2F0aW9uU2VydmljZSA9IGluamVjdChMaWJzVWlOb3RpZmljYXRpb25TZXJ2aWNlKTtcbiAgLy8gI2VuZHJlZ2lvblxuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5vcmlnaW5GaWxlcygpKSB7XG4gICAgICAgIHVudHJhY2tlZCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5maWxlTGlzdC5zZXQoWy4uLnRoaXMub3JpZ2luRmlsZXMoKV0pO1xuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8gI3JlZ2lvbiBMSUZFQ1lDTEUgSE9PS1NcbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5vdXRGdW5jdGlvbnNDb250cm9sLmVtaXQoe1xuICAgICAgY2hlY2tJc1ZhbGlkOiB0aGlzLnZhbGlkYXRlLmJpbmQodGhpcyksXG4gICAgICByZW1vdmVBbGw6IHRoaXMucmVtb3ZlQWxsRmlsZS5iaW5kKHRoaXMpLFxuICAgICAgdXBsb2FkaW5nOiBhc3luYyAocHJvY2VzcywgaWQpID0+IHtcbiAgICAgICAgY29uc3QgZmlsZVVwbG9hZGluZyA9IHRoaXMuZmlsZUxpc3QoKS5maW5kKGZpbGUgPT4gZmlsZSgpLmlkID09PSBpZCk7XG5cbiAgICAgICAgaWYgKGZpbGVVcGxvYWRpbmcpIHtcbiAgICAgICAgICBmaWxlVXBsb2FkaW5nLnVwZGF0ZShmaWxlID0+ICh7IC4uLmZpbGUsIHBlcmNlbnRVcGxvYWRpbmc6IHByb2Nlc3MucGVyY2VudCwgaXNVcGxvYWRpbmc6IHByb2Nlc3MucGVyY2VudCAhPT0gMTAwIH0pKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHNldE1lc3NhZ2VFcnJvcjogYXN5bmMgKG1lc3NhZ2UsIGlkKSA9PiB7XG4gICAgICAgIHRoaXMubWVzc2FnZUVycm9yLnNldChtZXNzYWdlKTtcbiAgICAgICAgaWYgKGlkKSB7XG4gICAgICAgICAgY29uc3QgZmlsZUVycm9yID0gdGhpcy5maWxlTGlzdCgpLmZpbmQoZmlsZSA9PiBmaWxlKCkuaWQgPT09IGlkKTtcblxuICAgICAgICAgIGlmIChmaWxlRXJyb3IpIHtcbiAgICAgICAgICAgIGZpbGVFcnJvci51cGRhdGUoZmlsZSA9PiAoeyAuLi5maWxlLCBlcnJvcjogbWVzc2FnZSB9KSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgaGFuZGxlclVwbG9hZEZpbGU6IHRoaXMuc2hvd1VwbG9hZFBvcHVwLmJpbmQodGhpcylcbiAgICB9KTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuaW5pdEFjY2Vzc0ZpbGVzKCk7XG4gICAgfSwgMCk7XG4gIH1cbiAgLy8gI2VuZHJlZ2lvblxuXG4gIC8vICNyZWdpb24gSU5JVElBTElaQVRJT05cbiAgcHJvdGVjdGVkIGFzeW5jIGluaXRBY2Nlc3NGaWxlcygpIHtcbiAgICBjb25zdCBhY2Nlc3NFeHRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHR5cGVTcGxpdCA9IHRoaXMuZmlsZVR5cGUoKS5zcGxpdCgnXycpO1xuXG4gICAgaWYgKHR5cGVTcGxpdC5pbmNsdWRlcygnaW1hZ2UnKSkge1xuICAgICAgYWNjZXNzRXh0cy5wdXNoKC4uLnRoaXMuaW1hZ2VFeHRMaXN0KCkpO1xuICAgIH1cbiAgICBpZiAodHlwZVNwbGl0LmluY2x1ZGVzKCdkb2N1bWVudCcpKSB7XG4gICAgICBhY2Nlc3NFeHRzLnB1c2goLi4udGhpcy5kb2N1bWVudEV4dExpc3QoKSk7XG4gICAgfVxuICAgIGlmICh0eXBlU3BsaXQuaW5jbHVkZXMoJ3ZpZGVvJykpIHtcbiAgICAgIGFjY2Vzc0V4dHMucHVzaCguLi50aGlzLnZpZGVvRXh0TGlzdCgpKTtcbiAgICB9XG4gICAgaWYgKHR5cGVTcGxpdC5pbmNsdWRlcygnYXVkaW8nKSkge1xuICAgICAgYWNjZXNzRXh0cy5wdXNoKC4uLnRoaXMuYXVkaW9FeHRMaXN0KCkpO1xuICAgIH1cbiAgICB0aGlzLmFjY2Vzc0ZpbGVzLnNldChhY2Nlc3NFeHRzLm1hcChleHQgPT4gYC4ke2V4dH1gKS5qb2luKCcsJykpO1xuICB9XG4gIC8vICNlbmRyZWdpb25cblxuXG4gIC8vICNyZWdpb24gRklMRSBPUEVSQVRJT05TXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVyU2V0Q2xhc3NEcmFnKHRvb2dsZTogYm9vbGVhbikge1xuICAgIHRoaXMudXBsb2FkUmVmKCk/Lm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZSgnbGlicy11aS1jb21wb25lbnRzLWlucHV0cy11cGxvYWQtZHJhZy1vdmVyJywgdG9vZ2xlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVVcGxvYWRGaWxlcyhmaWxlczogQXJyYXk8RmlsZT4pIHtcbiAgICBpZiAodGhpcy5tYXhUb3RhbFNpemUoKSkge1xuICAgICAgbGV0IHRvdGFsID0gMDtcblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB0b3RhbCArPSBmaWxlc1tpXS5zaXplO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5tYXhUb3RhbFNpemUoKSA8IHRvdGFsKSB7XG4gICAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5zaG93Q29tcFR5cGVUZXh0RXJyb3IodGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ2kxOG5fc2l6ZV9ub3RfbnVtYmVyX21iJywgeyBudW1iZXI6IHRoaXMubWF4VG90YWxTaXplKCkgLyAxMDI0IC8gMTAyNCB9KSwgeyB0aW1lUmVtb3ZlOiAzMDAwIH0pO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgZXJyb3JFeGNlZWRzTWF4RmlsZSA9IGZhbHNlO1xuICAgIGlmICghZmlsZXMgfHwgIWZpbGVzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXRoaXMubXVsdGlwbGUoKSAmJiB0aGlzLmZpbGVMaXN0KCkubGVuZ3RoICYmICF0aGlzLmNhblVwbG9hZElmSGFzRXhpc3RGaWxlKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCByZW1haW5GaWxlVG90YWwgPSB0aGlzLmxpbWl0RmlsZSgpIC0gdGhpcy5maWxlTGlzdCgpLmxlbmd0aDtcbiAgICBpZiAoZmlsZXMubGVuZ3RoID4gcmVtYWluRmlsZVRvdGFsKSB7XG4gICAgICBlcnJvckV4Y2VlZHNNYXhGaWxlID0gdHJ1ZTtcbiAgICAgIHRoaXMubWVzc2FnZUVycm9yLnNldCh0aGlzLm1lc3NhZ2VUb3RhbEZpbGVFeGNlZWRzRXJyb3IoKSk7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGZpbGUgPSBmaWxlc1tpXTtcbiAgICAgIGNvbnN0IGlzSW1hZ2UgPSBpc1R5cGVJbWFnZShmaWxlKTtcbiAgICAgIGNvbnN0IGlzVmlkZW8gPSBpc1R5cGVWaWRlbyhmaWxlKTtcbiAgICAgIGNvbnN0IGlzQXVkaW8gPSBpc1R5cGVBdWRpbyhmaWxlKTtcbiAgICAgIGNvbnN0IG5ld0ZpbGU6IElGaWxlID0ge1xuICAgICAgICBuYW1lOiBmaWxlLm5hbWUsXG4gICAgICAgIGZpbGU6IGZpbGUsXG4gICAgICAgIHNpemU6IGdldExhYmVsQnlTaXplRmlsZShmaWxlLnNpemUpLFxuICAgICAgICB0eXBlOiBpc0ltYWdlID8gJ2ltYWdlJyA6IGlzVmlkZW8gPyAndmlkZW8nIDogaXNBdWRpbyA/ICdhdWRpbycgOiAnZG9jdW1lbnQnLFxuICAgICAgICBpZDogdXVpZCgpXG4gICAgICB9O1xuICAgICAgaWYgKCEoYXdhaXQgdGhpcy5jaGVja1ZhbGlkRmlsZUV4dGVuc2lvbihmaWxlKSkpIHtcbiAgICAgICAgaWYgKCFlcnJvckV4Y2VlZHNNYXhGaWxlKSB7XG4gICAgICAgICAgdGhpcy5tZXNzYWdlRXJyb3Iuc2V0KHRoaXMubXVsdGlwbGUoKSA/IHRoaXMubWVzc2FnZUZpbGVVcGxvYWRFcnJvcigpIDogdGhpcy5tZXNzYWdlVHlwZUZpbGVFcnJvcigpKTtcbiAgICAgICAgfVxuICAgICAgICBuZXdGaWxlLmVycm9yID0gdGhpcy5tZXNzYWdlVHlwZUZpbGVFcnJvcigpO1xuICAgICAgICBhd2FpdCB0aGlzLnB1c2hGaWxlSW5MaXN0KGZpbGUsIG5ld0ZpbGUpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmICghKGF3YWl0IHRoaXMuY2hlY2tWYWxpZEZpbGVTaXplKGZpbGUpKSkge1xuICAgICAgICBpZiAoIWVycm9yRXhjZWVkc01heEZpbGUpIHtcbiAgICAgICAgICB0aGlzLm1lc3NhZ2VFcnJvci5zZXQodGhpcy5tdWx0aXBsZSgpID8gdGhpcy5tZXNzYWdlRmlsZVVwbG9hZEVycm9yKCkgOiB0aGlzLm1lc3NhZ2VNYXhTaXplRXJyb3IoKSk7XG4gICAgICAgIH1cbiAgICAgICAgbmV3RmlsZS5lcnJvciA9IHRoaXMubWVzc2FnZU1heFNpemVFcnJvcigpO1xuICAgICAgICBpZiAoIXRoaXMubXVsdGlwbGUoKSAmJiB0aGlzLmFsbG93U2hvd1B1c2hNZXNzYWdlTWF4U2l6ZUVycm9yKCkpIHtcbiAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2Uuc2hvd0NvbXBUeXBlVGV4dEVycm9yKHRoaXMubWVzc2FnZU1heFNpemVFcnJvcigpKTtcblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLnB1c2hGaWxlSW5MaXN0KGZpbGUsIG5ld0ZpbGUpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHRoaXMucHVzaEZpbGVJbkxpc3QoZmlsZSwgbmV3RmlsZSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmNhblNldEF2YXRhcigpICYmIHRoaXMuZmlsZUxpc3QoKS5sZW5ndGggJiYgIXRoaXMuZmlsZUxpc3QoKS5maW5kKGZpbGUgPT4gZmlsZSgpLmlzQXZhdGFyKSkge1xuICAgICAgdGhpcy5maWxlTGlzdC51cGRhdGUoZmlsZUxpc3QgPT4ge1xuICAgICAgICBjb25zdCBpdGVtSW1hZ2UgPSBmaWxlTGlzdC5maW5kKGZpbGUgPT4gZmlsZSgpLnR5cGUgPT09ICdpbWFnZScpO1xuICAgICAgICBpZiAoaXRlbUltYWdlKSB7XG4gICAgICAgICAgaXRlbUltYWdlLnVwZGF0ZShmaWxlID0+ICh7IC4uLmZpbGUsIGlzQXZhdGFyOiB0cnVlIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gWy4uLmZpbGVMaXN0XTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLm91dEZpbGVDaGFuZ2VkLmVtaXQodGhpcy5maWxlTGlzdCgpKTtcbiAgICB0aGlzLnZhbGlkYXRlKCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHB1c2hGaWxlSW5MaXN0KGZpbGU6IEZpbGUsIG5ld0ZpbGU6IElGaWxlKSB7XG4gICAgbmV3RmlsZS51cmwgPSBhd2FpdCBjb252ZXJ0RmlsZVRvQmFzZTY0X09iamVjdFVybChmaWxlKSBhcyBzdHJpbmc7XG5cbiAgICB0aGlzLmZpbGVMaXN0LnVwZGF0ZShmaWxlTGlzdCA9PiB7XG4gICAgICBmaWxlTGlzdC5zcGxpY2UoMCwgdGhpcy5jYW5VcGxvYWRJZkhhc0V4aXN0RmlsZSgpID8gMSA6IDAsIHNpZ25hbChuZXdGaWxlKSk7XG4gICAgICByZXR1cm4gWy4uLmZpbGVMaXN0XTtcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVyT3BlblByZXZpZXdGaWxlKGl0ZW06IElGaWxlKSB7XG4gICAgaWYgKGl0ZW0udHlwZSA9PT0gJ2RvY3VtZW50Jykge1xuICAgICAgdGhpcy5wcmV2aWV3RmlsZURvY3VtZW50KGl0ZW0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnByZXZpZXdGaWxlSW1hZ2UoaXRlbSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHByZXZpZXdGaWxlRG9jdW1lbnQoaXRlbTogSUZpbGUpIHtcbiAgICBpZiAodGhpcy5wcmV2aWV3RmlsZUNvbXBvbmVudFJlZikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnByZXZpZXdGaWxlQ29tcG9uZW50UmVmID0gdGhpcy5keW5hbWljQ29tcG9uZW50U2VydmljZS5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShMaWJzVWlDb21wb25lbnRzUHJldmlld0ZpbGVDb21wb25lbnQpO1xuICAgIHRoaXMucHJldmlld0ZpbGVDb21wb25lbnRSZWYuc2V0SW5wdXQoJ2RhdGEnLCBpdGVtKTtcbiAgICB0aGlzLnByZXZpZXdGaWxlQ29tcG9uZW50UmVmLnNldElucHV0KCd6SW5kZXgnLCB0aGlzLnpJbmRleCgpICsgMSk7XG4gICAgdGhpcy5wcmV2aWV3RmlsZUNvbXBvbmVudFJlZi5pbnN0YW5jZS5vdXRDbG9zZS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5keW5hbWljQ29tcG9uZW50U2VydmljZS5yZW1vdmUodGhpcy5wcmV2aWV3RmlsZUNvbXBvbmVudFJlZik7XG4gICAgICB0aGlzLnByZXZpZXdGaWxlQ29tcG9uZW50UmVmID0gdW5kZWZpbmVkO1xuICAgIH0pO1xuICAgIHRoaXMuZHluYW1pY0NvbXBvbmVudFNlcnZpY2UuYWRkVG9Cb2R5KHRoaXMucHJldmlld0ZpbGVDb21wb25lbnRSZWYpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBwcmV2aWV3RmlsZUltYWdlKGl0ZW06IElGaWxlKSB7XG4gICAgaWYgKHRoaXMucHJldmlld0ZpbGVJbWFnZUNvbXBvbmVudFJlZikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnByZXZpZXdGaWxlSW1hZ2VDb21wb25lbnRSZWYgPSB0aGlzLmR5bmFtaWNDb21wb25lbnRTZXJ2aWNlLnJlc29sdmVDb21wb25lbnRGYWN0b3J5KExpYnNVaUNvbXBvbmVudHNHYWxsZXJ5Vmlld2VyQ29tcG9uZW50KTtcbiAgICBjb25zdCB1cmwgPSBpdGVtLnVybCB8fCBpdGVtLm9yaWdpbl91cmw7XG4gICAgdGhpcy5wcmV2aWV3RmlsZUltYWdlQ29tcG9uZW50UmVmLnNldElucHV0KCdpbWFnZXMnLCBbeyB1cmwgfV0pO1xuICAgIHRoaXMucHJldmlld0ZpbGVJbWFnZUNvbXBvbmVudFJlZi5zZXRJbnB1dCgnaW1hZ2VTZWxlY3RlZCcsIHsgdXJsIH0pO1xuICAgIHRoaXMucHJldmlld0ZpbGVJbWFnZUNvbXBvbmVudFJlZi5zZXRJbnB1dCgnZmllbGREaXNwbGF5U3JjSW1hZ2UnLCAndXJsJyk7XG4gICAgdGhpcy5wcmV2aWV3RmlsZUltYWdlQ29tcG9uZW50UmVmLnNldElucHV0KCdzaW5nbGVJbWFnZScsIHRydWUpO1xuICAgIHRoaXMucHJldmlld0ZpbGVJbWFnZUNvbXBvbmVudFJlZi5zZXRJbnB1dCgnekluZGV4JywgdGhpcy56SW5kZXgoKSArIDEpO1xuICAgIHRoaXMucHJldmlld0ZpbGVJbWFnZUNvbXBvbmVudFJlZi5pbnN0YW5jZS5vdXRDbG9zZS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5keW5hbWljQ29tcG9uZW50U2VydmljZS5yZW1vdmUodGhpcy5wcmV2aWV3RmlsZUltYWdlQ29tcG9uZW50UmVmKTtcbiAgICAgIHRoaXMucHJldmlld0ZpbGVJbWFnZUNvbXBvbmVudFJlZiA9IHVuZGVmaW5lZDtcbiAgICB9KTtcbiAgICB0aGlzLmR5bmFtaWNDb21wb25lbnRTZXJ2aWNlLmFkZFRvQm9keSh0aGlzLnByZXZpZXdGaWxlSW1hZ2VDb21wb25lbnRSZWYpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGhhbmRsZXJFZGl0SW1hZ2UoZXZlbnQ6IEV2ZW50LCBpdGVtOiBXcml0YWJsZVNpZ25hbDxJRmlsZT4pIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLnNob3dFZGl0TW9kYWwoaXRlbSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlclJlbW92ZUZpbGUoZXZlbnQ6IEV2ZW50LCBpdGVtOiBXcml0YWJsZVNpZ25hbDxJRmlsZT4pIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLnJlbW92ZUZpbGUoaXRlbSk7XG4gICAgaWYgKHRoaXMub3JpZ2luRmlsZXMoKS5maW5kKGZpbGUgPT4gZmlsZSgpLnVybCA9PT0gaXRlbSgpLnVybCkpIHtcbiAgICAgIHRoaXMub3V0RmlsZVJlbW92ZWQuZW1pdChpdGVtKTtcbiAgICB9XG4gICAgdGhpcy52YWxpZGF0ZSgpO1xuICAgIGlmICghdGhpcy5tdWx0aXBsZSgpICYmIHRoaXMuc2hvd1BvcHVwVXBsb2FkV2hlbkhhc0ZpbGVBbmRNb2RlU2luZ2xlKCkpIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLnNob3dVcGxvYWRQb3B1cCgpO1xuICAgICAgfSwgMCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIHJlbW92ZUZpbGUoZmlsZUl0ZW06IFdyaXRhYmxlU2lnbmFsPElGaWxlPikge1xuICAgIHRoaXMuZmlsZUxpc3QudXBkYXRlKGZpbGVMaXN0ID0+IGZpbGVMaXN0LmZpbHRlcihpdGVtID0+IGl0ZW0oKS5pZCAhPT0gZmlsZUl0ZW0oKS5pZCkpO1xuICAgIGlmICh0aGlzLmNhblNldEF2YXRhcigpICYmIGZpbGVJdGVtKCkuaXNBdmF0YXIgJiYgdGhpcy5maWxlTGlzdCgpLmxlbmd0aCkge1xuICAgICAgdGhpcy5maWxlTGlzdC51cGRhdGUoZmlsZUxpc3QgPT4ge1xuICAgICAgICBmaWxlTGlzdFswXS51cGRhdGUoZmlsZSA9PiAoeyAuLi5maWxlLCBpc0F2YXRhcjogdHJ1ZSB9KSk7XG5cbiAgICAgICAgcmV0dXJuIFsuLi5maWxlTGlzdF07XG4gICAgICB9KTtcblxuICAgIH1cbiAgICB0aGlzLm91dEZpbGVDaGFuZ2VkLmVtaXQodGhpcy5maWxlTGlzdCgpKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBzaG93RWRpdE1vZGFsKGZpbGVJdGVtOiBXcml0YWJsZVNpZ25hbDxJRmlsZT4pIHtcbiAgICBpZiAodGhpcy5pbWFnZUVkaXRvckNvbXBvbmVudFJlZikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBmaWxlRGF0YVVybCA9IGZpbGVJdGVtKCkudXJsIHx8IGZpbGVJdGVtKCkub3JpZ2luX3VybCB8fCAnJztcbiAgICB0aGlzLmltYWdlRWRpdG9yQ29tcG9uZW50UmVmID0gdGhpcy5keW5hbWljQ29tcG9uZW50U2VydmljZS5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShMaWJzVWlDb21wb25lbnRzSW1hZ2VFZGl0b3JDb21wb25lbnQpO1xuXG4gICAgdGhpcy5pbWFnZUVkaXRvckNvbXBvbmVudFJlZi5zZXRJbnB1dCgnaW1nU3JjJywgZmlsZURhdGFVcmwpO1xuICAgIHRoaXMuaW1hZ2VFZGl0b3JDb21wb25lbnRSZWYuc2V0SW5wdXQoJ3pJbmRleCcsIHRoaXMuekluZGV4KCkgKyAxKTtcbiAgICB0aGlzLmltYWdlRWRpdG9yQ29tcG9uZW50UmVmLnNldElucHV0KCduYW1lRmlsZScsIGZpbGVJdGVtKCkubmFtZSk7XG4gICAgdGhpcy5pbWFnZUVkaXRvckNvbXBvbmVudFJlZi5zZXRJbnB1dCgnYXNwZWN0UmF0aW8nLCB0aGlzLmFzcGVjdFJhdGlvKCkpO1xuICAgIHRoaXMuaW1hZ2VFZGl0b3JDb21wb25lbnRSZWYuaW5zdGFuY2Uub3V0Q2xvc2Uuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuZHluYW1pY0NvbXBvbmVudFNlcnZpY2UucmVtb3ZlKHRoaXMuaW1hZ2VFZGl0b3JDb21wb25lbnRSZWYpO1xuICAgICAgdGhpcy5pbWFnZUVkaXRvckNvbXBvbmVudFJlZiA9IHVuZGVmaW5lZDtcbiAgICB9KTtcblxuICAgIHRoaXMuaW1hZ2VFZGl0b3JDb21wb25lbnRSZWYuaW5zdGFuY2Uub3V0U2F2ZUZpbGUuc3Vic2NyaWJlKGFzeW5jIChyZXN1bHQ6IElTYXZlRmlsZSkgPT4ge1xuICAgICAgY29uc3QgbWVzc2FnZUVycm9yID0gIShhd2FpdCB0aGlzLmNoZWNrVmFsaWRGaWxlU2l6ZShyZXN1bHQuZmlsZSkpID8gdGhpcy5tZXNzYWdlTWF4U2l6ZUVycm9yKCkgOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBuYW1lRmlsZSA9IGZpbGVJdGVtKCkuZmlsZT8ubmFtZSB8fCBmaWxlSXRlbSgpLm5hbWU7XG4gICAgICBmaWxlSXRlbS51cGRhdGUoZGF0YSA9PiAoeyAuLi5kYXRhLCBmaWxlOiBjb252ZXJ0QmxvYlRvRmlsZShyZXN1bHQuZmlsZSwgbmFtZUZpbGUpLCBuYW1lOiBuYW1lRmlsZSwgb3JpZ2luX3VybDogdW5kZWZpbmVkLCBzaXplOiBnZXRMYWJlbEJ5U2l6ZUZpbGUocmVzdWx0LmZpbGUuc2l6ZSksIGVycm9yOiBtZXNzYWdlRXJyb3IsIHVybDogcmVzdWx0LnVybCwgaXNVcGRhdGU6IHRydWUgfSkpO1xuICAgICAgdGhpcy5vdXRGaWxlQ2hhbmdlZC5lbWl0KHRoaXMuZmlsZUxpc3QoKSk7XG4gICAgICB0aGlzLmltYWdlRWRpdG9yQ29tcG9uZW50UmVmPy5pbnN0YW5jZS5vdXRDbG9zZS5lbWl0KHsgaXNDbGlja0J1dHRvbkNsb3NlOiB0cnVlIH0pO1xuICAgIH0pO1xuICAgIHRoaXMuZHluYW1pY0NvbXBvbmVudFNlcnZpY2UuYWRkVG9Cb2R5KHRoaXMuaW1hZ2VFZGl0b3JDb21wb25lbnRSZWYpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGNoZWNrVmFsaWRGaWxlRXh0ZW5zaW9uKGZpbGU6IEZpbGUpIHtcbiAgICBjb25zdCBleHRlbnNpb24gPSBnZXRGaWxlRXh0ZW5zaW9uKGZpbGUpO1xuXG4gICAgaWYgKCFleHRlbnNpb24pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgaXNJbWFnZSA9IGlzVHlwZUltYWdlKGZpbGUpO1xuICAgIGNvbnN0IGlzVmlkZW8gPSBpc1R5cGVWaWRlbyhmaWxlKTtcbiAgICBjb25zdCBpc0F1ZGlvID0gaXNUeXBlQXVkaW8oZmlsZSk7XG4gICAgY29uc3QgdmFsaWRJbWFnZSA9IGlzSW5jbHVkZUltYWdlRXh0TGlzdChleHRlbnNpb24sIHRoaXMuaW1hZ2VFeHRMaXN0KCkpO1xuICAgIGNvbnN0IHZhbGlkVmlkZW8gPSBpc0luY2x1ZGVWaWRlb0V4dExpc3QoZXh0ZW5zaW9uLCB0aGlzLnZpZGVvRXh0TGlzdCgpKTtcbiAgICBjb25zdCB2YWxpZEF1ZGlvID0gaXNJbmNsdWRlQXVkaW9FeHRMaXN0KGV4dGVuc2lvbiwgdGhpcy5hdWRpb0V4dExpc3QoKSk7XG4gICAgY29uc3QgdmFsaWREb2N1bWVudCA9IGlzSW5jbHVkZURvY3VtZW50RXh0TGlzdChleHRlbnNpb24sIHRoaXMuZG9jdW1lbnRFeHRMaXN0KCkpO1xuXG4gICAgY29uc3QgdHlwZVNwbGl0ID0gdGhpcy5maWxlVHlwZSgpLnNwbGl0KCdfJyk7XG5cbiAgICBpZiAoaXNJbWFnZSAmJiB0eXBlU3BsaXQuaW5jbHVkZXMoJ2ltYWdlJykpIHtcbiAgICAgIHJldHVybiB2YWxpZEltYWdlO1xuICAgIH1cbiAgICBpZiAoaXNWaWRlbyAmJiB0eXBlU3BsaXQuaW5jbHVkZXMoJ3ZpZGVvJykpIHtcbiAgICAgIHJldHVybiB2YWxpZFZpZGVvO1xuICAgIH1cbiAgICBpZiAoaXNBdWRpbyAmJiB0eXBlU3BsaXQuaW5jbHVkZXMoJ2F1ZGlvJykpIHtcbiAgICAgIHJldHVybiB2YWxpZEF1ZGlvO1xuICAgIH1cbiAgICBpZiAodHlwZVNwbGl0LmluY2x1ZGVzKCdkb2N1bWVudCcpKSB7XG4gICAgICByZXR1cm4gdmFsaWREb2N1bWVudDtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgY2hlY2tWYWxpZEZpbGVTaXplKGZpbGU6IEZpbGUgfCBCbG9iKSB7XG4gICAgY29uc3QgaXNJbWFnZSA9IGlzVHlwZUltYWdlKGZpbGUpO1xuICAgIGNvbnN0IGlzVmlkZW8gPSBpc1R5cGVWaWRlbyhmaWxlKTtcbiAgICBjb25zdCBpc0F1ZGlvID0gaXNUeXBlQXVkaW8oZmlsZSk7XG4gICAgY29uc3QgdmFsaWRJbWFnZSA9IGZpbGUuc2l6ZSA8PSB0aGlzLm1heEltYWdlU2l6ZSgpO1xuICAgIGNvbnN0IHZhbGlkVmlkZW8gPSBmaWxlLnNpemUgPD0gdGhpcy5tYXhWaWRlb1NpemUoKTtcbiAgICBjb25zdCB2YWxpZEF1ZGlvID0gZmlsZS5zaXplIDw9IHRoaXMubWF4QXVkaW9TaXplKCk7XG4gICAgY29uc3QgdmFsaWREb2N1bWVudCA9IGZpbGUuc2l6ZSA8PSB0aGlzLm1heERvY3VtZW50U2l6ZSgpO1xuXG4gICAgY29uc3QgdHlwZVNwbGl0ID0gdGhpcy5maWxlVHlwZSgpLnNwbGl0KCdfJyk7XG5cbiAgICBpZiAoaXNJbWFnZSAmJiB0eXBlU3BsaXQuaW5jbHVkZXMoJ2ltYWdlJykpIHtcbiAgICAgIHJldHVybiB2YWxpZEltYWdlO1xuICAgIH1cbiAgICBpZiAoaXNWaWRlbyAmJiB0eXBlU3BsaXQuaW5jbHVkZXMoJ3ZpZGVvJykpIHtcbiAgICAgIHJldHVybiB2YWxpZFZpZGVvO1xuICAgIH1cbiAgICBpZiAoaXNBdWRpbyAmJiB0eXBlU3BsaXQuaW5jbHVkZXMoJ2F1ZGlvJykpIHtcbiAgICAgIHJldHVybiB2YWxpZEF1ZGlvO1xuICAgIH1cbiAgICBpZiAodHlwZVNwbGl0LmluY2x1ZGVzKCdkb2N1bWVudCcpKSB7XG4gICAgICByZXR1cm4gdmFsaWREb2N1bWVudDtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgdmFsaWRhdGUoKSB7XG4gICAgaWYgKHRoaXMudmFsaWRSZXF1aXJlZCgpPy5pc1JlcXVpcmVkICYmICF0aGlzLmZpbGVMaXN0KCkubGVuZ3RoKSB7XG4gICAgICB0aGlzLm1lc3NhZ2VFcnJvci5zZXQodGhpcy52YWxpZFJlcXVpcmVkKCk/Lm1lc3NhZ2UgfHwgRVJST1JfTUVTU0FHRV9FTVBUWV9WQUxJRCk7XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHRoaXMubXVsdGlwbGUoKSAmJiB0aGlzLmZpbGVMaXN0KCkubGVuZ3RoID4gdGhpcy5saW1pdEZpbGUoKSkge1xuICAgICAgdGhpcy5tZXNzYWdlRXJyb3Iuc2V0KHRoaXMubWVzc2FnZVRvdGFsRmlsZUV4Y2VlZHNFcnJvcigpKTtcblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBmaWxlRXJyb3IgPSB0aGlzLmZpbGVMaXN0KCkuZmluZChpdGVtID0+IGl0ZW0oKS5lcnJvcik7XG5cbiAgICBpZiAoZmlsZUVycm9yKSB7XG4gICAgICB0aGlzLm1lc3NhZ2VFcnJvci5zZXQodGhpcy5tdWx0aXBsZSgpID8gdGhpcy5tZXNzYWdlRmlsZVVwbG9hZEVycm9yKCkgOiBmaWxlRXJyb3IoKS5lcnJvcik7XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5tZXNzYWdlRXJyb3Iuc2V0KHVuZGVmaW5lZCk7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVyU2V0QXZhdGFyKGV2ZW50OiBFdmVudCwgZmlsZTogV3JpdGFibGVTaWduYWw8SUZpbGU+KSB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICB0aGlzLmZpbGVMaXN0KCkuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgIGlmIChpdGVtKCkuaWQgPT09IGZpbGUoKS5pZCkge1xuICAgICAgICBpdGVtLnVwZGF0ZShmaWxlID0+ICh7IC4uLmZpbGUsIGlzQXZhdGFyOiB0cnVlIH0pKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaXRlbS51cGRhdGUoZmlsZSA9PiAoeyAuLi5maWxlLCBpc0F2YXRhcjogZmFsc2UgfSkpO1xuICAgIH0pO1xuICAgIHRoaXMub3V0RmlsZUNoYW5nZWQuZW1pdCh0aGlzLmZpbGVMaXN0KCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZW1vdmVBbGxGaWxlKCkge1xuICAgIHRoaXMuZmlsZUxpc3Quc2V0KFtdKTtcbiAgICB0aGlzLm1lc3NhZ2VFcnJvci5zZXQodW5kZWZpbmVkKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVyRG93bmxvYWRTYW1wbGVGaWxlKGV2ZW50OiBFdmVudCkge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuY29uZmlnRG93bmxvYWRTYW1wbGVGaWxlKCk7XG4gICAgaWYgKCFjb25maWcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGNvbmZpZz8uY2FsbEJhY2spIHtcbiAgICAgIGNvbmZpZy5jYWxsQmFjaygpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChjb25maWc/LnVybCkge1xuICAgICAgZG93bmxvYWRGaWxlQnlVcmwoY29uZmlnLnVybCwgY29uZmlnLnRpdGxlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNob3dVcGxvYWRQb3B1cCgpIHtcbiAgICB0aGlzLnVwbG9hZElucHV0UmVmKCk/Lm5hdGl2ZUVsZW1lbnQuY2xpY2soKTtcbiAgICB0aGlzLnVwbG9hZElucHV0UmVmKCk/Lm5hdGl2ZUVsZW1lbnQuc2V0QXR0cmlidXRlKCdhY2NlcHQnLCB0aGlzLmFjY2Vzc0ZpbGVzKCkpO1xuICB9XG5cbiAgLy8gI2VuZHJlZ2lvblxuXG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5vbkRlc3Ryb3kubmV4dCgpO1xuICAgIHRoaXMub25EZXN0cm95LmNvbXBsZXRlKCk7XG4gIH1cbn0iLCI8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCB3LWZ1bGwgaC1mdWxsXCI+XG4gIDxkaXY+XG4gICAgQGlmIChsYWJlbENvbmZpZygpO2FzIGxhYmVsQ29uZmlnKSB7XG4gICAgICA8bGlic191aS1jb21wb25lbnRzLWxhYmVsIFtjbGFzc0luY2x1ZGVdPVwibGFiZWxDb25maWcuY2xhc3NJbmNsdWRlXCJcbiAgICAgICAgW2xhYmVsTGVmdF09XCJsYWJlbENvbmZpZy5sYWJlbExlZnRcIlxuICAgICAgICBbbGFiZWxMZWZ0Q2xhc3NdPVwibGFiZWxDb25maWcubGFiZWxMZWZ0Q2xhc3NcIlxuICAgICAgICBbcmVxdWlyZWRdPVwibGFiZWxDb25maWcucmVxdWlyZWQgXCJcbiAgICAgICAgW2Rlc2NyaXB0aW9uXT1cImxhYmVsQ29uZmlnLmRlc2NyaXB0aW9uXCJcbiAgICAgICAgW2xhYmVsUmlnaHRdPVwibGFiZWxDb25maWcubGFiZWxSaWdodFwiXG4gICAgICAgIFtsYWJlbFJpZ2h0Q2xhc3NdPVwibGFiZWxDb25maWcubGFiZWxSaWdodENsYXNzXCJcbiAgICAgICAgW29ubHlTaG93Q291bnRdPVwibGFiZWxDb25maWcub25seVNob3dDb3VudFwiXG4gICAgICAgIFtidXR0b25zTGVmdF09XCJsYWJlbENvbmZpZy5idXR0b25zTGVmdFwiXG4gICAgICAgIFtidXR0b25zUmlnaHRdPVwibGFiZWxDb25maWcuYnV0dG9uc1JpZ2h0XCJcbiAgICAgICAgW2Rpc2FibGVCdXR0b25zTGVmdF09XCJsYWJlbENvbmZpZy5kaXNhYmxlQnV0dG9uc0xlZnQgfHwgZGlzYWJsZSgpIHx8IHJlYWRvbmx5KCkgXCJcbiAgICAgICAgW2Rpc2FibGVCdXR0b25zUmlnaHRdPVwibGFiZWxDb25maWcuZGlzYWJsZUJ1dHRvbnNSaWdodCB8fCBkaXNhYmxlKCkgfHwgcmVhZG9ubHkoKSBcIlxuICAgICAgICBbaGFzVG9nZ2xlXT1cImxhYmVsQ29uZmlnLmhhc1RvZ2dsZVwiXG4gICAgICAgIFt0b2dnbGVBY3RpdmVdPVwibGFiZWxDb25maWcudG9nZ2xlQWN0aXZlXCJcbiAgICAgICAgW3RvZ2dsZURpc2FibGVdPVwibGFiZWxDb25maWcudG9nZ2xlRGlzYWJsZSB8fCBkaXNhYmxlKCkgfHwgcmVhZG9ubHkoKSBcIlxuICAgICAgICBbcG9wb3Zlcl09XCJsYWJlbENvbmZpZy5wb3BvdmVyXCJcbiAgICAgICAgW2ljb25Qb3BvdmVyQ2xhc3NdPVwibGFiZWxDb25maWcuaWNvblBvcG92ZXJDbGFzc1wiXG4gICAgICAgIFtvbmx5U2hvd0NvdW50XT1cImxhYmVsQ29uZmlnLm9ubHlTaG93Q291bnRcIlxuICAgICAgICBbbGltaXRMZW5ndGhdPVwibGFiZWxDb25maWcubGltaXRMZW5ndGhcIlxuICAgICAgICBbYnV0dG9uc0Rlc2NyaXB0aW9uXT1cImxhYmVsQ29uZmlnLmJ1dHRvbnNEZXNjcmlwdGlvblwiXG4gICAgICAgIFtkaXNhYmxlQnV0dG9uc0Rlc2NyaXB0aW9uXT1cImxhYmVsQ29uZmlnLmRpc2FibGVCdXR0b25zRGVzY3JpcHRpb24gfHwgZGlzYWJsZSgpIHx8IHJlYWRvbmx5KCkgXCJcbiAgICAgICAgW2J1dHRvbnNEZXNjcmlwdGlvbkNvbnRhaW5lckNsYXNzXT1cImxhYmVsQ29uZmlnLmJ1dHRvbnNEZXNjcmlwdGlvbkNvbnRhaW5lckNsYXNzXCJcbiAgICAgICAgW2NvdW50XT1cImxhYmVsQ29uZmlnLmNvdW50XCIgLz5cbiAgICB9XG4gICAgQGlmICgoIWNvbmZpZ0Rvd25sb2FkU2FtcGxlRmlsZSgpPy5wb3NpdGlvbiB8fCBjb25maWdEb3dubG9hZFNhbXBsZUZpbGUoKT8ucG9zaXRpb24gPT09ICd0b3AnKSAmJiBjb25maWdEb3dubG9hZFNhbXBsZUZpbGUoKTthcyBjb25maWdEb3dubG9hZFNhbXBsZUZpbGUpIHtcbiAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b24gW3R5cGVdPVwiJ2J1dHRvbi1saW5rLXByaW1hcnknXCJcbiAgICAgICAgW2NsYXNzTGFiZWxdPVwiJ2xpYnMtdWktZm9udC1oN20nXCJcbiAgICAgICAgW2NsYXNzSW5jbHVkZV09XCInIW1iLVs4cHhdICFwLTAnXCJcbiAgICAgICAgW2NsYXNzSWNvbkxlZnRdPVwiJ2xpYnMtdWktaWNvbi1hdHRhY2htZW50IGJlZm9yZTohdGV4dC1bMTJweF0nXCJcbiAgICAgICAgW2xhYmVsXT1cImNvbmZpZ0Rvd25sb2FkU2FtcGxlRmlsZT8udGl0bGUgfHwgJyAnXCJcbiAgICAgICAgKG91dENsaWNrKT1cImhhbmRsZXJEb3dubG9hZFNhbXBsZUZpbGUoJGV2ZW50KVwiIC8+XG4gICAgfVxuICAgIEBpZiAobXVsdGlwbGUoKSB8fCAhc2hvd1BvcHVwVXBsb2FkV2hlbkhhc0ZpbGVBbmRNb2RlU2luZ2xlKCkgfHwgKCFmaWxlTGlzdCgpLmxlbmd0aCAmJiAhbXVsdGlwbGUoKSkpIHtcbiAgICAgIDxkaXYgI3VwbG9hZFxuICAgICAgICBMaWJzVWlDb21wb25lbnRzSW5wdXRzVXBsb2FkRGlyZWN0aXZlXG4gICAgICAgIExpYnNVaUNvbXBvbmVudHNJbnB1dHNVcGxvYWREcm9wRmlsZURpcmVjdGl2ZVxuICAgICAgICBjbGFzcz1cImxpYnMtdWktY29tcG9uZW50cy1pbnB1dHMtdXBsb2FkXCJcbiAgICAgICAgW2NsYXNzLmxpYnMtdWktY29tcG9uZW50cy1pbnB1dHMtdXBsb2FkLWRpc2FibGVdPVwiZGlzYWJsZSgpIHx8IHJlYWRvbmx5KCkgIHx8ICghbXVsdGlwbGUoKSAmJiBmaWxlTGlzdCgpLmxlbmd0aCAmJiAhY2FuVXBsb2FkSWZIYXNFeGlzdEZpbGUoKSlcIlxuICAgICAgICBbY2xhc3MubGlicy11aS1jb21wb25lbnRzLWlucHV0cy11cGxvYWQtcmVhZG9ubHldPVwicmVhZG9ubHkoKVwiXG4gICAgICAgIFtjbGFzcy5saWJzLXVpLWNvbXBvbmVudHMtaW5wdXRzLXVwbG9hZC1lcnJvcl09XCJtZXNzYWdlRXJyb3IoKVwiXG4gICAgICAgIFttdWx0aXBsZV09XCJtdWx0aXBsZSgpXCJcbiAgICAgICAgW2FjY2Vzc0ZpbGVzXT1cImFjY2Vzc0ZpbGVzKClcIlxuICAgICAgICAob3V0VXBsb2FkRmlsZXMpPVwiaGFuZGxlVXBsb2FkRmlsZXMoJGV2ZW50KVwiXG4gICAgICAgIChvdXRVcGxvYWRGaWxlKT1cImhhbmRsZVVwbG9hZEZpbGVzKFskZXZlbnRdKVwiXG4gICAgICAgIChvdXREcmFnT3Zlcik9XCJoYW5kbGVyU2V0Q2xhc3NEcmFnKHRydWUpXCJcbiAgICAgICAgKG91dERyYWdMZWF2ZSk9XCJoYW5kbGVyU2V0Q2xhc3NEcmFnKGZhbHNlKVwiXG4gICAgICAgIChvdXREcm9wKT1cImhhbmRsZXJTZXRDbGFzc0RyYWcoZmFsc2UpXCJcbiAgICAgICAgKG91dERyb3BGaWxlcyk9XCJoYW5kbGVVcGxvYWRGaWxlcygkZXZlbnQpXCJcbiAgICAgICAgKG91dERyb3BGaWxlKT1cImhhbmRsZVVwbG9hZEZpbGVzKFskZXZlbnRdKVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibXItWzE2cHhdXCI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImxpYnMtdWktY29tcG9uZW50cy1pbnB1dHMtdXBsb2FkLWljb24gbGlicy11aS1pY29uLWZpbGUtdXBsb2FkIGJlZm9yZTohdGV4dC1bMzJweF1cIj48L2k+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImxpYnMtdWktY29tcG9uZW50cy1pbnB1dHMtdXBsb2FkLWRlc2NyaXB0aW9uXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItWzRweF0gbGlicy11aS1mb250LWg2bVwiXG4gICAgICAgICAgICAgIFtpbm5lckhUTUxdPVwiKGNvbmZpZ0Rlc2NyaXB0aW9uSW5wdXRVcGxvYWQoKS5tZXNzYWdlIHx8ICcnKSB8IHRyYW5zbGF0ZTpjb25maWdEZXNjcmlwdGlvbklucHV0VXBsb2FkKCkuaW50ZXJwb2xhdGVQYXJhbXNcIj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgQGZvciAoaXRlbSBvZiBkZXNjcmlwdGlvbkZvcm1hdEFuZFNpemVGaWxlQ29tcHV0ZWQoKTsgdHJhY2sgaXRlbTsgbGV0IGxhc3QgPSAkbGFzdCkge1xuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGlicy11aS1mb250LWg3clwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLm1iLVs0cHhdXT1cIiFsYXN0XCJcbiAgICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cIml0ZW0ubWVzc2FnZSB8IHRyYW5zbGF0ZTppdGVtLmludGVycG9sYXRlUGFyYW1zXCI+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgQGlmIChtdWx0aXBsZSgpKSB7XG4gICAgICAgICAgPGlucHV0ICN1cGxvYWRJbnB1dFxuICAgICAgICAgICAgY2xhc3M9XCJ1cGxvYWQtaW5wdXQgaGlkZGVuXCJcbiAgICAgICAgICAgIHR5cGU9XCJmaWxlXCJcbiAgICAgICAgICAgIG5hbWU9XCJmaWxlc1tdXCJcbiAgICAgICAgICAgIG11bHRpcGxlXG4gICAgICAgICAgICBbYWNjZXB0XT1cImFjY2Vzc0ZpbGVzKClcIiAvPlxuICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICA8aW5wdXQgI3VwbG9hZElucHV0XG4gICAgICAgICAgICBjbGFzcz1cInVwbG9hZC1pbnB1dCBoaWRkZW5cIlxuICAgICAgICAgICAgdHlwZT1cImZpbGVcIlxuICAgICAgICAgICAgbmFtZT1cImZpbGVzW11cIlxuICAgICAgICAgICAgW2FjY2VwdF09XCJhY2Nlc3NGaWxlcygpXCIgLz5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgfVxuICAgIEBpZiAobWVzc2FnZUVycm9yKCkgJiYgKG11bHRpcGxlKCkgfHwgIXNob3dQb3B1cFVwbG9hZFdoZW5IYXNGaWxlQW5kTW9kZVNpbmdsZSgpIHx8ICghZmlsZUxpc3QoKS5sZW5ndGggJiYgIW11bHRpcGxlKCkpKSkge1xuICAgICAgPGRpdiBjbGFzcz1cIm10LVs4cHhdIHRleHQtWyNlZTJkNDFdIGxpYnMtdWktZm9udC1oN3JcIj5cbiAgICAgICAge3sgKG1lc3NhZ2VFcnJvcigpIHx8ICcnKSB8IHRyYW5zbGF0ZTp7IHZhbHVlOiBsaW1pdEZpbGUoKSB9IH19XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gICAgQGlmIChjb25maWdEb3dubG9hZFNhbXBsZUZpbGUoKT8ucG9zaXRpb24gPT09ICdib3R0b20nICYmICBjb25maWdEb3dubG9hZFNhbXBsZUZpbGUoKTthcyBjb25maWdEb3dubG9hZFNhbXBsZUZpbGUpIHtcbiAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b24gW3R5cGVdPVwiJ2J1dHRvbi1saW5rLXByaW1hcnknXCJcbiAgICAgICAgW2NsYXNzTGFiZWxdPVwiJ2xpYnMtdWktZm9udC1oN20nXCJcbiAgICAgICAgW2NsYXNzSW5jbHVkZV09XCInIW10LVs4cHhdICFwLTAnXCJcbiAgICAgICAgW2NsYXNzSWNvbkxlZnRdPVwiJ2xpYnMtdWktaWNvbi1hdHRhY2htZW50IGJlZm9yZTohdGV4dC1bMTJweF0nXCJcbiAgICAgICAgW2xhYmVsXT1cImNvbmZpZ0Rvd25sb2FkU2FtcGxlRmlsZS50aXRsZSB8fCAnICdcIlxuICAgICAgICAobW9DbGljayk9XCJoYW5kbGVyRG93bmxvYWRTYW1wbGVGaWxlKCRldmVudClcIiAvPlxuICAgIH1cbiAgPC9kaXY+XG4gIEBpZiAoZmlsZUxpc3QoKS5sZW5ndGgpIHtcbiAgICA8ZGl2IExpYnNVaUNvbXBvbmVudHNTY3JvbGxPdmVybGF5RGlyZWN0aXZlXG4gICAgICBjbGFzcz1cInJlbGF0aXZlIHctZnVsbCBoLWZ1bGwgcHgtWzEwcHhdIGxpYnMtdWktY29tcG9uZW50cy1pbnB1dHMtdXBsb2FkLXZpZXctbGlzdCB7eyBjbGFzc0luY2x1ZGVGaWxlQ29udGVudCgpIHx8ICcnIH19XCJcbiAgICAgIFtjbGFzcy5tdC1bMTJweF1dPVwibXVsdGlwbGUoKSB8fCAhc2hvd1BvcHVwVXBsb2FkV2hlbkhhc0ZpbGVBbmRNb2RlU2luZ2xlKClcIj5cbiAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIltsYWJlbC1maWxlXVwiPjwvbmctY29udGVudD5cbiAgICAgIEBmb3IgKGl0ZW0gb2YgZmlsZUxpc3QoKTsgdHJhY2sgaXRlbSgpOyBsZXQgZmlyc3QgPSAkZmlyc3QpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cImxpYnMtdWktY29tcG9uZW50cy1pbnB1dHMtdXBsb2FkLXZpZXctbGlzdC1pdGVtIHt7IGNsYXNzSW5jbHVkZUxpc3RJdGVtKCkgfHwgJycgfX1cIlxuICAgICAgICAgIFtjbGFzcy5saWJzLXVpLWNvbXBvbmVudHMtaW5wdXRzLXVwbG9hZC1maWxlLWZ1bGxdPVwibW9kZURpc3BsYXlGaWxlKCkgPT09ICdmdWxsJ1wiXG4gICAgICAgICAgW2NsYXNzLmxpYnMtdWktY29tcG9uZW50cy1pbnB1dHMtdXBsb2FkLWZpbGUtc2hvcnRdPVwibW9kZURpc3BsYXlGaWxlKCkgPT09ICdzaG9ydCdcIlxuICAgICAgICAgIFtjbGFzcy5saWJzLXVpLWJvcmRlci1lcnJvci1nZW5lcmFsXT1cIml0ZW0oKS5lcnJvciB8fCAobWVzc2FnZUVycm9yKCkgJiYgc2hvd0JvcmRlckVycm9yQWxsSXRlbVdoZW5FcnJvcigpKVwiXG4gICAgICAgICAgW2NsYXNzLm10LTBdPVwiZmlyc3QgJiYgIW11bHRpcGxlKCkgJiYgIXNob3dQb3B1cFVwbG9hZFdoZW5IYXNGaWxlQW5kTW9kZVNpbmdsZSgpXCI+XG5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCB3LWZ1bGxcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICBAaWYgKGNhblNldEF2YXRhcigpICYmIGl0ZW0oKS50eXBlID09PSAnaW1hZ2UnKSB7XG4gICAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvbiBbdHlwZV09XCInYnV0dG9uLWxpbmstdGhpcmQnXCJcbiAgICAgICAgICAgICAgICAgIFtjbGFzc0ljb25MZWZ0XT1cIichbXItMCcgKyAoaXRlbSgpLmlzQXZhdGFyID8gJyBsaWJzLXVpLWljb24tY2hlY2stY2lyY2xlLXNvbGlkIGJlZm9yZTohdGV4dC1bIzAwYmM2Ml0nOiAnIGxpYnMtdWktaWNvbi1jaGVjay1jaXJjbGUtb3V0bGluZScpICsgKChkaXNhYmxlKCkgfHwgcmVhZG9ubHkoKSAgfHwgaXRlbSgpLmlzVXBsb2FkaW5nIHx8ICEhaXRlbSgpLmVycm9yKSA/ICcgbGlicy11aS1kaXNhYmxlJyA6ICcnKVwiXG4gICAgICAgICAgICAgICAgICBbcG9wb3Zlcl09XCJ7Y29uZmlnOnsgY29udGVudDogaXRlbSgpLmlzQXZhdGFyID8gJ2kxOG5fYXZhdGFyJyA6ICdpMThuX2Nob29zZV9hc195b3VyX2F2YXRhcicsIHpJbmRleDogekluZGV4KCl9fVwiXG4gICAgICAgICAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cIichbXItWzEycHhdICFwLTAnXCJcbiAgICAgICAgICAgICAgICAgIFtkaXNhYmxlXT1cImRpc2FibGUoKSB8fCByZWFkb25seSgpICB8fCBpdGVtKCkuaXNVcGxvYWRpbmcgfHwgISFpdGVtKCkuZXJyb3JcIlxuICAgICAgICAgICAgICAgICAgKG91dENsaWNrKT1cImhhbmRsZXJTZXRBdmF0YXIoJGV2ZW50LCBpdGVtKVwiIC8+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXhcIlxuICAgICAgICAgICAgICBbY2xhc3Mudy1bY2FsYygxMDAlLTI4cHgpXV09XCJjYW5TZXRBdmF0YXIoKVwiXG4gICAgICAgICAgICAgIFtjbGFzcy53LWZ1bGxdPVwiIWNhblNldEF2YXRhcigpXCI+XG4gICAgICAgICAgICAgIEBpZiAobW9kZURpc3BsYXlGaWxlKCkgPT09ICdmdWxsJykge1xuICAgICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtaW5wdXRzLXVwbG9hZC1hdmF0YXIgW2Rpc2FibGVdPVwiZGlzYWJsZSgpIHx8IHJlYWRvbmx5KCkgXCJcbiAgICAgICAgICAgICAgICAgIFsoaXRlbSldPVwiaXRlbVwiXG4gICAgICAgICAgICAgICAgICBbc2hvd1ZpZGVvRHVyYXRpb25dPVwic2hvd1ZpZGVvRHVyYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgICAob3V0T3BlblByZXZpZXcpPVwiaGFuZGxlck9wZW5QcmV2aWV3RmlsZSgkZXZlbnQpXCIgLz5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVsYXRpdmUgdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggYWJzb2x1dGUgdy1mdWxsIGgtZnVsbCBmbGV4LWNvbFwiXG4gICAgICAgICAgICAgICAgICBbY2xhc3MuZmxleC1jb2xdPVwibW9kZURpc3BsYXlGaWxlKCkgPT09ICdmdWxsJ1wiXG4gICAgICAgICAgICAgICAgICBbY2xhc3MuanVzdGlmeS1jZW50ZXJdPVwibW9kZURpc3BsYXlGaWxlKCkgPT09ICdmdWxsJ1wiXG4gICAgICAgICAgICAgICAgICBbY2xhc3MuaXRlbXMtY2VudGVyXT1cIm1vZGVEaXNwbGF5RmlsZSgpID09PSAnc2hvcnQnXCI+XG4gICAgICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWxhYmVsIGNsYXNzPVwiZmxleCB3LWZ1bGxcIlxuICAgICAgICAgICAgICAgICAgICBbbGFiZWxMZWZ0XT1cIml0ZW0oKS5uYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgW3pJbmRleFBvcG92ZXJdPVwiekluZGV4KCkgKyAxXCJcbiAgICAgICAgICAgICAgICAgICAgW2xhYmVsTGVmdENsYXNzXT1cIidsaWJzLXVpLWZvbnQtaDZtICcgKyAoKGRpc2FibGUoKSB8fCByZWFkb25seSgpICB8fCBpdGVtKCkuaXNVcGxvYWRpbmcgfHwgaXRlbSgpLmVycm9yKSA/ICd0ZXh0LVsjNmE3MzgzXScgOiAndGV4dC1bIzA3MTYzMV0nKVwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwibW9kZURpc3BsYXlGaWxlKCkgPT09ICdzaG9ydCcgPyAnIW1iLTAnIDogJydcIiAvPlxuXG4gICAgICAgICAgICAgICAgICBAaWYgKCFpZ25vcmVTaG93U2l6ZUZpbGUoKSkge1xuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1bIzljYTJhZF0gbGlicy11aS1mb250LWg3ciBzaHJpbmstMFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmZsZXhdPVwibW9kZURpc3BsYXlGaWxlKCkgPT09ICdmdWxsJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLml0ZW1zLWNlbnRlcl09XCJtb2RlRGlzcGxheUZpbGUoKSA9PT0gJ3Nob3J0J1wiXG4gICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm1sLVsxMnB4XV09XCJtb2RlRGlzcGxheUZpbGUoKSA9PT0gJ3Nob3J0J1wiPlxuICAgICAgICAgICAgICAgICAgICAgIHt7IGl0ZW0oKS5zaXplIH19XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgQGlmIChpdGVtKCkuaXNVcGxvYWRpbmcgJiYgaXRlbSgpLnBlcmNlbnRVcGxvYWRpbmcpIHtcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgbWwtWzE2cHhdXCJcbiAgICAgICAgICAgICAgICAgIFtjbGFzcy5tci1bMjZweF1dPVwibW9kZURpc3BsYXlGaWxlKCkgPT09ICdmdWxsJ1wiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctWzEyMHB4XSBoLVs0cHhdIHJvdW5kZWQtWzRweF0gYmctWyNmOGY5ZmFdIHJlbGF0aXZlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhYnNvbHV0ZSB0b3AtMCBsZWZ0LTAgaC1bNHB4XSByb3VuZGVkLVs0cHhdIGJnLVsjMDBiYzYyXVwiXG4gICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cIihpdGVtKCkucGVyY2VudFVwbG9hZGluZyA/PyAwKSoxLjJcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IG1sLVsxNnB4XVwiPlxuICAgICAgICAgICAgQGlmICghaWdub3JlSWNvblByZXZpZXcoKSkge1xuICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uIFt0eXBlXT1cIididXR0b24tbGluay10aGlyZCdcIlxuICAgICAgICAgICAgICAgIFtjbGFzc0ljb25MZWZ0XT1cIidsaWJzLXVpLWljb24tZXllLW91dGxpbmUgIW1yLTAnXCJcbiAgICAgICAgICAgICAgICBbcG9wb3Zlcl09XCJ7Y29uZmlnOnsgY29udGVudDogJ2kxOG5fcHJldmlldycsIHpJbmRleDogekluZGV4KCkrMX19XCJcbiAgICAgICAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cIichcC0wJyArIChpZ25vcmVJY29uUmVtb3ZlKCkgJiYgIWlnbm9yZUljb25FZGl0KCkgPyAnJyA6ICcgIW1yLVsxMnB4XScpXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZV09XCJpdGVtKCkuaXNVcGxvYWRpbmcgfHwgZGlzYWJsZSgpIHx8IHJlYWRvbmx5KCkgXCJcbiAgICAgICAgICAgICAgICAob3V0Q2xpY2spPVwiaGFuZGxlck9wZW5QcmV2aWV3RmlsZShpdGVtKCkpXCIgLz5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBpZiAoaXRlbSgpLnR5cGUgPT09ICdpbWFnZScgJiYgIWl0ZW0oKS5lcnJvciAmJiAhaWdub3JlSWNvbkVkaXQoKSkge1xuICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uIFt0eXBlXT1cIididXR0b24tbGluay10aGlyZCdcIlxuICAgICAgICAgICAgICAgIFtjbGFzc0ljb25MZWZ0XT1cIidsaWJzLXVpLWljb24tZWRpdC1saW5lICFtci0wJ1wiXG4gICAgICAgICAgICAgICAgW3BvcG92ZXJdPVwie2NvbmZpZzp7IGNvbnRlbnQ6ICdpMThuX2VkaXQnLCB6SW5kZXg6IHpJbmRleCgpKzF9fVwiXG4gICAgICAgICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCInIXAtMCcgKyAoaWdub3JlSWNvblJlbW92ZSgpID8gJycgOiAnICFtci1bMTJweF0nKVwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVdPVwiaXRlbSgpLmlzVXBsb2FkaW5nIHx8IGRpc2FibGUoKSB8fCByZWFkb25seSgpIFwiXG4gICAgICAgICAgICAgICAgKG91dENsaWNrKT1cImhhbmRsZXJFZGl0SW1hZ2UoJGV2ZW50LCBpdGVtKVwiIC8+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAaWYgKCFpZ25vcmVJY29uUmVtb3ZlKCkpIHtcbiAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvbiBbdHlwZV09XCInYnV0dG9uLWxpbmstdGhpcmQnXCJcbiAgICAgICAgICAgICAgICBbY2xhc3NJY29uTGVmdF09XCInbGlicy11aS1pY29uLWNsb3NlICFtci0wJ1wiXG4gICAgICAgICAgICAgICAgW3BvcG92ZXJdPVwie2NvbmZpZzoge2NvbnRlbnQ6ICdpMThuX2RlbGV0ZScsIHpJbmRleDogekluZGV4KCkrMX19XCJcbiAgICAgICAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cIichcC0wJ1wiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVdPVwiaXRlbSgpLmlzVXBsb2FkaW5nIHx8IGRpc2FibGUoKSB8fCByZWFkb25seSgpIFwiXG4gICAgICAgICAgICAgICAgKG91dENsaWNrKT1cImhhbmRsZXJSZW1vdmVGaWxlKCRldmVudCwgaXRlbSlcIiAvPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgQGlmIChpdGVtKCkuZXJyb3IgJiYgKG11bHRpcGxlKCkgfHwgc2hvd1BvcHVwVXBsb2FkV2hlbkhhc0ZpbGVBbmRNb2RlU2luZ2xlKCkpKSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm10LVs4cHhdIHRleHQtWyNlZTJkNDFdIGxpYnMtdWktZm9udC1oN3JcIj57eyAoaXRlbSgpLmVycm9yIHx8ICcgJykgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgfVxuICAgICAgfVxuICAgIDwvZGl2PlxuICB9XG48L2Rpdj5cbiJdfQ==
|
|
443
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBsb2FkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMtdWkvY29tcG9uZW50cy9pbnB1dHMvdXBsb2FkL3NyYy91cGxvYWQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL2lucHV0cy91cGxvYWQvc3JjL3VwbG9hZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWlCLHVCQUF1QixFQUFFLFNBQVMsRUFBZ0IsUUFBUSxFQUFFLE1BQU0sRUFBYyxNQUFNLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQWtCLE1BQU0sZUFBZSxDQUFDO0FBQ3ROLE9BQU8sRUFBRSxzQ0FBc0MsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzVGLE9BQU8sRUFBRSxzQ0FBc0MsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3JGLE9BQU8sRUFBYSxvQ0FBb0MsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ25HLE9BQU8sRUFBVSw4QkFBOEIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ25GLE9BQU8sRUFBRSxvQ0FBb0MsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3hGLE9BQU8sRUFBRSxzQ0FBc0MsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBRTVGLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ3BGLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQzNFLE9BQU8sRUFDTCxZQUFZLEVBQ1osaUJBQWlCLEVBQ2pCLDZCQUE2QixFQUM3QixlQUFlLEVBQ2YsaUJBQWlCLEVBQ2pCLHlCQUF5QixFQUN6QixnQkFBZ0IsRUFDaEIsa0JBQWtCLEVBQ2xCLFlBQVksRUFDWixxQkFBcUIsRUFDckIsd0JBQXdCLEVBQ3hCLHFCQUFx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U0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDNUIsQ0FBQzt3R0FwZFUscUNBQXFDOzRGQUFyQyxxQ0FBcUMsbTRNQ3REbEQsc3pXQXlOQSwwL0hEN0tJLGVBQWUsNEZBQ2Ysc0NBQXNDLHNqQkFDdEMsOEJBQThCLDRxQkFDOUIsMkNBQTJDLHlMQUMzQyxzQ0FBc0MsNlNBQ3RDLHFDQUFxQyx1S0FDckMsNkNBQTZDOzs0RkFJcEMscUNBQXFDO2tCQWpCakQsU0FBUzsrQkFFRSxrQ0FBa0MsY0FHaEMsSUFBSSxXQUNQO3dCQUNQLGVBQWU7d0JBQ2Ysc0NBQXNDO3dCQUN0Qyw4QkFBOEI7d0JBQzlCLDJDQUEyQzt3QkFDM0Msc0NBQXNDO3dCQUN0QyxxQ0FBcUM7d0JBQ3JDLDZDQUE2QztxQkFDOUMsbUJBQ2dCLHVCQUF1QixDQUFDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdJbml0LCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBDb21wb25lbnRSZWYsIGNvbXB1dGVkLCBlZmZlY3QsIEVsZW1lbnRSZWYsIGluamVjdCwgaW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBvdXRwdXQsIHNpZ25hbCwgdW50cmFja2VkLCB2aWV3Q2hpbGQsIFdyaXRhYmxlU2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzQnV0dG9uc0J1dHRvbkNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtYnV0dG9ucy1idXR0b24nO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c0dhbGxlcnlWaWV3ZXJDb21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWdhbGxlcnknO1xuaW1wb3J0IHsgSVNhdmVGaWxlLCBMaWJzVWlDb21wb25lbnRzSW1hZ2VFZGl0b3JDb21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWltYWdlLWVkaXRvcic7XG5pbXBvcnQgeyBJTGFiZWwsIExpYnNVaUNvbXBvbmVudHNMYWJlbENvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtbGFiZWwnO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c1ByZXZpZXdGaWxlQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1wcmV2aWV3LWZpbGUnO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c1Njcm9sbE92ZXJsYXlEaXJlY3RpdmUgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLXNjcm9sbC1vdmVybGF5JztcbmltcG9ydCB7IElBc3BlY3RSYXRpbywgSUZpbGUsIElJc1ZhbGlkUmVxdWlyZWQsIElNZXNzYWdlVHJhbnNsYXRlIH0gZnJvbSAnQGxpYnMtdWkvaW50ZXJmYWNlcy10eXBlcyc7XG5pbXBvcnQgeyBMaWJzVWlEeW5hbWljQ29tcG9uZW50U2VydmljZSB9IGZyb20gJ0BsaWJzLXVpL3NlcnZpY2VzLWR5bmFtaWMtY29tcG9uZW50JztcbmltcG9ydCB7IExpYnNVaU5vdGlmaWNhdGlvblNlcnZpY2UgfSBmcm9tICdAbGlicy11aS9zZXJ2aWNlcy1ub3RpZmljYXRpb24nO1xuaW1wb3J0IHtcbiAgQXVkaW9FeHRMaXN0LFxuICBjb252ZXJ0QmxvYlRvRmlsZSxcbiAgY29udmVydEZpbGVUb0Jhc2U2NF9PYmplY3RVcmwsXG4gIERvY3VtZW50RXh0TGlzdCxcbiAgZG93bmxvYWRGaWxlQnlVcmwsXG4gIEVSUk9SX01FU1NBR0VfRU1QVFlfVkFMSUQsXG4gIGdldEZpbGVFeHRlbnNpb24sXG4gIGdldExhYmVsQnlTaXplRmlsZSxcbiAgSW1hZ2VFeHRMaXN0LFxuICBpc0luY2x1ZGVBdWRpb0V4dExpc3QsXG4gIGlzSW5jbHVkZURvY3VtZW50RXh0TGlzdCxcbiAgaXNJbmNsdWRlSW1hZ2VFeHRMaXN0LFxuICBpc0luY2x1ZGVWaWRlb0V4dExpc3QsXG4gIGlzVHlwZUF1ZGlvLFxuICBpc1R5cGVJbWFnZSxcbiAgaXNUeXBlVmlkZW8sXG4gIHV1aWQsXG4gIFZpZGVvRXh0TGlzdCxcbn0gZnJvbSAnQGxpYnMtdWkvdXRpbHMnO1xuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlLCBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzSW5wdXRzVXBsb2FkQXZhdGFyQ29tcG9uZW50IH0gZnJvbSAnLi9hdmF0YXIvYXZhdGFyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBnZXREZXNjcmlwdGlvbkZvcm1hdEFuZFNpemVGaWxlRGVmYXVsdCB9IGZyb20gJy4vZGVmaW5lcy9oZWxwZXIuZGVmaW5lJztcbmltcG9ydCB7IElVcGxvYWRDb25maWdEb3dubG9hZFNhbXBsZUZpbGUsIElVcGxvYWREZXNjcmlwdGlvbkZvcm1hdEFuZFNpemVGaWxlLCBJVXBsb2FkRnVuY3Rpb25Db250cm9sRXZlbnQsIFRZUEVfRklMRV9VUExPQUQsIFRZUEVfTU9ERV9GSUxFX0RJU1BMQVkgfSBmcm9tICcuL2ludGVyZmFjZXMvdXBsb2FkLmludGVyZmFjZSc7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzSW5wdXRzVXBsb2FkRHJvcEZpbGVEaXJlY3RpdmUgfSBmcm9tICcuL3VwbG9hZC1kcm9wLWZpbGUuZGlyZWN0aXZlJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNJbnB1dHNVcGxvYWREaXJlY3RpdmUgfSBmcm9tICcuL3VwbG9hZC1maWxlLmRpcmVjdGl2ZSc7XG5AQ29tcG9uZW50KHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9jb21wb25lbnQtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICdsaWJzX3VpLWNvbXBvbmVudHMtaW5wdXRzLXVwbG9hZCcsXG4gIHRlbXBsYXRlVXJsOiAnLi91cGxvYWQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi91cGxvYWQuY29tcG9uZW50LnNjc3MnXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIFRyYW5zbGF0ZU1vZHVsZSxcbiAgICBMaWJzVWlDb21wb25lbnRzQnV0dG9uc0J1dHRvbkNvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzTGFiZWxDb21wb25lbnQsXG4gICAgTGlic1VpQ29tcG9uZW50c0lucHV0c1VwbG9hZEF2YXRhckNvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzU2Nyb2xsT3ZlcmxheURpcmVjdGl2ZSxcbiAgICBMaWJzVWlDb21wb25lbnRzSW5wdXRzVXBsb2FkRGlyZWN0aXZlLFxuICAgIExpYnNVaUNvbXBvbmVudHNJbnB1dHNVcGxvYWREcm9wRmlsZURpcmVjdGl2ZSxcbiAgXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIExpYnNVaUNvbXBvbmVudHNJbnB1dHNVcGxvYWRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gIC8vICNyZWdpb24gUFJPUEVSVElFU1xuICBwcml2YXRlIGltYWdlRWRpdG9yQ29tcG9uZW50UmVmPzogQ29tcG9uZW50UmVmPExpYnNVaUNvbXBvbmVudHNJbWFnZUVkaXRvckNvbXBvbmVudD47XG4gIHByaXZhdGUgcHJldmlld0ZpbGVDb21wb25lbnRSZWY/OiBDb21wb25lbnRSZWY8TGlic1VpQ29tcG9uZW50c1ByZXZpZXdGaWxlQ29tcG9uZW50PjtcbiAgcHJpdmF0ZSBwcmV2aWV3RmlsZUltYWdlQ29tcG9uZW50UmVmPzogQ29tcG9uZW50UmVmPExpYnNVaUNvbXBvbmVudHNHYWxsZXJ5Vmlld2VyQ29tcG9uZW50PjtcbiAgcHJvdGVjdGVkIGlzRHJhZ092ZXIgPSBzaWduYWwoZmFsc2UpO1xuICBwcm90ZWN0ZWQgZmlsZUxpc3QgPSBzaWduYWw8QXJyYXk8V3JpdGFibGVTaWduYWw8SUZpbGU+Pj4oW10pO1xuICBwcm90ZWN0ZWQgYWNjZXNzRmlsZXMgPSBzaWduYWw8c3RyaW5nPignJyk7XG4gIHByb3RlY3RlZCBtZXNzYWdlRXJyb3IgPSBzaWduYWw8c3RyaW5nIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcm90ZWN0ZWQgZGVzY3JpcHRpb25Gb3JtYXRBbmRTaXplRmlsZUNvbXB1dGVkID0gY29tcHV0ZWQ8QXJyYXk8SVVwbG9hZERlc2NyaXB0aW9uRm9ybWF0QW5kU2l6ZUZpbGU+PigoKSA9PiB7XG4gICAgaWYgKHRoaXMuZGVzY3JpcHRpb25Gb3JtYXRBbmRTaXplRmlsZSgpPy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB0aGlzLmRlc2NyaXB0aW9uRm9ybWF0QW5kU2l6ZUZpbGUoKSBhcyB1bmtub3duIGFzIEFycmF5PElVcGxvYWREZXNjcmlwdGlvbkZvcm1hdEFuZFNpemVGaWxlPjtcbiAgICB9XG4gICAgcmV0dXJuIGdldERlc2NyaXB0aW9uRm9ybWF0QW5kU2l6ZUZpbGVEZWZhdWx0KHRoaXMuZmlsZVR5cGUoKSwgdGhpcy5tYXhJbWFnZVNpemUoKSwgdGhpcy5tYXhWaWRlb1NpemUoKSwgdGhpcy5tYXhEb2N1bWVudFNpemUoKSwgdGhpcy5tYXhBdWRpb1NpemUoKSk7XG4gIH0pO1xuXG4gIHByaXZhdGUgb25EZXN0cm95ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgLy8gI2VuZHJlZ2lvblxuXG4gIC8vICNyZWdpb24gSU5QVVRTXG4gIHJlYWRvbmx5IG9yaWdpbkZpbGVzID0gaW5wdXQ8QXJyYXk8V3JpdGFibGVTaWduYWw8SUZpbGU+PiwgQXJyYXk8V3JpdGFibGVTaWduYWw8SUZpbGU+PiB8IHVuZGVmaW5lZD4oW10sIHsgdHJhbnNmb3JtOiAodmFsKSA9PiB2YWwgPz8gW10gfSk7XG4gIHJlYWRvbmx5IGZpbGVUeXBlID0gaW5wdXQ8VFlQRV9GSUxFX1VQTE9BRCwgVFlQRV9GSUxFX1VQTE9BRCB8IHVuZGVmaW5lZD4oJ2ltYWdlX3ZpZGVvX2RvY3VtZW50JywgeyB0cmFuc2Zvcm06ICh2YWwpID0+IHZhbCA/PyAnaW1hZ2VfdmlkZW9fZG9jdW1lbnQnIH0pO1xuICByZWFkb25seSBtdWx0aXBsZSA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGNhblVwbG9hZElmSGFzRXhpc3RGaWxlID0gaW5wdXQ8Ym9vbGVhbiwgYm9vbGVhbiB8IHVuZGVmaW5lZD4oZmFsc2UsIHsgdHJhbnNmb3JtOiAodmFsKSA9PiB2YWwgPz8gZmFsc2UgfSk7XG4gIHJlYWRvbmx5IGNhblNldEF2YXRhciA9IGlucHV0PGJvb2xlYW4gfCB1bmRlZmluZWQ+KGZhbHNlKTtcbiAgcmVhZG9ubHkgbGltaXRGaWxlID0gaW5wdXQ8bnVtYmVyLCBudW1iZXIgfCB1bmRlZmluZWQ+KDEwLCB7IHRyYW5zZm9ybTogKHZhbCkgPT4gdmFsID8/IDEwIH0pO1xuICByZWFkb25seSBtYXhUb3RhbFNpemUgPSBpbnB1dDxudW1iZXIsIG51bWJlciB8IHVuZGVmaW5lZD4oMTAgKiAxMDI0ICogMTAyNCwgeyB0cmFuc2Zvcm06ICh2YWwpID0+IHZhbCA/PyAxMCAqIDEwMjQgKiAxMDI0IH0pO1xuICByZWFkb25seSBtYXhJbWFnZVNpemUgPSBpbnB1dDxudW1iZXIsIG51bWJlciB8IHVuZGVmaW5lZD4oNSAqIDEwMjQgKiAxMDI0LCB7IHRyYW5zZm9ybTogKHZhbCkgPT4gdmFsID8/IDUgKiAxMDI0ICogMTAyNCB9KTtcbiAgcmVhZG9ubHkgbWF4VmlkZW9TaXplID0gaW5wdXQ8bnVtYmVyLCBudW1iZXIgfCB1bmRlZmluZWQ+KDEwICogMTAyNCAqIDEwMjQsIHsgdHJhbnNmb3JtOiAodmFsKSA9PiB2YWwgPz8gMTAgKiAxMDI0ICogMTAyNCB9KTtcbiAgcmVhZG9ubHkgbWF4RG9jdW1lbnRTaXplID0gaW5wdXQ8bnVtYmVyLCBudW1iZXIgfCB1bmRlZmluZWQ+KDEwICogMTAyNCAqIDEwMjQsIHsgdHJhbnNmb3JtOiAodmFsKSA9PiB2YWwgPz8gMTAgKiAxMDI0ICogMTAyNCB9KTtcbiAgcmVhZG9ubHkgbWF4QXVkaW9TaXplID0gaW5wdXQ8bnVtYmVyLCBudW1iZXIgfCB1bmRlZmluZWQ+KDEwICogMTAyNCAqIDEwMjQsIHsgdHJhbnNmb3JtOiAodmFsKSA9PiB2YWwgPz8gMTAgKiAxMDI0ICogMTAyNCB9KTtcbiAgcmVhZG9ubHkgaW1hZ2VFeHRMaXN0ID0gaW5wdXQ8c3RyaW5nW10sIHN0cmluZ1tdIHwgdW5kZWZpbmVkPihJbWFnZUV4dExpc3QsIHsgdHJhbnNmb3JtOiAodmFsKSA9PiB2YWwgPz8gSW1hZ2VFeHRMaXN0IH0pO1xuICByZWFkb25seSB2aWRlb0V4dExpc3QgPSBpbnB1dDxzdHJpbmdbXSwgc3RyaW5nW10gfCB1bmRlZmluZWQ+KFZpZGVvRXh0TGlzdCwgeyB0cmFuc2Zvcm06ICh2YWwpID0+IHZhbCA/PyBWaWRlb0V4dExpc3QgfSk7XG4gIHJlYWRvbmx5IGRvY3VtZW50RXh0TGlzdCA9IGlucHV0PHN0cmluZ1tdLCBzdHJpbmdbXSB8IHVuZGVmaW5lZD4oRG9jdW1lbnRFeHRMaXN0LCB7IHRyYW5zZm9ybTogKHZhbCkgPT4gdmFsID8/IERvY3VtZW50RXh0TGlzdCB9KTtcbiAgcmVhZG9ubHkgYXVkaW9FeHRMaXN0ID0gaW5wdXQ8c3RyaW5nW10sIHN0cmluZ1tdIHwgdW5kZWZpbmVkPihBdWRpb0V4dExpc3QsIHsgdHJhbnNmb3JtOiAodmFsKSA9PiB2YWwgPz8gQXVkaW9FeHRMaXN0IH0pO1xuICByZWFkb25seSBjbGFzc0luY2x1ZGVMaXN0SXRlbSA9IGlucHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgdmFsaWRSZXF1aXJlZCA9IGlucHV0PElJc1ZhbGlkUmVxdWlyZWQ+KCk7XG4gIHJlYWRvbmx5IGRpc2FibGUgPSBpbnB1dDxib29sZWFuLCBib29sZWFuIHwgdW5kZWZpbmVkPihmYWxzZSwgeyB0cmFuc2Zvcm06ICh2YWwpID0+IHZhbCA/PyBmYWxzZSB9KTtcbiAgcmVhZG9ubHkgcmVhZG9ubHkgPSBpbnB1dDxib29sZWFuLCBib29sZWFuIHwgdW5kZWZpbmVkPihmYWxzZSwgeyB0cmFuc2Zvcm06ICh2YWwpID0+IHZhbCA/PyBmYWxzZSB9KTtcbiAgcmVhZG9ubHkgYXNwZWN0UmF0aW8gPSBpbnB1dDxJQXNwZWN0UmF0aW8+KCk7XG4gIHJlYWRvbmx5IHpJbmRleCA9IGlucHV0PG51bWJlciwgbnVtYmVyIHwgdW5kZWZpbmVkPigxMjAwLCB7IHRyYW5zZm9ybTogKHZhbCkgPT4gdmFsID8/IDEyMDAgfSk7XG4gIHJlYWRvbmx5IGlnbm9yZVNob3dTaXplRmlsZSA9IGlucHV0PGJvb2xlYW4sIGJvb2xlYW4gfCB1bmRlZmluZWQ+KGZhbHNlLCB7IHRyYW5zZm9ybTogKHZhbCkgPT4gdmFsID8/IGZhbHNlIH0pO1xuICByZWFkb25seSBhbGxvd1Nob3dQdXNoTWVzc2FnZU1heFNpemVFcnJvciA9IGlucHV0PGJvb2xlYW4sIGJvb2xlYW4gfCB1bmRlZmluZWQ+KGZhbHNlLCB7IHRyYW5zZm9ybTogKHZhbCkgPT4gdmFsID8/IGZhbHNlIH0pO1xuICByZWFkb25seSBtZXNzYWdlVHlwZUZpbGVFcnJvciA9IGlucHV0PHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPignaTE4bl90aGVfZmlsZV9zdXBwb3J0X2Zvcm1hdF9pc19ub3RfY29ycmVjdCcsIHsgdHJhbnNmb3JtOiAodmFsKSA9PiB2YWwgfHwgJ2kxOG5fdGhlX2ZpbGVfc3VwcG9ydF9mb3JtYXRfaXNfbm90X2NvcnJlY3QnIH0pO1xuICByZWFkb25seSBtZXNzYWdlTWF4U2l6ZUVycm9yID0gaW5wdXQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KCdpMThuX2ZpbGVfc2l6ZV9leGNlZWRzX3RoZV9hbGxvd2VkX2xpbWl0JywgeyB0cmFuc2Zvcm06ICh2YWwpID0+IHZhbCB8fCAnaTE4bl9maWxlX3NpemVfZXhjZWVkc190aGVfYWxsb3dlZF9saW1pdCcgfSk7XG4gIHJlYWRvbmx5IG1lc3NhZ2VGaWxlVXBsb2FkRXJyb3IgPSBpbnB1dDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4oJ2kxOG5faW52YWxpZF9maWxlX3VwbG9hZCcsIHsgdHJhbnNmb3JtOiAodmFsKSA9PiB2YWwgfHwgJ2kxOG5faW52YWxpZF9maWxlX3VwbG9hZCcgfSk7XG4gIHJlYWRvbmx5IG1lc3NhZ2VUb3RhbEZpbGVFeGNlZWRzRXJyb3IgPSBpbnB1dDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4oJ2kxOG5fZmlsZV9udW1iZXJfZXhjZWVkc190aGVfYWxsb3dlZF9saW1pdF9wbGVhc2VfZGVsZXRlX3RoZV9maWxlJywgeyB0cmFuc2Zvcm06ICh2YWwpID0+IHZhbCB8fCAnaTE4bl9maWxlX251bWJlcl9leGNlZWRzX3RoZV9hbGxvd2VkX2xpbWl0X3BsZWFzZV9kZWxldGVfdGhlX2ZpbGUnIH0pO1xuICByZWFkb25seSBjb25maWdEZXNjcmlwdGlvbklucHV0VXBsb2FkID0gaW5wdXQ8SU1lc3NhZ2VUcmFuc2xhdGUsIElNZXNzYWdlVHJhbnNsYXRlIHwgdW5kZWZpbmVkPihcbiAgICB7IG1lc3NhZ2U6ICdpMThuX2RyYWdfZmlsZV9oZXJlX3RvX3VwbG9hZF9vcl9zZWxlY3RfZmlsZScgfSxcbiAgICB7XG4gICAgICB0cmFuc2Zvcm06ICh2YWwpID0+IHZhbCA/PyB7IG1lc3NhZ2U6ICdpMThuX2RyYWdfZmlsZV9oZXJlX3RvX3VwbG9hZF9vcl9zZWxlY3RfZmlsZScgfSxcbiAgICB9XG4gICk7XG5cbiAgcmVhZG9ubHkgbW9kZURpc3BsYXlGaWxlID0gaW5wdXQ8VFlQRV9NT0RFX0ZJTEVfRElTUExBWSwgVFlQRV9NT0RFX0ZJTEVfRElTUExBWSB8IHVuZGVmaW5lZD4oJ2Z1bGwnLCB7IHRyYW5zZm9ybTogKHZhbCkgPT4gdmFsIHx8ICdmdWxsJyB9KTtcbiAgcmVhZG9ubHkgZGVzY3JpcHRpb25Gb3JtYXRBbmRTaXplRmlsZSA9IGlucHV0PEFycmF5PElVcGxvYWREZXNjcmlwdGlvbkZvcm1hdEFuZFNpemVGaWxlPj4oKTtcbiAgcmVhZG9ubHkgc2hvd1ZpZGVvRHVyYXRpb24gPSBpbnB1dDxib29sZWFuLCBib29sZWFuIHwgdW5kZWZpbmVkPihmYWxzZSwgeyB0cmFuc2Zvcm06ICh2YWwpID0+IHZhbCA/PyBmYWxzZSB9KTtcbiAgcmVhZG9ubHkgbGFiZWxDb25maWcgPSBpbnB1dDxJTGFiZWw+KCk7XG4gIHJlYWRvbmx5IHNob3dQb3B1cFVwbG9hZFdoZW5IYXNGaWxlQW5kTW9kZVNpbmdsZSA9IGlucHV0PGJvb2xlYW4sIGJvb2xlYW4gfCB1bmRlZmluZWQ+KGZhbHNlLCB7IHRyYW5zZm9ybTogKHZhbCkgPT4gdmFsID8/IGZhbHNlIH0pO1xuICByZWFkb25seSBpZ25vcmVJY29uUmVtb3ZlID0gaW5wdXQ8Ym9vbGVhbiwgYm9vbGVhbiB8IHVuZGVmaW5lZD4oZmFsc2UsIHsgdHJhbnNmb3JtOiAodmFsKSA9PiB2YWwgPz8gZmFsc2UgfSk7XG4gIHJlYWRvbmx5IGlnbm9yZUljb25FZGl0ID0gaW5wdXQ8Ym9vbGVhbiwgYm9vbGVhbiB8IHVuZGVmaW5lZD4oZmFsc2UsIHsgdHJhbnNmb3JtOiAodmFsKSA9PiB2YWwgPz8gZmFsc2UgfSk7XG4gIHJlYWRvbmx5IGlnbm9yZUljb25QcmV2aWV3ID0gaW5wdXQ8Ym9vbGVhbiwgYm9vbGVhbiB8IHVuZGVmaW5lZD4odHJ1ZSwgeyB0cmFuc2Zvcm06ICh2YWwpID0+IHZhbCA/PyB0cnVlIH0pO1xuICByZWFkb25seSBjbGFzc0luY2x1ZGVGaWxlQ29udGVudCA9IGlucHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgc2hvd0JvcmRlckVycm9yQWxsSXRlbVdoZW5FcnJvciA9IGlucHV0PGJvb2xlYW4sIGJvb2xlYW4gfCB1bmRlZmluZWQ+KGZhbHNlLCB7IHRyYW5zZm9ybTogKHZhbCkgPT4gdmFsID8/IGZhbHNlIH0pO1xuICByZWFkb25seSBjb25maWdEb3dubG9hZFNhbXBsZUZpbGUgPSBpbnB1dDxJVXBsb2FkQ29uZmlnRG93bmxvYWRTYW1wbGVGaWxlPigpO1xuICAvLyAjZW5kcmVnaW9uXG5cbiAgLy8gI3JlZ2lvbiBPVVRQVVRTXG4gIHJlYWRvbmx5IG91dENsb3NlID0gb3V0cHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IG91dEZpbGVDaGFuZ2VkID0gb3V0cHV0PEFycmF5PFdyaXRhYmxlU2lnbmFsPElGaWxlPj4+KCk7XG4gIHJlYWRvbmx5IG91dEZpbGVSZW1vdmVkID0gb3V0cHV0PFdyaXRhYmxlU2lnbmFsPElGaWxlPj4oKTtcbiAgcmVhZG9ubHkgb3V0RnVuY3Rpb25zQ29udHJvbCA9IG91dHB1dDxJVXBsb2FkRnVuY3Rpb25Db250cm9sRXZlbnQ+KCk7XG4gIC8vICNlbmRyZWdpb25cblxuICAvLyAjcmVnaW9uIFZJRVcgQ0hJTERSRU5cbiAgcmVhZG9ubHkgdXBsb2FkUmVmID0gdmlld0NoaWxkPEVsZW1lbnRSZWY+KCd1cGxvYWQnKTtcbiAgcmVhZG9ubHkgdXBsb2FkSW5wdXRSZWYgPSB2aWV3Q2hpbGQ8RWxlbWVudFJlZj4oJ3VwbG9hZElucHV0Jyk7XG4gIC8vICNlbmRyZWdpb25cblxuICAvLyAjcmVnaW9uIElOSkVDVElPTlNcbiAgcHJpdmF0ZSBkeW5hbWljQ29tcG9uZW50U2VydmljZSA9IGluamVjdChMaWJzVWlEeW5hbWljQ29tcG9uZW50U2VydmljZSk7XG4gIHByaXZhdGUgdHJhbnNsYXRlU2VydmljZSA9IGluamVjdChUcmFuc2xhdGVTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBub3RpZmljYXRpb25TZXJ2aWNlID0gaW5qZWN0KExpYnNVaU5vdGlmaWNhdGlvblNlcnZpY2UpO1xuICAvLyAjZW5kcmVnaW9uXG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLm9yaWdpbkZpbGVzKCkpIHtcbiAgICAgICAgdW50cmFja2VkKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmZpbGVMaXN0LnNldChbLi4udGhpcy5vcmlnaW5GaWxlcygpXSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8gI3JlZ2lvbiBMSUZFQ1lDTEUgSE9PS1NcbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5vdXRGdW5jdGlvbnNDb250cm9sLmVtaXQodGhpcy5GdW5jdGlvbnNDb250cm9sKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuaW5pdEFjY2Vzc0ZpbGVzKCk7XG4gICAgfSwgMCk7XG4gIH1cbiAgLy8gI2VuZHJlZ2lvblxuXG4gIC8vICNyZWdpb24gSU5JVElBTElaQVRJT05cbiAgcHJvdGVjdGVkIGFzeW5jIGluaXRBY2Nlc3NGaWxlcygpIHtcbiAgICBjb25zdCBhY2Nlc3NFeHRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHR5cGVTcGxpdCA9IHRoaXMuZmlsZVR5cGUoKS5zcGxpdCgnXycpO1xuXG4gICAgaWYgKHR5cGVTcGxpdC5pbmNsdWRlcygnaW1hZ2UnKSkge1xuICAgICAgYWNjZXNzRXh0cy5wdXNoKC4uLnRoaXMuaW1hZ2VFeHRMaXN0KCkpO1xuICAgIH1cbiAgICBpZiAodHlwZVNwbGl0LmluY2x1ZGVzKCdkb2N1bWVudCcpKSB7XG4gICAgICBhY2Nlc3NFeHRzLnB1c2goLi4udGhpcy5kb2N1bWVudEV4dExpc3QoKSk7XG4gICAgfVxuICAgIGlmICh0eXBlU3BsaXQuaW5jbHVkZXMoJ3ZpZGVvJykpIHtcbiAgICAgIGFjY2Vzc0V4dHMucHVzaCguLi50aGlzLnZpZGVvRXh0TGlzdCgpKTtcbiAgICB9XG4gICAgaWYgKHR5cGVTcGxpdC5pbmNsdWRlcygnYXVkaW8nKSkge1xuICAgICAgYWNjZXNzRXh0cy5wdXNoKC4uLnRoaXMuYXVkaW9FeHRMaXN0KCkpO1xuICAgIH1cbiAgICB0aGlzLmFjY2Vzc0ZpbGVzLnNldChhY2Nlc3NFeHRzLm1hcCgoZXh0KSA9PiBgLiR7ZXh0fWApLmpvaW4oJywnKSk7XG4gIH1cbiAgLy8gI2VuZHJlZ2lvblxuXG4gIC8vICNyZWdpb24gRklMRSBPUEVSQVRJT05TXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVyU2V0Q2xhc3NEcmFnKHRvb2dsZTogYm9vbGVhbikge1xuICAgIHRoaXMudXBsb2FkUmVmKCk/Lm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZSgnbGlicy11aS1jb21wb25lbnRzLWlucHV0cy11cGxvYWQtZHJhZy1vdmVyJywgdG9vZ2xlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVVcGxvYWRGaWxlcyhmaWxlczogQXJyYXk8RmlsZT4pIHtcbiAgICBpZiAodGhpcy5tYXhUb3RhbFNpemUoKSkge1xuICAgICAgbGV0IHRvdGFsID0gMDtcblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB0b3RhbCArPSBmaWxlc1tpXS5zaXplO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5tYXhUb3RhbFNpemUoKSA8IHRvdGFsKSB7XG4gICAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5zaG93Q29tcFR5cGVUZXh0RXJyb3IodGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ2kxOG5fc2l6ZV9ub3RfbnVtYmVyX21iJywgeyBudW1iZXI6IHRoaXMubWF4VG90YWxTaXplKCkgLyAxMDI0IC8gMTAyNCB9KSwgeyB0aW1lUmVtb3ZlOiAzMDAwIH0pO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgZXJyb3JFeGNlZWRzTWF4RmlsZSA9IGZhbHNlO1xuICAgIGlmICghZmlsZXMgfHwgIWZpbGVzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXRoaXMubXVsdGlwbGUoKSAmJiB0aGlzLmZpbGVMaXN0KCkubGVuZ3RoICYmICF0aGlzLmNhblVwbG9hZElmSGFzRXhpc3RGaWxlKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCByZW1haW5GaWxlVG90YWwgPSB0aGlzLmxpbWl0RmlsZSgpIC0gdGhpcy5maWxlTGlzdCgpLmxlbmd0aDtcbiAgICBpZiAoZmlsZXMubGVuZ3RoID4gcmVtYWluRmlsZVRvdGFsKSB7XG4gICAgICBlcnJvckV4Y2VlZHNNYXhGaWxlID0gdHJ1ZTtcbiAgICAgIHRoaXMubWVzc2FnZUVycm9yLnNldCh0aGlzLm1lc3NhZ2VUb3RhbEZpbGVFeGNlZWRzRXJyb3IoKSk7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGZpbGUgPSBmaWxlc1tpXTtcbiAgICAgIGNvbnN0IGlzSW1hZ2UgPSBpc1R5cGVJbWFnZShmaWxlKTtcbiAgICAgIGNvbnN0IGlzVmlkZW8gPSBpc1R5cGVWaWRlbyhmaWxlKTtcbiAgICAgIGNvbnN0IGlzQXVkaW8gPSBpc1R5cGVBdWRpbyhmaWxlKTtcbiAgICAgIGNvbnN0IG5ld0ZpbGU6IElGaWxlID0ge1xuICAgICAgICBuYW1lOiBmaWxlLm5hbWUsXG4gICAgICAgIGZpbGU6IGZpbGUsXG4gICAgICAgIHNpemU6IGdldExhYmVsQnlTaXplRmlsZShmaWxlLnNpemUpLFxuICAgICAgICB0eXBlOiBpc0ltYWdlID8gJ2ltYWdlJyA6IGlzVmlkZW8gPyAndmlkZW8nIDogaXNBdWRpbyA/ICdhdWRpbycgOiAnZG9jdW1lbnQnLFxuICAgICAgICBpZDogdXVpZCgpLFxuICAgICAgfTtcbiAgICAgIGlmICghKGF3YWl0IHRoaXMuY2hlY2tWYWxpZEZpbGVFeHRlbnNpb24oZmlsZSkpKSB7XG4gICAgICAgIGlmICghZXJyb3JFeGNlZWRzTWF4RmlsZSkge1xuICAgICAgICAgIHRoaXMubWVzc2FnZUVycm9yLnNldCh0aGlzLm11bHRpcGxlKCkgPyB0aGlzLm1lc3NhZ2VGaWxlVXBsb2FkRXJyb3IoKSA6IHRoaXMubWVzc2FnZVR5cGVGaWxlRXJyb3IoKSk7XG4gICAgICAgIH1cbiAgICAgICAgbmV3RmlsZS5lcnJvciA9IHRoaXMubWVzc2FnZVR5cGVGaWxlRXJyb3IoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5wdXNoRmlsZUluTGlzdChmaWxlLCBuZXdGaWxlKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoIShhd2FpdCB0aGlzLmNoZWNrVmFsaWRGaWxlU2l6ZShmaWxlKSkpIHtcbiAgICAgICAgaWYgKCFlcnJvckV4Y2VlZHNNYXhGaWxlKSB7XG4gICAgICAgICAgdGhpcy5tZXNzYWdlRXJyb3Iuc2V0KHRoaXMubXVsdGlwbGUoKSA/IHRoaXMubWVzc2FnZUZpbGVVcGxvYWRFcnJvcigpIDogdGhpcy5tZXNzYWdlTWF4U2l6ZUVycm9yKCkpO1xuICAgICAgICB9XG4gICAgICAgIG5ld0ZpbGUuZXJyb3IgPSB0aGlzLm1lc3NhZ2VNYXhTaXplRXJyb3IoKTtcbiAgICAgICAgaWYgKCF0aGlzLm11bHRpcGxlKCkgJiYgdGhpcy5hbGxvd1Nob3dQdXNoTWVzc2FnZU1heFNpemVFcnJvcigpKSB7XG4gICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLnNob3dDb21wVHlwZVRleHRFcnJvcih0aGlzLm1lc3NhZ2VNYXhTaXplRXJyb3IoKSk7XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy5wdXNoRmlsZUluTGlzdChmaWxlLCBuZXdGaWxlKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBhd2FpdCB0aGlzLnB1c2hGaWxlSW5MaXN0KGZpbGUsIG5ld0ZpbGUpO1xuICAgIH1cbiAgICBpZiAodGhpcy5jYW5TZXRBdmF0YXIoKSAmJiB0aGlzLmZpbGVMaXN0KCkubGVuZ3RoICYmICF0aGlzLmZpbGVMaXN0KCkuZmluZCgoZmlsZSkgPT4gZmlsZSgpLmlzQXZhdGFyKSkge1xuICAgICAgdGhpcy5maWxlTGlzdC51cGRhdGUoKGZpbGVMaXN0KSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW1JbWFnZSA9IGZpbGVMaXN0LmZpbmQoKGZpbGUpID0+IGZpbGUoKS50eXBlID09PSAnaW1hZ2UnKTtcbiAgICAgICAgaWYgKGl0ZW1JbWFnZSkge1xuICAgICAgICAgIGl0ZW1JbWFnZS51cGRhdGUoKGZpbGUpID0+ICh7IC4uLmZpbGUsIGlzQXZhdGFyOiB0cnVlIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gWy4uLmZpbGVMaXN0XTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLm91dEZpbGVDaGFuZ2VkLmVtaXQodGhpcy5maWxlTGlzdCgpKTtcbiAgICB0aGlzLnZhbGlkYXRlKCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHB1c2hGaWxlSW5MaXN0KGZpbGU6IEZpbGUsIG5ld0ZpbGU6IElGaWxlKSB7XG4gICAgbmV3RmlsZS51cmwgPSAoYXdhaXQgY29udmVydEZpbGVUb0Jhc2U2NF9PYmplY3RVcmwoZmlsZSkpIGFzIHN0cmluZztcblxuICAgIHRoaXMuZmlsZUxpc3QudXBkYXRlKChmaWxlTGlzdCkgPT4ge1xuICAgICAgZmlsZUxpc3Quc3BsaWNlKDAsIHRoaXMuY2FuVXBsb2FkSWZIYXNFeGlzdEZpbGUoKSA/IDEgOiAwLCBzaWduYWwobmV3RmlsZSkpO1xuICAgICAgcmV0dXJuIFsuLi5maWxlTGlzdF07XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlck9wZW5QcmV2aWV3RmlsZShpdGVtOiBJRmlsZSkge1xuICAgIGlmIChpdGVtLnR5cGUgPT09ICdkb2N1bWVudCcpIHtcbiAgICAgIHRoaXMucHJldmlld0ZpbGVEb2N1bWVudChpdGVtKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5wcmV2aWV3RmlsZUltYWdlKGl0ZW0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBwcmV2aWV3RmlsZURvY3VtZW50KGl0ZW06IElGaWxlKSB7XG4gICAgaWYgKHRoaXMucHJldmlld0ZpbGVDb21wb25lbnRSZWYpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5wcmV2aWV3RmlsZUNvbXBvbmVudFJlZiA9IHRoaXMuZHluYW1pY0NvbXBvbmVudFNlcnZpY2UucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoTGlic1VpQ29tcG9uZW50c1ByZXZpZXdGaWxlQ29tcG9uZW50KTtcbiAgICB0aGlzLnByZXZpZXdGaWxlQ29tcG9uZW50UmVmLnNldElucHV0KCdkYXRhJywgaXRlbSk7XG4gICAgdGhpcy5wcmV2aWV3RmlsZUNvbXBvbmVudFJlZi5zZXRJbnB1dCgnekluZGV4JywgdGhpcy56SW5kZXgoKSArIDEpO1xuICAgIHRoaXMucHJldmlld0ZpbGVDb21wb25lbnRSZWYuaW5zdGFuY2Uub3V0Q2xvc2Uuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuZHluYW1pY0NvbXBvbmVudFNlcnZpY2UucmVtb3ZlKHRoaXMucHJldmlld0ZpbGVDb21wb25lbnRSZWYpO1xuICAgICAgdGhpcy5wcmV2aWV3RmlsZUNvbXBvbmVudFJlZiA9IHVuZGVmaW5lZDtcbiAgICB9KTtcbiAgICB0aGlzLmR5bmFtaWNDb21wb25lbnRTZXJ2aWNlLmFkZFRvQm9keSh0aGlzLnByZXZpZXdGaWxlQ29tcG9uZW50UmVmKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcHJldmlld0ZpbGVJbWFnZShpdGVtOiBJRmlsZSkge1xuICAgIGlmICh0aGlzLnByZXZpZXdGaWxlSW1hZ2VDb21wb25lbnRSZWYpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5wcmV2aWV3RmlsZUltYWdlQ29tcG9uZW50UmVmID0gdGhpcy5keW5hbWljQ29tcG9uZW50U2VydmljZS5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShMaWJzVWlDb21wb25lbnRzR2FsbGVyeVZpZXdlckNvbXBvbmVudCk7XG4gICAgY29uc3QgdXJsID0gaXRlbS51cmwgfHwgaXRlbS5vcmlnaW5fdXJsO1xuICAgIHRoaXMucHJldmlld0ZpbGVJbWFnZUNvbXBvbmVudFJlZi5zZXRJbnB1dCgnaW1hZ2VzJywgW3sgdXJsIH1dKTtcbiAgICB0aGlzLnByZXZpZXdGaWxlSW1hZ2VDb21wb25lbnRSZWYuc2V0SW5wdXQoJ2ltYWdlU2VsZWN0ZWQnLCB7IHVybCB9KTtcbiAgICB0aGlzLnByZXZpZXdGaWxlSW1hZ2VDb21wb25lbnRSZWYuc2V0SW5wdXQoJ2ZpZWxkRGlzcGxheVNyY0ltYWdlJywgJ3VybCcpO1xuICAgIHRoaXMucHJldmlld0ZpbGVJbWFnZUNvbXBvbmVudFJlZi5zZXRJbnB1dCgnc2luZ2xlSW1hZ2UnLCB0cnVlKTtcbiAgICB0aGlzLnByZXZpZXdGaWxlSW1hZ2VDb21wb25lbnRSZWYuc2V0SW5wdXQoJ3pJbmRleCcsIHRoaXMuekluZGV4KCkgKyAxKTtcbiAgICB0aGlzLnByZXZpZXdGaWxlSW1hZ2VDb21wb25lbnRSZWYuaW5zdGFuY2Uub3V0Q2xvc2Uuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuZHluYW1pY0NvbXBvbmVudFNlcnZpY2UucmVtb3ZlKHRoaXMucHJldmlld0ZpbGVJbWFnZUNvbXBvbmVudFJlZik7XG4gICAgICB0aGlzLnByZXZpZXdGaWxlSW1hZ2VDb21wb25lbnRSZWYgPSB1bmRlZmluZWQ7XG4gICAgfSk7XG4gICAgdGhpcy5keW5hbWljQ29tcG9uZW50U2VydmljZS5hZGRUb0JvZHkodGhpcy5wcmV2aWV3RmlsZUltYWdlQ29tcG9uZW50UmVmKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVyRWRpdEltYWdlKGV2ZW50OiBFdmVudCwgaXRlbTogV3JpdGFibGVTaWduYWw8SUZpbGU+KSB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5zaG93RWRpdE1vZGFsKGl0ZW0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGhhbmRsZXJSZW1vdmVGaWxlKGV2ZW50OiBFdmVudCwgaXRlbTogV3JpdGFibGVTaWduYWw8SUZpbGU+KSB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5yZW1vdmVGaWxlKGl0ZW0pO1xuICAgIGlmICh0aGlzLm9yaWdpbkZpbGVzKCkuZmluZCgoZmlsZSkgPT4gZmlsZSgpLnVybCA9PT0gaXRlbSgpLnVybCkpIHtcbiAgICAgIHRoaXMub3V0RmlsZVJlbW92ZWQuZW1pdChpdGVtKTtcbiAgICB9XG4gICAgdGhpcy52YWxpZGF0ZSgpO1xuICAgIGlmICghdGhpcy5tdWx0aXBsZSgpICYmIHRoaXMuc2hvd1BvcHVwVXBsb2FkV2hlbkhhc0ZpbGVBbmRNb2RlU2luZ2xlKCkpIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLnNob3dVcGxvYWRQb3B1cCgpO1xuICAgICAgfSwgMCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIHJlbW92ZUZpbGUoZmlsZUl0ZW06IFdyaXRhYmxlU2lnbmFsPElGaWxlPikge1xuICAgIHRoaXMuZmlsZUxpc3QudXBkYXRlKChmaWxlTGlzdCkgPT4gZmlsZUxpc3QuZmlsdGVyKChpdGVtKSA9PiBpdGVtKCkuaWQgIT09IGZpbGVJdGVtKCkuaWQpKTtcbiAgICBpZiAodGhpcy5jYW5TZXRBdmF0YXIoKSAmJiBmaWxlSXRlbSgpLmlzQXZhdGFyICYmIHRoaXMuZmlsZUxpc3QoKS5sZW5ndGgpIHtcbiAgICAgIHRoaXMuZmlsZUxpc3QudXBkYXRlKChmaWxlTGlzdCkgPT4ge1xuICAgICAgICBmaWxlTGlzdFswXS51cGRhdGUoKGZpbGUpID0+ICh7IC4uLmZpbGUsIGlzQXZhdGFyOiB0cnVlIH0pKTtcblxuICAgICAgICByZXR1cm4gWy4uLmZpbGVMaXN0XTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLm91dEZpbGVDaGFuZ2VkLmVtaXQodGhpcy5maWxlTGlzdCgpKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBzaG93RWRpdE1vZGFsKGZpbGVJdGVtOiBXcml0YWJsZVNpZ25hbDxJRmlsZT4pIHtcbiAgICBpZiAodGhpcy5pbWFnZUVkaXRvckNvbXBvbmVudFJlZikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBmaWxlRGF0YVVybCA9IGZpbGVJdGVtKCkudXJsIHx8IGZpbGVJdGVtKCkub3JpZ2luX3VybCB8fCAnJztcbiAgICB0aGlzLmltYWdlRWRpdG9yQ29tcG9uZW50UmVmID0gdGhpcy5keW5hbWljQ29tcG9uZW50U2VydmljZS5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShMaWJzVWlDb21wb25lbnRzSW1hZ2VFZGl0b3JDb21wb25lbnQpO1xuXG4gICAgdGhpcy5pbWFnZUVkaXRvckNvbXBvbmVudFJlZi5zZXRJbnB1dCgnaW1nU3JjJywgZmlsZURhdGFVcmwpO1xuICAgIHRoaXMuaW1hZ2VFZGl0b3JDb21wb25lbnRSZWYuc2V0SW5wdXQoJ3pJbmRleCcsIHRoaXMuekluZGV4KCkgKyAxKTtcbiAgICB0aGlzLmltYWdlRWRpdG9yQ29tcG9uZW50UmVmLnNldElucHV0KCduYW1lRmlsZScsIGZpbGVJdGVtKCkubmFtZSk7XG4gICAgdGhpcy5pbWFnZUVkaXRvckNvbXBvbmVudFJlZi5zZXRJbnB1dCgnYXNwZWN0UmF0aW8nLCB0aGlzLmFzcGVjdFJhdGlvKCkpO1xuICAgIHRoaXMuaW1hZ2VFZGl0b3JDb21wb25lbnRSZWYuaW5zdGFuY2Uub3V0Q2xvc2Uuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuZHluYW1pY0NvbXBvbmVudFNlcnZpY2UucmVtb3ZlKHRoaXMuaW1hZ2VFZGl0b3JDb21wb25lbnRSZWYpO1xuICAgICAgdGhpcy5pbWFnZUVkaXRvckNvbXBvbmVudFJlZiA9IHVuZGVmaW5lZDtcbiAgICB9KTtcblxuICAgIHRoaXMuaW1hZ2VFZGl0b3JDb21wb25lbnRSZWYuaW5zdGFuY2Uub3V0U2F2ZUZpbGUuc3Vic2NyaWJlKGFzeW5jIChyZXN1bHQ6IElTYXZlRmlsZSkgPT4ge1xuICAgICAgY29uc3QgbWVzc2FnZUVycm9yID0gIShhd2FpdCB0aGlzLmNoZWNrVmFsaWRGaWxlU2l6ZShyZXN1bHQuZmlsZSkpID8gdGhpcy5tZXNzYWdlTWF4U2l6ZUVycm9yKCkgOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBuYW1lRmlsZSA9IGZpbGVJdGVtKCkuZmlsZT8ubmFtZSB8fCBmaWxlSXRlbSgpLm5hbWU7XG4gICAgICBmaWxlSXRlbS51cGRhdGUoKGRhdGEpID0+ICh7IC4uLmRhdGEsIGZpbGU6IGNvbnZlcnRCbG9iVG9GaWxlKHJlc3VsdC5maWxlLCBuYW1lRmlsZSksIG5hbWU6IG5hbWVGaWxlLCBvcmlnaW5fdXJsOiB1bmRlZmluZWQsIHNpemU6IGdldExhYmVsQnlTaXplRmlsZShyZXN1bHQuZmlsZS5zaXplKSwgZXJyb3I6IG1lc3NhZ2VFcnJvciwgdXJsOiByZXN1bHQudXJsLCBpc1VwZGF0ZTogdHJ1ZSB9KSk7XG4gICAgICB0aGlzLm91dEZpbGVDaGFuZ2VkLmVtaXQodGhpcy5maWxlTGlzdCgpKTtcbiAgICAgIHRoaXMuaW1hZ2VFZGl0b3JDb21wb25lbnRSZWY/Lmluc3RhbmNlLm91dENsb3NlLmVtaXQoeyBpc0NsaWNrQnV0dG9uQ2xvc2U6IHRydWUgfSk7XG4gICAgfSk7XG4gICAgdGhpcy5keW5hbWljQ29tcG9uZW50U2VydmljZS5hZGRUb0JvZHkodGhpcy5pbWFnZUVkaXRvckNvbXBvbmVudFJlZik7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgY2hlY2tWYWxpZEZpbGVFeHRlbnNpb24oZmlsZTogRmlsZSkge1xuICAgIGNvbnN0IGV4dGVuc2lvbiA9IGdldEZpbGVFeHRlbnNpb24oZmlsZSk7XG5cbiAgICBpZiAoIWV4dGVuc2lvbikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBpc0ltYWdlID0gaXNUeXBlSW1hZ2UoZmlsZSk7XG4gICAgY29uc3QgaXNWaWRlbyA9IGlzVHlwZVZpZGVvKGZpbGUpO1xuICAgIGNvbnN0IGlzQXVkaW8gPSBpc1R5cGVBdWRpbyhmaWxlKTtcbiAgICBjb25zdCB2YWxpZEltYWdlID0gaXNJbmNsdWRlSW1hZ2VFeHRMaXN0KGV4dGVuc2lvbiwgdGhpcy5pbWFnZUV4dExpc3QoKSk7XG4gICAgY29uc3QgdmFsaWRWaWRlbyA9IGlzSW5jbHVkZVZpZGVvRXh0TGlzdChleHRlbnNpb24sIHRoaXMudmlkZW9FeHRMaXN0KCkpO1xuICAgIGNvbnN0IHZhbGlkQXVkaW8gPSBpc0luY2x1ZGVBdWRpb0V4dExpc3QoZXh0ZW5zaW9uLCB0aGlzLmF1ZGlvRXh0TGlzdCgpKTtcbiAgICBjb25zdCB2YWxpZERvY3VtZW50ID0gaXNJbmNsdWRlRG9jdW1lbnRFeHRMaXN0KGV4dGVuc2lvbiwgdGhpcy5kb2N1bWVudEV4dExpc3QoKSk7XG5cbiAgICBjb25zdCB0eXBlU3BsaXQgPSB0aGlzLmZpbGVUeXBlKCkuc3BsaXQoJ18nKTtcblxuICAgIGlmIChpc0ltYWdlICYmIHR5cGVTcGxpdC5pbmNsdWRlcygnaW1hZ2UnKSkge1xuICAgICAgcmV0dXJuIHZhbGlkSW1hZ2U7XG4gICAgfVxuICAgIGlmIChpc1ZpZGVvICYmIHR5cGVTcGxpdC5pbmNsdWRlcygndmlkZW8nKSkge1xuICAgICAgcmV0dXJuIHZhbGlkVmlkZW87XG4gICAgfVxuICAgIGlmIChpc0F1ZGlvICYmIHR5cGVTcGxpdC5pbmNsdWRlcygnYXVkaW8nKSkge1xuICAgICAgcmV0dXJuIHZhbGlkQXVkaW87XG4gICAgfVxuICAgIGlmICh0eXBlU3BsaXQuaW5jbHVkZXMoJ2RvY3VtZW50JykpIHtcbiAgICAgIHJldHVybiB2YWxpZERvY3VtZW50O1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBjaGVja1ZhbGlkRmlsZVNpemUoZmlsZTogRmlsZSB8IEJsb2IpIHtcbiAgICBjb25zdCBpc0ltYWdlID0gaXNUeXBlSW1hZ2UoZmlsZSk7XG4gICAgY29uc3QgaXNWaWRlbyA9IGlzVHlwZVZpZGVvKGZpbGUpO1xuICAgIGNvbnN0IGlzQXVkaW8gPSBpc1R5cGVBdWRpbyhmaWxlKTtcbiAgICBjb25zdCB2YWxpZEltYWdlID0gZmlsZS5zaXplIDw9IHRoaXMubWF4SW1hZ2VTaXplKCk7XG4gICAgY29uc3QgdmFsaWRWaWRlbyA9IGZpbGUuc2l6ZSA8PSB0aGlzLm1heFZpZGVvU2l6ZSgpO1xuICAgIGNvbnN0IHZhbGlkQXVkaW8gPSBmaWxlLnNpemUgPD0gdGhpcy5tYXhBdWRpb1NpemUoKTtcbiAgICBjb25zdCB2YWxpZERvY3VtZW50ID0gZmlsZS5zaXplIDw9IHRoaXMubWF4RG9jdW1lbnRTaXplKCk7XG5cbiAgICBjb25zdCB0eXBlU3BsaXQgPSB0aGlzLmZpbGVUeXBlKCkuc3BsaXQoJ18nKTtcblxuICAgIGlmIChpc0ltYWdlICYmIHR5cGVTcGxpdC5pbmNsdWRlcygnaW1hZ2UnKSkge1xuICAgICAgcmV0dXJuIHZhbGlkSW1hZ2U7XG4gICAgfVxuICAgIGlmIChpc1ZpZGVvICYmIHR5cGVTcGxpdC5pbmNsdWRlcygndmlkZW8nKSkge1xuICAgICAgcmV0dXJuIHZhbGlkVmlkZW87XG4gICAgfVxuICAgIGlmIChpc0F1ZGlvICYmIHR5cGVTcGxpdC5pbmNsdWRlcygnYXVkaW8nKSkge1xuICAgICAgcmV0dXJuIHZhbGlkQXVkaW87XG4gICAgfVxuICAgIGlmICh0eXBlU3BsaXQuaW5jbHVkZXMoJ2RvY3VtZW50JykpIHtcbiAgICAgIHJldHVybiB2YWxpZERvY3VtZW50O1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyB2YWxpZGF0ZSgpIHtcbiAgICBpZiAodGhpcy52YWxpZFJlcXVpcmVkKCk/LmlzUmVxdWlyZWQgJiYgIXRoaXMuZmlsZUxpc3QoKS5sZW5ndGgpIHtcbiAgICAgIHRoaXMubWVzc2FnZUVycm9yLnNldCh0aGlzLnZhbGlkUmVxdWlyZWQoKT8ubWVzc2FnZSB8fCBFUlJPUl9NRVNTQUdFX0VNUFRZX1ZBTElEKTtcblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAodGhpcy5tdWx0aXBsZSgpICYmIHRoaXMuZmlsZUxpc3QoKS5sZW5ndGggPiB0aGlzLmxpbWl0RmlsZSgpKSB7XG4gICAgICB0aGlzLm1lc3NhZ2VFcnJvci5zZXQodGhpcy5tZXNzYWdlVG90YWxGaWxlRXhjZWVkc0Vycm9yKCkpO1xuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGZpbGVFcnJvciA9IHRoaXMuZmlsZUxpc3QoKS5maW5kKChpdGVtKSA9PiBpdGVtKCkuZXJyb3IpO1xuXG4gICAgaWYgKGZpbGVFcnJvcikge1xuICAgICAgdGhpcy5tZXNzYWdlRXJyb3Iuc2V0KHRoaXMubXVsdGlwbGUoKSA/IHRoaXMubWVzc2FnZUZpbGVVcGxvYWRFcnJvcigpIDogZmlsZUVycm9yKCkuZXJyb3IpO1xuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMubWVzc2FnZUVycm9yLnNldCh1bmRlZmluZWQpO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlclNldEF2YXRhcihldmVudDogRXZlbnQsIGZpbGU6IFdyaXRhYmxlU2lnbmFsPElGaWxlPikge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgdGhpcy5maWxlTGlzdCgpLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIGlmIChpdGVtKCkuaWQgPT09IGZpbGUoKS5pZCkge1xuICAgICAgICBpdGVtLnVwZGF0ZSgoZmlsZSkgPT4gKHsgLi4uZmlsZSwgaXNBdmF0YXI6IHRydWUgfSkpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpdGVtLnVwZGF0ZSgoZmlsZSkgPT4gKHsgLi4uZmlsZSwgaXNBdmF0YXI6IGZhbHNlIH0pKTtcbiAgICB9KTtcbiAgICB0aGlzLm91dEZpbGVDaGFuZ2VkLmVtaXQodGhpcy5maWxlTGlzdCgpKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVtb3ZlQWxsRmlsZSgpIHtcbiAgICB0aGlzLmZpbGVMaXN0LnNldChbXSk7XG4gICAgdGhpcy5tZXNzYWdlRXJyb3Iuc2V0KHVuZGVmaW5lZCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlckRvd25sb2FkU2FtcGxlRmlsZShldmVudDogRXZlbnQpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBjb25zdCBjb25maWcgPSB0aGlzLmNvbmZpZ0Rvd25sb2FkU2FtcGxlRmlsZSgpO1xuICAgIGlmICghY29uZmlnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChjb25maWc/LmNhbGxCYWNrKSB7XG4gICAgICBjb25maWcuY2FsbEJhY2soKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoY29uZmlnPy51cmwpIHtcbiAgICAgIGRvd25sb2FkRmlsZUJ5VXJsKGNvbmZpZy51cmwsIGNvbmZpZy50aXRsZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzaG93VXBsb2FkUG9wdXAoKSB7XG4gICAgdGhpcy51cGxvYWRJbnB1dFJlZigpPy5uYXRpdmVFbGVtZW50LmNsaWNrKCk7XG4gICAgdGhpcy51cGxvYWRJbnB1dFJlZigpPy5uYXRpdmVFbGVtZW50LnNldEF0dHJpYnV0ZSgnYWNjZXB0JywgdGhpcy5hY2Nlc3NGaWxlcygpKTtcbiAgfVxuXG4gIC8vICNlbmRyZWdpb25cblxuICAvLyAjcmVnaW9uIEZVTkNUSU9OU1xuICBwdWJsaWMgZ2V0IEZ1bmN0aW9uc0NvbnRyb2woKTogSVVwbG9hZEZ1bmN0aW9uQ29udHJvbEV2ZW50IHtcbiAgICByZXR1cm4ge1xuICAgICAgY2hlY2tJc1ZhbGlkOiB0aGlzLnZhbGlkYXRlLmJpbmQodGhpcyksXG4gICAgICByZW1vdmVBbGw6IHRoaXMucmVtb3ZlQWxsRmlsZS5iaW5kKHRoaXMpLFxuICAgICAgdXBsb2FkaW5nOiBhc3luYyAocHJvY2VzcywgaWQpID0+IHtcbiAgICAgICAgY29uc3QgZmlsZVVwbG9hZGluZyA9IHRoaXMuZmlsZUxpc3QoKS5maW5kKChmaWxlKSA9PiBmaWxlKCkuaWQgPT09IGlkKTtcblxuICAgICAgICBpZiAoZmlsZVVwbG9hZGluZykge1xuICAgICAgICAgIGZpbGVVcGxvYWRpbmcudXBkYXRlKChmaWxlKSA9PiAoeyAuLi5maWxlLCBwZXJjZW50VXBsb2FkaW5nOiBwcm9jZXNzLnBlcmNlbnQsIGlzVXBsb2FkaW5nOiBwcm9jZXNzLnBlcmNlbnQgIT09IDEwMCB9KSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBzZXRNZXNzYWdlRXJyb3I6IGFzeW5jIChtZXNzYWdlLCBpZCkgPT4ge1xuICAgICAgICB0aGlzLm1lc3NhZ2VFcnJvci5zZXQobWVzc2FnZSk7XG4gICAgICAgIGlmIChpZCkge1xuICAgICAgICAgIGNvbnN0IGZpbGVFcnJvciA9IHRoaXMuZmlsZUxpc3QoKS5maW5kKChmaWxlKSA9PiBmaWxlKCkuaWQgPT09IGlkKTtcblxuICAgICAgICAgIGlmIChmaWxlRXJyb3IpIHtcbiAgICAgICAgICAgIGZpbGVFcnJvci51cGRhdGUoKGZpbGUpID0+ICh7IC4uLmZpbGUsIGVycm9yOiBtZXNzYWdlIH0pKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBoYW5kbGVyVXBsb2FkRmlsZTogdGhpcy5zaG93VXBsb2FkUG9wdXAuYmluZCh0aGlzKSxcbiAgICB9O1xuICB9XG4gIC8vICNlbmRyZWdpb25cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLm9uRGVzdHJveS5uZXh0KCk7XG4gICAgdGhpcy5vbkRlc3Ryb3kuY29tcGxldGUoKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgdy1mdWxsIGgtZnVsbFwiPlxuICA8ZGl2PlxuICAgIEBpZiAobGFiZWxDb25maWcoKTsgYXMgbGFiZWxDb25maWcpIHtcbiAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtbGFiZWxcbiAgICAgICAgW2NsYXNzSW5jbHVkZV09XCJsYWJlbENvbmZpZy5jbGFzc0luY2x1ZGVcIlxuICAgICAgICBbbGFiZWxMZWZ0XT1cImxhYmVsQ29uZmlnLmxhYmVsTGVmdFwiXG4gICAgICAgIFtsYWJlbExlZnRDbGFzc109XCJsYWJlbENvbmZpZy5sYWJlbExlZnRDbGFzc1wiXG4gICAgICAgIFtyZXF1aXJlZF09XCJsYWJlbENvbmZpZy5yZXF1aXJlZFwiXG4gICAgICAgIFtkZXNjcmlwdGlvbl09XCJsYWJlbENvbmZpZy5kZXNjcmlwdGlvblwiXG4gICAgICAgIFtsYWJlbFJpZ2h0XT1cImxhYmVsQ29uZmlnLmxhYmVsUmlnaHRcIlxuICAgICAgICBbbGFiZWxSaWdodENsYXNzXT1cImxhYmVsQ29uZmlnLmxhYmVsUmlnaHRDbGFzc1wiXG4gICAgICAgIFtvbmx5U2hvd0NvdW50XT1cImxhYmVsQ29uZmlnLm9ubHlTaG93Q291bnRcIlxuICAgICAgICBbYnV0dG9uc0xlZnRdPVwibGFiZWxDb25maWcuYnV0dG9uc0xlZnRcIlxuICAgICAgICBbYnV0dG9uc1JpZ2h0XT1cImxhYmVsQ29uZmlnLmJ1dHRvbnNSaWdodFwiXG4gICAgICAgIFtkaXNhYmxlQnV0dG9uc0xlZnRdPVwibGFiZWxDb25maWcuZGlzYWJsZUJ1dHRvbnNMZWZ0IHx8IGRpc2FibGUoKSB8fCByZWFkb25seSgpXCJcbiAgICAgICAgW2Rpc2FibGVCdXR0b25zUmlnaHRdPVwibGFiZWxDb25maWcuZGlzYWJsZUJ1dHRvbnNSaWdodCB8fCBkaXNhYmxlKCkgfHwgcmVhZG9ubHkoKVwiXG4gICAgICAgIFtoYXNUb2dnbGVdPVwibGFiZWxDb25maWcuaGFzVG9nZ2xlXCJcbiAgICAgICAgW3RvZ2dsZUFjdGl2ZV09XCJsYWJlbENvbmZpZy50b2dnbGVBY3RpdmVcIlxuICAgICAgICBbdG9nZ2xlRGlzYWJsZV09XCJsYWJlbENvbmZpZy50b2dnbGVEaXNhYmxlIHx8IGRpc2FibGUoKSB8fCByZWFkb25seSgpXCJcbiAgICAgICAgW3BvcG92ZXJdPVwibGFiZWxDb25maWcucG9wb3ZlclwiXG4gICAgICAgIFtpY29uUG9wb3ZlckNsYXNzXT1cImxhYmVsQ29uZmlnLmljb25Qb3BvdmVyQ2xhc3NcIlxuICAgICAgICBbb25seVNob3dDb3VudF09XCJsYWJlbENvbmZpZy5vbmx5U2hvd0NvdW50XCJcbiAgICAgICAgW2xpbWl0TGVuZ3RoXT1cImxhYmVsQ29uZmlnLmxpbWl0TGVuZ3RoXCJcbiAgICAgICAgW2J1dHRvbnNEZXNjcmlwdGlvbl09XCJsYWJlbENvbmZpZy5idXR0b25zRGVzY3JpcHRpb25cIlxuICAgICAgICBbZGlzYWJsZUJ1dHRvbnNEZXNjcmlwdGlvbl09XCJsYWJlbENvbmZpZy5kaXNhYmxlQnV0dG9uc0Rlc2NyaXB0aW9uIHx8IGRpc2FibGUoKSB8fCByZWFkb25seSgpXCJcbiAgICAgICAgW2J1dHRvbnNEZXNjcmlwdGlvbkNvbnRhaW5lckNsYXNzXT1cImxhYmVsQ29uZmlnLmJ1dHRvbnNEZXNjcmlwdGlvbkNvbnRhaW5lckNsYXNzXCJcbiAgICAgICAgW2NvdW50XT1cImxhYmVsQ29uZmlnLmNvdW50XCIgLz5cbiAgICB9XG4gICAgQGlmICgoIWNvbmZpZ0Rvd25sb2FkU2FtcGxlRmlsZSgpPy5wb3NpdGlvbiB8fCBjb25maWdEb3dubG9hZFNhbXBsZUZpbGUoKT8ucG9zaXRpb24gPT09ICd0b3AnKSAmJiBjb25maWdEb3dubG9hZFNhbXBsZUZpbGUoKTsgYXMgY29uZmlnRG93bmxvYWRTYW1wbGVGaWxlKSB7XG4gICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uXG4gICAgICAgIFt0eXBlXT1cIididXR0b24tbGluay1wcmltYXJ5J1wiXG4gICAgICAgIFtjbGFzc0xhYmVsXT1cIidsaWJzLXVpLWZvbnQtaDdtJ1wiXG4gICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiJyFtYi1bOHB4XSAhcC0wJ1wiXG4gICAgICAgIFtjbGFzc0ljb25MZWZ0XT1cIidsaWJzLXVpLWljb24tYXR0YWNobWVudCBiZWZvcmU6IXRleHQtWzEycHhdJ1wiXG4gICAgICAgIFtsYWJlbF09XCJjb25maWdEb3dubG9hZFNhbXBsZUZpbGU/LnRpdGxlIHx8ICcgJ1wiXG4gICAgICAgIChvdXRDbGljayk9XCJoYW5kbGVyRG93bmxvYWRTYW1wbGVGaWxlKCRldmVudClcIiAvPlxuICAgIH1cbiAgICBAaWYgKG11bHRpcGxlKCkgfHwgIXNob3dQb3B1cFVwbG9hZFdoZW5IYXNGaWxlQW5kTW9kZVNpbmdsZSgpIHx8ICghZmlsZUxpc3QoKS5sZW5ndGggJiYgIW11bHRpcGxlKCkpKSB7XG4gICAgICA8ZGl2XG4gICAgICAgICN1cGxvYWRcbiAgICAgICAgTGlic1VpQ29tcG9uZW50c0lucHV0c1VwbG9hZERpcmVjdGl2ZVxuICAgICAgICBMaWJzVWlDb21wb25lbnRzSW5wdXRzVXBsb2FkRHJvcEZpbGVEaXJlY3RpdmVcbiAgICAgICAgY2xhc3M9XCJsaWJzLXVpLWNvbXBvbmVudHMtaW5wdXRzLXVwbG9hZFwiXG4gICAgICAgIFtjbGFzcy5saWJzLXVpLWNvbXBvbmVudHMtaW5wdXRzLXVwbG9hZC1kaXNhYmxlXT1cImRpc2FibGUoKSB8fCByZWFkb25seSgpIHx8ICghbXVsdGlwbGUoKSAmJiBmaWxlTGlzdCgpLmxlbmd0aCAmJiAhY2FuVXBsb2FkSWZIYXNFeGlzdEZpbGUoKSlcIlxuICAgICAgICBbY2xhc3MubGlicy11aS1jb21wb25lbnRzLWlucHV0cy11cGxvYWQtcmVhZG9ubHldPVwicmVhZG9ubHkoKVwiXG4gICAgICAgIFtjbGFzcy5saWJzLXVpLWNvbXBvbmVudHMtaW5wdXRzLXVwbG9hZC1lcnJvcl09XCJtZXNzYWdlRXJyb3IoKVwiXG4gICAgICAgIFttdWx0aXBsZV09XCJtdWx0aXBsZSgpXCJcbiAgICAgICAgW2FjY2Vzc0ZpbGVzXT1cImFjY2Vzc0ZpbGVzKClcIlxuICAgICAgICAob3V0VXBsb2FkRmlsZXMpPVwiaGFuZGxlVXBsb2FkRmlsZXMoJGV2ZW50KVwiXG4gICAgICAgIChvdXRVcGxvYWRGaWxlKT1cImhhbmRsZVVwbG9hZEZpbGVzKFskZXZlbnRdKVwiXG4gICAgICAgIChvdXREcmFnT3Zlcik9XCJoYW5kbGVyU2V0Q2xhc3NEcmFnKHRydWUpXCJcbiAgICAgICAgKG91dERyYWdMZWF2ZSk9XCJoYW5kbGVyU2V0Q2xhc3NEcmFnKGZhbHNlKVwiXG4gICAgICAgIChvdXREcm9wKT1cImhhbmRsZXJTZXRDbGFzc0RyYWcoZmFsc2UpXCJcbiAgICAgICAgKG91dERyb3BGaWxlcyk9XCJoYW5kbGVVcGxvYWRGaWxlcygkZXZlbnQpXCJcbiAgICAgICAgKG91dERyb3BGaWxlKT1cImhhbmRsZVVwbG9hZEZpbGVzKFskZXZlbnRdKVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibXItWzE2cHhdXCI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImxpYnMtdWktY29tcG9uZW50cy1pbnB1dHMtdXBsb2FkLWljb24gbGlicy11aS1pY29uLWZpbGUtdXBsb2FkIGJlZm9yZTohdGV4dC1bMzJweF1cIj48L2k+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImxpYnMtdWktY29tcG9uZW50cy1pbnB1dHMtdXBsb2FkLWRlc2NyaXB0aW9uXCI+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGNsYXNzPVwibWItWzRweF0gbGlicy11aS1mb250LWg2bVwiXG4gICAgICAgICAgICAgIFtpbm5lckhUTUxdPVwiY29uZmlnRGVzY3JpcHRpb25JbnB1dFVwbG9hZCgpLm1lc3NhZ2UgfHwgJycgfCB0cmFuc2xhdGU6IGNvbmZpZ0Rlc2NyaXB0aW9uSW5wdXRVcGxvYWQoKS5pbnRlcnBvbGF0ZVBhcmFtc1wiPjwvZGl2PlxuICAgICAgICAgICAgQGZvciAoaXRlbSBvZiBkZXNjcmlwdGlvbkZvcm1hdEFuZFNpemVGaWxlQ29tcHV0ZWQoKTsgdHJhY2sgaXRlbTsgbGV0IGxhc3QgPSAkbGFzdCkge1xuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgY2xhc3M9XCJsaWJzLXVpLWZvbnQtaDdyXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MubWItWzRweF1dPVwiIWxhc3RcIlxuICAgICAgICAgICAgICAgIFtpbm5lckhUTUxdPVwiaXRlbS5tZXNzYWdlIHwgdHJhbnNsYXRlOiBpdGVtLmludGVycG9sYXRlUGFyYW1zXCI+PC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICBAaWYgKG11bHRpcGxlKCkpIHtcbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICN1cGxvYWRJbnB1dFxuICAgICAgICAgICAgY2xhc3M9XCJ1cGxvYWQtaW5wdXQgaGlkZGVuXCJcbiAgICAgICAgICAgIHR5cGU9XCJmaWxlXCJcbiAgICAgICAgICAgIG5hbWU9XCJmaWxlc1tdXCJcbiAgICAgICAgICAgIG11bHRpcGxlXG4gICAgICAgICAgICBbYWNjZXB0XT1cImFjY2Vzc0ZpbGVzKClcIiAvPlxuICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICN1cGxvYWRJbnB1dFxuICAgICAgICAgICAgY2xhc3M9XCJ1cGxvYWQtaW5wdXQgaGlkZGVuXCJcbiAgICAgICAgICAgIHR5cGU9XCJmaWxlXCJcbiAgICAgICAgICAgIG5hbWU9XCJmaWxlc1tdXCJcbiAgICAgICAgICAgIFthY2NlcHRdPVwiYWNjZXNzRmlsZXMoKVwiIC8+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgIH1cbiAgICBAaWYgKG1lc3NhZ2VFcnJvcigpICYmIChtdWx0aXBsZSgpIHx8ICFzaG93UG9wdXBVcGxvYWRXaGVuSGFzRmlsZUFuZE1vZGVTaW5nbGUoKSB8fCAoIWZpbGVMaXN0KCkubGVuZ3RoICYmICFtdWx0aXBsZSgpKSkpIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJtdC1bOHB4XSB0ZXh0LVsjZWUyZDQxXSBsaWJzLXVpLWZvbnQtaDdyXCI+XG4gICAgICAgIHt7IG1lc3NhZ2VFcnJvcigpIHx8ICcnIHwgdHJhbnNsYXRlOiB7IHZhbHVlOiBsaW1pdEZpbGUoKSB9IH19XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gICAgQGlmIChjb25maWdEb3dubG9hZFNhbXBsZUZpbGUoKT8ucG9zaXRpb24gPT09ICdib3R0b20nICYmIGNvbmZpZ0Rvd25sb2FkU2FtcGxlRmlsZSgpOyBhcyBjb25maWdEb3dubG9hZFNhbXBsZUZpbGUpIHtcbiAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b25cbiAgICAgICAgW3R5cGVdPVwiJ2J1dHRvbi1saW5rLXByaW1hcnknXCJcbiAgICAgICAgW2NsYXNzTGFiZWxdPVwiJ2xpYnMtdWktZm9udC1oN20nXCJcbiAgICAgICAgW2NsYXNzSW5jbHVkZV09XCInIW10LVs4cHhdICFwLTAnXCJcbiAgICAgICAgW2NsYXNzSWNvbkxlZnRdPVwiJ2xpYnMtdWktaWNvbi1hdHRhY2htZW50IGJlZm9yZTohdGV4dC1bMTJweF0nXCJcbiAgICAgICAgW2xhYmVsXT1cImNvbmZpZ0Rvd25sb2FkU2FtcGxlRmlsZS50aXRsZSB8fCAnICdcIlxuICAgICAgICAobW9DbGljayk9XCJoYW5kbGVyRG93bmxvYWRTYW1wbGVGaWxlKCRldmVudClcIiAvPlxuICAgIH1cbiAgPC9kaXY+XG4gIEBpZiAoZmlsZUxpc3QoKS5sZW5ndGgpIHtcbiAgICA8ZGl2XG4gICAgICBMaWJzVWlDb21wb25lbnRzU2Nyb2xsT3ZlcmxheURpcmVjdGl2ZVxuICAgICAgY2xhc3M9XCJyZWxhdGl2ZSB3LWZ1bGwgaC1mdWxsIHB4LVsxMHB4XSBsaWJzLXVpLWNvbXBvbmVudHMtaW5wdXRzLXVwbG9hZC12aWV3LWxpc3Qge3sgY2xhc3NJbmNsdWRlRmlsZUNvbnRlbnQoKSB8fCAnJyB9fVwiXG4gICAgICBbY2xhc3MubXQtWzEycHhdXT1cIm11bHRpcGxlKCkgfHwgIXNob3dQb3B1cFVwbG9hZFdoZW5IYXNGaWxlQW5kTW9kZVNpbmdsZSgpXCI+XG4gICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbbGFiZWwtZmlsZV1cIj48L25nLWNvbnRlbnQ+XG4gICAgICBAZm9yIChpdGVtIG9mIGZpbGVMaXN0KCk7IHRyYWNrIGl0ZW0oKTsgbGV0IGZpcnN0ID0gJGZpcnN0KSB7XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImxpYnMtdWktY29tcG9uZW50cy1pbnB1dHMtdXBsb2FkLXZpZXctbGlzdC1pdGVtIHt7IGNsYXNzSW5jbHVkZUxpc3RJdGVtKCkgfHwgJycgfX1cIlxuICAgICAgICAgIFtjbGFzcy5saWJzLXVpLWNvbXBvbmVudHMtaW5wdXRzLXVwbG9hZC1maWxlLWZ1bGxdPVwibW9kZURpc3BsYXlGaWxlKCkgPT09ICdmdWxsJ1wiXG4gICAgICAgICAgW2NsYXNzLmxpYnMtdWktY29tcG9uZW50cy1pbnB1dHMtdXBsb2FkLWZpbGUtc2hvcnRdPVwibW9kZURpc3BsYXlGaWxlKCkgPT09ICdzaG9ydCdcIlxuICAgICAgICAgIFtjbGFzcy5saWJzLXVpLWJvcmRlci1lcnJvci1nZW5lcmFsXT1cIml0ZW0oKS5lcnJvciB8fCAobWVzc2FnZUVycm9yKCkgJiYgc2hvd0JvcmRlckVycm9yQWxsSXRlbVdoZW5FcnJvcigpKVwiXG4gICAgICAgICAgW2NsYXNzLm10LTBdPVwiZmlyc3QgJiYgIW11bHRpcGxlKCkgJiYgIXNob3dQb3B1cFVwbG9hZFdoZW5IYXNGaWxlQW5kTW9kZVNpbmdsZSgpXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggdy1mdWxsXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgQGlmIChjYW5TZXRBdmF0YXIoKSAmJiBpdGVtKCkudHlwZSA9PT0gJ2ltYWdlJykge1xuICAgICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b25cbiAgICAgICAgICAgICAgICAgIFt0eXBlXT1cIididXR0b24tbGluay10aGlyZCdcIlxuICAgICAgICAgICAgICAgICAgW2NsYXNzSWNvbkxlZnRdPVwiXG4gICAgICAgICAgICAgICAgICAgICchbXItMCcgKyAoaXRlbSgpLmlzQXZhdGFyID8gJyBsaWJzLXVpLWljb24tY2hlY2stY2lyY2xlLXNvbGlkIGJlZm9yZTohdGV4dC1bIzAwYmM2Ml0nIDogJyBsaWJzLXVpLWljb24tY2hlY2stY2lyY2xlLW91dGxpbmUnKSArIChkaXNhYmxlKCkgfHwgcmVhZG9ubHkoKSB8fCBpdGVtKCkuaXNVcGxvYWRpbmcgfHwgISFpdGVtKCkuZXJyb3IgPyAnIGxpYnMtdWktZGlzYWJsZScgOiAnJylcbiAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICBbcG9wb3Zlcl09XCJ7IGNvbmZpZzogeyBjb250ZW50OiBpdGVtKCkuaXNBdmF0YXIgPyAnaTE4bl9hdmF0YXInIDogJ2kxOG5fY2hvb3NlX2FzX3lvdXJfYXZhdGFyJywgekluZGV4OiB6SW5kZXgoKSB9IH1cIlxuICAgICAgICAgICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCInIW1yLVsxMnB4XSAhcC0wJ1wiXG4gICAgICAgICAgICAgICAgICBbZGlzYWJsZV09XCJkaXNhYmxlKCkgfHwgcmVhZG9ubHkoKSB8fCBpdGVtKCkuaXNVcGxvYWRpbmcgfHwgISFpdGVtKCkuZXJyb3JcIlxuICAgICAgICAgICAgICAgICAgKG91dENsaWNrKT1cImhhbmRsZXJTZXRBdmF0YXIoJGV2ZW50LCBpdGVtKVwiIC8+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBjbGFzcz1cImZsZXhcIlxuICAgICAgICAgICAgICBbY2xhc3Mudy1bY2FsYygxMDAlLTI4cHgpXV09XCJjYW5TZXRBdmF0YXIoKVwiXG4gICAgICAgICAgICAgIFtjbGFzcy53LWZ1bGxdPVwiIWNhblNldEF2YXRhcigpXCI+XG4gICAgICAgICAgICAgIEBpZiAobW9kZURpc3BsYXlGaWxlKCkgPT09ICdmdWxsJykge1xuICAgICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtaW5wdXRzLXVwbG9hZC1hdmF0YXJcbiAgICAgICAgICAgICAgICAgIFtkaXNhYmxlXT1cImRpc2FibGUoKSB8fCByZWFkb25seSgpXCJcbiAgICAgICAgICAgICAgICAgIFsoaXRlbSldPVwiaXRlbVwiXG4gICAgICAgICAgICAgICAgICBbc2hvd1ZpZGVvRHVyYXRpb25dPVwic2hvd1ZpZGVvRHVyYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgICAob3V0T3BlblByZXZpZXcpPVwiaGFuZGxlck9wZW5QcmV2aWV3RmlsZSgkZXZlbnQpXCIgLz5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVsYXRpdmUgdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGFic29sdXRlIHctZnVsbCBoLWZ1bGwgZmxleC1jb2xcIlxuICAgICAgICAgICAgICAgICAgW2NsYXNzLmZsZXgtY29sXT1cIm1vZGVEaXNwbGF5RmlsZSgpID09PSAnZnVsbCdcIlxuICAgICAgICAgICAgICAgICAgW2NsYXNzLmp1c3RpZnktY2VudGVyXT1cIm1vZGVEaXNwbGF5RmlsZSgpID09PSAnZnVsbCdcIlxuICAgICAgICAgICAgICAgICAgW2NsYXNzLml0ZW1zLWNlbnRlcl09XCJtb2RlRGlzcGxheUZpbGUoKSA9PT0gJ3Nob3J0J1wiPlxuICAgICAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1sYWJlbFxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggdy1mdWxsXCJcbiAgICAgICAgICAgICAgICAgICAgW2xhYmVsTGVmdF09XCJpdGVtKCkubmFtZVwiXG4gICAgICAgICAgICAgICAgICAgIFt6SW5kZXhQb3BvdmVyXT1cInpJbmRleCgpICsgMVwiXG4gICAgICAgICAgICAgICAgICAgIFtsYWJlbExlZnRDbGFzc109XCInbGlicy11aS1mb250LWg2bSAnICsgKGRpc2FibGUoKSB8fCByZWFkb25seSgpIHx8IGl0ZW0oKS5pc1VwbG9hZGluZyB8fCBpdGVtKCkuZXJyb3IgPyAndGV4dC1bIzZhNzM4M10nIDogJ3RleHQtWyMwNzE2MzFdJylcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cIm1vZGVEaXNwbGF5RmlsZSgpID09PSAnc2hvcnQnID8gJyFtYi0wJyA6ICcnXCIgLz5cblxuICAgICAgICAgICAgICAgICAgQGlmICghaWdub3JlU2hvd1NpemVGaWxlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC1bIzljYTJhZF0gbGlicy11aS1mb250LWg3ciBzaHJpbmstMFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmZsZXhdPVwibW9kZURpc3BsYXlGaWxlKCkgPT09ICdmdWxsJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLml0ZW1zLWNlbnRlcl09XCJtb2RlRGlzcGxheUZpbGUoKSA9PT0gJ3Nob3J0J1wiXG4gICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm1sLVsxMnB4XV09XCJtb2RlRGlzcGxheUZpbGUoKSA9PT0gJ3Nob3J0J1wiPlxuICAgICAgICAgICAgICAgICAgICAgIHt7IGl0ZW0oKS5zaXplIH19XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgQGlmIChpdGVtKCkuaXNVcGxvYWRpbmcgJiYgaXRlbSgpLnBlcmNlbnRVcGxvYWRpbmcpIHtcbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIG1sLVsxNnB4XVwiXG4gICAgICAgICAgICAgICAgICBbY2xhc3MubXItWzI2cHhdXT1cIm1vZGVEaXNwbGF5RmlsZSgpID09PSAnZnVsbCdcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LVsxMjBweF0gaC1bNHB4XSByb3VuZGVkLVs0cHhdIGJnLVsjZjhmOWZhXSByZWxhdGl2ZVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhYnNvbHV0ZSB0b3AtMCBsZWZ0LTAgaC1bNHB4XSByb3VuZGVkLVs0cHhdIGJnLVsjMDBiYzYyXVwiXG4gICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cIihpdGVtKCkucGVyY2VudFVwbG9hZGluZyA/PyAwKSAqIDEuMlwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggbWwtWzE2cHhdXCI+XG4gICAgICAgICAgICBAaWYgKCFpZ25vcmVJY29uUHJldmlldygpKSB7XG4gICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b25cbiAgICAgICAgICAgICAgICBbdHlwZV09XCInYnV0dG9uLWxpbmstdGhpcmQnXCJcbiAgICAgICAgICAgICAgICBbY2xhc3NJY29uTGVmdF09XCInbGlicy11aS1pY29uLWV5ZS1vdXRsaW5lICFtci0wJ1wiXG4gICAgICAgICAgICAgICAgW3BvcG92ZXJdPVwieyBjb25maWc6IHsgY29udGVudDogJ2kxOG5fcHJldmlldycsIHpJbmRleDogekluZGV4KCkgKyAxIH0gfVwiXG4gICAgICAgICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCInIXAtMCcgKyAoaWdub3JlSWNvblJlbW92ZSgpICYmICFpZ25vcmVJY29uRWRpdCgpID8gJycgOiAnICFtci1bMTJweF0nKVwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVdPVwiaXRlbSgpLmlzVXBsb2FkaW5nIHx8IGRpc2FibGUoKSB8fCByZWFkb25seSgpXCJcbiAgICAgICAgICAgICAgICAob3V0Q2xpY2spPVwiaGFuZGxlck9wZW5QcmV2aWV3RmlsZShpdGVtKCkpXCIgLz5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBpZiAoaXRlbSgpLnR5cGUgPT09ICdpbWFnZScgJiYgIWl0ZW0oKS5lcnJvciAmJiAhaWdub3JlSWNvbkVkaXQoKSkge1xuICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uXG4gICAgICAgICAgICAgICAgW3R5cGVdPVwiJ2J1dHRvbi1saW5rLXRoaXJkJ1wiXG4gICAgICAgICAgICAgICAgW2NsYXNzSWNvbkxlZnRdPVwiJ2xpYnMtdWktaWNvbi1lZGl0LWxpbmUgIW1yLTAnXCJcbiAgICAgICAgICAgICAgICBbcG9wb3Zlcl09XCJ7IGNvbmZpZzogeyBjb250ZW50OiAnaTE4bl9lZGl0JywgekluZGV4OiB6SW5kZXgoKSArIDEgfSB9XCJcbiAgICAgICAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cIichcC0wJyArIChpZ25vcmVJY29uUmVtb3ZlKCkgPyAnJyA6ICcgIW1yLVsxMnB4XScpXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZV09XCJpdGVtKCkuaXNVcGxvYWRpbmcgfHwgZGlzYWJsZSgpIHx8IHJlYWRvbmx5KClcIlxuICAgICAgICAgICAgICAgIChvdXRDbGljayk9XCJoYW5kbGVyRWRpdEltYWdlKCRldmVudCwgaXRlbSlcIiAvPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGlmICghaWdub3JlSWNvblJlbW92ZSgpKSB7XG4gICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b25cbiAgICAgICAgICAgICAgICBbdHlwZV09XCInYnV0dG9uLWxpbmstdGhpcmQnXCJcbiAgICAgICAgICAgICAgICBbY2xhc3NJY29uTGVmdF09XCInbGlicy11aS1pY29uLWNsb3NlICFtci0wJ1wiXG4gICAgICAgICAgICAgICAgW3BvcG92ZXJdPVwieyBjb25maWc6IHsgY29udGVudDogJ2kxOG5fZGVsZXRlJywgekluZGV4OiB6SW5kZXgoKSArIDEgfSB9XCJcbiAgICAgICAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cIichcC0wJ1wiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVdPVwiaXRlbSgpLmlzVXBsb2FkaW5nIHx8IGRpc2FibGUoKSB8fCByZWFkb25seSgpXCJcbiAgICAgICAgICAgICAgICAob3V0Q2xpY2spPVwiaGFuZGxlclJlbW92ZUZpbGUoJGV2ZW50LCBpdGVtKVwiIC8+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICBAaWYgKGl0ZW0oKS5lcnJvciAmJiAobXVsdGlwbGUoKSB8fCBzaG93UG9wdXBVcGxvYWRXaGVuSGFzRmlsZUFuZE1vZGVTaW5nbGUoKSkpIHtcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtWzhweF0gdGV4dC1bI2VlMmQ0MV0gbGlicy11aS1mb250LWg3clwiPnt7IGl0ZW0oKS5lcnJvciB8fCAnICcgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgfVxuICAgICAgfVxuICAgIDwvZGl2PlxuICB9XG48L2Rpdj5cbiJdfQ==
|