@netgrif/components-core
Version:
Netgrif Application engine frontend core Angular library
317 lines • 54.5 kB
JavaScript
import { Component, Inject, Optional, } from "@angular/core";
import { DATA_FIELD_PORTAL_DATA } from "../../models/data-field-portal-data-injection-token";
import { FileListFieldValidation } from "../models/file-list-field";
import { ProgressType } from "../../../resources/resource-provider.service";
import { HttpParams } from "@angular/common/http";
import { take } from "rxjs/operators";
import { AbstractFileFieldDefaultComponent } from '../../models/abstract-file-field-default-component';
import * as i0 from "@angular/core";
import * as i1 from "../../../resources/engine-endpoint/task-resource.service";
import * as i2 from "../../../logger/services/logger.service";
import * as i3 from "../../../snack-bar/services/snack-bar.service";
import * as i4 from "@ngx-translate/core";
import * as i5 from "../../../event/services/event.service";
import * as i6 from "../../../actions/services/front-action.service";
export class AbstractFileListDefaultFieldComponent extends AbstractFileFieldDefaultComponent {
_taskResourceService;
_log;
_snackbar;
_translate;
_eventService;
_frontActionService;
uploadedFiles;
state;
valueChange$;
/**
* Values from file list field validation (eg. maxFiles 5)
* maxFilesNumber - maximum uploadable files
* maxFilesMessage - error message if number of files is exceeded
*/
maxFilesNumber;
maxFilesMessage;
constructor(_taskResourceService, _log, _snackbar, _translate, _eventService, _frontActionService, dataFieldPortalData) {
super(_log, _snackbar, _translate, dataFieldPortalData);
this._taskResourceService = _taskResourceService;
this._log = _log;
this._snackbar = _snackbar;
this._translate = _translate;
this._eventService = _eventService;
this._frontActionService = _frontActionService;
this.state = this.defaultState;
this.uploadedFiles = new Array();
this.maxFilesNumber = Number.POSITIVE_INFINITY;
this.taskId = dataFieldPortalData.additionalFieldProperties.taskId;
}
ngOnInit() {
this.valueChange$ = this.dataField.valueChanges().subscribe(() => {
this.parseResponse();
});
if (this.dataField.validations && this.dataField.validations.length !== 0) {
const val = this.dataField.validations.find(validation => validation.validationRule.includes(FileListFieldValidation.MAX_FILES));
if (val && val.validationRule.split(' ').length === 2 && !isNaN(parseInt(val.validationRule.split(' ')[1], 10))) {
this.maxFilesNumber = parseInt(val.validationRule.split(' ')[1], 10);
this.maxFilesMessage = val.validationMessage && val.validationMessage !== '' ? val.validationMessage : null;
}
}
}
/**
* Set file picker and image elements to [FileFieldService]{@link FileFieldService}.
*
* Initialize file image.
*/
ngAfterViewInit() {
if (this.fileUploadEl) {
this.fileUploadEl.nativeElement.onchange = () => {
this.upload();
};
}
}
ngOnDestroy() {
super.ngOnDestroy();
this.valueChange$.unsubscribe();
}
chooseFile() {
if (this.state.uploading || this.formControlRef.disabled) {
return;
}
this.fileUploadEl.nativeElement.click();
}
/**
* Call after click on file field.
*
* If file field has no file uploaded
* [FilesUploadComponent]{@link AbstractFilesUploadComponent} via [SideMenu]{@link SideMenuService} opens.
*
* Otherwise opens a file picker from which the user can select files.
*/
upload() {
if (!this.fileUploadEl.nativeElement.files || this.fileUploadEl.nativeElement.files.length === 0) {
return;
}
if (!this.taskId) {
this._log.error('File cannot be uploaded. No task is set to the field.');
return;
}
if (this.fileUploadEl.nativeElement.files.length + this.uploadedFiles.length > this.maxFilesNumber) {
this._snackbar.openErrorSnackBar(this.maxFilesMessage ? this.maxFilesMessage :
this._translate.instant('dataField.snackBar.maxFilesExceeded') + this.maxFilesNumber);
this.fileUploadEl.nativeElement.value = '';
return;
}
let filesToUpload = Array.from(this.fileUploadEl.nativeElement.files);
let sum = 0;
filesToUpload.forEach(item => sum += item.size);
if (this.dataField.maxUploadSizeInBytes &&
this.dataField.maxUploadSizeInBytes < sum) {
this._log.error('Files cannot be uploaded. Maximum size of files exceeded.');
this.resolveMaxSizeMessage();
this.fileUploadEl.nativeElement.value = '';
return;
}
if (this.dataField.value?.namesPaths && this.dataField.value?.namesPaths.length !== 0) {
this.dataField.value.namesPaths.forEach(namePath => {
filesToUpload = filesToUpload.filter(fileToUpload => fileToUpload.name !== namePath.name);
});
if (filesToUpload.length === 0) {
this._log.error('User chose the same files that are already uploaded. Uploading skipped');
this._snackbar.openErrorSnackBar(this._translate.instant('dataField.snackBar.wontUploadSameFiles'));
this.fileUploadEl.nativeElement.value = '';
return;
}
}
if (!this.checkAllowedTypes()) {
return;
}
this.state = this.defaultState;
this.state.uploading = true;
const fileFormData = new FormData();
filesToUpload.forEach(fileToUpload => {
fileFormData.append('files', fileToUpload);
});
const requestBody = {
parentTaskId: this.resolveParentTaskId(),
fieldId: this.dataField.stringId,
};
fileFormData.append('data', new Blob([JSON.stringify(requestBody)], { type: 'application/json' }));
this._taskResourceService.uploadFile(this.taskId, fileFormData, true)
.subscribe({
next: (response) => {
if (response.type && response.type === ProgressType.UPLOAD) {
this.state.progress = response.progress;
}
else {
this.state.completed = true;
this.state.uploading = false;
this.state.progress = 0;
if (response.error) {
this.state.error = true;
this._log.error(`File [${this.dataField.stringId}] ${this.fileUploadEl.nativeElement.files.item(0)?.name} uploading has failed!`, response.error);
this._snackbar.openErrorSnackBar(this._translate.instant(response.error));
}
else {
this._log.debug(`Files [${this.dataField.stringId}] were successfully uploaded`);
const changedFieldsMap = this._eventService.parseChangedFieldsFromOutcomeTree(response.outcome);
this.dataField.emitChangedFields(changedFieldsMap);
this.state.error = false;
filesToUpload.forEach(fileToUpload => {
this.uploadedFiles.push(fileToUpload.name);
this.dataField.value.namesPaths.push({ name: fileToUpload.name });
this.formControlRef.setValue(this.dataField.value.namesPaths.map(namePath => {
return namePath['name'];
}).join('/'));
});
this._snackbar.openSuccessSnackBar(!!response.outcome.message ? response.outcome.message : this._translate.instant('tasks.snackbar.dataSaved'));
const frontActions = this._eventService.parseFrontActionsFromOutcomeTree(response.outcome);
if (frontActions?.length > 0) {
this._frontActionService.runAll(frontActions);
}
}
this.dataField.touch = true;
this.dataField.update();
this.fileUploadEl.nativeElement.value = '';
}
}, error: (error) => {
this.state.completed = true;
this.state.error = true;
this.state.uploading = false;
this.state.progress = 0;
if (error?.error?.message) {
this._snackbar.openErrorSnackBar(this._translate.instant(error.error.message));
}
else {
this._snackbar.openErrorSnackBar(this._translate.instant('dataField.snackBar.fileUploadFailed'));
}
this._log.error(`File [${this.dataField.stringId}] ${this.fileUploadEl.nativeElement.files.item(0)?.name} uploading has failed!`, error);
this.dataField.touch = true;
this.dataField.update();
this.fileUploadEl.nativeElement.value = '';
}
});
}
download(fileName) {
if (!this.dataField.value?.namesPaths?.find(namePath => namePath.name === fileName)) {
return;
}
if (!this.taskId) {
this._log.error('File cannot be downloaded. No task is set to the field.');
return;
}
this.state = this.defaultState;
this.state.downloading = true;
let params = new HttpParams();
params = params.set("fieldId", this.dataField.stringId);
params = params.set("fileName", fileName);
this._taskResourceService.downloadFile(this.resolveParentTaskId(), params).subscribe(response => {
if (response.type && response.type === ProgressType.DOWNLOAD) {
this.state.progress = response.progress;
}
else {
this._log.debug(`File [${this.dataField.stringId}] ${fileName} was successfully downloaded`);
this.downloadViaAnchor(response, fileName);
this.state.downloading = false;
this.state.progress = 0;
this.dataField.downloaded.push(fileName);
}
}, error => {
this._log.error(`Downloading file [${this.dataField.stringId}] ${fileName} has failed!`, error);
this._snackbar.openErrorSnackBar(fileName + ' ' + this._translate.instant('dataField.snackBar.downloadFail'));
this.state.downloading = false;
this.state.progress = 0;
});
}
downloadViaAnchor(blob, fileName) {
const a = document.createElement('a');
document.body.appendChild(a);
a.setAttribute('style', 'display: none');
blob = new Blob([blob], { type: 'application/octet-stream' });
const url = window.URL.createObjectURL(blob);
a.href = url;
a.download = fileName;
a.click();
window.URL.revokeObjectURL(url);
document.body.removeChild(a);
}
deleteFile(fileName) {
if (!this.dataField.value?.namesPaths?.find(namePath => namePath.name === fileName)) {
return;
}
if (!this.taskId) {
this._log.error('File cannot be deleted. No task is set to the field.');
return;
}
const requestBody = {
parentTaskId: this.resolveParentTaskId(),
fieldId: this.dataField.stringId,
fileName
};
this._taskResourceService.deleteFile(this.taskId, requestBody).pipe(take(1)).subscribe((response) => {
if (response.success) {
const changedFieldsMap = this._eventService.parseChangedFieldsFromOutcomeTree(response.outcome);
this.dataField.emitChangedFields(changedFieldsMap);
this.fileUploadEl.nativeElement.value = '';
this.uploadedFiles = this.uploadedFiles.filter(uploadedFile => uploadedFile !== fileName);
if (this.dataField.value.namesPaths) {
this.dataField.value.namesPaths = this.dataField.value.namesPaths.filter(namePath => namePath.name !== fileName);
this.formControlRef.setValue(this.dataField.value.namesPaths.map(namePath => {
return namePath['name'];
}).join('/'));
this.dataField.update();
}
this.dataField.downloaded = this.dataField.downloaded.filter(one => one !== fileName);
this._log.debug(`File [${this.dataField.stringId}] ${fileName} was successfully deleted`);
this.formControlRef.markAsTouched();
}
else {
this._log.error(`Deleting file [${this.dataField.stringId}] ${fileName} has failed!`, response.error);
this._snackbar.openErrorSnackBar(fileName + ' ' + this._translate.instant('dataField.snackBar.fileDeleteFailed'));
}
});
}
get defaultState() {
return {
progress: 0,
completed: false,
error: false,
uploading: false,
downloading: false
};
}
/**
* Construct display name.
*/
constructDisplayName() {
if (!!this.dataField && !!this.dataField.placeholder) {
return this.dataField.placeholder;
}
return this._translate.instant('dataField.file.noFile');
}
parseResponse() {
if (this.dataField.value) {
if (!!this.dataField.value.namesPaths && this.dataField.value.namesPaths.length !== 0) {
this.uploadedFiles = new Array();
this.dataField.value.namesPaths.forEach(namePath => {
this.uploadedFiles.push(namePath.name);
});
}
else {
this.dataField.value.namesPaths = new Array();
}
this.uploadedFiles = this.dataField.value.namesPaths.map(namePath => namePath.name);
}
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AbstractFileListDefaultFieldComponent, deps: [{ token: i1.TaskResourceService }, { token: i2.LoggerService }, { token: i3.SnackBarService }, { token: i4.TranslateService }, { token: i5.EventService }, { token: i6.FrontActionService }, { token: DATA_FIELD_PORTAL_DATA, optional: true }], target: i0.ɵɵFactoryTarget.Component });
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: AbstractFileListDefaultFieldComponent, selector: "ncc-abstract-file-list-default-field", usesInheritance: true, ngImport: i0, template: '', isInline: true });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AbstractFileListDefaultFieldComponent, decorators: [{
type: Component,
args: [{
selector: 'ncc-abstract-file-list-default-field',
template: ''
}]
}], ctorParameters: () => [{ type: i1.TaskResourceService }, { type: i2.LoggerService }, { type: i3.SnackBarService }, { type: i4.TranslateService }, { type: i5.EventService }, { type: i6.FrontActionService }, { type: undefined, decorators: [{
type: Optional
}, {
type: Inject,
args: [DATA_FIELD_PORTAL_DATA]
}] }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3QtZmlsZS1saXN0LWRlZmF1bHQtZmllbGQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmV0Z3JpZi1jb21wb25lbnRzLWNvcmUvc3JjL2xpYi9kYXRhLWZpZWxkcy9maWxlLWxpc3QtZmllbGQvZmlsZS1saXN0LWRlZmF1bHQtZmllbGQvYWJzdHJhY3QtZmlsZS1saXN0LWRlZmF1bHQtZmllbGQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFSCxTQUFTLEVBQ1QsTUFBTSxFQUdOLFFBQVEsR0FDWCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUMsc0JBQXNCLEVBQXNCLE1BQU0scURBQXFELENBQUM7QUFDaEgsT0FBTyxFQUFnQix1QkFBdUIsRUFBQyxNQUFNLDJCQUEyQixDQUFDO0FBUWpGLE9BQU8sRUFBQyxZQUFZLEVBQW1CLE1BQU0sOENBQThDLENBQUM7QUFFNUYsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ2hELE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUdwQyxPQUFPLEVBQUMsaUNBQWlDLEVBQUMsTUFBTSxvREFBb0QsQ0FBQzs7Ozs7Ozs7QUFpQnJHLE1BQU0sT0FBZ0IscUNBQXNDLFNBQVEsaUNBQWdEO0lBY2hGO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQWpCekIsYUFBYSxDQUFnQjtJQUM3QixLQUFLLENBQWE7SUFDakIsWUFBWSxDQUFlO0lBRW5DOzs7O09BSUc7SUFDTyxjQUFjLENBQVM7SUFDdkIsZUFBZSxDQUFTO0lBRWxDLFlBQWdDLG9CQUF5QyxFQUN6QyxJQUFtQixFQUNuQixTQUEwQixFQUMxQixVQUE0QixFQUM1QixhQUEyQixFQUMzQixtQkFBdUMsRUFDTCxtQkFBdUQ7UUFDckgsS0FBSyxDQUFDLElBQUksRUFBRSxTQUFT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dGVyVmlld0luaXQsXG4gICAgQ29tcG9uZW50LFxuICAgIEluamVjdCxcbiAgICBPbkRlc3Ryb3ksXG4gICAgT25Jbml0LFxuICAgIE9wdGlvbmFsLFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHtEQVRBX0ZJRUxEX1BPUlRBTF9EQVRBLCBEYXRhRmllbGRQb3J0YWxEYXRhfSBmcm9tIFwiLi4vLi4vbW9kZWxzL2RhdGEtZmllbGQtcG9ydGFsLWRhdGEtaW5qZWN0aW9uLXRva2VuXCI7XG5pbXBvcnQge0ZpbGVMaXN0RmllbGQsIEZpbGVMaXN0RmllbGRWYWxpZGF0aW9ufSBmcm9tIFwiLi4vbW9kZWxzL2ZpbGUtbGlzdC1maWVsZFwiO1xuaW1wb3J0IHtTdWJzY3JpcHRpb259IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQge1Rhc2tSZXNvdXJjZVNlcnZpY2V9IGZyb20gXCIuLi8uLi8uLi9yZXNvdXJjZXMvZW5naW5lLWVuZHBvaW50L3Rhc2stcmVzb3VyY2Uuc2VydmljZVwiO1xuaW1wb3J0IHtMb2dnZXJTZXJ2aWNlfSBmcm9tIFwiLi4vLi4vLi4vbG9nZ2VyL3NlcnZpY2VzL2xvZ2dlci5zZXJ2aWNlXCI7XG5pbXBvcnQge1NuYWNrQmFyU2VydmljZX0gZnJvbSBcIi4uLy4uLy4uL3NuYWNrLWJhci9zZXJ2aWNlcy9zbmFjay1iYXIuc2VydmljZVwiO1xuaW1wb3J0IHtUcmFuc2xhdGVTZXJ2aWNlfSBmcm9tIFwiQG5neC10cmFuc2xhdGUvY29yZVwiO1xuaW1wb3J0IHtFdmVudFNlcnZpY2V9IGZyb20gXCIuLi8uLi8uLi9ldmVudC9zZXJ2aWNlcy9ldmVudC5zZXJ2aWNlXCI7XG5pbXBvcnQge0V2ZW50T3V0Y29tZU1lc3NhZ2VSZXNvdXJjZX0gZnJvbSBcIi4uLy4uLy4uL3Jlc291cmNlcy9pbnRlcmZhY2UvbWVzc2FnZS1yZXNvdXJjZVwiO1xuaW1wb3J0IHtQcm9ncmVzc1R5cGUsIFByb3ZpZGVyUHJvZ3Jlc3N9IGZyb20gXCIuLi8uLi8uLi9yZXNvdXJjZXMvcmVzb3VyY2UtcHJvdmlkZXIuc2VydmljZVwiO1xuaW1wb3J0IHtDaGFuZ2VkRmllbGRzTWFwfSBmcm9tIFwiLi4vLi4vLi4vZXZlbnQvc2VydmljZXMvaW50ZXJmYWNlcy9jaGFuZ2VkLWZpZWxkcy1tYXBcIjtcbmltcG9ydCB7SHR0cFBhcmFtc30gZnJvbSBcIkBhbmd1bGFyL2NvbW1vbi9odHRwXCI7XG5pbXBvcnQge3Rha2V9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xuaW1wb3J0IHtGaWxlRmllbGRWYWx1ZX0gZnJvbSBcIi4uLy4uL2ZpbGUtZmllbGQvbW9kZWxzL2ZpbGUtZmllbGQtdmFsdWVcIjtcbmltcG9ydCB7RmlsZUZpZWxkUmVxdWVzdH0gZnJvbSBcIi4uLy4uLy4uL3Jlc291cmNlcy9pbnRlcmZhY2UvZmlsZS1maWVsZC1yZXF1ZXN0LWJvZHlcIjtcbmltcG9ydCB7QWJzdHJhY3RGaWxlRmllbGREZWZhdWx0Q29tcG9uZW50fSBmcm9tICcuLi8uLi9tb2RlbHMvYWJzdHJhY3QtZmlsZS1maWVsZC1kZWZhdWx0LWNvbXBvbmVudCc7XG5pbXBvcnQge0Zyb250QWN0aW9ufSBmcm9tIFwiLi4vLi4vbW9kZWxzL2NoYW5nZWQtZmllbGRzXCI7XG5pbXBvcnQge0Zyb250QWN0aW9uU2VydmljZX0gZnJvbSBcIi4uLy4uLy4uL2FjdGlvbnMvc2VydmljZXMvZnJvbnQtYWN0aW9uLnNlcnZpY2VcIjtcblxuZXhwb3J0IGludGVyZmFjZSBGaWxlc1N0YXRlIHtcbiAgICBwcm9ncmVzczogbnVtYmVyO1xuICAgIHVwbG9hZGluZzogYm9vbGVhbjtcbiAgICBkb3dubG9hZGluZzogYm9vbGVhbjtcbiAgICBjb21wbGV0ZWQ6IGJvb2xlYW47XG4gICAgZXJyb3I6IGJvb2xlYW47XG59XG5cblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICduY2MtYWJzdHJhY3QtZmlsZS1saXN0LWRlZmF1bHQtZmllbGQnLFxuICAgIHRlbXBsYXRlOiAnJ1xufSlcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEZpbGVMaXN0RGVmYXVsdEZpZWxkQ29tcG9uZW50IGV4dGVuZHMgQWJzdHJhY3RGaWxlRmllbGREZWZhdWx0Q29tcG9uZW50PEZpbGVMaXN0RmllbGQ+IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuXG4gICAgcHVibGljIHVwbG9hZGVkRmlsZXM6IEFycmF5PHN0cmluZz47XG4gICAgcHVibGljIHN0YXRlOiBGaWxlc1N0YXRlO1xuICAgIHByaXZhdGUgdmFsdWVDaGFuZ2UkOiBTdWJzY3JpcHRpb247XG5cbiAgICAvKipcbiAgICAgKiBWYWx1ZXMgZnJvbSBmaWxlIGxpc3QgZmllbGQgdmFsaWRhdGlvbiAoZWcuIG1heEZpbGVzIDUpXG4gICAgICogbWF4RmlsZXNOdW1iZXIgLSBtYXhpbXVtIHVwbG9hZGFibGUgZmlsZXNcbiAgICAgKiBtYXhGaWxlc01lc3NhZ2UgLSBlcnJvciBtZXNzYWdlIGlmIG51bWJlciBvZiBmaWxlcyBpcyBleGNlZWRlZFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBtYXhGaWxlc051bWJlcjogbnVtYmVyO1xuICAgIHByb3RlY3RlZCBtYXhGaWxlc01lc3NhZ2U6IHN0cmluZztcblxuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgX3Rhc2tSZXNvdXJjZVNlcnZpY2U6IFRhc2tSZXNvdXJjZVNlcnZpY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBfbG9nOiBMb2dnZXJTZXJ2aWNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX3NuYWNrYmFyOiBTbmFja0JhclNlcnZpY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBfdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX2V2ZW50U2VydmljZTogRXZlbnRTZXJ2aWNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX2Zyb250QWN0aW9uU2VydmljZTogRnJvbnRBY3Rpb25TZXJ2aWNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KERBVEFfRklFTERfUE9SVEFMX0RBVEEpIGRhdGFGaWVsZFBvcnRhbERhdGE6IERhdGFGaWVsZFBvcnRhbERhdGE8RmlsZUxpc3RGaWVsZD4pIHtcbiAgICAgICAgc3VwZXIoX2xvZywgX3NuYWNrYmFyLCBfdHJhbnNsYXRlLCBkYXRhRmllbGRQb3J0YWxEYXRhKTtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHRoaXMuZGVmYXVsdFN0YXRlO1xuICAgICAgICB0aGlzLnVwbG9hZGVkRmlsZXMgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xuICAgICAgICB0aGlzLm1heEZpbGVzTnVtYmVyID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1xuICAgICAgICB0aGlzLnRhc2tJZCA9IGRhdGFGaWVsZFBvcnRhbERhdGEuYWRkaXRpb25hbEZpZWxkUHJvcGVydGllcy50YXNrSWQgYXMgc3RyaW5nO1xuICAgIH1cblxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLnZhbHVlQ2hhbmdlJCA9IHRoaXMuZGF0YUZpZWxkLnZhbHVlQ2hhbmdlcygpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnBhcnNlUmVzcG9uc2UoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICh0aGlzLmRhdGFGaWVsZC52YWxpZGF0aW9ucyAmJiB0aGlzLmRhdGFGaWVsZC52YWxpZGF0aW9ucy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbCA9IHRoaXMuZGF0YUZpZWxkLnZhbGlkYXRpb25zLmZpbmQodmFsaWRhdGlvbiA9PlxuICAgICAgICAgICAgICAgIHZhbGlkYXRpb24udmFsaWRhdGlvblJ1bGUuaW5jbHVkZXMoRmlsZUxpc3RGaWVsZFZhbGlkYXRpb24uTUFYX0ZJTEVTKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmICh2YWwgJiYgdmFsLnZhbGlkYXRpb25SdWxlLnNwbGl0KCcgJykubGVuZ3RoID09PSAyICYmICFpc05hTihwYXJzZUludCh2YWwudmFsaWRhdGlvblJ1bGUuc3BsaXQoJyAnKVsxXSwgMTApKSkge1xuICAgICAgICAgICAgICAgIHRoaXMubWF4RmlsZXNOdW1iZXIgPSBwYXJzZUludCh2YWwudmFsaWRhdGlvblJ1bGUuc3BsaXQoJyAnKVsxXSwgMTApO1xuICAgICAgICAgICAgICAgIHRoaXMubWF4RmlsZXNNZXNzYWdlID0gdmFsLnZhbGlkYXRpb25NZXNzYWdlICYmIHZhbC52YWxpZGF0aW9uTWVzc2FnZSAhPT0gJycgPyB2YWwudmFsaWRhdGlvbk1lc3NhZ2UgOiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IGZpbGUgcGlja2VyIGFuZCBpbWFnZSBlbGVtZW50cyB0byBbRmlsZUZpZWxkU2VydmljZV17QGxpbmsgRmlsZUZpZWxkU2VydmljZX0uXG4gICAgICpcbiAgICAgKiBJbml0aWFsaXplIGZpbGUgaW1hZ2UuXG4gICAgICovXG4gICAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5maWxlVXBsb2FkRWwpIHtcbiAgICAgICAgICAgIHRoaXMuZmlsZVVwbG9hZEVsLm5hdGl2ZUVsZW1lbnQub25jaGFuZ2UgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy51cGxvYWQoKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgc3VwZXIubmdPbkRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy52YWx1ZUNoYW5nZSQudW5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2hvb3NlRmlsZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUudXBsb2FkaW5nIHx8IHRoaXMuZm9ybUNvbnRyb2xSZWYuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZpbGVVcGxvYWRFbC5uYXRpdmVFbGVtZW50LmNsaWNrKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FsbCBhZnRlciBjbGljayBvbiBmaWxlIGZpZWxkLlxuICAgICAqXG4gICAgICogSWYgZmlsZSBmaWVsZCBoYXMgbm8gZmlsZSB1cGxvYWRlZFxuICAgICAqIFtGaWxlc1VwbG9hZENvbXBvbmVudF17QGxpbmsgQWJzdHJhY3RGaWxlc1VwbG9hZENvbXBvbmVudH0gdmlhIFtTaWRlTWVudV17QGxpbmsgU2lkZU1lbnVTZXJ2aWNlfSBvcGVucy5cbiAgICAgKlxuICAgICAqIE90aGVyd2lzZSBvcGVucyBhIGZpbGUgcGlja2VyIGZyb20gd2hpY2ggdGhlIHVzZXIgY2FuIHNlbGVjdCBmaWxlcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgdXBsb2FkKCkge1xuICAgICAgICBpZiAoIXRoaXMuZmlsZVVwbG9hZEVsLm5hdGl2ZUVsZW1lbnQuZmlsZXMgfHwgdGhpcy5maWxlVXBsb2FkRWwubmF0aXZlRWxlbWVudC5maWxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMudGFza0lkKSB7XG4gICAgICAgICAgICB0aGlzLl9sb2cuZXJyb3IoJ0ZpbGUgY2Fubm90IGJlIHVwbG9hZGVkLiBObyB0YXNrIGlzIHNldCB0byB0aGUgZmllbGQuJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZmlsZVVwbG9hZEVsLm5hdGl2ZUVsZW1lbnQuZmlsZXMubGVuZ3RoICsgdGhpcy51cGxvYWRlZEZpbGVzLmxlbmd0aCA+IHRoaXMubWF4RmlsZXNOdW1iZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX3NuYWNrYmFyLm9wZW5FcnJvclNuYWNrQmFyKHRoaXMubWF4RmlsZXNNZXNzYWdlID8gdGhpcy5tYXhGaWxlc01lc3NhZ2UgOlxuICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zbGF0ZS5pbnN0YW50KCdkYXRhRmllbGQuc25hY2tCYXIubWF4RmlsZXNFeGNlZWRlZCcpICsgdGhpcy5tYXhGaWxlc051bWJlclxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuZmlsZVVwbG9hZEVsLm5hdGl2ZUVsZW1lbnQudmFsdWUgPSAnJztcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBmaWxlc1RvVXBsb2FkID0gQXJyYXkuZnJvbSh0aGlzLmZpbGVVcGxvYWRFbC5uYXRpdmVFbGVtZW50LmZpbGVzKTtcbiAgICAgICAgbGV0IHN1bSA9IDA7XG4gICAgICAgIGZpbGVzVG9VcGxvYWQuZm9yRWFjaChpdGVtID0+IHN1bSArPSBpdGVtLnNpemUpO1xuICAgICAgICBpZiAodGhpcy5kYXRhRmllbGQubWF4VXBsb2FkU2l6ZUluQnl0ZXMgJiZcbiAgICAgICAgICAgIHRoaXMuZGF0YUZpZWxkLm1heFVwbG9hZFNpemVJbkJ5dGVzIDwgc3VtKSB7XG4gICAgICAgICAgICB0aGlzLl9sb2cuZXJyb3IoJ0ZpbGVzIGNhbm5vdCBiZSB1cGxvYWRlZC4gTWF4aW11bSBzaXplIG9mIGZpbGVzIGV4Y2VlZGVkLicpO1xuICAgICAgICAgICAgdGhpcy5yZXNvbHZlTWF4U2l6ZU1lc3NhZ2UoKTtcbiAgICAgICAgICAgIHRoaXMuZmlsZVVwbG9hZEVsLm5hdGl2ZUVsZW1lbnQudmFsdWUgPSAnJztcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmRhdGFGaWVsZC52YWx1ZT8ubmFtZXNQYXRocyAmJiB0aGlzLmRhdGFGaWVsZC52YWx1ZT8ubmFtZXNQYXRocy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YUZpZWxkLnZhbHVlLm5hbWVzUGF0aHMuZm9yRWFjaChuYW1lUGF0aCA9PiB7XG4gICAgICAgICAgICAgICAgZmlsZXNUb1VwbG9hZCA9IGZpbGVzVG9VcGxvYWQuZmlsdGVyKGZpbGVUb1VwbG9hZCA9PiBmaWxlVG9VcGxvYWQubmFtZSAhPT0gbmFtZVBhdGgubmFtZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChmaWxlc1RvVXBsb2FkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xvZy5lcnJvcignVXNlciBjaG9zZSB0aGUgc2FtZSBmaWxlcyB0aGF0IGFyZSBhbHJlYWR5IHVwbG9hZGVkLiBVcGxvYWRpbmcgc2tpcHBlZCcpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3NuYWNrYmFyLm9wZW5FcnJvclNuYWNrQmFyKHRoaXMuX3RyYW5zbGF0ZS5pbnN0YW50KCdkYXRhRmllbGQuc25hY2tCYXIud29udFVwbG9hZFNhbWVGaWxlcycpKTtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbGVVcGxvYWRFbC5uYXRpdmVFbGVtZW50LnZhbHVlID0gJyc7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLmNoZWNrQWxsb3dlZFR5cGVzKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc3RhdGUgPSB0aGlzLmRlZmF1bHRTdGF0ZTtcbiAgICAgICAgdGhpcy5zdGF0ZS51cGxvYWRpbmcgPSB0cnVlO1xuICAgICAgICBjb25zdCBmaWxlRm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcblxuICAgICAgICBmaWxlc1RvVXBsb2FkLmZvckVhY2goZmlsZVRvVXBsb2FkID0+IHtcbiAgICAgICAgICAgIGZpbGVGb3JtRGF0YS5hcHBlbmQoJ2ZpbGVzJywgZmlsZVRvVXBsb2FkKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHJlcXVlc3RCb2R5OiBGaWxlRmllbGRSZXF1ZXN0ID0ge1xuICAgICAgICAgICAgcGFyZW50VGFza0lkOiB0aGlzLnJlc29sdmVQYXJlbnRUYXNrSWQoKSxcbiAgICAgICAgICAgIGZpZWxkSWQ6IHRoaXMuZGF0YUZpZWxkLnN0cmluZ0lkLFxuICAgICAgICB9XG4gICAgICAgIGZpbGVGb3JtRGF0YS5hcHBlbmQoJ2RhdGEnLCBuZXcgQmxvYihbSlNPTi5zdHJpbmdpZnkocmVxdWVzdEJvZHkpXSwge3R5cGU6ICdhcHBsaWNhdGlvbi9qc29uJ30pKTtcbiAgICAgICAgdGhpcy5fdGFza1Jlc291cmNlU2VydmljZS51cGxvYWRGaWxlKHRoaXMudGFza0lkLCBmaWxlRm9ybURhdGEsIHRydWUpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgICAgICBuZXh0OiAocmVzcG9uc2U6IEV2ZW50T3V0Y29tZU1lc3NhZ2VSZXNvdXJjZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoKHJlc3BvbnNlIGFzIFByb3ZpZGVyUHJvZ3Jlc3MpLnR5cGUgJiYgKHJlc3BvbnNlIGFzIFByb3ZpZGVyUHJvZ3Jlc3MpLnR5cGUgPT09IFByb2dyZXNzVHlwZS5VUExPQUQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUucHJvZ3Jlc3MgPSAocmVzcG9uc2UgYXMgUHJvdmlkZXJQcm9ncmVzcykucHJvZ3Jlc3M7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlLmNvbXBsZXRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlLnVwbG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0ZS5wcm9ncmVzcyA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UuZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlLmVycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9sb2cuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBGaWxlIFske3RoaXMuZGF0YUZpZWxkLnN0cmluZ0lkfV0gJHt0aGlzLmZpbGVVcGxvYWRFbC5uYXRpdmVFbGVtZW50LmZpbGVzLml0ZW0oMCk/Lm5hbWV9IHVwbG9hZGluZyBoYXMgZmFpbGVkIWAsIHJlc3BvbnNlLmVycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zbmFja2Jhci5vcGVuRXJyb3JTbmFja0Jhcih0aGlzLl90cmFuc2xhdGUuaW5zdGFudChyZXNwb25zZS5lcnJvcikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9sb2cuZGVidWcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBGaWxlcyBbJHt0aGlzLmRhdGFGaWVsZC5zdHJpbmdJZH1dIHdlcmUgc3VjY2Vzc2Z1bGx5IHVwbG9hZGVkYFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhbmdlZEZpZWxkc01hcDogQ2hhbmdlZEZpZWxkc01hcCA9IHRoaXMuX2V2ZW50U2VydmljZS5wYXJzZUNoYW5nZWRGaWVsZHNGcm9tT3V0Y29tZVRyZWUocmVzcG9uc2Uub3V0Y29tZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhRmllbGQuZW1pdENoYW5nZWRGaWVsZHMoY2hhbmdlZEZpZWxkc01hcCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0ZS5lcnJvciA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVzVG9VcGxvYWQuZm9yRWFjaChmaWxlVG9VcGxvYWQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwbG9hZGVkRmlsZXMucHVzaChmaWxlVG9VcGxvYWQubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YUZpZWxkLnZhbHVlLm5hbWVzUGF0aHMucHVzaCh7bmFtZTogZmlsZVRvVXBsb2FkLm5hbWV9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtQ29udHJvbFJlZi5zZXRWYWx1ZSh0aGlzLmRhdGFGaWVsZC52YWx1ZS5uYW1lc1BhdGhzLm1hcChuYW1lUGF0aCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmFtZVBhdGhbJ25hbWUnXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuam9pbignLycpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zbmFja2Jhci5vcGVuU3VjY2Vzc1NuYWNrQmFyKCEhcmVzcG9uc2Uub3V0Y29tZS5tZXNzYWdlID8gcmVzcG9uc2Uub3V0Y29tZS5tZXNzYWdlIDogdGhpcy5fdHJhbnNsYXRlLmluc3RhbnQoJ3Rhc2tzLnNuYWNrYmFyLmRhdGFTYXZlZCcpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmcm9udEFjdGlvbnM6IEFycmF5PEZyb250QWN0aW9uPiA9IHRoaXMuX2V2ZW50U2VydmljZS5wYXJzZUZyb250QWN0aW9uc0Zyb21PdXRjb21lVHJlZShyZXNwb25zZS5vdXRjb21lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnJvbnRBY3Rpb25zPy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2Zyb250QWN0aW9uU2VydmljZS5ydW5BbGwoZnJvbnRBY3Rpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGFGaWVsZC50b3VjaCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGFGaWVsZC51cGRhdGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsZVVwbG9hZEVsLm5hdGl2ZUVsZW1lbnQudmFsdWUgPSAnJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIGVycm9yOiAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0ZS5jb21wbGV0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlLmVycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0ZS51cGxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0ZS5wcm9ncmVzcyA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnJvcj8uZXJyb3I/Lm1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3NuYWNrYmFyLm9wZW5FcnJvclNuYWNrQmFyKHRoaXMuX3RyYW5zbGF0ZS5pbnN0YW50KGVycm9yLmVycm9yLm1lc3NhZ2UpKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3NuYWNrYmFyLm9wZW5FcnJvclNuYWNrQmFyKHRoaXMuX3RyYW5zbGF0ZS5pbnN0YW50KCdkYXRhRmllbGQuc25hY2tCYXIuZmlsZVVwbG9hZEZhaWxlZCcpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9sb2cuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICBgRmlsZSBbJHt0aGlzLmRhdGFGaWVsZC5zdHJpbmdJZH1dICR7dGhpcy5maWxlVXBsb2FkRWwubmF0aXZlRWxlbWVudC5maWxlcy5pdGVtKDApPy5uYW1lfSB1cGxvYWRpbmcgaGFzIGZhaWxlZCFgLCBlcnJvclxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGFGaWVsZC50b3VjaCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YUZpZWxkLnVwZGF0ZSgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbGVVcGxvYWRFbC5uYXRpdmVFbGVtZW50LnZhbHVlID0gJyc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGRvd25sb2FkKGZpbGVOYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKCF0aGlzLmRhdGFGaWVsZC52YWx1ZT8ubmFtZXNQYXRocz8uZmluZChuYW1lUGF0aCA9PiBuYW1lUGF0aC5uYW1lID09PSBmaWxlTmFtZSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMudGFza0lkKSB7XG4gICAgICAgICAgICB0aGlzLl9sb2cuZXJyb3IoJ0ZpbGUgY2Fubm90IGJlIGRvd25sb2FkZWQuIE5vIHRhc2sgaXMgc2V0IHRvIHRoZSBmaWVsZC4nKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc3RhdGUgPSB0aGlzLmRlZmF1bHRTdGF0ZTtcbiAgICAgICAgdGhpcy5zdGF0ZS5kb3dubG9hZGluZyA9IHRydWU7XG4gICAgICAgIGxldCBwYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpO1xuICAgICAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KFwiZmllbGRJZFwiLCB0aGlzLmRhdGFGaWVsZC5zdHJpbmdJZCk7XG4gICAgICAgIHBhcmFtcyA9IHBhcmFtcy5zZXQoXCJmaWxlTmFtZVwiLCBmaWxlTmFtZSk7XG4gICAgICAgIHRoaXMuX3Rhc2tSZXNvdXJjZVNlcnZpY2UuZG93bmxvYWRGaWxlKHRoaXMucmVzb2x2ZVBhcmVudFRhc2tJZCgpLCBwYXJhbXMpLnN1YnNjcmliZShyZXNwb25zZSA9PiB7XG4gICAgICAgICAgICBpZiAoKHJlc3BvbnNlIGFzIFByb3ZpZGVyUHJvZ3Jlc3MpLnR5cGUgJiYgKHJlc3BvbnNlIGFzIFByb3ZpZGVyUHJvZ3Jlc3MpLnR5cGUgPT09IFByb2dyZXNzVHlwZS5ET1dOTE9BRCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUucHJvZ3Jlc3MgPSAocmVzcG9uc2UgYXMgUHJvdmlkZXJQcm9ncmVzcykucHJvZ3Jlc3M7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xvZy5kZWJ1ZyhgRmlsZSBbJHt0aGlzLmRhdGFGaWVsZC5zdHJpbmdJZH1dICR7ZmlsZU5hbWV9IHdhcyBzdWNjZXNzZnVsbHkgZG93bmxvYWRlZGApO1xuICAgICAgICAgICAgICAgIHRoaXMuZG93bmxvYWRWaWFBbmNob3IocmVzcG9uc2UgYXMgQmxvYiwgZmlsZU5hbWUpO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUuZG93bmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlLnByb2dyZXNzID0gMDtcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGFGaWVsZC5kb3dubG9hZGVkLnB1c2goZmlsZU5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCBlcnJvciA9PiB7XG4gICAgICAgICAgICB0aGlzLl9sb2cuZXJyb3IoYERvd25sb2FkaW5nIGZpbGUgWyR7dGhpcy5kYXRhRmllbGQuc3RyaW5nSWR9XSAke2ZpbGVOYW1lfSBoYXMgZmFpbGVkIWAsIGVycm9yKTtcbiAgICAgICAgICAgIHRoaXMuX3NuYWNrYmFyLm9wZW5FcnJvclNuYWNrQmFyKGZpbGVOYW1lICsgJyAnICsgdGhpcy5fdHJhbnNsYXRlLmluc3RhbnQoJ2RhdGFGaWVsZC5zbmFja0Jhci5kb3dubG9hZEZhaWwnKSk7XG4gICAgICAgICAgICB0aGlzLnN0YXRlLmRvd25sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnN0YXRlLnByb2dyZXNzID0gMDtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGRvd25sb2FkVmlhQW5jaG9yKGJsb2I6IEJsb2IsIGZpbGVOYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKTtcbiAgICAgICAgYS5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJ2Rpc3BsYXk6IG5vbmUnKTtcbiAgICAgICAgYmxvYiA9IG5ldyBCbG9iKFtibG9iXSwge3R5cGU6ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nfSk7XG4gICAgICAgIGNvbnN0IHVybCA9IHdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuICAgICAgICBhLmhyZWYgPSB1cmw7XG4gICAgICAgIGEuZG93bmxvYWQgPSBmaWxlTmFtZTtcbiAgICAgICAgYS5jbGljaygpO1xuICAgICAgICB3aW5kb3cuVVJMLnJldm9rZU9iamVjdFVSTCh1cmwpO1xuICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGEpO1xuICAgIH1cblxuICAgIHB1YmxpYyBkZWxldGVGaWxlKGZpbGVOYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKCF0aGlzLmRhdGFGaWVsZC52YWx1ZT8ubmFtZXNQYXRocz8uZmluZChuYW1lUGF0aCA9PiBuYW1lUGF0aC5uYW1lID09PSBmaWxlTmFtZSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMudGFza0lkKSB7XG4gICAgICAgICAgICB0aGlzLl9sb2cuZXJyb3IoJ0ZpbGUgY2Fubm90IGJlIGRlbGV0ZWQuIE5vIHRhc2sgaXMgc2V0IHRvIHRoZSBmaWVsZC4nKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXF1ZXN0Qm9keTogRmlsZUZpZWxkUmVxdWVzdCA9IHtcbiAgICAgICAgICAgIHBhcmVudFRhc2tJZDogdGhpcy5yZXNvbHZlUGFyZW50VGFza0lkKCksXG4gICAgICAgICAgICBmaWVsZElkOiB0aGlzLmRhdGFGaWVsZC5zdHJpbmdJZCxcbiAgICAgICAgICAgIGZpbGVOYW1lXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdGFza1Jlc291cmNlU2VydmljZS5kZWxldGVGaWxlKHRoaXMudGFza0lkLCByZXF1ZXN0Qm9keSkucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoKHJlc3BvbnNlOiBFdmVudE91dGNvbWVNZXNzYWdlUmVzb3VyY2UpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5zdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2hhbmdlZEZpZWxkc01hcDogQ2hhbmdlZEZpZWxkc01hcCA9IHRoaXMuX2V2ZW50U2VydmljZS5wYXJzZUNoYW5nZWRGaWVsZHNGcm9tT3V0Y29tZVRyZWUocmVzcG9uc2Uub3V0Y29tZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhRmllbGQuZW1pdENoYW5nZWRGaWVsZHMoY2hhbmdlZEZpZWxkc01hcCk7XG4gICAgICAgICAgICAgICAgdGhpcy5maWxlVXBsb2FkRWwubmF0aXZlRWxlbWVudC52YWx1ZSA9ICcnO1xuICAgICAgICAgICAgICAgIHRoaXMudXBsb2FkZWRGaWxlcyA9IHRoaXMudXBsb2FkZWRGaWxlcy5maWx0ZXIodXBsb2FkZWRGaWxlID0+IHVwbG9hZGVkRmlsZSAhPT0gZmlsZU5hbWUpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmRhdGFGaWVsZC52YWx1ZS5uYW1lc1BhdGhzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YUZpZWxkLnZhbHVlLm5hbWVzUGF0aHMgPSB0aGlzLmRhdGFGaWVsZC52YWx1ZS5uYW1lc1BhdGhzLmZpbHRlcihuYW1lUGF0aCA9PiBuYW1lUGF0aC5uYW1lICE9PSBmaWxlTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybUNvbnRyb2xSZWYuc2V0VmFsdWUodGhpcy5kYXRhRmllbGQudmFsdWUubmFtZXNQYXRocy5tYXAobmFtZVBhdGggPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5hbWVQYXRoWyduYW1lJ107XG4gICAgICAgICAgICAgICAgICAgIH0pLmpvaW4oJy8nKSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YUZpZWxkLnVwZGF0ZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmRhdGFGaWVsZC5kb3dubG9hZGVkID0gdGhpcy5kYXRhRmllbGQuZG93bmxvYWRlZC5maWx0ZXIob25lID0+IG9uZSAhPT0gZmlsZU5hbWUpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2xvZy5kZWJ1ZyhgRmlsZSBbJHt0aGlzLmRhdGFGaWVsZC5zdHJpbmdJZH1dICR7ZmlsZU5hbWV9IHdhcyBzdWNjZXNzZnVsbHkgZGVsZXRlZGApO1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybUNvbnRyb2xSZWYubWFya0FzVG91Y2hlZCgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9sb2cuZXJyb3IoYERlbGV0aW5nIGZpbGUgWyR7dGhpcy5kYXRhRmllbGQuc3RyaW5nSWR9XSAke2ZpbGVOYW1lfSBoYXMgZmFpbGVkIWAsIHJlc3BvbnNlLmVycm9yKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9zbmFja2Jhci5vcGVuRXJyb3JTbmFja0JhcihcbiAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWUgKyAnICcgKyB0aGlzLl90cmFuc2xhdGUuaW5zdGFudCgnZGF0YUZpZWxkLnNuYWNrQmFyLmZpbGVEZWxldGVGYWlsZWQnKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXQgZGVmYXVsdFN0YXRlKCk6IEZpbGVzU3RhdGUge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcHJvZ3Jlc3M6IDAsXG4gICAgICAgICAgICBjb21wbGV0ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgZXJyb3I6IGZhbHNlLFxuICAgICAgICAgICAgdXBsb2FkaW5nOiBmYWxzZSxcbiAgICAgICAgICAgIGRvd25sb2FkaW5nOiBmYWxzZVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdCBkaXNwbGF5IG5hbWUuXG4gICAgICovXG4gICAgcHVibGljIGNvbnN0cnVjdERpc3BsYXlOYW1lKCk6IHN0cmluZyB7XG4gICAgICAgIGlmICghIXRoaXMuZGF0YUZpZWxkICYmICEhdGhpcy5kYXRhRmllbGQucGxhY2Vob2xkZXIpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGFGaWVsZC5wbGFjZWhvbGRlcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fdHJhbnNsYXRlLmluc3RhbnQoJ2RhdGFGaWVsZC5maWxlLm5vRmlsZScpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwYXJzZVJlc3BvbnNlKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5kYXRhRmllbGQudmFsdWUpIHtcbiAgICAgICAgICAgIGlmICghIXRoaXMuZGF0YUZpZWxkLnZhbHVlLm5hbWVzUGF0aHMgJiYgdGhpcy5kYXRhRmllbGQudmFsdWUubmFtZXNQYXRocy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVwbG9hZGVkRmlsZXMgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xuICAgICAgICAgICAgICAgIHRoaXMuZGF0YUZpZWxkLnZhbHVlLm5hbWVzUGF0aHMuZm9yRWFjaChuYW1lUGF0aCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBsb2FkZWRGaWxlcy5wdXNoKG5hbWVQYXRoLm5hbWUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGFGaWVsZC52YWx1ZS5uYW1lc1BhdGhzID0gbmV3IEFycmF5PEZpbGVGaWVsZFZhbHVlPigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy51cGxvYWRlZEZpbGVzID0gdGhpcy5kYXRhRmllbGQudmFsdWUubmFtZXNQYXRocy5tYXAobmFtZVBhdGggPT4gbmFtZVBhdGgubmFtZSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=