UNPKG

@tangential/core

Version:

Core types and support code for Tangential

157 lines 17.2 kB
export const ResolveVoid = undefined; export class ObjectUtil { /** * Null safe version of Object.keys. * @param map * @returns {string[]} The keys for the map, or an empty array if the argument provided is falsy. */ static keys(map) { return Object.keys(map || {}); } /** * Provide a map of keys such that 'map[key]' provides a literal true value if the key is present, even if the value * on the source map is falsy. */ static toTruthMap(ary) { const map = {}; ary.forEach(value => map[value] = true); return map; } /** * Expand the map into an array of key-value pairs. * @param {ObjMap<T extends object>} map * @returns MapEntry<T> */ static entries(map) { const ret = Object.keys(map || {}).map((key) => { return { key: key, value: map[key] }; }); return ret; } /** * Provide the values of the map. * @param {ObjMap<T>} map * @returns MapEntry<T> */ static values(map) { return Object.keys(map || {}).map((key) => { return map[key]; }); } static isObject(value) { return (typeof value === 'object' || value.constructor === Object); } static isFunction(value) { return (typeof value === 'function' || value instanceof Function); } static isNullOrDefined(value) { return value === null || value === undefined; } static exists(value) { return value !== null && value !== undefined; } static assignDeep(target, ...sources) { target = target || {}; const L = sources.length; for (let i = 0; i < L; i++) { const source = sources[i] || {}; Object.keys(source).forEach(key => { const value = source[key]; if (value && ObjectUtil.isObject(value)) { target[key] = ObjectUtil.assignDeep({}, target[key] || {}, value); } else { target[key] = value; } }); } return target; } static removeNullish(obj) { const cleanObj = {}; Object.keys(obj).forEach((key) => { const v = obj[key]; if (v !== null && v !== undefined) { cleanObj[key] = v; } }); return cleanObj; } } export const cleanFirebaseMap = function (firebaseList, deep) { const result = {}; Object.keys(firebaseList).forEach((key) => { if (key[0] !== '$') { if (deep && firebaseList[key] instanceof Object) { result[key] = cleanFirebaseMap(firebaseList[key], true); } else { result[key] = firebaseList[key]; } } }); return result; }; export const pathExists = (object, path) => { const parts = path.split('\.'); let exists = true; let obj = object; for (let i = 0; i < parts.length; i++) { obj = obj[parts[i]]; if (obj === undefined) { exists = false; break; } } return exists; }; export const ensureExists = (object, path, value = true) => { const parts = path.split('\.'); let obj = object; for (let i = 0; i < parts.length - 1; i++) { const key = parts[i]; if (obj[key] === undefined) { obj[key] = {}; } obj = obj[key]; } const lastKey = parts[parts.length - 1]; if (obj[lastKey] === undefined) { obj[lastKey] = value; } return obj[lastKey]; }; export const removeIfExists = (object, path) => { const parts = path.split('\.'); let obj = object; let existed = true; for (let i = 0; i < parts.length - 1; i++) { obj = obj[parts[i]]; if (obj === undefined) { existed = false; break; } } if (existed) { const lastKey = parts[parts.length - 1]; existed = obj[lastKey] !== undefined; if (existed) { delete obj[lastKey]; } } return existed; }; export const safe = (fn) => { try { return fn(); } catch (e) { return null; } }; export const eachKey = (objMap, fn) => { Object.keys(objMap).forEach((key) => { fn(objMap[key], key); }); }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29yZS11dGlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ2VudGlhbC9jb3JlL3NyYy9saWIvdXRpbC9jb3JlLXV0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBTUEsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHLFNBQVMsQ0FBQTtBQUVwQyxNQUFNLE9BQU8sVUFBVTtJQUdyQjs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLElBQUksQ0FBSSxHQUFjO1FBQzNCLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLENBQUE7SUFDL0IsQ0FBQztJQUVEOzs7T0FHRztJQUNILE1BQU0sQ0FBQyxVQUFVLENBQUMsR0FBYTtRQUM3QixNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUE7UUFDZCxHQUFHLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUUsR0FBVyxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFBO1FBQ2hELE9BQU8sR0FBRyxDQUFBO0lBQ1osQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxNQUFNLENBQUMsT0FBTyxDQUFJLEdBQW9CO1FBQ3BDLE1BQU0sR0FBRyxHQUFrQixNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUM1RCxPQUFPLEVBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFDLENBQUE7UUFDcEMsQ0FBQyxDQUFDLENBQUE7UUFDRixPQUFPLEdBQUcsQ0FBQTtJQUNaLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLE1BQU0sQ0FBSSxHQUFvQjtRQUNuQyxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ3hDLE9BQU8sR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQ2pCLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVELE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBUztRQUN2QixPQUFPLENBQUMsT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssQ0FBQyxXQUFXLEtBQUssTUFBTSxDQUFDLENBQUE7SUFDcEUsQ0FBQztJQUVELE1BQU0sQ0FBQyxVQUFVLENBQUMsS0FBUztRQUN6QixPQUFPLENBQUMsT0FBTyxLQUFLLEtBQUssVUFBVSxJQUFJLEtBQUssWUFBWSxRQUFRLENBQUMsQ0FBQTtJQUNuRSxDQUFDO0lBRUQsTUFBTSxDQUFDLGVBQWUsQ0FBQyxLQUFTO1FBQzlCLE9BQU8sS0FBSyxLQUFLLElBQUksSUFBSSxLQUFLLEtBQUssU0FBUyxDQUFBO0lBQzlDLENBQUM7SUFFRCxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQVM7UUFDckIsT0FBTyxLQUFLLEtBQUssSUFBSSxJQUFJLEtBQUssS0FBSyxTQUFTLENBQUE7SUFDOUMsQ0FBQztJQUVELE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBVyxFQUFFLEdBQUcsT0FBYztRQUM5QyxNQUFNLEdBQUcsTUFBTSxJQUFJLEVBQUUsQ0FBQTtRQUNyQixNQUFNLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFBO1FBQ3hCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDMUIsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtZQUMvQixNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDaEMsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFBO2dCQUN6QixJQUFJLEtBQUssSUFBSSxVQUFVLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFO29CQUN2QyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsVUFBVSxDQUFDLFVBQVUsQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQTtpQkFDbEU7cUJBQU07b0JBQ0wsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQTtpQkFDcEI7WUFDSCxDQUFDLENBQUMsQ0FBQTtTQUNIO1FBQ0QsT0FBTyxNQUFNLENBQUE7SUFDZixDQUFDO0lBR0QsTUFBTSxDQUFDLGFBQWEsQ0FBSSxHQUFNO1FBQzVCLE1BQU0sUUFBUSxHQUFTLEVBQUUsQ0FBQTtRQUN6QixNQUFNLENBQUMsSUFBSSxDQUFDLEdBQVUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ3RDLE1BQU0sQ0FBQyxHQUFJLEdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUMzQixJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLFNBQVMsRUFBRTtnQkFDaEMsUUFBZ0IsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUE7YUFDM0I7UUFDSCxDQUFDLENBQUMsQ0FBQTtRQUNGLE9BQU8sUUFBUSxDQUFBO0lBQ2pCLENBQUM7Q0FFRjtBQUVELE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLFVBQWEsWUFBdUIsRUFBRSxJQUFjO0lBQ2xGLE1BQU0sTUFBTSxHQUFjLEVBQUUsQ0FBQTtJQUU1QixNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQVcsRUFBRSxFQUFFO1FBQ2hELElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRTtZQUNsQixJQUFJLElBQUksSUFBSSxZQUFZLENBQUMsR0FBRyxDQUFDLFlBQVksTUFBTSxFQUFFO2dCQUMvQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQVEsZ0JBQWdCLENBQU0sWUFBWSxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFBO2FBQ2xFO2lCQUFNO2dCQUNMLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUE7YUFDaEM7U0FDRjtJQUNILENBQUMsQ0FBQyxDQUFBO0lBQ0YsT0FBTyxNQUFNLENBQUE7QUFDZixDQUFDLENBQUE7QUFDRCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUcsQ0FBQyxNQUFXLEVBQUUsSUFBWSxFQUFPLEVBQUU7SUFDM0QsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUM5QixJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUE7SUFDakIsSUFBSSxHQUFHLEdBQUcsTUFBTSxDQUFBO0lBQ2hCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ3JDLEdBQUcsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDbkIsSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFO1lBQ3JCLE1BQU0sR0FBRyxLQUFLLENBQUE7WUFDZCxNQUFLO1NBQ047S0FDRjtJQUNELE9BQU8sTUFBTSxDQUFBO0FBQ2YsQ0FBQyxDQUFBO0FBRUQsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLENBQUMsTUFBVyxFQUFFLElBQVksRUFBRSxRQUFhLElBQUksRUFBTyxFQUFFO0lBQ2hGLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDOUIsSUFBSSxHQUFHLEdBQUcsTUFBTSxDQUFBO0lBQ2hCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUN6QyxNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDcEIsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssU0FBUyxFQUFFO1lBQzFCLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUE7U0FDZDtRQUNELEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUE7S0FDZjtJQUNELE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFBO0lBQ3ZDLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxLQUFLLFNBQVMsRUFBRTtRQUM5QixHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsS0FBSyxDQUFBO0tBQ3JCO0lBQ0QsT0FBTyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUE7QUFDckIsQ0FBQyxDQUFBO0FBRUQsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLENBQUMsTUFBVyxFQUFFLElBQVksRUFBVyxFQUFFO0lBQ25FLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDOUIsSUFBSSxHQUFHLEdBQUcsTUFBTSxDQUFBO0lBQ2hCLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQTtJQUNsQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDekMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUNuQixJQUFJLEdBQUcsS0FBSyxTQUFTLEVBQUU7WUFDckIsT0FBTyxHQUFHLEtBQUssQ0FBQTtZQUNmLE1BQUs7U0FDTjtLQUNGO0lBQ0QsSUFBSSxPQUFPLEVBQUU7UUFDWCxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQTtRQUN2QyxPQUFPLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxLQUFLLFNBQVMsQ0FBQTtRQUNwQyxJQUFJLE9BQU8sRUFBRTtZQUNYLE9BQU8sR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFBO1NBQ3BCO0tBQ0Y7SUFDRCxPQUFPLE9BQU8sQ0FBQTtBQUNoQixDQUFDLENBQUE7QUFFRCxNQUFNLENBQUMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxFQUFhLEVBQUUsRUFBRTtJQUNwQyxJQUFJO1FBQ0YsT0FBTyxFQUFFLEVBQUUsQ0FBQTtLQUNaO0lBQUMsT0FBTyxDQUFDLEVBQUU7UUFDVixPQUFPLElBQUksQ0FBQTtLQUNaO0FBQ0gsQ0FBQyxDQUFBO0FBRUQsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLENBQWUsTUFBUyxFQUFFLEVBQWtDLEVBQUUsRUFBRTtJQUNyRixNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQVcsRUFBRSxFQUFFO1FBQzFDLEVBQUUsQ0FBRSxNQUFjLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUE7SUFDL0IsQ0FBQyxDQUFDLENBQUE7QUFDSixDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge09iak1hcH0gZnJvbSAnLi4vbGFuZy9vYmotbWFwJ1xuXG5cbmV4cG9ydCBpbnRlcmZhY2UgTWFwRW50cnk8VD4geyBrZXk6IHN0cmluZywgdmFsdWU6IFRcbn1cblxuZXhwb3J0IGNvbnN0IFJlc29sdmVWb2lkID0gdW5kZWZpbmVkXG5cbmV4cG9ydCBjbGFzcyBPYmplY3RVdGlsIHtcblxuXG4gIC8qKlxuICAgKiBOdWxsIHNhZmUgdmVyc2lvbiBvZiBPYmplY3Qua2V5cy5cbiAgICogQHBhcmFtIG1hcFxuICAgKiBAcmV0dXJucyB7c3RyaW5nW119IFRoZSBrZXlzIGZvciB0aGUgbWFwLCBvciBhbiBlbXB0eSBhcnJheSBpZiB0aGUgYXJndW1lbnQgcHJvdmlkZWQgaXMgZmFsc3kuXG4gICAqL1xuICBzdGF0aWMga2V5czxUPihtYXA6IE9iak1hcDxUPik6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMobWFwIHx8IHt9KVxuICB9XG5cbiAgLyoqXG4gICAqIFByb3ZpZGUgYSBtYXAgb2Yga2V5cyBzdWNoIHRoYXQgJ21hcFtrZXldJyBwcm92aWRlcyBhIGxpdGVyYWwgdHJ1ZSB2YWx1ZSBpZiB0aGUga2V5IGlzIHByZXNlbnQsIGV2ZW4gaWYgdGhlIHZhbHVlXG4gICAqIG9uIHRoZSBzb3VyY2UgbWFwIGlzIGZhbHN5LlxuICAgKi9cbiAgc3RhdGljIHRvVHJ1dGhNYXAoYXJ5OiBzdHJpbmdbXSk6IE9iak1hcDxib29sZWFuPiB7XG4gICAgY29uc3QgbWFwID0ge31cbiAgICBhcnkuZm9yRWFjaCh2YWx1ZSA9PiAobWFwIGFzIGFueSlbdmFsdWVdID0gdHJ1ZSlcbiAgICByZXR1cm4gbWFwXG4gIH1cblxuICAvKipcbiAgICogRXhwYW5kIHRoZSBtYXAgaW50byBhbiBhcnJheSBvZiBrZXktdmFsdWUgcGFpcnMuXG4gICAqIEBwYXJhbSB7T2JqTWFwPFQgZXh0ZW5kcyBvYmplY3Q+fSBtYXBcbiAgICogQHJldHVybnMgTWFwRW50cnk8VD5cbiAgICovXG4gIHN0YXRpYyBlbnRyaWVzPFQ+KG1hcDogT2JqTWFwPFQ+IHwgYW55KTogTWFwRW50cnk8VD5bXSB7XG4gICAgY29uc3QgcmV0Ok1hcEVudHJ5PFQ+W10gPSAgT2JqZWN0LmtleXMobWFwIHx8IHt9KS5tYXAoKGtleSkgPT4ge1xuICAgICAgcmV0dXJuIHtrZXk6IGtleSwgdmFsdWU6IG1hcFtrZXldfVxuICAgIH0pXG4gICAgcmV0dXJuIHJldFxuICB9XG5cbiAgLyoqXG4gICAqIFByb3ZpZGUgdGhlIHZhbHVlcyBvZiB0aGUgbWFwLlxuICAgKiBAcGFyYW0ge09iak1hcDxUPn0gbWFwXG4gICAqIEByZXR1cm5zIE1hcEVudHJ5PFQ+XG4gICAqL1xuICBzdGF0aWMgdmFsdWVzPFQ+KG1hcDogT2JqTWFwPFQ+IHwgYW55KTogVFtdIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMobWFwIHx8IHt9KS5tYXAoKGtleSkgPT4ge1xuICAgICAgcmV0dXJuIG1hcFtrZXldXG4gICAgfSlcbiAgfVxuXG4gIHN0YXRpYyBpc09iamVjdCh2YWx1ZTphbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgfHwgdmFsdWUuY29uc3RydWN0b3IgPT09IE9iamVjdClcbiAgfVxuXG4gIHN0YXRpYyBpc0Z1bmN0aW9uKHZhbHVlOmFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAodHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nIHx8IHZhbHVlIGluc3RhbmNlb2YgRnVuY3Rpb24pXG4gIH1cblxuICBzdGF0aWMgaXNOdWxsT3JEZWZpbmVkKHZhbHVlOmFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkXG4gIH1cblxuICBzdGF0aWMgZXhpc3RzKHZhbHVlOmFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkXG4gIH1cblxuICBzdGF0aWMgYXNzaWduRGVlcCh0YXJnZXQ6IGFueSwgLi4uc291cmNlczogYW55W10pOiBhbnkge1xuICAgIHRhcmdldCA9IHRhcmdldCB8fCB7fVxuICAgIGNvbnN0IEwgPSBzb3VyY2VzLmxlbmd0aFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTDsgaSsrKSB7XG4gICAgICBjb25zdCBzb3VyY2UgPSBzb3VyY2VzW2ldIHx8IHt9XG4gICAgICBPYmplY3Qua2V5cyhzb3VyY2UpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBzb3VyY2Vba2V5XVxuICAgICAgICBpZiAodmFsdWUgJiYgT2JqZWN0VXRpbC5pc09iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgICB0YXJnZXRba2V5XSA9IE9iamVjdFV0aWwuYXNzaWduRGVlcCh7fSwgdGFyZ2V0W2tleV0gfHwge30sIHZhbHVlKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRhcmdldFtrZXldID0gdmFsdWVcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldFxuICB9XG5cblxuICBzdGF0aWMgcmVtb3ZlTnVsbGlzaDxUPihvYmo6IFQpOiBUIHtcbiAgICBjb25zdCBjbGVhbk9iajogVCA9IDxUPnt9XG4gICAgT2JqZWN0LmtleXMob2JqIGFzIGFueSkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICBjb25zdCB2ID0gKG9iaiBhcyBhbnkpW2tleV1cbiAgICAgIGlmICh2ICE9PSBudWxsICYmIHYgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAoY2xlYW5PYmogYXMgYW55KVtrZXldID0gdlxuICAgICAgfVxuICAgIH0pXG4gICAgcmV0dXJuIGNsZWFuT2JqXG4gIH1cblxufVxuXG5leHBvcnQgY29uc3QgY2xlYW5GaXJlYmFzZU1hcCA9IGZ1bmN0aW9uIDxUPihmaXJlYmFzZUxpc3Q6IE9iak1hcDxUPiwgZGVlcD86IGJvb2xlYW4pOiBPYmpNYXA8VD4ge1xuICBjb25zdCByZXN1bHQ6IE9iak1hcDxUPiA9IHt9XG5cbiAgT2JqZWN0LmtleXMoZmlyZWJhc2VMaXN0KS5mb3JFYWNoKChrZXk6IHN0cmluZykgPT4ge1xuICAgIGlmIChrZXlbMF0gIT09ICckJykge1xuICAgICAgaWYgKGRlZXAgJiYgZmlyZWJhc2VMaXN0W2tleV0gaW5zdGFuY2VvZiBPYmplY3QpIHtcbiAgICAgICAgcmVzdWx0W2tleV0gPSA8YW55PmNsZWFuRmlyZWJhc2VNYXAoPGFueT5maXJlYmFzZUxpc3Rba2V5XSwgdHJ1ZSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdFtrZXldID0gZmlyZWJhc2VMaXN0W2tleV1cbiAgICAgIH1cbiAgICB9XG4gIH0pXG4gIHJldHVybiByZXN1bHRcbn1cbmV4cG9ydCBjb25zdCBwYXRoRXhpc3RzID0gKG9iamVjdDogYW55LCBwYXRoOiBzdHJpbmcpOiBhbnkgPT4ge1xuICBjb25zdCBwYXJ0cyA9IHBhdGguc3BsaXQoJ1xcLicpXG4gIGxldCBleGlzdHMgPSB0cnVlXG4gIGxldCBvYmogPSBvYmplY3RcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGg7IGkrKykge1xuICAgIG9iaiA9IG9ialtwYXJ0c1tpXV1cbiAgICBpZiAob2JqID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGV4aXN0cyA9IGZhbHNlXG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuICByZXR1cm4gZXhpc3RzXG59XG5cbmV4cG9ydCBjb25zdCBlbnN1cmVFeGlzdHMgPSAob2JqZWN0OiBhbnksIHBhdGg6IHN0cmluZywgdmFsdWU6IGFueSA9IHRydWUpOiBhbnkgPT4ge1xuICBjb25zdCBwYXJ0cyA9IHBhdGguc3BsaXQoJ1xcLicpXG4gIGxldCBvYmogPSBvYmplY3RcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICBjb25zdCBrZXkgPSBwYXJ0c1tpXVxuICAgIGlmIChvYmpba2V5XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBvYmpba2V5XSA9IHt9XG4gICAgfVxuICAgIG9iaiA9IG9ialtrZXldXG4gIH1cbiAgY29uc3QgbGFzdEtleSA9IHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdXG4gIGlmIChvYmpbbGFzdEtleV0gPT09IHVuZGVmaW5lZCkge1xuICAgIG9ialtsYXN0S2V5XSA9IHZhbHVlXG4gIH1cbiAgcmV0dXJuIG9ialtsYXN0S2V5XVxufVxuXG5leHBvcnQgY29uc3QgcmVtb3ZlSWZFeGlzdHMgPSAob2JqZWN0OiBhbnksIHBhdGg6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICBjb25zdCBwYXJ0cyA9IHBhdGguc3BsaXQoJ1xcLicpXG4gIGxldCBvYmogPSBvYmplY3RcbiAgbGV0IGV4aXN0ZWQgPSB0cnVlXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgb2JqID0gb2JqW3BhcnRzW2ldXVxuICAgIGlmIChvYmogPT09IHVuZGVmaW5lZCkge1xuICAgICAgZXhpc3RlZCA9IGZhbHNlXG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuICBpZiAoZXhpc3RlZCkge1xuICAgIGNvbnN0IGxhc3RLZXkgPSBwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXVxuICAgIGV4aXN0ZWQgPSBvYmpbbGFzdEtleV0gIT09IHVuZGVmaW5lZFxuICAgIGlmIChleGlzdGVkKSB7XG4gICAgICBkZWxldGUgb2JqW2xhc3RLZXldXG4gICAgfVxuICB9XG4gIHJldHVybiBleGlzdGVkXG59XG5cbmV4cG9ydCBjb25zdCBzYWZlID0gKGZuOiAoKSA9PiBhbnkpID0+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oKVxuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgZWFjaEtleSA9IDxUIGV4dGVuZHMge30+KG9iak1hcDogVCwgZm46IChhcmc/OiBULCBrZXk/OiBzdHJpbmcpID0+IGFueSkgPT4ge1xuICBPYmplY3Qua2V5cyhvYmpNYXApLmZvckVhY2goKGtleTogc3RyaW5nKSA9PiB7XG4gICAgZm4oKG9iak1hcCBhcyBhbnkpW2tleV0sIGtleSlcbiAgfSlcbn1cblxuXG5leHBvcnQgaW50ZXJmYWNlIER1bzxYLCBZPiB7XG4gIHg6IFhcbiAgeTogWVxufVxuIl19