UNPKG

@harbor/ui

Version:

Harbor shared UI components based on Clarity and Angular6

234 lines (233 loc) 25.2 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ import { Component, ViewChild, ChangeDetectionStrategy, ChangeDetectorRef, Input } from "@angular/core"; import { LabelService } from "../service/label.service"; import { toPromise } from "../utils"; import { ErrorHandler } from "../error-handler/error-handler"; import { CreateEditLabelComponent } from "../create-edit-label/create-edit-label.component"; import { ConfirmationMessage } from "../confirmation-dialog/confirmation-message"; import { TranslateService } from "@ngx-translate/core"; import { ConfirmationDialogComponent } from "../confirmation-dialog/confirmation-dialog.component"; import { operateChanges, OperateInfo, OperationState } from "../operation/operate"; import { OperationService } from "../operation/operation.service"; export class LabelComponent { /** * @param {?} labelService * @param {?} errorHandler * @param {?} translateService * @param {?} operationService * @param {?} ref */ constructor(labelService, errorHandler, translateService, operationService, ref) { this.labelService = labelService; this.errorHandler = errorHandler; this.translateService = translateService; this.operationService = operationService; this.ref = ref; this.selectedRow = []; this.projectId = 0; } /** * @return {?} */ ngOnInit() { this.retrieve(this.scope); } /** * @param {?} scope * @param {?=} name * @return {?} */ retrieve(scope, name = "") { this.loading = true; this.selectedRow = []; this.targetName = ""; toPromise(this.labelService.getLabels(scope, this.projectId, name)) .then(targets => { this.targets = targets || []; this.loading = false; this.forceRefreshView(2000); }) .catch(error => { this.errorHandler.error(error); this.loading = false; }); } /** * @return {?} */ openModal() { this.createEditLabel.openModal(); } /** * @return {?} */ reload() { this.retrieve(this.scope); } /** * @param {?} targetName * @return {?} */ doSearchTargets(targetName) { this.retrieve(this.scope, targetName); } /** * @return {?} */ refreshTargets() { this.retrieve(this.scope); } /** * @return {?} */ selectedChange() { // this.forceRefreshView(5000); } /** * @param {?} label * @return {?} */ editLabel(label) { this.createEditLabel.editModel(label[0]["id"], label); } /** * @param {?} targets * @return {?} */ deleteLabels(targets) { if (targets && targets.length) { /** @type {?} */ let targetNames = []; targets.forEach(target => { targetNames.push(target.name); }); /** @type {?} */ let deletionMessage = new ConfirmationMessage('LABEL.DELETION_TITLE_TARGET', 'LABEL.DELETION_SUMMARY_TARGET', targetNames.join(', ') || '', targets, 6 /* TARGET */, 2 /* DELETE_CANCEL */); this.confirmationDialogComponent.open(deletionMessage); } } /** * @param {?} message * @return {?} */ confirmDeletion(message) { if (message && message.source === 6 /* TARGET */ && message.state === 1 /* CONFIRMED */) { /** @type {?} */ let targetLists = message.data; if (targetLists && targetLists.length) { /** @type {?} */ let promiseLists = []; targetLists.forEach(target => { promiseLists.push(this.delOperate(target)); }); Promise.all(promiseLists).then((item) => { this.selectedRow = []; this.retrieve(this.scope); }); } } } /** * @param {?} target * @return {?} */ delOperate(target) { /** @type {?} */ let operMessage = new OperateInfo(); operMessage.name = 'OPERATION.DELETE_LABEL'; operMessage.data["id"] = target["id"]; operMessage.state = OperationState.progressing; operMessage.data["name"] = target.name; this.operationService.publishInfo(operMessage); return toPromise(this.labelService .deleteLabel(target["id"])) .then(response => { this.translateService.get('BATCH.DELETED_SUCCESS') .subscribe(res => { operateChanges(operMessage, OperationState.success); }); }).catch(error => { this.translateService.get('BATCH.DELETED_FAILURE').subscribe(res => { operateChanges(operMessage, OperationState.failure, res); }); }); } /** * @param {?} duration * @return {?} */ forceRefreshView(duration) { // Reset timer if (this.timerHandler) { clearInterval(this.timerHandler); } this.timerHandler = setInterval(() => this.ref.markForCheck(), 100); setTimeout(() => { if (this.timerHandler) { clearInterval(this.timerHandler); this.timerHandler = null; } }, duration); } } LabelComponent.decorators = [ { type: Component, args: [{ selector: "hbr-label", template: "<div>\n <div class=\"row\" style=\"position:relative;\">\n <div>\n <div class=\"row flex-items-xs-between rightPos\">\n <div class=\"flex-items-xs-middle option-right\">\n <hbr-filter [withDivider]=\"true\" filterPlaceholder='{{\"LABEL.FILTER_LABEL_PLACEHOLDER\" | translate}}' (filterEvt)=\"doSearchTargets($event)\" [currentValue]=\"targetName\"></hbr-filter>\n <span class=\"refresh-btn\" (click)=\"refreshTargets()\">\n <clr-icon shape=\"refresh\"></clr-icon>\n </span>\n </div>\n </div>\n </div>\n <div class=\"col-lg-12 col-md-12 col-sm-12 col-xs-12 btnGroup\">\n <button type=\"button\" class=\"btn btn-sm btn-secondary\" (click)=\"openModal()\"><clr-icon shape=\"plus\" size=\"16\"></clr-icon>&nbsp;{{'LABEL.NEW_LABEL' | translate}}</button>\n <button type=\"button\" class=\"btn btn-sm btn-secondary\" [disabled]=\"!(selectedRow.length == 1)\" (click)=\"editLabel(selectedRow)\"><clr-icon shape=\"pencil\" size=\"16\"></clr-icon>&nbsp;{{'LABEL.EDIT' | translate}}</button>\n <button type=\"button\" class=\"btn btn-sm btn-secondary\" [disabled]=\"!selectedRow.length\" (click)=\"deleteLabels(selectedRow)\"><clr-icon shape=\"times\" size=\"16\"></clr-icon>&nbsp;{{'LABEL.DELETE' | translate}}</button> \n <hbr-create-edit-label [scope]=\"scope\" [projectId]=\"projectId\" (reload)=\"reload()\"></hbr-create-edit-label>\n </div>\n <div class=\"col-lg-12 col-md-12 col-sm-12 col-xs-12 content-mt\">\n <clr-datagrid [clrDgLoading]=\"loading\" [(clrDgSelected)]=\"selectedRow\" (clrDgSelectedChange)=\"selectedChange()\">\n <clr-dg-column [clrDgField]=\"'name'\">{{'LABEL.LABEL' | translate}}</clr-dg-column>\n <clr-dg-column [clrDgField]=\"'endpoint'\">{{'LABEL.DESCRIPTION' | translate}}</clr-dg-column>\n <clr-dg-column [clrDgField]=\"'insecure'\">{{'LABEL.CREATION_TIME' | translate }}</clr-dg-column>\n <clr-dg-placeholder>{{'LABEL.PLACEHOLDER' | translate }}</clr-dg-placeholder>\n <clr-dg-row *clrDgItems=\"let label of targets\" [clrDgItem]='label'>\n <clr-dg-cell>\n <hbr-label-piece [label]=\"label\"></hbr-label-piece>\n </clr-dg-cell>\n <clr-dg-cell>{{label.description}}</clr-dg-cell>\n <clr-dg-cell>{{label.creation_time | date: 'short'}}</clr-dg-cell>\n </clr-dg-row>\n <clr-dg-footer>\n <span *ngIf=\"pagination.totalItems\">{{pagination.firstItem + 1}} - {{pagination.lastItem + 1}} {{'DESTINATION.OF' | translate}}</span>\n {{pagination.totalItems}} {{'DESTINATION.ITEMS' | translate}}\n <clr-dg-pagination #pagination [clrDgPageSize]=\"15\"></clr-dg-pagination>\n </clr-dg-footer>\n </clr-datagrid>\n </div>\n </div>\n <confirmation-dialog #confirmationDialog (confirmAction)=\"confirmDeletion($event)\"></confirmation-dialog>\n</div>\n\n", changeDetection: ChangeDetectionStrategy.OnPush, styles: [".option-left{padding-left:16px;margin-top:-6px}.option-right{padding-right:16px}.refresh-btn{cursor:pointer}.refresh-btn:hover{color:#007cbb}.rightPos{position:absolute;z-index:100;right:35px;margin-top:4px;height:24px}.content-mt{margin-top:-12px}"] }] } ]; /** @nocollapse */ LabelComponent.ctorParameters = () => [ { type: LabelService }, { type: ErrorHandler }, { type: TranslateService }, { type: OperationService }, { type: ChangeDetectorRef } ]; LabelComponent.propDecorators = { scope: [{ type: Input }], projectId: [{ type: Input }], hasProjectAdminRole: [{ type: Input }], createEditLabel: [{ type: ViewChild, args: [CreateEditLabelComponent,] }], confirmationDialogComponent: [{ type: ViewChild, args: ["confirmationDialog",] }] }; if (false) { /** @type {?} */ LabelComponent.prototype.timerHandler; /** @type {?} */ LabelComponent.prototype.loading; /** @type {?} */ LabelComponent.prototype.targets; /** @type {?} */ LabelComponent.prototype.targetName; /** @type {?} */ LabelComponent.prototype.selectedRow; /** @type {?} */ LabelComponent.prototype.scope; /** @type {?} */ LabelComponent.prototype.projectId; /** @type {?} */ LabelComponent.prototype.hasProjectAdminRole; /** @type {?} */ LabelComponent.prototype.createEditLabel; /** @type {?} */ LabelComponent.prototype.confirmationDialogComponent; /** @type {?} */ LabelComponent.prototype.labelService; /** @type {?} */ LabelComponent.prototype.errorHandler; /** @type {?} */ LabelComponent.prototype.translateService; /** @type {?} */ LabelComponent.prototype.operationService; /** @type {?} */ LabelComponent.prototype.ref; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFiZWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGhhcmJvci91aS8iLCJzb3VyY2VzIjpbInNyYy9sYWJlbC9sYWJlbC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQWFBLE9BQU8sRUFDSCxTQUFTLEVBRVQsU0FBUyxFQUNULHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsS0FBSyxFQUNSLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUN0RCxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBQ25DLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxnQ0FBZ0MsQ0FBQztBQUM1RCxPQUFPLEVBQUMsd0JBQXdCLEVBQUMsTUFBTSxrREFBa0QsQ0FBQztBQUMxRixPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSw2Q0FBNkMsQ0FBQztBQU9oRixPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUNyRCxPQUFPLEVBQUMsMkJBQTJCLEVBQUMsTUFBTSxzREFBc0QsQ0FBQztBQUNqRyxPQUFPLEVBQUMsY0FBYyxFQUFFLFdBQVcsRUFBRSxjQUFjLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUNqRixPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxnQ0FBZ0MsQ0FBQztBQVFoRSxNQUFNOzs7Ozs7OztJQWdCRixZQUFvQixZQUEwQixFQUMxQixjQUNBLGtCQUNBLGtCQUNBO1FBSkEsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsaUJBQVksR0FBWixZQUFZO1FBQ1oscUJBQWdCLEdBQWhCLGdCQUFnQjtRQUNoQixxQkFBZ0IsR0FBaEIsZ0JBQWdCO1FBQ2hCLFFBQUcsR0FBSCxHQUFHOzJCQWZBLEVBQUU7eUJBR0osQ0FBQztLQWFyQjs7OztJQUVELFFBQVE7UUFDSixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxL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QixJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDbkIsYUFBYSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUNwQztRQUNELElBQUksQ0FBQyxZQUFZLEdBQUcsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDcEUsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNaLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtnQkFDbkIsYUFBYSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztnQkFDakMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7YUFDNUI7U0FDSixFQUFFLFFBQVEsQ0FBQyxDQUFDO0tBQ2hCOzs7WUFsSkosU0FBUyxTQUFDO2dCQUNQLFFBQVEsRUFBRSxXQUFXO2dCQUNyQix1b0dBQXFDO2dCQUVyQyxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTs7YUFDbEQ7Ozs7WUFyQk8sWUFBWTtZQUVaLFlBQVk7WUFTWixnQkFBZ0I7WUFHaEIsZ0JBQWdCO1lBbEJwQixpQkFBaUI7OztvQkFpQ2hCLEtBQUs7d0JBQ0wsS0FBSztrQ0FDTCxLQUFLOzhCQUVMLFNBQVMsU0FBQyx3QkFBd0I7MENBRWxDLFNBQVMsU0FBQyxvQkFBb0IiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgUHJvamVjdCBIYXJib3IgQXV0aG9yc1xuLy9cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbi8vXG4vLyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbi8vXG4vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbi8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbi8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuaW1wb3J0IHtcbiAgICBDb21wb25lbnQsXG4gICAgT25Jbml0LFxuICAgIFZpZXdDaGlsZCxcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBJbnB1dFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHtMYWJlbH0gZnJvbSBcIi4uL3NlcnZpY2UvaW50ZXJmYWNlXCI7XG5pbXBvcnQge0xhYmVsU2VydmljZX0gZnJvbSBcIi4uL3NlcnZpY2UvbGFiZWwuc2VydmljZVwiO1xuaW1wb3J0IHt0b1Byb21pc2V9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHtFcnJvckhhbmRsZXJ9IGZyb20gXCIuLi9lcnJvci1oYW5kbGVyL2Vycm9yLWhhbmRsZXJcIjtcbmltcG9ydCB7Q3JlYXRlRWRpdExhYmVsQ29tcG9uZW50fSBmcm9tIFwiLi4vY3JlYXRlLWVkaXQtbGFiZWwvY3JlYXRlLWVkaXQtbGFiZWwuY29tcG9uZW50XCI7XG5pbXBvcnQge0NvbmZpcm1hdGlvbk1lc3NhZ2V9IGZyb20gXCIuLi9jb25maXJtYXRpb24tZGlhbG9nL2NvbmZpcm1hdGlvbi1tZXNzYWdlXCI7XG5pbXBvcnQge1xuICAgIENvbmZpcm1hdGlvbkJ1dHRvbnMsXG4gICAgQ29uZmlybWF0aW9uU3RhdGUsXG4gICAgQ29uZmlybWF0aW9uVGFyZ2V0c1xufSBmcm9tIFwiLi4vc2hhcmVkL3NoYXJlZC5jb25zdFwiO1xuaW1wb3J0IHtDb25maXJtYXRpb25BY2tub3dsZWRnZW1lbnR9IGZyb20gXCIuLi9jb25maXJtYXRpb24tZGlhbG9nL2NvbmZpcm1hdGlvbi1zdGF0ZS1tZXNzYWdlXCI7XG5pbXBvcnQge1RyYW5zbGF0ZVNlcnZpY2V9IGZyb20gXCJAbmd4LXRyYW5zbGF0ZS9jb3JlXCI7XG5pbXBvcnQge0NvbmZpcm1hdGlvbkRpYWxvZ0NvbXBvbmVudH0gZnJvbSBcIi4uL2NvbmZpcm1hdGlvbi1kaWFsb2cvY29uZmlybWF0aW9uLWRpYWxvZy5jb21wb25lbnRcIjtcbmltcG9ydCB7b3BlcmF0ZUNoYW5nZXMsIE9wZXJhdGVJbmZvLCBPcGVyYXRpb25TdGF0ZX0gZnJvbSBcIi4uL29wZXJhdGlvbi9vcGVyYXRlXCI7XG5pbXBvcnQge09wZXJhdGlvblNlcnZpY2V9IGZyb20gXCIuLi9vcGVyYXRpb24vb3BlcmF0aW9uLnNlcnZpY2VcIjtcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6IFwiaGJyLWxhYmVsXCIsXG4gICAgdGVtcGxhdGVVcmw6IFwiLi9sYWJlbC5jb21wb25lbnQuaHRtbFwiLFxuICAgIHN0eWxlVXJsczogW1wiLi9sYWJlbC5jb21wb25lbnQuc2Nzc1wiXSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBMYWJlbENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gICAgdGltZXJIYW5kbGVyOiBhbnk7XG4gICAgbG9hZGluZzogYm9vbGVhbjtcbiAgICB0YXJnZXRzOiBMYWJlbFtdO1xuICAgIHRhcmdldE5hbWU6IHN0cmluZztcbiAgICBzZWxlY3RlZFJvdzogTGFiZWxbXSA9IFtdO1xuXG4gICAgQElucHV0KCkgc2NvcGU6IHN0cmluZztcbiAgICBASW5wdXQoKSBwcm9qZWN0SWQgPSAwO1xuICAgIEBJbnB1dCgpIGhhc1Byb2plY3RBZG1pblJvbGU6IGJvb2xlYW47XG5cbiAgICBAVmlld0NoaWxkKENyZWF0ZUVkaXRMYWJlbENvbXBvbmVudClcbiAgICBjcmVhdGVFZGl0TGFiZWw6IENyZWF0ZUVkaXRMYWJlbENvbXBvbmVudDtcbiAgICBAVmlld0NoaWxkKFwiY29uZmlybWF0aW9uRGlhbG9nXCIpXG4gICAgY29uZmlybWF0aW9uRGlhbG9nQ29tcG9uZW50OiBDb25maXJtYXRpb25EaWFsb2dDb21wb25lbnQ7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGxhYmVsU2VydmljZTogTGFiZWxTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByaXZhdGUgZXJyb3JIYW5kbGVyOiBFcnJvckhhbmRsZXIsXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByaXZhdGUgb3BlcmF0aW9uU2VydmljZTogT3BlcmF0aW9uU2VydmljZSxcbiAgICAgICAgICAgICAgICBwcml2YXRlIHJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yZXRyaWV2ZSh0aGlzLnNjb3BlKTtcbiAgICB9XG5cbiAgICByZXRyaWV2ZShzY29wZTogc3RyaW5nLCBuYW1lID0gXCJcIikge1xuICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAgICAgICB0aGlzLnNlbGVjdGVkUm93ID0gW107XG4gICAgICAgIHRoaXMudGFyZ2V0TmFtZSA9IFwiXCI7XG4gICAgICAgIHRvUHJvbWlzZTxMYWJlbFtdPih0aGlzLmxhYmVsU2VydmljZS5nZXRMYWJlbHMoc2NvcGUsIHRoaXMucHJvamVjdElkLCBuYW1lKSlcbiAgICAgICAgICAgIC50aGVuKHRhcmdldHMgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMudGFyZ2V0cyA9IHRhcmdldHMgfHwgW107XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5mb3JjZVJlZnJlc2hWaWV3KDIwMDApO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5lcnJvckhhbmRsZXIuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgb3Blbk1vZGFsKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmNyZWF0ZUVkaXRMYWJlbC5vcGVuTW9kYWwoKTtcbiAgICB9XG5cbiAgICByZWxvYWQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMucmV0cmlldmUodGhpcy5zY29wZSk7XG4gICAgfVxuXG4gICAgZG9TZWFyY2hUYXJnZXRzKHRhcmdldE5hbWU6IHN0cmluZykge1xuICAgICAgICB0aGlzLnJldHJpZXZlKHRoaXMuc2NvcGUsIHRhcmdldE5hbWUpO1xuICAgIH1cblxuICAgIHJlZnJlc2hUYXJnZXRzKCkge1xuICAgICAgICB0aGlzLnJldHJpZXZlKHRoaXMuc2NvcGUpO1xuICAgIH1cblxuICAgIHNlbGVjdGVkQ2hhbmdlKCk6IHZvaWQge1xuICAgICAgICAvLyB0aGlzLmZvcmNlUmVmcmVzaFZpZXcoNTAwMCk7XG4gICAgfVxuXG4gICAgZWRpdExhYmVsKGxhYmVsOiBMYWJlbFtdKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY3JlYXRlRWRpdExhYmVsLmVkaXRNb2RlbChsYWJlbFswXS5pZCwgbGFiZWwpO1xuICAgIH1cblxuICAgIGRlbGV0ZUxhYmVscyh0YXJnZXRzOiBMYWJlbFtdKTogdm9pZCB7XG4gICAgICAgIGlmICh0YXJnZXRzICYmIHRhcmdldHMubGVuZ3RoKSB7XG4gICAgICAgICAgICBsZXQgdGFyZ2V0TmFtZXM6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgICB0YXJnZXRzLmZvckVhY2godGFyZ2V0ID0+IHtcbiAgICAgICAgICAgICAgICB0YXJnZXROYW1lcy5wdXNoKHRhcmdldC5uYW1lKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbGV0IGRlbGV0aW9uTWVzc2FnZSA9IG5ldyBDb25maXJtYXRpb25NZXNzYWdlKFxuICAgICAgICAgICAgICAgICdMQUJFTC5ERUxFVElPTl9USVRMRV9UQVJHRVQnLFxuICAgICAgICAgICAgICAgICdMQUJFTC5ERUxFVElPTl9TVU1NQVJZX1RBUkdFVCcsXG4gICAgICAgICAgICAgICAgdGFyZ2V0TmFtZXMuam9pbignLCAnKSB8fCAnJyxcbiAgICAgICAgICAgICAgICB0YXJnZXRzLFxuICAgICAgICAgICAgICAgIENvbmZpcm1hdGlvblRhcmdldHMuVEFSR0VULFxuICAgICAgICAgICAgICAgIENvbmZpcm1hdGlvbkJ1dHRvbnMuREVMRVRFX0NBTkNFTCk7XG4gICAgICAgICAgICB0aGlzLmNvbmZpcm1hdGlvbkRpYWxvZ0NvbXBvbmVudC5vcGVuKGRlbGV0aW9uTWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb25maXJtRGVsZXRpb24obWVzc2FnZTogQ29uZmlybWF0aW9uQWNrbm93bGVkZ2VtZW50KSB7XG4gICAgICAgIGlmIChtZXNzYWdlICYmXG4gICAgICAgICAgICBtZXNzYWdlLnNvdXJjZSA9PT0gQ29uZmlybWF0aW9uVGFyZ2V0cy5UQVJHRVQgJiZcbiAgICAgICAgICAgIG1lc3NhZ2Uuc3RhdGUgPT09IENvbmZpcm1hdGlvblN0YXRlLkNPTkZJUk1FRCkge1xuICAgICAgICAgICAgbGV0IHRhcmdldExpc3RzOiBMYWJlbFtdID0gbWVzc2FnZS5kYXRhO1xuICAgICAgICAgICAgaWYgKHRhcmdldExpc3RzICYmIHRhcmdldExpc3RzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGxldCBwcm9taXNlTGlzdHM6IGFueVtdID0gW107XG4gICAgICAgICAgICAgICAgdGFyZ2V0TGlzdHMuZm9yRWFjaCh0YXJnZXQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBwcm9taXNlTGlzdHMucHVzaCh0aGlzLmRlbE9wZXJhdGUodGFyZ2V0KSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgUHJvbWlzZS5hbGwocHJvbWlzZUxpc3RzKS50aGVuKChpdGVtKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSb3cgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXRyaWV2ZSh0aGlzLnNjb3BlKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGRlbE9wZXJhdGUodGFyZ2V0OiBMYWJlbCkge1xuICAgICAgICAvLyBpbml0IG9wZXJhdGlvbiBpbmZvXG4gICAgICAgIGxldCBvcGVyTWVzc2FnZSA9IG5ldyBPcGVyYXRlSW5mbygpO1xuICAgICAgICBvcGVyTWVzc2FnZS5uYW1lID0gJ09QRVJBVElPTi5ERUxFVEVfTEFCRUwnO1xuICAgICAgICBvcGVyTWVzc2FnZS5kYXRhLmlkID0gdGFyZ2V0LmlkO1xuICAgICAgICBvcGVyTWVzc2FnZS5zdGF0ZSA9IE9wZXJhdGlvblN0YXRlLnByb2dyZXNzaW5nO1xuICAgICAgICBvcGVyTWVzc2FnZS5kYXRhLm5hbWUgPSB0YXJnZXQubmFtZTtcbiAgICAgICAgdGhpcy5vcGVyYXRpb25TZXJ2aWNlLnB1Ymxpc2hJbmZvKG9wZXJNZXNzYWdlKTtcblxuICAgICAgICByZXR1cm4gdG9Qcm9taXNlPG51bWJlcj4odGhpcy5sYWJlbFNlcnZpY2VcbiAgICAgICAgICAgIC5kZWxldGVMYWJlbCh0YXJnZXQuaWQpKVxuICAgICAgICAgICAgLnRoZW4oXG4gICAgICAgICAgICAgICAgcmVzcG9uc2UgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuZ2V0KCdCQVRDSC5ERUxFVEVEX1NVQ0NFU1MnKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnN1YnNjcmliZShyZXMgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGVDaGFuZ2VzKG9wZXJNZXNzYWdlLCBPcGVyYXRpb25TdGF0ZS5zdWNjZXNzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pLmNhdGNoKFxuICAgICAgICAgICAgICAgIGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmdldCgnQkFUQ0guREVMRVRFRF9GQUlMVVJFJykuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRlQ2hhbmdlcyhvcGVyTWVzc2FnZSwgT3BlcmF0aW9uU3RhdGUuZmFpbHVyZSwgcmVzKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gRm9yY2VseSByZWZyZXNoIHRoZSB2aWV3XG4gICAgZm9yY2VSZWZyZXNoVmlldyhkdXJhdGlvbjogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIC8vIFJlc2V0IHRpbWVyXG4gICAgICAgIGlmICh0aGlzLnRpbWVySGFuZGxlcikge1xuICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLnRpbWVySGFuZGxlcik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50aW1lckhhbmRsZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB0aGlzLnJlZi5tYXJrRm9yQ2hlY2soKSwgMTAwKTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy50aW1lckhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKHRoaXMudGltZXJIYW5kbGVyKTtcbiAgICAgICAgICAgICAgICB0aGlzLnRpbWVySGFuZGxlciA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIGR1cmF0aW9uKTtcbiAgICB9XG59XG4iXX0=