chain-able
Version:
interfaces that describe their intentions.
247 lines (233 loc) • 16.2 kB
JavaScript
/**
* @since 2.0.0
*/
var dot = require('../deps/dot')
var isDot = require('../deps/is/dot')
/**
* @desc checks if this.meta.dot != false & isDot(key) - scoped
*
* @private
* @since 3.0.1
*
* @param {string} key key in .get/.has/.delete/set
* @param {DotProp} thisArg Chain
* @return {boolean} shouldDot
*
* @see DotProp.dot
* @see deps/is/dot
* @see deps/meta
* @see https://lodash.com/docs/#get
* @see https://github.com/sindresorhus/dot-prop
*
* @example
*
* const chain = new DotProp()
* shouldDot('me.me', chain)
* //=> true
*
* const chain = new DotProp()
* shouldDot('me', chain)
* //=> false
*
* const chain = new DotProp()
* chain.dot(false)
* shouldDot('me.me', chain)
* //=> false
*
*/
var shouldDot = function (key, thisArg) { return thisArg.meta.dot !== false && isDot(key); }
/**
* @class DotProp
* @member Observe
* @extends {ChainedMap}
* @memberOf compose
* @category Chainable
*
* @param {Class | Composable} SuperClass composable class
* @return {DotProp} class
*
* @tests DotProp
* @types DotProp
*
* @see deps/dot
*
* @example
*
* const {compose} = require('chain-able')
* const {DotProp} = compose
* new DotProp()
* //=> DotProp
*
* @example
*
* const chain = new Chain()
*
* chain.set('moose.simple', 1)
* //=> Chain
*
* chain.get('moose.simple')
* //=>1
*
* chain.get('moose')
* //=> {simple: 1}
*
* chain.set('moose.canada.eh', true).set('moose.canada.igloo', true)
* //=> Chain
*
* //set, has, get, delete :-)
* chain.delete('moose.canada.eh')
* //=> Chain
*
* //also works with an array (moose.canada.igloo)
* chain.get(['moose', 'canada', 'igloo'])
* //=> true
*
*/
module.exports = function (SuperClass) {
return (function (SuperClass) {
function DotProp () {
SuperClass.apply(this, arguments);
}
if ( SuperClass ) DotProp.__proto__ = SuperClass;
DotProp.prototype = Object.create( SuperClass && SuperClass.prototype );
DotProp.prototype.constructor = DotProp;
DotProp.prototype.dot = function dot (useDot) {
this.meta.dot = useDot
return this
};
/**
* @desc since we have a map,
* we need to ensure the first property is available
* otherwise we have an empty map.entries obj
* which does nothing by reference
* @since 3.0.1
* @memberOf DotProp
*
* @override
* @inheritdoc
*
* @see ChainedMap.set
* @see .dot
*
* @example
* const chain = new Chain()
*
* chain.set('moose.simple', 1)
* //=> Chain store:Map: { moose: { simple: 1 } }
*/
DotProp.prototype.set = function set (key, val) {
if (shouldDot(key, this)) {
// first accessor
// @example: `canada` in `canada.eh`
var prop = key.split('.').shift()
// we already know it is .dot, call super instead
// if (!super.has(prop)) super.set(prop, {})
// spread
var data = SuperClass.prototype.entries.call(this)
// set on the spread data
dot.set(data, key, val)
// is already by ref, but be extra safe, + observables
return SuperClass.prototype.set.call(this, prop, data[prop], key)
}
return SuperClass.prototype.set.call(this, key, val)
};
/**
* @desc dot-prop enabled get
* @method get
* @memberOf DotProp
*
* @since 3.0.1
* @override
* @inheritdoc
*
* @param {Primitive} key dot prop key, or any primitive key
* @param {any} [fallback=undefined] fallback value, if it cannot find value with key path
* @return {any} value for path, or fallback value if provided
*
* @see ChainedMap.get
* @see deps/dot
* @see deps/is/dot
*
* @TODO dot-prop on non-store instance.property when using nested chains...
*
* @example
*
* chain.set('moose.simple', 1)
* //=> Chain
*
* chain.get('moose.simple')
* //=>1
*
* chain.get('moose')
* //=> {simple: 1}
*
* @example
*
* //also works with an array (moose.simple)
* chain.get(['moose', 'simple'])
* //=> 1
*
*/
DotProp.prototype.get = function get (key, fallback) {
return shouldDot(key, this)
? dot.get(SuperClass.prototype.entries.call(this), key, fallback)
: SuperClass.prototype.get.call(this, key)
};
/**
* @method has
* @methodOf DotProp
* @since 3.0.1
* @override
* @inheritdoc
*
* @see deps/dot
* @see deps/is/dot
*
* @example
*
* chain.set('one.two', 3)
* chain.has('one.two')
* //=> true
*
*/
DotProp.prototype.has = function has (key) {
return shouldDot(key, this)
? dot.has(SuperClass.prototype.entries.call(this), key)
: SuperClass.prototype.has.call(this, key)
};
/**
* @method delete
* @methodOf DotProp
* @since 3.0.1
*
* @override
* @inheritdoc
* @see deps/dot
* @see deps/is/dot
*
* @example
*
* chain.set('moose.canada.eh', true)
* chain.set('moose.canada.igloo', true)
* //=> Chain
*
* chain.delete('moose.canada.eh')
* //=> Chain
*
* chain.has('moose.canada.eh')
* //=> true
*
* //still has moose.canada.igloo
* chain.has('moose.canada')
* //=> true
*
*/
DotProp.prototype.delete = function delete$1 (key) {
return shouldDot(key, this)
? dot.delete(SuperClass.prototype.entries.call(this), key)
: SuperClass.prototype.delete.call(this, key)
};
return DotProp;
}(SuperClass))
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRG90UHJvcC5qcyIsInNvdXJjZXMiOlsiRG90UHJvcC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBzaW5jZSAyLjAuMFxuICovXG5jb25zdCBkb3QgPSByZXF1aXJlKCcuLi9kZXBzL2RvdCcpXG5jb25zdCBpc0RvdCA9IHJlcXVpcmUoJy4uL2RlcHMvaXMvZG90JylcblxuLyoqXG4gKiBAZGVzYyBjaGVja3MgaWYgdGhpcy5tZXRhLmRvdCAhPSBmYWxzZSAmIGlzRG90KGtleSkgLSBzY29wZWRcbiAqXG4gKiBAcHJpdmF0ZVxuICogQHNpbmNlIDMuMC4xXG4gKlxuICogQHBhcmFtICB7c3RyaW5nfSBrZXkga2V5IGluIC5nZXQvLmhhcy8uZGVsZXRlL3NldFxuICogQHBhcmFtICB7RG90UHJvcH0gdGhpc0FyZyBDaGFpblxuICogQHJldHVybiB7Ym9vbGVhbn0gc2hvdWxkRG90XG4gKlxuICogQHNlZSBEb3RQcm9wLmRvdFxuICogQHNlZSBkZXBzL2lzL2RvdFxuICogQHNlZSBkZXBzL21ldGFcbiAqIEBzZWUgaHR0cHM6Ly9sb2Rhc2guY29tL2RvY3MvI2dldFxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vc2luZHJlc29yaHVzL2RvdC1wcm9wXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiAgY29uc3QgY2hhaW4gPSBuZXcgRG90UHJvcCgpXG4gKiAgc2hvdWxkRG90KCdtZS5tZScsIGNoYWluKVxuICogIC8vPT4gdHJ1ZVxuICpcbiAqICBjb25zdCBjaGFpbiA9IG5ldyBEb3RQcm9wKClcbiAqICBzaG91bGREb3QoJ21lJywgY2hhaW4pXG4gKiAgLy89PiBmYWxzZVxuICpcbiAqICBjb25zdCBjaGFpbiA9IG5ldyBEb3RQcm9wKClcbiAqICBjaGFpbi5kb3QoZmFsc2UpXG4gKiAgc2hvdWxkRG90KCdtZS5tZScsIGNoYWluKVxuICogIC8vPT4gZmFsc2VcbiAqXG4gKi9cbmNvbnN0IHNob3VsZERvdCA9IChrZXksIHRoaXNBcmcpID0+IHRoaXNBcmcubWV0YS5kb3QgIT09IGZhbHNlICYmIGlzRG90KGtleSlcblxuLyoqXG4gKiBAY2xhc3MgRG90UHJvcFxuICogQG1lbWJlciBPYnNlcnZlXG4gKiBAZXh0ZW5kcyB7Q2hhaW5lZE1hcH1cbiAqIEBtZW1iZXJPZiBjb21wb3NlXG4gKiBAY2F0ZWdvcnkgQ2hhaW5hYmxlXG4gKlxuICogQHBhcmFtICB7Q2xhc3MgfCBDb21wb3NhYmxlfSBTdXBlckNsYXNzIGNvbXBvc2FibGUgY2xhc3NcbiAqIEByZXR1cm4ge0RvdFByb3B9IGNsYXNzXG4gKlxuICogQHRlc3RzIERvdFByb3BcbiAqIEB0eXBlcyBEb3RQcm9wXG4gKlxuICogQHNlZSBkZXBzL2RvdFxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogICAgY29uc3Qge2NvbXBvc2V9ID0gcmVxdWlyZSgnY2hhaW4tYWJsZScpXG4gKiAgICBjb25zdCB7RG90UHJvcH0gPSBjb21wb3NlXG4gKiAgICBuZXcgRG90UHJvcCgpXG4gKiAgICAvLz0+IERvdFByb3BcbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgIGNvbnN0IGNoYWluID0gbmV3IENoYWluKClcbiAqXG4gKiAgICBjaGFpbi5zZXQoJ21vb3NlLnNpbXBsZScsIDEpXG4gKiAgICAvLz0+IENoYWluXG4gKlxuICogICAgY2hhaW4uZ2V0KCdtb29zZS5zaW1wbGUnKVxuICogICAgLy89PjFcbiAqXG4gKiAgICBjaGFpbi5nZXQoJ21vb3NlJylcbiAqICAgIC8vPT4ge3NpbXBsZTogMX1cbiAqXG4gKiAgICBjaGFpbi5zZXQoJ21vb3NlLmNhbmFkYS5laCcsIHRydWUpLnNldCgnbW9vc2UuY2FuYWRhLmlnbG9vJywgdHJ1ZSlcbiAqICAgIC8vPT4gQ2hhaW5cbiAqXG4gKiAgICAvL3NldCwgaGFzLCBnZXQsIGRlbGV0ZSA6LSlcbiAqICAgIGNoYWluLmRlbGV0ZSgnbW9vc2UuY2FuYWRhLmVoJylcbiAqICAgIC8vPT4gQ2hhaW5cbiAqXG4gKiAgICAvL2Fsc28gd29ya3Mgd2l0aCBhbiBhcnJheSAobW9vc2UuY2FuYWRhLmlnbG9vKVxuICogICAgY2hhaW4uZ2V0KFsnbW9vc2UnLCAnY2FuYWRhJywgJ2lnbG9vJ10pXG4gKiAgICAvLz0+IHRydWVcbiAqXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gU3VwZXJDbGFzcyA9PiB7XG4gIHJldHVybiBjbGFzcyBEb3RQcm9wIGV4dGVuZHMgU3VwZXJDbGFzcyB7XG4gICAgLyoqXG4gICAgICogQG1ldGhvZCBkb3RcbiAgICAgKiBAbWV0aG9kQ2hhaW4gRG90UHJvcFxuICAgICAqIEBzaW5jZSAzLjAuMVxuICAgICAqXG4gICAgICogQHBhcmFtICB7Ym9vbGVhbn0gW3VzZURvdD11bmRlZmluZWRdIHVzZSBkb3QgcHJvcCBvciBub3RcbiAgICAgKiBAcmV0dXJuIHtEb3RQcm9wfSBAY2hhaW5hYmxlXG4gICAgICpcbiAgICAgKiBAc2VlIGRlcHMvbWV0YVxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqICAgICBjb25zdCBjaGFpbiA9IG5ldyBDaGFpbigpXG4gICAgICogICAgIGNoYWluLmRvdChmYWxzZSlcbiAgICAgKiAgICAgY2hhaW4uc2V0KCdtb29zZS5zaW1wbGUnLCAxKVxuICAgICAqXG4gICAgICogICAgIHRvQXJyKGNoYWluLnN0b3JlLmtleXMoKSlcbiAgICAgKiAgICAgLy89PiBbJ21vb3NlLnNpbXBsZSddXG4gICAgICpcbiAgICAgKi9cbiAgICBkb3QodXNlRG90KSB7XG4gICAgICB0aGlzLm1ldGEuZG90ID0gdXNlRG90XG4gICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXNjIHNpbmNlIHdlIGhhdmUgYSBtYXAsXG4gICAgICogICAgICAgd2UgbmVlZCB0byBlbnN1cmUgdGhlIGZpcnN0IHByb3BlcnR5IGlzIGF2YWlsYWJsZVxuICAgICAqICAgICAgIG90aGVyd2lzZSB3ZSBoYXZlIGFuIGVtcHR5IG1hcC5lbnRyaWVzIG9ialxuICAgICAqICAgICAgIHdoaWNoIGRvZXMgbm90aGluZyBieSByZWZlcmVuY2VcbiAgICAgKiBAc2luY2UgMy4wLjFcbiAgICAgKiBAbWVtYmVyT2YgRG90UHJvcFxuICAgICAqXG4gICAgICogQG92ZXJyaWRlXG4gICAgICogQGluaGVyaXRkb2NcbiAgICAgKlxuICAgICAqIEBzZWUgQ2hhaW5lZE1hcC5zZXRcbiAgICAgKiBAc2VlIC5kb3RcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogICAgY29uc3QgY2hhaW4gPSBuZXcgQ2hhaW4oKVxuICAgICAqXG4gICAgICogICAgY2hhaW4uc2V0KCdtb29zZS5zaW1wbGUnLCAxKVxuICAgICAqICAgIC8vPT4gQ2hhaW4gc3RvcmU6TWFwOiAgeyBtb29zZTogeyBzaW1wbGU6IDEgfSB9XG4gICAgICovXG4gICAgc2V0KGtleSwgdmFsKSB7XG4gICAgICBpZiAoc2hvdWxkRG90KGtleSwgdGhpcykpIHtcbiAgICAgICAgLy8gZmlyc3QgYWNjZXNzb3JcbiAgICAgICAgLy8gQGV4YW1wbGU6IGBjYW5hZGFgIGluIGBjYW5hZGEuZWhgXG4gICAgICAgIGNvbnN0IHByb3AgPSBrZXkuc3BsaXQoJy4nKS5zaGlmdCgpXG5cbiAgICAgICAgLy8gd2UgYWxyZWFkeSBrbm93IGl0IGlzIC5kb3QsIGNhbGwgc3VwZXIgaW5zdGVhZFxuICAgICAgICAvLyBpZiAoIXN1cGVyLmhhcyhwcm9wKSkgc3VwZXIuc2V0KHByb3AsIHt9KVxuXG4gICAgICAgIC8vIHNwcmVhZFxuICAgICAgICBjb25zdCBkYXRhID0gc3VwZXIuZW50cmllcygpXG5cbiAgICAgICAgLy8gc2V0IG9uIHRoZSBzcHJlYWQgZGF0YVxuICAgICAgICBkb3Quc2V0KGRhdGEsIGtleSwgdmFsKVxuXG4gICAgICAgIC8vIGlzIGFscmVhZHkgYnkgcmVmLCBidXQgYmUgZXh0cmEgc2FmZSwgKyBvYnNlcnZhYmxlc1xuICAgICAgICByZXR1cm4gc3VwZXIuc2V0KHByb3AsIGRhdGFbcHJvcF0sIGtleSlcbiAgICAgIH1cbiAgICAgIHJldHVybiBzdXBlci5zZXQoa2V5LCB2YWwpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlc2MgZG90LXByb3AgZW5hYmxlZCBnZXRcbiAgICAgKiBAbWV0aG9kIGdldFxuICAgICAqIEBtZW1iZXJPZiBEb3RQcm9wXG4gICAgICpcbiAgICAgKiBAc2luY2UgMy4wLjFcbiAgICAgKiBAb3ZlcnJpZGVcbiAgICAgKiBAaW5oZXJpdGRvY1xuICAgICAqXG4gICAgICogQHBhcmFtIHtQcmltaXRpdmV9IGtleSBkb3QgcHJvcCBrZXksIG9yIGFueSBwcmltaXRpdmUga2V5XG4gICAgICogQHBhcmFtIHthbnl9IFtmYWxsYmFjaz11bmRlZmluZWRdIGZhbGxiYWNrIHZhbHVlLCBpZiBpdCBjYW5ub3QgZmluZCB2YWx1ZSB3aXRoIGtleSBwYXRoXG4gICAgICogQHJldHVybiB7YW55fSB2YWx1ZSBmb3IgcGF0aCwgb3IgZmFsbGJhY2sgdmFsdWUgaWYgcHJvdmlkZWRcbiAgICAgKlxuICAgICAqIEBzZWUgQ2hhaW5lZE1hcC5nZXRcbiAgICAgKiBAc2VlIGRlcHMvZG90XG4gICAgICogQHNlZSBkZXBzL2lzL2RvdFxuICAgICAqXG4gICAgICogQFRPRE8gZG90LXByb3Agb24gbm9uLXN0b3JlIGluc3RhbmNlLnByb3BlcnR5IHdoZW4gdXNpbmcgbmVzdGVkIGNoYWlucy4uLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqICAgIGNoYWluLnNldCgnbW9vc2Uuc2ltcGxlJywgMSlcbiAgICAgKiAgICAvLz0+IENoYWluXG4gICAgICpcbiAgICAgKiAgICBjaGFpbi5nZXQoJ21vb3NlLnNpbXBsZScpXG4gICAgICogICAgLy89PjFcbiAgICAgKlxuICAgICAqICAgIGNoYWluLmdldCgnbW9vc2UnKVxuICAgICAqICAgIC8vPT4ge3NpbXBsZTogMX1cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiAgICAvL2Fsc28gd29ya3Mgd2l0aCBhbiBhcnJheSAobW9vc2Uuc2ltcGxlKVxuICAgICAqICAgIGNoYWluLmdldChbJ21vb3NlJywgJ3NpbXBsZSddKVxuICAgICAqICAgIC8vPT4gMVxuICAgICAqXG4gICAgICovXG4gICAgZ2V0KGtleSwgZmFsbGJhY2spIHtcbiAgICAgIHJldHVybiBzaG91bGREb3Qoa2V5LCB0aGlzKVxuICAgICAgICA/IGRvdC5nZXQoc3VwZXIuZW50cmllcygpLCBrZXksIGZhbGxiYWNrKVxuICAgICAgICA6IHN1cGVyLmdldChrZXkpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQG1ldGhvZCBoYXNcbiAgICAgKiBAbWV0aG9kT2YgRG90UHJvcFxuICAgICAqIEBzaW5jZSAzLjAuMVxuICAgICAqIEBvdmVycmlkZVxuICAgICAqIEBpbmhlcml0ZG9jXG4gICAgICpcbiAgICAgKiBAc2VlIGRlcHMvZG90XG4gICAgICogQHNlZSBkZXBzL2lzL2RvdFxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqICBjaGFpbi5zZXQoJ29uZS50d28nLCAzKVxuICAgICAqICBjaGFpbi5oYXMoJ29uZS50d28nKVxuICAgICAqICAvLz0+IHRydWVcbiAgICAgKlxuICAgICAqL1xuICAgIGhhcyhrZXkpIHtcbiAgICAgIHJldHVybiBzaG91bGREb3Qoa2V5LCB0aGlzKVxuICAgICAgICA/IGRvdC5oYXMoc3VwZXIuZW50cmllcygpLCBrZXkpXG4gICAgICAgIDogc3VwZXIuaGFzKGtleSlcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAbWV0aG9kIGRlbGV0ZVxuICAgICAqIEBtZXRob2RPZiBEb3RQcm9wXG4gICAgICogQHNpbmNlIDMuMC4xXG4gICAgICpcbiAgICAgKiBAb3ZlcnJpZGVcbiAgICAgKiBAaW5oZXJpdGRvY1xuICAgICAqIEBzZWUgZGVwcy9kb3RcbiAgICAgKiBAc2VlIGRlcHMvaXMvZG90XG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogICAgY2hhaW4uc2V0KCdtb29zZS5jYW5hZGEuZWgnLCB0cnVlKVxuICAgICAqICAgIGNoYWluLnNldCgnbW9vc2UuY2FuYWRhLmlnbG9vJywgdHJ1ZSlcbiAgICAgKiAgICAvLz0+IENoYWluXG4gICAgICpcbiAgICAgKiAgICBjaGFpbi5kZWxldGUoJ21vb3NlLmNhbmFkYS5laCcpXG4gICAgICogICAgLy89PiBDaGFpblxuICAgICAqXG4gICAgICogICAgY2hhaW4uaGFzKCdtb29zZS5jYW5hZGEuZWgnKVxuICAgICAqICAgIC8vPT4gdHJ1ZVxuICAgICAqXG4gICAgICogICAgLy9zdGlsbCBoYXMgbW9vc2UuY2FuYWRhLmlnbG9vXG4gICAgICogICAgY2hhaW4uaGFzKCdtb29zZS5jYW5hZGEnKVxuICAgICAqICAgIC8vPT4gdHJ1ZVxuICAgICAqXG4gICAgICovXG4gICAgZGVsZXRlKGtleSkge1xuICAgICAgcmV0dXJuIHNob3VsZERvdChrZXksIHRoaXMpXG4gICAgICAgID8gZG90LmRlbGV0ZShzdXBlci5lbnRyaWVzKCksIGtleSlcbiAgICAgICAgOiBzdXBlci5kZWxldGUoa2V5KVxuICAgIH1cbiAgfVxufVxuIl0sIm5hbWVzIjpbImNvbnN0Iiwic3VwZXIiXSwibWFwcGluZ3MiOiJBQUFBOzs7QUFHQUEsR0FBSyxDQUFDLEdBQUcsR0FBRyxPQUFPLENBQUMsYUFBYSxDQUFDO0FBQ2xDQSxHQUFLLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWtDdkNBLEdBQUssQ0FBQyxTQUFTLEdBQUcsU0FBQSxDQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUUsQUFBRyxTQUFBLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLEtBQUssSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFpRDVFLE1BQU0sQ0FBQyxPQUFPLEdBQUcsVUFBQSxVQUFVLENBQUEsQ0FBQyxBQUFHO0VBQzdCLE9BQU87SUFBQSxBQUFnQyxBQUFDOzs7Ozs7OztJQUFBLEFBcUJ0QyxrQkFBQSxHQUFHLGdCQUFBLENBQUMsTUFBTSxFQUFFO01BQ1YsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsTUFBTTtNQUN0QixPQUFPLElBQUk7S0FDWixDQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBc0JELGtCQUFBLEdBQUcsZ0JBQUEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFO01BQ1osSUFBSSxTQUFTLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxFQUFFOzs7UUFHeEJBLEdBQUssQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUU7Ozs7OztRQU1uQ0EsR0FBSyxDQUFDLElBQUksR0FBR0Msb0JBQUssQ0FBQyxPQUFPLEtBQUEsQ0FBQyxJQUFBLENBQUM7OztRQUc1QixHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDOzs7UUFHdkIsT0FBT0Esb0JBQUssQ0FBQyxHQUFHLEtBQUEsQ0FBQyxNQUFBLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDO09BQ3hDO01BQ0QsT0FBT0Esb0JBQUssQ0FBQyxHQUFHLEtBQUEsQ0FBQyxNQUFBLEdBQUcsRUFBRSxHQUFHLENBQUM7S0FDM0IsQ0FBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBdUNELGtCQUFBLEdBQUcsZ0JBQUEsQ0FBQyxHQUFHLEVBQUUsUUFBUSxFQUFFO01BQ2pCLE9BQU8sU0FBUyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUM7VUFDdkIsR0FBRyxDQUFDLEdBQUcsQ0FBQ0Esb0JBQUssQ0FBQyxPQUFPLEtBQUEsQ0FBQyxJQUFBLENBQUMsRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDO1VBQ3ZDQSxvQkFBSyxDQUFDLEdBQUcsS0FBQSxDQUFDLE1BQUEsR0FBRyxDQUFDO0tBQ25CLENBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUFtQkQsa0JBQUEsR0FBRyxnQkFBQSxDQUFDLEdBQUcsRUFBRTtNQUNQLE9BQU8sU0FBUyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUM7VUFDdkIsR0FBRyxDQUFDLEdBQUcsQ0FBQ0Esb0JBQUssQ0FBQyxPQUFPLEtBQUEsQ0FBQyxJQUFBLENBQUMsRUFBRSxHQUFHLENBQUM7VUFDN0JBLG9CQUFLLENBQUMsR0FBRyxLQUFBLENBQUMsTUFBQSxHQUFHLENBQUM7S0FDbkIsQ0FBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUE2QkQsa0JBQUEsTUFBTSxxQkFBQSxDQUFDLEdBQUcsRUFBRTtNQUNWLE9BQU8sU0FBUyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUM7VUFDdkIsR0FBRyxDQUFDLE1BQU0sQ0FBQ0Esb0JBQUssQ0FBQyxPQUFPLEtBQUEsQ0FBQyxJQUFBLENBQUMsRUFBRSxHQUFHLENBQUM7VUFDaENBLG9CQUFLLENBQUMsTUFBTSxLQUFBLENBQUMsTUFBQSxHQUFHLENBQUM7S0FDdEIsQ0FBQSxBQUNGOzs7SUFySzRCLFVBcUs1QixFQUFBO0NBQ0Y7In0=