@harbor/ui
Version:
Harbor shared UI components based on Clarity and Angular6
221 lines (220 loc) • 21.9 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import { Component, Output, EventEmitter, Input, ViewChild, ChangeDetectionStrategy, ChangeDetectorRef } from "@angular/core";
import { toPromise, clone, compareValue } from "../utils";
import { LabelService } from "../service/label.service";
import { ErrorHandler } from "../error-handler/error-handler";
import { NgForm } from "@angular/forms";
import { Subject } from "rxjs";
import { debounceTime } from "rxjs/operators";
import { LabelColor } from "../shared/shared.const";
export class CreateEditLabelComponent {
/**
* @param {?} labelService
* @param {?} errorHandler
* @param {?} ref
*/
constructor(labelService, errorHandler, ref) {
this.labelService = labelService;
this.errorHandler = errorHandler;
this.ref = ref;
this.labelModel = this.initLabel();
this.labelId = 0;
this.isLabelNameExist = false;
this.nameChecker = new Subject();
this.reload = new EventEmitter();
}
/**
* @return {?}
*/
ngOnInit() {
this.nameChecker.pipe(debounceTime(500)).subscribe((name) => {
toPromise(this.labelService.getLabels(this.scope, this.projectId, name))
.then(targets => {
this.isLabelNameExist = false;
if (targets && targets.length) {
if (targets.find((target) => {
return target.name === name;
})) {
this.isLabelNameExist = true;
}
}
})
.catch(error => {
this.errorHandler.error(error);
});
/** @type {?} */
let hnd = setInterval(() => this.ref.markForCheck(), 100);
setTimeout(() => clearInterval(hnd), 5000);
});
}
/**
* @return {?}
*/
ngOnDestroy() {
this.nameChecker.unsubscribe();
}
/**
* @return {?}
*/
get labelColor() {
return LabelColor;
}
/**
* @return {?}
*/
initLabel() {
return {
name: "",
description: "",
color: "",
scope: "",
project_id: 0
};
}
/**
* @return {?}
*/
openModal() {
this.labelModel = this.initLabel();
this.formShow = true;
this.isLabelNameExist = false;
this.labelId = 0;
this.copeLabelModel = null;
}
/**
* @param {?} labelId
* @param {?} label
* @return {?}
*/
editModel(labelId, label) {
this.labelModel = clone(label[0]);
this.formShow = true;
this.labelId = labelId;
this.copeLabelModel = clone(label[0]);
}
/**
* @return {?}
*/
get hasChanged() {
return !compareValue(this.copeLabelModel, this.labelModel);
}
/**
* @return {?}
*/
get isValid() {
return !(this.isLabelNameExist ||
!(this.currentForm && this.currentForm.valid) ||
!this.hasChanged ||
this.inProgress);
}
/**
* @param {?} text
* @return {?}
*/
existValid(text) {
if (text) {
this.nameChecker.next(text);
}
else {
this.isLabelNameExist = false;
}
}
/**
* @return {?}
*/
onSubmit() {
this.inProgress = true;
if (this.labelId <= 0) {
this.labelModel.scope = this.scope;
this.labelModel.project_id = this.projectId;
toPromise(this.labelService.createLabel(this.labelModel))
.then(res => {
this.inProgress = false;
this.reload.emit();
this.labelModel = this.initLabel();
this.formShow = false;
})
.catch(err => {
this.inProgress = false;
this.errorHandler.error(err);
});
}
else {
toPromise(this.labelService.updateLabel(this.labelId, this.labelModel))
.then(res => {
this.inProgress = false;
this.reload.emit();
this.labelModel = this.initLabel();
this.formShow = false;
})
.catch(err => {
this.inProgress = false;
this.errorHandler.error(err);
});
}
}
/**
* @return {?}
*/
onCancel() {
this.inProgress = false;
this.labelModel = this.initLabel();
this.formShow = false;
}
}
CreateEditLabelComponent.decorators = [
{ type: Component, args: [{
selector: "hbr-create-edit-label",
template: "<div>\n <form #labelForm=\"ngForm\" [hidden]=\"!formShow\">\n <section>\n <label>\n <label for=\"name\">{{'LABEL.LABEL_NAME' | translate}}</label>\n <label aria-haspopup=\"true\" role=\"tooltip\" [class.invalid]=\"isLabelNameExist\"\n class=\"tooltip tooltip-validation tooltip-md tooltip-bottom-left\">\n <input type=\"text\" id=\"name\" name=\"name\" required size=\"20\" autocomplete=\"off\"\n [(ngModel)]=\"labelModel.name\" #name=\"ngModel\" (keyup)=\"existValid(labelModel.name)\">\n <span class=\"tooltip-content\">\n {{'LABEL.NAME_ALREADY_EXISTS' | translate }}\n </span>\n </label>\n </label>\n <label>\n <label for=\"color\">{{'LABEL.COLOR' | translate}}</label>\n <clr-dropdown [clrCloseMenuOnItemClick]=\"false\" clrDropdownTrigger>\n <clr-icon shape=\"caret down\" class=\"btn btn-outline btnColor btn-sm\"></clr-icon>\n <clr-dropdown-menu *clrIfOpen>\n <label class=\"dropdown-item\" (click)=\"labelModel.color=i.color\" *ngFor=\"let i of labelColor\"\n [class.borderSty]=\"i.color == '#FFFFFF'\" [ngStyle]=\"{'background-color': i.color, 'color': i.textColor }\">Aa</label>\n </clr-dropdown-menu>\n </clr-dropdown>\n <input type=\"text\" id=\"color\" size=\"8\" name=\"color\" disabled [(ngModel)]=\"labelModel.color\" #color=\"ngModel\">\n </label>\n <label>\n <label for=\"description\">{{'LABEL.DESCRIPTION' | translate}}</label>\n <input type=\"text\" id=\"description\" name=\"description\" size=\"30\" [(ngModel)]=\"labelModel.description\"\n #description=\"ngModel\">\n </label>\n <label>\n <button type=\"button\" class=\"btn btn-sm btn-outline\" (click)=\"onCancel()\" [disabled]=\"inProgress\">{{\n 'BUTTON.CANCEL' | translate }}\n </button>\n <button type=\"submit\" class=\"btn btn-sm btn-primary\" (click)=\"onSubmit()\" [disabled]=\"!isValid\">{{\n 'BUTTON.OK' | translate }}\n </button>\n </label>\n </section>\n </form>\n</div>",
changeDetection: ChangeDetectionStrategy.Default,
styles: ["form{margin-bottom:-10px;padding-top:0;margin-top:20px;width:100%;background-color:#eee;border:1px solid #ccc}form section{padding:.5rem 0}form section>label{margin-left:20px}form .btnColor{margin:0!important;padding:0!important;width:26px;height:22px;min-width:26px}form .colorPanel span{margin:5px 4px;width:30px;height:24px;text-align:center;line-height:24px;font-size:12px;border:1px solid #a1a1a1}form .dropdown-menu{display:inline-block;width:166px;padding:6px}form .dropdown-menu .dropdown-item{display:inline-block;margin:2px 4px;padding:0;width:30px;height:24px;text-align:center;line-height:24px;border:0;color:#fff;font-size:12px}form .dropdown .dropdown-toggle.btn{padding:0!important}form .borderSty{border:1px solid #a1a1a1!important;line-height:22px}"]
}] }
];
/** @nocollapse */
CreateEditLabelComponent.ctorParameters = () => [
{ type: LabelService },
{ type: ErrorHandler },
{ type: ChangeDetectorRef }
];
CreateEditLabelComponent.propDecorators = {
currentForm: [{ type: ViewChild, args: ["labelForm",] }],
projectId: [{ type: Input }],
scope: [{ type: Input }],
reload: [{ type: Output }]
};
if (false) {
/** @type {?} */
CreateEditLabelComponent.prototype.formShow;
/** @type {?} */
CreateEditLabelComponent.prototype.inProgress;
/** @type {?} */
CreateEditLabelComponent.prototype.copeLabelModel;
/** @type {?} */
CreateEditLabelComponent.prototype.labelModel;
/** @type {?} */
CreateEditLabelComponent.prototype.labelId;
/** @type {?} */
CreateEditLabelComponent.prototype.isLabelNameExist;
/** @type {?} */
CreateEditLabelComponent.prototype.nameChecker;
/** @type {?} */
CreateEditLabelComponent.prototype.labelForm;
/** @type {?} */
CreateEditLabelComponent.prototype.currentForm;
/** @type {?} */
CreateEditLabelComponent.prototype.projectId;
/** @type {?} */
CreateEditLabelComponent.prototype.scope;
/** @type {?} */
CreateEditLabelComponent.prototype.reload;
/** @type {?} */
CreateEditLabelComponent.prototype.labelService;
/** @type {?} */
CreateEditLabelComponent.prototype.errorHandler;
/** @type {?} */
CreateEditLabelComponent.prototype.ref;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLWVkaXQtbGFiZWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGhhcmJvci91aS8iLCJzb3VyY2VzIjpbInNyYy9jcmVhdGUtZWRpdC1sYWJlbC9jcmVhdGUtZWRpdC1sYWJlbC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQWFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsTUFBTSxFQUNOLFlBQVksRUFFWixLQUFLLEVBRUwsU0FBUyxFQUNULHVCQUF1QixFQUN2QixpQkFBaUIsRUFDbEIsTUFBTSxlQUFlLENBQUM7QUFJdkIsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRTFELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDOUQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3hDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQVFwRCxNQUFNOzs7Ozs7SUFrQkosWUFDVSxjQUNBLGNBQ0E7UUFGQSxpQkFBWSxHQUFaLFlBQVk7UUFDWixpQkFBWSxHQUFaLFlBQVk7UUFDWixRQUFHLEdBQUgsR0FBRzswQkFqQk8sSUFBSSxDQUFDLFNBQVMsRUFBRTt1QkFDMUIsQ0FBQztnQ0FFUSxLQUFLOzJCQUVWLElBQUksT0FBTyxFQUFVO3NCQU9oQixJQUFJLFlBQVksRUFBRTtLQU1qQzs7OztJQUVKLFFBQVE7UUFDTixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFZLEVB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RyxLQUFLLENBQUM7YUFDdkIsQ0FBQztpQkFDRCxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQ1gsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7Z0JBQ3hCLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQzlCLENBQUMsQ0FBQztTQUNOO0tBQ0Y7Ozs7SUFFRCxRQUFRO1FBQ04sSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7UUFDeEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDbkMsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7S0FDdkI7OztZQS9JRixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLHVCQUF1QjtnQkFDakMsbzZFQUFpRDtnQkFFakQsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE9BQU87O2FBQ2pEOzs7O1lBWlEsWUFBWTtZQUNaLFlBQVk7WUFSbkIsaUJBQWlCOzs7MEJBZ0NoQixTQUFTLFNBQUMsV0FBVzt3QkFFckIsS0FBSztvQkFDTCxLQUFLO3FCQUNMLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgKGMpIDIwMTcgVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4vL1xuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbi8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbi8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuLy9cbi8vICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuLy9cbi8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbi8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbi8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5pbXBvcnQge1xuICBDb21wb25lbnQsXG4gIE91dHB1dCxcbiAgRXZlbnRFbWl0dGVyLFxuICBPbkRlc3Ryb3ksXG4gIElucHV0LFxuICBPbkluaXQsXG4gIFZpZXdDaGlsZCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5cbmltcG9ydCB7IExhYmVsIH0gZnJvbSBcIi4uL3NlcnZpY2UvaW50ZXJmYWNlXCI7XG5cbmltcG9ydCB7IHRvUHJvbWlzZSwgY2xvbmUsIGNvbXBhcmVWYWx1ZSB9IGZyb20gXCIuLi91dGlsc1wiO1xuXG5pbXBvcnQgeyBMYWJlbFNlcnZpY2UgfSBmcm9tIFwiLi4vc2VydmljZS9sYWJlbC5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBFcnJvckhhbmRsZXIgfSBmcm9tIFwiLi4vZXJyb3ItaGFuZGxlci9lcnJvci1oYW5kbGVyXCI7XG5pbXBvcnQgeyBOZ0Zvcm0gfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lIH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XG5pbXBvcnQgeyBMYWJlbENvbG9yIH0gZnJvbSBcIi4uL3NoYXJlZC9zaGFyZWQuY29uc3RcIjtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcImhici1jcmVhdGUtZWRpdC1sYWJlbFwiLFxuICB0ZW1wbGF0ZVVybDogXCIuL2NyZWF0ZS1lZGl0LWxhYmVsLmNvbXBvbmVudC5odG1sXCIsXG4gIHN0eWxlVXJsczogW1wiLi9jcmVhdGUtZWRpdC1sYWJlbC5jb21wb25lbnQuc2Nzc1wiXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5EZWZhdWx0XG59KVxuZXhwb3J0IGNsYXNzIENyZWF0ZUVkaXRMYWJlbENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgZm9ybVNob3c6IGJvb2xlYW47XG4gIGluUHJvZ3Jlc3M6IGJvb2xlYW47XG4gIGNvcGVMYWJlbE1vZGVsOiBMYWJlbDtcbiAgbGFiZWxNb2RlbDogTGFiZWwgPSB0aGlzLmluaXRMYWJlbCgpO1xuICBsYWJlbElkID0gMDtcblxuICBpc0xhYmVsTmFtZUV4aXN0ID0gZmFsc2U7XG5cbiAgbmFtZUNoZWNrZXIgPSBuZXcgU3ViamVjdDxzdHJpbmc+KCk7XG5cbiAgbGFiZWxGb3JtOiBOZ0Zvcm07XG4gIEBWaWV3Q2hpbGQoXCJsYWJlbEZvcm1cIikgY3VycmVudEZvcm06IE5nRm9ybTtcblxuICBASW5wdXQoKSBwcm9qZWN0SWQ6IG51bWJlcjtcbiAgQElucHV0KCkgc2NvcGU6IHN0cmluZztcbiAgQE91dHB1dCgpIHJlbG9hZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGxhYmVsU2VydmljZTogTGFiZWxTZXJ2aWNlLFxuICAgIHByaXZhdGUgZXJyb3JIYW5kbGVyOiBFcnJvckhhbmRsZXIsXG4gICAgcHJpdmF0ZSByZWY6IENoYW5nZURldGVjdG9yUmVmXG4gICkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLm5hbWVDaGVja2VyLnBpcGUoZGVib3VuY2VUaW1lKDUwMCkpLnN1YnNjcmliZSgobmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICB0b1Byb21pc2U8TGFiZWxbXT4oXG4gICAgICAgIHRoaXMubGFiZWxTZXJ2aWNlLmdldExhYmVscyh0aGlzLnNjb3BlLCB0aGlzLnByb2plY3RJZCwgbmFtZSlcbiAgICAgIClcbiAgICAgICAgLnRoZW4odGFyZ2V0cyA9PiB7XG4gICAgICAgICAgdGhpcy5pc0xhYmVsTmFtZUV4aXN0ID0gZmFsc2U7XG4gICAgICAgICAgaWYgKHRhcmdldHMgJiYgdGFyZ2V0cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmICh0YXJnZXRzLmZpbmQoKHRhcmdldCkgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0Lm5hbWUgPT09IG5hbWU7XG4gICAgICAgICAgICB9KSkge1xuICAgICAgICAgICAgICB0aGlzLmlzTGFiZWxOYW1lRXhpc3QgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICB0aGlzLmVycm9ySGFuZGxlci5lcnJvcihlcnJvcik7XG4gICAgICAgIH0pO1xuICAgICAgbGV0IGhuZCA9IHNldEludGVydmFsKCgpID0+IHRoaXMucmVmLm1hcmtGb3JDaGVjaygpLCAxMDApO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiBjbGVhckludGVydmFsKGhuZCksIDUwMDApO1xuICAgIH0pO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5uYW1lQ2hlY2tlci51bnN1YnNjcmliZSgpO1xuICB9XG5cbiAgZ2V0IGxhYmVsQ29sb3IoKSB7XG4gICAgcmV0dXJuIExhYmVsQ29sb3I7XG4gIH1cblxuICBpbml0TGFiZWwoKTogTGFiZWwge1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiBcIlwiLFxuICAgICAgZGVzY3JpcHRpb246IFwiXCIsXG4gICAgICBjb2xvcjogXCJcIixcbiAgICAgIHNjb3BlOiBcIlwiLFxuICAgICAgcHJvamVjdF9pZDogMFxuICAgIH07XG4gIH1cbiAgb3Blbk1vZGFsKCk6IHZvaWQge1xuICAgIHRoaXMubGFiZWxNb2RlbCA9IHRoaXMuaW5pdExhYmVsKCk7XG4gICAgdGhpcy5mb3JtU2hvdyA9IHRydWU7XG4gICAgdGhpcy5pc0xhYmVsTmFtZUV4aXN0ID0gZmFsc2U7XG4gICAgdGhpcy5sYWJlbElkID0gMDtcbiAgICB0aGlzLmNvcGVMYWJlbE1vZGVsID0gbnVsbDtcbiAgfVxuXG4gIGVkaXRNb2RlbChsYWJlbElkOiBudW1iZXIsIGxhYmVsOiBMYWJlbFtdKTogdm9pZCB7XG4gICAgdGhpcy5sYWJlbE1vZGVsID0gY2xvbmUobGFiZWxbMF0pO1xuICAgIHRoaXMuZm9ybVNob3cgPSB0cnVlO1xuICAgIHRoaXMubGFiZWxJZCA9IGxhYmVsSWQ7XG4gICAgdGhpcy5jb3BlTGFiZWxNb2RlbCA9IGNsb25lKGxhYmVsWzBdKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaGFzQ2hhbmdlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIWNvbXBhcmVWYWx1ZSh0aGlzLmNvcGVMYWJlbE1vZGVsLCB0aGlzLmxhYmVsTW9kZWwpO1xuICB9XG5cbiAgcHVibGljIGdldCBpc1ZhbGlkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhKFxuICAgICAgdGhpcy5pc0xhYmVsTmFtZUV4aXN0IHx8XG4gICAgICAhKHRoaXMuY3VycmVudEZvcm0gJiYgdGhpcy5jdXJyZW50Rm9ybS52YWxpZCkgfHxcbiAgICAgICF0aGlzLmhhc0NoYW5nZWQgfHxcbiAgICAgIHRoaXMuaW5Qcm9ncmVzc1xuICAgICk7XG4gIH1cblxuICBleGlzdFZhbGlkKHRleHQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0ZXh0KSB7XG4gICAgICB0aGlzLm5hbWVDaGVja2VyLm5leHQodGV4dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaXNMYWJlbE5hbWVFeGlzdCA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIG9uU3VibWl0KCk6IHZvaWQge1xuICAgIHRoaXMuaW5Qcm9ncmVzcyA9IHRydWU7XG4gICAgaWYgKHRoaXMubGFiZWxJZCA8PSAwKSB7XG4gICAgICB0aGlzLmxhYmVsTW9kZWwuc2NvcGUgPSB0aGlzLnNjb3BlO1xuICAgICAgdGhpcy5sYWJlbE1vZGVsLnByb2plY3RfaWQgPSB0aGlzLnByb2plY3RJZDtcbiAgICAgIHRvUHJvbWlzZTxMYWJlbD4odGhpcy5sYWJlbFNlcnZpY2UuY3JlYXRlTGFiZWwodGhpcy5sYWJlbE1vZGVsKSlcbiAgICAgICAgLnRoZW4ocmVzID0+IHtcbiAgICAgICAgICB0aGlzLmluUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLnJlbG9hZC5lbWl0KCk7XG4gICAgICAgICAgdGhpcy5sYWJlbE1vZGVsID0gdGhpcy5pbml0TGFiZWwoKTtcbiAgICAgICAgICB0aGlzLmZvcm1TaG93ID0gZmFsc2U7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgIHRoaXMuaW5Qcm9ncmVzcyA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMuZXJyb3JIYW5kbGVyLmVycm9yKGVycik7XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0b1Byb21pc2U8TGFiZWw+KFxuICAgICAgICB0aGlzLmxhYmVsU2VydmljZS51cGRhdGVMYWJlbCh0aGlzLmxhYmVsSWQsIHRoaXMubGFiZWxNb2RlbClcbiAgICAgIClcbiAgICAgICAgLnRoZW4ocmVzID0+IHtcbiAgICAgICAgICB0aGlzLmluUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLnJlbG9hZC5lbWl0KCk7XG4gICAgICAgICAgdGhpcy5sYWJlbE1vZGVsID0gdGhpcy5pbml0TGFiZWwoKTtcbiAgICAgICAgICB0aGlzLmZvcm1TaG93ID0gZmFsc2U7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgIHRoaXMuaW5Qcm9ncmVzcyA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMuZXJyb3JIYW5kbGVyLmVycm9yKGVycik7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIG9uQ2FuY2VsKCk6IHZvaWQge1xuICAgIHRoaXMuaW5Qcm9ncmVzcyA9IGZhbHNlO1xuICAgIHRoaXMubGFiZWxNb2RlbCA9IHRoaXMuaW5pdExhYmVsKCk7XG4gICAgdGhpcy5mb3JtU2hvdyA9IGZhbHNlO1xuICB9XG59XG4iXX0=