UNPKG

@pictogrammers/element

Version:

Web Component Element for TypeScript

179 lines 27 kB
export const addObserver = Symbol('addObserver'); export const removeObserver = Symbol('removeObserver'); export const hasObserver = Symbol('getObservers'); export const swapObserver = Symbol('swapObserver'); export const isProxy = Symbol('isProxy'); export const getTarget = Symbol('getTarget'); const arrayMutate = ['fill', 'pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift']; const observers = new Map(); export function createProxy(obj) { return new Proxy(obj, { get(target, prop) { if (typeof prop === 'symbol') { switch (prop) { case isProxy: return true; case getTarget: return target; case hasObserver: return (host) => { const hosts = observers.get(obj); return hosts?.has(host); }; case swapObserver: return (host, newObj) => { const hosts = observers.get(obj); if (hosts) { const elements = hosts.get(host); if (elements) { elements.forEach((callbacks, element) => { if (callbacks) { const hostsNew = observers.get(newObj); if (hostsNew) { const elementsNew = hostsNew.get(host); if (elementsNew) { elementsNew.set(element, callbacks); } else { hostsNew.set(host, new Map([[ element, callbacks ]])); } } else { observers.set(newObj, new Map([[ host, new Map([[ element, callbacks ]]) ]])); } } else { throw new Error('Unreachable'); } elements.delete(element); callbacks.forEach((callback) => { callback(null, Mutation.swap, [newObj]); }); }); } } }; case addObserver: return (element, callback) => { const host = element.getRootNode().host; const hosts = observers.get(obj); if (hosts) { const elements = hosts.get(host); if (elements) { const callbacks = elements.get(element); if (callbacks) { callbacks.push(callback); } else { elements.set(element, [callback]); } } else { hosts.set(host, new Map([[ element, [callback] ]])); } } else { observers.set(obj, new Map([[ host, new Map([[ element, [callback] ]]) ]])); } }; case removeObserver: return (element) => { const host = element.getRootNode().host; const hosts = observers.get(obj); if (hosts) { hosts.delete(host); if (hosts.size === 0) { observers.delete(obj); } } }; case Symbol.iterator: case Symbol.toPrimitive: case Symbol.toStringTag: return Reflect.get(target, prop); } throw new Error('Unsupported symbol'); } if (prop in target) { if (!Number.isNaN(Number(prop))) { if (typeof target[prop] === 'object') { return createProxy(target[prop]); } return target[prop]; } if (prop === 'copyWithin') { throw new Error('Unsupported array method copyWithin'); } if (arrayMutate.includes(prop)) { if (observers.has(target)) { return function () { const result = Array.prototype[prop].apply(target, arguments); const hosts = observers.get(target); hosts?.forEach((elements) => { elements.forEach((callbacks) => { callbacks.forEach((callback) => { callback(target, prop, arguments); }); }); }); return result; }; } return Reflect.get(target, prop); } if (target[prop] instanceof Array) { return createProxy(target[prop]); } // nested objects do not get proxied for perf } return Reflect.get(target, prop); }, set(target, prop, value) { if (typeof prop === 'symbol') { throw new Error('Setting symbols not allowed.'); } if (Array.isArray(target)) { return Reflect.set(target, prop, value); } if (observers.has(target)) { const hosts = observers.get(target); hosts?.forEach((elements) => { elements.forEach((callbacks) => { callbacks.forEach((callback) => { callback(prop, value); }); }); }); } return Reflect.set(target, prop, value); } }); } export const Mutation = { fill: 'fill', pop: 'pop', push: 'push', reverse: 'reverse', shift: 'shift', sort: 'sort', splice: 'splice', unshift: 'unshift', swap: 'swap', }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJveHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcHJveHkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFrQixNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7QUFDaEUsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFrQixNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztBQUN0RSxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQWtCLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUNqRSxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQWtCLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUNsRSxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQWtCLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUN4RCxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQWtCLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztBQU01RCxNQUFNLFdBQVcsR0FBRyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztBQVU3RixNQUFNLFNBQVMsR0FBRyxJQUFJLEdBQUcsRUFBZ0IsQ0FBQztBQStCMUMsTUFBTSxVQUFVLFdBQVcsQ0FBSSxHQUFNO0lBQ25DLE9BQU8sSUFBSSxLQUFLLENBQUMsR0FBVSxFQUFFO1FBQzNCLEdBQUcsQ0FBQyxNQUFXLEVBQUUsSUFBcUI7WUFDcEMsSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDN0IsUUFBUSxJQUFJLEVBQUUsQ0FBQztvQkFDYixLQUFLLE9BQU87d0JBQ1YsT0FBTyxJQUFJLENBQUM7b0JBQ2QsS0FBSyxTQUFTO3dCQUNaLE9BQU8sTUFBTSxDQUFDO29CQUNoQixLQUFLLFdBQVc7d0JBQ2QsT0FBTyxDQUFDLElBQWlCLEVBQUUsRUFBRTs0QkFDM0IsTUFBTSxL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LENBQUM7b0JBQ0wsQ0FBQyxDQUFDLENBQUM7Z0JBQ0wsQ0FBQyxDQUFDLENBQUM7WUFDTCxDQUFDO1lBQ0QsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDMUMsQ0FBQztLQUNGLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxRQUFRLEdBQUc7SUFDdEIsSUFBSSxFQUFFLE1BQU07SUFDWixHQUFHLEVBQUUsS0FBSztJQUNWLElBQUksRUFBRSxNQUFNO0lBQ1osT0FBTyxFQUFFLFNBQVM7SUFDbEIsS0FBSyxFQUFFLE9BQU87SUFDZCxJQUFJLEVBQUUsTUFBTTtJQUNaLE1BQU0sRUFBRSxRQUFRO0lBQ2hCLE9BQU8sRUFBRSxTQUFTO0lBQ2xCLElBQUksRUFBRSxNQUFNO0NBQ2IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBhZGRPYnNlcnZlcjogdW5pcXVlIHN5bWJvbCA9IFN5bWJvbCgnYWRkT2JzZXJ2ZXInKTtcclxuZXhwb3J0IGNvbnN0IHJlbW92ZU9ic2VydmVyOiB1bmlxdWUgc3ltYm9sID0gU3ltYm9sKCdyZW1vdmVPYnNlcnZlcicpO1xyXG5leHBvcnQgY29uc3QgaGFzT2JzZXJ2ZXI6IHVuaXF1ZSBzeW1ib2wgPSBTeW1ib2woJ2dldE9ic2VydmVycycpO1xyXG5leHBvcnQgY29uc3Qgc3dhcE9ic2VydmVyOiB1bmlxdWUgc3ltYm9sID0gU3ltYm9sKCdzd2FwT2JzZXJ2ZXInKTtcclxuZXhwb3J0IGNvbnN0IGlzUHJveHk6IHVuaXF1ZSBzeW1ib2wgPSBTeW1ib2woJ2lzUHJveHknKTtcclxuZXhwb3J0IGNvbnN0IGdldFRhcmdldDogdW5pcXVlIHN5bWJvbCA9IFN5bWJvbCgnZ2V0VGFyZ2V0Jyk7XHJcblxyXG50eXBlIEFkZE9ic2VydmVyQ2FsbGJhY2sgPSAoa2V5Pzogc3RyaW5nKSA9PiB2b2lkO1xyXG50eXBlIEFkZE9ic2VydmVyID0gKGhvc3Q6IEhUTUxFbGVtZW50LCBjYWxsYmFjazogQWRkT2JzZXJ2ZXJDYWxsYmFjaykgPT4gdm9pZDtcclxudHlwZSBSZW1vdmVPYnNlcnZlciA9IChob3N0OiBIVE1MRWxlbWVudCkgPT4gdm9pZDtcclxuXHJcbmNvbnN0IGFycmF5TXV0YXRlID0gWydmaWxsJywgJ3BvcCcsICdwdXNoJywgJ3JldmVyc2UnLCAnc2hpZnQnLCAnc29ydCcsICdzcGxpY2UnLCAndW5zaGlmdCddO1xyXG5cclxuLy8ga2V5ID0gb2JqICAgICAgICAgICAgICAgIC0gb2JzZXJ2ZWQgb2JqZWN0XHJcbi8vIHZhbHVlID0gTWFwXHJcbi8vICAga2V5ID0gaG9zdCAgICAgICAgICAgICAtIHdlYiBjb21wb25lbnRcclxuLy8gICB2YWx1ZSA9IE1hcFxyXG4vLyAgICAga2V5ID0gZWxlbWVudCAgICAgICAgLSBmb3JFYWNoIGNvbnRhaW5lciBvciBiaW5kaW5nXHJcbi8vICAgICB2YWx1ZSA9IGNhbGxiYWNrW11cclxudHlwZSBFbGVtZW50TWFwID0gTWFwPEVsZW1lbnQsIGFueVtdPjtcclxudHlwZSBIb3N0TWFwID0gTWFwPEVsZW1lbnQsIEVsZW1lbnRNYXA+O1xyXG5jb25zdCBvYnNlcnZlcnMgPSBuZXcgTWFwPGFueSwgSG9zdE1hcD4oKTtcclxuXHJcbnR5cGUgSXNBbnk8VD4gPSB1bmtub3duIGV4dGVuZHMgVCAmIHN0cmluZyA/IHRydWUgOiBmYWxzZTtcclxuXHJcbnR5cGUgRXh0cmFzQXJyYXk8VD4gPSB7XHJcbiAgW2FkZE9ic2VydmVyXTogQWRkT2JzZXJ2ZXI7XHJcbiAgW3JlbW92ZU9ic2VydmVyXTogUmVtb3ZlT2JzZXJ2ZXI7XHJcbiAgW2lzUHJveHldOiBib29sZWFuO1xyXG59ICYgQXJyYXk8VCBleHRlbmRzIChpbmZlciBVKVtdID8gUGFydGlhbDxVPiA6IG9iamVjdD47XHJcblxyXG50eXBlIEV4dHJhcyA9IHtcclxuICBbYWRkT2JzZXJ2ZXJdOiBBZGRPYnNlcnZlcjtcclxuICBbcmVtb3ZlT2JzZXJ2ZXJdOiBSZW1vdmVPYnNlcnZlcjtcclxuICBbaXNQcm94eV06IGJvb2xlYW47XHJcbn07XHJcblxyXG4vLyBTaG9ydC1jaXJjdWl0IGFueSBvciB0aGlzIGlzIGluZmluaXRlXHJcbnR5cGUgUmVjdXJzaXZlUHJveHk8VD4gPSBJc0FueTxUPiBleHRlbmRzIHRydWVcclxuICA/IGFueVxyXG4gIDogVCBleHRlbmRzIEFycmF5PGFueT5cclxuICA/IEV4dHJhc0FycmF5PFQ+ICYge1xyXG4gICAgW1AgaW4ga2V5b2YgVF06IElzQW55PFRbUF0+IGV4dGVuZHMgdHJ1ZSA/IGFueSA6IFJlY3Vyc2l2ZVByb3h5PFRbUF0+XHJcbiAgfVxyXG4gIDoge1xyXG4gICAgW1AgaW4ga2V5b2YgVF06IElzQW55PFRbUF0+IGV4dGVuZHMgdHJ1ZVxyXG4gICAgPyBhbnlcclxuICAgIDogVFtQXSBleHRlbmRzIEFycmF5PGFueT5cclxuICAgID8gUmVjdXJzaXZlUHJveHk8VFtQXT5cclxuICAgIDogVFtQXVxyXG4gIH0gJiBFeHRyYXM7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUHJveHk8VD4ob2JqOiBUKTogUmVjdXJzaXZlUHJveHk8VD4ge1xyXG4gIHJldHVybiBuZXcgUHJveHkob2JqIGFzIGFueSwge1xyXG4gICAgZ2V0KHRhcmdldDogYW55LCBwcm9wOiBzdHJpbmcgfCBzeW1ib2wpOiBhbnkge1xyXG4gICAgICBpZiAodHlwZW9mIHByb3AgPT09ICdzeW1ib2wnKSB7XHJcbiAgICAgICAgc3dpdGNoIChwcm9wKSB7XHJcbiAgICAgICAgICBjYXNlIGlzUHJveHk6XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgY2FzZSBnZXRUYXJnZXQ6XHJcbiAgICAgICAgICAgIHJldHVybiB0YXJnZXQ7XHJcbiAgICAgICAgICBjYXNlIGhhc09ic2VydmVyOlxyXG4gICAgICAgICAgICByZXR1cm4gKGhvc3Q6IEhUTUxFbGVtZW50KSA9PiB7XHJcbiAgICAgICAgICAgICAgY29uc3QgaG9zdHMgPSBvYnNlcnZlcnMuZ2V0KG9iaik7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIGhvc3RzPy5oYXMoaG9zdCk7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICBjYXNlIHN3YXBPYnNlcnZlcjpcclxuICAgICAgICAgICAgcmV0dXJuIChob3N0OiBIVE1MRWxlbWVudCwgbmV3T2JqOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICBjb25zdCBob3N0cyA9IG9ic2VydmVycy5nZXQob2JqKTtcclxuICAgICAgICAgICAgICBpZiAoaG9zdHMpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRzID0gaG9zdHMuZ2V0KGhvc3QpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnRzKSB7XHJcbiAgICAgICAgICAgICAgICAgIGVsZW1lbnRzLmZvckVhY2goKGNhbGxiYWNrczogYW55W10sIGVsZW1lbnQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2tzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBob3N0c05ldyA9IG9ic2VydmVycy5nZXQobmV3T2JqKTtcclxuICAgICAgICAgICAgICAgICAgICAgIGlmIChob3N0c05ldykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50c05ldyA9IGhvc3RzTmV3LmdldChob3N0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnRzTmV3KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudHNOZXcuc2V0KGVsZW1lbnQsIGNhbGxiYWNrcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdHNOZXcuc2V0KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBNYXAoW1tcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdXSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvYnNlcnZlcnMuc2V0KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG5ld09iaixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTWFwKFtbXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3N0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE1hcChbW1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja3NcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1dKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIF1dKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VucmVhY2hhYmxlJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzLmRlbGV0ZShlbGVtZW50KTtcclxuICAgICAgICAgICAgICAgICAgICBjYWxsYmFja3MuZm9yRWFjaCgoY2FsbGJhY2s6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgTXV0YXRpb24uc3dhcCwgW25ld09ial0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIGNhc2UgYWRkT2JzZXJ2ZXI6XHJcbiAgICAgICAgICAgIHJldHVybiAoZWxlbWVudDogSFRNTEVsZW1lbnQsIGNhbGxiYWNrOiBBZGRPYnNlcnZlckNhbGxiYWNrKSA9PiB7XHJcbiAgICAgICAgICAgICAgY29uc3QgaG9zdCA9IChlbGVtZW50LmdldFJvb3ROb2RlKCkgYXMgU2hhZG93Um9vdCkuaG9zdDtcclxuICAgICAgICAgICAgICBjb25zdCBob3N0cyA9IG9ic2VydmVycy5nZXQob2JqKTtcclxuICAgICAgICAgICAgICBpZiAoaG9zdHMpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRzID0gaG9zdHMuZ2V0KGhvc3QpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnRzKSB7XHJcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGNhbGxiYWNrcyA9IGVsZW1lbnRzLmdldChlbGVtZW50KTtcclxuICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrcykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrcy5wdXNoKGNhbGxiYWNrKTtcclxuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50cy5zZXQoZWxlbWVudCwgW2NhbGxiYWNrXSk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIGhvc3RzLnNldChcclxuICAgICAgICAgICAgICAgICAgICBob3N0LFxyXG4gICAgICAgICAgICAgICAgICAgIG5ldyBNYXAoW1tcclxuICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQsIFtjYWxsYmFja11cclxuICAgICAgICAgICAgICAgICAgICBdXSlcclxuICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZXJzLnNldChcclxuICAgICAgICAgICAgICAgICAgb2JqLFxyXG4gICAgICAgICAgICAgICAgICBuZXcgTWFwKFtbXHJcbiAgICAgICAgICAgICAgICAgICAgaG9zdCxcclxuICAgICAgICAgICAgICAgICAgICBuZXcgTWFwKFtbXHJcbiAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LCBbY2FsbGJhY2tdXHJcbiAgICAgICAgICAgICAgICAgICAgXV0pXHJcbiAgICAgICAgICAgICAgICAgIF1dKVxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICBjYXNlIHJlbW92ZU9ic2VydmVyOlxyXG4gICAgICAgICAgICByZXR1cm4gKGVsZW1lbnQ6IEhUTUxFbGVtZW50KSA9PiB7XHJcbiAgICAgICAgICAgICAgY29uc3QgaG9zdCA9IChlbGVtZW50LmdldFJvb3ROb2RlKCkgYXMgU2hhZG93Um9vdCkuaG9zdDtcclxuICAgICAgICAgICAgICBjb25zdCBob3N0cyA9IG9ic2VydmVycy5nZXQob2JqKTtcclxuICAgICAgICAgICAgICBpZiAoaG9zdHMpIHtcclxuICAgICAgICAgICAgICAgIGhvc3RzLmRlbGV0ZShob3N0KTtcclxuICAgICAgICAgICAgICAgIGlmIChob3N0cy5zaXplID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgIG9ic2VydmVycy5kZWxldGUob2JqKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICBjYXNlIFN5bWJvbC5pdGVyYXRvcjpcclxuICAgICAgICAgIGNhc2UgU3ltYm9sLnRvUHJpbWl0aXZlOlxyXG4gICAgICAgICAgY2FzZSBTeW1ib2wudG9TdHJpbmdUYWc6XHJcbiAgICAgICAgICAgIHJldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIHByb3ApO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIHN5bWJvbCcpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChwcm9wIGluIHRhcmdldCkge1xyXG4gICAgICAgIGlmICghTnVtYmVyLmlzTmFOKE51bWJlcihwcm9wKSkpIHtcclxuICAgICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0W3Byb3BdID09PSAnb2JqZWN0Jykge1xyXG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUHJveHkodGFyZ2V0W3Byb3BdKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiB0YXJnZXRbcHJvcF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChwcm9wID09PSAnY29weVdpdGhpbicpIHtcclxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgYXJyYXkgbWV0aG9kIGNvcHlXaXRoaW4nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGFycmF5TXV0YXRlLmluY2x1ZGVzKHByb3ApKSB7XHJcbiAgICAgICAgICBpZiAob2JzZXJ2ZXJzLmhhcyh0YXJnZXQpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gQXJyYXkucHJvdG90eXBlW3Byb3AgYXMgYW55XS5hcHBseSh0YXJnZXQsIGFyZ3VtZW50cyk7XHJcbiAgICAgICAgICAgICAgY29uc3QgaG9zdHMgPSBvYnNlcnZlcnMuZ2V0KHRhcmdldCk7XHJcbiAgICAgICAgICAgICAgaG9zdHM/LmZvckVhY2goKGVsZW1lbnRzKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBlbGVtZW50cy5mb3JFYWNoKChjYWxsYmFja3M6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICBjYWxsYmFja3MuZm9yRWFjaCgoY2FsbGJhY2s6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKHRhcmdldCwgcHJvcCwgYXJndW1lbnRzKTtcclxuICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gUmVmbGVjdC5nZXQodGFyZ2V0LCBwcm9wKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRhcmdldFtwcm9wXSBpbnN0YW5jZW9mIEFycmF5KSB7XHJcbiAgICAgICAgICByZXR1cm4gY3JlYXRlUHJveHkodGFyZ2V0W3Byb3BdKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gbmVzdGVkIG9iamVjdHMgZG8gbm90IGdldCBwcm94aWVkIGZvciBwZXJmXHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwgcHJvcCk7XHJcbiAgICB9LFxyXG4gICAgc2V0KHRhcmdldDogYW55LCBwcm9wOiBzdHJpbmcgfCBzeW1ib2wsIHZhbHVlKTogYm9vbGVhbiB7XHJcbiAgICAgIGlmICh0eXBlb2YgcHJvcCA9PT0gJ3N5bWJvbCcpIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NldHRpbmcgc3ltYm9scyBub3QgYWxsb3dlZC4nKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh0YXJnZXQpKSB7XHJcbiAgICAgICAgcmV0dXJuIFJlZmxlY3Quc2V0KHRhcmdldCwgcHJvcCwgdmFsdWUpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChvYnNlcnZlcnMuaGFzKHRhcmdldCkpIHtcclxuICAgICAgICBjb25zdCBob3N0cyA9IG9ic2VydmVycy5nZXQodGFyZ2V0KTtcclxuICAgICAgICBob3N0cz8uZm9yRWFjaCgoZWxlbWVudHMpID0+IHtcclxuICAgICAgICAgIGVsZW1lbnRzLmZvckVhY2goKGNhbGxiYWNrczogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGNhbGxiYWNrcy5mb3JFYWNoKChjYWxsYmFjazogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgY2FsbGJhY2socHJvcCwgdmFsdWUpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBSZWZsZWN0LnNldCh0YXJnZXQsIHByb3AsIHZhbHVlKTtcclxuICAgIH1cclxuICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IE11dGF0aW9uID0ge1xyXG4gIGZpbGw6ICdmaWxsJyxcclxuICBwb3A6ICdwb3AnLFxyXG4gIHB1c2g6ICdwdXNoJyxcclxuICByZXZlcnNlOiAncmV2ZXJzZScsXHJcbiAgc2hpZnQ6ICdzaGlmdCcsXHJcbiAgc29ydDogJ3NvcnQnLFxyXG4gIHNwbGljZTogJ3NwbGljZScsXHJcbiAgdW5zaGlmdDogJ3Vuc2hpZnQnLFxyXG4gIHN3YXA6ICdzd2FwJyxcclxufTtcclxuIl19