UNPKG

@c11/engine.db

Version:

The engine db

265 lines 20.6 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); var isEqual_1 = __importDefault(require("lodash/isEqual")); var flatten_1 = __importDefault(require("lodash/flatten")); var isNumber_1 = __importDefault(require("lodash/isNumber")); var isArray_1 = __importDefault(require("lodash/isArray")); var isPlainObject_1 = __importDefault(require("lodash/isPlainObject")); var merge_1 = __importDefault(require("lodash/merge")); var splitPath_1 = __importDefault(require("./splitPath")); var clone_1 = __importDefault(require("../fn/clone")); var triggerListener_1 = require("./triggerListener"); var pathTriggers_1 = __importDefault(require("./pathTriggers")); var engine_types_1 = require("@c11/engine.types"); var isWildcardPath_1 = require("./isWildcardPath"); var triggerWildcardFn_1 = require("./triggerWildcardFn"); function clearDynamic(cachePaths, cacheDynamic, decomposed, staticDeps, path) { var staticDepList = staticDeps[path]; if (staticDepList) { var cacheDynamicList = void 0; var decomposedList = void 0; var k = void 0; var p = void 0; var dep = void 0; k = staticDepList.length; while (k--) { dep = staticDepList[k]; cacheDynamicList = cacheDynamic[dep]; if (cacheDynamicList) { p = cacheDynamicList.length; while (p--) { delete cachePaths[cacheDynamicList[p]]; } } decomposedList = decomposed[dep]; p = decomposedList.length; while (p--) { delete cachePaths[decomposedList[p]]; } } } } function clearCacheRecursive(cachePaths, cacheDynamic, decomposed, staticDeps, path, obj) { var k = Object.keys(cachePaths); var i = k.length; var len = path.length; var prop; var str; while (i--) { prop = k[i]; str = prop.slice(0, len); if (str === path) { delete cachePaths[prop]; clearDynamic(cachePaths, cacheDynamic, decomposed, staticDeps, prop); } } } function applyPatch(db, patch, shouldClone) { var i, x, parts, len, j, lenj, obj, part, last, to, found, temp, from, lastFrom; var revert; var changed = { full: [], partial: [], }; var isTest; var fullPath; var cachePaths = db.cache.paths; var decomposed = db.dynamic.decomposed; var cacheDynamic = db.cache.dynamic; var staticDeps = db.dynamic.staticDeps; root: for (i = 0, len = patch.length; i < len; i += 1) { var path = ""; var xPath = void 0; var xValue = void 0; var objIsArray = false; var fromIsArray = false; x = patch[i]; xPath = x.path; xValue = x.value; // @TODO: Add test/move/copy cases for deleting cache delete cachePaths[xPath]; clearCacheRecursive(cachePaths, cacheDynamic, decomposed, staticDeps, xPath, xValue); clearDynamic(cachePaths, cacheDynamic, decomposed, staticDeps, xPath); // @TODO: Implement both path && from in a function parts = (0, splitPath_1.default)(xPath); obj = db.static; var prevState = void 0; var prevPart = void 0; for (j = 0, lenj = parts.length - 1; j < lenj; j += 1) { part = parts[j]; path += "/" + part; var initialState = obj; if (!obj[part] && x.op === "add") { if (!(0, isPlainObject_1.default)(obj)) { prevState[prevPart] = {}; obj = prevState[prevPart]; } obj[part] = {}; obj = obj[part]; } else { obj = obj[part]; if (!obj && x.op === "remove") { continue root; } else if (!obj) { revert = i; break root; } } prevState = initialState; prevPart = part; delete cachePaths[path]; clearDynamic(cachePaths, cacheDynamic, decomposed, staticDeps, path); } last = parts[parts.length - 1]; if (x.op === "move" || x.op === "copy") { parts = (0, splitPath_1.default)(x.from); from = db.static; for (j = 0, lenj = parts.length - 1; j < lenj; j += 1) { if (from[parts[j]]) { from = from[parts[j]]; } else { revert = i; break; } } lastFrom = parts[parts.length - 1]; } if ((0, isArray_1.default)(obj)) { objIsArray = true; if (last === "-") { last = obj.length; } else if (!(0, isNumber_1.default)(last)) { // Must be a number, else what's the point in // trying to cast it to one? var initial = last; last = parseInt(last, 10); if (isNaN(last) || initial.toString() !== last.toString()) { revert = i; break root; } } if (last > obj.length || last < 0) { revert = i; break root; } } if ((0, isArray_1.default)(from)) { fromIsArray = true; if (lastFrom === "-") { lastFrom = from.length - 1; } else if (!(0, isNumber_1.default)(lastFrom)) { // Must be a number, else what's the point in // trying to cast it to one? var initial = lastFrom; lastFrom = parseInt(lastFrom, 10); if (isNaN(lastFrom) || initial.toString() !== lastFrom.toString()) { revert = i; break root; } } if (lastFrom > from.length || lastFrom < 0) { revert = i; break root; } } switch (x.op) { case "add": case "replace": if (objIsArray) { obj.splice(last, 0, shouldClone ? (0, clone_1.default)(xValue) : xValue); } else if ((0, isPlainObject_1.default)(obj)) { obj[last] = shouldClone ? (0, clone_1.default)(xValue) : xValue; } else { prevState[prevPart] = {}; obj = prevState[prevPart]; obj[last] = shouldClone ? (0, clone_1.default)(xValue) : xValue; } break; case "remove": if (objIsArray) { obj.splice(last, 1); } else if (obj) { delete obj[last]; } break; case "copy": case "move": temp = from[lastFrom]; if (x.op === "move") { delete from[lastFrom]; } else if ((0, isPlainObject_1.default)(temp)) { temp = (0, clone_1.default)(temp); } obj[last] = temp; break; case "test": if (!(0, isEqual_1.default)(obj[last], xValue)) { revert = i; break root; } break; case "merge": if (!(0, isPlainObject_1.default)(obj[last])) { revert = i; break root; } if (last === "__proto__" || last === "constructor") { console.error("Possible prototype pollution during a merge operation. Found: ".concat(last, ". Merge not applied.")); } else { obj[last] = (0, merge_1.default)(obj[last], xValue); } break; } } if (revert !== undefined) { // @TODO: Revert all changes done up until revertIndex } var trigger = []; patch.forEach(function (x) { //@ts-ignore trigger = trigger.concat((0, pathTriggers_1.default)(db, x.path, x.value)); }); trigger = (0, flatten_1.default)(trigger); var fns = trigger.reduce(function (acc, x) { var fns = db.updates.fns[x]; if (fns) { Object.keys(fns).forEach(function (y) { var _a, _b; if (!acc[y] && ((_b = (_a = fns[y]) === null || _a === void 0 ? void 0 : _a.refinee) === null || _b === void 0 ? void 0 : _b.type) !== engine_types_1.AccessMethods.isObserved) { acc[y] = { path: x, fn: fns[y], }; } }); } return acc; }, {}); Object.keys(fns).forEach(function (x) { if ((0, isWildcardPath_1.isWildcardPath)(fns[x].path)) { (0, triggerWildcardFn_1.triggerWildcardFn)(db, fns[x].path, x, patch); } else { (0, triggerListener_1.triggerListenerFn)(db, fns[x].path, x, patch); } }); return { revert: revert, changed: changed, }; } exports.default = applyPatch; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwbHlQYXRjaC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9mbi9hcHBseVBhdGNoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsMkRBQXFDO0FBQ3JDLDJEQUFxQztBQUNyQyw2REFBdUM7QUFDdkMsMkRBQXFDO0FBQ3JDLHVFQUFpRDtBQUNqRCx1REFBaUM7QUFDakMsMERBQW9DO0FBRXBDLHNEQUFnQztBQUNoQyxxREFBc0Q7QUFDdEQsZ0VBQTBDO0FBQzFDLGtEQUFrRDtBQUNsRCxtREFBa0Q7QUFDbEQseURBQXdEO0FBRXhELFNBQVMsWUFBWSxDQUFDLFVBQVUsRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxJQUFJO0lBQzFFLElBQUksYUFBYSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNyQyxJQUFJLGFBQWEsRUFBRTtRQUNqQixJQUFJLGdCQUFnQixTQUFBLENBQUM7UUFDckIsSUFBSSxjQUFjLFNBQUEsQ0FBQztRQUNuQixJQUFJLENBQUMsU0FBQSxDQUFDO1FBQ04sSUFBSSxDQUFDLFNBQUEsQ0FBQztRQUNOLElBQUksR0FBRyxTQUFBLENBQUM7UUFDUixDQUFDLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FBQztRQUV6QixPQUFPLENBQUMsRUFBRSxFQUFFO1lBQ1YsR0FBRyxHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUV2QixnQkFBZ0IsR0FBRyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDckMsSUFBSSxnQkFBZ0IsRUFBRTtnQkFDcEIsQ0FBQyxHQUFHLGdCQUFnQixDQUFDLE1BQU0sQ0FBQztnQkFDNUIsT0FBTyxDQUFDLEVBQUUsRUFBRTtvQkFDVixPQUFPLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUN4QzthQUNGO1lBRUQsY0FBYyxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNqQyxDQUFDLEdBQUcsY0FBYyxDQUFDLE1BQU0sQ0FBQztZQUMxQixPQUFPLENBQUMsRUFBRSxFQUFFO2dCQUNWLE9BQU8sVUFBVSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3RDO1NBQ0Y7S0FDRjtBQUNILENBQUM7QUFFRCxTQUFTLG1CQUFtQixDQUMxQixVQUFVLEVBQ1YsWUFBWSxFQUNaLFVBQVUsRUFDVixVQUFVLEVBQ1YsSUFBSSxFQUNKLEdBQUc7SUFFSCxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ2hDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDakIsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUN0QixJQUFJLElBQUksQ0FBQztJQUNULElBQUksR0FBRyxDQUFDO0lBQ1IsT0FBTyxDQUFDLEVBQUUsRUFBRTtRQUNWLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDWixHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDekIsSUFBSSxHQUFHLEtBQUssSUFBSSxFQUFFO1lBQ2hCLE9BQU8sVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3hCLFlBQVksQ0FBQyxVQUFVLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDdEU7S0FDRjtBQUNILENBQUM7QUFFRCxTQUFTLFVBQVUsQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLFdBQVc7SUFDeEMsSUFBSSxDQUFDLEVBQ0gsQ0FBQyxFQUNELEtBQUssRUFDTCxHQUFHLEVBQ0gsQ0FBQyxFQUNELElBQUksRUFDSixHQUFHLEVBQ0gsSUFBSSxFQUNKLElBQUksRUFDSixFQUFFLEVBQ0YsS0FBSyxFQUNMLElBQUksRUFDSixJQUFJLEVBQ0osUUFBUSxDQUFDO0lBQ1gsSUFBSSxNQUFNLENBQUM7SUFDWCxJQUFJLE9BQU8sR0FBRztRQUNaLElBQUksRUFBRSxFQUFFO1FBQ1IsT0FBTyxFQUFFLEVBQUU7S0FDWixDQUFDO0lBRUYsSUFBSSxNQUFNLENBQUM7SUFDWCxJQUFJLFFBQVEsQ0FBQztJQUNiLElBQUksVUFBVSxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDO0lBQ2hDLElBQUksVUFBVSxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDO0lBQ3ZDLElBQUksWUFBWSxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDO0lBQ3BDLElBQUksVUFBVSxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDO0lBRXZDLElBQUksRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFO1FBQ3JELElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUNkLElBQUksS0FBSyxTQUFBLENBQUM7UUFDVixJQUFJLE1BQU0sU0FBQSxDQUFDO1FBQ1gsSUFBSSxVQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLElBQUksV0FBVyxHQUFHLEtBQUssQ0FBQztRQUN4QixDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2IsS0FBSyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDZixNQUFNLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUNqQixxREFBcUQ7UUFDckQsT0FBTyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDekIsbUJBQW1CLENBQ2pCLFVBQVUsRUFDVixZQUFZLEVBQ1osVUFBVSxFQUNWLFVBQVUsRUFDVixLQUFLLEVBQ0wsTUFBTSxDQUNQLENBQUM7UUFDRixZQUFZLENBQUMsVUFBVSxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRXRFLG1EQUFtRDtRQUNuRCxLQUFLLEdBQUcsSUFBQSxtQkFBUyxFQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pCLEdBQUcsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDO1FBQ2hCLElBQUksU0FBUyxTQUFBLENBQUM7UUFDZCxJQUFJLFFBQVEsU0FBQSxDQUFDO1FBQ2IsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksR0FBRyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDckQsSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNoQixJQUFJLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQztZQUNuQixJQUFJLFlBQVksR0FBRyxHQUFHLENBQUM7WUFFdkIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxLQUFLLEtBQUssRUFBRTtnQkFDaEMsSUFBSSxDQUFDLElBQUEsdUJBQWEsRUFBQyxHQUFHLENBQUMsRUFBRTtvQkFDdkIsU0FBUyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQztvQkFDekIsR0FBRyxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztpQkFDM0I7Z0JBQ0QsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDZixHQUFHLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ2pCO2lCQUFNO2dCQUNMLEdBQUcsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2hCLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEVBQUUsS0FBSyxRQUFRLEVBQUU7b0JBQzdCLFNBQVMsSUFBSSxDQUFDO2lCQUNmO3FCQUFNLElBQUksQ0FBQyxHQUFHLEVBQUU7b0JBQ2YsTUFBTSxHQUFHLENBQUMsQ0FBQztvQkFDWCxNQUFNLElBQUksQ0FBQztpQkFDWjthQUNGO1lBRUQsU0FBUyxHQUFHLFlBQVksQ0FBQztZQUN6QixRQUFRLEdBQUcsSUFBSSxDQUFDO1lBQ2hCLE9BQU8sVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3hCLFlBQVksQ0FBQyxVQUFVLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDdEU7UUFFRCxJQUFJLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFFL0IsSUFBSSxDQUFDLENBQUMsRUFBRSxLQUFLLE1BQU0sSUFBSSxDQUFDLENBQUMsRUFBRSxLQUFLLE1BQU0sRUFBRTtZQUN0QyxLQUFLLEdBQUcsSUFBQSxtQkFBUyxFQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMxQixJQUFJLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQztZQUNqQixLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxHQUFHLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDckQsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7b0JBQ2xCLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ3ZCO3FCQUFNO29CQUNMLE1BQU0sR0FBRyxDQUFDLENBQUM7b0JBQ1gsTUFBTTtpQkFDUDthQUNGO1lBRUQsUUFBUSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQ3BDO1FBRUQsSUFBSSxJQUFBLGlCQUFPLEVBQUMsR0FBRyxDQUFDLEVBQUU7WUFDaEIsVUFBVSxHQUFHLElBQUksQ0FBQztZQUNsQixJQUFJLElBQUksS0FBSyxHQUFHLEVBQUU7Z0JBQ2hCLElBQUksR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDO2FBQ25CO2lCQUFNLElBQUksQ0FBQyxJQUFBLGtCQUFRLEVBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQzFCLDZDQUE2QztnQkFDN0MsNEJBQTRCO2dCQUM1QixJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUM7Z0JBQ25CLElBQUksR0FBRyxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUUxQixJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxPQUFPLENBQUMsUUFBUSxFQUFFLEtBQUssSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFO29CQUN6RCxNQUFNLEdBQUcsQ0FBQyxDQUFDO29CQUNYLE1BQU0sSUFBSSxDQUFDO2lCQUNaO2FBQ0Y7WUFDRCxJQUFJLElBQUksR0FBRyxHQUFHLENBQUMsTUFBTSxJQUFJLElBQUksR0FBRyxDQUFDLEVBQUU7Z0JBQ2pDLE1BQU0sR0FBRyxDQUFDLENBQUM7Z0JBQ1gsTUFBTSxJQUFJLENBQUM7YUFDWjtTQUNGO1FBRUQsSUFBSSxJQUFBLGlCQUFPLEVBQUMsSUFBSSxDQUFDLEVBQUU7WUFDakIsV0FBVyxHQUFHLElBQUksQ0FBQztZQUNuQixJQUFJLFFBQVEsS0FBSyxHQUFHLEVBQUU7Z0JBQ3BCLFFBQVEsR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQzthQUM1QjtpQkFBTSxJQUFJLENBQUMsSUFBQSxrQkFBUSxFQUFDLFFBQVEsQ0FBQyxFQUFFO2dCQUM5Qiw2Q0FBNkM7Z0JBQzdDLDRCQUE0QjtnQkFDNUIsSUFBSSxPQUFPLEdBQUcsUUFBUSxDQUFDO2dCQUN2QixRQUFRLEdBQUcsUUFBUSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFFbEMsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksT0FBTyxDQUFDLFFBQVEsRUFBRSxLQUFLLFFBQVEsQ0FBQyxRQUFRLEVBQUUsRUFBRTtvQkFDakUsTUFBTSxHQUFHLENBQUMsQ0FBQztvQkFDWCxNQUFNLElBQUksQ0FBQztpQkFDWjthQUNGO1lBQ0QsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLE1BQU0sSUFBSSxRQUFRLEdBQUcsQ0FBQyxFQUFFO2dCQUMxQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO2dCQUNYLE1BQU0sSUFBSSxDQUFDO2FBQ1o7U0FDRjtRQUVELFFBQVEsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUNaLEtBQUssS0FBSyxDQUFDO1lBQ1gsS0FBSyxTQUFTO2dCQUNaLElBQUksVUFBVSxFQUFFO29CQUNkLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUEsZUFBSyxFQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztpQkFDM0Q7cUJBQU0sSUFBSSxJQUFBLHVCQUFhLEVBQUMsR0FBRyxDQUFDLEVBQUU7b0JBQzdCLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUEsZUFBSyxFQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7aUJBQ2xEO3FCQUFNO29CQUNMLFNBQVMsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUM7b0JBQ3pCLEdBQUcsR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7b0JBQzFCLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUEsZUFBSyxFQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7aUJBQ2xEO2dCQUNELE1BQU07WUFFUixLQUFLLFFBQVE7Z0JBQ1gsSUFBSSxVQUFVLEVBQUU7b0JBQ2QsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7aUJBQ3JCO3FCQUFNLElBQUksR0FBRyxFQUFFO29CQUNkLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUNsQjtnQkFDRCxNQUFNO1lBRVIsS0FBSyxNQUFNLENBQUM7WUFDWixLQUFLLE1BQU07Z0JBQ1QsSUFBSSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFFdEIsSUFBSSxDQUFDLENBQUMsRUFBRSxLQUFLLE1BQU0sRUFBRTtvQkFDbkIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7aUJBQ3ZCO3FCQUFNLElBQUksSUFBQSx1QkFBYSxFQUFDLElBQUksQ0FBQyxFQUFFO29CQUM5QixJQUFJLEdBQUcsSUFBQSxlQUFLLEVBQUMsSUFBSSxDQUFDLENBQUM7aUJBQ3BCO2dCQUVELEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUM7Z0JBRWpCLE1BQU07WUFFUixLQUFLLE1BQU07Z0JBQ1QsSUFBSSxDQUFDLElBQUEsaUJBQU8sRUFBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxDQUFDLEVBQUU7b0JBQy9CLE1BQU0sR0FBRyxDQUFDLENBQUM7b0JBQ1gsTUFBTSxJQUFJLENBQUM7aUJBQ1o7Z0JBQ0QsTUFBTTtZQUVSLEtBQUssT0FBTztnQkFDVixJQUFJLENBQUMsSUFBQSx1QkFBYSxFQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFO29CQUM3QixNQUFNLEdBQUcsQ0FBQyxDQUFDO29CQUNYLE1BQU0sSUFBSSxDQUFDO2lCQUNaO2dCQUNELElBQUksSUFBSSxLQUFLLFdBQVcsSUFBSSxJQUFJLEtBQUssYUFBYSxFQUFFO29CQUNsRCxPQUFPLENBQUMsS0FBSyxDQUNYLHdFQUFpRSxJQUFJLHlCQUFzQixDQUM1RixDQUFDO2lCQUNIO3FCQUFNO29CQUNMLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFBLGVBQUssRUFBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7aUJBQ3RDO2dCQUNELE1BQU07U0FDVDtLQUNGO0lBRUQsSUFBSSxNQUFNLEtBQUssU0FBUyxFQUFFO1FBQ3hCLHNEQUFzRDtLQUN2RDtJQUVELElBQUksT0FBTyxHQUFHLEVBQUUsQ0FBQztJQUVqQixLQUFLLENBQUMsT0FBTyxDQUFDLFVBQUMsQ0FBQztRQUNkLFlBQVk7UUFDWixPQUFPLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFBLHNCQUFZLEVBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDOUQsQ0FBQyxDQUFDLENBQUM7SUFFSCxPQUFPLEdBQUcsSUFBQSxpQkFBTyxFQUFDLE9BQU8sQ0FBQyxDQUFDO0lBRTNCLElBQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsVUFBQyxHQUFHLEVBQUUsQ0FBQztRQUNoQyxJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM1QixJQUFJLEdBQUcsRUFBRTtZQUNQLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQUMsQ0FBQzs7Z0JBQ3pCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQSxNQUFBLE1BQUEsR0FBRyxDQUFDLENBQUMsQ0FBQywwQ0FBRSxPQUFPLDBDQUFFLElBQUksTUFBSyw0QkFBYSxDQUFDLFVBQVUsRUFBRTtvQkFDakUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHO3dCQUNQLElBQUksRUFBRSxDQUFDO3dCQUNQLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO3FCQUNYLENBQUM7aUJBQ0g7WUFDSCxDQUFDLENBQUMsQ0FBQztTQUNKO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFFUCxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFDLENBQUM7UUFDekIsSUFBSSxJQUFBLCtCQUFjLEVBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQy9CLElBQUEscUNBQWlCLEVBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQzlDO2FBQU07WUFDTCxJQUFBLG1DQUFpQixFQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztTQUM5QztJQUNILENBQUMsQ0FBQyxDQUFDO0lBRUgsT0FBTztRQUNMLE1BQU0sUUFBQTtRQUNOLE9BQU8sU0FBQTtLQUNSLENBQUM7QUFDSixDQUFDO0FBRUQsa0JBQWUsVUFBVSxDQUFDIn0=