UNPKG

ngx-input-color

Version:

Angular color input component and color picker (with HSL, HSV, RGB, CMYK, HEX, alpha, eye-dropper, etc)

438 lines 54.3 kB
export function hexToRgb(hex) { let h = hex.replace(/^#/, ''); if (h.length === 3) h = h .split('') .map((x) => x + x) .join(''); if (h.length === 6) h += 'ff'; if (h.length === 8) { const r = parseInt(h.slice(0, 2), 16); const g = parseInt(h.slice(2, 4), 16); const b = parseInt(h.slice(4, 6), 16); const a = parseInt(h.slice(6, 8), 16) / 255; return { r, g, b, a: a }; } throw new Error('Invalid hex color'); } export function parseRgbString(str) { const m = str.match(/rgba?\(([^)]+)\)/); if (!m) throw new Error('Invalid rgb string'); const parts = m[1].split(',').map((x) => +x.trim()); return { r: parts[0], g: parts[1], b: parts[2], a: parts[3] !== undefined ? parts[3] : 1, }; } function clamp(value, min, max) { return Math.max(min, Math.min(max, value)); } export function parseHslString(str) { const m = str.match(/hsla?\(([^)]+)\)/i); if (!m) throw new Error('Invalid hsl/hsla string'); const parts = m[1].split(',').map((x) => x.trim()); const h = clamp(parseFloat(parts[0]), 0, 360); const s = clamp(parseFloat(parts[1]), 0, 100); const l = clamp(parseFloat(parts[2]), 0, 100); const a = parts[3] !== undefined ? clamp(parseFloat(parts[3]), 0, 1) : 1; return { h, s, l, a }; } export function parseHsvString(str) { const m = str.match(/hsva?\(([^)]+)\)/i); if (!m) throw new Error('Invalid hsv(a) string'); const parts = m[1].split(',').map((x) => x.trim()); const h = clamp(parseFloat(parts[0]), 0, 360); const s = clamp(parseFloat(parts[1]), 0, 100); const v = clamp(parseFloat(parts[2]), 0, 100); const a = parts[3] !== undefined ? clamp(parseFloat(parts[3]), 0, 1) : 1; return { h, s, v, a }; } export function parseCmykString(str) { const m = str.match(/cmyk\(([^)]+)\)/i); if (!m) throw new Error('Invalid cmyk string'); const parts = m[1].split(',').map((x) => x.trim()); return { c: clamp(parseFloat(parts[0]), 0, 100), m: clamp(parseFloat(parts[1]), 0, 100), y: clamp(parseFloat(parts[2]), 0, 100), k: clamp(parseFloat(parts[3]), 0, 100), }; } /** * Take input from [0, n] and return it as [0, 1] * @hidden */ export function bound01(n, max) { if (isOnePointZero(n)) { n = '100%'; } const isPercent = isPercentage(n); n = max === 360 ? n : Math.min(max, Math.max(0, parseFloat(n))); // Automatically convert percentage into number if (isPercent) { n = parseInt(String(n * max), 10) / 100; } // Handle floating point rounding errors if (Math.abs(n - max) < 0.000001) { return 1; } // Convert into [0, 1] range if it isn't already if (max === 360) { // If n is a hue given in degrees, // wrap around out-of-range values into [0, 360] range // then convert into [0, 1]. n = (n < 0 ? (n % max) + max : n % max) / parseFloat(String(max)); } else { // If n not a hue given in degrees // Convert into [0, 1] range if it isn't already. n = (n % max) / parseFloat(String(max)); } return n; } /** * Need to handle 1.0 as 100%, since once it is a number, there is no difference between it and 1 * <http://stackoverflow.com/questions/7422072/javascript-how-to-detect-number-as-a-decimal-including-1-0> * @hidden */ export function isOnePointZero(n) { return typeof n === 'string' && n.indexOf('.') !== -1 && parseFloat(n) === 1; } /** * Check to see if string passed in is a percentage * @hidden */ export function isPercentage(n) { return typeof n === 'string' && n.indexOf('%') !== -1; } /** * Replace a decimal with it's percentage value * @hidden */ export function convertToPercentage(n) { if (Number(n) <= 1) { return `${Number(n) * 100}%`; } return n; } /** * Force a hex value to have 2 characters * @hidden */ export function pad2(c) { return c.length === 1 ? '0' + c : String(c); } // `rgbToHsl`, `rgbToHsv`, `hslToRgb`, `hsvToRgb` modified from: // <http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript> /** * Handle bounds / percentage checking to conform to CSS color spec * <http://www.w3.org/TR/css3-color/> * *Assumes:* r, g, b in [0, 255] or [0, 1] * *Returns:* { r, g, b } in [0, 255] */ export function rgbToRgb(r, g, b) { return { r: bound01(r, 255) * 255, g: bound01(g, 255) * 255, b: bound01(b, 255) * 255, }; } /** * Converts an RGB color value to HSL. * *Assumes:* r, g, and b are contained in [0, 255] * *Returns:* { h: 0-360, s: 0-100, l: 0-100 } */ export function rgbToHsl(r, g, b) { r = r / 255; g = g / 255; b = b / 255; const max = Math.max(r, g, b); const min = Math.min(r, g, b); let h = 0; let s = 0; const l = (max + min) / 2; if (max === min) { s = 0; h = 0; } else { const d = max - min; s = l > 0.5 ? d / (2 - max - min) : d / (max + min); switch (max) { case r: h = (g - b) / d + (g < b ? 6 : 0); break; case g: h = (b - r) / d + 2; break; case b: h = (r - g) / d + 4; break; } h /= 6; } h = (h * 360) % 360; if (h < 0) h += 360; return { h: max === min ? 0 : h, s: l === 0 || l === 1 ? 0 : s * 100, l: l * 100, }; } /** * Converts an HSL color value to RGB. * *Assumes:* h in [0, 360], s and l in [0, 100] * *Returns:* { r, g, b } in [0, 255] */ export function hslToRgba(h, s, l, a = 1) { h = +h; s = +s; l = +l; h = ((h % 360) + 360) % 360; s = Math.max(0, Math.min(100, s)); l = Math.max(0, Math.min(100, l)); h = h / 360; s = s / 100; l = l / 100; let r, g, b; if (s === 0) { r = g = b = l; // achromatic } else { const hue2rgb = (p, q, t) => { if (t < 0) t += 1; if (t > 1) t -= 1; if (t < 1 / 6) return p + (q - p) * 6 * t; if (t < 1 / 2) return q; if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6; return p; }; const q = l < 0.5 ? l * (1 + s) : l + s - l * s; const p = 2 * l - q; r = hue2rgb(p, q, h + 1 / 3); g = hue2rgb(p, q, h); b = hue2rgb(p, q, h - 1 / 3); } return { r: Math.round(r * 255), g: Math.round(g * 255), b: Math.round(b * 255), a: Math.max(0, Math.min(1, a)), }; } /** * Converts an RGB color value to HSV * *Assumes:* r, g, and b are contained in [0, 255] * *Returns:* { h: 0-360, s: 0-100, v: 0-100 } */ export function rgbToHsv(r, g, b) { r = r / 255; g = g / 255; b = b / 255; const max = Math.max(r, g, b); const min = Math.min(r, g, b); let h = 0; let s = 0; const v = max; const d = max - min; s = max === 0 ? 0 : d / max; if (max === min) { h = 0; } else { switch (max) { case r: h = (g - b) / d + (g < b ? 6 : 0); break; case g: h = (b - r) / d + 2; break; case b: h = (r - g) / d + 4; break; } h /= 6; } h = (h * 360) % 360; if (h < 0) h += 360; return { h: max === min ? 0 : h, s: max === 0 ? 0 : s * 100, v: v * 100, }; } /** * Converts an HSV color value to RGB. * *Assumes:* h in [0, 360], s and v in [0, 100] * *Returns:* { r, g, b } in [0, 255] */ export function hsvToRgb(h, s, v) { h = +h; s = +s; v = +v; h = ((h % 360) + 360) % 360; s = Math.max(0, Math.min(100, s)); v = Math.max(0, Math.min(100, v)); s = s / 100; v = v / 100; let r = 0, g = 0, b = 0; const hi = Math.floor(h / 60) % 6; const f = h / 60 - Math.floor(h / 60); const p = v * (1 - s); const q = v * (1 - f * s); const t = v * (1 - (1 - f) * s); switch (hi) { case 0: r = v; g = t; b = p; break; case 1: r = q; g = v; b = p; break; case 2: r = p; g = v; b = t; break; case 3: r = p; g = q; b = v; break; case 4: r = t; g = p; b = v; break; case 5: r = v; g = p; b = q; break; } return { r: Math.max(0, Math.min(255, Math.round(r * 255))), g: Math.max(0, Math.min(255, Math.round(g * 255))), b: Math.max(0, Math.min(255, Math.round(b * 255))), }; } /** * Converts an RGB/RGBA color to hex */ export function rgbaToHex(r, g, b, a = 1, allowAlpha = true, allow3Char = false) { const toHex = (n) => n.toString(16).padStart(2, '0'); const rHex = toHex(Math.round(r)); const gHex = toHex(Math.round(g)); const bHex = toHex(Math.round(b)); const aHex = toHex(Math.round(a * 255)); // Try compressing to #rgb or #rgba if allowed and all characters are duplicated if (allow3Char && (!allowAlpha || aHex === 'ff')) { const canShorten = rHex[0] === rHex[1] && gHex[0] === gHex[1] && bHex[0] === bHex[1] && (!allowAlpha || aHex[0] === aHex[1]); if (canShorten) { return '#' + rHex[0] + gHex[0] + bHex[0] + (allowAlpha && aHex !== 'ff' ? aHex[0] : ''); } } return '#' + rHex + gHex + bHex + (allowAlpha && aHex !== 'ff' ? aHex : ''); } /** * Converts an RGBA color to an ARGB Hex8 string * Rarely used, but required for "toFilter()" * * *Assumes:* r, g, b are contained in the set [0, 255] and a in [0, 1] * *Returns:* a 8 character argb hex */ export function rgbaToArgbHex(r, g, b, a) { const hex = [ pad2(convertDecimalToHex(a)), pad2(Math.round(r).toString(16)), pad2(Math.round(g).toString(16)), pad2(Math.round(b).toString(16)), ]; return hex.join(''); } /** * Converts CMYK to RBG * Assumes c, m, y, k are in the set [0, 100] */ export function cmykToRgb(c, m, y, k) { const cConv = c / 100; const mConv = m / 100; const yConv = y / 100; const kConv = k / 100; const r = 255 * (1 - cConv) * (1 - kConv); const g = 255 * (1 - mConv) * (1 - kConv); const b = 255 * (1 - yConv) * (1 - kConv); return { r, g, b }; } export function rgbToCmyk(r, g, b) { let c = 1 - r / 255; let m = 1 - g / 255; let y = 1 - b / 255; let k = Math.min(c, m, y); if (k === 1) { c = 0; m = 0; y = 0; } else { c = ((c - k) / (1 - k)) * 100; m = ((m - k) / (1 - k)) * 100; y = ((y - k) / (1 - k)) * 100; } k *= 100; return { c: Math.round(c), m: Math.round(m), y: Math.round(y), k: Math.round(k), }; } /** Converts a decimal to a hex value */ export function convertDecimalToHex(d) { return Math.round(parseFloat(d) * 255).toString(16); } /** Converts a hex value to a decimal */ export function convertHexToDecimal(h) { return parseIntFromHex(h) / 255; } /** Parse a base-16 hex value into a base-10 integer */ export function parseIntFromHex(val) { return parseInt(val, 16); } export function numberInputToObject(color) { return { r: color >> 16, g: (color & 0xff00) >> 8, b: color & 0xff, }; } export function rgbToHslaString(r, g, b, a = 1) { const { h, s, l } = rgbToHsl(r, g, b); return `hsla(${Math.round(h)}, ${Math.round(s)}%, ${Math.round(l)}%, ${+a.toFixed(2)})`; } export function rgbToHsvString(r, g, b, a = 1) { const { h, s, v } = rgbToHsv(r, g, b); return `hsva(${Math.round(h)}, ${Math.round(s)}%, ${Math.round(v)}%, ${+a.toFixed(2)})`; } export function rgbToCmykString(r, g, b) { const { c, m, y, k } = rgbToCmyk(r, g, b); return `cmyk(${Math.round(c)}%, ${Math.round(m)}%, ${Math.round(y)}%, ${Math.round(k)}%)`; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1pbnB1dC1jb2xvci9zcmMvdXRpbHMvY29udmVyc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxNQUFNLFVBQVUsUUFBUSxDQUFDLEdBQVc7SUFDbEMsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDOUIsSUFBSSxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUM7UUFDaEIsQ0FBQyxHQUFHLENBQUM7YUFDRixLQUFLLENBQUMsRUFBRSxDQUFDO2FBQ1QsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQ2pCLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNkLElBQUksQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDO1FBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQztJQUM5QixJQUFJLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDbkIsTUFBTSxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3RDLE1BQU0sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN0QyxNQUFNLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDdEMsTUFBTSxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztR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Q0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7SUFFbkQsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDOUMsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDOUMsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDOUMsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUV6RSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7QUFDeEIsQ0FBQztBQUVELE1BQU0sVUFBVSxlQUFlLENBQUMsR0FBVztJQUN6QyxNQUFNLENBQUMsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFDeEMsSUFBSSxDQUFDLENBQUM7UUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLHFCQUFxQixDQUFDLENBQUM7SUFFL0MsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVB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QUFDLENBQUM7SUFDVixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDVixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDMUIsSUFBSSxHQUFHLEtBQUssR0FBRyxFQUFFLENBQUM7UUFDaEIsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNOLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDUixDQUFDO1NBQU0sQ0FBQztRQUNOLE1BQU0sQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFDcEIsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztRQUNwRCxRQUFRLEdBQUcsRUFBRSxDQUFDO1lBQ1osS0FBSyxDQUFDO2dCQUNKLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNsQyxNQUFNO1lBQ1IsS0FBSyxDQUFDO2dCQUNKLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNwQixNQUFNO1lBQ1IsS0FBSyxDQUFDO2dCQUNKLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNwQixNQUFNO1FBQ1YsQ0FBQztRQUNELENBQUMsSUFBSSxDQUFDLENBQUM7SUFDVCxDQUFDO0lBQ0QsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUNwQixJQUFJLENBQUMsR0FBRyxDQUFDO1FBQUUsQ0FBQyxJQUFJLEdB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QUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQsT0FBTztRQUNMLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDdEIsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUN0QixDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ3RCLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztLQUMvQixDQUFDO0FBQ0osQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsUUFBUSxDQUFDLENBQVMsRUFBRSxDQUFTLEVBQUUsQ0FBUztJQUN0RCxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUNaLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQ1osQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7SUFDWixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDOUIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzlCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNWLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNWLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUNkLE1BQU0sQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7SUFDcEIsQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUM1QixJQUFJLEdBQUcsS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUNoQixDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1IsQ0FBQztTQUFNLENBQUM7UUFDTixRQUFRLEdBQUcsRUFBRSxDQUFDO1lBQ1osS0FBSyxDQUFDO2dCQUNKLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNsQyxNQUFNO1lBQ1IsS0FBSyxDQUFDO2dCQUNKLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNwQixNQUFNO1lBQ1IsS0FBSyxDQUFDO2dCQUNKLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNwQixNQUFNO1FBQ1YsQ0FBQztRQUNELENBQUMsSUFBSSxDQUFDLENBQUM7SUFDVCxDQUFDO0lBQ0QsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUNwQixJQUFJLENBQUMsR0FBRyxDQUFDO1FBQUUsQ0FBQyxJQUFJLEdBQUcsQ0FBQztJQUNwQixPQUFPO1FBQ0wsQ0FBQyxFQUFFLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QixDQUFDLEVBQUUsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRztRQUMxQixDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUc7S0FDWCxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsUUFBUSxDQUFDLENBQWtCLEVBQUUsQ0FBa0IsRUFBRSxDQUFrQjtJQUNqRixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7SUFDNUIsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7SUFDWixDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUNaLElBQUksQ0FBQyxHQUFHLENBQUMsRUFDUCxDQUFDLEdBQUcsQ0FBQyxFQUNMLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDUixNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbEMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUN0QyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDdEIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUMxQixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDaEMsUUFBUSxFQUFFLEVBQUUsQ0FBQztRQUNYLEtBQUssQ0FBQztZQUNKLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDTixDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ04sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNOLE1BQU07UUFDUixLQUFLLENBQUM7WUFDSixDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ04sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNOLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDTixNQUFNO1FBQ1IsS0FBSyxDQUFDO1lBQ0osQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNOLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDTixDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ04sTUFBTTtRQUNSLEtBQUssQ0FBQztZQUNKLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDTixDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ04sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNOLE1BQU07UUFDUixLQUFLLENBQUM7WUFDSixDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ04sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNOLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDTixNQUFNO1FBQ1IsS0FBSyxDQUFDO1lBQ0osQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNOLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDTixDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ04sTUFBTTtJQUNWLENBQUM7SUFDRCxPQUFPO1FBQ0wsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDbEQsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDbEQsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FB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LENBQVMsRUFBRSxDQUFTLEVBQUUsQ0FBUztJQUNsRSxNQUFNLEtBQUssR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQ3RCLE1BQU0sS0FBSyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7SUFDdEIsTUFBTSxLQUFLLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUN0QixNQUFNLEtBQUssR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBRXRCLE1BQU0sQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQztJQUMxQyxNQUFNLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUM7SUFDMUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDO0lBRTFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0FBQ3JCLENBQUM7QUFFRCxNQUFNLFVBQVUsU0FBUyxDQUFDLENBQVMsRUFBRSxDQUFTLEVBQUUsQ0FBUztJQUN2RCxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUNwQixJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUNwQixJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUNwQixJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFFMUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDWixDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ04sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNOLENBQUMs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QVUsZUFBZSxDQUFDLENBQVMsRUFBRSxDQUFTLEVBQUUsQ0FBUztJQUM3RCxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDMUMsT0FBTyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztBQUM1RixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ01ZSywgSFNMLCBIU0xBLCBIU1YsIEhTVkEsIFJHQiwgUkdCQSB9IGZyb20gJy4vaW50ZXJmYWNlcyc7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaGV4VG9SZ2IoaGV4OiBzdHJpbmcpOiBSR0JBIHtcclxuICBsZXQgaCA9IGhleC5yZXBsYWNlKC9eIy8sICcnKTtcclxuICBpZiAoaC5sZW5ndGggPT09IDMpXHJcbiAgICBoID0gaFxyXG4gICAgICAuc3BsaXQoJycpXHJcbiAgICAgIC5tYXAoKHgpID0+IHggKyB4KVxyXG4gICAgICAuam9pbignJyk7XHJcbiAgaWYgKGgubGVuZ3RoID09PSA2KSBoICs9ICdmZic7XHJcbiAgaWYgKGgubGVuZ3RoID09PSA4KSB7XHJcbiAgICBjb25zdCByID0gcGFyc2VJbnQoaC5zbGljZSgwLCAyKSwgMTYpO1xyXG4gICAgY29uc3QgZyA9IHBhcnNlSW50KGguc2xpY2UoMiwgNCksIDE2KTtcclxuICAgIGNvbnN0IGIgPSBwYXJzZUludChoLnNsaWNlKDQsIDYpLCAxNik7XHJcbiAgICBjb25zdCBhID0gcGFyc2VJbnQoaC5zbGljZSg2LCA4KSwgMTYpIC8gMjU1O1xyXG4gICAgcmV0dXJuIHsgciwgZywgYiwgYTogYSB9O1xyXG4gIH1cclxuICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgaGV4IGNvbG9yJyk7XHJcbn1cclxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUmdiU3RyaW5nKHN0cjogc3RyaW5nKTogUkdCQSB7XHJcbiAgY29uc3QgbSA9IHN0ci5tYXRjaCgvcmdiYT9cXCgoW14pXSspXFwpLyk7XHJcbiAgaWYgKCFtKSB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgcmdiIHN0cmluZycpO1xyXG4gIGNvbnN0IHBhcnRzID0gbVsxXS5zcGxpdCgnLCcpLm1hcCgoeCkgPT4gK3gudHJpbSgpKTtcclxuICByZXR1cm4ge1xyXG4gICAgcjogcGFydHNbMF0sXHJcbiAgICBnOiBwYXJ0c1sxXSxcclxuICAgIGI6IHBhcnRzWzJdLFxyXG4gICAgYTogcGFydHNbM10gIT09IHVuZGVmaW5lZCA/IHBhcnRzWzNdIDogMSxcclxuICB9O1xyXG59XHJcbmZ1bmN0aW9uIGNsYW1wKHZhbHVlOiBudW1iZXIsIG1pbjogbnVtYmVyLCBtYXg6IG51bWJlcik6IG51bWJlciB7XHJcbiAgcmV0dXJuIE1hdGgubWF4KG1pbiwgTWF0aC5taW4obWF4LCB2YWx1ZSkpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VIc2xTdHJpbmcoc3RyOiBzdHJpbmcpOiBIU0xBIHtcclxuICBjb25zdCBtID0gc3RyLm1hdGNoKC9oc2xhP1xcKChbXildKylcXCkvaSk7XHJcbiAgaWYgKCFtKSB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgaHNsL2hzbGEgc3RyaW5nJyk7XHJcblxyXG4gIGNvbnN0IHBhcnRzID0gbVsxXS5zcGxpdCgnLCcpLm1hcCgoeCkgPT4geC50cmltKCkpO1xyXG5cclxuICBjb25zdCBoID0gY2xhbXAocGFyc2VGbG9hdChwYXJ0c1swXSksIDAsIDM2MCk7XHJcbiAgY29uc3QgcyA9IGNsYW1wKHBhcnNlRmxvYXQocGFydHNbMV0pLCAwLCAxMDApO1xyXG4gIGNvbnN0IGwgPSBjbGFtcChwYXJzZUZsb2F0KHBhcnRzWzJdKSwgMCwgMTAwKTtcclxuICBjb25zdCBhID0gcGFydHNbM10gIT09IHVuZGVmaW5lZCA/IGNsYW1wKHBhcnNlRmxvYXQocGFydHNbM10pLCAwLCAxKSA6IDE7XHJcblxyXG4gIHJldHVybiB7IGgsIHMsIGwsIGEgfTtcclxufVxyXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VIc3ZTdHJpbmcoc3RyOiBzdHJpbmcpOiBIU1ZBIHtcclxuICBjb25zdCBtID0gc3RyLm1hdGNoKC9oc3ZhP1xcKChbXildKylcXCkvaSk7XHJcbiAgaWYgKCFtKSB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgaHN2KGEpIHN0cmluZycpO1xyXG5cclxuICBjb25zdCBwYXJ0cyA9IG1bMV0uc3BsaXQoJywnKS5tYXAoKHgpID0+IHgudHJpbSgpKTtcclxuXHJcbiAgY29uc3QgaCA9IGNsYW1wKHBhcnNlRmxvYXQocGFydHNbMF0pLCAwLCAzNjApO1xyXG4gIGNvbnN0IHMgPSBjbGFtcChwYXJzZUZsb2F0KHBhcnRzWzFdKSwgMCwgMTAwKTtcclxuICBjb25zdCB2ID0gY2xhbXAocGFyc2VGbG9hdChwYXJ0c1syXSksIDAsIDEwMCk7XHJcbiAgY29uc3QgYSA9IHBhcnRzWzNdICE9PSB1bmRlZmluZWQgPyBjbGFtcChwYXJzZUZsb2F0KHBhcnRzWzNdKSwgMCwgMSkgOiAxO1xyXG5cclxuICByZXR1cm4geyBoLCBzLCB2LCBhIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUNteWtTdHJpbmcoc3RyOiBzdHJpbmcpOiBDTVlLIHtcclxuICBjb25zdCBtID0gc3RyLm1hdGNoKC9jbXlrXFwoKFteKV0rKVxcKS9pKTtcclxuICBpZiAoIW0pIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjbXlrIHN0cmluZycpO1xyXG5cclxuICBjb25zdCBwYXJ0cyA9IG1bMV0uc3BsaXQoJywnKS5tYXAoKHgpID0+IHgudHJpbSgpKTtcclxuXHJcbiAgcmV0dXJuIHtcclxuICAgIGM6IGNsYW1wKHBhcnNlRmxvYXQocGFydHNbMF0pLCAwLCAxMDApLFxyXG4gICAgbTogY2xhbXAocGFyc2VGbG9hdChwYXJ0c1sxXSksIDAsIDEwMCksXHJcbiAgICB5OiBjbGFtcChwYXJzZUZsb2F0KHBhcnRzWzJdKSwgMCwgMTAwKSxcclxuICAgIGs6IGNsYW1wKHBhcnNlRmxvYXQocGFydHNbM10pLCAwLCAxMDApLFxyXG4gIH07XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBUYWtlIGlucHV0IGZyb20gWzAsIG5dIGFuZCByZXR1cm4gaXQgYXMgWzAsIDFdXHJcbiAqIEBoaWRkZW5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBib3VuZDAxKG46IGFueSwgbWF4OiBudW1iZXIpOiBudW1iZXIge1xyXG4gIGlmIChpc09uZVBvaW50WmVybyhuKSkge1xyXG4gICAgbiA9ICcxMDAlJztcclxuICB9XHJcblxyXG4gIGNvbnN0IGlzUGVyY2VudCA9IGlzUGVyY2VudGFnZShuKTtcclxuICBuID0gbWF4ID09PSAzNjAgPyBuIDogTWF0aC5taW4obWF4LCBNYXRoLm1heCgwLCBwYXJzZUZsb2F0KG4pKSk7XHJcblxyXG4gIC8vIEF1dG9tYXRpY2FsbHkgY29udmVydCBwZXJjZW50YWdlIGludG8gbnVtYmVyXHJcbiAgaWYgKGlzUGVyY2VudCkge1xyXG4gICAgbiA9IHBhcnNlSW50KFN0cmluZyhuICogbWF4KSwgMTApIC8gMTAwO1xyXG4gIH1cclxuXHJcbiAgLy8gSGFuZGxlIGZsb2F0aW5nIHBvaW50IHJvdW5kaW5nIGVycm9yc1xyXG4gIGlmIChNYXRoLmFicyhuIC0gbWF4KSA8IDAuMDAwMDAxKSB7XHJcbiAgICByZXR1cm4gMTtcclxuICB9XHJcblxyXG4gIC8vIENvbnZlcnQgaW50byBbMCwgMV0gcmFuZ2UgaWYgaXQgaXNuJ3QgYWxyZWFkeVxyXG4gIGlmIChtYXggPT09IDM2MCkge1xyXG4gICAgLy8gSWYgbiBpcyBhIGh1ZSBnaXZlbiBpbiBkZWdyZWVzLFxyXG4gICAgLy8gd3JhcCBhcm91bmQgb3V0LW9mLXJhbmdlIHZhbHVlcyBpbnRvIFswLCAzNjBdIHJhbmdlXHJcbiAgICAvLyB0aGVuIGNvbnZlcnQgaW50byBbMCwgMV0uXHJcbiAgICBuID0gKG4gPCAwID8gKG4gJSBtYXgpICsgbWF4IDogbiAlIG1heCkgLyBwYXJzZUZsb2F0KFN0cmluZyhtYXgpKTtcclxuICB9IGVsc2Uge1xyXG4gICAgLy8gSWYgbiBub3QgYSBodWUgZ2l2ZW4gaW4gZGVncmVlc1xyXG4gICAgLy8gQ29udmVydCBpbnRvIFswLCAxXSByYW5nZSBpZiBpdCBpc24ndCBhbHJlYWR5LlxyXG4gICAgbiA9IChuICUgbWF4KSAvIHBhcnNlRmxvYXQoU3RyaW5nKG1heCkpO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIG47XHJcbn1cclxuLyoqXHJcbiAqIE5lZWQgdG8gaGFuZGxlIDEuMCBhcyAxMDAlLCBzaW5jZSBvbmNlIGl0IGlzIGEgbnVtYmVyLCB0aGVyZSBpcyBubyBkaWZmZXJlbmNlIGJldHdlZW4gaXQgYW5kIDFcclxuICogPGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNzQyMjA3Mi9qYXZhc2NyaXB0LWhvdy10by1kZXRlY3QtbnVtYmVyLWFzLWEtZGVjaW1hbC1pbmNsdWRpbmctMS0wPlxyXG4gKiBAaGlkZGVuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gaXNPbmVQb2ludFplcm8objogc3RyaW5nIHwgbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgcmV0dXJuIHR5cGVvZiBuID09PSAnc3RyaW5nJyAmJiBuLmluZGV4T2YoJy4nKSAhPT0gLTEgJiYgcGFyc2VGbG9hdChuKSA9PT0gMTtcclxufVxyXG5cclxuLyoqXHJcbiAqIENoZWNrIHRvIHNlZSBpZiBzdHJpbmcgcGFzc2VkIGluIGlzIGEgcGVyY2VudGFnZVxyXG4gKiBAaGlkZGVuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gaXNQZXJjZW50YWdlKG46IHN0cmluZyB8IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gIHJldHVybiB0eXBlb2YgbiA9PT0gJ3N0cmluZycgJiYgbi5pbmRleE9mKCclJykgIT09IC0xO1xyXG59XHJcbi8qKlxyXG4gKiBjb252ZXJ0IGFsbCBwcm9wZXJ0aWVzIGluIGFuIGludGVyZmFjZSB0byBhIG51bWJlclxyXG4gKi9cclxuZXhwb3J0IHR5cGUgTnVtYmVyaWZ5PFQ+ID0ge1xyXG4gIFtQIGluIGtleW9mIFRdOiBudW1iZXI7XHJcbn07XHJcblxyXG4vKipcclxuICogUmVwbGFjZSBhIGRlY2ltYWwgd2l0aCBpdCdzIHBlcmNlbnRhZ2UgdmFsdWVcclxuICogQGhpZGRlblxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRUb1BlcmNlbnRhZ2UobjogbnVtYmVyIHwgc3RyaW5nKTogbnVtYmVyIHwgc3RyaW5nIHtcclxuICBpZiAoTnVtYmVyKG4pIDw9IDEpIHtcclxuICAgIHJldHVybiBgJHtOdW1iZXIobikgKiAxMDB9JWA7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gbjtcclxufVxyXG5cclxuLyoqXHJcbiAqIEZvcmNlIGEgaGV4IHZhbHVlIHRvIGhhdmUgMiBjaGFyYWN0ZXJzXHJcbiAqIEBoaWRkZW5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBwYWQyKGM6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgcmV0dXJuIGMubGVuZ3RoID09PSAxID8gJzAnICsgYyA6IFN0cmluZyhjKTtcclxufVxyXG5cclxuLy8gYHJnYlRvSHNsYCwgYHJnYlRvSHN2YCwgYGhzbFRvUmdiYCwgYGhzdlRvUmdiYCBtb2RpZmllZCBmcm9tOlxyXG4vLyA8aHR0cDovL21qaWphY2tzb24uY29tLzIwMDgvMDIvcmdiLXRvLWhzbC1hbmQtcmdiLXRvLWhzdi1jb2xvci1tb2RlbC1jb252ZXJzaW9uLWFsZ29yaXRobXMtaW4tamF2YXNjcmlwdD5cclxuXHJcbi8qKlxyXG4gKiBIYW5kbGUgYm91bmRzIC8gcGVyY2VudGFnZSBjaGVja2luZyB0byBjb25mb3JtIHRvIENTUyBjb2xvciBzcGVjXHJcbiAqIDxodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLWNvbG9yLz5cclxuICogKkFzc3VtZXM6KiByLCBnLCBiIGluIFswLCAyNTVdIG9yIFswLCAxXVxyXG4gKiAqUmV0dXJuczoqIHsgciwgZywgYiB9IGluIFswLCAyNTVdXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gcmdiVG9SZ2IocjogbnVtYmVyIHwgc3RyaW5nLCBnOiBudW1iZXIgfCBzdHJpbmcsIGI6IG51bWJlciB8IHN0cmluZyk6IE51bWJlcmlmeTxSR0I+IHtcclxuICByZXR1cm4ge1xyXG4gICAgcjogYm91bmQwMShyLCAyNTUpICogMjU1LFxyXG4gICAgZzogYm91bmQwMShnLCAyNTUpICogMjU1LFxyXG4gICAgYjogYm91bmQwMShiLCAyNTUpICogMjU1LFxyXG4gIH07XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDb252ZXJ0cyBhbiBSR0IgY29sb3IgdmFsdWUgdG8gSFNMLlxyXG4gKiAqQXNzdW1lczoqIHIsIGcsIGFuZCBiIGFyZSBjb250YWluZWQgaW4gWzAsIDI1NV1cclxuICogKlJldHVybnM6KiB7IGg6IDAtMzYwLCBzOiAwLTEwMCwgbDogMC0xMDAgfVxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHJnYlRvSHNsKHI6IG51bWJlciwgZzogbnVtYmVyLCBiOiBudW1iZXIpOiBOdW1iZXJpZnk8SFNMPiB7XHJcbiAgciA9IHIgLyAyNTU7XHJcbiAgZyA9IGcgLyAyNTU7XHJcbiAgYiA9IGIgLyAyNTU7XHJcbiAgY29uc3QgbWF4ID0gTWF0aC5tYXgociwgZywgYik7XHJcbiAgY29uc3QgbWluID0gTWF0aC5taW4ociwgZywgYik7XHJcbiAgbGV0IGggPSAwO1xyXG4gIGxldCBzID0gMDtcclxuICBjb25zdCBsID0gKG1heCArIG1pbikgLyAyO1xyXG4gIGlmIChtYXggPT09IG1pbikge1xyXG4gICAgcyA9IDA7XHJcbiAgICBoID0gMDtcclxuICB9IGVsc2Uge1xyXG4gICAgY29uc3QgZCA9IG1heCAtIG1pbjtcclxuICAgIHMgPSBsID4gMC41ID8gZCAvICgyIC0gbWF4IC0gbWluKSA6IGQgLyAobWF4ICsgbWluKTtcclxuICAgIHN3aXRjaCAobWF4KSB7XHJcbiAgICAgIGNhc2UgcjpcclxuICAgICAgICBoID0gKGcgLSBiKSAvIGQgKyAoZyA8IGIgPyA2IDogMCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgZzpcclxuICAgICAgICBoID0gKGIgLSByKSAvIGQgKyAyO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIGI6XHJcbiAgICAgICAgaCA9IChyIC0gZykgLyBkICsgNDtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICAgIGggLz0gNjtcclxuICB9XHJcbiAgaCA9IChoICogMzYwKSAlIDM2MDtcclxuICBpZiAoaCA8IDApIGggKz0gMzYwO1xyXG4gIHJldHVybiB7XHJcbiAgICBoOiBtYXggPT09IG1pbiA/IDAgOiBoLFxyXG4gICAgczogbCA9PT0gMCB8fCBsID09PSAxID8gMCA6IHMgKiAxMDAsXHJcbiAgICBsOiBsICogMTAwLFxyXG4gIH07XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDb252ZXJ0cyBhbiBIU0wgY29sb3IgdmFsdWUgdG8gUkdCLlxyXG4gKiAqQXNzdW1lczoqIGggaW4gWzAsIDM2MF0sIHMgYW5kIGwgaW4gWzAsIDEwMF1cclxuICogKlJldHVybnM6KiB7IHIsIGcsIGIgfSBpbiBbMCwgMjU1XVxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGhzbFRvUmdiYShoOiBudW1iZXIgfCBzdHJpbmcsIHM6IG51bWJlciB8IHN0cmluZywgbDogbnVtYmVyIHwgc3RyaW5nLCBhOiBudW1iZXIgPSAxKTogUkdCQSB7XHJcbiAgaCA9ICtoO1xyXG4gIHMgPSArcztcclxuICBsID0gK2w7XHJcbiAgaCA9ICgoaCAlIDM2MCkgKyAzNjApICUgMzYwO1xyXG4gIHMgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigxMDAsIHMpKTtcclxuICBsID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMTAwLCBsKSk7XHJcbiAgaCA9IGggLyAzNjA7XHJcbiAgcyA9IHMgLyAxMDA7XHJcbiAgbCA9IGwgLyAxMDA7XHJcblxyXG4gIGxldCByOiBudW1iZXIsIGc6IG51bWJlciwgYjogbnVtYmVyO1xyXG5cclxuICBpZiAocyA9PT0gMCkge1xyXG4gICAgciA9IGcgPSBiID0gbDsgLy8gYWNocm9tYXRpY1xyXG4gIH0gZWxzZSB7XHJcbiAgICBjb25zdCBodWUycmdiID0gKHA6IG51bWJlciwgcTogbnVtYmVyLCB0OiBudW1iZXIpOiBudW1iZXIgPT4ge1xyXG4gICAgICBpZiAodCA8IDApIHQgKz0gMTtcclxuICAgICAgaWYgKHQgPiAxKSB0IC09IDE7XHJcbiAgICAgIGlmICh0IDwgMSAvIDYpIHJldHVybiBwICsgKHEgLSBwKSAqIDYgKiB0O1xyXG4gICAgICBpZiAodCA8IDEgLyAyKSByZXR1cm4gcTtcclxuICAgICAgaWYgKHQgPCAyIC8gMykgcmV0dXJuIHAgKyAocSAtIHApICogKDIgLyAzIC0gdCkgKiA2O1xyXG4gICAgICByZXR1cm4gcDtcclxuICAgIH07XHJcbiAgICBjb25zdCBxID0gbCA8IDAuNSA/IGwgKiAoMSArIHMpIDogbCArIHMgLSBsICogcztcclxuICAgIGNvbnN0IHAgPSAyICogbCAtIHE7XHJcbiAgICByID0gaHVlMnJnYihwLCBxLCBoICsgMSAvIDMpO1xyXG4gICAgZyA9IGh1ZTJyZ2IocCwgcSwgaCk7XHJcbiAgICBiID0gaHVlMnJnYihwLCBxLCBoIC0gMSAvIDMpO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHtcclxuICAgIHI6IE1hdGgucm91bmQociAqIDI1NSksXHJcbiAgICBnOiBNYXRoLnJvdW5kKGcgKiAyNTUpLFxyXG4gICAgYjogTWF0aC5yb3VuZChiICogMjU1KSxcclxuICAgIGE6IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIGEpKSxcclxuICB9O1xyXG59XHJcblxyXG4vKipcclxuICogQ29udmVydHMgYW4gUkdCIGNvbG9yIHZhbHVlIHRvIEhTVlxyXG4gKiAqQXNzdW1lczoqIHIsIGcsIGFuZCBiIGFyZSBjb250YWluZWQgaW4gWzAsIDI1NV1cclxuICogKlJldHVybnM6KiB7IGg6IDAtMzYwLCBzOiAwLTEwMCwgdjogMC0xMDAgfVxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHJnYlRvSHN2KHI6IG51bWJlciwgZzogbnVtYmVyLCBiOiBudW1iZXIpOiBOdW1iZXJpZnk8SFNWPiB7XHJcbiAgciA9IHIgLyAyNTU7XHJcbiAgZyA9IGcgLyAyNTU7XHJcbiAgYiA9IGIgLyAyNTU7XHJcbiAgY29uc3QgbWF4ID0gTWF0aC5tYXgociwgZywgYik7XHJcbiAgY29uc3QgbWluID0gTWF0aC5taW4ociwgZywgYik7XHJcbiAgbGV0IGggPSAwO1xyXG4gIGxldCBzID0gMDtcclxuICBjb25zdCB2ID0gbWF4O1xyXG4gIGNvbnN0IGQgPSBtYXggLSBtaW47XHJcbiAgcyA9IG1heCA9PT0gMCA/IDAgOiBkIC8gbWF4O1xyXG4gIGlmIChtYXggPT09IG1pbikge1xyXG4gICAgaCA9IDA7XHJcbiAgfSBlbHNlIHtcclxuICAgIHN3aXRjaCAobWF4KSB7XHJcbiAgICAgIGNhc2UgcjpcclxuICAgICAgICBoID0gKGcgLSBiKSAvIGQgKyAoZyA8IGIgPyA2IDogMCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgZzpcclxuICAgICAgICBoID0gKGIgLSByKSAvIGQgKyAyO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIGI6XHJcbiAgICAgICAgaCA9IChyIC0gZykgLyBkICsgNDtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICAgIGggLz0gNjtcclxuICB9XHJcbiAgaCA9IChoICogMzYwKSAlIDM2MDtcclxuICBpZiAoaCA8IDApIGggKz0gMzYwO1xyXG4gIHJldHVybiB7XHJcbiAgICBoOiBtYXggPT09IG1pbiA/IDAgOiBoLFxyXG4gICAgczogbWF4ID09PSAwID8gMCA6IHMgKiAxMDAsXHJcbiAgICB2OiB2ICogMTAwLFxyXG4gIH07XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDb252ZXJ0cyBhbiBIU1YgY29sb3IgdmFsdWUgdG8gUkdCLlxyXG4gKiAqQXNzdW1lczoqIGggaW4gWzAsIDM2MF0sIHMgYW5kIHYgaW4gWzAsIDEwMF1cclxuICogKlJldHVybnM6KiB7IHIsIGcsIGIgfSBpbiBbMCwgMjU1XVxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGhzdlRvUmdiKGg6IG51bWJlciB8IHN0cmluZywgczogbnVtYmVyIHwgc3RyaW5nLCB2OiBudW1iZXIgfCBzdHJpbmcpOiBOdW1iZXJpZnk8UkdCPiB7XHJcbiAgaCA9ICtoO1xyXG4gIHMgPSArcztcclxuICB2ID0gK3Y7XHJcbiAgaCA9ICgoaCAlIDM2MCkgKyAzNjApICUgMzYwO1xyXG4gIHMgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigxMDAsIHMpKTtcclxuICB2ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMTAwLCB2KSk7XHJcbiAgcyA9IHMgLyAxMDA7XHJcbiAgdiA9IHYgLyAxMDA7XHJcbiAgbGV0IHIgPSAwLFxyXG4gICAgZyA9IDAsXHJcbiAgICBiID0gMDtcclxuICBjb25zdCBoaSA9IE1hdGguZmxvb3IoaCAvIDYwKSAlIDY7XHJcbiAgY29uc3QgZiA9IGggLyA2MCAtIE1hdGguZmxvb3IoaCAvIDYwKTtcclxuICBjb25zdCBwID0gdiAqICgxIC0gcyk7XHJcbiAgY29uc3QgcSA9IHYgKiAoMSAtIGYgKiBzKTtcclxuICBjb25zdCB0ID0gdiAqICgxIC0gKDEgLSBmKSAqIHMpO1xyXG4gIHN3aXRjaCAoaGkpIHtcclxuICAgIGNhc2UgMDpcclxuICAgICAgciA9IHY7XHJcbiAgICAgIGcgPSB0O1xyXG4gICAgICBiID0gcDtcclxuICAgICAgYnJlYWs7XHJcbiAgICBjYXNlIDE6XHJcbiAgICAgIHIgPSBxO1xyXG4gICAgICBnID0gdjtcclxuICAgICAgYiA9IHA7XHJcbiAgICAgIGJyZWFrO1xyXG4gICAgY2FzZSAyOlxyXG4gICAgICByID0gcDtcclxuICAgICAgZyA9IHY7XHJcbiAgICAgIGIgPSB0O1xyXG4gICAgICBicmVhaztcclxuICAgIGNhc2UgMzpcclxuICAgICAgciA9IHA7XHJcbiAgICAgIGcgPSBxO1xyXG4gICAgICBiID0gdjtcclxuICAgICAgYnJlYWs7XHJcbiAgICBjYXNlIDQ6XHJcbiAgICAgIHIgPSB0O1xyXG4gICAgICBnID0gcDtcclxuICAgICAgYiA9IHY7XHJcbiAgICAgIGJyZWFrO1xyXG4gICAgY2FzZSA1OlxyXG4gICAgICByID0gdjtcclxuICAgICAgZyA9IHA7XHJcbiAgICAgIGIgPSBxO1xyXG4gICAgICBicmVhaztcclxuICB9XHJcbiAgcmV0dXJuIHtcclxuICAgIHI6IE1hdGgubWF4KDAsIE1hdGgubWluKDI1NSwgTWF0aC5yb3VuZChyICogMjU1KSkpLFxyXG4gICAgZzogTWF0aC5tYXgoMCwgTWF0aC5taW4oMjU1LCBNYXRoLnJvdW5kKGcgKiAyNTUpKSksXHJcbiAgICBiOiBNYXRoLm1heCgwLCBNYXRoLm1pbigyNTUsIE1hdGgucm91bmQoYiAqIDI1NSkpKSxcclxuICB9O1xyXG59XHJcblxyXG4vKipcclxuICogQ29udmVydHMgYW4gUkdCL1JHQkEgY29sb3IgdG8gaGV4XHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gcmdiYVRvSGV4KFxyXG4gIHI6IG51bWJlcixcclxuICBnOiBudW1iZXIsXHJcbiAgYjogbnVtYmVyLFxyXG4gIGE6IG51bWJlciA9IDEsXHJcbiAgYWxsb3dBbHBoYTogYm9vbGVhbiA9IHRydWUsXHJcbiAgYWxsb3czQ2hhcjogYm9vbGVhbiA9IGZhbHNlXHJcbik6IHN0cmluZyB7XHJcbiAgY29uc3QgdG9IZXggPSAobjogbnVtYmVyKSA9PiBuLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpO1xyXG5cclxuICBjb25zdCBySGV4ID0gdG9IZXgoTWF0aC5yb3VuZChyKSk7XHJcbiAgY29uc3QgZ0hleCA9IHRvSGV4KE1hdGgucm91bmQoZykpO1xyXG4gIGNvbnN0IGJIZXggPSB0b0hleChNYXRoLnJvdW5kKGIpKTtcclxuICBjb25zdCBhSGV4ID0gdG9IZXgoTWF0aC5yb3VuZChhICogMjU1KSk7XHJcblxyXG4gIC8vIFRyeSBjb21wcmVzc2luZyB0byAjcmdiIG9yICNyZ2JhIGlmIGFsbG93ZWQgYW5kIGFsbCBjaGFyYWN0ZXJzIGFyZSBkdXBsaWNhdGVkXHJcbiAgaWYgKGFsbG93M0NoYXIgJiYgKCFhbGxvd0FscGhhIHx8IGFIZXggPT09ICdmZicpKSB7XHJcbiAgICBjb25zdCBjYW5TaG9ydGVuID1cclxuICAgICAgckhleFswXSA9PT0gckhleFsxXSAmJiBnSGV4WzBdID09PSBnSGV4WzFdICYmI