UNPKG

@universis/common

Version:

Universis - common directives and services

219 lines (217 loc) 23.6 kB
import { Injectable, Component, Input } from '@angular/core'; import { Router } from '@angular/router'; import { HttpErrorResponse } from '@angular/common/http'; import { BsModalService, BsModalRef } from 'ngx-bootstrap/modal'; import { TranslateService } from '@ngx-translate/core'; import * as i0 from "@angular/core"; import * as i1 from "@ngx-translate/core"; import * as i2 from "ngx-bootstrap/modal"; import * as i3 from "@angular/router"; import * as i4 from "@angular/common"; export class ErrorModalComponent { constructor(_translateService, bsModalRef, _router) { this._translateService = _translateService; this.bsModalRef = bsModalRef; this._router = _router; this.continueLink = '/'; this.buttonText = 'Error.Continue'; this.language = this._translateService.currentLang; } hide() { this.bsModalRef.hide(); if (this.continueLink == null) { return Promise.resolve(); } if (this.continueLink === '.') { return Promise.resolve(); } return this._router.navigate([this.continueLink]); } ngOnInit() { // get last error const error = this.error; // check error.code property if (error && typeof error.code === 'string') { this.code = error.code; } else if (error && typeof (error.status || error.statusCode) === 'number') { this.code = `E${error.status || error.statusCode}`; } else { this.code = 'E500'; } if (error && typeof error.continue === 'string') { this.continueLink = error.continue; } this._translateService.get(this.code).subscribe((translation) => { if (translation) { this.title = translation.title; this.message = (this.error instanceof HttpErrorResponse && this.error.error && this.error.error.message) ? this.error.error.message : translation.message; // set custom icon class if (this.iconClass == null) { if (translation.iconClass || translation.icon) { this.iconClass = translation.iconClass || translation.icon; } } // set custom button text if (this.buttonText === 'Error.Continue') { if (translation.actionText || translation.action) { this.buttonText = translation.actionText || translation.action; } } if (translation.continue) { // force set message this.message = translation.message; // force set continue link this.continueLink = translation.continue; } } else { this._translateService.get('E500').subscribe((translation) => { this.title = translation.title; this.message = (this.error instanceof HttpErrorResponse && this.error.error && this.error.error.message) ? this.error.error.message : translation.message; }); } }); } } ErrorModalComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ErrorModalComponent, deps: [{ token: i1.TranslateService }, { token: i2.BsModalRef }, { token: i3.Router }], target: i0.ɵɵFactoryTarget.Component }); ErrorModalComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: ErrorModalComponent, selector: "universis-error-modal", inputs: { continueLink: "continueLink", message: "message", title: "title", iconClass: "iconClass", buttonText: "buttonText", error: "error" }, ngImport: i0, template: ` <div class="modal-header text-center"> <button type="button" class="close pull-right" aria-label="Close" (click)="hide()"> <span aria-hidden="true">&times;</span> </button> </div> <div class="modal-body mt-0 mb-0 text-center"> <div class="text-center"> <ng-container *ngIf="iconClass; then iconTemplate; else iconDefault"> </ng-container> <ng-template #iconTemplate> <div class="mb-2"> <i [ngClass]="iconClass" class="fa-4x"></i> </div> </ng-template> <ng-template #iconDefault> <div class="icon-circle icon-circle-danger"> <i class="fa fa-times"></i> </div> </ng-template> <div class="font-2xl font-weight-bold mt-2"> {{title}} </div> <p class="mt-2"> {{message}} </p> </div> </div> <div class="modal-footer"> <button [lang]="language" type="button" (click)="hide()" class="btn btn-gray-100 btn-ok text-uppercase" [translate]="buttonText"></button> </div> `, isInline: true, styles: [".btn-ok{font-size:16px}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ErrorModalComponent, decorators: [{ type: Component, args: [{ selector: 'universis-error-modal', template: ` <div class="modal-header text-center"> <button type="button" class="close pull-right" aria-label="Close" (click)="hide()"> <span aria-hidden="true">&times;</span> </button> </div> <div class="modal-body mt-0 mb-0 text-center"> <div class="text-center"> <ng-container *ngIf="iconClass; then iconTemplate; else iconDefault"> </ng-container> <ng-template #iconTemplate> <div class="mb-2"> <i [ngClass]="iconClass" class="fa-4x"></i> </div> </ng-template> <ng-template #iconDefault> <div class="icon-circle icon-circle-danger"> <i class="fa fa-times"></i> </div> </ng-template> <div class="font-2xl font-weight-bold mt-2"> {{title}} </div> <p class="mt-2"> {{message}} </p> </div> </div> <div class="modal-footer"> <button [lang]="language" type="button" (click)="hide()" class="btn btn-gray-100 btn-ok text-uppercase" [translate]="buttonText"></button> </div> `, styles: [".btn-ok{font-size:16px}\n"] }] }], ctorParameters: function () { return [{ type: i1.TranslateService }, { type: i2.BsModalRef }, { type: i3.Router }]; }, propDecorators: { continueLink: [{ type: Input }], message: [{ type: Input }], title: [{ type: Input }], iconClass: [{ type: Input }], buttonText: [{ type: Input }], error: [{ type: Input }] } }); export class ErrorService { constructor(_router, _modalService) { this._router = _router; this._modalService = _modalService; // } /** * @param {*} error * @returns {Promise<boolean>} */ navigateToError(error) { this.setLastError(error); // if error is an instance of HttpErrorResponse if (error instanceof HttpErrorResponse) { if (error && error.error && error.error.statusCode) { return this._router.navigate(['/error', error.error.statusCode]); } // navigate to specific error e.g. /error/401 // this will allow application to override specific error pages and show custom errors return this._router.navigate(['/error', error.status]); } if (error && error.statusCode) { return this._router.navigate(['/error', error.statusCode]); } // otherwise show default error component return this._router.navigate(['/error']); } showError(error, options) { const initialState = Object.assign({ error: error }, options); this._modalService.show(ErrorModalComponent, { initialState }); } /** * Sets last application error * @param {*=} err * @return ErrorService */ setLastError(err) { this._lastError = err; return this; } /** * Gets last application error * @return {any} */ getLastError() { return this._lastError; } } ErrorService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ErrorService, deps: [{ token: i3.Router }, { token: i2.BsModalService }], target: i0.ɵɵFactoryTarget.Injectable }); ErrorService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ErrorService }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ErrorService, decorators: [{ type: Injectable }], ctorParameters: function () { return [{ type: i3.Router }, { type: i2.BsModalService }]; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3Iuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9lcnJvci9lcnJvci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNyRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekMsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGNBQWMsRUFBRSxVQUFVLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7Ozs7O0FBNERyRCxNQUFNLE9BQU8sbUJBQW1CO0lBVzlCLFlBQXNCLGlCQUFtQyxFQUNwQyxVQUFzQixFQUNyQixPQUFlO1FBRmYsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFrQjtRQUNwQyxlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ3JCLFlBQU8sR0FBUCxPQUFPLENBQVE7UUFUNUIsaUJBQVksR0FBRyxHQUFHLENBQUM7UUFJbkIsZUFBVSxHQUFHLGdCQUFnQixDQUFDO1FBTXJDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQztJQUNyRCxDQUFDO0lBRUgsSUFBSTtRQUNBLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDdkIsSUFBSSxJQUFJLENBQUMsWUFBWSxJQUFJLElBQUksRUFBRTtZQUM3QixPQUFPLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztTQUMxQjtRQUNELElBQUksSUFBSSxDQUFDLFlBQVksS0FBSyxHQUFHLEVBQUU7WUFDN0IsT0FBTyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7U0FDMUI7UUFDRCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsUUFB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LENBQUMsQ0FBQyxDQUFDO1NBQ3hEO1FBQ0QsSUFBSSxLQUFLLElBQUksS0FBSyxDQUFDLFVBQVUsRUFBRTtZQUM3QixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1NBQzVEO1FBQ0QseUNBQXlDO1FBQ3pDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFRCxTQUFTLENBQUMsS0FBVSxFQUFFLE9BQStCO1FBQ25ELE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7WUFDakMsS0FBSyxFQUFFLEtBQUs7U0FDYixFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ1osSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsRUFBQyxZQUFZLEVBQUMsQ0FBQyxDQUFDO0lBQy9ELENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsWUFBWSxDQUFDLEdBQVM7UUFDcEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxHQUFHLENBQUM7UUFDdEIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsWUFBWTtRQUNWLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUN6QixDQUFDOzswR0FyRFUsWUFBWTs4R0FBWixZQUFZOzRGQUFaLFlBQVk7a0JBRHhCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQge0h0dHBFcnJvclJlc3BvbnNlfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBCc01vZGFsU2VydmljZSwgQnNNb2RhbFJlZiB9IGZyb20gJ25neC1ib290c3RyYXAvbW9kYWwnO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuXG5leHBvcnQgZGVjbGFyZSBpbnRlcmZhY2UgVHJhbnNsYXRlRXJyb3Ige1xuICB0aXRsZT86IHN0cmluZztcbiAgbWVzc2FnZT86IHN0cmluZztcbiAgYWN0aW9uPzogc3RyaW5nO1xuICBhY3Rpb25UZXh0Pzogc3RyaW5nO1xuICBjb250aW51ZT86IHN0cmluZztcbiAgaWNvbj86IHN0cmluZztcbiAgaWNvbkNsYXNzPzogc3RyaW5nO1xufVxuXG5leHBvcnQgZGVjbGFyZSBpbnRlcmZhY2UgU2hvd0Vycm9yTW9kYWxPcHRpb25zIHtcbiAgY29udGludWVMaW5rPzogc3RyaW5nO1xuICBidXR0b25UZXh0Pzogc3RyaW5nO1xuICBpY29uQ2xhc3M/OiBzdHJpbmc7XG59XG5cbkBDb21wb25lbnQoIHtcbiAgc2VsZWN0b3I6ICd1bml2ZXJzaXMtZXJyb3ItbW9kYWwnLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXIgdGV4dC1jZW50ZXJcIj5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiY2xvc2UgcHVsbC1yaWdodFwiIGFyaWEtbGFiZWw9XCJDbG9zZVwiIChjbGljayk9XCJoaWRlKClcIj5cbiAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+JnRpbWVzOzwvc3Bhbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5IG10LTAgbWItMCB0ZXh0LWNlbnRlclwiPlxuICAgICAgPGRpdiBjbGFzcz1cInRleHQtY2VudGVyXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpY29uQ2xhc3M7IHRoZW4gaWNvblRlbXBsYXRlOyBlbHNlIGljb25EZWZhdWx0XCI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctdGVtcGxhdGUgI2ljb25UZW1wbGF0ZT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItMlwiPlxuICAgICAgICAgICAgPGkgW25nQ2xhc3NdPVwiaWNvbkNsYXNzXCIgY2xhc3M9XCJmYS00eFwiPjwvaT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgICA8bmctdGVtcGxhdGUgI2ljb25EZWZhdWx0PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpY29uLWNpcmNsZSBpY29uLWNpcmNsZS1kYW5nZXJcIj5cbiAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS10aW1lc1wiPjwvaT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb250LTJ4bCBmb250LXdlaWdodC1ib2xkIG10LTJcIj5cbiAgICAgICAgICAgICAge3t0aXRsZX19XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxwIGNsYXNzPVwibXQtMlwiPlxuICAgICAgICAgICAgIHt7bWVzc2FnZX19XG4gICAgICAgICAgICA8L3A+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXJcIj5cbiAgICAgIDxidXR0b24gW2xhbmddPVwibGFuZ3VhZ2VcIiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImhpZGUoKVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1ncmF5LTEwMCBidG4tb2sgdGV4dC11cHBlcmNhc2VcIiBbdHJhbnNsYXRlXT1cImJ1dHRvblRleHRcIj48L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgYCwgc3R5bGVzOiBbYFxuICAuYnRuLW9rIHtcbiAgICBmb250LXNpemU6IDE2cHg7XG4gIH1cbiAgYF1cbiAgIH0pXG5cbiAgZXhwb3J0IGNsYXNzIEVycm9yTW9kYWxDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gICAgcHVibGljIGNvZGU7XG4gICAgcHVibGljIGxhbmd1YWdlO1xuICAgIEBJbnB1dCgpIGNvbnRpbnVlTGluayA9ICcvJztcbiAgICBASW5wdXQoKSBtZXNzYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgQElucHV0KCkgdGl0bGU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBASW5wdXQoKSBpY29uQ2xhc3M/OiBzdHJpbmc7XG4gICAgQElucHV0KCkgYnV0dG9uVGV4dCA9ICdFcnJvci5Db250aW51ZSc7XG4gICAgQElucHV0KCkgZXJyb3I6IGFueTtcblxuICAgIGNvbnN0cnVjdG9yICggcHJpdmF0ZSBfdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICAgICAgICAgICAgICAgIHB1YmxpYyBic01vZGFsUmVmOiBCc01vZGFsUmVmLFxuICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBfcm91dGVyOiBSb3V0ZXIgKSB7XG4gICAgICB0aGlzLmxhbmd1YWdlID0gdGhpcy5fdHJhbnNsYXRlU2VydmljZS5jdXJyZW50TGFuZztcbiAgICB9XG5cbiAgaGlkZSgpIHtcbiAgICAgIHRoaXMuYnNNb2RhbFJlZi5oaWRlKCk7XG4gICAgICBpZiAodGhpcy5jb250aW51ZUxpbmsgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5jb250aW51ZUxpbmsgPT09ICcuJykge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5fcm91dGVyLm5hdmlnYXRlKFt0aGlzLmNvbnRpbnVlTGlua10pO1xuICAgIH1cblxuICAgIG5nT25Jbml0KCkge1xuXG4gICAgICAvLyBnZXQgbGFzdCBlcnJvclxuICAgICAgY29uc3QgZXJyb3IgPSB0aGlzLmVycm9yO1xuICAgICAgLy8gY2hlY2sgZXJyb3IuY29kZSBwcm9wZXJ0eVxuICAgICAgaWYgKGVycm9yICYmIHR5cGVvZiBlcnJvci5jb2RlID09PSAnc3RyaW5nJykge1xuICAgICAgICB0aGlzLmNvZGUgPSBlcnJvci5jb2RlO1xuICAgICAgfSBlbHNlIGlmIChlcnJvciAmJiB0eXBlb2YgKGVycm9yLnN0YXR1cyB8fCBlcnJvci5zdGF0dXNDb2RlKSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgdGhpcy5jb2RlID0gYEUke2Vycm9yLnN0YXR1cyB8fCBlcnJvci5zdGF0dXNDb2RlfWA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNvZGUgPSAnRTUwMCc7XG4gICAgICB9XG4gICAgICBpZiAoZXJyb3IgJiYgdHlwZW9mIGVycm9yLmNvbnRpbnVlID09PSAnc3RyaW5nJykge1xuICAgICAgICB0aGlzLmNvbnRpbnVlTGluayA9IGVycm9yLmNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdGhpcy5fdHJhbnNsYXRlU2VydmljZS5nZXQodGhpcy5jb2RlKS5zdWJzY3JpYmUoKHRyYW5zbGF0aW9uOiBUcmFuc2xhdGVFcnJvcikgPT4ge1xuICAgICAgICBpZiAodHJhbnNsYXRpb24pIHtcbiAgICAgICAgICB0aGlzLnRpdGxlID0gdHJhbnNsYXRpb24udGl0bGU7XG4gICAgICAgICAgdGhpcy5tZXNzYWdlID0gKHRoaXMuZXJyb3IgaW5zdGFuY2VvZiBIdHRwRXJyb3JSZXNwb25zZSAmJiB0aGlzLmVycm9yLmVycm9yICYmIHRoaXMuZXJyb3IuZXJyb3IubWVzc2FnZSlcbiAgICAgICAgICAgID8gdGhpcy5lcnJvci5lcnJvci5tZXNzYWdlIDogdHJhbnNsYXRpb24ubWVzc2FnZTtcbiAgICAgICAgICAvLyBzZXQgY3VzdG9tIGljb24gY2xhc3NcbiAgICAgICAgICBpZiAodGhpcy5pY29uQ2xhc3MgPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKHRyYW5zbGF0aW9uLmljb25DbGFzcyB8fCB0cmFuc2xhdGlvbi5pY29uKSB7XG4gICAgICAgICAgICAgIHRoaXMuaWNvbkNsYXNzID0gdHJhbnNsYXRpb24uaWNvbkNsYXNzIHx8IHRyYW5zbGF0aW9uLmljb247XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIHNldCBjdXN0b20gYnV0dG9uIHRleHRcbiAgICAgICAgICBpZiAodGhpcy5idXR0b25UZXh0ID09PSAnRXJyb3IuQ29udGludWUnKSB7XG4gICAgICAgICAgICBpZiAodHJhbnNsYXRpb24uYWN0aW9uVGV4dCB8fCB0cmFuc2xhdGlvbi5hY3Rpb24pIHtcbiAgICAgICAgICAgICAgdGhpcy5idXR0b25UZXh0ID0gdHJhbnNsYXRpb24uYWN0aW9uVGV4dCB8fCB0cmFuc2xhdGlvbi5hY3Rpb247XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0cmFuc2xhdGlvbi5jb250aW51ZSkge1xuICAgICAgICAgICAgLy8gZm9yY2Ugc2V0IG1lc3NhZ2VcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZSA9IHRyYW5zbGF0aW9uLm1lc3NhZ2U7XG4gICAgICAgICAgICAvLyBmb3JjZSBzZXQgY29udGludWUgbGlua1xuICAgICAgICAgICAgdGhpcy5jb250aW51ZUxpbmsgPSB0cmFuc2xhdGlvbi5jb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5fdHJhbnNsYXRlU2VydmljZS5nZXQoJ0U1MDAnKS5zdWJzY3JpYmUoKHRyYW5zbGF0aW9uOiBUcmFuc2xhdGVFcnJvcikgPT4ge1xuICAgICAgICAgICAgdGhpcy50aXRsZSA9IHRyYW5zbGF0aW9uLnRpdGxlO1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlID0gKHRoaXMuZXJyb3IgaW5zdGFuY2VvZiBIdHRwRXJyb3JSZXNwb25zZSAmJiB0aGlzLmVycm9yLmVycm9yICYmIHRoaXMuZXJyb3IuZXJyb3IubWVzc2FnZSlcbiAgICAgICAgICAgICAgPyB0aGlzLmVycm9yLmVycm9yLm1lc3NhZ2UgOiB0cmFuc2xhdGlvbi5tZXNzYWdlO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgRXJyb3JTZXJ2aWNlIHtcblxuICBwcml2YXRlIF9sYXN0RXJyb3I6IGFueTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9yb3V0ZXI6IFJvdXRlciwgcHJpdmF0ZSBfbW9kYWxTZXJ2aWNlOiBCc01vZGFsU2VydmljZSkge1xuICAgIC8vXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHsqfSBlcnJvclxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn1cbiAgICovXG4gIG5hdmlnYXRlVG9FcnJvcihlcnJvcikge1xuICAgIHRoaXMuc2V0TGFzdEVycm9yKGVycm9yKTtcbiAgICAvLyBpZiBlcnJvciBpcyBhbiBpbnN0YW5jZSBvZiBIdHRwRXJyb3JSZXNwb25zZVxuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEh0dHBFcnJvclJlc3BvbnNlKSB7XG4gICAgICBpZiAoZXJyb3IgJiYgZXJyb3IuZXJyb3IgJiYgZXJyb3IuZXJyb3Iuc3RhdHVzQ29kZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcm91dGVyLm5hdmlnYXRlKFsnL2Vycm9yJywgZXJyb3IuZXJyb3Iuc3RhdHVzQ29kZV0pO1xuICAgICAgfVxuICAgICAgLy8gbmF2aWdhdGUgdG8gc3BlY2lmaWMgZXJyb3IgZS5nLiAvZXJyb3IvNDAxXG4gICAgICAvLyB0aGlzIHdpbGwgYWxsb3cgYXBwbGljYXRpb24gdG8gb3ZlcnJpZGUgc3BlY2lmaWMgZXJyb3IgcGFnZXMgYW5kIHNob3cgY3VzdG9tIGVycm9yc1xuICAgICAgcmV0dXJuIHRoaXMuX3JvdXRlci5uYXZpZ2F0ZShbJy9lcnJvcicsIGVycm9yLnN0YXR1c10pO1xuICAgIH1cbiAgICBpZiAoZXJyb3IgJiYgZXJyb3Iuc3RhdHVzQ29kZSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3JvdXRlci5uYXZpZ2F0ZShbJy9lcnJvcicsIGVycm9yLnN0YXR1c0NvZGVdKTtcbiAgICB9XG4gICAgLy8gb3RoZXJ3aXNlIHNob3cgZGVmYXVsdCBlcnJvciBjb21wb25lbnRcbiAgICByZXR1cm4gdGhpcy5fcm91dGVyLm5hdmlnYXRlKFsnL2Vycm9yJ10pO1xuICB9XG5cbiAgc2hvd0Vycm9yKGVycm9yOiBhbnksIG9wdGlvbnM/OiBTaG93RXJyb3JNb2RhbE9wdGlvbnMpIHtcbiAgICBjb25zdCBpbml0aWFsU3RhdGUgPSBPYmplY3QuYXNzaWduKHtcbiAgICAgIGVycm9yOiBlcnJvclxuICAgIH0sIG9wdGlvbnMpO1xuICAgIHRoaXMuX21vZGFsU2VydmljZS5zaG93KEVycm9yTW9kYWxDb21wb25lbnQsIHtpbml0aWFsU3RhdGV9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGxhc3QgYXBwbGljYXRpb24gZXJyb3JcbiAgICogQHBhcmFtIHsqPX0gZXJyXG4gICAqIEByZXR1cm4gRXJyb3JTZXJ2aWNlXG4gICAqL1xuICBzZXRMYXN0RXJyb3IoZXJyPzogYW55KSB7XG4gICAgdGhpcy5fbGFzdEVycm9yID0gZXJyO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgbGFzdCBhcHBsaWNhdGlvbiBlcnJvclxuICAgKiBAcmV0dXJuIHthbnl9XG4gICAqL1xuICBnZXRMYXN0RXJyb3IoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2xhc3RFcnJvcjtcbiAgfVxuXG59XG4iXX0=