UNPKG

express-restify-mt-mongoose

Version:
255 lines (210 loc) 30.2 kB
'use strict'; var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol ? "symbol" : typeof obj; }; function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } var _ = require('lodash'); var http = require('http'); var moredots = require('moredots'); var mt_mongoose = require('mt-mongoose'); module.exports = function (model, options, excludedMap) { var buildQuery = require('./buildQuery')(options); var errorHandler = require('./errorHandler')(options); function findById(filteredContext, id) { return filteredContext.findOne().and(_defineProperty({}, options.idProperty, id)); } function isDistinctExcluded(req) { return options.filter.isExcluded(req._ermQueryOptions['distinct'], { access: req.access, excludedMap: excludedMap }); } function getItems(req, res, next) { if (isDistinctExcluded(req)) { req.erm.result = []; req.erm.statusCode = 200; return next(); } model = mt_mongoose.getModel(model); options.contextFilter(model, req, function (filteredContext) { buildQuery(filteredContext.find(), req._ermQueryOptions).then(function (items) { req.erm.result = items; req.erm.statusCode = 200; if (options.totalCountHeader) { buildQuery(filteredContext.count(), _.assign(req._ermQueryOptions, { skip: 0, limit: 0 })).then(function (count) { req.erm.totalCount = count; mt_mongoose.setTenantId(req, res, next); }, errorHandler(req, res, next)); } else { mt_mongoose.setTenantId(req, res, next); } }, errorHandler(req, res, next)); }); } function getCount(req, res, next) { model = mt_mongoose.getModel(model); options.contextFilter(model, req, function (filteredContext) { buildQuery(filteredContext.count(), req._ermQueryOptions).then(function (count) { req.erm.result = { count: count }; req.erm.statusCode = 200; mt_mongoose.setTenantId(req, res, next); }, errorHandler(req, res, next)); }); } function getShallow(req, res, next) { model = mt_mongoose.getModel(model); options.contextFilter(model, req, function (filteredContext) { buildQuery(findById(filteredContext, req.params.id), req._ermQueryOptions).then(function (item) { if (!item) { return errorHandler(req, res, next)(new Error(http.STATUS_CODES[404])); } for (var prop in item) { item[prop] = _typeof(item[prop]) === 'object' && prop !== '_id' ? true : item[prop]; } req.erm.result = item; req.erm.statusCode = 200; mt_mongoose.setTenantId(req, res, next); }, errorHandler(req, res, next)); }); } function deleteItems(req, res, next) { model = mt_mongoose.getModel(model); options.contextFilter(model, req, function (filteredContext) { buildQuery(filteredContext.remove(), req._ermQueryOptions).then(function () { req.erm.statusCode = 204; mt_mongoose.setTenantId(req, res, next); }, errorHandler(req, res, next)); }); } function getItem(req, res, next) { model = mt_mongoose.getModel(model); if (isDistinctExcluded(req)) { req.erm.result = []; req.erm.statusCode = 200; return mt_mongoose.setTenantId(req, res, next); } options.contextFilter(model, req, function (filteredContext) { buildQuery(findById(filteredContext, req.params.id), req._ermQueryOptions).then(function (item) { if (!item) { return errorHandler(req, res, next)(new Error(http.STATUS_CODES[404])); } req.erm.result = item; req.erm.statusCode = 200; mt_mongoose.setTenantId(req, res, next); }, errorHandler(req, res, next)); }); } function deleteItem(req, res, next) { model = mt_mongoose.getModel(model); if (options.findOneAndRemove) { options.contextFilter(model, req, function (filteredContext) { findById(filteredContext, req.params.id).findOneAndRemove().then(function (item) { if (!item) { return errorHandler(req, res, next)(new Error(http.STATUS_CODES[404])); } req.erm.statusCode = 204; mt_mongoose.setTenantId(req, res, next); }, errorHandler(req, res, next)); }); } else { req.erm.document.remove().then(function () { req.erm.statusCode = 204; mt_mongoose.setTenantId(req, res, next); }, errorHandler(req, res, next)); } } function createObject(req, res, next) { model = mt_mongoose.getModel(model); req.body = options.filter.filterObject(req.body || {}, { access: req.access, populate: req._ermQueryOptions.populate }); if (model.schema.options._id) { delete req.body._id; } if (model.schema.options.versionKey) { delete req.body[model.schema.options.versionKey]; } model.create(req.body).then(function (item) { return model.populate(item, req._ermQueryOptions.populate || []); }).then(function (item) { req.erm.result = item; req.erm.statusCode = 201; mt_mongoose.setTenantId(req, res, next); }, errorHandler(req, res, next)); } function modifyObject(req, res, next) { model = mt_mongoose.getModel(model); req.body = options.filter.filterObject(req.body || {}, { access: req.access, populate: req._ermQueryOptions.populate }); delete req.body._id; if (model.schema.options.versionKey) { delete req.body[model.schema.options.versionKey]; } function depopulate(src) { var dst = {}; for (var key in src) { var path = model.schema.path(key); if (path && path.caster && path.caster.instance === 'ObjectID') { if (_.isArray(src[key])) { for (var j = 0; j < src[key].length; ++j) { if (_typeof(src[key][j]) === 'object') { dst[key] = dst[key] || {}; dst[key][j] = src[key][j]._id; } } } else if (_.isPlainObject(src[key])) { dst[key] = src[key]._id; } } else if (_.isPlainObject(src[key])) { if (path && path.instance === 'ObjectID') { dst[key] = src[key]._id; } else { dst[key] = depopulate(src[key]); } } if (_.isUndefined(dst[key])) { dst[key] = src[key]; } } return dst; } var cleanBody = moredots(depopulate(req.body)); if (options.findOneAndUpdate) { options.contextFilter(model, req, function (filteredContext) { findById(filteredContext, req.params.id).findOneAndUpdate({}, { $set: cleanBody }, { new: true, runValidators: options.runValidators }).exec().then(function (item) { return model.populate(item, req._ermQueryOptions.populate || []); }).then(function (item) { if (!item) { return errorHandler(req, res, next)(new Error(http.STATUS_CODES[404])); } req.erm.result = item; req.erm.statusCode = 200; mt_mongoose.setTenantId(req, res, next); }, errorHandler(req, res, next)); }); } else { for (var key in cleanBody) { req.erm.document.set(key, cleanBody[key]); } req.erm.document.save().then(function (item) { return model.populate(item, req._ermQueryOptions.populate || []); }).then(function (item) { req.erm.result = item; req.erm.statusCode = 200; mt_mongoose.setTenantId(req, res, next); }, errorHandler(req, res, next)); } } return { getItems: getItems, getCount: getCount, getItem: getItem, getShallow: getShallow, createObject: createObject, modifyObject: modifyObject, deleteItems: deleteItems, deleteItem: deleteItem }; }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9vcGVyYXRpb25zLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLElBQU0sSUFBSSxRQUFRLFFBQVIsQ0FBVjtBQUNBLElBQU0sT0FBTyxRQUFRLE1BQVIsQ0FBYjtBQUNBLElBQU0sV0FBVyxRQUFRLFVBQVIsQ0FBakI7QUFDQSxJQUFJLGNBQWMsUUFBUSxhQUFSLENBQWxCOztBQUVBLE9BQU8sT0FBUCxHQUFpQixVQUFVLEtBQVYsRUFBaUIsT0FBakIsRUFBMEIsV0FBMUIsRUFBdUM7QUFDdEQsTUFBTSxhQUFhLFFBQVEsY0FBUixFQUF3QixPQUF4QixDQUFuQjtBQUNBLE1BQU0sZUFBZSxRQUFRLGdCQUFSLEVBQTBCLE9BQTFCLENBQXJCOztBQUVBLFdBQVMsUUFBVCxDQUFtQixlQUFuQixFQUFvQyxFQUFwQyxFQUF3QztBQUN0QyxXQUFPLGdCQUFnQixPQUFoQixHQUEwQixHQUExQixxQkFDSixRQUFRLFVBREosRUFDaUIsRUFEakIsRUFBUDtBQUdEOztBQUVELFdBQVMsa0JBQVQsQ0FBNkIsR0FBN0IsRUFBa0M7QUFDaEMsV0FBTyxRQUFRLE1BQVIsQ0FBZSxVQUFmLENBQTBCLElBQUksZ0JBQUosQ0FBcUIsVUFBckIsQ0FBMUIsRUFBNEQ7QUFDakUsY0FBUSxJQUFJLE1BRHFEO0FBRWpFLG1CQUFhO0FBRm9ELEtBQTVELENBQVA7QUFJRDs7QUFFRCxXQUFTLFFBQVQsQ0FBbUIsR0FBbkIsRUFBd0IsR0FBeEIsRUFBNkIsSUFBN0IsRUFBbUM7QUFDakMsUUFBSSxtQkFBbUIsR0FBbkIsQ0FBSixFQUE2QjtBQUMzQixVQUFJLEdBQUosQ0FBUSxNQUFSLEdBQWlCLEVBQWpCO0FBQ0EsVUFBSSxHQUFKLENBQVEsVUFBUixHQUFxQixHQUFyQjtBQUNBLGFBQU8sTUFBUDtBQUNEO0FBQ0QsWUFBUSxZQUFZLFFBQVosQ0FBcUIsS0FBckIsQ0FBUjs7QUFFQSxZQUFRLGFBQVIsQ0FBc0IsS0FBdEIsRUFBNkIsR0FBN0IsRUFBa0MsVUFBQyxlQUFELEVBQXFCO0FBQ3JELGlCQUFXLGdCQUFnQixJQUFoQixFQUFYLEVBQW1DLElBQUksZ0JBQXZDLEVBQXlELElBQXpELENBQThELFVBQUMsS0FBRCxFQUFXO0FBQ3ZFLFlBQUksR0FBSixDQUFRLE1BQVIsR0FBaUIsS0FBakI7QUFDQSxZQUFJLEdBQUosQ0FBUSxVQUFSLEdBQXFCLEdBQXJCOztBQUVBLFlBQUksUUFBUSxnQkFBWixFQUE4QjtBQUM1QixxQkFBVyxnQkFBZ0IsS0FBaEIsRUFBWCxFQUFvQyxFQUFFLE1BQUYsQ0FBUyxJQUFJLGdCQUFiLEVBQStCO0FBQ2pFLGtCQUFNLENBRDJEO0FBRWpFLG1CQUFPO0FBRjBELFdBQS9CLENBQXBDLEVBR0ksSUFISixDQUdTLFVBQUMsS0FBRCxFQUFXO0FBQ2xCLGdCQUFJLEdBQUosQ0FBUSxVQUFSLEdBQXFCLEtBQXJCO0FBQ0Esd0JBQVksV0FBWixDQUF3QixHQUF4QixFQUE2QixHQUE3QixFQUFrQyxJQUFsQztBQUNELFdBTkQsRUFNRyxhQUFhLEdBQWIsRUFBa0IsR0FBbEIsRUFBdUIsSUFBdkIsQ0FOSDtBQU9ELFNBUkQsTUFRTztBQUNMLHNCQUFZLFdBQVosQ0FBd0IsR0FBeEIsRUFBNkIsR0FBN0IsRUFBa0MsSUFBbEM7QUFDRDtBQUNGLE9BZkQsRUFlRyxhQUFhLEdBQWIsRUFBa0IsR0FBbEIsRUFBdUIsSUFBdkIsQ0FmSDtBQWdCRCxLQWpCRDtBQWtCRDs7QUFFRCxXQUFTLFFBQVQsQ0FBbUIsR0FBbkIsRUFBd0IsR0FBeEIsRUFBNkIsSUFBN0IsRUFBbUM7QUFDakMsWUFBUSxZQUFZLFFBQVosQ0FBcUIsS0FBckIsQ0FBUjtBQUNBLFlBQVEsYUFBUixDQUFzQixLQUF0QixFQUE2QixHQUE3QixFQUFrQyxVQUFDLGVBQUQsRUFBcUI7QUFDckQsaUJBQVcsZ0JBQWdCLEtBQWhCLEVBQVgsRUFBb0MsSUFBSSxnQkFBeEMsRUFBMEQsSUFBMUQsQ0FBK0QsVUFBQyxLQUFELEVBQVc7QUFDeEUsWUFBSSxHQUFKLENBQVEsTUFBUixHQUFpQixFQUFFLE9BQU8sS0FBVCxFQUFqQjtBQUNBLFlBQUksR0FBSixDQUFRLFVBQVIsR0FBcUIsR0FBckI7O0FBRUEsb0JBQVksV0FBWixDQUF3QixHQUF4QixFQUE2QixHQUE3QixFQUFrQyxJQUFsQztBQUNELE9BTEQsRUFLRyxhQUFhLEdBQWIsRUFBa0IsR0FBbEIsRUFBdUIsSUFBdkIsQ0FMSDtBQU1ELEtBUEQ7QUFRRDs7QUFFRCxXQUFTLFVBQVQsQ0FBcUIsR0FBckIsRUFBMEIsR0FBMUIsRUFBK0IsSUFBL0IsRUFBcUM7QUFDbkMsWUFBUSxZQUFZLFFBQVosQ0FBcUIsS0FBckIsQ0FBUjtBQUNBLFlBQVEsYUFBUixDQUFzQixLQUF0QixFQUE2QixHQUE3QixFQUFrQyxVQUFDLGVBQUQsRUFBcUI7QUFDckQsaUJBQVcsU0FBUyxlQUFULEVBQTBCLElBQUksTUFBSixDQUFXLEVBQXJDLENBQVgsRUFBcUQsSUFBSSxnQkFBekQsRUFBMkUsSUFBM0UsQ0FBZ0YsVUFBQyxJQUFELEVBQVU7QUFDeEYsWUFBSSxDQUFDLElBQUwsRUFBVztBQUNULGlCQUFPLGFBQWEsR0FBYixFQUFrQixHQUFsQixFQUF1QixJQUF2QixFQUE2QixJQUFJLEtBQUosQ0FBVSxLQUFLLFlBQUwsQ0FBa0IsR0FBbEIsQ0FBVixDQUE3QixDQUFQO0FBQ0Q7O0FBRUQsYUFBSyxJQUFJLElBQVQsSUFBaUIsSUFBakIsRUFBdUI7QUFDckIsZUFBSyxJQUFMLElBQWEsUUFBTyxLQUFLLElBQUwsQ0FBUCxNQUFzQixRQUF0QixJQUFrQyxTQUFTLEtBQTNDLEdBQW1ELElBQW5ELEdBQTBELEtBQUssSUFBTCxDQUF2RTtBQUNEOztBQUVELFlBQUksR0FBSixDQUFRLE1BQVIsR0FBaUIsSUFBakI7QUFDQSxZQUFJLEdBQUosQ0FBUSxVQUFSLEdBQXFCLEdBQXJCOztBQUVBLG9CQUFZLFdBQVosQ0FBd0IsR0FBeEIsRUFBNkIsR0FBN0IsRUFBa0MsSUFBbEM7QUFDRCxPQWJELEVBYUcsYUFBYSxHQUFiLEVBQWtCLEdBQWxCLEVBQXVCLElBQXZCLENBYkg7QUFjRCxLQWZEO0FBZ0JEOztBQUVELFdBQVMsV0FBVCxDQUFzQixHQUF0QixFQUEyQixHQUEzQixFQUFnQyxJQUFoQyxFQUFzQztBQUNwQyxZQUFRLFlBQVksUUFBWixDQUFxQixLQUFyQixDQUFSO0FBQ0EsWUFBUSxhQUFSLENBQXNCLEtBQXRCLEVBQTZCLEdBQTdCLEVBQWtDLFVBQUMsZUFBRCxFQUFxQjtBQUNyRCxpQkFBVyxnQkFBZ0IsTUFBaEIsRUFBWCxFQUFxQyxJQUFJLGdCQUF6QyxFQUEyRCxJQUEzRCxDQUFnRSxZQUFNO0FBQ3BFLFlBQUksR0FBSixDQUFRLFVBQVIsR0FBcUIsR0FBckI7O0FBRUEsb0JBQVksV0FBWixDQUF3QixHQUF4QixFQUE2QixHQUE3QixFQUFrQyxJQUFsQztBQUNELE9BSkQsRUFJRyxhQUFhLEdBQWIsRUFBa0IsR0FBbEIsRUFBdUIsSUFBdkIsQ0FKSDtBQUtELEtBTkQ7QUFPRDs7QUFFRCxXQUFTLE9BQVQsQ0FBa0IsR0FBbEIsRUFBdUIsR0FBdkIsRUFBNEIsSUFBNUIsRUFBa0M7QUFDaEMsWUFBUSxZQUFZLFFBQVosQ0FBcUIsS0FBckIsQ0FBUjtBQUNBLFFBQUksbUJBQW1CLEdBQW5CLENBQUosRUFBNkI7QUFDM0IsVUFBSSxHQUFKLENBQVEsTUFBUixHQUFpQixFQUFqQjtBQUNBLFVBQUksR0FBSixDQUFRLFVBQVIsR0FBcUIsR0FBckI7QUFDQSxhQUFPLFlBQVksV0FBWixDQUF3QixHQUF4QixFQUE2QixHQUE3QixFQUFrQyxJQUFsQyxDQUFQO0FBQ0Q7O0FBRUQsWUFBUSxhQUFSLENBQXNCLEtBQXRCLEVBQTZCLEdBQTdCLEVBQWtDLFVBQUMsZUFBRCxFQUFxQjtBQUNyRCxpQkFBVyxTQUFTLGVBQVQsRUFBMEIsSUFBSSxNQUFKLENBQVcsRUFBckMsQ0FBWCxFQUFxRCxJQUFJLGdCQUF6RCxFQUEyRSxJQUEzRSxDQUFnRixVQUFDLElBQUQsRUFBVTtBQUN4RixZQUFJLENBQUMsSUFBTCxFQUFXO0FBQ1QsaUJBQU8sYUFBYSxHQUFiLEVBQWtCLEdBQWxCLEVBQXVCLElBQXZCLEVBQTZCLElBQUksS0FBSixDQUFVLEtBQUssWUFBTCxDQUFrQixHQUFsQixDQUFWLENBQTdCLENBQVA7QUFDRDs7QUFFRCxZQUFJLEdBQUosQ0FBUSxNQUFSLEdBQWlCLElBQWpCO0FBQ0EsWUFBSSxHQUFKLENBQVEsVUFBUixHQUFxQixHQUFyQjs7QUFFQSxvQkFBWSxXQUFaLENBQXdCLEdBQXhCLEVBQTZCLEdBQTdCLEVBQWtDLElBQWxDO0FBQ0QsT0FURCxFQVNHLGFBQWEsR0FBYixFQUFrQixHQUFsQixFQUF1QixJQUF2QixDQVRIO0FBVUQsS0FYRDtBQVlEOztBQUVELFdBQVMsVUFBVCxDQUFxQixHQUFyQixFQUEwQixHQUExQixFQUErQixJQUEvQixFQUFxQztBQUNuQyxZQUFRLFlBQVksUUFBWixDQUFxQixLQUFyQixDQUFSO0FBQ0EsUUFBSSxRQUFRLGdCQUFaLEVBQThCO0FBQzVCLGNBQVEsYUFBUixDQUFzQixLQUF0QixFQUE2QixHQUE3QixFQUFrQyxVQUFDLGVBQUQsRUFBcUI7QUFDckQsaUJBQVMsZUFBVCxFQUEwQixJQUFJLE1BQUosQ0FBVyxFQUFyQyxFQUF5QyxnQkFBekMsR0FBNEQsSUFBNUQsQ0FBaUUsVUFBQyxJQUFELEVBQVU7QUFDekUsY0FBSSxDQUFDLElBQUwsRUFBVztBQUNULG1CQUFPLGFBQWEsR0FBYixFQUFrQixHQUFsQixFQUF1QixJQUF2QixFQUE2QixJQUFJLEtBQUosQ0FBVSxLQUFLLFlBQUwsQ0FBa0IsR0FBbEIsQ0FBVixDQUE3QixDQUFQO0FBQ0Q7O0FBRUQsY0FBSSxHQUFKLENBQVEsVUFBUixHQUFxQixHQUFyQjs7QUFFQSxzQkFBWSxXQUFaLENBQXdCLEdBQXhCLEVBQTZCLEdBQTdCLEVBQWtDLElBQWxDO0FBQ0QsU0FSRCxFQVFHLGFBQWEsR0FBYixFQUFrQixHQUFsQixFQUF1QixJQUF2QixDQVJIO0FBU0QsT0FWRDtBQVdELEtBWkQsTUFZTztBQUNMLFVBQUksR0FBSixDQUFRLFFBQVIsQ0FBaUIsTUFBakIsR0FBMEIsSUFBMUIsQ0FBK0IsWUFBTTtBQUNuQyxZQUFJLEdBQUosQ0FBUSxVQUFSLEdBQXFCLEdBQXJCOztBQUVBLG9CQUFZLFdBQVosQ0FBd0IsR0FBeEIsRUFBNkIsR0FBN0IsRUFBa0MsSUFBbEM7QUFDRCxPQUpELEVBSUcsYUFBYSxHQUFiLEVBQWtCLEdBQWxCLEVBQXVCLElBQXZCLENBSkg7QUFLRDtBQUNGOztBQUVELFdBQVMsWUFBVCxDQUF1QixHQUF2QixFQUE0QixHQUE1QixFQUFpQyxJQUFqQyxFQUF1QztBQUNyQyxZQUFRLFlBQVksUUFBWixDQUFxQixLQUFyQixDQUFSO0FBQ0EsUUFBSSxJQUFKLEdBQVcsUUFBUSxNQUFSLENBQWUsWUFBZixDQUE0QixJQUFJLElBQUosSUFBWSxFQUF4QyxFQUE0QztBQUNyRCxjQUFRLElBQUksTUFEeUM7QUFFckQsZ0JBQVUsSUFBSSxnQkFBSixDQUFxQjtBQUZzQixLQUE1QyxDQUFYOztBQUtBLFFBQUksTUFBTSxNQUFOLENBQWEsT0FBYixDQUFxQixHQUF6QixFQUE4QjtBQUM1QixhQUFPLElBQUksSUFBSixDQUFTLEdBQWhCO0FBQ0Q7O0FBRUQsUUFBSSxNQUFNLE1BQU4sQ0FBYSxPQUFiLENBQXFCLFVBQXpCLEVBQXFDO0FBQ25DLGFBQU8sSUFBSSxJQUFKLENBQVMsTUFBTSxNQUFOLENBQWEsT0FBYixDQUFxQixVQUE5QixDQUFQO0FBQ0Q7O0FBRUQsVUFBTSxNQUFOLENBQWEsSUFBSSxJQUFqQixFQUF1QixJQUF2QixDQUE0QixVQUFDLElBQUQ7QUFBQSxhQUFVLE1BQU0sUUFBTixDQUFlLElBQWYsRUFBcUIsSUFBSSxnQkFBSixDQUFxQixRQUFyQixJQUFpQyxFQUF0RCxDQUFWO0FBQUEsS0FBNUIsRUFBaUcsSUFBakcsQ0FBc0csVUFBQyxJQUFELEVBQVU7QUFDOUcsVUFBSSxHQUFKLENBQVEsTUFBUixHQUFpQixJQUFqQjtBQUNBLFVBQUksR0FBSixDQUFRLFVBQVIsR0FBcUIsR0FBckI7O0FBRUEsa0JBQVksV0FBWixDQUF3QixHQUF4QixFQUE2QixHQUE3QixFQUFrQyxJQUFsQztBQUNELEtBTEQsRUFLRyxhQUFhLEdBQWIsRUFBa0IsR0FBbEIsRUFBdUIsSUFBdkIsQ0FMSDtBQU1EOztBQUVELFdBQVMsWUFBVCxDQUF1QixHQUF2QixFQUE0QixHQUE1QixFQUFpQyxJQUFqQyxFQUF1QztBQUNyQyxZQUFRLFlBQVksUUFBWixDQUFxQixLQUFyQixDQUFSO0FBQ0EsUUFBSSxJQUFKLEdBQVcsUUFBUSxNQUFSLENBQWUsWUFBZixDQUE0QixJQUFJLElBQUosSUFBWSxFQUF4QyxFQUE0QztBQUNyRCxjQUFRLElBQUksTUFEeUM7QUFFckQsZ0JBQVUsSUFBSSxnQkFBSixDQUFxQjtBQUZzQixLQUE1QyxDQUFYOztBQUtBLFdBQU8sSUFBSSxJQUFKLENBQVMsR0FBaEI7O0FBRUEsUUFBSSxNQUFNLE1BQU4sQ0FBYSxPQUFiLENBQXFCLFVBQXpCLEVBQXFDO0FBQ25DLGFBQU8sSUFBSSxJQUFKLENBQVMsTUFBTSxNQUFOLENBQWEsT0FBYixDQUFxQixVQUE5QixDQUFQO0FBQ0Q7O0FBRUQsYUFBUyxVQUFULENBQXFCLEdBQXJCLEVBQTBCO0FBQ3hCLFVBQUksTUFBTSxFQUFWOztBQUVBLFdBQUssSUFBSSxHQUFULElBQWdCLEdBQWhCLEVBQXFCO0FBQ25CLFlBQU0sT0FBTyxNQUFNLE1BQU4sQ0FBYSxJQUFiLENBQWtCLEdBQWxCLENBQWI7O0FBRUEsWUFBSSxRQUFRLEtBQUssTUFBYixJQUF1QixLQUFLLE1BQUwsQ0FBWSxRQUFaLEtBQXlCLFVBQXBELEVBQWdFO0FBQzlELGNBQUksRUFBRSxPQUFGLENBQVUsSUFBSSxHQUFKLENBQVYsQ0FBSixFQUF5QjtBQUN2QixpQkFBSyxJQUFJLElBQUksQ0FBYixFQUFnQixJQUFJLElBQUksR0FBSixFQUFTLE1BQTdCLEVBQXFDLEVBQUUsQ0FBdkMsRUFBMEM7QUFDeEMsa0JBQUksUUFBTyxJQUFJLEdBQUosRUFBUyxDQUFULENBQVAsTUFBdUIsUUFBM0IsRUFBcUM7QUFDbkMsb0JBQUksR0FBSixJQUFXLElBQUksR0FBSixLQUFZLEVBQXZCO0FBQ0Esb0JBQUksR0FBSixFQUFTLENBQVQsSUFBYyxJQUFJLEdBQUosRUFBUyxDQUFULEVBQVksR0FBMUI7QUFDRDtBQUNGO0FBQ0YsV0FQRCxNQU9PLElBQUksRUFBRSxhQUFGLENBQWdCLElBQUksR0FBSixDQUFoQixDQUFKLEVBQStCO0FBQ3BDLGdCQUFJLEdBQUosSUFBVyxJQUFJLEdBQUosRUFBUyxHQUFwQjtBQUNEO0FBQ0YsU0FYRCxNQVdPLElBQUksRUFBRSxhQUFGLENBQWdCLElBQUksR0FBSixDQUFoQixDQUFKLEVBQStCO0FBQ3BDLGNBQUksUUFBUSxLQUFLLFFBQUwsS0FBa0IsVUFBOUIsRUFBMEM7QUFDeEMsZ0JBQUksR0FBSixJQUFXLElBQUksR0FBSixFQUFTLEdBQXBCO0FBQ0QsV0FGRCxNQUVPO0FBQ0wsZ0JBQUksR0FBSixJQUFXLFdBQVcsSUFBSSxHQUFKLENBQVgsQ0FBWDtBQUNEO0FBQ0Y7O0FBRUQsWUFBSSxFQUFFLFdBQUYsQ0FBYyxJQUFJLEdBQUosQ0FBZCxDQUFKLEVBQTZCO0FBQzNCLGNBQUksR0FBSixJQUFXLElBQUksR0FBSixDQUFYO0FBQ0Q7QUFDRjs7QUFFRCxhQUFPLEdBQVA7QUFDRDs7QUFFRCxRQUFNLFlBQVksU0FBUyxXQUFXLElBQUksSUFBZixDQUFULENBQWxCOztBQUVBLFFBQUksUUFBUSxnQkFBWixFQUE4QjtBQUM1QixjQUFRLGFBQVIsQ0FBc0IsS0FBdEIsRUFBNkIsR0FBN0IsRUFBa0MsVUFBQyxlQUFELEVBQXFCO0FBQ3JELGlCQUFTLGVBQVQsRUFBMEIsSUFBSSxNQUFKLENBQVcsRUFBckMsRUFBeUMsZ0JBQXpDLENBQTBELEVBQTFELEVBQThEO0FBQzVELGdCQUFNO0FBRHNELFNBQTlELEVBRUc7QUFDRCxlQUFLLElBREo7QUFFRCx5QkFBZSxRQUFRO0FBRnRCLFNBRkgsRUFLRyxJQUxILEdBS1UsSUFMVixDQUtlLFVBQUMsSUFBRDtBQUFBLGlCQUFVLE1BQU0sUUFBTixDQUFlLElBQWYsRUFBcUIsSUFBSSxnQkFBSixDQUFxQixRQUFyQixJQUFpQyxFQUF0RCxDQUFWO0FBQUEsU0FMZixFQUtvRixJQUxwRixDQUt5RixVQUFDLElBQUQsRUFBVTtBQUNqRyxjQUFJLENBQUMsSUFBTCxFQUFXO0FBQ1QsbUJBQU8sYUFBYSxHQUFiLEVBQWtCLEdBQWxCLEVBQXVCLElBQXZCLEVBQTZCLElBQUksS0FBSixDQUFVLEtBQUssWUFBTCxDQUFrQixHQUFsQixDQUFWLENBQTdCLENBQVA7QUFDRDs7QUFFRCxjQUFJLEdBQUosQ0FBUSxNQUFSLEdBQWlCLElBQWpCO0FBQ0EsY0FBSSxHQUFKLENBQVEsVUFBUixHQUFxQixHQUFyQjs7QUFFQSxzQkFBWSxXQUFaLENBQXdCLEdBQXhCLEVBQTZCLEdBQTdCLEVBQWtDLElBQWxDO0FBQ0QsU0FkRCxFQWNHLGFBQWEsR0FBYixFQUFrQixHQUFsQixFQUF1QixJQUF2QixDQWRIO0FBZUQsT0FoQkQ7QUFpQkQsS0FsQkQsTUFrQk87QUFDTCxXQUFLLElBQUksR0FBVCxJQUFnQixTQUFoQixFQUEyQjtBQUN6QixZQUFJLEdBQUosQ0FBUSxRQUFSLENBQWlCLEdBQWpCLENBQXFCLEdBQXJCLEVBQTBCLFVBQVUsR0FBVixDQUExQjtBQUNEOztBQUVELFVBQUksR0FBSixDQUFRLFFBQVIsQ0FBaUIsSUFBakIsR0FBd0IsSUFBeEIsQ0FBNkIsVUFBQyxJQUFEO0FBQUEsZUFBVSxNQUFNLFFBQU4sQ0FBZSxJQUFmLEVBQXFCLElBQUksZ0JBQUosQ0FBcUIsUUFBckIsSUFBaUMsRUFBdEQsQ0FBVjtBQUFBLE9BQTdCLEVBQWtHLElBQWxHLENBQXVHLFVBQUMsSUFBRCxFQUFVO0FBQy9HLFlBQUksR0FBSixDQUFRLE1BQVIsR0FBaUIsSUFBakI7QUFDQSxZQUFJLEdBQUosQ0FBUSxVQUFSLEdBQXFCLEdBQXJCOztBQUVBLG9CQUFZLFdBQVosQ0FBd0IsR0FBeEIsRUFBNkIsR0FBN0IsRUFBa0MsSUFBbEM7QUFDRCxPQUxELEVBS0csYUFBYSxHQUFiLEVBQWtCLEdBQWxCLEVBQXVCLElBQXZCLENBTEg7QUFNRDtBQUNGOztBQUVELFNBQU8sRUFBRSxrQkFBRixFQUFZLGtCQUFaLEVBQXNCLGdCQUF0QixFQUErQixzQkFBL0IsRUFBMkMsMEJBQTNDLEVBQXlELDBCQUF6RCxFQUF1RSx3QkFBdkUsRUFBb0Ysc0JBQXBGLEVBQVA7QUFDRCxDQTdPRCIsImZpbGUiOiJvcGVyYXRpb25zLmpzIiwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgXyA9IHJlcXVpcmUoJ2xvZGFzaCcpXHJcbmNvbnN0IGh0dHAgPSByZXF1aXJlKCdodHRwJylcclxuY29uc3QgbW9yZWRvdHMgPSByZXF1aXJlKCdtb3JlZG90cycpXHJcbnZhciBtdF9tb25nb29zZSA9IHJlcXVpcmUoJ210LW1vbmdvb3NlJylcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG1vZGVsLCBvcHRpb25zLCBleGNsdWRlZE1hcCkge1xyXG4gIGNvbnN0IGJ1aWxkUXVlcnkgPSByZXF1aXJlKCcuL2J1aWxkUXVlcnknKShvcHRpb25zKVxyXG4gIGNvbnN0IGVycm9ySGFuZGxlciA9IHJlcXVpcmUoJy4vZXJyb3JIYW5kbGVyJykob3B0aW9ucylcclxuXHJcbiAgZnVuY3Rpb24gZmluZEJ5SWQgKGZpbHRlcmVkQ29udGV4dCwgaWQpIHtcclxuICAgIHJldHVybiBmaWx0ZXJlZENvbnRleHQuZmluZE9uZSgpLmFuZCh7XHJcbiAgICAgIFtvcHRpb25zLmlkUHJvcGVydHldOiBpZFxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGZ1bmN0aW9uIGlzRGlzdGluY3RFeGNsdWRlZCAocmVxKSB7XHJcbiAgICByZXR1cm4gb3B0aW9ucy5maWx0ZXIuaXNFeGNsdWRlZChyZXEuX2VybVF1ZXJ5T3B0aW9uc1snZGlzdGluY3QnXSwge1xyXG4gICAgICBhY2Nlc3M6IHJlcS5hY2Nlc3MsXHJcbiAgICAgIGV4Y2x1ZGVkTWFwOiBleGNsdWRlZE1hcFxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGZ1bmN0aW9uIGdldEl0ZW1zIChyZXEsIHJlcywgbmV4dCkge1xyXG4gICAgaWYgKGlzRGlzdGluY3RFeGNsdWRlZChyZXEpKSB7XHJcbiAgICAgIHJlcS5lcm0ucmVzdWx0ID0gW11cclxuICAgICAgcmVxLmVybS5zdGF0dXNDb2RlID0gMjAwXHJcbiAgICAgIHJldHVybiBuZXh0KClcclxuICAgIH1cclxuICAgIG1vZGVsID0gbXRfbW9uZ29vc2UuZ2V0TW9kZWwobW9kZWwpXHJcblxyXG4gICAgb3B0aW9ucy5jb250ZXh0RmlsdGVyKG1vZGVsLCByZXEsIChmaWx0ZXJlZENvbnRleHQpID0+IHtcclxuICAgICAgYnVpbGRRdWVyeShmaWx0ZXJlZENvbnRleHQuZmluZCgpLCByZXEuX2VybVF1ZXJ5T3B0aW9ucykudGhlbigoaXRlbXMpID0+IHtcclxuICAgICAgICByZXEuZXJtLnJlc3VsdCA9IGl0ZW1zXHJcbiAgICAgICAgcmVxLmVybS5zdGF0dXNDb2RlID0gMjAwXHJcblxyXG4gICAgICAgIGlmIChvcHRpb25zLnRvdGFsQ291bnRIZWFkZXIpIHtcclxuICAgICAgICAgIGJ1aWxkUXVlcnkoZmlsdGVyZWRDb250ZXh0LmNvdW50KCksIF8uYXNzaWduKHJlcS5fZXJtUXVlcnlPcHRpb25zLCB7XHJcbiAgICAgICAgICAgIHNraXA6IDAsXHJcbiAgICAgICAgICAgIGxpbWl0OiAwXHJcbiAgICAgICAgICB9KSkudGhlbigoY291bnQpID0+IHtcclxuICAgICAgICAgICAgcmVxLmVybS50b3RhbENvdW50ID0gY291bnRcclxuICAgICAgICAgICAgbXRfbW9uZ29vc2Uuc2V0VGVuYW50SWQocmVxLCByZXMsIG5leHQpXHJcbiAgICAgICAgICB9LCBlcnJvckhhbmRsZXIocmVxLCByZXMsIG5leHQpKVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBtdF9tb25nb29zZS5zZXRUZW5hbnRJZChyZXEsIHJlcywgbmV4dClcclxuICAgICAgICB9XHJcbiAgICAgIH0sIGVycm9ySGFuZGxlcihyZXEsIHJlcywgbmV4dCkpXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gZ2V0Q291bnQgKHJlcSwgcmVzLCBuZXh0KSB7XHJcbiAgICBtb2RlbCA9IG10X21vbmdvb3NlLmdldE1vZGVsKG1vZGVsKVxyXG4gICAgb3B0aW9ucy5jb250ZXh0RmlsdGVyKG1vZGVsLCByZXEsIChmaWx0ZXJlZENvbnRleHQpID0+IHtcclxuICAgICAgYnVpbGRRdWVyeShmaWx0ZXJlZENvbnRleHQuY291bnQoKSwgcmVxLl9lcm1RdWVyeU9wdGlvbnMpLnRoZW4oKGNvdW50KSA9PiB7XHJcbiAgICAgICAgcmVxLmVybS5yZXN1bHQgPSB7IGNvdW50OiBjb3VudCB9XHJcbiAgICAgICAgcmVxLmVybS5zdGF0dXNDb2RlID0gMjAwXHJcblxyXG4gICAgICAgIG10X21vbmdvb3NlLnNldFRlbmFudElkKHJlcSwgcmVzLCBuZXh0KVxyXG4gICAgICB9LCBlcnJvckhhbmRsZXIocmVxLCByZXMsIG5leHQpKVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGZ1bmN0aW9uIGdldFNoYWxsb3cgKHJlcSwgcmVzLCBuZXh0KSB7XHJcbiAgICBtb2RlbCA9IG10X21vbmdvb3NlLmdldE1vZGVsKG1vZGVsKVxyXG4gICAgb3B0aW9ucy5jb250ZXh0RmlsdGVyKG1vZGVsLCByZXEsIChmaWx0ZXJlZENvbnRleHQpID0+IHtcclxuICAgICAgYnVpbGRRdWVyeShmaW5kQnlJZChmaWx0ZXJlZENvbnRleHQsIHJlcS5wYXJhbXMuaWQpLCByZXEuX2VybVF1ZXJ5T3B0aW9ucykudGhlbigoaXRlbSkgPT4ge1xyXG4gICAgICAgIGlmICghaXRlbSkge1xyXG4gICAgICAgICAgcmV0dXJuIGVycm9ySGFuZGxlcihyZXEsIHJlcywgbmV4dCkobmV3IEVycm9yKGh0dHAuU1RBVFVTX0NPREVTWzQwNF0pKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yIChsZXQgcHJvcCBpbiBpdGVtKSB7XHJcbiAgICAgICAgICBpdGVtW3Byb3BdID0gdHlwZW9mIGl0ZW1bcHJvcF0gPT09ICdvYmplY3QnICYmIHByb3AgIT09ICdfaWQnID8gdHJ1ZSA6IGl0ZW1bcHJvcF1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJlcS5lcm0ucmVzdWx0ID0gaXRlbVxyXG4gICAgICAgIHJlcS5lcm0uc3RhdHVzQ29kZSA9IDIwMFxyXG5cclxuICAgICAgICBtdF9tb25nb29zZS5zZXRUZW5hbnRJZChyZXEsIHJlcywgbmV4dClcclxuICAgICAgfSwgZXJyb3JIYW5kbGVyKHJlcSwgcmVzLCBuZXh0KSlcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiBkZWxldGVJdGVtcyAocmVxLCByZXMsIG5leHQpIHtcclxuICAgIG1vZGVsID0gbXRfbW9uZ29vc2UuZ2V0TW9kZWwobW9kZWwpXHJcbiAgICBvcHRpb25zLmNvbnRleHRGaWx0ZXIobW9kZWwsIHJlcSwgKGZpbHRlcmVkQ29udGV4dCkgPT4ge1xyXG4gICAgICBidWlsZFF1ZXJ5KGZpbHRlcmVkQ29udGV4dC5yZW1vdmUoKSwgcmVxLl9lcm1RdWVyeU9wdGlvbnMpLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgIHJlcS5lcm0uc3RhdHVzQ29kZSA9IDIwNFxyXG5cclxuICAgICAgICBtdF9tb25nb29zZS5zZXRUZW5hbnRJZChyZXEsIHJlcywgbmV4dClcclxuICAgICAgfSwgZXJyb3JIYW5kbGVyKHJlcSwgcmVzLCBuZXh0KSlcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiBnZXRJdGVtIChyZXEsIHJlcywgbmV4dCkge1xyXG4gICAgbW9kZWwgPSBtdF9tb25nb29zZS5nZXRNb2RlbChtb2RlbClcclxuICAgIGlmIChpc0Rpc3RpbmN0RXhjbHVkZWQocmVxKSkge1xyXG4gICAgICByZXEuZXJtLnJlc3VsdCA9IFtdXHJcbiAgICAgIHJlcS5lcm0uc3RhdHVzQ29kZSA9IDIwMFxyXG4gICAgICByZXR1cm4gbXRfbW9uZ29vc2Uuc2V0VGVuYW50SWQocmVxLCByZXMsIG5leHQpXHJcbiAgICB9XHJcblxyXG4gICAgb3B0aW9ucy5jb250ZXh0RmlsdGVyKG1vZGVsLCByZXEsIChmaWx0ZXJlZENvbnRleHQpID0+IHtcclxuICAgICAgYnVpbGRRdWVyeShmaW5kQnlJZChmaWx0ZXJlZENvbnRleHQsIHJlcS5wYXJhbXMuaWQpLCByZXEuX2VybVF1ZXJ5T3B0aW9ucykudGhlbigoaXRlbSkgPT4ge1xyXG4gICAgICAgIGlmICghaXRlbSkge1xyXG4gICAgICAgICAgcmV0dXJuIGVycm9ySGFuZGxlcihyZXEsIHJlcywgbmV4dCkobmV3IEVycm9yKGh0dHAuU1RBVFVTX0NPREVTWzQwNF0pKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmVxLmVybS5yZXN1bHQgPSBpdGVtXHJcbiAgICAgICAgcmVxLmVybS5zdGF0dXNDb2RlID0gMjAwXHJcblxyXG4gICAgICAgIG10X21vbmdvb3NlLnNldFRlbmFudElkKHJlcSwgcmVzLCBuZXh0KVxyXG4gICAgICB9LCBlcnJvckhhbmRsZXIocmVxLCByZXMsIG5leHQpKVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGZ1bmN0aW9uIGRlbGV0ZUl0ZW0gKHJlcSwgcmVzLCBuZXh0KSB7XHJcbiAgICBtb2RlbCA9IG10X21vbmdvb3NlLmdldE1vZGVsKG1vZGVsKVxyXG4gICAgaWYgKG9wdGlvbnMuZmluZE9uZUFuZFJlbW92ZSkge1xyXG4gICAgICBvcHRpb25zLmNvbnRleHRGaWx0ZXIobW9kZWwsIHJlcSwgKGZpbHRlcmVkQ29udGV4dCkgPT4ge1xyXG4gICAgICAgIGZpbmRCeUlkKGZpbHRlcmVkQ29udGV4dCwgcmVxLnBhcmFtcy5pZCkuZmluZE9uZUFuZFJlbW92ZSgpLnRoZW4oKGl0ZW0pID0+IHtcclxuICAgICAgICAgIGlmICghaXRlbSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZXJyb3JIYW5kbGVyKHJlcSwgcmVzLCBuZXh0KShuZXcgRXJyb3IoaHR0cC5TVEFUVVNfQ09ERVNbNDA0XSkpXHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgcmVxLmVybS5zdGF0dXNDb2RlID0gMjA0XHJcblxyXG4gICAgICAgICAgbXRfbW9uZ29vc2Uuc2V0VGVuYW50SWQocmVxLCByZXMsIG5leHQpXHJcbiAgICAgICAgfSwgZXJyb3JIYW5kbGVyKHJlcSwgcmVzLCBuZXh0KSlcclxuICAgICAgfSlcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJlcS5lcm0uZG9jdW1lbnQucmVtb3ZlKCkudGhlbigoKSA9PiB7XHJcbiAgICAgICAgcmVxLmVybS5zdGF0dXNDb2RlID0gMjA0XHJcblxyXG4gICAgICAgIG10X21vbmdvb3NlLnNldFRlbmFudElkKHJlcSwgcmVzLCBuZXh0KVxyXG4gICAgICB9LCBlcnJvckhhbmRsZXIocmVxLCByZXMsIG5leHQpKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gY3JlYXRlT2JqZWN0IChyZXEsIHJlcywgbmV4dCkge1xyXG4gICAgbW9kZWwgPSBtdF9tb25nb29zZS5nZXRNb2RlbChtb2RlbClcclxuICAgIHJlcS5ib2R5ID0gb3B0aW9ucy5maWx0ZXIuZmlsdGVyT2JqZWN0KHJlcS5ib2R5IHx8IHt9LCB7XHJcbiAgICAgIGFjY2VzczogcmVxLmFjY2VzcyxcclxuICAgICAgcG9wdWxhdGU6IHJlcS5fZXJtUXVlcnlPcHRpb25zLnBvcHVsYXRlXHJcbiAgICB9KVxyXG5cclxuICAgIGlmIChtb2RlbC5zY2hlbWEub3B0aW9ucy5faWQpIHtcclxuICAgICAgZGVsZXRlIHJlcS5ib2R5Ll9pZFxyXG4gICAgfVxyXG5cclxuICAgIGlmIChtb2RlbC5zY2hlbWEub3B0aW9ucy52ZXJzaW9uS2V5KSB7XHJcbiAgICAgIGRlbGV0ZSByZXEuYm9keVttb2RlbC5zY2hlbWEub3B0aW9ucy52ZXJzaW9uS2V5XVxyXG4gICAgfVxyXG5cclxuICAgIG1vZGVsLmNyZWF0ZShyZXEuYm9keSkudGhlbigoaXRlbSkgPT4gbW9kZWwucG9wdWxhdGUoaXRlbSwgcmVxLl9lcm1RdWVyeU9wdGlvbnMucG9wdWxhdGUgfHwgW10pKS50aGVuKChpdGVtKSA9PiB7XHJcbiAgICAgIHJlcS5lcm0ucmVzdWx0ID0gaXRlbVxyXG4gICAgICByZXEuZXJtLnN0YXR1c0NvZGUgPSAyMDFcclxuXHJcbiAgICAgIG10X21vbmdvb3NlLnNldFRlbmFudElkKHJlcSwgcmVzLCBuZXh0KVxyXG4gICAgfSwgZXJyb3JIYW5kbGVyKHJlcSwgcmVzLCBuZXh0KSlcclxuICB9XHJcblxyXG4gIGZ1bmN0aW9uIG1vZGlmeU9iamVjdCAocmVxLCByZXMsIG5leHQpIHtcclxuICAgIG1vZGVsID0gbXRfbW9uZ29vc2UuZ2V0TW9kZWwobW9kZWwpXHJcbiAgICByZXEuYm9keSA9IG9wdGlvbnMuZmlsdGVyLmZpbHRlck9iamVjdChyZXEuYm9keSB8fCB7fSwge1xyXG4gICAgICBhY2Nlc3M6IHJlcS5hY2Nlc3MsXHJcbiAgICAgIHBvcHVsYXRlOiByZXEuX2VybVF1ZXJ5T3B0aW9ucy5wb3B1bGF0ZVxyXG4gICAgfSlcclxuXHJcbiAgICBkZWxldGUgcmVxLmJvZHkuX2lkXHJcblxyXG4gICAgaWYgKG1vZGVsLnNjaGVtYS5vcHRpb25zLnZlcnNpb25LZXkpIHtcclxuICAgICAgZGVsZXRlIHJlcS5ib2R5W21vZGVsLnNjaGVtYS5vcHRpb25zLnZlcnNpb25LZXldXHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZGVwb3B1bGF0ZSAoc3JjKSB7XHJcbiAgICAgIGxldCBkc3QgPSB7fVxyXG5cclxuICAgICAgZm9yIChsZXQga2V5IGluIHNyYykge1xyXG4gICAgICAgIGNvbnN0IHBhdGggPSBtb2RlbC5zY2hlbWEucGF0aChrZXkpXHJcblxyXG4gICAgICAgIGlmIChwYXRoICYmIHBhdGguY2FzdGVyICYmIHBhdGguY2FzdGVyLmluc3RhbmNlID09PSAnT2JqZWN0SUQnKSB7XHJcbiAgICAgICAgICBpZiAoXy5pc0FycmF5KHNyY1trZXldKSkge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHNyY1trZXldLmxlbmd0aDsgKytqKSB7XHJcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiBzcmNba2V5XVtqXSA9PT0gJ29iamVjdCcpIHtcclxuICAgICAgICAgICAgICAgIGRzdFtrZXldID0gZHN0W2tleV0gfHwge31cclxuICAgICAgICAgICAgICAgIGRzdFtrZXldW2pdID0gc3JjW2tleV1bal0uX2lkXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKF8uaXNQbGFpbk9iamVjdChzcmNba2V5XSkpIHtcclxuICAgICAgICAgICAgZHN0W2tleV0gPSBzcmNba2V5XS5faWRcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKF8uaXNQbGFpbk9iamVjdChzcmNba2V5XSkpIHtcclxuICAgICAgICAgIGlmIChwYXRoICYmIHBhdGguaW5zdGFuY2UgPT09ICdPYmplY3RJRCcpIHtcclxuICAgICAgICAgICAgZHN0W2tleV0gPSBzcmNba2V5XS5faWRcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGRzdFtrZXldID0gZGVwb3B1bGF0ZShzcmNba2V5XSlcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChfLmlzVW5kZWZpbmVkKGRzdFtrZXldKSkge1xyXG4gICAgICAgICAgZHN0W2tleV0gPSBzcmNba2V5XVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIGRzdFxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGNsZWFuQm9keSA9IG1vcmVkb3RzKGRlcG9wdWxhdGUocmVxLmJvZHkpKVxyXG5cclxuICAgIGlmIChvcHRpb25zLmZpbmRPbmVBbmRVcGRhdGUpIHtcclxuICAgICAgb3B0aW9ucy5jb250ZXh0RmlsdGVyKG1vZGVsLCByZXEsIChmaWx0ZXJlZENvbnRleHQpID0+IHtcclxuICAgICAgICBmaW5kQnlJZChmaWx0ZXJlZENvbnRleHQsIHJlcS5wYXJhbXMuaWQpLmZpbmRPbmVBbmRVcGRhdGUoe30sIHtcclxuICAgICAgICAgICRzZXQ6IGNsZWFuQm9keVxyXG4gICAgICAgIH0sIHtcclxuICAgICAgICAgIG5ldzogdHJ1ZSxcclxuICAgICAgICAgIHJ1blZhbGlkYXRvcnM6IG9wdGlvbnMucnVuVmFsaWRhdG9yc1xyXG4gICAgICAgIH0pLmV4ZWMoKS50aGVuKChpdGVtKSA9PiBtb2RlbC5wb3B1bGF0ZShpdGVtLCByZXEuX2VybVF1ZXJ5T3B0aW9ucy5wb3B1bGF0ZSB8fCBbXSkpLnRoZW4oKGl0ZW0pID0+IHtcclxuICAgICAgICAgIGlmICghaXRlbSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZXJyb3JIYW5kbGVyKHJlcSwgcmVzLCBuZXh0KShuZXcgRXJyb3IoaHR0cC5TVEFUVVNfQ09ERVNbNDA0XSkpXHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgcmVxLmVybS5yZXN1bHQgPSBpdGVtXHJcbiAgICAgICAgICByZXEuZXJtLnN0YXR1c0NvZGUgPSAyMDBcclxuXHJcbiAgICAgICAgICBtdF9tb25nb29zZS5zZXRUZW5hbnRJZChyZXEsIHJlcywgbmV4dClcclxuICAgICAgICB9LCBlcnJvckhhbmRsZXIocmVxLCByZXMsIG5leHQpKVxyXG4gICAgICB9KVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZm9yIChsZXQga2V5IGluIGNsZWFuQm9keSkge1xyXG4gICAgICAgIHJlcS5lcm0uZG9jdW1lbnQuc2V0KGtleSwgY2xlYW5Cb2R5W2tleV0pXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJlcS5lcm0uZG9jdW1lbnQuc2F2ZSgpLnRoZW4oKGl0ZW0pID0+IG1vZGVsLnBvcHVsYXRlKGl0ZW0sIHJlcS5fZXJtUXVlcnlPcHRpb25zLnBvcHVsYXRlIHx8IFtdKSkudGhlbigoaXRlbSkgPT4ge1xyXG4gICAgICAgIHJlcS5lcm0ucmVzdWx0ID0gaXRlbVxyXG4gICAgICAgIHJlcS5lcm0uc3RhdHVzQ29kZSA9IDIwMFxyXG5cclxuICAgICAgICBtdF9tb25nb29zZS5zZXRUZW5hbnRJZChyZXEsIHJlcywgbmV4dClcclxuICAgICAgfSwgZXJyb3JIYW5kbGVyKHJlcSwgcmVzLCBuZXh0KSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJldHVybiB7IGdldEl0ZW1zLCBnZXRDb3VudCwgZ2V0SXRlbSwgZ2V0U2hhbGxvdywgY3JlYXRlT2JqZWN0LCBtb2RpZnlPYmplY3QsIGRlbGV0ZUl0ZW1zLCBkZWxldGVJdGVtIH1cclxufVxyXG4iXX0= //# sourceMappingURL=operations.js.map