UNPKG

foop

Version:

interfaces that describe their intentions.

182 lines (163 loc) 21.5 kB
/** @ignore 🚧 wip */ var ignored = require('./deps/meta/ignored') var getMeta = require('./deps/meta/meta') var Chain = require('./compose/compose') var throttle = require('./deps/_/throttle') var isFunction = require('./deps/is/function') var isString = require('./deps/is/string') var curry = require('./deps/fp/curry') var bind = require('./deps/fp/bind') var toArr = require('./deps/to-arr') var camelCase = require('./deps/string/camelCase') var eq = require('./deps/traversers/eq') var isEmpty = require('./deps/is/empty') var escapeDot = require('./deps/dot/escape') var not = require('./deps/conditional/not') var ObjectKeys = require('./deps/util/keys') // @TODO pass in factories first, like bind, get, set, has, ifElse module.exports = function (chain) { // could also do `before` & `after` diffs for keys when instantiating // chain.sponge = () => { // mapKeys(chain, key => { // if (!ignored(key)) return // // // larger... faster... (than inlining 1 if statement...) // const value = chain[key] // if (isFunction(value)) return // // // what if conflict? // chain.set(key, value) // }) // } chain.addPooling = function () { // addPoolingTo(Chain) chain.release = function () { // Chain.release(chain) chain.clear(true) chain.meta = undefined chain.meta = getMeta(chain) } chain.init = chain.getPooled = function (parent) { return Chain.getPooled(parent); } } chain._ifElse = function (condition, fn) { if ( fn === void 0 ) fn = null; var ifElse = {} ifElse.then = function (cb) { ifElse._then = cb return (condition.call(chain) ? cb.call(chain) : ifElse) } ifElse.else = function (cb) { ifElse._else = cb return (!condition.call(chain) ? cb.call(chain) : ifElse) } ifElse.elseIf = chain.ifElse return ifElse } // THIS WAY, THIS IS LIKE .when which is called every change chain.ifElse = function (condition, fn) { if ( fn === void 0 ) fn = null; var ifElse = chain._ifElse(condition) // chain.observe('*', debounce(() => { // if (ifElse._then) ifElse._then.call(chain) // if (ifElse._else) ifElse._else.call(chain) // }), 10) chain.observe('*', throttle(function () { if (ifElse._then) { ifElse._then.call(chain) } if (ifElse._else) { ifElse._else.call(chain) } }), 5) // chain.observe('*', changed => { // require('fliplog').data({changed}).echo() // if (ifElse._then) ifElse._then.call(chain) // if (ifElse._else) ifElse._else.call(chain) // }) return ifElse } var _eq = curry(2, eq) // @TODO when passing `propIs` and using a non-function, use `propeq` // chain.prop = curry(2, chain.propEq) chain.propEq = function (prop, value) { return eq(chain.get(prop), value); } chain.propIs = function (prop, fn) { if (isString(fn)) { fn = _eq(fn) } if (!isFunction(fn)) { // require('fliplog').quick({fn}) } return fn(chain.get(prop)) } // chain.propIsNot = not(chain.propIs) chain.freezeProp = function (prop) { var frozen = chain.get(prop) chain.transform(prop, function (data) { return frozen; }) } chain.propIsNot = function (prop, fn) { return not(chain.propIs(prop, fn)); } chain.propEq = curry(2, chain.propEq) chain.propIs = curry(2, chain.propIs) chain.propIsNot = curry(2, chain.propIsNot) chain.transform = curry(2, bind(chain.transform, chain)) chain.observe = curry(2, bind(chain.observe, chain)) chain.set = bind(chain.set, chain) // @NOTE could curry 3, but that forces an else... bah chain.when = curry(2, chain.when) var _transforms = function (prop, transforms) { return transforms.forEach(function (transform) { return chain.transform(prop, transform); }); } chain.transforms = curry(2, _transforms) // @TODO when prefix, could do so much like // `{ehView} = chain` for prefix // `{viewEh} = chain` for postfix // // const {get, set} = chain.boundMethods('get,set') // bindMethods, scopedMethods chain.boundMethods = function (methods, prefix) { if ( prefix === void 0 ) prefix = ''; var bound = {} var bounds = toArr(methods).forEach(function (method) { return bound[method] = bind(chain[method], chain); } ) return bound } // ignore transform and observe chain.setSilent = curry(2, function (key, prop) { chain.store.set(key, prop) return chain }) // partial, `view` chain.view = function (prop) { return function () { return chain.get(prop); }; } chain.lense = function (prop) { // @TODO allow using every single `is` as property of the `is` returned // // [x] also return a destructurable obj with camel like // [prop] + '-View' var obj = { escapeDot: function () { prop = escapeDot(prop) return chain }, has: function () { return chain.has(prop); }, get: function () { return chain.get(prop); }, view: chain.view(prop), eq: chain.propEq(prop), is: chain.propIs(prop), not: chain.propIsNot(prop), freeze: function () { return chain.freezeProp(prop); }, // update, adjust // set: chain.set(prop), set: function (val) { return chain.set(prop, val); }, setSilent: function (val) { return chain.setSilent(prop, val); }, transform: chain.transform(prop), observe: chain.observe(prop), transforms: chain.transforms(prop), } // clone: true // obj.mapKeys() ObjectKeys(obj).forEach(function (key) { var destructurableKey = camelCase(key + '-' + prop) var destructurableReverse = camelCase(prop + '-' + key) obj[destructurableKey] = obj[key] obj[destructurableReverse] = obj[key] }) return obj } chain.unobserve = function (observer) { return chain.meta('observe').delete(observer); } chain.untransform = function (transformer) { return chain.meta('transform').delete(transformer); } return chain } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhaW5QbHVzLmpzIiwic291cmNlcyI6WyJjaGFpblBsdXMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqIEBpZ25vcmUg8J+apyB3aXAgKi9cblxuY29uc3QgaWdub3JlZCA9IHJlcXVpcmUoJy4vZGVwcy9tZXRhL2lnbm9yZWQnKVxuY29uc3QgZ2V0TWV0YSA9IHJlcXVpcmUoJy4vZGVwcy9tZXRhL21ldGEnKVxuY29uc3QgQ2hhaW4gPSByZXF1aXJlKCcuL2NvbXBvc2UvY29tcG9zZScpXG5jb25zdCB0aHJvdHRsZSA9IHJlcXVpcmUoJy4vZGVwcy9fL3Rocm90dGxlJylcbmNvbnN0IGlzRnVuY3Rpb24gPSByZXF1aXJlKCcuL2RlcHMvaXMvZnVuY3Rpb24nKVxuY29uc3QgaXNTdHJpbmcgPSByZXF1aXJlKCcuL2RlcHMvaXMvc3RyaW5nJylcbmNvbnN0IGN1cnJ5ID0gcmVxdWlyZSgnLi9kZXBzL2ZwL2N1cnJ5JylcbmNvbnN0IGJpbmQgPSByZXF1aXJlKCcuL2RlcHMvZnAvYmluZCcpXG5jb25zdCB0b0FyciA9IHJlcXVpcmUoJy4vZGVwcy90by1hcnInKVxuY29uc3QgY2FtZWxDYXNlID0gcmVxdWlyZSgnLi9kZXBzL3N0cmluZy9jYW1lbENhc2UnKVxuY29uc3QgZXEgPSByZXF1aXJlKCcuL2RlcHMvdHJhdmVyc2Vycy9lcScpXG5jb25zdCBpc0VtcHR5ID0gcmVxdWlyZSgnLi9kZXBzL2lzL2VtcHR5JylcbmNvbnN0IGVzY2FwZURvdCA9IHJlcXVpcmUoJy4vZGVwcy9kb3QvZXNjYXBlJylcbmNvbnN0IG5vdCA9IHJlcXVpcmUoJy4vZGVwcy9jb25kaXRpb25hbC9ub3QnKVxuY29uc3QgT2JqZWN0S2V5cyA9IHJlcXVpcmUoJy4vZGVwcy91dGlsL2tleXMnKVxuXG4vLyBAVE9ETyBwYXNzIGluIGZhY3RvcmllcyBmaXJzdCwgbGlrZSBiaW5kLCBnZXQsIHNldCwgaGFzLCBpZkVsc2Vcbm1vZHVsZS5leHBvcnRzID0gKGNoYWluKSA9PiB7XG4gIC8vIGNvdWxkIGFsc28gZG8gYGJlZm9yZWAgJiBgYWZ0ZXJgIGRpZmZzIGZvciBrZXlzIHdoZW4gaW5zdGFudGlhdGluZ1xuICAvLyBjaGFpbi5zcG9uZ2UgPSAoKSA9PiB7XG4gIC8vICAgbWFwS2V5cyhjaGFpbiwga2V5ID0+IHtcbiAgLy8gICAgIGlmICghaWdub3JlZChrZXkpKSByZXR1cm5cbiAgLy9cbiAgLy8gICAgIC8vIGxhcmdlci4uLiBmYXN0ZXIuLi4gKHRoYW4gaW5saW5pbmcgMSBpZiBzdGF0ZW1lbnQuLi4pXG4gIC8vICAgICBjb25zdCB2YWx1ZSA9IGNoYWluW2tleV1cbiAgLy8gICAgIGlmIChpc0Z1bmN0aW9uKHZhbHVlKSkgcmV0dXJuXG4gIC8vXG4gIC8vICAgICAvLyB3aGF0IGlmIGNvbmZsaWN0P1xuICAvLyAgICAgY2hhaW4uc2V0KGtleSwgdmFsdWUpXG4gIC8vICAgfSlcbiAgLy8gfVxuICBjaGFpbi5hZGRQb29saW5nID0gKCkgPT4ge1xuICAgIC8vIGFkZFBvb2xpbmdUbyhDaGFpbilcbiAgICBjaGFpbi5yZWxlYXNlID0gKCkgPT4ge1xuICAgICAgLy8gQ2hhaW4ucmVsZWFzZShjaGFpbilcbiAgICAgIGNoYWluLmNsZWFyKHRydWUpXG4gICAgICBjaGFpbi5tZXRhID0gdW5kZWZpbmVkXG4gICAgICBjaGFpbi5tZXRhID0gZ2V0TWV0YShjaGFpbilcbiAgICB9XG4gICAgY2hhaW4uaW5pdCA9IGNoYWluLmdldFBvb2xlZCA9IHBhcmVudCA9PiBDaGFpbi5nZXRQb29sZWQocGFyZW50KVxuICB9XG5cbiAgY2hhaW4uX2lmRWxzZSA9IChjb25kaXRpb24sIGZuID0gbnVsbCkgPT4ge1xuICAgIGNvbnN0IGlmRWxzZSA9IHt9XG4gICAgaWZFbHNlLnRoZW4gPSBjYiA9PiB7XG4gICAgICBpZkVsc2UuX3RoZW4gPSBjYlxuICAgICAgcmV0dXJuIChjb25kaXRpb24uY2FsbChjaGFpbikgPyBjYi5jYWxsKGNoYWluKSA6IGlmRWxzZSlcbiAgICB9XG4gICAgaWZFbHNlLmVsc2UgPSBjYiA9PiB7XG4gICAgICBpZkVsc2UuX2Vsc2UgPSBjYlxuICAgICAgcmV0dXJuICghY29uZGl0aW9uLmNhbGwoY2hhaW4pID8gY2IuY2FsbChjaGFpbikgOiBpZkVsc2UpXG4gICAgfVxuICAgIGlmRWxzZS5lbHNlSWYgPSBjaGFpbi5pZkVsc2VcbiAgICByZXR1cm4gaWZFbHNlXG4gIH1cblxuICAvLyBUSElTIFdBWSwgVEhJUyBJUyBMSUtFIC53aGVuIHdoaWNoIGlzIGNhbGxlZCBldmVyeSBjaGFuZ2VcbiAgY2hhaW4uaWZFbHNlID0gKGNvbmRpdGlvbiwgZm4gPSBudWxsKSA9PiB7XG4gICAgY29uc3QgaWZFbHNlID0gY2hhaW4uX2lmRWxzZShjb25kaXRpb24pXG4gICAgLy8gY2hhaW4ub2JzZXJ2ZSgnKicsIGRlYm91bmNlKCgpID0+IHtcbiAgICAvLyAgIGlmIChpZkVsc2UuX3RoZW4pIGlmRWxzZS5fdGhlbi5jYWxsKGNoYWluKVxuICAgIC8vICAgaWYgKGlmRWxzZS5fZWxzZSkgaWZFbHNlLl9lbHNlLmNhbGwoY2hhaW4pXG4gICAgLy8gfSksIDEwKVxuICAgIGNoYWluLm9ic2VydmUoJyonLCB0aHJvdHRsZSgoKSA9PiB7XG4gICAgICBpZiAoaWZFbHNlLl90aGVuKSBpZkVsc2UuX3RoZW4uY2FsbChjaGFpbilcbiAgICAgIGlmIChpZkVsc2UuX2Vsc2UpIGlmRWxzZS5fZWxzZS5jYWxsKGNoYWluKVxuICAgIH0pLCA1KVxuXG4gICAgLy8gY2hhaW4ub2JzZXJ2ZSgnKicsIGNoYW5nZWQgPT4ge1xuICAgIC8vICAgcmVxdWlyZSgnZmxpcGxvZycpLmRhdGEoe2NoYW5nZWR9KS5lY2hvKClcbiAgICAvLyAgIGlmIChpZkVsc2UuX3RoZW4pIGlmRWxzZS5fdGhlbi5jYWxsKGNoYWluKVxuICAgIC8vICAgaWYgKGlmRWxzZS5fZWxzZSkgaWZFbHNlLl9lbHNlLmNhbGwoY2hhaW4pXG4gICAgLy8gfSlcbiAgICByZXR1cm4gaWZFbHNlXG4gIH1cblxuICBjb25zdCBfZXEgPSBjdXJyeSgyLCBlcSlcbiAgLy8gQFRPRE8gd2hlbiBwYXNzaW5nIGBwcm9wSXNgIGFuZCB1c2luZyBhIG5vbi1mdW5jdGlvbiwgdXNlIGBwcm9wZXFgXG4gIC8vIGNoYWluLnByb3AgPSBjdXJyeSgyLCBjaGFpbi5wcm9wRXEpXG4gIGNoYWluLnByb3BFcSA9IChwcm9wLCB2YWx1ZSkgPT4gZXEoY2hhaW4uZ2V0KHByb3ApLCB2YWx1ZSlcbiAgY2hhaW4ucHJvcElzID0gKHByb3AsIGZuKSA9PiB7XG4gICAgaWYgKGlzU3RyaW5nKGZuKSkge1xuICAgICAgZm4gPSBfZXEoZm4pXG4gICAgfVxuICAgIGlmICghaXNGdW5jdGlvbihmbikpIHtcbiAgICAgIC8vIHJlcXVpcmUoJ2ZsaXBsb2cnKS5xdWljayh7Zm59KVxuICAgIH1cbiAgICByZXR1cm4gZm4oY2hhaW4uZ2V0KHByb3ApKVxuICB9XG5cbiAgLy8gY2hhaW4ucHJvcElzTm90ID0gbm90KGNoYWluLnByb3BJcylcbiAgY2hhaW4uZnJlZXplUHJvcCA9IHByb3AgPT4ge1xuICAgIGNvbnN0IGZyb3plbiA9IGNoYWluLmdldChwcm9wKVxuICAgIGNoYWluLnRyYW5zZm9ybShwcm9wLCBkYXRhID0+IGZyb3plbilcbiAgfVxuICBjaGFpbi5wcm9wSXNOb3QgPSAocHJvcCwgZm4pID0+IG5vdChjaGFpbi5wcm9wSXMocHJvcCwgZm4pKVxuICBjaGFpbi5wcm9wRXEgPSBjdXJyeSgyLCBjaGFpbi5wcm9wRXEpXG4gIGNoYWluLnByb3BJcyA9IGN1cnJ5KDIsIGNoYWluLnByb3BJcylcbiAgY2hhaW4ucHJvcElzTm90ID0gY3VycnkoMiwgY2hhaW4ucHJvcElzTm90KVxuICBjaGFpbi50cmFuc2Zvcm0gPSBjdXJyeSgyLCBiaW5kKGNoYWluLnRyYW5zZm9ybSwgY2hhaW4pKVxuICBjaGFpbi5vYnNlcnZlID0gY3VycnkoMiwgYmluZChjaGFpbi5vYnNlcnZlLCBjaGFpbikpXG4gIGNoYWluLnNldCA9IGJpbmQoY2hhaW4uc2V0LCBjaGFpbilcblxuICAvLyBATk9URSBjb3VsZCBjdXJyeSAzLCBidXQgdGhhdCBmb3JjZXMgYW4gZWxzZS4uLiBiYWhcbiAgY2hhaW4ud2hlbiA9IGN1cnJ5KDIsIGNoYWluLndoZW4pXG5cbiAgY29uc3QgX3RyYW5zZm9ybXMgPSAocHJvcCwgdHJhbnNmb3JtcykgPT5cbiAgICB0cmFuc2Zvcm1zLmZvckVhY2godHJhbnNmb3JtID0+IGNoYWluLnRyYW5zZm9ybShwcm9wLCB0cmFuc2Zvcm0pKVxuICBjaGFpbi50cmFuc2Zvcm1zID0gY3VycnkoMiwgX3RyYW5zZm9ybXMpXG5cbiAgLy8gQFRPRE8gd2hlbiBwcmVmaXgsIGNvdWxkIGRvIHNvIG11Y2ggbGlrZVxuICAvLyBge2VoVmlld30gPSBjaGFpbmAgZm9yIHByZWZpeFxuICAvLyBge3ZpZXdFaH0gPSBjaGFpbmAgZm9yIHBvc3RmaXhcbiAgLy9cbiAgLy8gY29uc3Qge2dldCwgc2V0fSA9IGNoYWluLmJvdW5kTWV0aG9kcygnZ2V0LHNldCcpXG4gIC8vIGJpbmRNZXRob2RzLCBzY29wZWRNZXRob2RzXG4gIGNoYWluLmJvdW5kTWV0aG9kcyA9IChtZXRob2RzLCBwcmVmaXggPSAnJykgPT4ge1xuICAgIGNvbnN0IGJvdW5kID0ge31cbiAgICBjb25zdCBib3VuZHMgPSB0b0FycihtZXRob2RzKS5mb3JFYWNoKG1ldGhvZCA9PlxuICAgICAgYm91bmRbbWV0aG9kXSA9IGJpbmQoY2hhaW5bbWV0aG9kXSwgY2hhaW4pXG4gICAgKVxuICAgIHJldHVybiBib3VuZFxuICB9XG5cbiAgLy8gaWdub3JlIHRyYW5zZm9ybSBhbmQgb2JzZXJ2ZVxuICBjaGFpbi5zZXRTaWxlbnQgPSBjdXJyeSgyLCAoa2V5LCBwcm9wKSA9PiB7XG4gICAgY2hhaW4uc3RvcmUuc2V0KGtleSwgcHJvcClcbiAgICByZXR1cm4gY2hhaW5cbiAgfSlcblxuICAvLyBwYXJ0aWFsLCBgdmlld2BcbiAgY2hhaW4udmlldyA9IHByb3AgPT4gKCkgPT4gY2hhaW4uZ2V0KHByb3ApXG4gIGNoYWluLmxlbnNlID0gcHJvcCA9PiB7XG4gICAgLy8gQFRPRE8gYWxsb3cgdXNpbmcgZXZlcnkgc2luZ2xlIGBpc2AgYXMgcHJvcGVydHkgb2YgdGhlIGBpc2AgcmV0dXJuZWRcbiAgICAvL1xuICAgIC8vIFt4XSBhbHNvIHJldHVybiBhIGRlc3RydWN0dXJhYmxlIG9iaiB3aXRoIGNhbWVsIGxpa2VcbiAgICAvLyBbcHJvcF0gKyAnLVZpZXcnXG4gICAgY29uc3Qgb2JqID0ge1xuICAgICAgZXNjYXBlRG90OiAoKSA9PiB7XG4gICAgICAgIHByb3AgPSBlc2NhcGVEb3QocHJvcClcbiAgICAgICAgcmV0dXJuIGNoYWluXG4gICAgICB9LFxuICAgICAgaGFzOiAoKSA9PiBjaGFpbi5oYXMocHJvcCksXG4gICAgICBnZXQ6ICgpID0+IGNoYWluLmdldChwcm9wKSxcbiAgICAgIHZpZXc6IGNoYWluLnZpZXcocHJvcCksXG4gICAgICBlcTogY2hhaW4ucHJvcEVxKHByb3ApLFxuICAgICAgaXM6IGNoYWluLnByb3BJcyhwcm9wKSxcbiAgICAgIG5vdDogY2hhaW4ucHJvcElzTm90KHByb3ApLFxuICAgICAgZnJlZXplOiAoKSA9PiBjaGFpbi5mcmVlemVQcm9wKHByb3ApLFxuICAgICAgLy8gdXBkYXRlLCBhZGp1c3RcbiAgICAgIC8vIHNldDogY2hhaW4uc2V0KHByb3ApLFxuICAgICAgc2V0OiB2YWwgPT4gY2hhaW4uc2V0KHByb3AsIHZhbCksXG4gICAgICBzZXRTaWxlbnQ6IHZhbCA9PiBjaGFpbi5zZXRTaWxlbnQocHJvcCwgdmFsKSxcbiAgICAgIHRyYW5zZm9ybTogY2hhaW4udHJhbnNmb3JtKHByb3ApLFxuICAgICAgb2JzZXJ2ZTogY2hhaW4ub2JzZXJ2ZShwcm9wKSxcbiAgICAgIHRyYW5zZm9ybXM6IGNoYWluLnRyYW5zZm9ybXMocHJvcCksXG4gICAgfVxuXG4gICAgLy8gY2xvbmU6IHRydWVcbiAgICAvLyBvYmoubWFwS2V5cygpXG4gICAgT2JqZWN0S2V5cyhvYmopLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIGNvbnN0IGRlc3RydWN0dXJhYmxlS2V5ID0gY2FtZWxDYXNlKGtleSArICctJyArIHByb3ApXG4gICAgICBjb25zdCBkZXN0cnVjdHVyYWJsZVJldmVyc2UgPSBjYW1lbENhc2UocHJvcCArICctJyArIGtleSlcbiAgICAgIG9ialtkZXN0cnVjdHVyYWJsZUtleV0gPSBvYmpba2V5XVxuICAgICAgb2JqW2Rlc3RydWN0dXJhYmxlUmV2ZXJzZV0gPSBvYmpba2V5XVxuICAgIH0pXG5cbiAgICByZXR1cm4gb2JqXG4gIH1cblxuICBjaGFpbi51bm9ic2VydmUgPSBvYnNlcnZlciA9PlxuICAgIGNoYWluLm1ldGEoJ29ic2VydmUnKS5kZWxldGUob2JzZXJ2ZXIpXG4gIGNoYWluLnVudHJhbnNmb3JtID0gdHJhbnNmb3JtZXIgPT5cbiAgICBjaGFpbi5tZXRhKCd0cmFuc2Zvcm0nKS5kZWxldGUodHJhbnNmb3JtZXIpXG4gIHJldHVybiBjaGFpblxufVxuIl0sIm5hbWVzIjpbImNvbnN0Il0sIm1hcHBpbmdzIjoiQUFBQTs7QUFFQUEsR0FBSyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMscUJBQXFCLENBQUM7QUFDOUNBLEdBQUssQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDLGtCQUFrQixDQUFDO0FBQzNDQSxHQUFLLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQztBQUMxQ0EsR0FBSyxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUMsbUJBQW1CLENBQUM7QUFDN0NBLEdBQUssQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDLG9CQUFvQixDQUFDO0FBQ2hEQSxHQUFLLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQztBQUM1Q0EsR0FBSyxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsaUJBQWlCLENBQUM7QUFDeENBLEdBQUssQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixDQUFDO0FBQ3RDQSxHQUFLLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxlQUFlLENBQUM7QUFDdENBLEdBQUssQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDLHlCQUF5QixDQUFDO0FBQ3BEQSxHQUFLLENBQUMsRUFBRSxHQUFHLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQztBQUMxQ0EsR0FBSyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsaUJBQWlCLENBQUM7QUFDMUNBLEdBQUssQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDLG1CQUFtQixDQUFDO0FBQzlDQSxHQUFLLENBQUMsR0FBRyxHQUFHLE9BQU8sQ0FBQyx3QkFBd0IsQ0FBQztBQUM3Q0EsR0FBSyxDQUFDLFVBQVUsR0FBRyxPQUFPLENBQUMsa0JBQWtCLENBQUM7OztBQUc5QyxNQUFNLENBQUMsT0FBTyxHQUFHLFNBQUEsQ0FBQyxLQUFLLEVBQUUsQUFBRzs7Ozs7Ozs7Ozs7Ozs7RUFjMUIsS0FBSyxDQUFDLFVBQVUsR0FBRyxTQUFBLEdBQUcsQUFBRzs7SUFFdkIsS0FBSyxDQUFDLE9BQU8sR0FBRyxTQUFBLEdBQUcsQUFBRzs7TUFFcEIsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUM7TUFDakIsS0FBSyxDQUFDLElBQUksR0FBRyxTQUFTO01BQ3RCLEtBQUssQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztLQUM1QjtJQUNELEtBQUssQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLFNBQVMsR0FBRyxVQUFBLE1BQU0sQ0FBQSxDQUFDLEFBQUcsU0FBQSxLQUFLLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxHQUFBO0dBQ2pFOztFQUVELEtBQUssQ0FBQyxPQUFPLEdBQUcsU0FBQSxDQUFDLFNBQVMsRUFBRSxFQUFTLEVBQUUsQUFBRyxDQUFaOzJCQUFBLEdBQUcsSUFBSTtBQUFNO0lBQ3pDQSxHQUFLLENBQUMsTUFBTSxHQUFHLEVBQUU7SUFDakIsTUFBTSxDQUFDLElBQUksR0FBRyxVQUFBLEVBQUUsQ0FBQSxDQUFDLEFBQUc7TUFDbEIsTUFBTSxDQUFDLEtBQUssR0FBRyxFQUFFO01BQ2pCLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsTUFBTSxDQUFDO0tBQ3pEO0lBQ0QsTUFBTSxDQUFDLElBQUksR0FBRyxVQUFBLEVBQUUsQ0FBQSxDQUFDLEFBQUc7TUFDbEIsTUFBTSxDQUFDLEtBQUssR0FBRyxFQUFFO01BQ2pCLE9BQU8sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxNQUFNLENBQUM7S0FDMUQ7SUFDRCxNQUFNLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNO0lBQzVCLE9BQU8sTUFBTTtHQUNkOzs7RUFHRCxLQUFLLENBQUMsTUFBTSxHQUFHLFNBQUEsQ0FBQyxTQUFTLEVBQUUsRUFBUyxFQUFFLEFBQUcsQ0FBWjsyQkFBQSxHQUFHLElBQUk7QUFBTTtJQUN4Q0EsR0FBSyxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQzs7Ozs7SUFLdkMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLFNBQUEsR0FBRyxBQUFHO01BQ2hDLElBQUksTUFBTSxDQUFDLEtBQUssRUFBRSxFQUFBLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFBO01BQzFDLElBQUksTUFBTSxDQUFDLEtBQUssRUFBRSxFQUFBLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFBO0tBQzNDLENBQUMsRUFBRSxDQUFDLENBQUM7Ozs7Ozs7SUFPTixPQUFPLE1BQU07R0FDZDs7RUFFREEsR0FBSyxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7O0VBR3hCLEtBQUssQ0FBQyxNQUFNLEdBQUcsU0FBQSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsQUFBRyxTQUFBLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssQ0FBQyxHQUFBO0VBQzFELEtBQUssQ0FBQyxNQUFNLEdBQUcsU0FBQSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsQUFBRztJQUMzQixJQUFJLFFBQVEsQ0FBQyxFQUFFLENBQUMsRUFBRTtNQUNoQixFQUFFLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQztLQUNiO0lBQ0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsRUFBRTs7S0FFcEI7SUFDRCxPQUFPLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0dBQzNCOzs7RUFHRCxLQUFLLENBQUMsVUFBVSxHQUFHLFVBQUEsSUFBSSxDQUFBLENBQUMsQUFBRztJQUN6QkEsR0FBSyxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQztJQUM5QixLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxVQUFBLElBQUksQ0FBQSxDQUFDLEFBQUcsU0FBQSxNQUFNLEdBQUEsQ0FBQztHQUN0QztFQUNELEtBQUssQ0FBQyxTQUFTLEdBQUcsU0FBQSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsQUFBRyxTQUFBLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFBO0VBQzNELEtBQUssQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDO0VBQ3JDLEtBQUssQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDO0VBQ3JDLEtBQUssQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsU0FBUyxDQUFDO0VBQzNDLEtBQUssQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztFQUN4RCxLQUFLLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7RUFDcEQsS0FBSyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUM7OztFQUdsQyxLQUFLLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQzs7RUFFakNBLEdBQUssQ0FBQyxXQUFXLEdBQUcsU0FBQSxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUUsQUFDckMsU0FBQSxVQUFVLENBQUMsT0FBTyxDQUFDLFVBQUEsU0FBUyxDQUFBLENBQUMsQUFBRyxTQUFBLEtBQUssQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxHQUFBLENBQUMsR0FBQTtFQUNuRSxLQUFLLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQyxDQUFDLEVBQUUsV0FBVyxDQUFDOzs7Ozs7OztFQVF4QyxLQUFLLENBQUMsWUFBWSxHQUFHLFNBQUEsQ0FBQyxPQUFPLEVBQUUsTUFBVyxFQUFFLEFBQUcsQ0FBVjttQ0FBQSxHQUFHLEVBQUU7QUFBTTtJQUM5Q0EsR0FBSyxDQUFDLEtBQUssR0FBRyxFQUFFO0lBQ2hCQSxHQUFLLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBQSxNQUFNLENBQUEsQ0FBQyxBQUMzQyxTQUFBLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEtBQUssQ0FBQyxHQUFBO0tBQzNDO0lBQ0QsT0FBTyxLQUFLO0dBQ2I7OztFQUdELEtBQUssQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDLENBQUMsRUFBRSxTQUFBLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxBQUFHO0lBQ3hDLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUM7SUFDMUIsT0FBTyxLQUFLO0dBQ2IsQ0FBQzs7O0VBR0YsS0FBSyxDQUFDLElBQUksR0FBRyxVQUFBLElBQUksQ0FBQSxDQUFDLEFBQUcsU0FBQSxTQUFBLEdBQUcsQUFBRyxTQUFBLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQUE7RUFDMUMsS0FBSyxDQUFDLEtBQUssR0FBRyxVQUFBLElBQUksQ0FBQSxDQUFDLEFBQUc7Ozs7O0lBS3BCQSxHQUFLLENBQUMsR0FBRyxHQUFHO01BQ1YsU0FBUyxFQUFFLFNBQUEsR0FBRyxBQUFHO1FBQ2YsSUFBSSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUM7UUFDdEIsT0FBTyxLQUFLO09BQ2I7TUFDRCxHQUFHLEVBQUUsU0FBQSxHQUFHLEFBQUcsU0FBQSxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFBO01BQzFCLEdBQUcsRUFBRSxTQUFBLEdBQUcsQUFBRyxTQUFBLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUE7TUFDMUIsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO01BQ3RCLEVBQUUsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztNQUN0QixFQUFFLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7TUFDdEIsR0FBRyxFQUFFLEtBQUssQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDO01BQzFCLE1BQU0sRUFBRSxTQUFBLEdBQUcsQUFBRyxTQUFBLEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUE7OztNQUdwQyxHQUFHLEVBQUUsVUFBQSxHQUFHLENBQUEsQ0FBQyxBQUFHLFNBQUEsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUE7TUFDaEMsU0FBUyxFQUFFLFVBQUEsR0FBRyxDQUFBLENBQUMsQUFBRyxTQUFBLEtBQUssQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFBO01BQzVDLFNBQVMsRUFBRSxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQztNQUNoQyxPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7TUFDNUIsVUFBVSxFQUFFLEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDO0tBQ25DOzs7O0lBSUQsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFBLEdBQUcsQ0FBQSxDQUFDLEFBQUc7TUFDN0JBLEdBQUssQ0FBQyxpQkFBaUIsR0FBRyxTQUFTLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUM7TUFDckRBLEdBQUssQ0FBQyxxQkFBcUIsR0FBRyxTQUFTLENBQUMsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7TUFDekQsR0FBRyxDQUFDLGlCQUFpQixDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQztNQUNqQyxHQUFHLENBQUMscUJBQXFCLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDO0tBQ3RDLENBQUM7O0lBRUYsT0FBTyxHQUFHO0dBQ1g7O0VBRUQsS0FBSyxDQUFDLFNBQVMsR0FBRyxVQUFBLFFBQVEsQ0FBQSxDQUFDLEFBQ3pCLFNBQUEsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUE7RUFDeEMsS0FBSyxDQUFDLFdBQVcsR0FBRyxVQUFBLFdBQVcsQ0FBQSxDQUFDLEFBQzlCLFNBQUEsS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLEdBQUE7RUFDN0MsT0FBTyxLQUFLO0NBQ2I7In0=