UNPKG

angular-pipes

Version:
252 lines 28.4 kB
import * as tslib_1 from "tslib"; export function isUndefined(value) { return typeof value === 'undefined'; } export function isNull(value) { return value === null; } export function isNumber(value) { return typeof value === 'number'; } export function isNumberFinite(value) { return isNumber(value) && isFinite(value); } // Not strict positive export function isPositive(value) { return value >= 0; } export function isInteger(value) { // No rest, is an integer return value % 1 === 0; } export function isNil(value) { return value === null || typeof value === 'undefined'; } export function isString(value) { return typeof value === 'string'; } export function isObject(value) { return value !== null && typeof value === 'object'; } export function isArray(value) { return Array.isArray(value); } export function isFunction(value) { return typeof value === 'function'; } export function toDecimal(value, decimal) { return Math.round(value * Math.pow(10, decimal)) / Math.pow(10, decimal); } export function upperFirst(value) { return value.slice(0, 1).toUpperCase() + value.slice(1); } export function createRound(method) { // <any>Math to suppress error var func = Math[method]; return function (value, precision) { if (precision === void 0) { precision = 0; } if (typeof value === 'string') { throw new TypeError('Rounding method needs a number'); } if (typeof precision !== 'number' || isNaN(precision)) { precision = 0; } if (precision) { var pair = (value + "e").split('e'); var val = func(pair[0] + "e" + (+pair[1] + precision)); pair = (val + "e").split('e'); return +(pair[0] + 'e' + (+pair[1] - precision)); } return func(value); }; } export function leftPad(str, len, ch) { if (len === void 0) { len = 0; } if (ch === void 0) { ch = ' '; } str = String(str); ch = toString(ch); var i = -1; var length = len - str.length; while (++i < length && str.length + ch.length <= len) { str = ch + str; } return str; } export function rightPad(str, len, ch) { if (len === void 0) { len = 0; } if (ch === void 0) { ch = ' '; } str = String(str); ch = toString(ch); var i = -1; var length = len - str.length; while (++i < length && str.length + ch.length <= len) { str += ch; } return str; } export function toString(value) { return "" + value; } export function pad(str, len, ch) { if (len === void 0) { len = 0; } if (ch === void 0) { ch = ' '; } str = String(str); ch = toString(ch); var i = -1; var length = len - str.length; var left = true; while (++i < length) { var l = str.length + ch.length <= len ? str.length + ch.length : str.length + 1; if (left) { str = leftPad(str, l, ch); } else { str = rightPad(str, l, ch); } left = !left; } return str; } export function flatten(input, index) { if (index === void 0) { index = 0; } if (index >= input.length) { return input; } if (isArray(input[index])) { return flatten(input.slice(0, index).concat(input[index], input.slice(index + 1)), index); } return flatten(input, index + 1); } export function getProperty(value, key) { var e_1, _a; if (isNil(value) || !isObject(value)) { return undefined; } var keys = key.split('.'); var result = value[keys.shift()]; try { for (var keys_1 = tslib_1.__values(keys), keys_1_1 = keys_1.next(); !keys_1_1.done; keys_1_1 = keys_1.next()) { var key_1 = keys_1_1.value; if (isNil(result) || !isObject(result)) { return undefined; } result = result[key_1]; } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (keys_1_1 && !keys_1_1.done && (_a = keys_1.return)) _a.call(keys_1); } finally { if (e_1) throw e_1.error; } } return result; } export function sum(input, initial) { if (initial === void 0) { initial = 0; } return input.reduce(function (previous, current) { return previous + current; }, initial); } // http://stackoverflow.com/questions/6274339/how-can-i-shuffle-an-array-in-javascript export function shuffle(input) { if (!isArray(input)) { return input; } var copy = tslib_1.__spread(input); for (var i = copy.length; i; --i) { var j = Math.floor(Math.random() * i); var x = copy[i - 1]; copy[i - 1] = copy[j]; copy[j] = x; } return copy; } export function deepIndexOf(collection, value) { var index = -1; var length = collection.length; while (++index < length) { if (deepEqual(value, collection[index])) { return index; } } return -1; } export function deepEqual(a, b) { if (a === b) { return true; } if (!(typeof a === 'object' && typeof b === 'object')) { return a === b; } var keysA = Object.keys(a); var keysB = Object.keys(b); if (keysA.length !== keysB.length) { return false; } // Test for A's keys different from B. var hasOwn = Object.prototype.hasOwnProperty; for (var i = 0; i < keysA.length; i++) { var key = keysA[i]; if (!hasOwn.call(b, keysA[i]) || !deepEqual(a[key], b[key])) { return false; } } return true; } export function isDeepObject(object) { return object.__isDeepObject__; } export function wrapDeep(object) { return new DeepWrapper(object); } export function unwrapDeep(object) { if (isDeepObject(object)) { return object.data; } return object; } var DeepWrapper = /** @class */ (function () { function DeepWrapper(data) { this.data = data; this.__isDeepObject__ = true; } return DeepWrapper; }()); export { DeepWrapper }; export function count(input) { if (!isArray(input) && !isObject(input) && !isString(input)) { return input; } if (isObject(input)) { return Object.keys(input).map(function (value) { return input[value]; }).length; } return input.length; } export function empty(input) { if (!isArray(input)) { return input; } return input.length === 0; } export function every(input, predicate) { if (!isArray(input) || !predicate) { return input; } var result = true; var i = -1; while (++i < input.length && result) { result = predicate(input[i], i, input); } return result; } export function takeUntil(input, predicate) { var i = -1; var result = []; while (++i < input.length && !predicate(input[i], i, input)) { result[i] = input[i]; } return result; } export function takeWhile(input, predicate) { return takeUntil(input, function (item, index, collection) { return !predicate(item, index, collection); }); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9hbmd1bGFyLXBpcGVzLyIsInNvdXJjZXMiOlsidXRpbHMvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUVBLE1BQU0sVUFBVSxXQUFXLENBQUMsS0FBVTtJQUNwQyxPQUFPLE9BQU8sS0FBSyxLQUFLLFdBQVcsQ0FBQztBQUN0QyxDQUFDO0FBRUQsTUFBTSxVQUFVLE1BQU0sQ0FBQyxLQUFVO0lBQy9CLE9BQU8sS0FBSyxLQUFLLElBQUksQ0FBQztBQUN4QixDQUFDO0FBRUQsTUFBTSxVQUFVLFFBQVEsQ0FBQyxLQUFVO0lBQ2pDLE9BQU8sT0FBTyxLQUFLLEtBQUssUUFBUSxDQUFDO0FBQ25DLENBQUM7QUFFRCxNQUFNLFVBQVUsY0FBYyxDQUFDLEtBQVU7SUFDdkMsT0FBTyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzVDLENBQUM7QUFFRCxzQkFBc0I7QUFDdEIsTUFBTSxVQUFVLFVBQVUsQ0FBQyxLQUFhO0lBQ3RDLE9BQU8sS0FBSyxJQUFJLENBQUMsQ0FBQztBQUNwQixDQUFDO0FBRUQsTUFBTSxVQUFVLFNBQVMsQ0FBQyxLQUFhO0lBQ3JDLHlCQUF5QjtJQUN6QixPQUFPLEtBQUssR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3pCLENBQUM7QUFFRCxNQUFNLFVBQVUsS0FBSyxDQUFDLEtBQVU7SUFDOUIsT0FBTyxLQUFLLEtBQUssSUFBSSxJQUFJLE9BQU8sS0FBSyxLQUFLLFdBQVcsQ0FBQztBQUN4RCxDQUFDO0FBRUQsTUFBTSxVQUFVLFFBQVEsQ0FBQyxLQUFVO0lBQ2pDLE9BQU8sT0FBTyxLQUFLLEtBQUssUUFBUSxDQUFDO0FBQ25DLENBQUM7QUFFRCxNQUFNLFVBQVUsUUFBUSxDQUFDLEtBQVU7SUFDakMsT0FBTyxLQUFLLEtBQUssSUFBSSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQztBQUNyRCxDQUFDO0FBRUQsTUFBTSxVQUFVLE9BQU8sQ0FBQyxLQUFVO0lBQ2hDLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUM5QixDQUFDO0FBRUQsTUFBTSxVQUFVLFVBQVUsQ0FBQyxLQUFVO0lBQ25DLE9BQU8sT0FBTyxLQUFLLEtBQUssVUFBVSxDQUFDO0FBQ3JDLENBQUM7QUFFRCxNQUFNLFVBQVUsU0FBUyxDQUFDLEtBQWEsRUFBRSxPQUFlO0lBQ3RELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUMzRSxDQUFDO0FBRUQsTUFBTSxVQUFVLFVBQVUsQ0FBQyxLQUFhO0lBQ3RDLE9BQU8sS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMxRCxDQUFDO0FBRUQsTUFBTSxVQUFVLFdBQVcsQ0FBQyxNQUFjO0lBQ3hDLDhCQUE4QjtJQUM5QixJQUFNLElBQUksR0FBYyxJQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdEMsT0FBTyxVQUFTLEtBQWEsRUFBRSxTQUFxQjtRQUFyQiwwQkFBQSxFQUFBLGFBQXFCO1FBQ2xELElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFO1lBQzdCLE1BQU0sSUFBSSxTQUFTLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztTQUN2RDtRQUVELElBQUksT0FBTyxTQUFTLEtBQUssUUFBUSxJQUFJLEtBQUssQ0FBQyxTQUFTLENBQUMsRUFBRTtZQUNyRCxTQUFTLEdBQUcsQ0FBQyxDQUFDO1NBQ2Y7UUFFRCxJQUFJLFNBQVMsRUFBRTtZQUNiLElBQUksSUFBSSxHQUFHLENBQUcsS0FBSyxNQUFHLENBQUEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDbEMsSUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBRyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQztZQUV6RCxJQUFJLEdBQUcsQ0FBRyxHQUFHLE1BQUcsQ0FBQSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM1QixPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQztTQUNsRDtRQUVELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3JCLENBQUMsQ0FBQztBQUNKLENBQUM7QUFFRCxNQUFNLFVBQVUsT0FBTyxDQUFDLEdBQVcsRUFBRSxHQUFlLEVBQUUsRUFBYTtJQUE5QixvQkFBQSxFQUFBLE9BQWU7SUFBRSxtQkFBQSxFQUFBLFFBQWE7SUFDakUsR0FBRyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNsQixFQUFFLEdBQUcsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2xCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ1gsSUFBTSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUM7SUFFaEMsT0FBTyxFQUFFLENBQUMsR0FBRyxNQUFNLElBQUksR0FBRyxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUMsTUFBTSxJQUFJLEdBQUcsRUFBRTtRQUNwRCxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQztLQUNoQjtJQUVELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVELE1BQU0sVUFBVSxRQUFRLENBQUMsR0FBVyxFQUFFLEdBQWUsRUFBRSxFQUFhO0lBQTlCLG9CQUFBLEVBQUEsT0FBZTtJQUFFLG1CQUFBLEVBQUEsUUFBYTtJQUNsRSxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2xCLEVBQUUsR0FBRyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7SUFFbEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDWCxJQUFNLE1BQU0sR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQztJQUVoQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLE1BQU0sSUFBSSxHQUFHLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQyxNQUFNLElBQUksR0FBRyxFQUFFO1FBQ3BELEdBQUcsSUFBSSxFQUFFLENBQUM7S0FDWDtJQUVELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVELE1BQU0sVUFBVSxRQUFRLENBQUMsS0FBc0I7SUFDN0MsT0FBTyxLQUFHLEtBQU8sQ0FBQztBQUNwQixDQUFDO0FBRUQsTUFBTSxVQUFVLEdBQUcsQ0FBQyxHQUFXLEVBQUUsR0FBZSxFQUFFLEVBQWE7SUFBOUIsb0JBQUEsRUFBQSxPQUFlO0lBQUUsbUJBQUEsRUFBQSxRQUFhO0lBQzdELEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbEIsRUFBRSxHQUFHLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNsQixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNYLElBQU0sTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDO0lBRWhDLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQztJQUNoQixPQUFPLEVBQUUsQ0FBQyxHQUFHLE1BQU0sRUFBRTtRQUNuQixJQUFNLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQyxNQUFNLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBRWxGLElBQUksSUFBSSxFQUFFO1lBQ1IsR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1NBQzNCO2FBQU07WUFDTCxHQUFHLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7U0FDNUI7UUFFRCxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUM7S0FDZDtJQUVELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVELE1BQU0sVUFBVSxPQUFPLENBQUMsS0FBWSxFQUFFLEtBQWlCO0lBQWpCLHNCQUFBLEVBQUEsU0FBaUI7SUFDckQsSUFBSSxLQUFLLElBQUksS0FBSyxDQUFDLE1BQU0sRUFBRTtRQUN6QixPQUFPLEtBQUssQ0FBQztLQUNkO0lBRUQsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUU7UUFDekIsT0FBTyxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0tBQzNGO0lBRUQsT0FBTyxPQUFPLENBQUMsS0FBSyxFQUFFLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNuQyxDQUFDO0FBRUQsTUFBTSxVQUFVLFdBQVcsQ0FBQyxLQUE2QixFQUFFLEdBQVc7O0lBQ3BFLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFO1FBQ3BDLE9BQU8sU0FBUyxDQUFDO0tBQ2xCO0lBRUQsSUFBTSxJQUFJLEdBQWEsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN0QyxJQUFJLE1BQU0sR0FBUSxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRyxDQUFDLENBQUM7O1FBRXZDLEtBQWtCLElBQUEsU0FBQSxpQkFBQSxJQUFJLENBQUEsMEJBQUEsNENBQUU7WUFBbkIsSUFBTSxLQUFHLGlCQUFBO1lBQ1osSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUU7Z0JBQ3RDLE9BQU8sU0FBUyxDQUFDO2FBQ2xCO1lBRUQsTUFBTSxHQUFHLE1BQU0sQ0FBQyxLQUFHLENBQUMsQ0FBQztTQUN0Qjs7Ozs7Ozs7O0lBRUQsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELE1BQU0sVUFBVSxHQUFHLENBQUMsS0FBb0IsRUFBRSxPQUFXO0lBQVgsd0JBQUEsRUFBQSxXQUFXO0lBQ25ELE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxVQUFDLFFBQWdCLEVBQUUsT0FBZSxJQUFLLE9BQUEsUUFBUSxHQUFHLE9BQU8sRUFBbEIsQ0FBa0IsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUMxRixDQUFDO0FBRUQsc0ZBQXNGO0FBQ3RGLE1BQU0sVUFBVSxPQUFPLENBQUMsS0FBVTtJQUNoQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFO1FBQ25CLE9BQU8sS0FBSyxDQUFDO0tBQ2Q7SUFFRCxJQUFNLElBQUksb0JBQU8sS0FBSyxDQUFDLENBQUM7SUFFeEIsS0FBSyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRTtRQUNoQyxJQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN4QyxJQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3RCLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RCLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7S0FDYjtJQUVELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVELE1BQU0sVUFBVSxXQUFXLENBQUMsVUFBaUIsRUFBRSxLQUFVO0lBQ3ZELElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ2YsSUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQztJQUVqQyxPQUFPLEVBQUUsS0FBSyxHQUFHLE1BQU0sRUFBRTtRQUN2QixJQUFJLFNBQVMsQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUU7WUFDdkMsT0FBTyxLQUFLLENBQUM7U0FDZDtLQUNGO0lBRUQsT0FBTyxDQUFDLENBQUMsQ0FBQztBQUNaLENBQUM7QUFFRCxNQUFNLFVBQVUsU0FBUyxDQUFDLENBQU0sRUFBRSxDQUFNO0lBQ3RDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRTtRQUNYLE9BQU8sSUFBSSxDQUFDO0tBQ2I7SUFFRCxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxRQUFRLElBQUksT0FBTyxDQUFDLEtBQUssUUFBUSxDQUFDLEVBQUU7UUFDckQsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0tBQ2hCO0lBRUQsSUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM3QixJQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRTdCLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxLQUFLLENBQUMsTUFBTSxFQUFFO1FBQ2pDLE9BQU8sS0FBSyxDQUFDO0tBQ2Q7SUFFRCxzQ0FBc0M7SUFDdEMsSUFBSSxNQUFNLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUM7SUFDN0MsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDckMsSUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3JCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUU7WUFDM0QsT0FBTyxLQUFLLENBQUM7U0FDZDtLQUNGO0lBRUQsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQsTUFBTSxVQUFVLFlBQVksQ0FBQyxNQUFXO0lBQ3RDLE9BQU8sTUFBTSxDQUFDLGdCQUFnQixDQUFDO0FBQ2pDLENBQUM7QUFFRCxNQUFNLFVBQVUsUUFBUSxDQUFDLE1BQVc7SUFDbEMsT0FBTyxJQUFJLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUNqQyxDQUFDO0FBRUQsTUFBTSxVQUFVLFVBQVUsQ0FBQyxNQUFXO0lBQ3BDLElBQUksWUFBWSxDQUFDLE1BQU0sQ0FBQyxFQUFFO1FBQ3hCLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQztLQUNwQjtJQUVELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRDtJQUdFLHFCQUFtQixJQUFTO1FBQVQsU0FBSSxHQUFKLElBQUksQ0FBSztRQUZyQixxQkFBZ0IsR0FBWSxJQUFJLENBQUM7SUFFVCxDQUFDO0lBQ2xDLGtCQUFDO0FBQUQsQ0FBQyxBQUpELElBSUM7O0FBRUQsTUFBTSxVQUFVLEtBQUssQ0FBQyxLQUFVO0lBQzlCLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUU7UUFDM0QsT0FBTyxLQUFLLENBQUM7S0FDZDtJQUVELElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFO1FBQ25CLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBQSxLQUFLLElBQUksT0FBQSxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQVosQ0FBWSxDQUFDLENBQUMsTUFBTSxDQUFDO0tBQzdEO0lBRUQsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDO0FBQ3RCLENBQUM7QUFFRCxNQUFNLFVBQVUsS0FBSyxDQUFDLEtBQVU7SUFDOUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtRQUNuQixPQUFPLEtBQUssQ0FBQztLQUNkO0lBRUQsT0FBTyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQztBQUM1QixDQUFDO0FBRUQsTUFBTSxVQUFVLEtBQUssQ0FBQyxLQUFVLEVBQUUsU0FBOEI7SUFDOUQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRTtRQUNqQyxPQUFPLEtBQUssQ0FBQztLQUNkO0lBRUQsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDO0lBQ2xCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBRVgsT0FBTyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxJQUFJLE1BQU0sRUFBRTtRQUNuQyxNQUFNLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7S0FDeEM7SUFFRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQsTUFBTSxVQUFVLFNBQVMsQ0FBQyxLQUFZLEVBQUUsU0FBOEI7SUFDcEUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDWCxJQUFNLE1BQU0sR0FBUSxFQUFFLENBQUM7SUFDdkIsT0FBTyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLEVBQUU7UUFDM0QsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUN0QjtJQUVELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRCxNQUFNLFVBQVUsU0FBUyxDQUFDLEtBQVksRUFBRSxTQUE4QjtJQUNwRSxPQUFPLFNBQVMsQ0FBQyxLQUFLLEVBQUUsVUFBQyxJQUFTLEVBQUUsS0FBYSxFQUFFLFVBQWlCLElBQUssT0FBQSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLFVBQVUsQ0FBQyxFQUFuQyxDQUFtQyxDQUFDLENBQUM7QUFDaEgsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIENvbGxlY3Rpb25QcmVkaWNhdGUgPSAoaXRlbT86IGFueSwgaW5kZXg/OiBudW1iZXIsIGNvbGxlY3Rpb24/OiBhbnlbXSkgPT4gYm9vbGVhbjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc1VuZGVmaW5lZCh2YWx1ZTogYW55KTogdmFsdWUgaXMgdW5kZWZpbmVkIHtcclxuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJztcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGlzTnVsbCh2YWx1ZTogYW55KTogdmFsdWUgaXMgbnVsbCB7XHJcbiAgcmV0dXJuIHZhbHVlID09PSBudWxsO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNOdW1iZXIodmFsdWU6IGFueSk6IHZhbHVlIGlzIG51bWJlciB7XHJcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcic7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc051bWJlckZpbml0ZSh2YWx1ZTogYW55KTogdmFsdWUgaXMgbnVtYmVyIHtcclxuICByZXR1cm4gaXNOdW1iZXIodmFsdWUpICYmIGlzRmluaXRlKHZhbHVlKTtcclxufVxyXG5cclxuLy8gTm90IHN0cmljdCBwb3NpdGl2ZVxyXG5leHBvcnQgZnVuY3Rpb24gaXNQb3NpdGl2ZSh2YWx1ZTogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgcmV0dXJuIHZhbHVlID49IDA7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc0ludGVnZXIodmFsdWU6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gIC8vIE5vIHJlc3QsIGlzIGFuIGludGVnZXJcclxuICByZXR1cm4gdmFsdWUgJSAxID09PSAwO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNOaWwodmFsdWU6IGFueSk6IHZhbHVlIGlzIG51bGwgfCB1bmRlZmluZWQge1xyXG4gIHJldHVybiB2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNTdHJpbmcodmFsdWU6IGFueSk6IHZhbHVlIGlzIHN0cmluZyB7XHJcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZyc7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc09iamVjdCh2YWx1ZTogYW55KTogYm9vbGVhbiB7XHJcbiAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCc7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc0FycmF5KHZhbHVlOiBhbnkpOiBib29sZWFuIHtcclxuICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc0Z1bmN0aW9uKHZhbHVlOiBhbnkpOiBib29sZWFuIHtcclxuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdG9EZWNpbWFsKHZhbHVlOiBudW1iZXIsIGRlY2ltYWw6IG51bWJlcik6IG51bWJlciB7XHJcbiAgcmV0dXJuIE1hdGgucm91bmQodmFsdWUgKiBNYXRoLnBvdygxMCwgZGVjaW1hbCkpIC8gTWF0aC5wb3coMTAsIGRlY2ltYWwpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdXBwZXJGaXJzdCh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICByZXR1cm4gdmFsdWUuc2xpY2UoMCwgMSkudG9VcHBlckNhc2UoKSArIHZhbHVlLnNsaWNlKDEpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUm91bmQobWV0aG9kOiBzdHJpbmcpOiBGdW5jdGlvbiB7XHJcbiAgLy8gPGFueT5NYXRoIHRvIHN1cHByZXNzIGVycm9yXHJcbiAgY29uc3QgZnVuYzogYW55ID0gKDxhbnk+TWF0aClbbWV0aG9kXTtcclxuICByZXR1cm4gZnVuY3Rpb24odmFsdWU6IG51bWJlciwgcHJlY2lzaW9uOiBudW1iZXIgPSAwKSB7XHJcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xyXG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdSb3VuZGluZyBtZXRob2QgbmVlZHMgYSBudW1iZXInKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodHlwZW9mIHByZWNpc2lvbiAhPT0gJ251bWJlcicgfHwgaXNOYU4ocHJlY2lzaW9uKSkge1xyXG4gICAgICBwcmVjaXNpb24gPSAwO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChwcmVjaXNpb24pIHtcclxuICAgICAgbGV0IHBhaXIgPSBgJHt2YWx1ZX1lYC5zcGxpdCgnZScpO1xyXG4gICAgICBjb25zdCB2YWwgPSBmdW5jKGAke3BhaXJbMF19ZWAgKyAoK3BhaXJbMV0gKyBwcmVjaXNpb24pKTtcclxuXHJcbiAgICAgIHBhaXIgPSBgJHt2YWx9ZWAuc3BsaXQoJ2UnKTtcclxuICAgICAgcmV0dXJuICsocGFpclswXSArICdlJyArICgrcGFpclsxXSAtIHByZWNpc2lvbikpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmdW5jKHZhbHVlKTtcclxuICB9O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gbGVmdFBhZChzdHI6IHN0cmluZywgbGVuOiBudW1iZXIgPSAwLCBjaDogYW55ID0gJyAnKSB7XHJcbiAgc3RyID0gU3RyaW5nKHN0cik7XHJcbiAgY2ggPSB0b1N0cmluZyhjaCk7XHJcbiAgbGV0IGkgPSAtMTtcclxuICBjb25zdCBsZW5ndGggPSBsZW4gLSBzdHIubGVuZ3RoO1xyXG5cclxuICB3aGlsZSAoKytpIDwgbGVuZ3RoICYmIHN0ci5sZW5ndGggKyBjaC5sZW5ndGggPD0gbGVuKSB7XHJcbiAgICBzdHIgPSBjaCArIHN0cjtcclxuICB9XHJcblxyXG4gIHJldHVybiBzdHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiByaWdodFBhZChzdHI6IHN0cmluZywgbGVuOiBudW1iZXIgPSAwLCBjaDogYW55ID0gJyAnKSB7XHJcbiAgc3RyID0gU3RyaW5nKHN0cik7XHJcbiAgY2ggPSB0b1N0cmluZyhjaCk7XHJcblxyXG4gIGxldCBpID0gLTE7XHJcbiAgY29uc3QgbGVuZ3RoID0gbGVuIC0gc3RyLmxlbmd0aDtcclxuXHJcbiAgd2hpbGUgKCsraSA8IGxlbmd0aCAmJiBzdHIubGVuZ3RoICsgY2gubGVuZ3RoIDw9IGxlbikge1xyXG4gICAgc3RyICs9IGNoO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHN0cjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHRvU3RyaW5nKHZhbHVlOiBudW1iZXIgfCBzdHJpbmcpIHtcclxuICByZXR1cm4gYCR7dmFsdWV9YDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHBhZChzdHI6IHN0cmluZywgbGVuOiBudW1iZXIgPSAwLCBjaDogYW55ID0gJyAnKTogc3RyaW5nIHtcclxuICBzdHIgPSBTdHJpbmcoc3RyKTtcclxuICBjaCA9IHRvU3RyaW5nKGNoKTtcclxuICBsZXQgaSA9IC0xO1xyXG4gIGNvbnN0IGxlbmd0aCA9IGxlbiAtIHN0ci5sZW5ndGg7XHJcblxyXG4gIGxldCBsZWZ0ID0gdHJ1ZTtcclxuICB3aGlsZSAoKytpIDwgbGVuZ3RoKSB7XHJcbiAgICBjb25zdCBsID0gc3RyLmxlbmd0aCArIGNoLmxlbmd0aCA8PSBsZW4gPyBzdHIubGVuZ3RoICsgY2gubGVuZ3RoIDogc3RyLmxlbmd0aCArIDE7XHJcblxyXG4gICAgaWYgKGxlZnQpIHtcclxuICAgICAgc3RyID0gbGVmdFBhZChzdHIsIGwsIGNoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHN0ciA9IHJpZ2h0UGFkKHN0ciwgbCwgY2gpO1xyXG4gICAgfVxyXG5cclxuICAgIGxlZnQgPSAhbGVmdDtcclxuICB9XHJcblxyXG4gIHJldHVybiBzdHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBmbGF0dGVuKGlucHV0OiBhbnlbXSwgaW5kZXg6IG51bWJlciA9IDApOiBhbnlbXSB7XHJcbiAgaWYgKGluZGV4ID49IGlucHV0Lmxlbmd0aCkge1xyXG4gICAgcmV0dXJuIGlucHV0O1xyXG4gIH1cclxuXHJcbiAgaWYgKGlzQXJyYXkoaW5wdXRbaW5kZXhdKSkge1xyXG4gICAgcmV0dXJuIGZsYXR0ZW4oaW5wdXQuc2xpY2UoMCwgaW5kZXgpLmNvbmNhdChpbnB1dFtpbmRleF0sIGlucHV0LnNsaWNlKGluZGV4ICsgMSkpLCBpbmRleCk7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gZmxhdHRlbihpbnB1dCwgaW5kZXggKyAxKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFByb3BlcnR5KHZhbHVlOiB7IFtrZXk6IHN0cmluZ106IGFueSB9LCBrZXk6IHN0cmluZyk6IGFueSB7XHJcbiAgaWYgKGlzTmlsKHZhbHVlKSB8fCAhaXNPYmplY3QodmFsdWUpKSB7XHJcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgY29uc3Qga2V5czogc3RyaW5nW10gPSBrZXkuc3BsaXQoJy4nKTtcclxuICBsZXQgcmVzdWx0OiBhbnkgPSB2YWx1ZVtrZXlzLnNoaWZ0KCkhXTtcclxuXHJcbiAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xyXG4gICAgaWYgKGlzTmlsKHJlc3VsdCkgfHwgIWlzT2JqZWN0KHJlc3VsdCkpIHtcclxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICByZXN1bHQgPSByZXN1bHRba2V5XTtcclxuICB9XHJcblxyXG4gIHJldHVybiByZXN1bHQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzdW0oaW5wdXQ6IEFycmF5PG51bWJlcj4sIGluaXRpYWwgPSAwKTogbnVtYmVyIHtcclxuICByZXR1cm4gaW5wdXQucmVkdWNlKChwcmV2aW91czogbnVtYmVyLCBjdXJyZW50OiBudW1iZXIpID0+IHByZXZpb3VzICsgY3VycmVudCwgaW5pdGlhbCk7XHJcbn1cclxuXHJcbi8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNjI3NDMzOS9ob3ctY2FuLWktc2h1ZmZsZS1hbi1hcnJheS1pbi1qYXZhc2NyaXB0XHJcbmV4cG9ydCBmdW5jdGlvbiBzaHVmZmxlKGlucHV0OiBhbnkpOiBhbnkge1xyXG4gIGlmICghaXNBcnJheShpbnB1dCkpIHtcclxuICAgIHJldHVybiBpbnB1dDtcclxuICB9XHJcblxyXG4gIGNvbnN0IGNvcHkgPSBbLi4uaW5wdXRdO1xyXG5cclxuICBmb3IgKGxldCBpID0gY29weS5sZW5ndGg7IGk7IC0taSkge1xyXG4gICAgY29uc3QgaiA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGkpO1xyXG4gICAgY29uc3QgeCA9IGNvcHlbaSAtIDFdO1xyXG4gICAgY29weVtpIC0gMV0gPSBjb3B5W2pdO1xyXG4gICAgY29weVtqXSA9IHg7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gY29weTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGRlZXBJbmRleE9mKGNvbGxlY3Rpb246IGFueVtdLCB2YWx1ZTogYW55KSB7XHJcbiAgbGV0IGluZGV4ID0gLTE7XHJcbiAgY29uc3QgbGVuZ3RoID0gY29sbGVjdGlvbi5sZW5ndGg7XHJcblxyXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XHJcbiAgICBpZiAoZGVlcEVxdWFsKHZhbHVlLCBjb2xsZWN0aW9uW2luZGV4XSkpIHtcclxuICAgICAgcmV0dXJuIGluZGV4O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIC0xO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZGVlcEVxdWFsKGE6IGFueSwgYjogYW55KSB7XHJcbiAgaWYgKGEgPT09IGIpIHtcclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgaWYgKCEodHlwZW9mIGEgPT09ICdvYmplY3QnICYmIHR5cGVvZiBiID09PSAnb2JqZWN0JykpIHtcclxuICAgIHJldHVybiBhID09PSBiO1xyXG4gIH1cclxuXHJcbiAgY29uc3Qga2V5c0EgPSBPYmplY3Qua2V5cyhhKTtcclxuICBjb25zdCBrZXlzQiA9IE9iamVjdC5rZXlzKGIpO1xyXG5cclxuICBpZiAoa2V5c0EubGVuZ3RoICE9PSBrZXlzQi5sZW5ndGgpIHtcclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vIFRlc3QgZm9yIEEncyBrZXlzIGRpZmZlcmVudCBmcm9tIEIuXHJcbiAgdmFyIGhhc093biA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XHJcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzQS5sZW5ndGg7IGkrKykge1xyXG4gICAgY29uc3Qga2V5ID0ga2V5c0FbaV07XHJcbiAgICBpZiAoIWhhc093bi5jYWxsKGIsIGtleXNBW2ldKSB8fCAhZGVlcEVxdWFsKGFba2V5XSwgYltrZXldKSkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXR1cm4gdHJ1ZTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGlzRGVlcE9iamVjdChvYmplY3Q6IGFueSkge1xyXG4gIHJldHVybiBvYmplY3QuX19pc0RlZXBPYmplY3RfXztcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHdyYXBEZWVwKG9iamVjdDogYW55KSB7XHJcbiAgcmV0dXJuIG5ldyBEZWVwV3JhcHBlcihvYmplY3QpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdW53cmFwRGVlcChvYmplY3Q6IGFueSkge1xyXG4gIGlmIChpc0RlZXBPYmplY3Qob2JqZWN0KSkge1xyXG4gICAgcmV0dXJuIG9iamVjdC5kYXRhO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIG9iamVjdDtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIERlZXBXcmFwcGVyIHtcclxuICBwdWJsaWMgX19pc0RlZXBPYmplY3RfXzogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBkYXRhOiBhbnkpIHt9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjb3VudChpbnB1dDogYW55KTogYW55IHtcclxuICBpZiAoIWlzQXJyYXkoaW5wdXQpICYmICFpc09iamVjdChpbnB1dCkgJiYgIWlzU3RyaW5nKGlucHV0KSkge1xyXG4gICAgcmV0dXJuIGlucHV0O1xyXG4gIH1cclxuXHJcbiAgaWYgKGlzT2JqZWN0KGlucHV0KSkge1xyXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKGlucHV0KS5tYXAodmFsdWUgPT4gaW5wdXRbdmFsdWVdKS5sZW5ndGg7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gaW5wdXQubGVuZ3RoO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZW1wdHkoaW5wdXQ6IGFueSk6IGFueSB7XHJcbiAgaWYgKCFpc0FycmF5KGlucHV0KSkge1xyXG4gICAgcmV0dXJuIGlucHV0O1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGlucHV0Lmxlbmd0aCA9PT0gMDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGV2ZXJ5KGlucHV0OiBhbnksIHByZWRpY2F0ZTogQ29sbGVjdGlvblByZWRpY2F0ZSkge1xyXG4gIGlmICghaXNBcnJheShpbnB1dCkgfHwgIXByZWRpY2F0ZSkge1xyXG4gICAgcmV0dXJuIGlucHV0O1xyXG4gIH1cclxuXHJcbiAgbGV0IHJlc3VsdCA9IHRydWU7XHJcbiAgbGV0IGkgPSAtMTtcclxuXHJcbiAgd2hpbGUgKCsraSA8IGlucHV0Lmxlbmd0aCAmJiByZXN1bHQpIHtcclxuICAgIHJlc3VsdCA9IHByZWRpY2F0ZShpbnB1dFtpXSwgaSwgaW5wdXQpO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHRha2VVbnRpbChpbnB1dDogYW55W10sIHByZWRpY2F0ZTogQ29sbGVjdGlvblByZWRpY2F0ZSkge1xyXG4gIGxldCBpID0gLTE7XHJcbiAgY29uc3QgcmVzdWx0OiBhbnkgPSBbXTtcclxuICB3aGlsZSAoKytpIDwgaW5wdXQubGVuZ3RoICYmICFwcmVkaWNhdGUoaW5wdXRbaV0sIGksIGlucHV0KSkge1xyXG4gICAgcmVzdWx0W2ldID0gaW5wdXRbaV07XHJcbiAgfVxyXG5cclxuICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdGFrZVdoaWxlKGlucHV0OiBhbnlbXSwgcHJlZGljYXRlOiBDb2xsZWN0aW9uUHJlZGljYXRlKSB7XHJcbiAgcmV0dXJuIHRha2VVbnRpbChpbnB1dCwgKGl0ZW06IGFueSwgaW5kZXg6IG51bWJlciwgY29sbGVjdGlvbjogYW55W10pID0+ICFwcmVkaWNhdGUoaXRlbSwgaW5kZXgsIGNvbGxlY3Rpb24pKTtcclxufVxyXG4iXX0=