UNPKG

@simplux/core

Version:

The core package of simplux. Contains everything to manage your application state in a simple way.

91 lines (90 loc) 15.9 kB
/** * Helper symbol used for identifying simplux selector objects. * * @public */ // should really be a symbol, but as of TypeScript 4.1 there is a bug // that causes the symbol to not be properly re-exported in type // definitions when spreading a select object onto an export, which can // cause issues with composite builds export const SIMPLUX_SELECTOR = '[SIMPLUX_SELECTOR]'; /** * Create new selectors for the module. A selector is a function * that takes the module state and optionally additional parameters * and returns some selected value. * * The selector must be a pure function. Its result is memoized * for the latest state and parameters. * * @param simpluxModule - the module to create selectors for * @param selectorDefinitions - the selectors to create * * @returns an object that contains a function for each provided * selector * * @public */ export function createSelectors(simpluxModule, selectorDefinitions) { const module = simpluxModule; const internals = module.$simplux; const resolvedSelectors = Object.keys(selectorDefinitions).reduce((acc, selectorName) => { const definition = selectorDefinitions[selectorName]; const memoizedDefinition = memoize(definition); const selectorId = (internals.lastSelectorId || 0) + 1; internals.lastSelectorId = selectorId; const namedSelector = nameFunction(selectorName, (...args) => { var _a; const mock = (_a = internals.selectorMocks) === null || _a === void 0 ? void 0 : _a[selectorId]; if (mock) { return mock(...args); } return memoizedDefinition(internals.getState(), ...args); }); acc[selectorName] = namedSelector; const extras = namedSelector; extras.withState = memoizedDefinition; extras.selectorId = selectorId; extras.selectorName = selectorName; extras.owningModule = module; extras[SIMPLUX_SELECTOR] = ''; return acc; }, {}); return resolvedSelectors; // this helper function allows creating a function with a dynamic name (only works with ES6+) function nameFunction(name, body) { return { [name](...args) { return body(...args); }, }[name]; } function memoize(fn) { let memoizedArgs; let memoizedResult; function memoizedFunction(...args) { const memoizedResultNeedsToBeRefreshed = !memoizedArgs || memoizedArgs.length !== args.length || !memoizedArgs.every((a, idx) => a === args[idx]); if (memoizedResultNeedsToBeRefreshed) { memoizedResult = fn(...args); memoizedArgs = args; } return memoizedResult; } return memoizedFunction; } } /** * Checks if an object is a simplux selector. * * @param object - the object to check * * @returns true if the object is a simplux selector * * @internal */ export function _isSimpluxSelector(object) { var _a; return ((_a = object) === null || _a === void 0 ? void 0 : _a[SIMPLUX_SELECTOR]) === ''; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0b3JzLmpzIiwic291cmNlcyI6WyJAc2ltcGx1eC9jb3JlL3NyYy9zZWxlY3RvcnMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBTaW1wbHV4TW9kdWxlLCBTaW1wbHV4TW9kdWxlTWFya2VyIH0gZnJvbSAnLi9tb2R1bGUuanMnXHJcbmltcG9ydCB0eXBlIHsgSW1tdXRhYmxlIH0gZnJvbSAnLi90eXBlcy5qcydcclxuXHJcbi8qKlxyXG4gKiBIZWxwZXIgc3ltYm9sIHVzZWQgZm9yIGlkZW50aWZ5aW5nIHNpbXBsdXggc2VsZWN0b3Igb2JqZWN0cy5cclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuLy8gc2hvdWxkIHJlYWxseSBiZSBhIHN5bWJvbCwgYnV0IGFzIG9mIFR5cGVTY3JpcHQgNC4xIHRoZXJlIGlzIGEgYnVnXHJcbi8vIHRoYXQgY2F1c2VzIHRoZSBzeW1ib2wgdG8gbm90IGJlIHByb3Blcmx5IHJlLWV4cG9ydGVkIGluIHR5cGVcclxuLy8gZGVmaW5pdGlvbnMgd2hlbiBzcHJlYWRpbmcgYSBzZWxlY3Qgb2JqZWN0IG9udG8gYW4gZXhwb3J0LCB3aGljaCBjYW5cclxuLy8gY2F1c2UgaXNzdWVzIHdpdGggY29tcG9zaXRlIGJ1aWxkc1xyXG5leHBvcnQgY29uc3QgU0lNUExVWF9TRUxFQ1RPUiA9ICdbU0lNUExVWF9TRUxFQ1RPUl0nXHJcblxyXG4vKipcclxuICogQSBmdW5jdGlvbiB0byB0dXJuIGludG8gYSBzZWxlY3Rvci5cclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuZXhwb3J0IHR5cGUgU2VsZWN0b3JEZWZpbml0aW9uPFRTdGF0ZSwgVFJldHVybj4gPSAoXHJcbiAgc3RhdGU6IEltbXV0YWJsZTxUU3RhdGU+LFxyXG4gIC4uLmFyZ3M6IGFueVxyXG4pID0+IFRSZXR1cm5cclxuXHJcbi8qKlxyXG4gKiBUaGUgZnVuY3Rpb25zIHRvIHR1cm4gaW50byBzZWxlY3RvcnMuXHJcbiAqXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgU2VsZWN0b3JEZWZpbml0aW9uczxUU3RhdGU+IHtcclxuICBbbmFtZTogc3RyaW5nXTogU2VsZWN0b3JEZWZpbml0aW9uPFRTdGF0ZSwgYW55PlxyXG59XHJcblxyXG4vKipcclxuICogSW50ZXJmYWNlIGZvciBlZmZpY2llbnRseSBpZGVudGlmeWluZyBzaW1wbHV4IHNlbGVjdG9yIG9iamVjdHMgYXQgY29tcGlsZSB0aW1lLlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFNpbXBsdXhTZWxlY3Rvck1hcmtlcjxUU3RhdGUsIFRBcmdzIGV4dGVuZHMgYW55W10sIFRSZXR1cm4+IHtcclxuICAvKipcclxuICAgKiBBIHN5bWJvbCB0aGF0IGFsbG93cyBlZmZpY2llbnQgY29tcGlsZS10aW1lIGFuZCBydW4tdGltZSBpZGVudGlmaWNhdGlvblxyXG4gICAqIG9mIHNpbXBsdXggc2VsZWN0b3Igb2JqZWN0cy5cclxuICAgKlxyXG4gICAqIFRoaXMgcHJvcGVydHkgd2lsbCBoYXZlIGFuIGB1bmRlZmluZWRgIHZhbHVlIGF0IHJ1bnRpbWUuXHJcbiAgICpcclxuICAgKiBAcHVibGljXHJcbiAgICovXHJcbiAgcmVhZG9ubHkgW1NJTVBMVVhfU0VMRUNUT1JdOiBbVFN0YXRlLCBUQXJncywgVFJldHVybl1cclxufVxyXG5cclxuLyoqXHJcbiAqIEEgc2ltcGx1eCBzZWxlY3RvciBpcyBhIGZ1bmN0aW9uIHRoYXQgcHJvamVjdHMgYSBtb2R1bGUncyBzdGF0ZSB0byBzb21lIHZhbHVlLlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFNpbXBsdXhTZWxlY3RvcjxUU3RhdGUsIFRBcmdzIGV4dGVuZHMgYW55W10sIFRSZXR1cm4+XHJcbiAgZXh0ZW5kcyBTaW1wbHV4U2VsZWN0b3JNYXJrZXI8VFN0YXRlLCBUQXJncywgVFJldHVybj4ge1xyXG4gIC8vIHRoaXMgc2lnbmF0dXJlIGRvZXMgbm90IGhhdmUgYSBUU0RvYyBjb21tZW50IG9uIHB1cnBvc2UgdG8gYWxsb3dcclxuICAvLyBjb25zdW1lcnMgdG8gZGVmaW5lIHRoZWlyIG93biBkb2NzIGZvciB0aGVpciBzZWxlY3RvcnMgKHdoaWNoIHdvdWxkXHJcbiAgLy8gYmUgb3ZlcndyaXR0ZW4gaWYgdGhpcyBzaWduYXR1cmUgaGFkIGEgVFNEb2MgY29tbWVudClcclxuICAoLi4uYXJnczogVEFyZ3MpOiBUUmV0dXJuXHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBJRCB0aGF0IGlkZW50aWZpZXMgdGhpcyBzZWxlY3RvciB1bmlxdWVseSBvbiB0aGUgb3duaW5nIG1vZHVsZS5cclxuICAgKlxyXG4gICAqIEBpbnRlcm5hbFxyXG4gICAqL1xyXG4gIHJlYWRvbmx5IHNlbGVjdG9ySWQ6IG51bWJlclxyXG5cclxuICAvKipcclxuICAgKiBUaGUgbmFtZSBvZiB0aGlzIHNlbGVjdG9yLlxyXG4gICAqL1xyXG4gIHJlYWRvbmx5IHNlbGVjdG9yTmFtZTogc3RyaW5nXHJcblxyXG4gIC8qKlxyXG4gICAqIEJ5IGRlZmF1bHQgYSBzZWxlY3RvciBpcyBldmFsdWF0ZWQgd2l0aCB0aGUgbW9kdWxlJ3MgbGF0ZXN0IHN0YXRlLlxyXG4gICAqIFRoaXMgZnVuY3Rpb24gZXZhbHVhdGVzIHRoZSBzZWxlY3RvciB3aXRoIHRoZSBnaXZlbiBzdGF0ZSBpbnN0ZWFkLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHN0YXRlIC0gdGhlIHN0YXRlIHRvIHVzZSB3aGVuIGV2YWx1YXRpbmcgdGhlIHNlbGVjdG9yXHJcbiAgICogQHBhcmFtIGFyZ3MgLSB0aGUgYXJndW1lbnRzIGZvciB0aGUgc2VsZWN0b3JcclxuICAgKlxyXG4gICAqIEByZXR1cm5zIHRoZSBzZWxlY3RlZCB2YWx1ZVxyXG4gICAqL1xyXG4gIHJlYWRvbmx5IHdpdGhTdGF0ZTogKHN0YXRlOiBJbW11dGFibGU8VFN0YXRlPiwgLi4uYXJnczogVEFyZ3MpID0+IFRSZXR1cm5cclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIG1vZHVsZSB0aGlzIHNlbGVjdG9yIGJlbG9uZ3MgdG8uXHJcbiAgICpcclxuICAgKiBAaW50ZXJuYWxcclxuICAgKi9cclxuICByZWFkb25seSBvd25pbmdNb2R1bGU6IFNpbXBsdXhNb2R1bGU8VFN0YXRlPlxyXG59XHJcblxyXG50eXBlIE11dGFibGU8VD4gPSB7IC1yZWFkb25seSBbcHJvcCBpbiBrZXlvZiBUXTogVFtwcm9wXSB9XHJcblxyXG4vKipcclxuICogQSBzaW1wbHV4IHNlbGVjdG9yIGlzIGEgZnVuY3Rpb24gdGhhdCBwcm9qZWN0cyBhIG1vZHVsZSdzIHN0YXRlIHRvIHNvbWUgdmFsdWUuXHJcbiAqIHtAbGluayBTaW1wbHV4U2VsZWN0b3J9XHJcbiAqXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmV4cG9ydCB0eXBlIFJlc29sdmVkU2VsZWN0b3I8XHJcbiAgVFN0YXRlLFxyXG4gIFRTZWxlY3RvckRlZmluaXRpb24gZXh0ZW5kcyBTZWxlY3RvckRlZmluaXRpb248XHJcbiAgICBUU3RhdGUsXHJcbiAgICBSZXR1cm5UeXBlPFRTZWxlY3RvckRlZmluaXRpb24+XHJcbiAgPlxyXG4+ID0gVFNlbGVjdG9yRGVmaW5pdGlvbiBleHRlbmRzIChcclxuICBzdGF0ZTogSW1tdXRhYmxlPFRTdGF0ZT4sXHJcbiAgLi4uYXJnczogaW5mZXIgVEFyZ3NcclxuKSA9PiBpbmZlciBUUmV0dXJuXHJcbiAgPyBTaW1wbHV4U2VsZWN0b3I8VFN0YXRlLCBUQXJncywgVFJldHVybj5cclxuICA6IG5ldmVyXHJcblxyXG4vKipcclxuICogQSBjb2xsZWN0aW9uIG9mIHNpbXBsdXggc2VsZWN0b3JzLlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5leHBvcnQgdHlwZSBTaW1wbHV4U2VsZWN0b3JzPFxyXG4gIFRTdGF0ZSxcclxuICBUU2VsZWN0b3JEZWZpbml0aW9ucyBleHRlbmRzIFNlbGVjdG9yRGVmaW5pdGlvbnM8VFN0YXRlPlxyXG4+ID0ge1xyXG4gIHJlYWRvbmx5IFtuYW1lIGluIGtleW9mIFRTZWxlY3RvckRlZmluaXRpb25zXTogUmVzb2x2ZWRTZWxlY3RvcjxcclxuICAgIFRTdGF0ZSxcclxuICAgIFRTZWxlY3RvckRlZmluaXRpb25zW25hbWVdXHJcbiAgPlxyXG59XHJcblxyXG4vKipcclxuICogQ3JlYXRlIG5ldyBzZWxlY3RvcnMgZm9yIHRoZSBtb2R1bGUuIEEgc2VsZWN0b3IgaXMgYSBmdW5jdGlvblxyXG4gKiB0aGF0IHRha2VzIHRoZSBtb2R1bGUgc3RhdGUgYW5kIG9wdGlvbmFsbHkgYWRkaXRpb25hbCBwYXJhbWV0ZXJzXHJcbiAqIGFuZCByZXR1cm5zIHNvbWUgc2VsZWN0ZWQgdmFsdWUuXHJcbiAqXHJcbiAqIFRoZSBzZWxlY3RvciBtdXN0IGJlIGEgcHVyZSBmdW5jdGlvbi4gSXRzIHJlc3VsdCBpcyBtZW1vaXplZFxyXG4gKiBmb3IgdGhlIGxhdGVzdCBzdGF0ZSBhbmQgcGFyYW1ldGVycy5cclxuICpcclxuICogQHBhcmFtIHNpbXBsdXhNb2R1bGUgLSB0aGUgbW9kdWxlIHRvIGNyZWF0ZSBzZWxlY3RvcnMgZm9yXHJcbiAqIEBwYXJhbSBzZWxlY3RvckRlZmluaXRpb25zIC0gdGhlIHNlbGVjdG9ycyB0byBjcmVhdGVcclxuICpcclxuICogQHJldHVybnMgYW4gb2JqZWN0IHRoYXQgY29udGFpbnMgYSBmdW5jdGlvbiBmb3IgZWFjaCBwcm92aWRlZFxyXG4gKiBzZWxlY3RvclxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU2VsZWN0b3JzPFxyXG4gIFRTdGF0ZSxcclxuICBUU2VsZWN0b3JEZWZpbml0aW9ucyBleHRlbmRzIFNlbGVjdG9yRGVmaW5pdGlvbnM8VFN0YXRlPlxyXG4+KFxyXG4gIHNpbXBsdXhNb2R1bGU6IFNpbXBsdXhNb2R1bGVNYXJrZXI8VFN0YXRlPixcclxuICBzZWxlY3RvckRlZmluaXRpb25zOiBUU2VsZWN0b3JEZWZpbml0aW9ucyxcclxuKTogU2ltcGx1eFNlbGVjdG9yczxUU3RhdGUsIFRTZWxlY3RvckRlZmluaXRpb25zPiB7XHJcbiAgY29uc3QgbW9kdWxlID0gc2ltcGx1eE1vZHVsZSBhcyBTaW1wbHV4TW9kdWxlPFRTdGF0ZT5cclxuICBjb25zdCBpbnRlcm5hbHMgPSBtb2R1bGUuJHNpbXBsdXhcclxuXHJcbiAgY29uc3QgcmVzb2x2ZWRTZWxlY3RvcnMgPSBPYmplY3Qua2V5cyhzZWxlY3RvckRlZmluaXRpb25zKS5yZWR1Y2UoXHJcbiAgICAoYWNjLCBzZWxlY3Rvck5hbWU6IGtleW9mIFRTZWxlY3RvckRlZmluaXRpb25zKSA9PiB7XHJcbiAgICAgIGNvbnN0IGRlZmluaXRpb24gPSBzZWxlY3RvckRlZmluaXRpb25zW3NlbGVjdG9yTmFtZSBhcyBzdHJpbmddIVxyXG4gICAgICBjb25zdCBtZW1vaXplZERlZmluaXRpb24gPSBtZW1vaXplKGRlZmluaXRpb24pXHJcblxyXG4gICAgICBjb25zdCBzZWxlY3RvcklkID0gKGludGVybmFscy5sYXN0U2VsZWN0b3JJZCB8fCAwKSArIDFcclxuICAgICAgaW50ZXJuYWxzLmxhc3RTZWxlY3RvcklkID0gc2VsZWN0b3JJZFxyXG5cclxuICAgICAgY29uc3QgbmFtZWRTZWxlY3RvciA9IG5hbWVGdW5jdGlvbihcclxuICAgICAgICBzZWxlY3Rvck5hbWUgYXMgc3RyaW5nLFxyXG4gICAgICAgICguLi5hcmdzOiBhbnlbXSkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgbW9jayA9IGludGVybmFscy5zZWxlY3Rvck1vY2tzPy5bc2VsZWN0b3JJZF1cclxuICAgICAgICAgIGlmIChtb2NrKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBtb2NrKC4uLmFyZ3MpXHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgcmV0dXJuIG1lbW9pemVkRGVmaW5pdGlvbihpbnRlcm5hbHMuZ2V0U3RhdGUoKSwgLi4uYXJncylcclxuICAgICAgICB9LFxyXG4gICAgICApIGFzIFJlc29sdmVkU2VsZWN0b3I8VFN0YXRlLCBUU2VsZWN0b3JEZWZpbml0aW9uc1t0eXBlb2Ygc2VsZWN0b3JOYW1lXT5cclxuXHJcbiAgICAgIGFjY1tzZWxlY3Rvck5hbWVdID0gbmFtZWRTZWxlY3RvclxyXG5cclxuICAgICAgY29uc3QgZXh0cmFzID0gbmFtZWRTZWxlY3RvciBhcyBNdXRhYmxlPHR5cGVvZiBuYW1lZFNlbGVjdG9yPlxyXG5cclxuICAgICAgZXh0cmFzLndpdGhTdGF0ZSA9IG1lbW9pemVkRGVmaW5pdGlvblxyXG5cclxuICAgICAgZXh0cmFzLnNlbGVjdG9ySWQgPSBzZWxlY3RvcklkXHJcbiAgICAgIGV4dHJhcy5zZWxlY3Rvck5hbWUgPSBzZWxlY3Rvck5hbWUgYXMgc3RyaW5nXHJcbiAgICAgIGV4dHJhcy5vd25pbmdNb2R1bGUgPSBtb2R1bGVcclxuICAgICAgZXh0cmFzW1NJTVBMVVhfU0VMRUNUT1JdID0gJycgYXMgYW55XHJcblxyXG4gICAgICByZXR1cm4gYWNjXHJcbiAgICB9LFxyXG4gICAge30gYXMgTXV0YWJsZTxTaW1wbHV4U2VsZWN0b3JzPFRTdGF0ZSwgVFNlbGVjdG9yRGVmaW5pdGlvbnM+PixcclxuICApXHJcblxyXG4gIHJldHVybiByZXNvbHZlZFNlbGVjdG9yc1xyXG5cclxuICAvLyB0aGlzIGhlbHBlciBmdW5jdGlvbiBhbGxvd3MgY3JlYXRpbmcgYSBmdW5jdGlvbiB3aXRoIGEgZHluYW1pYyBuYW1lIChvbmx5IHdvcmtzIHdpdGggRVM2KylcclxuICBmdW5jdGlvbiBuYW1lRnVuY3Rpb248VCBleHRlbmRzICguLi5hcmdzOiBhbnlbXSkgPT4gYW55PihcclxuICAgIG5hbWU6IHN0cmluZyxcclxuICAgIGJvZHk6IFQsXHJcbiAgKTogVCB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBbbmFtZV0oLi4uYXJnczogYW55W10pIHtcclxuICAgICAgICByZXR1cm4gYm9keSguLi5hcmdzKVxyXG4gICAgICB9LFxyXG4gICAgfVtuYW1lXSBhcyBUXHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiBtZW1vaXplPFRGdW5jdGlvbiBleHRlbmRzIEZ1bmN0aW9uPihmbjogVEZ1bmN0aW9uKTogVEZ1bmN0aW9uIHtcclxuICAgIGxldCBtZW1vaXplZEFyZ3M6IGFueVtdIHwgdW5kZWZpbmVkXHJcbiAgICBsZXQgbWVtb2l6ZWRSZXN1bHQ6IGFueVxyXG5cclxuICAgIGZ1bmN0aW9uIG1lbW9pemVkRnVuY3Rpb24oLi4uYXJnczogYW55W10pIHtcclxuICAgICAgY29uc3QgbWVtb2l6ZWRSZXN1bHROZWVkc1RvQmVSZWZyZXNoZWQgPVxyXG4gICAgICAgICFtZW1vaXplZEFyZ3MgfHxcclxuICAgICAgICBtZW1vaXplZEFyZ3MubGVuZ3RoICE9PSBhcmdzLmxlbmd0aCB8fFxyXG4gICAgICAgICFtZW1vaXplZEFyZ3MuZXZlcnkoKGEsIGlkeCkgPT4gYSA9PT0gYXJnc1tpZHhdKVxyXG5cclxuICAgICAgaWYgKG1lbW9pemVkUmVzdWx0TmVlZHNUb0JlUmVmcmVzaGVkKSB7XHJcbiAgICAgICAgbWVtb2l6ZWRSZXN1bHQgPSBmbiguLi5hcmdzKVxyXG4gICAgICAgIG1lbW9pemVkQXJncyA9IGFyZ3NcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIG1lbW9pemVkUmVzdWx0XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIChtZW1vaXplZEZ1bmN0aW9uIGFzIHVua25vd24pIGFzIFRGdW5jdGlvblxyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIENoZWNrcyBpZiBhbiBvYmplY3QgaXMgYSBzaW1wbHV4IHNlbGVjdG9yLlxyXG4gKlxyXG4gKiBAcGFyYW0gb2JqZWN0IC0gdGhlIG9iamVjdCB0byBjaGVja1xyXG4gKlxyXG4gKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgYSBzaW1wbHV4IHNlbGVjdG9yXHJcbiAqXHJcbiAqIEBpbnRlcm5hbFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF9pc1NpbXBsdXhTZWxlY3RvcjxcclxuICBUU3RhdGUsXHJcbiAgVEFyZ3MgZXh0ZW5kcyBhbnlbXSxcclxuICBUUmV0dXJuLFxyXG4gIFRPdGhlclxyXG4+KFxyXG4gIG9iamVjdDogU2ltcGx1eFNlbGVjdG9yTWFya2VyPFRTdGF0ZSwgVEFyZ3MsIFRSZXR1cm4+IHwgVE90aGVyLFxyXG4pOiBvYmplY3QgaXMgU2ltcGx1eFNlbGVjdG9yPFRTdGF0ZSwgVEFyZ3MsIFRSZXR1cm4+IHtcclxuICByZXR1cm4gKG9iamVjdCBhcyBhbnkpPy5bU0lNUExVWF9TRUxFQ1RPUl0gPT09ICcnXHJcbn1cclxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBOzs7O0dBSUc7QUFDSCxxRUFBcUU7QUFDckUsZ0VBQWdFO0FBQ2hFLHVFQUF1RTtBQUN2RSxxQ0FBcUM7QUFDckMsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsb0JBQW9CLENBQUE7QUFxSHBEOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE1BQU0sVUFBVSxlQUFlLENBSTdCLGFBQTBDLEVBQzFDLG1CQUF5QztJQUV6QyxNQUFNLE1BQU0sR0FBRyxhQUFzQyxDQUFBO0lBQ3JELE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUE7SUFFakMsTUFBTSxpQkFBaUIsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsTUFBTSxDQUMvRCxDQUFDLEdBQUcsRUFBRSxZQUF3QyxFQUFFLEVBQUU7UUFDaEQsTUFBTSxVQUFVLEdBQUcsbUJBQW1CLENBQUMsWUFBc0IsQ0FBRSxDQUFBO1FBQy9ELE1BQU0sa0JBQWtCLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFBO1FBRTlDLE1BQU0sVUFBVSxHQUFHLENBQUMsU0FBUyxDQUFDLGNBQWMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDdEQsU0FBUyxDQUFDLGNBQWMsR0FBRyxVQUFVLENBQUE7UUFFckMsTUFBTSxhQUFhLEdBQUcsWUFBWSxDQUNoQyxZQUFzQixFQUN0QixDQUFDLEdBQUcsSUFBVyxFQUFFLEVBQUU7O1lBQ2pCLE1BQU0sSUFBSSxHQUFHLE1BQUEsU0FBUyxDQUFDLGFBQWEsMENBQUcsVUFBVSxDQUFDLENBQUE7WUFDbEQsSUFBSSxJQUFJLEVBQUU7Z0JBQ1IsT0FBTyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQTthQUNyQjtZQUVELE9BQU8sa0JBQWtCLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUE7UUFDMUQsQ0FBQyxDQUNxRSxDQUFBO1FBRXhFLEdBQUcsQ0FBQyxZQUFZLENBQUMsR0FBRyxhQUFhLENBQUE7UUFFakMsTUFBTSxNQUFNLEdBQUcsYUFBOEMsQ0FBQTtRQUU3RCxNQUFNLENBQUMsU0FBUyxHQUFHLGtCQUFrQixDQUFBO1FBRXJDLE1BQU0sQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFBO1FBQzlCLE1BQU0sQ0FBQyxZQUFZLEdBQUcsWUFBc0IsQ0FBQTtRQUM1QyxNQUFNLENBQUMsWUFBWSxHQUFHLE1BQU0sQ0FBQTtRQUM1QixNQUFNLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxFQUFTLENBQUE7UUFFcEMsT0FBTyxHQUFHLENBQUE7SUFDWixDQUFDLEVBQ0QsRUFBNkQsQ0FDOUQsQ0FBQTtJQUVELE9BQU8saUJBQWlCLENBQUE7SUFFeEIsNkZBQTZGO0lBQzdGLFNBQVMsWUFBWSxDQUNuQixJQUFZLEVBQ1osSUFBTztRQUVQLE9BQU87WUFDTCxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBVztnQkFDbkIsT0FBTyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQTtZQUN0QixDQUFDO1NBQ0YsQ0FBQyxJQUFJLENBQU0sQ0FBQTtJQUNkLENBQUM7SUFFRCxTQUFTLE9BQU8sQ0FBNkIsRUFBYTtRQUN4RCxJQUFJLFlBQStCLENBQUE7UUFDbkMsSUFBSSxjQUFtQixDQUFBO1FBRXZCLFNBQVMsZ0JBQWdCLENBQUMsR0FBRyxJQUFXO1lBQ3RDLE1BQU0sZ0NBQWdDLEdBQ3BDLENBQUMsWUFBWTtnQkFDYixZQUFZLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxNQUFNO2dCQUNuQyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUE7WUFFbEQsSUFBSSxnQ0FBZ0MsRUFBRTtnQkFDcEMsY0FBYyxHQUFHLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFBO2dCQUM1QixZQUFZLEdBQUcsSUFBSSxDQUFBO2FBQ3BCO1lBRUQsT0FBTyxjQUFjLENBQUE7UUFDdkIsQ0FBQztRQUVELE9BQVEsZ0JBQXlDLENBQUE7SUFDbkQsQ0FBQztBQUNILENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sVUFBVSxrQkFBa0IsQ0FNaEMsTUFBOEQ7O0lBRTlELE9BQU8sQ0FBQSxNQUFDLE1BQWMsMENBQUcsZ0JBQWdCLENBQUMsTUFBSyxFQUFFLENBQUE7QUFDbkQsQ0FBQyJ9