loopback-sdelete-mixin
Version:
A mixin to automatically generate created and updated Date attributes for loopback Models
213 lines (160 loc) • 21 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _assign = require('babel-runtime/core-js/object/assign');
var _assign2 = _interopRequireDefault(_assign);
var _defineProperty2 = require('babel-runtime/helpers/defineProperty');
var _defineProperty3 = _interopRequireDefault(_defineProperty2);
var _extends6 = require('babel-runtime/helpers/extends');
var _extends7 = _interopRequireDefault(_extends6);
var _keys = require('babel-runtime/core-js/object/keys');
var _keys2 = _interopRequireDefault(_keys);
var _promise = require('babel-runtime/core-js/promise');
var _promise2 = _interopRequireDefault(_promise);
var _debug2 = require('./debug');
var _debug3 = _interopRequireDefault(_debug2);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var debug = (0, _debug3.default)();
function createPromiseCallback() {
var cb = void 0;
var promise = new _promise2.default(function (resolve, reject) {
cb = function cb(err, data) {
if (err) return reject(err);
return resolve(data);
};
});
cb.promise = promise;
return cb;
}
exports.default = function (Model, _ref) {
var _ref$deletedAt = _ref.deletedAt,
deletedAt = _ref$deletedAt === undefined ? 'deletedAt' : _ref$deletedAt,
_ref$_isDeleted = _ref._isDeleted,
_isDeleted = _ref$_isDeleted === undefined ? '_isDeleted' : _ref$_isDeleted,
_ref$scrub = _ref.scrub,
scrub = _ref$scrub === undefined ? false : _ref$scrub;
debug('SoftDelete mixin for Model %s', Model.modelName);
debug('options', { deletedAt: deletedAt, _isDeleted: _isDeleted, scrub: scrub });
var properties = Model.definition.properties;
var scrubbed = {};
if (scrub !== false) {
var propertiesToScrub = scrub;
if (!Array.isArray(propertiesToScrub)) {
propertiesToScrub = (0, _keys2.default)(properties).filter(function (prop) {
return !properties[prop].id && prop !== _isDeleted;
});
}
scrubbed = propertiesToScrub.reduce(function (obj, prop) {
return (0, _extends7.default)({}, obj, (0, _defineProperty3.default)({}, prop, null));
}, {});
}
Model.defineProperty(deletedAt, { type: Date, required: false });
Model.defineProperty(_isDeleted, { type: Boolean, required: true, default: false });
Model.destroyAll = function softDestroyAll(where, options, cb) {
var _extends3;
var callback = cb === undefined && typeof options === 'function' ? options : cb;
callback = callback || createPromiseCallback();
var _options = options;
if (typeof options === 'function') {
_options = {};
}
Model.updateAll(where, (0, _extends7.default)({}, scrubbed, (_extends3 = {}, (0, _defineProperty3.default)(_extends3, deletedAt, new Date()), (0, _defineProperty3.default)(_extends3, _isDeleted, true), _extends3)), _options).then(function (result) {
return callback(null, result);
}).catch(function (error) {
return callback(error);
});
return callback.promise;
};
Model.remove = Model.destroyAll;
Model.deleteAll = Model.destroyAll;
Model.destroyById = function softDestroyById(id, options, cb) {
var _extends4;
var callback = cb === undefined && typeof options === 'function' ? options : cb;
callback = callback || createPromiseCallback();
var _options = options;
if (typeof options === 'function') {
_options = {};
}
Model.updateAll({ id: id }, (0, _extends7.default)({}, scrubbed, (_extends4 = {}, (0, _defineProperty3.default)(_extends4, deletedAt, new Date()), (0, _defineProperty3.default)(_extends4, _isDeleted, true), _extends4)), _options).then(function (result) {
return callback(null, result);
}).catch(function (error) {
return callback(error);
});
return callback.promise;
};
Model.removeById = Model.destroyById;
Model.deleteById = Model.destroyById;
Model.prototype.destroy = function softDestroy(options, cb) {
var _extends5;
var callback = cb === undefined && typeof options === 'function' ? options : cb;
callback = callback || createPromiseCallback();
var _options = options;
if (typeof options === 'function') {
_options = {};
}
this.updateAttributes((0, _extends7.default)({}, scrubbed, (_extends5 = {}, (0, _defineProperty3.default)(_extends5, deletedAt, new Date()), (0, _defineProperty3.default)(_extends5, _isDeleted, true), _extends5)), _options).then(function (result) {
return callback(null, result);
}).catch(function (error) {
return callback(error);
});
return callback.promise;
};
Model.prototype.remove = Model.prototype.destroy;
Model.prototype.delete = Model.prototype.destroy;
// Emulate default scope but with more flexibility.
var queryNonDeleted = {};
queryNonDeleted[_isDeleted] = false;
var _findOrCreate = Model.findOrCreate;
Model.findOrCreate = function findOrCreateDeleted() {
var query = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
if (!query.deleted) {
if (!query.where) {
query.where = (0, _assign2.default)({}, queryNonDeleted);
} else {
query.where = { and: [query.where, queryNonDeleted] };
}
}
for (var _len = arguments.length, rest = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
rest[_key - 1] = arguments[_key];
}
return _findOrCreate.call.apply(_findOrCreate, [Model, query].concat(rest));
};
var _find = Model.find;
Model.find = function findDeleted() {
var query = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
if (!query.deleted) {
if (!query.where) {
query.where = (0, _assign2.default)({}, queryNonDeleted);
} else {
query.where = { and: [query.where, queryNonDeleted] };
}
}
for (var _len2 = arguments.length, rest = Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
rest[_key2 - 1] = arguments[_key2];
}
return _find.call.apply(_find, [Model, query].concat(rest));
};
var _count = Model.count;
Model.count = function countDeleted() {
var where = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
// Because count only receives a 'where', there's nowhere to ask for the deleted entities.
var whereNotDeleted = { and: [where, queryNonDeleted] };
for (var _len3 = arguments.length, rest = Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {
rest[_key3 - 1] = arguments[_key3];
}
return _count.call.apply(_count, [Model, whereNotDeleted].concat(rest));
};
var _update = Model.update;
Model.update = Model.updateAll = function updateDeleted() {
var where = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
// Because update/updateAll only receives a 'where', there's nowhere to ask for the deleted entities.
var whereNotDeleted = { and: [where, queryNonDeleted] };
for (var _len4 = arguments.length, rest = Array(_len4 > 1 ? _len4 - 1 : 0), _key4 = 1; _key4 < _len4; _key4++) {
rest[_key4 - 1] = arguments[_key4];
}
return _update.call.apply(_update, [Model, whereNotDeleted].concat(rest));
};
};
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNvZnQtZGVsZXRlLmpzIl0sIm5hbWVzIjpbImRlYnVnIiwiY3JlYXRlUHJvbWlzZUNhbGxiYWNrIiwiY2IiLCJwcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsImVyciIsImRhdGEiLCJNb2RlbCIsImRlbGV0ZWRBdCIsIl9pc0RlbGV0ZWQiLCJzY3J1YiIsIm1vZGVsTmFtZSIsInByb3BlcnRpZXMiLCJkZWZpbml0aW9uIiwic2NydWJiZWQiLCJwcm9wZXJ0aWVzVG9TY3J1YiIsIkFycmF5IiwiaXNBcnJheSIsImZpbHRlciIsInByb3AiLCJpZCIsInJlZHVjZSIsIm9iaiIsImRlZmluZVByb3BlcnR5IiwidHlwZSIsIkRhdGUiLCJyZXF1aXJlZCIsIkJvb2xlYW4iLCJkZWZhdWx0IiwiZGVzdHJveUFsbCIsInNvZnREZXN0cm95QWxsIiwid2hlcmUiLCJvcHRpb25zIiwiY2FsbGJhY2siLCJ1bmRlZmluZWQiLCJfb3B0aW9ucyIsInVwZGF0ZUFsbCIsInRoZW4iLCJyZXN1bHQiLCJjYXRjaCIsImVycm9yIiwicmVtb3ZlIiwiZGVsZXRlQWxsIiwiZGVzdHJveUJ5SWQiLCJzb2Z0RGVzdHJveUJ5SWQiLCJyZW1vdmVCeUlkIiwiZGVsZXRlQnlJZCIsInByb3RvdHlwZSIsImRlc3Ryb3kiLCJzb2Z0RGVzdHJveSIsInVwZGF0ZUF0dHJpYnV0ZXMiLCJkZWxldGUiLCJxdWVyeU5vbkRlbGV0ZWQiLCJfZmluZE9yQ3JlYXRlIiwiZmluZE9yQ3JlYXRlIiwiZmluZE9yQ3JlYXRlRGVsZXRlZCIsInF1ZXJ5IiwiZGVsZXRlZCIsImFuZCIsInJlc3QiLCJjYWxsIiwiX2ZpbmQiLCJmaW5kIiwiZmluZERlbGV0ZWQiLCJfY291bnQiLCJjb3VudCIsImNvdW50RGVsZXRlZCIsIndoZXJlTm90RGVsZXRlZCIsIl91cGRhdGUiLCJ1cGRhdGUiLCJ1cGRhdGVEZWxldGVkIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOzs7Ozs7QUFD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QSxRQUFyQnZDLEtBQXFCLHVFQUFiLEVBQWE7O0FBQzNFO0FBQ0EsUUFBTW9DLGtCQUFrQixFQUFFVCxLQUFLLENBQUMzQixLQUFELEVBQVFxQixlQUFSLENBQVAsRUFBeEI7O0FBRjJFLHVDQUFOTyxJQUFNO0FBQU5BLFVBQU07QUFBQTs7QUFHM0UsV0FBT1MsUUFBUVIsSUFBUixpQkFBYXJELEtBQWIsRUFBb0I0RCxlQUFwQixTQUF3Q1IsSUFBeEMsRUFBUDtBQUNELEdBSkQ7QUFLRCxDIiwiZmlsZSI6InNvZnQtZGVsZXRlLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF9kZWJ1ZyBmcm9tICcuL2RlYnVnJztcbmNvbnN0IGRlYnVnID0gX2RlYnVnKCk7XG5cbmZ1bmN0aW9uIGNyZWF0ZVByb21pc2VDYWxsYmFjaygpIHtcbiAgbGV0IGNiO1xuICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNiID0gKGVyciwgZGF0YSkgPT4ge1xuICAgICAgaWYgKGVycikgcmV0dXJuIHJlamVjdChlcnIpO1xuICAgICAgcmV0dXJuIHJlc29sdmUoZGF0YSk7XG4gICAgfTtcbiAgfSk7XG4gIGNiLnByb21pc2UgPSBwcm9taXNlO1xuICByZXR1cm4gY2I7XG59XG5cbmV4cG9ydCBkZWZhdWx0IChNb2RlbCwgeyBkZWxldGVkQXQgPSAnZGVsZXRlZEF0JywgX2lzRGVsZXRlZCA9ICdfaXNEZWxldGVkJywgc2NydWIgPSBmYWxzZSB9KSA9PiB7XG4gIGRlYnVnKCdTb2Z0RGVsZXRlIG1peGluIGZvciBNb2RlbCAlcycsIE1vZGVsLm1vZGVsTmFtZSk7XG5cbiAgZGVidWcoJ29wdGlvbnMnLCB7IGRlbGV0ZWRBdCwgX2lzRGVsZXRlZCwgc2NydWIgfSk7XG5cbiAgY29uc3QgcHJvcGVydGllcyA9IE1vZGVsLmRlZmluaXRpb24ucHJvcGVydGllcztcblxuICBsZXQgc2NydWJiZWQgPSB7fTtcbiAgaWYgKHNjcnViICE9PSBmYWxzZSkge1xuICAgIGxldCBwcm9wZXJ0aWVzVG9TY3J1YiA9IHNjcnViO1xuICAgIGlmICghQXJyYXkuaXNBcnJheShwcm9wZXJ0aWVzVG9TY3J1YikpIHtcbiAgICAgIHByb3BlcnRpZXNUb1NjcnViID0gT2JqZWN0LmtleXMocHJvcGVydGllcylcbiAgICAgICAgLmZpbHRlcihwcm9wID0+ICFwcm9wZXJ0aWVzW3Byb3BdLmlkICYmIHByb3AgIT09IF9pc0RlbGV0ZWQpO1xuICAgIH1cbiAgICBzY3J1YmJlZCA9IHByb3BlcnRpZXNUb1NjcnViLnJlZHVjZSgob2JqLCBwcm9wKSA9PiAoeyAuLi5vYmosIFtwcm9wXTogbnVsbCB9KSwge30pO1xuICB9XG5cbiAgTW9kZWwuZGVmaW5lUHJvcGVydHkoZGVsZXRlZEF0LCB7IHR5cGU6IERhdGUsIHJlcXVpcmVkOiBmYWxzZSB9KTtcbiAgTW9kZWwuZGVmaW5lUHJvcGVydHkoX2lzRGVsZXRlZCwgeyB0eXBlOiBCb29sZWFuLCByZXF1aXJlZDogdHJ1ZSwgZGVmYXVsdDogZmFsc2UgfSk7XG5cbiAgTW9kZWwuZGVzdHJveUFsbCA9IGZ1bmN0aW9uIHNvZnREZXN0cm95QWxsKHdoZXJlLCBvcHRpb25zLCBjYikge1xuICAgIGxldCBjYWxsYmFjayA9IChjYiA9PT0gdW5kZWZpbmVkICYmIHR5cGVvZiBvcHRpb25zID09PSAnZnVuY3Rpb24nKSA/IG9wdGlvbnMgOiBjYjtcbiAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGNyZWF0ZVByb21pc2VDYWxsYmFjaygpO1xuICAgIGxldCBfb3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBfb3B0aW9ucyA9IHt9O1xuICAgIH1cbiAgICBNb2RlbC51cGRhdGVBbGwod2hlcmUsIHsgLi4uc2NydWJiZWQsIFtkZWxldGVkQXRdOiBuZXcgRGF0ZSgpLCBbX2lzRGVsZXRlZF06IHRydWUgfSwgX29wdGlvbnMpXG4gICAgICAudGhlbihyZXN1bHQgPT4gY2FsbGJhY2sobnVsbCwgcmVzdWx0KSlcbiAgICAgIC5jYXRjaChlcnJvciA9PiBjYWxsYmFjayhlcnJvcikpO1xuXG4gICAgcmV0dXJuIGNhbGxiYWNrLnByb21pc2U7XG4gIH07XG5cbiAgTW9kZWwucmVtb3ZlID0gTW9kZWwuZGVzdHJveUFsbDtcbiAgTW9kZWwuZGVsZXRlQWxsID0gTW9kZWwuZGVzdHJveUFsbDtcblxuICBNb2RlbC5kZXN0cm95QnlJZCA9IGZ1bmN0aW9uIHNvZnREZXN0cm95QnlJZChpZCwgb3B0aW9ucywgY2IpIHtcbiAgICBsZXQgY2FsbGJhY2sgPSAoY2IgPT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykgPyBvcHRpb25zIDogY2I7XG4gICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBjcmVhdGVQcm9taXNlQ2FsbGJhY2soKTtcbiAgICBsZXQgX29wdGlvbnMgPSBvcHRpb25zO1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgX29wdGlvbnMgPSB7fTtcbiAgICB9XG4gICAgTW9kZWwudXBkYXRlQWxsKHsgaWQ6IGlkIH0sIHsgLi4uc2NydWJiZWQsIFtkZWxldGVkQXRdOiBuZXcgRGF0ZSgpLCBbX2lzRGVsZXRlZF06IHRydWUgfSwgX29wdGlvbnMpXG4gICAgICAudGhlbihyZXN1bHQgPT4gY2FsbGJhY2sobnVsbCwgcmVzdWx0KSlcbiAgICAgIC5jYXRjaChlcnJvciA9PiBjYWxsYmFjayhlcnJvcikpO1xuXG4gICAgcmV0dXJuIGNhbGxiYWNrLnByb21pc2U7XG4gIH07XG5cbiAgTW9kZWwucmVtb3ZlQnlJZCA9IE1vZGVsLmRlc3Ryb3lCeUlkO1xuICBNb2RlbC5kZWxldGVCeUlkID0gTW9kZWwuZGVzdHJveUJ5SWQ7XG5cbiAgTW9kZWwucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbiBzb2Z0RGVzdHJveShvcHRpb25zLCBjYikge1xuICAgIGxldCBjYWxsYmFjayA9IChjYiA9PT0gdW5kZWZpbmVkICYmIHR5cGVvZiBvcHRpb25zID09PSAnZnVuY3Rpb24nKSA/IG9wdGlvbnMgOiBjYjtcbiAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGNyZWF0ZVByb21pc2VDYWxsYmFjaygpO1xuICAgIGxldCBfb3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBfb3B0aW9ucyA9IHt9O1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZUF0dHJpYnV0ZXMoeyAuLi5zY3J1YmJlZCwgW2RlbGV0ZWRBdF06IG5ldyBEYXRlKCksIFtfaXNEZWxldGVkXTogdHJ1ZSB9LCBfb3B0aW9ucylcbiAgICAgIC50aGVuKHJlc3VsdCA9PiBjYWxsYmFjayhudWxsLCByZXN1bHQpKVxuICAgICAgLmNhdGNoKGVycm9yID0+IGNhbGxiYWNrKGVycm9yKSk7XG5cbiAgICByZXR1cm4gY2FsbGJhY2sucHJvbWlzZTtcbiAgfTtcblxuICBNb2RlbC5wcm90b3R5cGUucmVtb3ZlID0gTW9kZWwucHJvdG90eXBlLmRlc3Ryb3k7XG4gIE1vZGVsLnByb3RvdHlwZS5kZWxldGUgPSBNb2RlbC5wcm90b3R5cGUuZGVzdHJveTtcblxuICAvLyBFbXVsYXRlIGRlZmF1bHQgc2NvcGUgYnV0IHdpdGggbW9yZSBmbGV4aWJpbGl0eS5cbiAgY29uc3QgcXVlcnlOb25EZWxldGVkID0ge307XG4gIHF1ZXJ5Tm9uRGVsZXRlZFtfaXNEZWxldGVkXSA9IGZhbHNlO1xuXG4gIGNvbnN0IF9maW5kT3JDcmVhdGUgPSBNb2RlbC5maW5kT3JDcmVhdGU7XG4gIE1vZGVsLmZpbmRPckNyZWF0ZSA9IGZ1bmN0aW9uIGZpbmRPckNyZWF0ZURlbGV0ZWQocXVlcnkgPSB7fSwgLi4ucmVzdCkge1xuICAgIGlmICghcXVlcnkuZGVsZXRlZCkge1xuICAgICAgaWYgKCFxdWVyeS53aGVyZSkge1xuICAgICAgICBxdWVyeS53aGVyZSA9IE9iamVjdC5hc3NpZ24oe30sIHF1ZXJ5Tm9uRGVsZXRlZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBxdWVyeS53aGVyZSA9IHsgYW5kOiBbcXVlcnkud2hlcmUsIHF1ZXJ5Tm9uRGVsZXRlZF0gfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gX2ZpbmRPckNyZWF0ZS5jYWxsKE1vZGVsLCBxdWVyeSwgLi4ucmVzdCk7XG4gIH07XG5cbiAgY29uc3QgX2ZpbmQgPSBNb2RlbC5maW5kO1xuICBNb2RlbC5maW5kID0gZnVuY3Rpb24gZmluZERlbGV0ZWQocXVlcnkgPSB7fSwgLi4ucmVzdCkge1xuICAgIGlmICghcXVlcnkuZGVsZXRlZCkge1xuICAgICAgaWYgKCFxdWVyeS53aGVyZSkge1xuICAgICAgICBxdWVyeS53aGVyZSA9IE9iamVjdC5hc3NpZ24oe30sIHF1ZXJ5Tm9uRGVsZXRlZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBxdWVyeS53aGVyZSA9IHsgYW5kOiBbcXVlcnkud2hlcmUsIHF1ZXJ5Tm9uRGVsZXRlZF0gfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gX2ZpbmQuY2FsbChNb2RlbCwgcXVlcnksIC4uLnJlc3QpO1xuICB9O1xuXG4gIGNvbnN0IF9jb3VudCA9IE1vZGVsLmNvdW50O1xuICBNb2RlbC5jb3VudCA9IGZ1bmN0aW9uIGNvdW50RGVsZXRlZCh3aGVyZSA9IHt9LCAuLi5yZXN0KSB7XG4gICAgLy8gQmVjYXVzZSBjb3VudCBvbmx5IHJlY2VpdmVzIGEgJ3doZXJlJywgdGhlcmUncyBub3doZXJlIHRvIGFzayBmb3IgdGhlIGRlbGV0ZWQgZW50aXRpZXMuXG4gICAgY29uc3Qgd2hlcmVOb3REZWxldGVkID0geyBhbmQ6IFt3aGVyZSwgcXVlcnlOb25EZWxldGVkXSB9O1xuICAgIHJldHVybiBfY291bnQuY2FsbChNb2RlbCwgd2hlcmVOb3REZWxldGVkLCAuLi5yZXN0KTtcbiAgfTtcblxuICBjb25zdCBfdXBkYXRlID0gTW9kZWwudXBkYXRlO1xuICBNb2RlbC51cGRhdGUgPSBNb2RlbC51cGRhdGVBbGwgPSBmdW5jdGlvbiB1cGRhdGVEZWxldGVkKHdoZXJlID0ge30sIC4uLnJlc3QpIHtcbiAgICAvLyBCZWNhdXNlIHVwZGF0ZS91cGRhdGVBbGwgb25seSByZWNlaXZlcyBhICd3aGVyZScsIHRoZXJlJ3Mgbm93aGVyZSB0byBhc2sgZm9yIHRoZSBkZWxldGVkIGVudGl0aWVzLlxuICAgIGNvbnN0IHdoZXJlTm90RGVsZXRlZCA9IHsgYW5kOiBbd2hlcmUsIHF1ZXJ5Tm9uRGVsZXRlZF0gfTtcbiAgICByZXR1cm4gX3VwZGF0ZS5jYWxsKE1vZGVsLCB3aGVyZU5vdERlbGV0ZWQsIC4uLnJlc3QpO1xuICB9O1xufTtcbiJdfQ==