ngx-logger
Version:
[](https://www.npmjs.com/package/ngx-logger)
114 lines • 18.8 kB
JavaScript
import { Inject, Injectable, PLATFORM_ID } from '@angular/core';
import { isPlatformBrowser } from '@angular/common';
import { NgxLoggerLevel } from '../types/logger-level.enum';
import { DEFAULT_COLOR_SCHEME } from './color-scheme';
import * as i0 from "@angular/core";
export class NGXLoggerWriterService {
constructor(platformId) {
this.platformId = platformId;
/** List of functions called when preparing meta string */
this.prepareMetaStringFuncs = [
this.getTimestampToWrite,
this.getLevelToWrite,
this.getFileDetailsToWrite,
this.getContextToWrite,
];
this.isIE = isPlatformBrowser(platformId) && navigator && navigator.userAgent &&
!!(navigator.userAgent.indexOf('MSIE') !== -1 || navigator.userAgent.match(/Trident\//) || navigator.userAgent.match(/Edge\//));
this.logFunc = this.isIE ? this.logIE.bind(this) : this.logModern.bind(this);
}
getTimestampToWrite(metadata, config) {
return metadata.timestamp;
}
getLevelToWrite(metadata, config) {
return NgxLoggerLevel[metadata.level];
}
getFileDetailsToWrite(metadata, config) {
return config.disableFileDetails === true ? '' : `[${metadata.fileName}:${metadata.lineNumber}:${metadata.columnNumber}]`;
}
getContextToWrite(metadata, config) {
return config.context ? `{${config.context}}` : '';
}
/** Generate a "meta" string that is displayed before the content sent to the log function */
prepareMetaString(metadata, config) {
let metaString = '';
this.prepareMetaStringFuncs.forEach(prepareMetaStringFunc => {
const metaItem = prepareMetaStringFunc(metadata, config);
if (metaItem) {
metaString = metaString + ' ' + metaItem;
}
});
return metaString.trim();
}
/** Get the color to use when writing to console */
getColor(metadata, config) {
const configColorScheme = config.colorScheme ?? DEFAULT_COLOR_SCHEME;
// this is needed to avoid a build error
if (metadata.level === NgxLoggerLevel.OFF) {
return undefined;
}
return configColorScheme[metadata.level];
}
/** Log to the console specifically for IE */
logIE(metadata, config, metaString) {
// Coloring doesn't work in IE
// make sure additional isn't null or undefined so that ...additional doesn't error
const additional = metadata.additional || [];
switch (metadata.level) {
case NgxLoggerLevel.WARN:
console.warn(`${metaString} `, metadata.message, ...additional);
break;
case NgxLoggerLevel.ERROR:
case NgxLoggerLevel.FATAL:
console.error(`${metaString} `, metadata.message, ...additional);
break;
case NgxLoggerLevel.INFO:
console.info(`${metaString} `, metadata.message, ...additional);
break;
default:
console.log(`${metaString} `, metadata.message, ...additional);
}
}
/** Log to the console */
logModern(metadata, config, metaString) {
const color = this.getColor(metadata, config);
// make sure additional isn't null or undefined so that ...additional doesn't error
const additional = metadata.additional || [];
switch (metadata.level) {
case NgxLoggerLevel.WARN:
console.warn(`%c${metaString}`, `color:${color}`, metadata.message, ...additional);
break;
case NgxLoggerLevel.ERROR:
case NgxLoggerLevel.FATAL:
console.error(`%c${metaString}`, `color:${color}`, metadata.message, ...additional);
break;
case NgxLoggerLevel.INFO:
console.info(`%c${metaString}`, `color:${color}`, metadata.message, ...additional);
break;
// Disabling console.trace since the stack trace is not helpful. it is showing the stack trace of
// the console.trace statement
// case NgxLoggerLevel.TRACE:
// console.trace(`%c${metaString}`, `color:${color}`, message, ...additional);
// break;
case NgxLoggerLevel.DEBUG:
console.debug(`%c${metaString}`, `color:${color}`, metadata.message, ...additional);
break;
default:
console.log(`%c${metaString}`, `color:${color}`, metadata.message, ...additional);
}
}
/** Write the content sent to the log function to the console */
writeMessage(metadata, config) {
const metaString = this.prepareMetaString(metadata, config);
this.logFunc(metadata, config, metaString);
}
}
/** @nocollapse */ /** @nocollapse */ NGXLoggerWriterService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: NGXLoggerWriterService, deps: [{ token: PLATFORM_ID }], target: i0.ɵɵFactoryTarget.Injectable });
/** @nocollapse */ /** @nocollapse */ NGXLoggerWriterService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: NGXLoggerWriterService });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: NGXLoggerWriterService, decorators: [{
type: Injectable
}], ctorParameters: function () { return [{ type: undefined, decorators: [{
type: Inject,
args: [PLATFORM_ID]
}] }]; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3JpdGVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL3dyaXRlci93cml0ZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFJaEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzVELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDOztBQUd0RCxNQUFNLE9BQU8sc0JBQXNCO0lBYWpDLFlBQ2lDLFVBQVU7UUFBVixlQUFVLEdBQVYsVUFBVSxDQUFBO1FBVDNDLDBEQUEwRDtRQUNoRCwyQkFBc0IsR0FBMkU7WUFDekcsSUFBSSxDQUFDLG1CQUFtQjtZQUN4QixJQUFJLENBQUMsZUFBZTtZQUNwQixJQUFJLENBQUMscUJBQXFCO1lBQzFCLElBQUksQ0FBQyxpQkFBaUI7U0FDdkIsQ0FBQztRQUtBLElBQUksQ0FBQyxJQUFJLEdBQUcsaUJBQWlCLENBQUMsVUFBVSxDQUFDLElBQUksU0FBUyxJQUFJLFNBQVMsQ0FBQyxTQUFTO1lBQzNFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFFbEksSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFB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QUMsR0FBRyxDQUFDLEtBQUssVUFBVSxFQUFFLEVBQUUsU0FBUyxLQUFLLEVBQUUsRUFBRSxRQUFRLENBQUMsT0FBTyxFQUFFLEdBQUcsVUFBVSxDQUFDLENBQUM7U0FDckY7SUFDSCxDQUFDO0lBRUQsZ0VBQWdFO0lBQ3pELFlBQVksQ0FBQyxRQUE0QixFQUFFLE1BQXdCO1FBQ3hFLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFFNUQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQzdDLENBQUM7O3lKQTFIVSxzQkFBc0Isa0JBY3ZCLFdBQVc7NkpBZFYsc0JBQXNCOzJGQUF0QixzQkFBc0I7a0JBRGxDLFVBQVU7OzBCQWVOLE1BQU07MkJBQUMsV0FBVyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgUExBVEZPUk1fSUQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgSU5HWExvZ2dlck1ldGFkYXRhIH0gZnJvbSAnLi4vbWV0YWRhdGEvaW1ldGFkYXRhJztcclxuaW1wb3J0IHsgSU5HWExvZ2dlckNvbmZpZyB9IGZyb20gJy4uL2NvbmZpZy9pY29uZmlnJztcclxuaW1wb3J0IHsgSU5HWExvZ2dlcldyaXRlclNlcnZpY2UgfSBmcm9tICcuL2l3cml0ZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IGlzUGxhdGZvcm1Ccm93c2VyIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgTmd4TG9nZ2VyTGV2ZWwgfSBmcm9tICcuLi90eXBlcy9sb2dnZXItbGV2ZWwuZW51bSc7XHJcbmltcG9ydCB7IERFRkFVTFRfQ09MT1JfU0NIRU1FIH0gZnJvbSAnLi9jb2xvci1zY2hlbWUnO1xyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgTkdYTG9nZ2VyV3JpdGVyU2VydmljZSBpbXBsZW1lbnRzIElOR1hMb2dnZXJXcml0ZXJTZXJ2aWNlIHtcclxuXHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGlzSUU6IGJvb2xlYW47XHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGxvZ0Z1bmM6IChtZXRhZGF0YTogSU5HWExvZ2dlck1ldGFkYXRhLCBjb25maWc6IElOR1hMb2dnZXJDb25maWcsIG1ldGFTdHJpbmc6IHN0cmluZykgPT4gdm9pZDtcclxuXHJcbiAgLyoqIExpc3Qgb2YgZnVuY3Rpb25zIGNhbGxlZCB3aGVuIHByZXBhcmluZyBtZXRhIHN0cmluZyAqL1xyXG4gIHByb3RlY3RlZCBwcmVwYXJlTWV0YVN0cmluZ0Z1bmNzOiAoKG1ldGFkYXRhOiBJTkdYTG9nZ2VyTWV0YWRhdGEsIGNvbmZpZzogSU5HWExvZ2dlckNvbmZpZykgPT4gc3RyaW5nKVtdID0gW1xyXG4gICAgdGhpcy5nZXRUaW1lc3RhbXBUb1dyaXRlLFxyXG4gICAgdGhpcy5nZXRMZXZlbFRvV3JpdGUsXHJcbiAgICB0aGlzLmdldEZpbGVEZXRhaWxzVG9Xcml0ZSxcclxuICAgIHRoaXMuZ2V0Q29udGV4dFRvV3JpdGUsXHJcbiAgXTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBASW5qZWN0KFBMQVRGT1JNX0lEKSBwcm90ZWN0ZWQgcGxhdGZvcm1JZCxcclxuICApIHtcclxuICAgIHRoaXMuaXNJRSA9IGlzUGxhdGZvcm1Ccm93c2VyKHBsYXRmb3JtSWQpICYmIG5hdmlnYXRvciAmJiBuYXZpZ2F0b3IudXNlckFnZW50ICYmXHJcbiAgICAgICEhKG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignTVNJRScpICE9PSAtMSB8fCBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9UcmlkZW50XFwvLykgfHwgbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvRWRnZVxcLy8pKTtcclxuXHJcbiAgICB0aGlzLmxvZ0Z1bmMgPSB0aGlzLmlzSUUgPyB0aGlzLmxvZ0lFLmJpbmQodGhpcykgOiB0aGlzLmxvZ01vZGVybi5iaW5kKHRoaXMpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGdldFRpbWVzdGFtcFRvV3JpdGUobWV0YWRhdGE6IElOR1hMb2dnZXJNZXRhZGF0YSwgY29uZmlnOiBJTkdYTG9nZ2VyQ29uZmlnKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBtZXRhZGF0YS50aW1lc3RhbXA7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZ2V0TGV2ZWxUb1dyaXRlKG1ldGFkYXRhOiBJTkdYTG9nZ2VyTWV0YWRhdGEsIGNvbmZpZzogSU5HWExvZ2dlckNvbmZpZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gTmd4TG9nZ2VyTGV2ZWxbbWV0YWRhdGEubGV2ZWxdO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGdldEZpbGVEZXRhaWxzVG9Xcml0ZShtZXRhZGF0YTogSU5HWExvZ2dlck1ldGFkYXRhLCBjb25maWc6IElOR1hMb2dnZXJDb25maWcpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIGNvbmZpZy5kaXNhYmxlRmlsZURldGFpbHMgPT09IHRydWUgPyAnJyA6IGBbJHttZXRhZGF0YS5maWxlTmFtZX06JHttZXRhZGF0YS5saW5lTnVtYmVyfToke21ldGFkYXRhLmNvbHVtbk51bWJlcn1dYDtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBnZXRDb250ZXh0VG9Xcml0ZShtZXRhZGF0YTogSU5HWExvZ2dlck1ldGFkYXRhLCBjb25maWc6IElOR1hMb2dnZXJDb25maWcpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIGNvbmZpZy5jb250ZXh0ID8gYHske2NvbmZpZy5jb250ZXh0fX1gIDogJyc7XHJcbiAgfVxyXG5cclxuICAvKiogR2VuZXJhdGUgYSBcIm1ldGFcIiBzdHJpbmcgdGhhdCBpcyBkaXNwbGF5ZWQgYmVmb3JlIHRoZSBjb250ZW50IHNlbnQgdG8gdGhlIGxvZyBmdW5jdGlvbiAqL1xyXG4gIHByb3RlY3RlZCBwcmVwYXJlTWV0YVN0cmluZyhtZXRhZGF0YTogSU5HWExvZ2dlck1ldGFkYXRhLCBjb25maWc6IElOR1hMb2dnZXJDb25maWcpOiBzdHJpbmcge1xyXG4gICAgbGV0IG1ldGFTdHJpbmcgPSAnJztcclxuICAgIHRoaXMucHJlcGFyZU1ldGFTdHJpbmdGdW5jcy5mb3JFYWNoKHByZXBhcmVNZXRhU3RyaW5nRnVuYyA9PiB7XHJcbiAgICAgIGNvbnN0IG1ldGFJdGVtID0gcHJlcGFyZU1ldGFTdHJpbmdGdW5jKG1ldGFkYXRhLCBjb25maWcpO1xyXG4gICAgICBpZiAobWV0YUl0ZW0pIHtcclxuICAgICAgICBtZXRhU3RyaW5nID0gbWV0YVN0cmluZyArICcgJyArIG1ldGFJdGVtO1xyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gICAgcmV0dXJuIG1ldGFTdHJpbmcudHJpbSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqIEdldCB0aGUgY29sb3IgdG8gdXNlIHdoZW4gd3JpdGluZyB0byBjb25zb2xlICovXHJcbiAgcHJvdGVjdGVkIGdldENvbG9yKG1ldGFkYXRhOiBJTkdYTG9nZ2VyTWV0YWRhdGEsIGNvbmZpZzogSU5HWExvZ2dlckNvbmZpZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XHJcbiAgICBjb25zdCBjb25maWdDb2xvclNjaGVtZSA9IGNvbmZpZy5jb2xvclNjaGVtZSA/PyBERUZBVUxUX0NPTE9SX1NDSEVNRTtcclxuXHJcbiAgICAvLyB0aGlzIGlzIG5lZWRlZCB0byBhdm9pZCBhIGJ1aWxkIGVycm9yXHJcbiAgICBpZiAobWV0YWRhdGEubGV2ZWwgPT09IE5neExvZ2dlckxldmVsLk9GRikge1xyXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNvbmZpZ0NvbG9yU2NoZW1lW21ldGFkYXRhLmxldmVsXTtcclxuICB9XHJcblxyXG4gIC8qKiBMb2cgdG8gdGhlIGNvbnNvbGUgc3BlY2lmaWNhbGx5IGZvciBJRSAqL1xyXG4gIHByb3RlY3RlZCBsb2dJRShtZXRhZGF0YTogSU5HWExvZ2dlck1ldGFkYXRhLCBjb25maWc6IElOR1hMb2dnZXJDb25maWcsIG1ldGFTdHJpbmc6IHN0cmluZyk6IHZvaWQge1xyXG5cclxuICAgIC8vIENvbG9yaW5nIGRvZXNuJ3Qgd29yayBpbiBJRVxyXG5cclxuICAgIC8vIG1ha2Ugc3VyZSBhZGRpdGlvbmFsIGlzbid0IG51bGwgb3IgdW5kZWZpbmVkIHNvIHRoYXQgLi4uYWRkaXRpb25hbCBkb2Vzbid0IGVycm9yXHJcbiAgICBjb25zdCBhZGRpdGlvbmFsID0gbWV0YWRhdGEuYWRkaXRpb25hbCB8fCBbXTtcclxuXHJcbiAgICBzd2l0Y2ggKG1ldGFkYXRhLmxldmVsKSB7XHJcbiAgICAgIGNhc2UgTmd4TG9nZ2VyTGV2ZWwuV0FSTjpcclxuICAgICAgICBjb25zb2xlLndhcm4oYCR7bWV0YVN0cmluZ30gYCwgbWV0YWRhdGEubWVzc2FnZSwgLi4uYWRkaXRpb25hbCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgTmd4TG9nZ2VyTGV2ZWwuRVJST1I6XHJcbiAgICAgIGNhc2UgTmd4TG9nZ2VyTGV2ZWwuRkFUQUw6XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihgJHttZXRhU3RyaW5nfSBgLCBtZXRhZGF0YS5tZXNzYWdlLCAuLi5hZGRpdGlvbmFsKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBOZ3hMb2dnZXJMZXZlbC5JTkZPOlxyXG4gICAgICAgIGNvbnNvbGUuaW5mbyhgJHttZXRhU3RyaW5nfSBgLCBtZXRhZGF0YS5tZXNzYWdlLCAuLi5hZGRpdGlvbmFsKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBjb25zb2xlLmxvZyhgJHttZXRhU3RyaW5nfSBgLCBtZXRhZGF0YS5tZXNzYWdlLCAuLi5hZGRpdGlvbmFsKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBMb2cgdG8gdGhlIGNvbnNvbGUgKi9cclxuICBwcm90ZWN0ZWQgbG9nTW9kZXJuKG1ldGFkYXRhOiBJTkdYTG9nZ2VyTWV0YWRhdGEsIGNvbmZpZzogSU5HWExvZ2dlckNvbmZpZywgbWV0YVN0cmluZzogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBjb25zdCBjb2xvciA9IHRoaXMuZ2V0Q29sb3IobWV0YWRhdGEsIGNvbmZpZyk7XHJcblxyXG4gICAgLy8gbWFrZSBzdXJlIGFkZGl0aW9uYWwgaXNuJ3QgbnVsbCBvciB1bmRlZmluZWQgc28gdGhhdCAuLi5hZGRpdGlvbmFsIGRvZXNuJ3QgZXJyb3JcclxuICAgIGNvbnN0IGFkZGl0aW9uYWwgPSBtZXRhZGF0YS5hZGRpdGlvbmFsIHx8IFtdO1xyXG5cclxuICAgIHN3aXRjaCAobWV0YWRhdGEubGV2ZWwpIHtcclxuICAgICAgY2FzZSBOZ3hMb2dnZXJMZXZlbC5XQVJOOlxyXG4gICAgICAgIGNvbnNvbGUud2FybihgJWMke21ldGFTdHJpbmd9YCwgYGNvbG9yOiR7Y29sb3J9YCwgbWV0YWRhdGEubWVzc2FnZSwgLi4uYWRkaXRpb25hbCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgTmd4TG9nZ2VyTGV2ZWwuRVJST1I6XHJcbiAgICAgIGNhc2UgTmd4TG9nZ2VyTGV2ZWwuRkFUQUw6XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihgJWMke21ldGFTdHJpbmd9YCwgYGNvbG9yOiR7Y29sb3J9YCwgbWV0YWRhdGEubWVzc2FnZSwgLi4uYWRkaXRpb25hbCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgTmd4TG9nZ2VyTGV2ZWwuSU5GTzpcclxuICAgICAgICBjb25zb2xlLmluZm8oYCVjJHttZXRhU3RyaW5nfWAsIGBjb2xvcjoke2NvbG9yfWAsIG1ldGFkYXRhLm1lc3NhZ2UsIC4uLmFkZGl0aW9uYWwpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICAvLyAgRGlzYWJsaW5nIGNvbnNvbGUudHJhY2Ugc2luY2UgdGhlIHN0YWNrIHRyYWNlIGlzIG5vdCBoZWxwZnVsLiBpdCBpcyBzaG93aW5nIHRoZSBzdGFjayB0cmFjZSBvZlxyXG4gICAgICAvLyB0aGUgY29uc29sZS50cmFjZSBzdGF0ZW1lbnRcclxuICAgICAgLy8gY2FzZSBOZ3hMb2dnZXJMZXZlbC5UUkFDRTpcclxuICAgICAgLy8gICBjb25zb2xlLnRyYWNlKGAlYyR7bWV0YVN0cmluZ31gLCBgY29sb3I6JHtjb2xvcn1gLCBtZXNzYWdlLCAuLi5hZGRpdGlvbmFsKTtcclxuICAgICAgLy8gICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgTmd4TG9nZ2VyTGV2ZWwuREVCVUc6XHJcbiAgICAgICAgY29uc29sZS5kZWJ1ZyhgJWMke21ldGFTdHJpbmd9YCwgYGNvbG9yOiR7Y29sb3J9YCwgbWV0YWRhdGEubWVzc2FnZSwgLi4uYWRkaXRpb25hbCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgY29uc29sZS5sb2coYCVjJHttZXRhU3RyaW5nfWAsIGBjb2xvcjoke2NvbG9yfWAsIG1ldGFkYXRhLm1lc3NhZ2UsIC4uLmFkZGl0aW9uYWwpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIFdyaXRlIHRoZSBjb250ZW50IHNlbnQgdG8gdGhlIGxvZyBmdW5jdGlvbiB0byB0aGUgY29uc29sZSAqL1xyXG4gIHB1YmxpYyB3cml0ZU1lc3NhZ2UobWV0YWRhdGE6IElOR1hMb2dnZXJNZXRhZGF0YSwgY29uZmlnOiBJTkdYTG9nZ2VyQ29uZmlnKTogdm9pZCB7XHJcbiAgICBjb25zdCBtZXRhU3RyaW5nID0gdGhpcy5wcmVwYXJlTWV0YVN0cmluZyhtZXRhZGF0YSwgY29uZmlnKTtcclxuXHJcbiAgICB0aGlzLmxvZ0Z1bmMobWV0YWRhdGEsIGNvbmZpZywgbWV0YVN0cmluZyk7XHJcbiAgfVxyXG59XHJcbiJdfQ==