UNPKG

ngx-slice-kit

Version:

[![npm version](https://badge.fury.io/js/ngx-slice-kit.svg)](https://badge.fury.io/js/ngx-slice-kit)

134 lines 21.3 kB
const defaultBaseRgb = `25,25,25`; const defaultBackgroundRgb = `255,255,255`; const defaultRegularRgb = `186,186,186`; // `66,66,66`; const defaultPrimaryRgb = `0,85,255`; // `0,85,255`; const defaultSuccessRgb = `39,174,96`; // `39,174,96`; const defaultAccentRgb = `241,201,79`; // `255,168,38`; const defaultWarnRgb = `211,50,39`; // `238,112,112`; export const defaultColors = { base: defaultBaseRgb, base_text: defaultBackgroundRgb, background: defaultBackgroundRgb, regular: defaultRegularRgb, regular_text: defaultBaseRgb, primary: defaultPrimaryRgb, primary_text: defaultBackgroundRgb, success: defaultSuccessRgb, success_text: defaultBackgroundRgb, accent: defaultAccentRgb, accent_text: defaultBackgroundRgb, warn: defaultWarnRgb, warn_text: defaultBackgroundRgb, }; export const baseColors = [ `base`, `background`, ]; export const colors = [ `regular`, `primary`, `success`, `accent`, `warn`, ]; const alphaLimit = 100; const alphaStep = 10; export class ColorProperty { constructor(cp) { Object.assign(this, cp); this.prop = `--${this.name}`; // find color values const rgbVal = this.value.split(sep(this.value)).map(i => parseInt(i, 10)); const bgVal = this.background.split(sep(this.background)).map(i => parseInt(i, 10)); const rgbMixin = MixinRgba(rgbVal, bgVal, this.alpha / 100); const bgMixin = MixinRgba(bgVal, rgbVal, this.alpha / 100); // declare rgb values this.rgb = NumArrayToRgbString(rgbMixin); this.hex = RgbaToHex(this.rgb); this.background = NumArrayToRgbString(bgMixin); // check if text value is available if (this.text_value?.length > 0) { const textVal = this.text_value.split(sep(this.text_value)).map(i => parseInt(i, 10)); const textMixin = MixinRgba(textVal, bgVal, 0.9); this.text = NumArrayToRgbString(textMixin); } } } export class Theme { constructor(t) { Object.assign(this, defaultColors, t); this.colors = new Set(); for (const color of [...baseColors, ...colors]) { const rgb = this[color]; const textColor = `${color}_text`; const colorProp = new ColorProperty({ name: color, text_value: this[textColor], alpha: alphaLimit, value: rgb, background: rgb === this.background ? this.base : this.background, }); this.colors.add(colorProp); } } props() { const results = []; for (const c of this.colors) { results.push(c); } for (const color of [...baseColors, ...colors]) { const rgb = this[color]; for (let alpha = alphaStep; alpha <= alphaLimit; alpha += alphaStep) { results.push(new ColorProperty({ name: `${color}-a${alpha}`, alpha, value: rgb, background: rgb === this.background ? this.base : this.background, })); } } return results; } } const sep = (str) => { return str?.indexOf(',') < 0 ? (str?.indexOf(', ') < 0 ? ' ' : ', ') : ','; }; const trim = (str) => { return str?.replace(/^\s+|\s+$/gm, ''); }; export const MixinRgba = (base, added, alpha) => { const r3 = Math.round(((1 - alpha) * added[0]) + (alpha * base[0])); const g3 = Math.round(((1 - alpha) * added[1]) + (alpha * base[1])); const b3 = Math.round(((1 - alpha) * added[2]) + (alpha * base[2])); return [r3, g3, b3]; }; export const NumArrayToRgbString = (rgb) => { return `rgb(${rgb[0]},${rgb[1]},${rgb[2]})`; }; export const RgbaToHex = (rgba) => { if (!rgba) { return ''; } const inParts = rgba.substring(rgba.indexOf('(')).split(sep(rgba)); const r = parseInt(trim(inParts[0].substring(1)), 10); const g = parseInt(trim(inParts[1]), 10); const b = parseInt(trim(inParts[2]), 10); const outParts = [ r.toString(16), g.toString(16), b.toString(16) ]; if (inParts.length > 3) { const a = parseFloat(trim(inParts[3].substring(0, inParts[3].length - 1))).toFixed(2); outParts.push(Math.round(a * 255).toString(16).substring(0, 2)); } // Pad single-digit output values outParts.forEach((part, i) => { if (part.length === 1) { outParts[i] = '0' + part; } }); return ('#' + outParts.join('')); }; export const HexToRgb = (hex) => { const r = parseInt(hex.substr(1, 2), 16); const g = parseInt(hex.substr(3, 2), 16); const b = parseInt(hex.substr(5, 2), 16); return [r, g, b]; }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhlbWUubW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL25neC1zbGljZS1raXQvc3JjL2xpYi9jb3JlL3RoZW1lL3RoZW1lLm1vZGVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sY0FBYyxHQUFHLFVBQVUsQ0FBQztBQUNsQyxNQUFNLG9CQUFvQixHQUFHLGFBQWEsQ0FBQztBQUMzQyxNQUFNLGlCQUFpQixHQUFHLGFBQWEsQ0FBQyxDQUFDLGNBQWM7QUFDdkQsTUFBTSxpQkFBaUIsR0FBRyxVQUFVLENBQUMsQ0FBQyxjQUFjO0FBQ3BELE1BQU0saUJBQWlCLEdBQUcsV0FBVyxDQUFDLENBQUMsZUFBZTtBQUN0RCxNQUFNLGdCQUFnQixHQUFHLFlBQVksQ0FBQyxDQUFDLGdCQUFnQjtBQUN2RCxNQUFNLGNBQWMsR0FBRyxXQUFXLENBQUMsQ0FBQyxpQkFBaUI7QUFLckQsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHO0lBQ3pCLElBQUksRUFBRSxjQUFjO0lBQ3BCLFNBQVMsRUFBRSxvQkFBb0I7SUFDL0IsVUFBVSxFQUFFLG9CQUFvQjtJQUNoQyxPQUFPLEVBQUUsaUJBQWlCO0lBQzFCLFlBQVksRUFBRSxjQUFjO0lBQzVCLE9BQU8sRUFBRSxpQkFBaUI7SUFDMUIsWUFBWSxFQUFFLG9CQUFvQjtJQUNsQyxPQUFPLEVBQUUsaUJBQWlCO0lBQzFCLFlBQVksRUFBRSxvQkFBb0I7SUFDbEMsTUFBTSxFQUFFLGdCQUFnQjtJQUN4QixXQUFXLEVBQUUsb0JBQW9CO0lBQ2pDLElBQUksRUFBRSxjQUFjO0lBQ3BCLFNBQVMsRUFBRSxvQkFBb0I7Q0FDbEMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRztJQUN0QixNQUFNLEVBQUUsWUFBWTtDQUN2QixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sTUFBTSxHQUFHO0lBQ2xCLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxF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QUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ25FO0lBRUQsaUNBQWlDO0lBQ2pDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDekIsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUNuQixRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQztTQUM1QjtJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsT0FBTyxDQUFDLEdBQUcsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDckMsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHLENBQUMsR0FBVyxFQUFZLEVBQUU7SUFDOUMsTUFBTSxDQUFDLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3pDLE1BQU0sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN6QyxNQUFNLENBQUMsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDekMsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDckIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgZGVmYXVsdEJhc2VSZ2IgPSBgMjUsMjUsMjVgO1xuY29uc3QgZGVmYXVsdEJhY2tncm91bmRSZ2IgPSBgMjU1LDI1NSwyNTVgO1xuY29uc3QgZGVmYXVsdFJlZ3VsYXJSZ2IgPSBgMTg2LDE4NiwxODZgOyAvLyBgNjYsNjYsNjZgO1xuY29uc3QgZGVmYXVsdFByaW1hcnlSZ2IgPSBgMCw4NSwyNTVgOyAvLyBgMCw4NSwyNTVgO1xuY29uc3QgZGVmYXVsdFN1Y2Nlc3NSZ2IgPSBgMzksMTc0LDk2YDsgLy8gYDM5LDE3NCw5NmA7XG5jb25zdCBkZWZhdWx0QWNjZW50UmdiID0gYDI0MSwyMDEsNzlgOyAvLyBgMjU1LDE2OCwzOGA7XG5jb25zdCBkZWZhdWx0V2FyblJnYiA9IGAyMTEsNTAsMzlgOyAvLyBgMjM4LDExMiwxMTJgO1xuXG5leHBvcnQgdHlwZSBUaGVtZUJhc2VDb2xvcnMgPSAnYmFzZScgfCAnYmFja2dyb3VuZCc7XG5leHBvcnQgdHlwZSBUaGVtZUNvbG9ycyA9ICdyZWd1bGFyJyB8ICdwcmltYXJ5JyB8ICdzdWNjZXNzJyB8ICdhY2NlbnQnIHwgJ3dhcm4nO1xuXG5leHBvcnQgY29uc3QgZGVmYXVsdENvbG9ycyA9IHtcbiAgICBiYXNlOiBkZWZhdWx0QmFzZVJnYixcbiAgICBiYXNlX3RleHQ6IGRlZmF1bHRCYWNrZ3JvdW5kUmdiLFxuICAgIGJhY2tncm91bmQ6IGRlZmF1bHRCYWNrZ3JvdW5kUmdiLFxuICAgIHJlZ3VsYXI6IGRlZmF1bHRSZWd1bGFyUmdiLFxuICAgIHJlZ3VsYXJfdGV4dDogZGVmYXVsdEJhc2VSZ2IsXG4gICAgcHJpbWFyeTogZGVmYXVsdFByaW1hcnlSZ2IsXG4gICAgcHJpbWFyeV90ZXh0OiBkZWZhdWx0QmFja2dyb3VuZFJnYixcbiAgICBzdWNjZXNzOiBkZWZhdWx0U3VjY2Vzc1JnYixcbiAgICBzdWNjZXNzX3RleHQ6IGRlZmF1bHRCYWNrZ3JvdW5kUmdiLFxuICAgIGFjY2VudDogZGVmYXVsdEFjY2VudFJnYixcbiAgICBhY2NlbnRfdGV4dDogZGVmYXVsdEJhY2tncm91bmRSZ2IsXG4gICAgd2FybjogZGVmYXVsdFdhcm5SZ2IsXG4gICAgd2Fybl90ZXh0OiBkZWZhdWx0QmFja2dyb3VuZFJnYixcbn07XG5cbmV4cG9ydCBjb25zdCBiYXNlQ29sb3JzID0gW1xuICAgIGBiYXNlYCwgYGJhY2tncm91bmRgLFxuXTtcblxuZXhwb3J0IGNvbnN0IGNvbG9ycyA9IFtcbiAgICBgcmVndWxhcmAsIGBwcmltYXJ5YCwgYHN1Y2Nlc3NgLCBgYWNjZW50YCwgYHdhcm5gLFxuXTtcblxuY29uc3QgYWxwaGFMaW1pdCA9IDEwMDtcbmNvbnN0IGFscGhhU3RlcCA9IDEwO1xuXG5leHBvcnQgY2xhc3MgQ29sb3JQcm9wZXJ0eSB7XG4gICAgcHVibGljIHZhbHVlOiBzdHJpbmc7XG4gICAgcHVibGljIHRleHRfdmFsdWU/OiBzdHJpbmc7XG4gICAgcHVibGljIGJhY2tncm91bmQ6IHN0cmluZztcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nO1xuICAgIHB1YmxpYyB0ZXh0Pzogc3RyaW5nO1xuICAgIHB1YmxpYyBwcm9wPzogc3RyaW5nO1xuICAgIHB1YmxpYyBhbHBoYT86IG51bWJlcjtcbiAgICBwdWJsaWMgcmdiPzogc3RyaW5nO1xuICAgIHB1YmxpYyBoZXg/OiBzdHJpbmc7XG5cbiAgICBjb25zdHJ1Y3RvcihjcD86IENvbG9yUHJvcGVydHkpIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBjcCk7XG4gICAgICAgIHRoaXMucHJvcCA9IGAtLSR7dGhpcy5uYW1lfWA7XG5cbiAgICAgICAgLy8gZmluZCBjb2xvciB2YWx1ZXNcbiAgICAgICAgY29uc3QgcmdiVmFsID0gdGhpcy52YWx1ZS5zcGxpdChzZXAodGhpcy52YWx1ZSkpLm1hcChpID0+IHBhcnNlSW50KGksIDEwKSk7XG4gICAgICAgIGNvbnN0IGJnVmFsID0gdGhpcy5iYWNrZ3JvdW5kLnNwbGl0KHNlcCh0aGlzLmJhY2tncm91bmQpKS5tYXAoaSA9PiBwYXJzZUludChpLCAxMCkpO1xuICAgICAgICBjb25zdCByZ2JNaXhpbiA9IE1peGluUmdiYShyZ2JWYWwsIGJnVmFsLCB0aGlzLmFscGhhIC8gMTAwKTtcbiAgICAgICAgY29uc3QgYmdNaXhpbiA9IE1peGluUmdiYShiZ1ZhbCwgcmdiVmFsLCB0aGlzLmFscGhhIC8gMTAwKTtcblxuICAgICAgICAvLyBkZWNsYXJlIHJnYiB2YWx1ZXNcbiAgICAgICAgdGhpcy5yZ2IgPSBOdW1BcnJheVRvUmdiU3RyaW5nKHJnYk1peGluKTtcbiAgICAgICAgdGhpcy5oZXggPSBSZ2JhVG9IZXgodGhpcy5yZ2IpO1xuICAgICAgICB0aGlzLmJhY2tncm91bmQgPSBOdW1BcnJheVRvUmdiU3RyaW5nKGJnTWl4aW4pO1xuXG4gICAgICAgIC8vIGNoZWNrIGlmIHRleHQgdmFsdWUgaXMgYXZhaWxhYmxlXG4gICAgICAgIGlmICh0aGlzLnRleHRfdmFsdWU/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHRleHRWYWwgPSB0aGlzLnRleHRfdmFsdWUuc3BsaXQoc2VwKHRoaXMudGV4dF92YWx1ZSkpLm1hcChpID0+IHBhcnNlSW50KGksIDEwKSk7XG4gICAgICAgICAgICBjb25zdCB0ZXh0TWl4aW4gPSBNaXhpblJnYmEodGV4dFZhbCwgYmdWYWwsIDAuOSk7XG4gICAgICAgICAgICB0aGlzLnRleHQgPSBOdW1BcnJheVRvUmdiU3RyaW5nKHRleHRNaXhpbik7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBUaGVtZSB7XG4gICAgcHVibGljIG5hbWU6IHN0cmluZztcblxuICAgIC8vIHRoZXJlIGdvZXMgUkdCIGNvbG9ycyBwYWxldHRlIHN0cmluZyB2YWx1ZXNcbiAgICBwdWJsaWMgYmFzZT86IHN0cmluZztcbiAgICBwdWJsaWMgYmFja2dyb3VuZD86IHN0cmluZztcbiAgICBwdWJsaWMgcmVndWxhcj86IHN0cmluZztcbiAgICBwdWJsaWMgcHJpbWFyeT86IHN0cmluZztcbiAgICBwdWJsaWMgc3VjY2Vzcz86IHN0cmluZztcbiAgICBwdWJsaWMgYWNjZW50Pzogc3RyaW5nO1xuICAgIHB1YmxpYyB3YXJuPzogc3RyaW5nO1xuICAgIC8vIHRleHQga2V5c1xuICAgIHB1YmxpYyBiYXNlX3RleHQ/OiBzdHJpbmc7XG4gICAgcHVibGljIHJlZ3VsYXJfdGV4dD86IHN0cmluZztcbiAgICBwdWJsaWMgcHJpbWFyeV90ZXh0Pzogc3RyaW5nO1xuICAgIHB1YmxpYyBzdWNjZXNzX3RleHQ/OiBzdHJpbmc7XG4gICAgcHVibGljIGFjY2VudF90ZXh0Pzogc3RyaW5nO1xuICAgIHB1YmxpYyB3YXJuX3RleHQ/OiBzdHJpbmc7XG5cbiAgICBwdWJsaWMgY29sb3JzPzogU2V0PENvbG9yUHJvcGVydHk+O1xuXG4gICAgY29uc3RydWN0b3IodD86IFRoZW1lKSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgZGVmYXVsdENvbG9ycywgdCk7XG5cbiAgICAgICAgdGhpcy5jb2xvcnMgPSBuZXcgU2V0PENvbG9yUHJvcGVydHk+KCk7XG4gICAgICAgIGZvciAoY29uc3QgY29sb3Igb2YgWy4uLmJhc2VDb2xvcnMsIC4uLmNvbG9yc10pIHtcbiAgICAgICAgICAgIGNvbnN0IHJnYiA9IHRoaXNbY29sb3JdO1xuXG4gICAgICAgICAgICBjb25zdCB0ZXh0Q29sb3IgPSBgJHtjb2xvcn1fdGV4dGA7XG4gICAgICAgICAgICBjb25zdCBjb2xvclByb3AgPSBuZXcgQ29sb3JQcm9wZXJ0eSh7XG4gICAgICAgICAgICAgICAgbmFtZTogY29sb3IsXG4gICAgICAgICAgICAgICAgdGV4dF92YWx1ZTogdGhpc1t0ZXh0Q29sb3JdLFxuICAgICAgICAgICAgICAgIGFscGhhOiBhbHBoYUxpbWl0LFxuICAgICAgICAgICAgICAgIHZhbHVlOiByZ2IsXG4gICAgICAgICAgICAgICAgYmFja2dyb3VuZDogcmdiID09PSB0aGlzLmJhY2tncm91bmQgPyB0aGlzLmJhc2UgOiB0aGlzLmJhY2tncm91bmQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuY29sb3JzLmFkZChjb2xvclByb3ApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHByb3BzPygpOiBDb2xvclByb3BlcnR5W10ge1xuICAgICAgICBjb25zdCByZXN1bHRzID0gW107XG5cbiAgICAgICAgZm9yIChjb25zdCBjIG9mIHRoaXMuY29sb3JzKSB7XG4gICAgICAgICAgICByZXN1bHRzLnB1c2goYyk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGNvbG9yIG9mIFsuLi5iYXNlQ29sb3JzLCAuLi5jb2xvcnNdKSB7XG4gICAgICAgICAgICBjb25zdCByZ2IgPSB0aGlzW2NvbG9yXTtcblxuICAgICAgICAgICAgZm9yIChsZXQgYWxwaGEgPSBhbHBoYVN0ZXA7IGFscGhhIDw9IGFscGhhTGltaXQ7IGFscGhhICs9IGFscGhhU3RlcCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaChuZXcgQ29sb3JQcm9wZXJ0eSh7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IGAke2NvbG9yfS1hJHthbHBoYX1gLFxuICAgICAgICAgICAgICAgICAgICBhbHBoYSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHJnYixcbiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDogcmdiID09PSB0aGlzLmJhY2tncm91bmQgPyB0aGlzLmJhc2UgOiB0aGlzLmJhY2tncm91bmQsXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfVxufVxuXG5jb25zdCBzZXAgPSAoc3RyOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICAgIHJldHVybiBzdHI/LmluZGV4T2YoJywnKSA8IDAgPyAoc3RyPy5pbmRleE9mKCcsICcpIDwgMCA/ICcgJyA6ICcsICcpIDogJywnO1xufTtcblxuY29uc3QgdHJpbSA9IChzdHI6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gICAgcmV0dXJuIHN0cj8ucmVwbGFjZSgvXlxccyt8XFxzKyQvZ20sICcnKTtcbn07XG5cbmV4cG9ydCBjb25zdCBNaXhpblJnYmEgPSAoYmFzZTogbnVtYmVyW10sIGFkZGVkOiBudW1iZXJbXSwgYWxwaGE6IG51bWJlcik6IG51bWJlcltdID0+IHtcbiAgICBjb25zdCByMyA9IE1hdGgucm91bmQoKCgxIC0gYWxwaGEpICogYWRkZWRbMF0pICsgKGFscGhhICogYmFzZVswXSkpO1xuICAgIGNvbnN0IGczID0gTWF0aC5yb3VuZCgoKDEgLSBhbHBoYSkgKiBhZGRlZFsxXSkgKyAoYWxwaGEgKiBiYXNlWzFdKSk7XG4gICAgY29uc3QgYjMgPSBNYXRoLnJvdW5kKCgoMSAtIGFscGhhKSAqIGFkZGVkWzJdKSArIChhbHBoYSAqIGJhc2VbMl0pKTtcbiAgICByZXR1cm4gW3IzLCBnMywgYjNdO1xufTtcblxuZXhwb3J0IGNvbnN0IE51bUFycmF5VG9SZ2JTdHJpbmcgPSAocmdiOiBudW1iZXJbXSk6IHN0cmluZyA9PiB7XG4gICAgcmV0dXJuIGByZ2IoJHtyZ2JbMF19LCR7cmdiWzFdfSwke3JnYlsyXX0pYDtcbn07XG5cbmV4cG9ydCBjb25zdCBSZ2JhVG9IZXggPSAocmdiYTogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgICBpZiAoIXJnYmEpIHtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIGNvbnN0IGluUGFydHMgPSByZ2JhLnN1YnN0cmluZyhyZ2JhLmluZGV4T2YoJygnKSkuc3BsaXQoc2VwKHJnYmEpKTtcbiAgICBjb25zdCByID0gcGFyc2VJbnQodHJpbShpblBhcnRzWzBdLnN1YnN0cmluZygxKSksIDEwKTtcbiAgICBjb25zdCBnID0gcGFyc2VJbnQodHJpbShpblBhcnRzWzFdKSwgMTApO1xuICAgIGNvbnN0IGIgPSBwYXJzZUludCh0cmltKGluUGFydHNbMl0pLCAxMCk7XG4gICAgY29uc3Qgb3V0UGFydHMgPSBbXG4gICAgICAgIHIudG9TdHJpbmcoMTYpLFxuICAgICAgICBnLnRvU3RyaW5nKDE2KSxcbiAgICAgICAgYi50b1N0cmluZygxNilcbiAgICBdO1xuXG4gICAgaWYgKGluUGFydHMubGVuZ3RoID4gMykge1xuICAgICAgICBjb25zdCBhOiBhbnkgPSBwYXJzZUZsb2F0KHRyaW0oaW5QYXJ0c1szXS5zdWJzdHJpbmcoMCwgaW5QYXJ0c1szXS5sZW5ndGggLSAxKSkpLnRvRml4ZWQoMik7XG4gICAgICAgIG91dFBhcnRzLnB1c2goTWF0aC5yb3VuZChhICogMjU1KS50b1N0cmluZygxNikuc3Vic3RyaW5nKDAsIDIpKTtcbiAgICB9XG5cbiAgICAvLyBQYWQgc2luZ2xlLWRpZ2l0IG91dHB1dCB2YWx1ZXNcbiAgICBvdXRQYXJ0cy5mb3JFYWNoKChwYXJ0LCBpKSA9PiB7XG4gICAgICAgIGlmIChwYXJ0Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgb3V0UGFydHNbaV0gPSAnMCcgKyBwYXJ0O1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gKCcjJyArIG91dFBhcnRzLmpvaW4oJycpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBIZXhUb1JnYiA9IChoZXg6IHN0cmluZyk6IG51bWJlcltdID0+IHtcbiAgICBjb25zdCByID0gcGFyc2VJbnQoaGV4LnN1YnN0cigxLCAyKSwgMTYpO1xuICAgIGNvbnN0IGcgPSBwYXJzZUludChoZXguc3Vic3RyKDMsIDIpLCAxNik7XG4gICAgY29uc3QgYiA9IHBhcnNlSW50KGhleC5zdWJzdHIoNSwgMiksIDE2KTtcbiAgICByZXR1cm4gW3IsIGcsIGJdO1xufTtcbiJdfQ==