@dotglitch/ngx-common
Version:
Angular components and utilities that are commonly used.
205 lines โข 27.2 kB
JavaScript
export const sleep = ms => new Promise(r => setTimeout(r, ms));
/**
* Prompt the user to save a json file of the given object.
*/
export const saveObjectAsFile = (name, data) => {
const a = document.createElement("a");
const file = new Blob([JSON.stringify(data)], { type: "application/json" });
a.href = URL.createObjectURL(file);
a.download = name;
a.click();
a.remove();
};
/**
* Construct an emoticon with any unicode icon you specify
*/
export class Emoticon {
constructor(icon) {
this.icon = icon;
}
}
/**
* authorization ๐ \
* navigation ๐งญ \
* user ๐ชช \
* security ๐ก \
* system ๐ฅ \
* toolbox ๐งฐ \
* chore โ \
* config ๐ \
* renderer ๐ \
* package ๐ฆ \
* time โณ \
* download ๐ฅ \
* upload ๐ค \
* bug ๐ฆ \
* bomb ๐ฃ \
* tnt ๐งจ \
* warning โ ๏ธ \
* chart ๐ \
* chart_up ๐ \
* chart_down ๐ \
* circle_red ๐ด \
* circle_orange ๐ \
* circle_yellow ๐ก \
* circle_green ๐ข \
* circle_blue ๐ต \
* circle_violet ๐ฃ \
* circle_black โซ๏ธ \
* circle_white โช๏ธ \
* circle_brown ๐ค \
* square_red ๐ฅ \
* square_orange ๐ง \
* square_yellow ๐จ \
* square_green ๐ฉ \
* square_blue ๐ฆ \
* square_violet ๐ช \
* square_black โฌ๏ธ \
* square_white โฌ๏ธ \
* square_brown ๐ซ
*/
export const LogIcon = {
authorization: new Emoticon("๐"),
navigation: new Emoticon("๐งญ"),
user: new Emoticon("๐ชช"),
security: new Emoticon("๐ก"),
system: new Emoticon("๐ฅ"),
toolbox: new Emoticon("๐งฐ"),
chore: new Emoticon("โ"),
config: new Emoticon("๐ "),
renderer: new Emoticon("๐"),
package: new Emoticon("๐ฆ"),
time: new Emoticon("โณ"),
download: new Emoticon("๐ฅ"),
upload: new Emoticon("๐ค"),
bug: new Emoticon("๐ฆ "),
bomb: new Emoticon("๐ฃ"),
tnt: new Emoticon("๐งจ"),
stop: new Emoticon("๐"),
police: new Emoticon("๐จ"),
rocket: new Emoticon("๐"),
warning: new Emoticon("โ ๏ธ"),
chart: new Emoticon("๐"),
chart_up: new Emoticon("๐"),
chart_down: new Emoticon("๐"),
circle_red: new Emoticon("๐ด"),
circle_orange: new Emoticon("๐ "),
circle_yellow: new Emoticon("๐ก"),
circle_green: new Emoticon("๐ข"),
circle_blue: new Emoticon("๐ต"),
circle_violet: new Emoticon("๐ฃ"),
circle_black: new Emoticon("โซ๏ธ"),
circle_white: new Emoticon("โช๏ธ"),
circle_brown: new Emoticon("๐ค"),
square_red: new Emoticon("๐ฅ"),
square_orange: new Emoticon("๐ง"),
square_yellow: new Emoticon("๐จ"),
square_green: new Emoticon("๐ฉ"),
square_blue: new Emoticon("๐ฆ"),
square_violet: new Emoticon("๐ช"),
square_black: new Emoticon("โฌ๏ธ"),
square_white: new Emoticon("โฌ๏ธ"),
square_brown: new Emoticon("๐ซ")
};
class Log {
constructor(context, contextColor, textColor) {
this.context = context;
this.contextColor = contextColor;
this.textColor = textColor;
// Force the bindings to stay intact with overloads.
this.log = this.log.bind(this);
this.warn = this.warn.bind(this);
this.err = this.err.bind(this);
this.error = this.error.bind(this);
}
log(iconOrMessage, messageText, ...args) {
if (iconOrMessage instanceof Emoticon) {
console.log(`${iconOrMessage.icon} %c[${this.context}] %c${messageText}`, 'color: ' + this.contextColor, 'color: ' + this.textColor, ...args);
}
else {
console.log(`%c[${this.context}] %c${iconOrMessage}`, 'color: ' + this.contextColor, 'color: ' + this.textColor, ...args);
}
}
warn(iconOrMessage, messageText, ...args) {
if (iconOrMessage instanceof Emoticon) {
console.warn(`${iconOrMessage.icon} %c[${this.context}] %c${messageText}`, 'color: ' + this.contextColor, 'color: ' + this.textColor, ...args);
}
else {
console.warn(`%c[${this.context}] %c${iconOrMessage}`, 'color: ' + this.contextColor, 'color: ' + this.textColor, ...args);
}
}
err(iconOrMessage, messageText, ...args) {
if (iconOrMessage instanceof Emoticon) {
console.error(`${iconOrMessage.icon} %c[${this.context}] %c${messageText}`, 'color: ' + this.contextColor, 'color: ' + this.textColor, ...args);
}
else {
console.error(`%c[${this.context}] %c${iconOrMessage}`, 'color: ' + this.contextColor, 'color: ' + this.textColor, ...args);
}
}
error(iconOrMessage, messageText, ...args) {
// @ts-ignore
this.err(iconOrMessage, messageText, ...args);
}
}
/**
* Formatted logger that will print a bit of context before the message.
* @returns
*/
export const ConsoleLogger = (context, contextColor, textColor = "#03a9f4") => new Log(context, contextColor, textColor);
/**
* Convert a string `fooBAR baz_160054''"1]"` into a slug: `foobar-baz-1600541`
*/
export const stringToSlug = (text) => (text || '')
.trim()
.toLowerCase()
.replace(/[\-_+ ]/g, '-')
.replace(/[^a-z0-9\-\/]/g, '');
/**
* Helper to update the page URL.
* @param page component page ID to load.
* @param data string or JSON data for query params.
*/
export const updateUrl = (page, data = {}, replaceState = false) => {
const [oldHash, qstring] = location.hash.split('?');
if (!page)
page = oldHash.split('/')[1];
const hash = `#/${page}`;
// Convert the data object to JSON.
if (data instanceof URLSearchParams) {
data = [...data.entries()].map(([k, v]) => ({ [k]: v })).reduce((a, b) => ({ ...a, ...b }), {});
}
const query = new URLSearchParams(data);
const prevParams = new URLSearchParams(qstring);
// If the hash is the same, retain params.
if (hash == oldHash) {
replaceState = true;
for (const [key, value] of prevParams.entries())
if (!query.has(key))
query.set(key, prevParams.get(key));
}
for (const [key, val] of query.entries()) {
if (val == null ||
val == undefined ||
val == '' ||
val == 'null' ||
Number.isNaN(val) ||
val == 'NaN')
query.delete(key);
}
if (!(hash.toLowerCase() == "#/frame") || data['id'] == -1)
query.delete('id');
const strQuery = query.toString();
console.log(data, hash, strQuery);
if (replaceState) {
window.history.replaceState(data, '', hash + (strQuery ? ('?' + strQuery) : ''));
}
else {
window.history.pushState(data, '', hash + (strQuery ? ('?' + strQuery) : ''));
}
};
export const getUrlData = (source = window.location.hash) => {
const [hash, query] = source.split('?');
let data = new URLSearchParams(query);
return [...data.entries()].map(([k, v]) => ({ [k]: v })).reduce((a, b) => ({ ...a, ...b }), {});
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21tb24vc3JjL3V0aWxzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBRS9EOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxJQUFZLEVBQUUsSUFBWSxFQUFFLEVBQUU7SUFDM0QsTUFBTSxDQUFDLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN0QyxNQUFNLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxrQkFBa0IsRUFBRSxDQUFDLENBQUM7SUFDNUUsQ0FBQyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ25DLENBQUMsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO0lBQ2xCLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNWLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztBQUNmLENBQUMsQ0FBQztBQUVGOztHQUVHO0FBQ0gsTUFBTSxPQUFPLFFBQVE7SUFDakIsWUFBb0IsSUFBWTtRQUFaLFNBQUksR0FBSixJQUFJLENBQVE7SUFBRSxDQUFDO0NBQ3RDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXVDRztBQUNILE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRztJQUNuQixhQUFhLEVBQUUsSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDO0lBQ2pDLFVBQVUsRUFB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b25zdCBzbGVlcCA9IG1zID0+IG5ldyBQcm9taXNlKHIgPT4gc2V0VGltZW91dChyLCBtcykpO1xuXG4vKipcbiAqIFByb21wdCB0aGUgdXNlciB0byBzYXZlIGEganNvbiBmaWxlIG9mIHRoZSBnaXZlbiBvYmplY3QuXG4gKi9cbmV4cG9ydCBjb25zdCBzYXZlT2JqZWN0QXNGaWxlID0gKG5hbWU6IHN0cmluZywgZGF0YTogT2JqZWN0KSA9PiB7XG4gICAgY29uc3QgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJhXCIpO1xuICAgIGNvbnN0IGZpbGUgPSBuZXcgQmxvYihbSlNPTi5zdHJpbmdpZnkoZGF0YSldLCB7IHR5cGU6IFwiYXBwbGljYXRpb24vanNvblwiIH0pO1xuICAgIGEuaHJlZiA9IFVSTC5jcmVhdGVPYmplY3RVUkwoZmlsZSk7XG4gICAgYS5kb3dubG9hZCA9IG5hbWU7XG4gICAgYS5jbGljaygpO1xuICAgIGEucmVtb3ZlKCk7XG59O1xuXG4vKipcbiAqIENvbnN0cnVjdCBhbiBlbW90aWNvbiB3aXRoIGFueSB1bmljb2RlIGljb24geW91IHNwZWNpZnlcbiAqL1xuZXhwb3J0IGNsYXNzIEVtb3RpY29uIHtcbiAgICBjb25zdHJ1Y3RvciAocHVibGljIGljb246IHN0cmluZyl7fVxufVxuXG4vKipcbiAqIGF1dGhvcml6YXRpb24g8J+UkCBcXFxuICogbmF2aWdhdGlvbiDwn6etIFxcXG4gKiB1c2VyIPCfqqogXFxcbiAqIHNlY3VyaXR5IPCfm6EgXFxcbiAqIHN5c3RlbSDwn5alIFxcXG4gKiB0b29sYm94IPCfp7AgXFxcbiAqIGNob3JlIOKamSBcXFxuICogY29uZmlnIPCfm6AgXFxcbiAqIHJlbmRlcmVyIPCfk5AgXFxcbiAqIHBhY2thZ2Ug8J+TpiBcXFxuICogdGltZSDij7MgXFxcbiAqIGRvd25sb2FkIPCfk6UgXFxcbiAqIHVwbG9hZCDwn5OkIFxcXG4gKiBidWcg8J+moCBcXFxuICogYm9tYiDwn5KjIFxcXG4gKiB0bnQg8J+nqCBcXFxuICogd2FybmluZyDimqDvuI8gXFxcbiAqIGNoYXJ0IPCfk4ogXFxcbiAqIGNoYXJ0X3VwIPCfk4ggXFxcbiAqIGNoYXJ0X2Rvd24g8J+TiSBcXFxuICogY2lyY2xlX3JlZCDwn5S0IFxcXG4gKiBjaXJjbGVfb3JhbmdlIPCfn6AgXFxcbiAqIGNpcmNsZV95ZWxsb3cg8J+foSBcXFxuICogY2lyY2xlX2dyZWVuIPCfn6IgXFxcbiAqIGNpcmNsZV9ibHVlIPCflLUgXFxcbiAqIGNpcmNsZV92aW9sZXQg8J+foyBcXFxuICogY2lyY2xlX2JsYWNrIOKaq++4jyBcXFxuICogY2lyY2xlX3doaXRlIOKaqu+4jyBcXFxuICogY2lyY2xlX2Jyb3duIPCfn6QgXFxcbiAqIHNxdWFyZV9yZWQg8J+fpSBcXFxuICogc3F1YXJlX29yYW5nZSDwn5+nIFxcXG4gKiBzcXVhcmVfeWVsbG93IPCfn6ggXFxcbiAqIHNxdWFyZV9ncmVlbiDwn5+pIFxcXG4gKiBzcXVhcmVfYmx1ZSDwn5+mIFxcXG4gKiBzcXVhcmVfdmlvbGV0IPCfn6ogXFxcbiAqIHNxdWFyZV9ibGFjayDirJvvuI8gXFxcbiAqIHNxdWFyZV93aGl0ZSDirJzvuI8gXFxcbiAqIHNxdWFyZV9icm93biDwn5+rXG4gKi9cbmV4cG9ydCBjb25zdCBMb2dJY29uID0ge1xuICAgIGF1dGhvcml6YXRpb246IG5ldyBFbW90aWNvbihcIvCflJBcIiksXG4gICAgbmF2aWdhdGlvbjogbmV3IEVtb3RpY29uKFwi8J+nrVwiKSxcbiAgICB1c2VyOiBuZXcgRW1vdGljb24oXCLwn6qqXCIpLFxuICAgIHNlY3VyaXR5OiBuZXcgRW1vdGljb24oXCLwn5uhXCIpLFxuICAgIHN5c3RlbTogbmV3IEVtb3RpY29uKFwi8J+WpVwiKSxcbiAgICB0b29sYm94OiBuZXcgRW1vdGljb24oXCLwn6ewXCIpLFxuICAgIGNob3JlOiBuZXcgRW1vdGljb24oXCLimplcIiksXG4gICAgY29uZmlnOiBuZXcgRW1vdGljb24oXCLwn5ugXCIpLFxuICAgIHJlbmRlcmVyOiBuZXcgRW1vdGljb24oXCLwn5OQXCIpLFxuICAgIHBhY2thZ2U6IG5ldyBFbW90aWNvbihcIvCfk6ZcIiksXG4gICAgdGltZTogbmV3IEVtb3RpY29uKFwi4o+zXCIpLFxuICAgIGRvd25sb2FkOiBuZXcgRW1vdGljb24oXCLwn5OlXCIpLFxuICAgIHVwbG9hZDogbmV3IEVtb3RpY29uKFwi8J+TpFwiKSxcbiAgICBidWc6IG5ldyBFbW90aWNvbihcIvCfpqBcIiksXG4gICAgYm9tYjogbmV3IEVtb3RpY29uKFwi8J+So1wiKSxcbiAgICB0bnQ6IG5ldyBFbW90aWNvbihcIvCfp6hcIiksXG4gICAgc3RvcDogbmV3IEVtb3RpY29uKFwi8J+bkVwiKSxcbiAgICBwb2xpY2U6IG5ldyBFbW90aWNvbihcIvCfmqhcIiksXG4gICAgcm9ja2V0OiBuZXcgRW1vdGljb24oXCLwn5qAXCIpLFxuICAgIHdhcm5pbmc6IG5ldyBFbW90aWNvbihcIuKaoO+4j1wiKSxcbiAgICBjaGFydDogbmV3IEVtb3RpY29uKFwi8J+TilwiKSxcbiAgICBjaGFydF91cDogbmV3IEVtb3RpY29uKFwi8J+TiFwiKSxcbiAgICBjaGFydF9kb3duOiBuZXcgRW1vdGljb24oXCLwn5OJXCIpLFxuXG4gICAgY2lyY2xlX3JlZDogbmV3IEVtb3RpY29uKFwi8J+UtFwiKSxcbiAgICBjaXJjbGVfb3JhbmdlOiBuZXcgRW1vdGljb24oXCLwn5+gXCIpLFxuICAgIGNpcmNsZV95ZWxsb3c6IG5ldyBFbW90aWNvbihcIvCfn6FcIiksXG4gICAgY2lyY2xlX2dyZWVuOiBuZXcgRW1vdGljb24oXCLwn5+iXCIpLFxuICAgIGNpcmNsZV9ibHVlOiBuZXcgRW1vdGljb24oXCLwn5S1XCIpLFxuICAgIGNpcmNsZV92aW9sZXQ6IG5ldyBFbW90aWNvbihcIvCfn6NcIiksXG4gICAgY2lyY2xlX2JsYWNrOiBuZXcgRW1vdGljb24oXCLimqvvuI9cIiksXG4gICAgY2lyY2xlX3doaXRlOiBuZXcgRW1vdGljb24oXCLimqrvuI9cIiksXG4gICAgY2lyY2xlX2Jyb3duOiBuZXcgRW1vdGljb24oXCLwn5+kXCIpLFxuICAgIHNxdWFyZV9yZWQ6IG5ldyBFbW90aWNvbihcIvCfn6VcIiksXG4gICAgc3F1YXJlX29yYW5nZTogbmV3IEVtb3RpY29uKFwi8J+fp1wiKSxcbiAgICBzcXVhcmVfeWVsbG93OiBuZXcgRW1vdGljb24oXCLwn5+oXCIpLFxuICAgIHNxdWFyZV9ncmVlbjogbmV3IEVtb3RpY29uKFwi8J+fqVwiKSxcbiAgICBzcXVhcmVfYmx1ZTogbmV3IEVtb3RpY29uKFwi8J+fplwiKSxcbiAgICBzcXVhcmVfdmlvbGV0OiBuZXcgRW1vdGljb24oXCLwn5+qXCIpLFxuICAgIHNxdWFyZV9ibGFjazogbmV3IEVtb3RpY29uKFwi4qyb77iPXCIpLFxuICAgIHNxdWFyZV93aGl0ZTogbmV3IEVtb3RpY29uKFwi4qyc77iPXCIpLFxuICAgIHNxdWFyZV9icm93bjogbmV3IEVtb3RpY29uKFwi8J+fq1wiKVxufVxuXG5jbGFzcyBMb2cge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIGNvbnRleHQ6IHN0cmluZyxcbiAgICAgICAgcHJpdmF0ZSBjb250ZXh0Q29sb3I6IHN0cmluZyxcbiAgICAgICAgcHJpdmF0ZSB0ZXh0Q29sb3I6IHN0cmluZ1xuICAgICkge1xuICAgICAgICAvLyBGb3JjZSB0aGUgYmluZGluZ3MgdG8gc3RheSBpbnRhY3Qgd2l0aCBvdmVybG9hZHMuXG4gICAgICAgIHRoaXMubG9nID0gdGhpcy5sb2cuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy53YXJuID0gdGhpcy53YXJuLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuZXJyID0gdGhpcy5lcnIuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5lcnJvciA9IHRoaXMuZXJyb3IuYmluZCh0aGlzKTtcbiAgICB9XG5cbiAgICBsb2coaWNvbjogRW1vdGljb24sIG1lc3NhZ2U6IHN0cmluZywgLi4uYXJncylcbiAgICBsb2cobWVzc2FnZTogc3RyaW5nLCAuLi5hcmdzKVxuICAgIGxvZyhpY29uT3JNZXNzYWdlOiBFbW90aWNvbiB8IHN0cmluZywgbWVzc2FnZVRleHQ6IHN0cmluZywgLi4uYXJncykge1xuICAgICAgICBpZiAoaWNvbk9yTWVzc2FnZSBpbnN0YW5jZW9mIEVtb3RpY29uKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgJHtpY29uT3JNZXNzYWdlLmljb259ICVjWyR7dGhpcy5jb250ZXh0fV0gJWMke21lc3NhZ2VUZXh0fWAsICdjb2xvcjogJyArIHRoaXMuY29udGV4dENvbG9yLCAnY29sb3I6ICcgKyB0aGlzLnRleHRDb2xvciwgLi4uYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgJWNbJHt0aGlzLmNvbnRleHR9XSAlYyR7aWNvbk9yTWVzc2FnZX1gLCAnY29sb3I6ICcgKyB0aGlzLmNvbnRleHRDb2xvciwgJ2NvbG9yOiAnICsgdGhpcy50ZXh0Q29sb3IsIC4uLmFyZ3MpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgd2FybihpY29uOiBFbW90aWNvbiwgbWVzc2FnZTogc3RyaW5nLCAuLi5hcmdzKVxuICAgIHdhcm4obWVzc2FnZTogc3RyaW5nLCAuLi5hcmdzKVxuICAgIHdhcm4oaWNvbk9yTWVzc2FnZTogRW1vdGljb24gfCBzdHJpbmcsIG1lc3NhZ2VUZXh0OiBzdHJpbmcsIC4uLmFyZ3MpIHtcbiAgICAgICAgaWYgKGljb25Pck1lc3NhZ2UgaW5zdGFuY2VvZiBFbW90aWNvbikge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGAke2ljb25Pck1lc3NhZ2UuaWNvbn0gJWNbJHt0aGlzLmNvbnRleHR9XSAlYyR7bWVzc2FnZVRleHR9YCwgJ2NvbG9yOiAnICsgdGhpcy5jb250ZXh0Q29sb3IsICdjb2xvcjogJyArIHRoaXMudGV4dENvbG9yLCAuLi5hcmdzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgJWNbJHt0aGlzLmNvbnRleHR9XSAlYyR7aWNvbk9yTWVzc2FnZX1gLCAnY29sb3I6ICcgKyB0aGlzLmNvbnRleHRDb2xvciwgJ2NvbG9yOiAnICsgdGhpcy50ZXh0Q29sb3IsIC4uLmFyZ3MpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZXJyKGljb246IEVtb3RpY29uLCBtZXNzYWdlOiBzdHJpbmcsIC4uLmFyZ3MpXG4gICAgZXJyKG1lc3NhZ2U6IHN0cmluZywgLi4uYXJncylcbiAgICBlcnIoaWNvbk9yTWVzc2FnZTogRW1vdGljb24gfCBzdHJpbmcsIG1lc3NhZ2VUZXh0OiBzdHJpbmcsIC4uLmFyZ3MpIHtcbiAgICAgICAgaWYgKGljb25Pck1lc3NhZ2UgaW5zdGFuY2VvZiBFbW90aWNvbikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgJHtpY29uT3JNZXNzYWdlLmljb259ICVjWyR7dGhpcy5jb250ZXh0fV0gJWMke21lc3NhZ2VUZXh0fWAsICdjb2xvcjogJyArIHRoaXMuY29udGV4dENvbG9yLCAnY29sb3I6ICcgKyB0aGlzLnRleHRDb2xvciwgLi4uYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGAlY1ske3RoaXMuY29udGV4dH1dICVjJHtpY29uT3JNZXNzYWdlfWAsICdjb2xvcjogJyArIHRoaXMuY29udGV4dENvbG9yLCAnY29sb3I6ICcgKyB0aGlzLnRleHRDb2xvciwgLi4uYXJncyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBlcnJvcihpY29uOiBFbW90aWNvbiwgbWVzc2FnZTogc3RyaW5nLCAuLi5hcmdzKVxuICAgIGVycm9yKG1lc3NhZ2U6IHN0cmluZywgLi4uYXJncylcbiAgICBlcnJvcihpY29uT3JNZXNzYWdlOiBFbW90aWNvbiB8IHN0cmluZywgbWVzc2FnZVRleHQ6IHN0cmluZywgLi4uYXJncykge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHRoaXMuZXJyKGljb25Pck1lc3NhZ2UsIG1lc3NhZ2VUZXh0LCAuLi5hcmdzKTtcbiAgICB9XG59XG5cbi8qKlxuICogRm9ybWF0dGVkIGxvZ2dlciB0aGF0IHdpbGwgcHJpbnQgYSBiaXQgb2YgY29udGV4dCBiZWZvcmUgdGhlIG1lc3NhZ2UuXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgY29uc3QgQ29uc29sZUxvZ2dlciA9IChjb250ZXh0OiBzdHJpbmcsIGNvbnRleHRDb2xvcjogc3RyaW5nLCB0ZXh0Q29sb3I6IHN0cmluZyA9IFwiIzAzYTlmNFwiKSA9PlxuICAgIG5ldyBMb2coY29udGV4dCwgY29udGV4dENvbG9yLCB0ZXh0Q29sb3IpO1xuXG4vKipcbiAqIENvbnZlcnQgYSBzdHJpbmcgYGZvb0JBUiBiYXpfMTYwMDU0JydcIjFdXCJgIGludG8gYSBzbHVnOiBgZm9vYmFyLWJhei0xNjAwNTQxYFxuICovXG5leHBvcnQgY29uc3Qgc3RyaW5nVG9TbHVnID0gKHRleHQ6IHN0cmluZykgPT5cbiAgICAodGV4dCB8fCAnJylcbiAgICAgICAgLnRyaW0oKVxuICAgICAgICAudG9Mb3dlckNhc2UoKVxuICAgICAgICAucmVwbGFjZSgvW1xcLV8rIF0vZywgJy0nKVxuICAgICAgICAucmVwbGFjZSgvW15hLXowLTlcXC1cXC9dL2csICcnKTtcblxuXG4vKipcbiogSGVscGVyIHRvIHVwZGF0ZSB0aGUgcGFnZSBVUkwuXG4qIEBwYXJhbSBwYWdlIGNvbXBvbmVudCBwYWdlIElEIHRvIGxvYWQuXG4qIEBwYXJhbSBkYXRhIHN0cmluZyBvciBKU09OIGRhdGEgZm9yIHF1ZXJ5IHBhcmFtcy5cbiovXG5leHBvcnQgY29uc3QgdXBkYXRlVXJsID0gKHBhZ2U/OiBzdHJpbmcsIGRhdGE6IHN0cmluZyB8IHN0cmluZ1tdW10gfCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXI+IHwgVVJMU2VhcmNoUGFyYW1zID0ge30sIHJlcGxhY2VTdGF0ZSA9IGZhbHNlKSA9PiB7XG4gICAgY29uc3QgW29sZEhhc2gsIHFzdHJpbmddID0gbG9jYXRpb24uaGFzaC5zcGxpdCgnPycpO1xuXG4gICAgaWYgKCFwYWdlKVxuICAgICAgICBwYWdlID0gb2xkSGFzaC5zcGxpdCgnLycpWzFdO1xuXG4gICAgY29uc3QgaGFzaCA9IGAjLyR7cGFnZX1gO1xuXG4gICAgLy8gQ29udmVydCB0aGUgZGF0YSBvYmplY3QgdG8gSlNPTi5cbiAgICBpZiAoZGF0YSBpbnN0YW5jZW9mIFVSTFNlYXJjaFBhcmFtcykge1xuICAgICAgICBkYXRhID0gWy4uLihkYXRhIGFzIGFueSkuZW50cmllcygpXS5tYXAoKFtrLCB2XSkgPT4gKHsgW2tdOiB2IH0pKS5yZWR1Y2UoKGEsIGIpID0+ICh7IC4uLmEsIC4uLmIgfSksIHt9KTtcbiAgICB9XG5cbiAgICBjb25zdCBxdWVyeSA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoZGF0YSBhcyBhbnkpIGFzIGFueTtcbiAgICBjb25zdCBwcmV2UGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyhxc3RyaW5nKSBhcyBhbnk7XG5cbiAgICAvLyBJZiB0aGUgaGFzaCBpcyB0aGUgc2FtZSwgcmV0YWluIHBhcmFtcy5cbiAgICBpZiAoaGFzaCA9PSBvbGRIYXNoKSB7XG4gICAgICAgIHJlcGxhY2VTdGF0ZSA9IHRydWU7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHByZXZQYXJhbXMuZW50cmllcygpKVxuICAgICAgICAgICAgaWYgKCFxdWVyeS5oYXMoa2V5KSlcbiAgICAgICAgICAgICAgICBxdWVyeS5zZXQoa2V5LCBwcmV2UGFyYW1zLmdldChrZXkpKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbF0gb2YgcXVlcnkuZW50cmllcygpKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHZhbCA9PSBudWxsIHx8XG4gICAgICAgICAgICB2YWwgPT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICB2YWwgPT0gJycgfHxcbiAgICAgICAgICAgIHZhbCA9PSAnbnVsbCcgfHxcbiAgICAgICAgICAgIE51bWJlci5pc05hTih2YWwpIHx8XG4gICAgICAgICAgICB2YWwgPT0gJ05hTidcbiAgICAgICAgKVxuICAgICAgICAgICAgcXVlcnkuZGVsZXRlKGtleSk7XG4gICAgfVxuXG4gICAgaWYgKCEoaGFzaC50b0xvd2VyQ2FzZSgpID09IFwiIy9mcmFtZVwiKSB8fCBkYXRhWydpZCddID09IC0xKVxuICAgICAgICBxdWVyeS5kZWxldGUoJ2lkJyk7XG5cblxuICAgIGNvbnN0IHN0clF1ZXJ5ID0gcXVlcnkudG9TdHJpbmcoKTtcbiAgICBjb25zb2xlLmxvZyhkYXRhLCBoYXNoLCBzdHJRdWVyeSk7XG4gICAgaWYgKHJlcGxhY2VTdGF0ZSkge1xuICAgICAgICB3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUoZGF0YSwgJycsIGhhc2ggKyAoc3RyUXVlcnkgPyAoJz8nICsgc3RyUXVlcnkpIDogJycpKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHdpbmRvdy5oaXN0b3J5LnB1c2hTdGF0ZShkYXRhLCAnJywgaGFzaCArIChzdHJRdWVyeSA/ICgnPycgKyBzdHJRdWVyeSkgOiAnJykpO1xuICAgIH1cbn07XG5cbmV4cG9ydCBjb25zdCBnZXRVcmxEYXRhID0gKHNvdXJjZSA9IHdpbmRvdy5sb2NhdGlvbi5oYXNoKSA9PiB7XG4gICAgY29uc3QgW2hhc2gsIHF1ZXJ5XSA9IHNvdXJjZS5zcGxpdCgnPycpO1xuICAgIGxldCBkYXRhID0gbmV3IFVSTFNlYXJjaFBhcmFtcyhxdWVyeSkgYXMgYW55O1xuICAgIHJldHVybiBbLi4uZGF0YS5lbnRyaWVzKCldLm1hcCgoW2ssIHZdKSA9PiAoeyBba106IHYgfSkpLnJlZHVjZSgoYSwgYikgPT4gKHsgLi4uYSwgLi4uYiB9KSwge30pO1xufTtcbiJdfQ==