@igo2/core
Version:
225 lines • 38.9 kB
JavaScript
import { Inject, Injectable, Injector } from '@angular/core';
import { ConfigService } from '@igo2/core/config';
import { LanguageService } from '@igo2/core/language';
import { ToastrService } from 'ngx-toastr';
import { BehaviorSubject, forkJoin } from 'rxjs';
import { debounceTime, first } from 'rxjs/operators';
import { MessageType } from './message.enum';
import * as i0 from "@angular/core";
import * as i1 from "@igo2/core/config";
import * as i2 from "@igo2/core/language";
export class MessageService {
injector;
configService;
languageService;
messages$ = new BehaviorSubject([]);
options;
activeMessageTranslations = [];
constructor(injector, configService, languageService) {
this.injector = injector;
this.configService = configService;
this.languageService = languageService;
this.options = this.configService.getConfig('message');
this.languageService.language$.pipe(debounceTime(500)).subscribe(() => {
if (this.toastr.toasts.length === 0) {
this.activeMessageTranslations = [];
}
this.toastr.toasts.map((toast) => {
const activeMessageTranslation = this.activeMessageTranslations.find((amt) => amt.id === toast.toastId);
if (activeMessageTranslation) {
const translatedTextInterpolateParams = {
...activeMessageTranslation.textInterpolateParams
};
const translatedTitleInterpolateParams = {
...activeMessageTranslation.titleInterpolateParams
};
if (activeMessageTranslation.textInterpolateParams) {
Object.keys(activeMessageTranslation.textInterpolateParams).map((k) => {
if (k) {
translatedTextInterpolateParams[k] =
this.languageService.translate.instant(activeMessageTranslation.textInterpolateParams[k]);
}
});
}
if (activeMessageTranslation.titleInterpolateParams) {
Object.keys(activeMessageTranslation.titleInterpolateParams).map((k) => {
if (k) {
translatedTitleInterpolateParams[k] =
this.languageService.translate.instant(activeMessageTranslation.titleInterpolateParams[k]);
}
});
}
forkJoin([
this.languageService.translate.get(activeMessageTranslation.textKey, translatedTextInterpolateParams),
this.languageService.translate.get(activeMessageTranslation.titleKey, translatedTitleInterpolateParams)
])
.pipe(first())
.subscribe((res) => {
toast.toastRef.componentInstance.message = res[0];
toast.toastRef.componentInstance.title = res[1];
});
}
});
});
}
get toastr() {
return this.injector.get(ToastrService);
}
showError(httpError) {
httpError.error.caught = true;
return this.error(httpError.error.message, httpError.error.title);
}
message(message) {
const messageType = message.type;
this.toastr.toastrConfig.iconClasses[messageType] = `toast-${messageType}`;
this.messages$.next(this.messages$.value.concat([message]));
message.options = message.options || {};
const currentDate = new Date();
message.options.from = message.options.from
? message.options.from
: new Date('1 jan 1900');
message.options.to = message.options.to
? message.options.to
: new Date('1 jan 3000');
if (typeof message.options.from === 'string') {
message.options.from = new Date(Date.parse(message.options.from.replace(/-/g, ' ')));
}
if (typeof message.options.to === 'string') {
message.options.to = new Date(Date.parse(message.options.to.replace(/-/g, ' ')));
}
if (currentDate > message.options.from &&
currentDate < message.options.to) {
if (message.showIcon === false) {
this.toastr.toastrConfig.iconClasses[messageType] =
`toast-${messageType} toast-no-icon`;
}
message = this.handleTemplate(message);
if (message.text) {
let messageShown;
switch (message.type) {
case MessageType.SUCCESS:
messageShown = this.success(message.text, message.title, message.options, message.textInterpolateParams, message.titleInterpolateParams);
break;
case MessageType.ERROR:
messageShown = this.error(message.text, message.title, message.options, message.textInterpolateParams, message.titleInterpolateParams);
break;
case MessageType.INFO:
messageShown = this.info(message.text, message.title, message.options, message.textInterpolateParams, message.titleInterpolateParams);
break;
case MessageType.SHOW:
messageShown = this.show(message.text, message.title, message.options, message.textInterpolateParams, message.titleInterpolateParams);
break;
case MessageType.ALERT:
case MessageType.WARNING:
messageShown = this.alert(message.text, message.title, message.options, message.textInterpolateParams, message.titleInterpolateParams);
break;
default:
messageShown = this.info(message.text, message.title, message.options, message.textInterpolateParams, message.titleInterpolateParams);
break;
}
message.options.id = messageShown.toastId;
}
}
}
success(text, title = 'igo.core.message.success', options = {}, textInterpolateParams, titleInterpolateParams) {
return this.handleNgxToastr('success', text, title, options, textInterpolateParams, titleInterpolateParams);
}
error(text, title = 'igo.core.message.error', options = {}, textInterpolateParams, titleInterpolateParams) {
return this.handleNgxToastr('error', text, title, options, textInterpolateParams, titleInterpolateParams);
}
info(text, title = 'igo.core.message.info', options = {}, textInterpolateParams, titleInterpolateParams) {
return this.handleNgxToastr('info', text, title, options, textInterpolateParams, titleInterpolateParams);
}
alert(text, title = 'igo.core.message.alert', options = {}, textInterpolateParams, titleInterpolateParams) {
return this.handleNgxToastr('alert', text, title, options, textInterpolateParams, titleInterpolateParams);
}
show(text, title = 'igo.core.message.info', options = {}, textInterpolateParams, titleInterpolateParams) {
return this.handleNgxToastr('show', text, title, options, textInterpolateParams, titleInterpolateParams);
}
handleNgxToastr(type, text, title, options = {}, textInterpolateParams, titleInterpolateParams) {
const translatedTextInterpolateParams = { ...textInterpolateParams };
const translatedTitlenterpolateParams = { ...titleInterpolateParams };
if (textInterpolateParams) {
Object.keys(textInterpolateParams).map((k) => {
const value = textInterpolateParams[k];
if (value) {
translatedTextInterpolateParams[k] =
typeof value === 'string'
? this.languageService.translate.instant(value)
: value;
}
});
}
if (titleInterpolateParams) {
Object.keys(titleInterpolateParams).map((k) => {
if (k) {
const value = titleInterpolateParams[k];
translatedTitlenterpolateParams[k] =
typeof value === 'string'
? this.languageService.translate.instant(value)
: value;
}
});
}
const message = this.languageService.translate.instant(text, translatedTextInterpolateParams);
const translatedTitle = this.languageService.translate.instant(title, translatedTitlenterpolateParams);
let activeToast;
switch (type) {
case 'success':
activeToast = this.toastr.success(message, translatedTitle, options);
break;
case 'error':
activeToast = this.toastr.error(message, translatedTitle, options);
break;
case 'show':
case 'info':
activeToast = this.toastr.info(message, translatedTitle, options);
break;
case 'alert':
activeToast = this.toastr.warning(message, translatedTitle, options);
break;
}
this.activeMessageTranslations.push({
id: activeToast.toastId,
titleKey: title,
textKey: text,
textInterpolateParams,
titleInterpolateParams
});
return activeToast;
}
remove(id) {
this.toastr.remove(id);
}
removeAllAreNotError() {
for (const mess of this.messages$.value) {
if (mess.type !== MessageType.ERROR) {
this.remove(mess.options.id);
}
}
}
handleTemplate(message) {
if (!this.options?.template || message.html) {
return message;
}
let html = this.options?.template;
html = html.replace('${text}', message.text);
html = html.replace('${title}', message.title);
message.html = undefined;
message.text = html;
message.title = undefined;
return message;
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MessageService, deps: [{ token: Injector }, { token: i1.ConfigService }, { token: i2.LanguageService }], target: i0.ɵɵFactoryTarget.Injectable });
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MessageService, providedIn: 'root' });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MessageService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root'
}]
}], ctorParameters: () => [{ type: i0.Injector, decorators: [{
type: Inject,
args: [Injector]
}] }, { type: i1.ConfigService }, { type: i2.LanguageService }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY29yZS9tZXNzYWdlL3NyYy9zaGFyZWQvbWVzc2FnZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUU3RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXRELE9BQU8sRUFBaUMsYUFBYSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQzFFLE9BQU8sRUFBRSxlQUFlLEVBQUUsUUFBUSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2pELE9BQU8sRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFckQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7O0FBYTdDLE1BQU0sT0FBTyxjQUFjO0lBTUc7SUFDbEI7SUFDQTtJQVBILFNBQVMsR0FBRyxJQUFJLGVBQWUsQ0FBWSxFQUFFLENBQUMsQ0FBQztJQUM5QyxPQUFPLENBQWtCO0lBQ3pCLHlCQUF5QixHQUErQixFQUFFLENBQUM7SUFFbkUsWUFDNEIsUUFBa0IsRUFDcEMsYUFBNEIsRUFDNUIsZUFBZ0M7UUFGZCxhQUFRLEdBQVIsUUFBUSxDQUFVO1FBQ3BDLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzVCLG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtRQUV4QyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3ZELElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxTQUFT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LGNBQWMsa0JBTWYsUUFBUTs0R0FOUCxjQUFjLGNBRmIsTUFBTTs7NEZBRVAsY0FBYztrQkFIMUIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkI7OzBCQU9JLE1BQU07MkJBQUMsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBFcnJvclJlc3BvbnNlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBJbmplY3RvciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBDb25maWdTZXJ2aWNlIH0gZnJvbSAnQGlnbzIvY29yZS9jb25maWcnO1xuaW1wb3J0IHsgTGFuZ3VhZ2VTZXJ2aWNlIH0gZnJvbSAnQGlnbzIvY29yZS9sYW5ndWFnZSc7XG5cbmltcG9ydCB7IEFjdGl2ZVRvYXN0LCBJbmRpdmlkdWFsQ29uZmlnLCBUb2FzdHJTZXJ2aWNlIH0gZnJvbSAnbmd4LXRvYXN0cic7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGZvcmtKb2luIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGZpcnN0IH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBNZXNzYWdlVHlwZSB9IGZyb20gJy4vbWVzc2FnZS5lbnVtJztcbmltcG9ydCB7IE1lc3NhZ2UsIE1lc3NhZ2VPcHRpb25zIH0gZnJvbSAnLi9tZXNzYWdlLmludGVyZmFjZSc7XG5cbmludGVyZmFjZSBBY3RpdmVNZXNzYWdlVHJhbnNsYXRpb24ge1xuICBpZDogbnVtYmVyO1xuICB0aXRsZUtleTogc3RyaW5nO1xuICB0ZXh0S2V5OiBzdHJpbmc7XG4gIHRleHRJbnRlcnBvbGF0ZVBhcmFtcz86IG9iamVjdDtcbiAgdGl0bGVJbnRlcnBvbGF0ZVBhcmFtcz86IG9iamVjdDtcbn1cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIE1lc3NhZ2VTZXJ2aWNlIHtcbiAgcHVibGljIG1lc3NhZ2VzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8TWVzc2FnZVtdPihbXSk7XG4gIHByaXZhdGUgb3B0aW9ucz86IE1lc3NhZ2VPcHRpb25zO1xuICBwcml2YXRlIGFjdGl2ZU1lc3NhZ2VUcmFuc2xhdGlvbnM6IEFjdGl2ZU1lc3NhZ2VUcmFuc2xhdGlvbltdID0gW107XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChJbmplY3RvcikgcHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgcHJpdmF0ZSBjb25maWdTZXJ2aWNlOiBDb25maWdTZXJ2aWNlLFxuICAgIHByaXZhdGUgbGFuZ3VhZ2VTZXJ2aWNlOiBMYW5ndWFnZVNlcnZpY2VcbiAgKSB7XG4gICAgdGhpcy5vcHRpb25zID0gdGhpcy5jb25maWdTZXJ2aWNlLmdldENvbmZpZygnbWVzc2FnZScpO1xuICAgIHRoaXMubGFuZ3VhZ2VTZXJ2aWNlLmxhbmd1YWdlJC5waXBlKGRlYm91bmNlVGltZSg1MDApKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMudG9hc3RyLnRvYXN0cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhpcy5hY3RpdmVNZXNzYWdlVHJhbnNsYXRpb25zID0gW107XG4gICAgICB9XG4gICAgICB0aGlzLnRvYXN0ci50b2FzdHMubWFwKCh0b2FzdCkgPT4ge1xuICAgICAgICBjb25zdCBhY3RpdmVNZXNzYWdlVHJhbnNsYXRpb24gPSB0aGlzLmFjdGl2ZU1lc3NhZ2VUcmFuc2xhdGlvbnMuZmluZChcbiAgICAgICAgICAoYW10KSA9PiBhbXQuaWQgPT09IHRvYXN0LnRvYXN0SWRcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGFjdGl2ZU1lc3NhZ2VUcmFuc2xhdGlvbikge1xuICAgICAgICAgIGNvbnN0IHRyYW5zbGF0ZWRUZXh0SW50ZXJwb2xhdGVQYXJhbXMgPSB7XG4gICAgICAgICAgICAuLi5hY3RpdmVNZXNzYWdlVHJhbnNsYXRpb24udGV4dEludGVycG9sYXRlUGFyYW1zXG4gICAgICAgICAgfTtcbiAgICAgICAgICBjb25zdCB0cmFuc2xhdGVkVGl0bGVJbnRlcnBvbGF0ZVBhcmFtcyA9IHtcbiAgICAgICAgICAgIC4uLmFjdGl2ZU1lc3NhZ2VUcmFuc2xhdGlvbi50aXRsZUludGVycG9sYXRlUGFyYW1zXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGlmIChhY3RpdmVNZXNzYWdlVHJhbnNsYXRpb24udGV4dEludGVycG9sYXRlUGFyYW1zKSB7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhhY3RpdmVNZXNzYWdlVHJhbnNsYXRpb24udGV4dEludGVycG9sYXRlUGFyYW1zKS5tYXAoXG4gICAgICAgICAgICAgIChrKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGspIHtcbiAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZWRUZXh0SW50ZXJwb2xhdGVQYXJhbXNba10gPVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudChcbiAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVNZXNzYWdlVHJhbnNsYXRpb24udGV4dEludGVycG9sYXRlUGFyYW1zW2tdXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoYWN0aXZlTWVzc2FnZVRyYW5zbGF0aW9uLnRpdGxlSW50ZXJwb2xhdGVQYXJhbXMpIHtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGFjdGl2ZU1lc3NhZ2VUcmFuc2xhdGlvbi50aXRsZUludGVycG9sYXRlUGFyYW1zKS5tYXAoXG4gICAgICAgICAgICAgIChrKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGspIHtcbiAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZWRUaXRsZUludGVycG9sYXRlUGFyYW1zW2tdID1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoXG4gICAgICAgICAgICAgICAgICAgICAgYWN0aXZlTWVzc2FnZVRyYW5zbGF0aW9uLnRpdGxlSW50ZXJwb2xhdGVQYXJhbXNba11cbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZm9ya0pvaW4oW1xuICAgICAgICAgICAgdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmdldChcbiAgICAgICAgICAgICAgYWN0aXZlTWVzc2FnZVRyYW5zbGF0aW9uLnRleHRLZXksXG4gICAgICAgICAgICAgIHRyYW5zbGF0ZWRUZXh0SW50ZXJwb2xhdGVQYXJhbXNcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuZ2V0KFxuICAgICAgICAgICAgICBhY3RpdmVNZXNzYWdlVHJhbnNsYXRpb24udGl0bGVLZXksXG4gICAgICAgICAgICAgIHRyYW5zbGF0ZWRUaXRsZUludGVycG9sYXRlUGFyYW1zXG4gICAgICAgICAgICApXG4gICAgICAgICAgXSlcbiAgICAgICAgICAgIC5waXBlKGZpcnN0KCkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChyZXM6IFtzdHJpbmcsIHN0cmluZ10pID0+IHtcbiAgICAgICAgICAgICAgdG9hc3QudG9hc3RSZWYuY29tcG9uZW50SW5zdGFuY2UubWVzc2FnZSA9IHJlc1swXTtcbiAgICAgICAgICAgICAgdG9hc3QudG9hc3RSZWYuY29tcG9uZW50SW5zdGFuY2UudGl0bGUgPSByZXNbMV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGdldCB0b2FzdHIoKTogVG9hc3RyU2VydmljZSB7XG4gICAgcmV0dXJuIHRoaXMuaW5qZWN0b3IuZ2V0KFRvYXN0clNlcnZpY2UpO1xuICB9XG5cbiAgc2hvd0Vycm9yKGh0dHBFcnJvcjogSHR0cEVycm9yUmVzcG9uc2UpIHtcbiAgICBodHRwRXJyb3IuZXJyb3IuY2F1Z2h0ID0gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcy5lcnJvcihodHRwRXJyb3IuZXJyb3IubWVzc2FnZSwgaHR0cEVycm9yLmVycm9yLnRpdGxlKTtcbiAgfVxuXG4gIG1lc3NhZ2UobWVzc2FnZTogTWVzc2FnZSkge1xuICAgIGNvbnN0IG1lc3NhZ2VUeXBlID0gbWVzc2FnZS50eXBlO1xuICAgIHRoaXMudG9hc3RyLnRvYXN0ckNvbmZpZy5pY29uQ2xhc3Nlc1ttZXNzYWdlVHlwZV0gPSBgdG9hc3QtJHttZXNzYWdlVHlwZX1gO1xuXG4gICAgdGhpcy5tZXNzYWdlcyQubmV4dCh0aGlzLm1lc3NhZ2VzJC52YWx1ZS5jb25jYXQoW21lc3NhZ2VdKSk7XG5cbiAgICBtZXNzYWdlLm9wdGlvbnMgPSBtZXNzYWdlLm9wdGlvbnMgfHwgKHt9IGFzIE1lc3NhZ2VPcHRpb25zKTtcbiAgICBjb25zdCBjdXJyZW50RGF0ZSA9IG5ldyBEYXRlKCk7XG5cbiAgICBtZXNzYWdlLm9wdGlvbnMuZnJvbSA9IG1lc3NhZ2Uub3B0aW9ucy5mcm9tXG4gICAgICA/IG1lc3NhZ2Uub3B0aW9ucy5mcm9tXG4gICAgICA6IG5ldyBEYXRlKCcxIGphbiAxOTAwJyk7XG4gICAgbWVzc2FnZS5vcHRpb25zLnRvID0gbWVzc2FnZS5vcHRpb25zLnRvXG4gICAgICA/IG1lc3NhZ2Uub3B0aW9ucy50b1xuICAgICAgOiBuZXcgRGF0ZSgnMSBqYW4gMzAwMCcpO1xuICAgIGlmICh0eXBlb2YgbWVzc2FnZS5vcHRpb25zLmZyb20gPT09ICdzdHJpbmcnKSB7XG4gICAgICBtZXNzYWdlLm9wdGlvbnMuZnJvbSA9IG5ldyBEYXRlKFxuICAgICAgICBEYXRlLnBhcnNlKG1lc3NhZ2Uub3B0aW9ucy5mcm9tLnJlcGxhY2UoLy0vZywgJyAnKSlcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgbWVzc2FnZS5vcHRpb25zLnRvID09PSAnc3RyaW5nJykge1xuICAgICAgbWVzc2FnZS5vcHRpb25zLnRvID0gbmV3IERhdGUoXG4gICAgICAgIERhdGUucGFyc2UobWVzc2FnZS5vcHRpb25zLnRvLnJlcGxhY2UoLy0vZywgJyAnKSlcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGN1cnJlbnREYXRlID4gbWVzc2FnZS5vcHRpb25zLmZyb20gJiZcbiAgICAgIGN1cnJlbnREYXRlIDwgbWVzc2FnZS5vcHRpb25zLnRvXG4gICAgKSB7XG4gICAgICBpZiAobWVzc2FnZS5zaG93SWNvbiA9PT0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy50b2FzdHIudG9hc3RyQ29uZmlnLmljb25DbGFzc2VzW21lc3NhZ2VUeXBlXSA9XG4gICAgICAgICAgYHRvYXN0LSR7bWVzc2FnZVR5cGV9IHRvYXN0LW5vLWljb25gO1xuICAgICAgfVxuICAgICAgbWVzc2FnZSA9IHRoaXMuaGFuZGxlVGVtcGxhdGUobWVzc2FnZSk7XG5cbiAgICAgIGlmIChtZXNzYWdlLnRleHQpIHtcbiAgICAgICAgbGV0IG1lc3NhZ2VTaG93bjogQWN0aXZlVG9hc3Q8YW55PjtcbiAgICAgICAgc3dpdGNoIChtZXNzYWdlLnR5cGUpIHtcbiAgICAgICAgICBjYXNlIE1lc3NhZ2VUeXBlLlNVQ0NFU1M6XG4gICAgICAgICAgICBtZXNzYWdlU2hvd24gPSB0aGlzLnN1Y2Nlc3MoXG4gICAgICAgICAgICAgIG1lc3NhZ2UudGV4dCxcbiAgICAgICAgICAgICAgbWVzc2FnZS50aXRsZSxcbiAgICAgICAgICAgICAgbWVzc2FnZS5vcHRpb25zLFxuICAgICAgICAgICAgICBtZXNzYWdlLnRleHRJbnRlcnBvbGF0ZVBhcmFtcyxcbiAgICAgICAgICAgICAgbWVzc2FnZS50aXRsZUludGVycG9sYXRlUGFyYW1zXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBNZXNzYWdlVHlwZS5FUlJPUjpcbiAgICAgICAgICAgIG1lc3NhZ2VTaG93biA9IHRoaXMuZXJyb3IoXG4gICAgICAgICAgICAgIG1lc3NhZ2UudGV4dCxcbiAgICAgICAgICAgICAgbWVzc2FnZS50aXRsZSxcbiAgICAgICAgICAgICAgbWVzc2FnZS5vcHRpb25zLFxuICAgICAgICAgICAgICBtZXNzYWdlLnRleHRJbnRlcnBvbGF0ZVBhcmFtcyxcbiAgICAgICAgICAgICAgbWVzc2FnZS50aXRsZUludGVycG9sYXRlUGFyYW1zXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBNZXNzYWdlVHlwZS5JTkZPOlxuICAgICAgICAgICAgbWVzc2FnZVNob3duID0gdGhpcy5pbmZvKFxuICAgICAgICAgICAgICBtZXNzYWdlLnRleHQsXG4gICAgICAgICAgICAgIG1lc3NhZ2UudGl0bGUsXG4gICAgICAgICAgICAgIG1lc3NhZ2Uub3B0aW9ucyxcbiAgICAgICAgICAgICAgbWVzc2FnZS50ZXh0SW50ZXJwb2xhdGVQYXJhbXMsXG4gICAgICAgICAgICAgIG1lc3NhZ2UudGl0bGVJbnRlcnBvbGF0ZVBhcmFtc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgTWVzc2FnZVR5cGUuU0hPVzpcbiAgICAgICAgICAgIG1lc3NhZ2VTaG93biA9IHRoaXMuc2hvdyhcbiAgICAgICAgICAgICAgbWVzc2FnZS50ZXh0LFxuICAgICAgICAgICAgICBtZXNzYWdlLnRpdGxlLFxuICAgICAgICAgICAgICBtZXNzYWdlLm9wdGlvbnMsXG4gICAgICAgICAgICAgIG1lc3NhZ2UudGV4dEludGVycG9sYXRlUGFyYW1zLFxuICAgICAgICAgICAgICBtZXNzYWdlLnRpdGxlSW50ZXJwb2xhdGVQYXJhbXNcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIE1lc3NhZ2VUeXBlLkFMRVJUOlxuICAgICAgICAgIGNhc2UgTWVzc2FnZVR5cGUuV0FSTklORzpcbiAgICAgICAgICAgIG1lc3NhZ2VTaG93biA9IHRoaXMuYWxlcnQoXG4gICAgICAgICAgICAgIG1lc3NhZ2UudGV4dCxcbiAgICAgICAgICAgICAgbWVzc2FnZS50aXRsZSxcbiAgICAgICAgICAgICAgbWVzc2FnZS5vcHRpb25zLFxuICAgICAgICAgICAgICBtZXNzYWdlLnRleHRJbnRlcnBvbGF0ZVBhcmFtcyxcbiAgICAgICAgICAgICAgbWVzc2FnZS50aXRsZUludGVycG9sYXRlUGFyYW1zXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIG1lc3NhZ2VTaG93biA9IHRoaXMuaW5mbyhcbiAgICAgICAgICAgICAgbWVzc2FnZS50ZXh0LFxuICAgICAgICAgICAgICBtZXNzYWdlLnRpdGxlLFxuICAgICAgICAgICAgICBtZXNzYWdlLm9wdGlvbnMsXG4gICAgICAgICAgICAgIG1lc3NhZ2UudGV4dEludGVycG9sYXRlUGFyYW1zLFxuICAgICAgICAgICAgICBtZXNzYWdlLnRpdGxlSW50ZXJwb2xhdGVQYXJhbXNcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBtZXNzYWdlLm9wdGlvbnMuaWQgPSBtZXNzYWdlU2hvd24udG9hc3RJZDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzdWNjZXNzKFxuICAgIHRleHQ6IHN0cmluZyxcbiAgICB0aXRsZSA9ICdpZ28uY29yZS5tZXNzYWdlLnN1Y2Nlc3MnLFxuICAgIG9wdGlvbnM6IFBhcnRpYWw8SW5kaXZpZHVhbENvbmZpZz4gPSB7fSxcbiAgICB0ZXh0SW50ZXJwb2xhdGVQYXJhbXM/OiBvYmplY3QsXG4gICAgdGl0bGVJbnRlcnBvbGF0ZVBhcmFtcz86IG9iamVjdFxuICApOiBBY3RpdmVUb2FzdDxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5oYW5kbGVOZ3hUb2FzdHIoXG4gICAgICAnc3VjY2VzcycsXG4gICAgICB0ZXh0LFxuICAgICAgdGl0bGUsXG4gICAgICBvcHRpb25zLFxuICAgICAgdGV4dEludGVycG9sYXRlUGFyYW1zLFxuICAgICAgdGl0bGVJbnRlcnBvbGF0ZVBhcmFtc1xuICAgICk7XG4gIH1cblxuICBlcnJvcihcbiAgICB0ZXh0OiBzdHJpbmcsXG4gICAgdGl0bGUgPSAnaWdvLmNvcmUubWVzc2FnZS5lcnJvcicsXG4gICAgb3B0aW9uczogUGFydGlhbDxJbmRpdmlkdWFsQ29uZmlnPiA9IHt9LFxuICAgIHRleHRJbnRlcnBvbGF0ZVBhcmFtcz86IG9iamVjdCxcbiAgICB0aXRsZUludGVycG9sYXRlUGFyYW1zPzogb2JqZWN0XG4gICk6IEFjdGl2ZVRvYXN0PGFueT4ge1xuICAgIHJldHVybiB0aGlzLmhhbmRsZU5neFRvYXN0cihcbiAgICAgICdlcnJvcicsXG4gICAgICB0ZXh0LFxuICAgICAgdGl0bGUsXG4gICAgICBvcHRpb25zLFxuICAgICAgdGV4dEludGVycG9sYXRlUGFyYW1zLFxuICAgICAgdGl0bGVJbnRlcnBvbGF0ZVBhcmFtc1xuICAgICk7XG4gIH1cblxuICBpbmZvKFxuICAgIHRleHQ6IHN0cmluZyxcbiAgICB0aXRsZSA9ICdpZ28uY29yZS5tZXNzYWdlLmluZm8nLFxuICAgIG9wdGlvbnM6IFBhcnRpYWw8SW5kaXZpZHVhbENvbmZpZz4gPSB7fSxcbiAgICB0ZXh0SW50ZXJwb2xhdGVQYXJhbXM/OiBvYmplY3QsXG4gICAgdGl0bGVJbnRlcnBvbGF0ZVBhcmFtcz86IG9iamVjdFxuICApOiBBY3RpdmVUb2FzdDxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5oYW5kbGVOZ3hUb2FzdHIoXG4gICAgICAnaW5mbycsXG4gICAgICB0ZXh0LFxuICAgICAgdGl0bGUsXG4gICAgICBvcHRpb25zLFxuICAgICAgdGV4dEludGVycG9sYXRlUGFyYW1zLFxuICAgICAgdGl0bGVJbnRlcnBvbGF0ZVBhcmFtc1xuICAgICk7XG4gIH1cblxuICBhbGVydChcbiAgICB0ZXh0OiBzdHJpbmcsXG4gICAgdGl0bGUgPSAnaWdvLmNvcmUubWVzc2FnZS5hbGVydCcsXG4gICAgb3B0aW9uczogUGFydGlhbDxJbmRpdmlkdWFsQ29uZmlnPiA9IHt9LFxuICAgIHRleHRJbnRlcnBvbGF0ZVBhcmFtcz86IG9iamVjdCxcbiAgICB0aXRsZUludGVycG9sYXRlUGFyYW1zPzogb2JqZWN0XG4gICk6IEFjdGl2ZVRvYXN0PGFueT4ge1xuICAgIHJldHVybiB0aGlzLmhhbmRsZU5neFRvYXN0cihcbiAgICAgICdhbGVydCcsXG4gICAgICB0ZXh0LFxuICAgICAgdGl0bGUsXG4gICAgICBvcHRpb25zLFxuICAgICAgdGV4dEludGVycG9sYXRlUGFyYW1zLFxuICAgICAgdGl0bGVJbnRlcnBvbGF0ZVBhcmFtc1xuICAgICk7XG4gIH1cblxuICBzaG93KFxuICAgIHRleHQ6IHN0cmluZyxcbiAgICB0aXRsZSA9ICdpZ28uY29yZS5tZXNzYWdlLmluZm8nLFxuICAgIG9wdGlvbnM6IFBhcnRpYWw8SW5kaXZpZHVhbENvbmZpZz4gPSB7fSxcbiAgICB0ZXh0SW50ZXJwb2xhdGVQYXJhbXM/OiBvYmplY3QsXG4gICAgdGl0bGVJbnRlcnBvbGF0ZVBhcmFtcz86IG9iamVjdFxuICApOiBBY3RpdmVUb2FzdDxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5oYW5kbGVOZ3hUb2FzdHIoXG4gICAgICAnc2hvdycsXG4gICAgICB0ZXh0LFxuICAgICAgdGl0bGUsXG4gICAgICBvcHRpb25zLFxuICAgICAgdGV4dEludGVycG9sYXRlUGFyYW1zLFxuICAgICAgdGl0bGVJbnRlcnBvbGF0ZVBhcmFtc1xuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZU5neFRvYXN0cihcbiAgICB0eXBlOiAnYWxlcnQnIHwgJ2luZm8nIHwgJ2Vycm9yJyB8ICdzdWNjZXNzJyB8ICdzaG93JyxcbiAgICB0ZXh0OiBzdHJpbmcsXG4gICAgdGl0bGU6IHN0cmluZyxcbiAgICBvcHRpb25zOiBQYXJ0aWFsPEluZGl2aWR1YWxDb25maWc+ID0ge30sXG4gICAgdGV4dEludGVycG9sYXRlUGFyYW1zPzogb2JqZWN0LFxuICAgIHRpdGxlSW50ZXJwb2xhdGVQYXJhbXM/OiBvYmplY3RcbiAgKTogQWN0aXZlVG9hc3Q8YW55PiB7XG4gICAgY29uc3QgdHJhbnNsYXRlZFRleHRJbnRlcnBvbGF0ZVBhcmFtcyA9IHsgLi4udGV4dEludGVycG9sYXRlUGFyYW1zIH07XG4gICAgY29uc3QgdHJhbnNsYXRlZFRpdGxlbnRlcnBvbGF0ZVBhcmFtcyA9IHsgLi4udGl0bGVJbnRlcnBvbGF0ZVBhcmFtcyB9O1xuXG4gICAgaWYgKHRleHRJbnRlcnBvbGF0ZVBhcmFtcykge1xuICAgICAgT2JqZWN0LmtleXModGV4dEludGVycG9sYXRlUGFyYW1zKS5tYXAoKGspID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0ZXh0SW50ZXJwb2xhdGVQYXJhbXNba107XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgIHRyYW5zbGF0ZWRUZXh0SW50ZXJwb2xhdGVQYXJhbXNba10gPVxuICAgICAgICAgICAgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgICA/IHRoaXMubGFuZ3VhZ2VTZXJ2aWNlLnRyYW5zbGF0ZS5pbnN0YW50KHZhbHVlKVxuICAgICAgICAgICAgICA6IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKHRpdGxlSW50ZXJwb2xhdGVQYXJhbXMpIHtcbiAgICAgIE9iamVjdC5rZXlzKHRpdGxlSW50ZXJwb2xhdGVQYXJhbXMpLm1hcCgoaykgPT4ge1xuICAgICAgICBpZiAoaykge1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGl0bGVJbnRlcnBvbGF0ZVBhcmFtc1trXTtcbiAgICAgICAgICB0cmFuc2xhdGVkVGl0bGVudGVycG9sYXRlUGFyYW1zW2tdID1cbiAgICAgICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZydcbiAgICAgICAgICAgICAgPyB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudCh2YWx1ZSlcbiAgICAgICAgICAgICAgOiB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgbWVzc2FnZSA9IHRoaXMubGFuZ3VhZ2VTZXJ2aWNlLnRyYW5zbGF0ZS5pbnN0YW50KFxuICAgICAgdGV4dCxcbiAgICAgIHRyYW5zbGF0ZWRUZXh0SW50ZXJwb2xhdGVQYXJhbXNcbiAgICApO1xuICAgIGNvbnN0IHRyYW5zbGF0ZWRUaXRsZSA9IHRoaXMubGFuZ3VhZ2VTZXJ2aWNlLnRyYW5zbGF0ZS5pbnN0YW50KFxuICAgICAgdGl0bGUsXG4gICAgICB0cmFuc2xhdGVkVGl0bGVudGVycG9sYXRlUGFyYW1zXG4gICAgKTtcblxuICAgIGxldCBhY3RpdmVUb2FzdDtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgJ3N1Y2Nlc3MnOlxuICAgICAgICBhY3RpdmVUb2FzdCA9IHRoaXMudG9hc3RyLnN1Y2Nlc3MobWVzc2FnZSwgdHJhbnNsYXRlZFRpdGxlLCBvcHRpb25zKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdlcnJvcic6XG4gICAgICAgIGFjdGl2ZVRvYXN0ID0gdGhpcy50b2FzdHIuZXJyb3IobWVzc2FnZSwgdHJhbnNsYXRlZFRpdGxlLCBvcHRpb25zKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdzaG93JzpcbiAgICAgIGNhc2UgJ2luZm8nOlxuICAgICAgICBhY3RpdmVUb2FzdCA9IHRoaXMudG9hc3RyLmluZm8obWVzc2FnZSwgdHJhbnNsYXRlZFRpdGxlLCBvcHRpb25zKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdhbGVydCc6XG4gICAgICAgIGFjdGl2ZVRvYXN0ID0gdGhpcy50b2FzdHIud2FybmluZyhtZXNzYWdlLCB0cmFuc2xhdGVkVGl0bGUsIG9wdGlvbnMpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgdGhpcy5hY3RpdmVNZXNzYWdlVHJhbnNsYXRpb25zLnB1c2goe1xuICAgICAgaWQ6IGFjdGl2ZVRvYXN0LnRvYXN0SWQsXG4gICAgICB0aXRsZUtleTogdGl0bGUsXG4gICAgICB0ZXh0S2V5OiB0ZXh0LFxuICAgICAgdGV4dEludGVycG9sYXRlUGFyYW1zLFxuICAgICAgdGl0bGVJbnRlcnBvbGF0ZVBhcmFtc1xuICAgIH0pO1xuICAgIHJldHVybiBhY3RpdmVUb2FzdDtcbiAgfVxuXG4gIHJlbW92ZShpZD86IG51bWJlcikge1xuICAgIHRoaXMudG9hc3RyLnJlbW92ZShpZCk7XG4gIH1cblxuICByZW1vdmVBbGxBcmVOb3RFcnJvcigpIHtcbiAgICBmb3IgKGNvbnN0IG1lc3Mgb2YgdGhpcy5tZXNzYWdlcyQudmFsdWUpIHtcbiAgICAgIGlmIChtZXNzLnR5cGUgIT09IE1lc3NhZ2VUeXBlLkVSUk9SKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlKG1lc3Mub3B0aW9ucy5pZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVUZW1wbGF0ZShtZXNzYWdlOiBNZXNzYWdlKTogTWVzc2FnZSB7XG4gICAgaWYgKCF0aGlzLm9wdGlvbnM/LnRlbXBsYXRlIHx8IG1lc3NhZ2UuaHRtbCkge1xuICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuXG4gICAgbGV0IGh0bWwgPSB0aGlzLm9wdGlvbnM/LnRlbXBsYXRlO1xuICAgIGh0bWwgPSBodG1sLnJlcGxhY2UoJyR7dGV4dH0nLCBtZXNzYWdlLnRleHQpO1xuICAgIGh0bWwgPSBodG1sLnJlcGxhY2UoJyR7dGl0bGV9JywgbWVzc2FnZS50aXRsZSk7XG5cbiAgICBtZXNzYWdlLmh0bWwgPSB1bmRlZmluZWQ7XG4gICAgbWVzc2FnZS50ZXh0ID0gaHRtbDtcbiAgICBtZXNzYWdlLnRpdGxlID0gdW5kZWZpbmVkO1xuICAgIHJldHVybiBtZXNzYWdlO1xuICB9XG59XG4iXX0=