UNPKG

foop

Version:

interfaces that describe their intentions.

222 lines (210 loc) 15.6 kB
/* eslint dot-notation: "OFF" */ /** * @since 2.0.0 */ var isUndefined = require('../deps/is/undefined') var isFunction = require('../deps/is/function') var hasOwnPropertyFlipped = require('../deps/flipped/hasOwnPropertyFlipped') var identity = require('../deps/fp/identity') var defaultToNoop = require('../deps/flipped/defaultToNoop') var hasMeta = hasOwnPropertyFlipped('meta') /** * @class Shorthands * @member Shorthands * @extends {ChainedMap} * @extends {DotProp} * @memberOf compose * @category Chainable * * @param {Class | Composable} Target composable class * @return {Shorthands} class * * @tests Shorthands * @types Shorthands * * @see ChainedMap * @see DotProp * @see deps/matcher * @see deps/traversers/eq * @see deps/traverse * @see DotProp * * {@link https://github.com/ReactiveX/rxjs/blob/master/src/Subscriber.ts reactivex} * {@link https://github.com/sindresorhus/awesome-observables awesome-observables} * {@link https://medium.com/@benlesh/learning-observable-by-building-observable-d5da57405d87 building-observables} * @see {@link reactivex} * @see {@link awesome-observables} * @see {@link building-observables} * * @example * * const {compose} = require('chain-able') * const {DotProp} = compose * new DotProp() * //=> DotProp * */ module.exports = function (Target) { var Shorthands = (function (Target) { function Shorthands(parent) { Target.call(this, parent) this.debug(hasMeta(parent) ? parent.meta.debug : false) } if ( Target ) Shorthands.__proto__ = Target; Shorthands.prototype = Object.create( Target && Target.prototype ); Shorthands.prototype.constructor = Shorthands; return Shorthands; }(Target)); // const constructs = defaultToNoop(Target.prototype.construct) /** * @version 2.0.0 <- was constructor * @version 5.0.0 <- made as construct, meta check as call method > set * * @param {*} parent @see Chainable * @return {void} */ // Target.prototype.construct = function(parent) { // constructs.call(this, parent) // // this.debug(hasMeta(parent) ? parent.meta.debug : false) // } /** * @desc sets on store not this.set for easier extension * * @since 4.0.0 <- moved from Extend to Shorthands * @since 0.2.0 * * @param {boolean} [should=true] shouldDebug * @return {Chainable} @chainable * * @NOTE is inherited by any chain with a parent with .meta.debug * * @example * * const Chain = require('chain-able') * const chain = new Chain() * chain.debug() * * chain.get('debug') * //=> true * * // not in entries * chain.entries() * //=> {} * */ Shorthands.prototype.debug = function(should) { // @NOTE if this is trying to inherit, // and we have shorthands above ChainedMap somehow // because of the `construct`, error, lame if (!this.meta) { return this } this.meta.debug = isUndefined(should) ? true : should return this } /** * @desc sets a value **only** when .has is false * aka set if the value has not been set * * @memberOf ShorthandChain * @since 1.0.2 * @version 4.0.0 <- changed to be prototype method (not extension prototype) * @version 3.0.0 <- changed to use `this.has` vs `isFalse(this.has)` * @version 2.0.0 <- fixed but forgot to return conditionally * * @param {Primitive} name key to set if it has not been done so already * @param {any} value value to set when key has not been already set * @return {ShorthandChain} @chainable * * @see ChainedMapBase.set * * @example * * const chain = new Chain() * * chain.set('eh', true) * * // eh is already set ^, ignored * chain.setIfEmpty('eh', false) * * chain.get('eh') * //=> true * * @example * * new Chain().setIfEmpty('canada', true).entries() * //=> {canada: true} * * @example * * // longhand way to do the same thing * if (chain.has('eh') === false) { * chain.set('eh', false) * } * * // or using .when * chain.when(!chain.has('eh'), instance => instance.set('eh', false)) * */ Shorthands.prototype.setIfEmpty = function(name, value) { if (this.has(name)) { return this } else { return this.set(name, value) } } /** * @desc returns any value passed in * return a value at the end of a chain regardless * * @memberOf ShorthandChain * @since 3.0.0 * * @see fp/identity * @param {any} value value to return at the end of a chain * @return {any} value * * @example * * const chain = new Chain() * * const saveAndDebug = env => chain * .from({env: env.NODE_ENV}) * .return(JSON.stringify(env)) * * console.log(saveAndDebug(process.env)) * //=> value of process.env * */ Shorthands.prototype['return'] = identity /** * @desc wrap a value, if it's a Function call it, return this * aka execute something and return this * * @memberOf ShorthandChain * @since 2.0.0 * @param {Function | any} fn function to call, or just any value * @return {ShorthandChain} @chainable * * @example * * const {eh} = chain.wrap(chain => chain.eh = true) * //=> true * * @example * * new Chain() * .wrap(encased => encased.fn = arg => { * throw new Error('encased yo') * }) * .method('fn') * .encase() * .catch(error => { * //=> Error('encasedYo') * }) * .build() * .fn(true) * */ Shorthands.prototype.wrap = function(fn) { if (isFunction(fn)) { fn.call(this, this) } return this } return Shorthands } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2hvcnRoYW5kcy5qcyIsInNvdXJjZXMiOlsiU2hvcnRoYW5kcy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQgZG90LW5vdGF0aW9uOiBcIk9GRlwiICovXG5cbi8qKlxuICogQHNpbmNlIDIuMC4wXG4gKi9cbmNvbnN0IGlzVW5kZWZpbmVkID0gcmVxdWlyZSgnLi4vZGVwcy9pcy91bmRlZmluZWQnKVxuY29uc3QgaXNGdW5jdGlvbiA9IHJlcXVpcmUoJy4uL2RlcHMvaXMvZnVuY3Rpb24nKVxuY29uc3QgaGFzT3duUHJvcGVydHlGbGlwcGVkID0gcmVxdWlyZSgnLi4vZGVwcy9mbGlwcGVkL2hhc093blByb3BlcnR5RmxpcHBlZCcpXG5jb25zdCBpZGVudGl0eSA9IHJlcXVpcmUoJy4uL2RlcHMvZnAvaWRlbnRpdHknKVxuY29uc3QgZGVmYXVsdFRvTm9vcCA9IHJlcXVpcmUoJy4uL2RlcHMvZmxpcHBlZC9kZWZhdWx0VG9Ob29wJylcblxuY29uc3QgaGFzTWV0YSA9IGhhc093blByb3BlcnR5RmxpcHBlZCgnbWV0YScpXG5cbi8qKlxuICogQGNsYXNzIFNob3J0aGFuZHNcbiAqIEBtZW1iZXIgU2hvcnRoYW5kc1xuICogQGV4dGVuZHMge0NoYWluZWRNYXB9XG4gKiBAZXh0ZW5kcyB7RG90UHJvcH1cbiAqIEBtZW1iZXJPZiBjb21wb3NlXG4gKiBAY2F0ZWdvcnkgQ2hhaW5hYmxlXG4gKlxuICogQHBhcmFtICB7Q2xhc3MgfCBDb21wb3NhYmxlfSBUYXJnZXQgY29tcG9zYWJsZSBjbGFzc1xuICogQHJldHVybiB7U2hvcnRoYW5kc30gY2xhc3NcbiAqXG4gKiBAdGVzdHMgU2hvcnRoYW5kc1xuICogQHR5cGVzIFNob3J0aGFuZHNcbiAqXG4gKiBAc2VlIENoYWluZWRNYXBcbiAqIEBzZWUgRG90UHJvcFxuICogQHNlZSBkZXBzL21hdGNoZXJcbiAqIEBzZWUgZGVwcy90cmF2ZXJzZXJzL2VxXG4gKiBAc2VlIGRlcHMvdHJhdmVyc2VcbiAqIEBzZWUgRG90UHJvcFxuICpcbiAqIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vUmVhY3RpdmVYL3J4anMvYmxvYi9tYXN0ZXIvc3JjL1N1YnNjcmliZXIudHMgcmVhY3RpdmV4fVxuICoge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9zaW5kcmVzb3JodXMvYXdlc29tZS1vYnNlcnZhYmxlcyBhd2Vzb21lLW9ic2VydmFibGVzfVxuICoge0BsaW5rIGh0dHBzOi8vbWVkaXVtLmNvbS9AYmVubGVzaC9sZWFybmluZy1vYnNlcnZhYmxlLWJ5LWJ1aWxkaW5nLW9ic2VydmFibGUtZDVkYTU3NDA1ZDg3IGJ1aWxkaW5nLW9ic2VydmFibGVzfVxuICogQHNlZSB7QGxpbmsgcmVhY3RpdmV4fVxuICogQHNlZSB7QGxpbmsgYXdlc29tZS1vYnNlcnZhYmxlc31cbiAqIEBzZWUge0BsaW5rIGJ1aWxkaW5nLW9ic2VydmFibGVzfVxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogICAgY29uc3Qge2NvbXBvc2V9ID0gcmVxdWlyZSgnY2hhaW4tYWJsZScpXG4gKiAgICBjb25zdCB7RG90UHJvcH0gPSBjb21wb3NlXG4gKiAgICBuZXcgRG90UHJvcCgpXG4gKiAgICAvLz0+IERvdFByb3BcbiAqXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gVGFyZ2V0ID0+IHtcbiAgY2xhc3MgU2hvcnRoYW5kcyBleHRlbmRzIFRhcmdldCB7XG4gICAgY29uc3RydWN0b3IocGFyZW50KSB7XG4gICAgICBzdXBlcihwYXJlbnQpXG4gICAgICB0aGlzLmRlYnVnKGhhc01ldGEocGFyZW50KSA/IHBhcmVudC5tZXRhLmRlYnVnIDogZmFsc2UpXG4gICAgfVxuICB9XG4gIC8vIGNvbnN0IGNvbnN0cnVjdHMgPSBkZWZhdWx0VG9Ob29wKFRhcmdldC5wcm90b3R5cGUuY29uc3RydWN0KVxuXG4gIC8qKlxuICAgKiBAdmVyc2lvbiAyLjAuMCA8LSB3YXMgY29uc3RydWN0b3JcbiAgICogQHZlcnNpb24gNS4wLjAgPC0gbWFkZSBhcyBjb25zdHJ1Y3QsIG1ldGEgY2hlY2sgYXMgY2FsbCBtZXRob2QgPiBzZXRcbiAgICpcbiAgICogQHBhcmFtICB7Kn0gcGFyZW50IEBzZWUgQ2hhaW5hYmxlXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICAvLyBUYXJnZXQucHJvdG90eXBlLmNvbnN0cnVjdCA9IGZ1bmN0aW9uKHBhcmVudCkge1xuICAvLyAgIGNvbnN0cnVjdHMuY2FsbCh0aGlzLCBwYXJlbnQpXG4gIC8vICAgLy8gdGhpcy5kZWJ1ZyhoYXNNZXRhKHBhcmVudCkgPyBwYXJlbnQubWV0YS5kZWJ1ZyA6IGZhbHNlKVxuICAvLyB9XG5cbiAgLyoqXG4gICAqIEBkZXNjIHNldHMgb24gc3RvcmUgbm90IHRoaXMuc2V0IGZvciBlYXNpZXIgZXh0ZW5zaW9uXG4gICAqXG4gICAqIEBzaW5jZSA0LjAuMCA8LSBtb3ZlZCBmcm9tIEV4dGVuZCB0byBTaG9ydGhhbmRzXG4gICAqIEBzaW5jZSAwLjIuMFxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtzaG91bGQ9dHJ1ZV0gc2hvdWxkRGVidWdcbiAgICogQHJldHVybiB7Q2hhaW5hYmxlfSBAY2hhaW5hYmxlXG4gICAqXG4gICAqIEBOT1RFIGlzIGluaGVyaXRlZCBieSBhbnkgY2hhaW4gd2l0aCBhIHBhcmVudCB3aXRoIC5tZXRhLmRlYnVnXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqICAgIGNvbnN0IENoYWluID0gcmVxdWlyZSgnY2hhaW4tYWJsZScpXG4gICAqICAgIGNvbnN0IGNoYWluID0gbmV3IENoYWluKClcbiAgICogICAgY2hhaW4uZGVidWcoKVxuICAgKlxuICAgKiAgICBjaGFpbi5nZXQoJ2RlYnVnJylcbiAgICogICAgLy89PiB0cnVlXG4gICAqXG4gICAqICAgIC8vIG5vdCBpbiBlbnRyaWVzXG4gICAqICAgIGNoYWluLmVudHJpZXMoKVxuICAgKiAgICAvLz0+IHt9XG4gICAqXG4gICAqL1xuICBTaG9ydGhhbmRzLnByb3RvdHlwZS5kZWJ1ZyA9IGZ1bmN0aW9uKHNob3VsZCkge1xuICAgIC8vIEBOT1RFIGlmIHRoaXMgaXMgdHJ5aW5nIHRvIGluaGVyaXQsXG4gICAgLy8gYW5kIHdlIGhhdmUgc2hvcnRoYW5kcyBhYm92ZSBDaGFpbmVkTWFwIHNvbWVob3dcbiAgICAvLyBiZWNhdXNlIG9mIHRoZSBgY29uc3RydWN0YCwgZXJyb3IsIGxhbWVcbiAgICBpZiAoIXRoaXMubWV0YSkgcmV0dXJuIHRoaXNcbiAgICB0aGlzLm1ldGEuZGVidWcgPSBpc1VuZGVmaW5lZChzaG91bGQpID8gdHJ1ZSA6IHNob3VsZFxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICogQGRlc2Mgc2V0cyBhIHZhbHVlICoqb25seSoqIHdoZW4gLmhhcyBpcyBmYWxzZVxuICAgKiAgICAgICBha2Egc2V0IGlmIHRoZSB2YWx1ZSBoYXMgbm90IGJlZW4gc2V0XG4gICAqXG4gICAqIEBtZW1iZXJPZiBTaG9ydGhhbmRDaGFpblxuICAgKiBAc2luY2UgMS4wLjJcbiAgICogQHZlcnNpb24gNC4wLjAgPC0gY2hhbmdlZCB0byBiZSBwcm90b3R5cGUgbWV0aG9kIChub3QgZXh0ZW5zaW9uIHByb3RvdHlwZSlcbiAgICogQHZlcnNpb24gMy4wLjAgPC0gY2hhbmdlZCB0byB1c2UgYHRoaXMuaGFzYCB2cyBgaXNGYWxzZSh0aGlzLmhhcylgXG4gICAqIEB2ZXJzaW9uIDIuMC4wIDwtIGZpeGVkIGJ1dCBmb3Jnb3QgdG8gcmV0dXJuIGNvbmRpdGlvbmFsbHlcbiAgICpcbiAgICogQHBhcmFtIHtQcmltaXRpdmV9IG5hbWUga2V5IHRvIHNldCBpZiBpdCBoYXMgbm90IGJlZW4gZG9uZSBzbyBhbHJlYWR5XG4gICAqIEBwYXJhbSB7YW55fSB2YWx1ZSB2YWx1ZSB0byBzZXQgd2hlbiBrZXkgaGFzIG5vdCBiZWVuIGFscmVhZHkgc2V0XG4gICAqIEByZXR1cm4ge1Nob3J0aGFuZENoYWlufSBAY2hhaW5hYmxlXG4gICAqXG4gICAqIEBzZWUgQ2hhaW5lZE1hcEJhc2Uuc2V0XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqICAgIGNvbnN0IGNoYWluID0gbmV3IENoYWluKClcbiAgICpcbiAgICogICAgY2hhaW4uc2V0KCdlaCcsIHRydWUpXG4gICAqXG4gICAqICAgIC8vIGVoIGlzIGFscmVhZHkgc2V0IF4sIGlnbm9yZWRcbiAgICogICAgY2hhaW4uc2V0SWZFbXB0eSgnZWgnLCBmYWxzZSlcbiAgICpcbiAgICogICAgY2hhaW4uZ2V0KCdlaCcpXG4gICAqICAgIC8vPT4gdHJ1ZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiAgIG5ldyBDaGFpbigpLnNldElmRW1wdHkoJ2NhbmFkYScsIHRydWUpLmVudHJpZXMoKVxuICAgKiAgIC8vPT4ge2NhbmFkYTogdHJ1ZX1cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogICAvLyBsb25naGFuZCB3YXkgdG8gZG8gdGhlIHNhbWUgdGhpbmdcbiAgICogICBpZiAoY2hhaW4uaGFzKCdlaCcpID09PSBmYWxzZSkge1xuICAgKiAgICAgY2hhaW4uc2V0KCdlaCcsIGZhbHNlKVxuICAgKiAgIH1cbiAgICpcbiAgICogICAvLyBvciB1c2luZyAud2hlblxuICAgKiAgIGNoYWluLndoZW4oIWNoYWluLmhhcygnZWgnKSwgaW5zdGFuY2UgPT4gaW5zdGFuY2Uuc2V0KCdlaCcsIGZhbHNlKSlcbiAgICpcbiAgICovXG4gIFNob3J0aGFuZHMucHJvdG90eXBlLnNldElmRW1wdHkgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICAgIGlmICh0aGlzLmhhcyhuYW1lKSkgcmV0dXJuIHRoaXNcbiAgICBlbHNlIHJldHVybiB0aGlzLnNldChuYW1lLCB2YWx1ZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzYyByZXR1cm5zIGFueSB2YWx1ZSBwYXNzZWQgaW5cbiAgICogICAgICAgcmV0dXJuIGEgdmFsdWUgYXQgdGhlIGVuZCBvZiBhIGNoYWluIHJlZ2FyZGxlc3NcbiAgICpcbiAgICogQG1lbWJlck9mIFNob3J0aGFuZENoYWluXG4gICAqIEBzaW5jZSAzLjAuMFxuICAgKlxuICAgKiBAc2VlIGZwL2lkZW50aXR5XG4gICAqIEBwYXJhbSAge2FueX0gdmFsdWUgdmFsdWUgdG8gcmV0dXJuIGF0IHRoZSBlbmQgb2YgYSBjaGFpblxuICAgKiBAcmV0dXJuIHthbnl9IHZhbHVlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqICAgIGNvbnN0IGNoYWluID0gbmV3IENoYWluKClcbiAgICpcbiAgICogICAgY29uc3Qgc2F2ZUFuZERlYnVnID0gZW52ID0+IGNoYWluXG4gICAqICAgICAgLmZyb20oe2VudjogZW52Lk5PREVfRU5WfSlcbiAgICogICAgICAucmV0dXJuKEpTT04uc3RyaW5naWZ5KGVudikpXG4gICAqXG4gICAqICAgIGNvbnNvbGUubG9nKHNhdmVBbmREZWJ1Zyhwcm9jZXNzLmVudikpXG4gICAqICAgIC8vPT4gdmFsdWUgb2YgcHJvY2Vzcy5lbnZcbiAgICpcbiAgICovXG4gIFNob3J0aGFuZHMucHJvdG90eXBlWydyZXR1cm4nXSA9IGlkZW50aXR5XG5cbiAgLyoqXG4gICAqIEBkZXNjIHdyYXAgYSB2YWx1ZSwgaWYgaXQncyBhIEZ1bmN0aW9uIGNhbGwgaXQsIHJldHVybiB0aGlzXG4gICAqICAgICAgIGFrYSBleGVjdXRlIHNvbWV0aGluZyBhbmQgcmV0dXJuIHRoaXNcbiAgICpcbiAgICogQG1lbWJlck9mIFNob3J0aGFuZENoYWluXG4gICAqIEBzaW5jZSAyLjAuMFxuICAgKiBAcGFyYW0gIHtGdW5jdGlvbiB8IGFueX0gZm4gZnVuY3Rpb24gdG8gY2FsbCwgb3IganVzdCBhbnkgdmFsdWVcbiAgICogQHJldHVybiB7U2hvcnRoYW5kQ2hhaW59IEBjaGFpbmFibGVcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogICAgY29uc3Qge2VofSA9IGNoYWluLndyYXAoY2hhaW4gPT4gY2hhaW4uZWggPSB0cnVlKVxuICAgKiAgICAvLz0+IHRydWVcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogICAgbmV3IENoYWluKClcbiAgICogICAgICAud3JhcChlbmNhc2VkID0+IGVuY2FzZWQuZm4gPSBhcmcgPT4ge1xuICAgKiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdlbmNhc2VkIHlvJylcbiAgICogICAgICB9KVxuICAgKiAgICAgIC5tZXRob2QoJ2ZuJylcbiAgICogICAgICAuZW5jYXNlKClcbiAgICogICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgKiAgICAgICAgLy89PiBFcnJvcignZW5jYXNlZFlvJylcbiAgICogICAgICB9KVxuICAgKiAgICAgIC5idWlsZCgpXG4gICAqICAgICAgLmZuKHRydWUpXG4gICAqXG4gICAqL1xuICBTaG9ydGhhbmRzLnByb3RvdHlwZS53cmFwID0gZnVuY3Rpb24oZm4pIHtcbiAgICBpZiAoaXNGdW5jdGlvbihmbikpIGZuLmNhbGwodGhpcywgdGhpcylcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgcmV0dXJuIFNob3J0aGFuZHNcbn1cbiJdLCJuYW1lcyI6WyJjb25zdCIsInN1cGVyIl0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7QUFLQUEsR0FBSyxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUMsc0JBQXNCLENBQUM7QUFDbkRBLEdBQUssQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDLHFCQUFxQixDQUFDO0FBQ2pEQSxHQUFLLENBQUMscUJBQXFCLEdBQUcsT0FBTyxDQUFDLHVDQUF1QyxDQUFDO0FBQzlFQSxHQUFLLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQztBQUMvQ0EsR0FBSyxDQUFDLGFBQWEsR0FBRyxPQUFPLENBQUMsK0JBQStCLENBQUM7O0FBRTlEQSxHQUFLLENBQUMsT0FBTyxHQUFHLHFCQUFxQixDQUFDLE1BQU0sQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFzQzdDLE1BQU0sQ0FBQyxPQUFPLEdBQUcsVUFBQSxNQUFNLENBQUEsQ0FBQyxBQUFHO0VBQ3pCLElBQU0sVUFBVSxHQUFlO0lBQUMsQUFDOUIsbUJBQVcsQ0FBQyxNQUFNLEVBQUU7TUFDbEJDLE1BQUssS0FBQSxDQUFDLE1BQUEsTUFBTSxDQUFDO01BQ2IsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0tBQ3hEOzs7O2tEQUFBLEFBQ0Y7OztJQUx3QixNQUt4QixHQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBd0NELFVBQVUsQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHLFNBQVMsTUFBTSxFQUFFOzs7O0lBSTVDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUEsT0FBTyxJQUFJLEVBQUE7SUFDM0IsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksR0FBRyxNQUFNO0lBQ3JELE9BQU8sSUFBSTtHQUNaOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBOENELFVBQVUsQ0FBQyxTQUFTLENBQUMsVUFBVSxHQUFHLFNBQVMsSUFBSSxFQUFFLEtBQUssRUFBRTtJQUN0RCxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBQSxPQUFPLElBQUksRUFBQTtTQUMxQixFQUFBLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUE7R0FDbEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUF5QkQsVUFBVSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsR0FBRyxRQUFROzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBK0J6QyxVQUFVLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRyxTQUFTLEVBQUUsRUFBRTtJQUN2QyxJQUFJLFVBQVUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFBLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFBO0lBQ3ZDLE9BQU8sSUFBSTtHQUNaOztFQUVELE9BQU8sVUFBVTtDQUNsQjsifQ==