UNPKG

@ng-log/log4a

Version:

A powerful and customizable logging library for Angular application.

164 lines 22.4 kB
import { HttpClient } from '@angular/common/http'; import { Injectable } from '@angular/core'; import { AppenderService } from './appender-impl.service'; import * as i0 from "@angular/core"; import * as i1 from "./appender-impl.service"; import * as i2 from "@angular/common/http"; const PUBLISHERS_FILE = 'assets/logging-config.json'; export class Log4a { constructor(appenderService, http) { this.appenderService = appenderService; this.http = http; // tslint:disable-next-line: no-use-before-declare this.level = LogLevel.All; this.logWithDate = true; this.abstractAppenders = appenderService.appenders; } async loadConfigs() { const loggerOption = this.appenderService.getQueryParams('logger-option'); if (loggerOption !== '') { this.appenderService.loadRuntimeConfig(); } else { this.http .get(PUBLISHERS_FILE).subscribe((res) => { this.appenderService.loadConfig(res); }); } } debug(msg, ...optionalParams) { // tslint:disable-next-line: no-use-before-declare this.writeToLog(msg, LogLevel.Debug, optionalParams); } info(msg, ...optionalParams) { // tslint:disable-next-line: no-use-before-declare this.writeToLog(msg, LogLevel.Info, optionalParams); } warn(msg, ...optionalParams) { // tslint:disable-next-line: no-use-before-declare this.writeToLog(msg, LogLevel.Warn, optionalParams); } error(msg, ...optionalParams) { // tslint:disable-next-line: no-use-before-declare this.writeToLog(msg, LogLevel.Error, optionalParams); } fatal(msg, ...optionalParams) { // tslint:disable-next-line: no-use-before-declare this.writeToLog(msg, LogLevel.Fatal, optionalParams); } log(msg, ...optionalParams) { // tslint:disable-next-line: no-use-before-declare this.writeToLog(msg, LogLevel.All, optionalParams); } clear() { for (const logger of this.abstractAppenders) { logger.clear().subscribe((response) => console.log(response)); } } shouldLog(level) { let ret = false; if ( // tslint:disable-next-line: no-use-before-declare (level >= this.level && level !== LogLevel.Off) || // tslint:disable-next-line: no-use-before-declare this.level === LogLevel.All) { ret = true; } return ret; } writeToLog(msg, level, params) { if (this.shouldLog(level)) { // Declare variables // tslint:disable-next-line: no-use-before-declare const entry = new LogEntry(); // Build Log Entry entry.message = msg; entry.level = level; entry.extraInfo = params; entry.logWithDate = this.logWithDate; for (const logger of this.abstractAppenders) { logger.log(entry); // .subscribe(response => console.log(response)); } } } } /** @nocollapse */ Log4a.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: Log4a, deps: [{ token: i1.AppenderService }, { token: i2.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable }); /** @nocollapse */ Log4a.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: Log4a }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: Log4a, decorators: [{ type: Injectable }], ctorParameters: function () { return [{ type: i1.AppenderService }, { type: i2.HttpClient }]; } }); export var LogLevel; (function (LogLevel) { LogLevel[LogLevel["All"] = 0] = "All"; LogLevel[LogLevel["Debug"] = 1] = "Debug"; LogLevel[LogLevel["Info"] = 2] = "Info"; LogLevel[LogLevel["Warn"] = 3] = "Warn"; LogLevel[LogLevel["Error"] = 4] = "Error"; LogLevel[LogLevel["Fatal"] = 5] = "Fatal"; LogLevel[LogLevel["Off"] = 6] = "Off"; })(LogLevel || (LogLevel = {})); export class LogEntry { constructor() { // Public Properties this.entryDate = new Date(); this.message = ''; this.level = LogLevel.Debug; this.extraInfo = []; this.logWithDate = true; } // ************** // Public Methods // ************** buildLogString() { let value = ''; if (this.logWithDate) { value = new Date() + ''; } // value += "Type: " + LogLevel[this.level]; value += ' - Message: ' + this.message; if (this.extraInfo.length) { value += ' - Extra Info: ' + this.formatParams(this.extraInfo); } switch (LogLevel[this.level]) { case 'Debug': // tslint:disable-next-line: no-console console.debug('%c Type: [' + LogLevel[this.level] + ']%c' + value, ' border-bottom-color: blue; background: blue; color: white; display: block; font-weight: bold;', 'background: white;border-bottom: 1px solid blue; font-weight: 900;color:blue'); break; case 'Info': // tslint:disable-next-line: no-console console.info('%c Type: [' + LogLevel[this.level] + ']%c' + value, ' border-bottom-color: blue; background: blue; color: white; display: block; font-weight: bold;', 'background: white;border-bottom:1px solid blue; font-weight: 900;color:blue'); break; case 'Warn': console.warn('%c Type: [' + LogLevel[this.level] + ']%c' + value, ' border-bottom-color: black; background: orange; color: white; display: block; font-weight: bold;', 'background: white;border-bottom: 1px solid orange; font-weight: 900; '); break; case 'Error': console.error('%c Type: [' + LogLevel[this.level] + ']%c' + value, ' border-bottom-color: white; background: red; color: white; display: block; font-weight: bold;', 'background: ;border-bottom: 1px solid red; font-weight: 900; color:red'); break; case 'Fatal': console.error('%c Type: [' + LogLevel[this.level] + ']%c' + value, ' border-bottom-color: white; background: red; color: white; display: block; font-weight: bold;', 'background: ;border-bottom: 1px solid red; font-weight: 900; color:red'); break; case 'All': // tslint:disable-next-line: no-console console.info('%c Type: [' + LogLevel[this.level] + ']%c' + value, ' border-bottom-color: blue; background: blue; color: white; display: block; font-weight: bold;', 'background: white;border-bottom: 1px solid blue; font-weight: 900;color:blue'); break; } // return value; } // *************** // Private Methods // *************** formatParams(params) { let ret = params.join(','); // Is there at least one object in the array? if (params.some(p => typeof p === 'object')) { ret = ''; // Build comma-delimited string for (const item of params) { ret += JSON.stringify(item) + ','; } } return ret; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nNGEuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWxvZy9sb2c0YS9zcmMvbGliL2xvZzRhLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ2hELE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHlCQUF5QixDQUFDOzs7O0FBRTFELE1BQU0sZUFBZSxHQUFHLDRCQUE0QixDQUFDO0FBR3JELE1BQU0sT0FBTyxLQUFLO0lBS2hCLFlBQ1MsZUFBZ0MsRUFDaEMsSUFBZ0I7UUFEaEIsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBQ2hDLFNBQUksR0FBSixJQUFJLENBQVk7UUFMekIsa0RBQWtEO1FBQ2xELFVBQUssR0FBYSxRQUFRLENBQUMsR0FBRyxDQUFDO1FBQy9CLGdCQUFXLEdBQUcsSUFBSSxDQUFDO1FBS2pCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxlQUFlLENBQUMsU0FBUyxDQUFDO0lBQ3JELENBQUM7SUFFRCxLQUFLLENBQUMsV0FBVztRQUNmLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsY0FBYyxDQUN0RCxlQUFlLENBQ2hCLENBQUM7UUFDRixJQUFJLFlBQVksS0FBSyxFQUFFLEVBQUU7WUFDdkIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1NBQzFDO2FBQU07WUFDTCxJQUFJLENBQUMsSUFBSTtpQkFDTixHQUFHLENBQXNCLGVBQWUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsRUFBQyxFQUFFO2dCQUMxRCxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN2QyxDQUFDLENBQUMsQ0FBQTtTQUNMO0lBQ0gsQ0FBQztJQUVE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QyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxRQUFRLENBQUMsRUFBRTtZQUMzQyxHQUFHLEdBQUcsRUFBRSxDQUFDO1lBQ1QsK0JBQStCO1lBQy9CLEtBQUssTUFBTSxJQUFJLElBQUksTUFBTSxFQUFFO2dCQUN6QixHQUFHLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUM7YUFDbkM7U0FDRjtRQUVELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtIdHRwQ2xpZW50fSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQge0luamVjdGFibGV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQXBwZW5kZXJTZXJ2aWNlIH0gZnJvbSAnLi9hcHBlbmRlci1pbXBsLnNlcnZpY2UnO1xuaW1wb3J0IHsgQWJzdHJhY3RMb2dnZXIsIExvZ0FwcGVuZGVyQ29uZmlnIH0gZnJvbSAnLi9sb2c0YS5tb2RlbCc7XG5jb25zdCBQVUJMSVNIRVJTX0ZJTEUgPSAnYXNzZXRzL2xvZ2dpbmctY29uZmlnLmpzb24nO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgTG9nNGEge1xuICBhYnN0cmFjdEFwcGVuZGVyczogQWJzdHJhY3RMb2dnZXJbXTtcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby11c2UtYmVmb3JlLWRlY2xhcmVcbiAgbGV2ZWw6IExvZ0xldmVsID0gTG9nTGV2ZWwuQWxsO1xuICBsb2dXaXRoRGF0ZSA9IHRydWU7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBhcHBlbmRlclNlcnZpY2U6IEFwcGVuZGVyU2VydmljZSxcbiAgICBwdWJsaWMgaHR0cDogSHR0cENsaWVudFxuICApIHtcbiAgICB0aGlzLmFic3RyYWN0QXBwZW5kZXJzID0gYXBwZW5kZXJTZXJ2aWNlLmFwcGVuZGVycztcbiAgfVxuXG4gIGFzeW5jIGxvYWRDb25maWdzKCkge1xuICAgIGNvbnN0IGxvZ2dlck9wdGlvbiA9IHRoaXMuYXBwZW5kZXJTZXJ2aWNlLmdldFF1ZXJ5UGFyYW1zKFxuICAgICAgJ2xvZ2dlci1vcHRpb24nXG4gICAgKTtcbiAgICBpZiAobG9nZ2VyT3B0aW9uICE9PSAnJykge1xuICAgICAgdGhpcy5hcHBlbmRlclNlcnZpY2UubG9hZFJ1bnRpbWVDb25maWcoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5odHRwXG4gICAgICAgIC5nZXQ8TG9nQXBwZW5kZXJDb25maWdbXT4oUFVCTElTSEVSU19GSUxFKS5zdWJzY3JpYmUoKHJlcyk9PiB7XG4gICAgICAgICAgdGhpcy5hcHBlbmRlclNlcnZpY2UubG9hZENvbmZpZyhyZXMpO1xuICAgICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGRlYnVnKG1zZzogc3RyaW5nLCAuLi5vcHRpb25hbFBhcmFtczogYW55W10pIHtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVzZS1iZWZvcmUtZGVjbGFyZVxuICAgIHRoaXMud3JpdGVUb0xvZyhtc2csIExvZ0xldmVsLkRlYnVnLCBvcHRpb25hbFBhcmFtcyk7XG4gIH1cblxuICBpbmZvKG1zZzogc3RyaW5nLCAuLi5vcHRpb25hbFBhcmFtczogYW55W10pIHtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVzZS1iZWZvcmUtZGVjbGFyZVxuICAgIHRoaXMud3JpdGVUb0xvZyhtc2csIExvZ0xldmVsLkluZm8sIG9wdGlvbmFsUGFyYW1zKTtcbiAgfVxuXG4gIHdhcm4obXNnOiBzdHJpbmcsIC4uLm9wdGlvbmFsUGFyYW1zOiBhbnlbXSkge1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdXNlLWJlZm9yZS1kZWNsYXJlXG4gICAgdGhpcy53cml0ZVRvTG9nKG1zZywgTG9nTGV2ZWwuV2Fybiwgb3B0aW9uYWxQYXJhbXMpO1xuICB9XG5cbiAgZXJyb3IobXNnOiBzdHJpbmcsIC4uLm9wdGlvbmFsUGFyYW1zOiBhbnlbXSkge1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdXNlLWJlZm9yZS1kZWNsYXJlXG4gICAgdGhpcy53cml0ZVRvTG9nKG1zZywgTG9nTGV2ZWwuRXJyb3IsIG9wdGlvbmFsUGFyYW1zKTtcbiAgfVxuXG4gIGZhdGFsKG1zZzogc3RyaW5nLCAuLi5vcHRpb25hbFBhcmFtczogYW55W10pIHtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVzZS1iZWZvcmUtZGVjbGFyZVxuICAgIHRoaXMud3JpdGVUb0xvZyhtc2csIExvZ0xldmVsLkZhdGFsLCBvcHRpb25hbFBhcmFtcyk7XG4gIH1cblxuICBsb2cobXNnOiBzdHJpbmcsIC4uLm9wdGlvbmFsUGFyYW1zOiBhbnlbXSkge1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdXNlLWJlZm9yZS1kZWNsYXJlXG4gICAgdGhpcy53cml0ZVRvTG9nKG1zZywgTG9nTGV2ZWwuQWxsLCBvcHRpb25hbFBhcmFtcyk7XG4gIH1cblxuICBjbGVhcigpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGxvZ2dlciBvZiB0aGlzLmFic3RyYWN0QXBwZW5kZXJzKSB7XG4gICAgICBsb2dnZXIuY2xlYXIoKS5zdWJzY3JpYmUoKHJlc3BvbnNlOiBhbnkpID0+IGNvbnNvbGUubG9nKHJlc3BvbnNlKSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzaG91bGRMb2cobGV2ZWw6IExvZ0xldmVsKTogYm9vbGVhbiB7XG4gICAgbGV0IHJldCA9IGZhbHNlO1xuXG4gICAgaWYgKFxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby11c2UtYmVmb3JlLWRlY2xhcmVcbiAgICAgIChsZXZlbCA+PSB0aGlzLmxldmVsICYmIGxldmVsICE9PSBMb2dMZXZlbC5PZmYpIHx8XG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVzZS1iZWZvcmUtZGVjbGFyZVxuICAgICAgdGhpcy5sZXZlbCA9PT0gTG9nTGV2ZWwuQWxsXG4gICAgKSB7XG4gICAgICByZXQgPSB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICBwcml2YXRlIHdyaXRlVG9Mb2cobXNnOiBzdHJpbmcsIGxldmVsOiBMb2dMZXZlbCwgcGFyYW1zOiBhbnlbXSkge1xuICAgIGlmICh0aGlzLnNob3VsZExvZyhsZXZlbCkpIHtcbiAgICAgIC8vIERlY2xhcmUgdmFyaWFibGVzXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVzZS1iZWZvcmUtZGVjbGFyZVxuICAgICAgY29uc3QgZW50cnk6IExvZ0VudHJ5ID0gbmV3IExvZ0VudHJ5KCk7XG5cbiAgICAgIC8vIEJ1aWxkIExvZyBFbnRyeVxuICAgICAgZW50cnkubWVzc2FnZSA9IG1zZztcbiAgICAgIGVudHJ5LmxldmVsID0gbGV2ZWw7XG4gICAgICBlbnRyeS5leHRyYUluZm8gPSBwYXJhbXM7XG4gICAgICBlbnRyeS5sb2dXaXRoRGF0ZSA9IHRoaXMubG9nV2l0aERhdGU7XG5cbiAgICAgIGZvciAoY29uc3QgbG9nZ2VyIG9mIHRoaXMuYWJzdHJhY3RBcHBlbmRlcnMpIHtcbiAgICAgICAgbG9nZ2VyLmxvZyhlbnRyeSk7XG4gICAgICAgIC8vIC5zdWJzY3JpYmUocmVzcG9uc2UgPT4gY29uc29sZS5sb2cocmVzcG9uc2UpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGVudW0gTG9nTGV2ZWwge1xuICBBbGwgPSAwLFxuICBEZWJ1ZyA9IDEsXG4gIEluZm8gPSAyLFxuICBXYXJuID0gMyxcbiAgRXJyb3IgPSA0LFxuICBGYXRhbCA9IDUsXG4gIE9mZiA9IDZcbn1cblxuZXhwb3J0IGNsYXNzIExvZ0VudHJ5IHtcbiAgLy8gUHVibGljIFByb3BlcnRpZXNcbiAgZW50cnlEYXRlOiBEYXRlID0gbmV3IERhdGUoKTtcbiAgbWVzc2FnZSA9ICcnO1xuICBsZXZlbDogTG9nTGV2ZWwgPSBMb2dMZXZlbC5EZWJ1ZztcbiAgZXh0cmFJbmZvOiBhbnlbXSA9IFtdO1xuICBsb2dXaXRoRGF0ZSA9IHRydWU7XG5cbiAgLy8gKioqKioqKioqKioqKipcbiAgLy8gUHVibGljIE1ldGhvZHNcbiAgLy8gKioqKioqKioqKioqKipcbiAgYnVpbGRMb2dTdHJpbmcoKTogdm9pZCB7XG4gICAgbGV0IHZhbHVlID0gJyc7XG5cbiAgICBpZiAodGhpcy5sb2dXaXRoRGF0ZSkge1xuICAgICAgdmFsdWUgPSBuZXcgRGF0ZSgpICsgJyc7XG4gICAgfVxuICAgIC8vIHZhbHVlICs9IFwiVHlwZTogXCIgKyBMb2dMZXZlbFt0aGlzLmxldmVsXTtcbiAgICB2YWx1ZSArPSAnIC0gTWVzc2FnZTogJyArIHRoaXMubWVzc2FnZTtcbiAgICBpZiAodGhpcy5leHRyYUluZm8ubGVuZ3RoKSB7XG4gICAgICB2YWx1ZSArPSAnIC0gRXh0cmEgSW5mbzogJyArIHRoaXMuZm9ybWF0UGFyYW1zKHRoaXMuZXh0cmFJbmZvKTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKExvZ0xldmVsW3RoaXMubGV2ZWxdKSB7XG4gICAgICBjYXNlICdEZWJ1Zyc6XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tY29uc29sZVxuICAgICAgICBjb25zb2xlLmRlYnVnKFxuICAgICAgICAgICclYyBUeXBlOiBbJyArIExvZ0xldmVsW3RoaXMubGV2ZWxdICsgJ10lYycgKyB2YWx1ZSxcbiAgICAgICAgICAnICBib3JkZXItYm90dG9tLWNvbG9yOiBibHVlOyBiYWNrZ3JvdW5kOiBibHVlOyBjb2xvcjogd2hpdGU7IGRpc3BsYXk6IGJsb2NrOyBmb250LXdlaWdodDogYm9sZDsnLFxuICAgICAgICAgICdiYWNrZ3JvdW5kOiB3aGl0ZTtib3JkZXItYm90dG9tOiAxcHggc29saWQgYmx1ZTsgZm9udC13ZWlnaHQ6IDkwMDtjb2xvcjpibHVlJ1xuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0luZm8nOlxuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWNvbnNvbGVcbiAgICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICAgICclYyBUeXBlOiBbJyArIExvZ0xldmVsW3RoaXMubGV2ZWxdICsgJ10lYycgKyB2YWx1ZSxcbiAgICAgICAgICAnICBib3JkZXItYm90dG9tLWNvbG9yOiBibHVlOyBiYWNrZ3JvdW5kOiBibHVlOyBjb2xvcjogd2hpdGU7IGRpc3BsYXk6IGJsb2NrOyBmb250LXdlaWdodDogYm9sZDsnLFxuICAgICAgICAgICdiYWNrZ3JvdW5kOiB3aGl0ZTtib3JkZXItYm90dG9tOjFweCBzb2xpZCBibHVlOyBmb250LXdlaWdodDogOTAwO2NvbG9yOmJsdWUnXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnV2Fybic6XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAnJWMgVHlwZTogWycgKyBMb2dMZXZlbFt0aGlzLmxldmVsXSArICddJWMnICsgdmFsdWUsXG4gICAgICAgICAgJyAgYm9yZGVyLWJvdHRvbS1jb2xvcjogYmxhY2s7IGJhY2tncm91bmQ6IG9yYW5nZTsgY29sb3I6IHdoaXRlOyBkaXNwbGF5OiBibG9jazsgZm9udC13ZWlnaHQ6IGJvbGQ7JyxcbiAgICAgICAgICAnYmFja2dyb3VuZDogd2hpdGU7Ym9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIG9yYW5nZTsgZm9udC13ZWlnaHQ6IDkwMDsgJ1xuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0Vycm9yJzpcbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAnJWMgVHlwZTogWycgKyBMb2dMZXZlbFt0aGlzLmxldmVsXSArICddJWMnICsgdmFsdWUsXG4gICAgICAgICAgJyAgYm9yZGVyLWJvdHRvbS1jb2xvcjogd2hpdGU7IGJhY2tncm91bmQ6IHJlZDsgY29sb3I6IHdoaXRlOyBkaXNwbGF5OiBibG9jazsgZm9udC13ZWlnaHQ6IGJvbGQ7JyxcbiAgICAgICAgICAnYmFja2dyb3VuZDogIDtib3JkZXItYm90dG9tOiAxcHggc29saWQgcmVkOyBmb250LXdlaWdodDogOTAwOyBjb2xvcjpyZWQnXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnRmF0YWwnOlxuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICclYyBUeXBlOiBbJyArIExvZ0xldmVsW3RoaXMubGV2ZWxdICsgJ10lYycgKyB2YWx1ZSxcbiAgICAgICAgICAnICBib3JkZXItYm90dG9tLWNvbG9yOiB3aGl0ZTsgYmFja2dyb3VuZDogcmVkOyBjb2xvcjogd2hpdGU7IGRpc3BsYXk6IGJsb2NrOyBmb250LXdlaWdodDogYm9sZDsnLFxuICAgICAgICAgICdiYWNrZ3JvdW5kOiAgO2JvcmRlci1ib3R0b206IDFweCBzb2xpZCByZWQ7IGZvbnQtd2VpZ2h0OiA5MDA7IGNvbG9yOnJlZCdcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdBbGwnOlxuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWNvbnNvbGVcbiAgICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICAgICclYyBUeXBlOiBbJyArIExvZ0xldmVsW3RoaXMubGV2ZWxdICsgJ10lYycgKyB2YWx1ZSxcbiAgICAgICAgICAnICBib3JkZXItYm90dG9tLWNvbG9yOiBibHVlOyBiYWNrZ3JvdW5kOiBibHVlOyBjb2xvcjogd2hpdGU7IGRpc3BsYXk6IGJsb2NrOyBmb250LXdlaWdodDogYm9sZDsnLFxuICAgICAgICAgICdiYWNrZ3JvdW5kOiB3aGl0ZTtib3JkZXItYm90dG9tOiAxcHggc29saWQgYmx1ZTsgZm9udC13ZWlnaHQ6IDkwMDtjb2xvcjpibHVlJ1xuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICAvLyByZXR1cm4gdmFsdWU7XG4gIH1cblxuICAvLyAqKioqKioqKioqKioqKipcbiAgLy8gUHJpdmF0ZSBNZXRob2RzXG4gIC8vICoqKioqKioqKioqKioqKlxuICBwcml2YXRlIGZvcm1hdFBhcmFtcyhwYXJhbXM6IGFueVtdKTogc3RyaW5nIHtcbiAgICBsZXQgcmV0OiBzdHJpbmcgPSBwYXJhbXMuam9pbignLCcpO1xuXG4gICAgLy8gSXMgdGhlcmUgYXQgbGVhc3Qgb25lIG9iamVjdCBpbiB0aGUgYXJyYXk/XG4gICAgaWYgKHBhcmFtcy5zb21lKHAgPT4gdHlwZW9mIHAgPT09ICdvYmplY3QnKSkge1xuICAgICAgcmV0ID0gJyc7XG4gICAgICAvLyBCdWlsZCBjb21tYS1kZWxpbWl0ZWQgc3RyaW5nXG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgcGFyYW1zKSB7XG4gICAgICAgIHJldCArPSBKU09OLnN0cmluZ2lmeShpdGVtKSArICcsJztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmV0O1xuICB9XG59XG4iXX0=