db-sql-toolkit
Version:
Helps with SQL statements, database migration, and bulk execution.
200 lines (199 loc) • 38.2 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.migrate = migrate;
var _sql = require("./sql");
var _templateObject, _templateObject2, _templateObject3;
function _taggedTemplateLiteral(e, t) { return t || (t = e.slice(0)), Object.freeze(Object.defineProperties(e, { raw: { value: Object.freeze(t) } })); }
function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i["return"]) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }
function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { if (r) i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n;else { var o = function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); }; o("next", 0), o("throw", 1), o("return", 2); } }, _regeneratorDefine2(e, r, n, t); }
function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); }
function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }
function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; }
function migrate(_x) {
return _migrate.apply(this, arguments);
}
function _migrate() {
_migrate = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(_ref) {
var database, targetVersion, getCurrentVersion, updateVersion, migrationMap, writeLog, getDbVersion, updateDbVersion, currentVersion, sortedMigrationMap, lastMigration, migratedToVersion, _iterator, _step, _step$value, nextVersion, _apply, _t;
return _regenerator().w(function (_context) {
while (1) switch (_context.p = _context.n) {
case 0:
database = _ref.database, targetVersion = _ref.targetVersion, getCurrentVersion = _ref.getCurrentVersion, updateVersion = _ref.updateVersion, migrationMap = _ref.migrationMap, writeLog = _ref.writeLog;
getDbVersion = getCurrentVersion !== null && getCurrentVersion !== void 0 ? getCurrentVersion : defaultGetDbVersion;
updateDbVersion = updateVersion !== null && updateVersion !== void 0 ? updateVersion : defaultUpdateVersion;
_context.n = 1;
return getDbVersion(database);
case 1:
currentVersion = _context.v;
writeLog === null || writeLog === void 0 || writeLog("Current database version: ".concat(currentVersion));
if (!(currentVersion === targetVersion)) {
_context.n = 2;
break;
}
return _context.a(2);
case 2:
sortedMigrationMap = sortMigrationsByVersion(migrationMap);
lastMigration = sortedMigrationMap.at(-1);
if (lastMigration) {
_context.n = 4;
break;
}
if (!(targetVersion !== undefined)) {
_context.n = 3;
break;
}
throw new Error("Target version cannot be reached.");
case 3:
return _context.a(2);
case 4:
targetVersion !== null && targetVersion !== void 0 ? targetVersion : targetVersion = lastMigration[0];
if (!(lastMigration[0] < targetVersion)) {
_context.n = 5;
break;
}
throw new Error("Target version cannot be reached.");
case 5:
migratedToVersion = currentVersion;
_iterator = _createForOfIteratorHelper(sortedMigrationMap);
_context.p = 6;
_iterator.s();
case 7:
if ((_step = _iterator.n()).done) {
_context.n = 11;
break;
}
_step$value = _slicedToArray(_step.value, 2), nextVersion = _step$value[0], _apply = _step$value[1];
if (!(nextVersion > targetVersion)) {
_context.n = 8;
break;
}
return _context.a(3, 11);
case 8:
if (!(currentVersion < nextVersion)) {
_context.n = 10;
break;
}
_context.n = 9;
return _apply(database);
case 9:
migratedToVersion = nextVersion;
case 10:
_context.n = 7;
break;
case 11:
_context.n = 13;
break;
case 12:
_context.p = 12;
_t = _context.v;
_iterator.e(_t);
case 13:
_context.p = 13;
_iterator.f();
return _context.f(13);
case 14:
_context.n = 15;
return updateDbVersion(database, migratedToVersion);
case 15:
writeLog === null || writeLog === void 0 || writeLog("Updated database to version ".concat(migratedToVersion));
case 16:
return _context.a(2);
}
}, _callee, null, [[6, 12, 13, 14]]);
}));
return _migrate.apply(this, arguments);
}
function sortMigrationsByVersion(migrationMap) {
return _toConsumableArray(migrationMap).sort(function (_ref2, _ref3) {
var _ref4 = _slicedToArray(_ref2, 1),
firstVersion = _ref4[0];
var _ref5 = _slicedToArray(_ref3, 1),
secondVersion = _ref5[0];
return firstVersion - secondVersion;
});
}
function defaultGetDbVersion(_x2) {
return _defaultGetDbVersion.apply(this, arguments);
}
function _defaultGetDbVersion() {
_defaultGetDbVersion = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2(database) {
var versions, currentVersion, _t2;
return _regenerator().w(function (_context2) {
while (1) switch (_context2.p = _context2.n) {
case 0:
_context2.p = 0;
_context2.n = 1;
return database.getRows.apply(database, _toConsumableArray((0, _sql.sql)(_templateObject || (_templateObject = _taggedTemplateLiteral(["SELECT version FROM db_version"])))));
case 1:
versions = _context2.v;
if (!(versions.length === 0)) {
_context2.n = 2;
break;
}
return _context2.a(2, -1);
case 2:
currentVersion = versions.map(function (version) {
return version.version;
}).reduce(function (prev, current) {
return Math.max(prev, current);
}, 0);
return _context2.a(2, currentVersion);
case 3:
_context2.p = 3;
_t2 = _context2.v;
_context2.n = 4;
return createDbVersionTable(database);
case 4:
return _context2.a(2, -1);
}
}, _callee2, null, [[0, 3]]);
}));
return _defaultGetDbVersion.apply(this, arguments);
}
function defaultUpdateVersion(_x3, _x4) {
return _defaultUpdateVersion.apply(this, arguments);
}
function _defaultUpdateVersion() {
_defaultUpdateVersion = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3(database, version) {
return _regenerator().w(function (_context3) {
while (1) switch (_context3.n) {
case 0:
_context3.n = 1;
return database.executeSqlCommand.apply(database, _toConsumableArray((0, _sql.sql)(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["INSERT OR REPLACE INTO db_version (version) VALUES (", ")"])), version)));
case 1:
return _context3.a(2);
}
}, _callee3);
}));
return _defaultUpdateVersion.apply(this, arguments);
}
function createDbVersionTable(_x5) {
return _createDbVersionTable.apply(this, arguments);
}
function _createDbVersionTable() {
_createDbVersionTable = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee4(database) {
return _regenerator().w(function (_context4) {
while (1) switch (_context4.n) {
case 0:
_context4.n = 1;
return database.executeSqlCommand.apply(database, _toConsumableArray((0, _sql.sql)(_templateObject3 || (_templateObject3 = _taggedTemplateLiteral(["\n\t\t\tCREATE TABLE IF NOT EXISTS db_version (\n\t\t\t\tversion INTEGER NOT NULL,\n\t\t\t\tPRIMARY KEY (\n\t\t\t\t\tversion\n\t\t\t\t)\n\t\t\t);\n\t\t"])))));
case 1:
return _context4.a(2);
}
}, _callee4);
}));
return _createDbVersionTable.apply(this, arguments);
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfc3FsIiwicmVxdWlyZSIsIl90ZW1wbGF0ZU9iamVjdCIsIl90ZW1wbGF0ZU9iamVjdDIiLCJfdGVtcGxhdGVPYmplY3QzIiwiX3RhZ2dlZFRlbXBsYXRlTGl0ZXJhbCIsImUiLCJ0Iiwic2xpY2UiLCJPYmplY3QiLCJmcmVlemUiLCJkZWZpbmVQcm9wZXJ0aWVzIiwicmF3IiwidmFsdWUiLCJfcmVnZW5lcmF0b3IiLCJyIiwiU3ltYm9sIiwibiIsIml0ZXJhdG9yIiwibyIsInRvU3RyaW5nVGFnIiwiaSIsImMiLCJwcm90b3R5cGUiLCJHZW5lcmF0b3IiLCJ1IiwiY3JlYXRlIiwiX3JlZ2VuZXJhdG9yRGVmaW5lMiIsImYiLCJwIiwieSIsIkciLCJ2IiwiYSIsImQiLCJiaW5kIiwibGVuZ3RoIiwibCIsIlR5cGVFcnJvciIsImNhbGwiLCJkb25lIiwiR2VuZXJhdG9yRnVuY3Rpb24iLCJHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSIsImdldFByb3RvdHlwZU9mIiwic2V0UHJvdG90eXBlT2YiLCJfX3Byb3RvX18iLCJkaXNwbGF5TmFtZSIsInciLCJtIiwiZGVmaW5lUHJvcGVydHkiLCJfcmVnZW5lcmF0b3JEZWZpbmUiLCJlbnVtZXJhYmxlIiwiY29uZmlndXJhYmxlIiwid3JpdGFibGUiLCJfaW52b2tlIiwiX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIiLCJBcnJheSIsImlzQXJyYXkiLCJfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkiLCJfbiIsIkYiLCJzIiwibmV4dCIsIl9zbGljZWRUb0FycmF5IiwiX2FycmF5V2l0aEhvbGVzIiwiX2l0ZXJhYmxlVG9BcnJheUxpbWl0IiwiX25vbkl0ZXJhYmxlUmVzdCIsInB1c2giLCJfdG9Db25zdW1hYmxlQXJyYXkiLCJfYXJyYXlXaXRob3V0SG9sZXMiLCJfaXRlcmFibGVUb0FycmF5IiwiX25vbkl0ZXJhYmxlU3ByZWFkIiwiX2FycmF5TGlrZVRvQXJyYXkiLCJ0b1N0cmluZyIsImNvbnN0cnVjdG9yIiwibmFtZSIsImZyb20iLCJ0ZXN0IiwiYXN5bmNHZW5lcmF0b3JTdGVwIiwiUHJvbWlzZSIsInJlc29sdmUiLCJ0aGVuIiwiX2FzeW5jVG9HZW5lcmF0b3IiLCJhcmd1bWVudHMiLCJhcHBseSIsIl9uZXh0IiwiX3Rocm93IiwibWlncmF0ZSIsIl94IiwiX21pZ3JhdGUiLCJfY2FsbGVlIiwiX3JlZiIsImRhdGFiYXNlIiwidGFyZ2V0VmVyc2lvbiIsImdldEN1cnJlbnRWZXJzaW9uIiwidXBkYXRlVmVyc2lvbiIsIm1pZ3JhdGlvbk1hcCIsIndyaXRlTG9nIiwiZ2V0RGJWZXJzaW9uIiwidXBkYXRlRGJWZXJzaW9uIiwiY3VycmVudFZlcnNpb24iLCJzb3J0ZWRNaWdyYXRpb25NYXAiLCJsYXN0TWlncmF0aW9uIiwibWlncmF0ZWRUb1ZlcnNpb24iLCJfaXRlcmF0b3IiLCJfc3RlcCIsIl9zdGVwJHZhbHVlIiwibmV4dFZlcnNpb24iLCJfYXBwbHkiLCJfdCIsIl9jb250ZXh0IiwiZGVmYXVsdEdldERiVmVyc2lvbiIsImRlZmF1bHRVcGRhdGVWZXJzaW9uIiwiY29uY2F0Iiwic29ydE1pZ3JhdGlvbnNCeVZlcnNpb24iLCJhdCIsInVuZGVmaW5lZCIsIkVycm9yIiwic29ydCIsIl9yZWYyIiwiX3JlZjMiLCJfcmVmNCIsImZpcnN0VmVyc2lvbiIsIl9yZWY1Iiwic2Vjb25kVmVyc2lvbiIsIl94MiIsIl9kZWZhdWx0R2V0RGJWZXJzaW9uIiwiX2NhbGxlZTIiLCJ2ZXJzaW9ucyIsIl90MiIsIl9jb250ZXh0MiIsImdldFJvd3MiLCJzcWwiLCJtYXAiLCJ2ZXJzaW9uIiwicmVkdWNlIiwicHJldiIsImN1cnJlbnQiLCJNYXRoIiwibWF4IiwiY3JlYXRlRGJWZXJzaW9uVGFibGUiLCJfeDMiLCJfeDQiLCJfZGVmYXVsdFVwZGF0ZVZlcnNpb24iLCJfY2FsbGVlMyIsIl9jb250ZXh0MyIsImV4ZWN1dGVTcWxDb21tYW5kIiwiX3g1IiwiX2NyZWF0ZURiVmVyc2lvblRhYmxlIiwiX2NhbGxlZTQiLCJfY29udGV4dDQiXSwic291cmNlcyI6WyIuLi9zcmMvbWlncmF0ZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IERhdGFiYXNlIH0gZnJvbSBcIi4vRGF0YWJhc2VcIjtcbmltcG9ydCB7IHNxbCB9IGZyb20gXCIuL3NxbFwiO1xuXG5pbnRlcmZhY2UgTWlncmF0aW9uT3B0aW9uczxURGF0YWJhc2UgZXh0ZW5kcyBEYXRhYmFzZT4ge1xuXHRkYXRhYmFzZTogVERhdGFiYXNlO1xuXHR0YXJnZXRWZXJzaW9uPzogbnVtYmVyO1xuXHRnZXRDdXJyZW50VmVyc2lvbj86ICgoZGF0YWJhc2U6IFREYXRhYmFzZSkgPT4gUHJvbWlzZTxudW1iZXI+KSB8IG51bGw7XG5cdHVwZGF0ZVZlcnNpb24/OiAoKGRhdGFiYXNlOiBURGF0YWJhc2UsIHZlcnNpb246IG51bWJlcikgPT4gUHJvbWlzZTx2b2lkPikgfCBudWxsO1xuXHRtaWdyYXRpb25NYXA6IE1pZ3JhdGlvbjxURGF0YWJhc2U+W107XG5cdHdyaXRlTG9nPzogKG1lc3NhZ2U6IHN0cmluZykgPT4gdm9pZDtcbn1cblxudHlwZSBNaWdyYXRpb248VERhdGFiYXNlPiA9IFt2ZXJzaW9uOiBudW1iZXIsIGFwcGx5OiAoZGF0YWJhc2U6IFREYXRhYmFzZSkgPT4gUHJvbWlzZTx2b2lkPl07XG5cbmFzeW5jIGZ1bmN0aW9uIG1pZ3JhdGU8VERhdGFiYXNlIGV4dGVuZHMgRGF0YWJhc2U+KHtcblx0ZGF0YWJhc2UsXG5cdHRhcmdldFZlcnNpb24sXG5cdGdldEN1cnJlbnRWZXJzaW9uLFxuXHR1cGRhdGVWZXJzaW9uLFxuXHRtaWdyYXRpb25NYXAsXG5cdHdyaXRlTG9nLFxufTogTWlncmF0aW9uT3B0aW9uczxURGF0YWJhc2U+KTogUHJvbWlzZTx2b2lkPiB7XG5cdGNvbnN0IGdldERiVmVyc2lvbiA9IGdldEN1cnJlbnRWZXJzaW9uID8/IGRlZmF1bHRHZXREYlZlcnNpb247XG5cdGNvbnN0IHVwZGF0ZURiVmVyc2lvbiA9IHVwZGF0ZVZlcnNpb24gPz8gZGVmYXVsdFVwZGF0ZVZlcnNpb247XG5cblx0Y29uc3QgY3VycmVudFZlcnNpb24gPSBhd2FpdCBnZXREYlZlcnNpb24oZGF0YWJhc2UpO1xuXG5cdHdyaXRlTG9nPy4oYEN1cnJlbnQgZGF0YWJhc2UgdmVyc2lvbjogJHtjdXJyZW50VmVyc2lvbn1gKTtcblxuXHRpZiAoY3VycmVudFZlcnNpb24gPT09IHRhcmdldFZlcnNpb24pIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRjb25zdCBzb3J0ZWRNaWdyYXRpb25NYXAgPSBzb3J0TWlncmF0aW9uc0J5VmVyc2lvbihtaWdyYXRpb25NYXApO1xuXHRjb25zdCBsYXN0TWlncmF0aW9uID0gc29ydGVkTWlncmF0aW9uTWFwLmF0KC0xKTtcblxuXHRpZiAoIWxhc3RNaWdyYXRpb24pIHtcblx0XHRpZiAodGFyZ2V0VmVyc2lvbiAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJUYXJnZXQgdmVyc2lvbiBjYW5ub3QgYmUgcmVhY2hlZC5cIik7XG5cdFx0fVxuXG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0dGFyZ2V0VmVyc2lvbiA/Pz0gbGFzdE1pZ3JhdGlvblswXTtcblxuXHRpZiAobGFzdE1pZ3JhdGlvblswXSA8IHRhcmdldFZlcnNpb24pIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJUYXJnZXQgdmVyc2lvbiBjYW5ub3QgYmUgcmVhY2hlZC5cIik7XG5cdH1cblxuXHRsZXQgbWlncmF0ZWRUb1ZlcnNpb24gPSBjdXJyZW50VmVyc2lvbjtcblxuXHRmb3IgKGNvbnN0IFtuZXh0VmVyc2lvbiwgYXBwbHldIG9mIHNvcnRlZE1pZ3JhdGlvbk1hcCkge1xuXHRcdGlmIChuZXh0VmVyc2lvbiA+IHRhcmdldFZlcnNpb24pIHtcblx0XHRcdGJyZWFrO1xuXHRcdH1cblxuXHRcdGlmIChjdXJyZW50VmVyc2lvbiA8IG5leHRWZXJzaW9uKSB7XG5cdFx0XHQvLyBiaW9tZS1pZ25vcmUgbGludC9udXJzZXJ5L25vQXdhaXRJbkxvb3A6IFdlIG5lZWQgdG8ga2VlcCB0aGUgb3JkZXJcblx0XHRcdGF3YWl0IGFwcGx5KGRhdGFiYXNlKTtcblxuXHRcdFx0bWlncmF0ZWRUb1ZlcnNpb24gPSBuZXh0VmVyc2lvbjtcblx0XHR9XG5cdH1cblxuXHRhd2FpdCB1cGRhdGVEYlZlcnNpb24oZGF0YWJhc2UsIG1pZ3JhdGVkVG9WZXJzaW9uKTtcblxuXHR3cml0ZUxvZz8uKGBVcGRhdGVkIGRhdGFiYXNlIHRvIHZlcnNpb24gJHttaWdyYXRlZFRvVmVyc2lvbn1gKTtcbn1cblxuZnVuY3Rpb24gc29ydE1pZ3JhdGlvbnNCeVZlcnNpb248VERhdGFiYXNlPihtaWdyYXRpb25NYXA6IE1pZ3JhdGlvbjxURGF0YWJhc2U+W10pOiBNaWdyYXRpb248VERhdGFiYXNlPltdIHtcblx0cmV0dXJuIFsuLi5taWdyYXRpb25NYXBdLnNvcnQoKFtmaXJzdFZlcnNpb25dLCBbc2Vjb25kVmVyc2lvbl0pID0+IGZpcnN0VmVyc2lvbiAtIHNlY29uZFZlcnNpb24pO1xufVxuXG5pbnRlcmZhY2UgRGJWZXJzaW9uVGFibGUge1xuXHR2ZXJzaW9uOiBudW1iZXI7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRlZmF1bHRHZXREYlZlcnNpb24oZGF0YWJhc2U6IERhdGFiYXNlKTogUHJvbWlzZTxudW1iZXI+IHtcblx0dHJ5IHtcblx0XHRjb25zdCB2ZXJzaW9ucyA9IGF3YWl0IGRhdGFiYXNlLmdldFJvd3M8RGJWZXJzaW9uVGFibGU+KC4uLnNxbGBTRUxFQ1QgdmVyc2lvbiBGUk9NIGRiX3ZlcnNpb25gKTtcblxuXHRcdGlmICh2ZXJzaW9ucy5sZW5ndGggPT09IDApIHtcblx0XHRcdHJldHVybiAtMTtcblx0XHR9XG5cblx0XHRjb25zdCBjdXJyZW50VmVyc2lvbiA9IHZlcnNpb25zLm1hcCgodmVyc2lvbikgPT4gdmVyc2lvbi52ZXJzaW9uKS5yZWR1Y2UoKHByZXYsIGN1cnJlbnQpID0+IE1hdGgubWF4KHByZXYsIGN1cnJlbnQpLCAwKTtcblxuXHRcdHJldHVybiBjdXJyZW50VmVyc2lvbjtcblx0fSBjYXRjaCB7XG5cdFx0YXdhaXQgY3JlYXRlRGJWZXJzaW9uVGFibGUoZGF0YWJhc2UpO1xuXG5cdFx0cmV0dXJuIC0xO1xuXHR9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRlZmF1bHRVcGRhdGVWZXJzaW9uKGRhdGFiYXNlOiBEYXRhYmFzZSwgdmVyc2lvbjogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG5cdGF3YWl0IGRhdGFiYXNlLmV4ZWN1dGVTcWxDb21tYW5kKC4uLnNxbGBJTlNFUlQgT1IgUkVQTEFDRSBJTlRPIGRiX3ZlcnNpb24gKHZlcnNpb24pIFZBTFVFUyAoJHt2ZXJzaW9ufSlgKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY3JlYXRlRGJWZXJzaW9uVGFibGUoZGF0YWJhc2U6IERhdGFiYXNlKTogUHJvbWlzZTx2b2lkPiB7XG5cdGF3YWl0IGRhdGFiYXNlLmV4ZWN1dGVTcWxDb21tYW5kKFxuXHRcdC4uLnNxbGBcblx0XHRcdENSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIGRiX3ZlcnNpb24gKFxuXHRcdFx0XHR2ZXJzaW9uIElOVEVHRVIgTk9UIE5VTEwsXG5cdFx0XHRcdFBSSU1BUlkgS0VZIChcblx0XHRcdFx0XHR2ZXJzaW9uXG5cdFx0XHRcdClcblx0XHRcdCk7XG5cdFx0YCxcblx0KTtcbn1cblxuZXhwb3J0IHR5cGUgeyBNaWdyYXRpb25PcHRpb25zIH07XG5cbmV4cG9ydCB7IG1pZ3JhdGUgfTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQ0EsSUFBQUEsSUFBQSxHQUFBQyxPQUFBO0FBQTRCLElBQUFDLGVBQUEsRUFBQUMsZ0JBQUEsRUFBQUMsZ0JBQUE7QUFBQSxTQUFBQyx1QkFBQUMsQ0FBQSxFQUFBQyxDQUFBLFdBQUFBLENBQUEsS0FBQUEsQ0FBQSxHQUFBRCxDQUFBLENBQUFFLEtBQUEsTUFBQUMsTUFBQSxDQUFBQyxNQUFBLENBQUFELE1BQUEsQ0FBQUUsZ0JBQUEsQ0FBQUwsQ0FBQSxJQUFBTSxHQUFBLElBQUFD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