From b43a0ab82a51f74fa971fdf360b18817f5312b52 Mon Sep 17 00:00:00 2001 From: Andrew Goodale Date: Fri, 22 Jan 2016 09:47:55 -0500 Subject: [PATCH] Object.isFrozen throws an exception when called with 'null'. Use an isObject method that tests for null. Also, ignore functions because they can have recursive members (e.g. constructors). --- dist/react-cursor.js | 118 +++++++++++---------------------------- dist/react-cursor.min.js | 6 +- src/util.js | 6 +- 3 files changed, 41 insertions(+), 89 deletions(-) diff --git a/dist/react-cursor.js b/dist/react-cursor.js index 57cf56c..de08221 100644 --- a/dist/react-cursor.js +++ b/dist/react-cursor.js @@ -66,11 +66,11 @@ return /******/ (function(modules) { // webpackBootstrap var _Cursor2 = _interopRequireDefault(_Cursor); - var _RefCursor = __webpack_require__(15); + var _RefCursor = __webpack_require__(14); var _RefCursor2 = _interopRequireDefault(_RefCursor); - var _ImmutableOptimizations = __webpack_require__(16); + var _ImmutableOptimizations = __webpack_require__(15); var _ImmutableOptimizations2 = _interopRequireDefault(_ImmutableOptimizations); @@ -97,7 +97,7 @@ return /******/ (function(modules) { // webpackBootstrap var _util = __webpack_require__(12); - var _ReactAdapter = __webpack_require__(14); + var _ReactAdapter = __webpack_require__(13); var debug = process.env.NODE_ENV !== 'production'; @@ -597,7 +597,7 @@ return /******/ (function(modules) { // webpackBootstrap * will remain to ensure logic does not differ in production. */ - var invariant = function (condition, format, a, b, c, d, e, f) { + function invariant(condition, format, a, b, c, d, e, f) { if (process.env.NODE_ENV !== 'production') { if (format === undefined) { throw new Error('invariant requires an error message argument'); @@ -611,15 +611,16 @@ return /******/ (function(modules) { // webpackBootstrap } else { var args = [a, b, c, d, e, f]; var argIndex = 0; - error = new Error('Invariant Violation: ' + format.replace(/%s/g, function () { + error = new Error(format.replace(/%s/g, function () { return args[argIndex++]; })); + error.name = 'Invariant Violation'; } error.framesToPop = 1; // we don't care about invariant's own frame throw error; } - }; + } module.exports = invariant; /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2))) @@ -789,10 +790,6 @@ return /******/ (function(modules) { // webpackBootstrap function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } - var _lodashIsobject = __webpack_require__(13); - - var _lodashIsobject2 = _interopRequireDefault(_lodashIsobject); - var _deepEqual = __webpack_require__(9); var _deepEqual2 = _interopRequireDefault(_deepEqual); @@ -881,25 +878,14 @@ return /******/ (function(modules) { // webpackBootstrap /** * Generate a unique thing to use as a memoize resolver hash for reference types. */ - var refsCache = {}; // { id: cmp } + var refsCache = new WeakMap(); var cacheIdIndex = 0; - function refToHash(cmp) { - // search the cmpUniqueMap by reference - have we seen it before? - // if so, use the assigned id as the hash - // if not, add to cache and increment cacheIdIndex as a new ID to hash on - - var cmpsWithUid = pairs(refsCache); - var cmpFound = find(cmpsWithUid, function (cmpAndId) { - return cmpAndId[1] === cmp; - }); - if (cmpFound) { - return cmpFound[0]; // return the uid - } else { - var uid = (cacheIdIndex++).toString(); - refsCache[uid] = cmp; - return uid; - } + function refToHash(o) { + var cachedUid = refsCache.get(o); + var uid = cachedUid || (cacheIdIndex++).toString(); + !cachedUid && refsCache.set(o, uid); + return uid; } var identity = function identity(x) { @@ -923,6 +909,10 @@ return /******/ (function(modules) { // webpackBootstrap }; } + function isObject(value) { + return !!value && typeof value == 'object'; + } + // copy from MDN example: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze#Examples function deepFreeze(obj) { @@ -930,7 +920,7 @@ return /******/ (function(modules) { // webpackBootstrap return obj; } - if (!(0, _lodashIsobject2['default'])(obj)) { + if (!isObject(obj)) { return obj; } @@ -942,7 +932,7 @@ return /******/ (function(modules) { // webpackBootstrap var prop = obj[name]; // Freeze prop if it is an object - if (typeof prop == 'object' && !Object.isFrozen(prop)) { + if (isObject(prop) && !Object.isFrozen(prop)) { deepFreeze(prop); } }); @@ -969,49 +959,6 @@ return /******/ (function(modules) { // webpackBootstrap /***/ }, /* 13 */ -/***/ function(module, exports) { - - /** - * lodash 3.0.2 (Custom Build) - * Build: `lodash modern modularize exports="npm" -o ./` - * Copyright 2012-2015 The Dojo Foundation - * Based on Underscore.js 1.8.3 - * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors - * Available under MIT license - */ - - /** - * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`. - * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) - * - * @static - * @memberOf _ - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is an object, else `false`. - * @example - * - * _.isObject({}); - * // => true - * - * _.isObject([1, 2, 3]); - * // => true - * - * _.isObject(1); - * // => false - */ - function isObject(value) { - // Avoid a V8 JIT bug in Chrome 19-20. - // See https://code.google.com/p/v8/issues/detail?id=2291 for more details. - var type = typeof value; - return !!value && (type == 'object' || type == 'function'); - } - - module.exports = isObject; - - -/***/ }, -/* 14 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -1046,7 +993,7 @@ return /******/ (function(modules) { // webpackBootstrap exports.isReactCmp = isReactCmp; /***/ }, -/* 15 */ +/* 14 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -1061,7 +1008,7 @@ return /******/ (function(modules) { // webpackBootstrap var _updateIn = __webpack_require__(3); - var _ReactAdapter = __webpack_require__(14); + var _ReactAdapter = __webpack_require__(13); var makeRefinedSwap = (0, _util.memoized)(function (swapFn, paths) { return (0, _util.refToHash)(swapFn) + (0, _util.hashRecord)(paths); @@ -1137,7 +1084,7 @@ return /******/ (function(modules) { // webpackBootstrap module.exports = exports['default']; /***/ }, -/* 16 */ +/* 15 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -1148,14 +1095,17 @@ return /******/ (function(modules) { // webpackBootstrap function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } - var _omitKeys = __webpack_require__(17); + var _omitKeys = __webpack_require__(16); var _omitKeys2 = _interopRequireDefault(_omitKeys); var _util = __webpack_require__(12); - function ImmutableOptimizations(refFields, ignoredFields /*optional*/) { - var noValueCheckFields = refFields.concat(ignoredFields || []); + function ImmutableOptimizations() { + var refFields = arguments.length <= 0 || arguments[0] === undefined ? [] : arguments[0]; + var ignoredFields = arguments.length <= 1 || arguments[1] === undefined ? [] : arguments[1]; + + var noValueCheckFields = refFields.concat(ignoredFields); return { shouldComponentUpdate: function shouldComponentUpdate(nextProps) { var _this = this; @@ -1175,7 +1125,7 @@ return /******/ (function(modules) { // webpackBootstrap module.exports = exports['default']; /***/ }, -/* 17 */ +/* 16 */ /***/ function(module, exports, __webpack_require__) { /*! @@ -1187,8 +1137,8 @@ return /******/ (function(modules) { // webpackBootstrap 'use strict'; - var isObject = __webpack_require__(18); - var difference = __webpack_require__(19); + var isObject = __webpack_require__(17); + var difference = __webpack_require__(18); module.exports = function omit(obj, keys) { if (!isObject(obj)) { @@ -1213,7 +1163,7 @@ return /******/ (function(modules) { // webpackBootstrap }; /***/ }, -/* 18 */ +/* 17 */ /***/ function(module, exports) { /*! @@ -1238,7 +1188,7 @@ return /******/ (function(modules) { // webpackBootstrap }; /***/ }, -/* 19 */ +/* 18 */ /***/ function(module, exports, __webpack_require__) { var __WEBPACK_AMD_DEFINE_RESULT__;(function(global) { @@ -1293,4 +1243,4 @@ return /******/ (function(modules) { // webpackBootstrap /******/ ]) }); ; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovLy93ZWJwYWNrL2Jvb3RzdHJhcCBmNDdjODgxN2UyYmQzZDllNDdiZiIsIndlYnBhY2s6Ly8vLi9zcmMvcmVhY3QtY3Vyc29yLmpzIiwid2VicGFjazovLy8uL3NyYy9DdXJzb3IuanMiLCJ3ZWJwYWNrOi8vLy4vfi9wcm9jZXNzL2Jyb3dzZXIuanMiLCJ3ZWJwYWNrOi8vLy4vfi91cGRhdGUtaW4vc3JjL3VwZGF0ZS1pbi5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWN0LWFkZG9ucy11cGRhdGUvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vfi9yZWFjdC9saWIvdXBkYXRlLmpzIiwid2VicGFjazovLy8uL34vcmVhY3QvbGliL09iamVjdC5hc3NpZ24uanMiLCJ3ZWJwYWNrOi8vLy4vfi9mYmpzL2xpYi9rZXlPZi5qcyIsIndlYnBhY2s6Ly8vLi9+L2ZianMvbGliL2ludmFyaWFudC5qcyIsIndlYnBhY2s6Ly8vLi9+L2RlZXAtZXF1YWwvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vfi9kZWVwLWVxdWFsL2xpYi9rZXlzLmpzIiwid2VicGFjazovLy8uL34vZGVlcC1lcXVhbC9saWIvaXNfYXJndW1lbnRzLmpzIiwid2VicGFjazovLy8uL3NyYy91dGlsLmpzIiwid2VicGFjazovLy8uL34vbG9kYXNoLmlzb2JqZWN0L2luZGV4LmpzIiwid2VicGFjazovLy8uL3NyYy9SZWFjdEFkYXB0ZXIuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1JlZkN1cnNvci5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvSW1tdXRhYmxlT3B0aW1pemF0aW9ucy5qcyIsIndlYnBhY2s6Ly8vLi9+L29taXQta2V5cy9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9+L2lzb2JqZWN0L2luZGV4LmpzIiwid2VicGFjazovLy8uL34vYXJyYXktZGlmZmVyZW5jZS9kaWZmZXJlbmNlLmpzIl0sIm5hbWVz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RUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsbUNBQWtDLFdBQVc7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsZ0NBQStCLFdBQVc7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBK0IsV0FBVztBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUU7QUFDRjtBQUNBO0FBQ0EsSUFBRztBQUNILEdBQUU7QUFDRjtBQUNBOztBQUVBLEVBQUMiLCJmaWxlIjoicmVhY3QtY3Vyc29yLmpzIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoW10sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wiUmVhY3RDdXJzb3JcIl0gPSBmYWN0b3J5KCk7XG5cdGVsc2Vcblx0XHRyb290W1wiUmVhY3RDdXJzb3JcIl0gPSBmYWN0b3J5KCk7XG59KSh0aGlzLCBmdW5jdGlvbigpIHtcbnJldHVybiBcblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiB3ZWJwYWNrL3VuaXZlcnNhbE1vZHVsZURlZmluaXRpb25cbiAqKi8iLCIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSlcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcblxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0ZXhwb3J0czoge30sXG4gXHRcdFx0aWQ6IG1vZHVsZUlkLFxuIFx0XHRcdGxvYWRlZDogZmFsc2VcbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubG9hZGVkID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCIvc3RhdGljL1wiO1xuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogd2VicGFjay9ib290c3RyYXAgZjQ3Yzg4MTdlMmJkM2Q5ZTQ3YmZcbiAqKi8iLCJpbXBvcnQgQ3Vyc29yIGZyb20gJy4vQ3Vyc29yJztcbmltcG9ydCBSZWZDdXJzb3IgZnJvbSAnLi9SZWZDdXJzb3InO1xuaW1wb3J0IEltbXV0YWJsZU9wdGltaXphdGlvbnMgZnJvbSAnLi9JbW11dGFibGVPcHRpbWl6YXRpb25zJztcblxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIEN1cnNvcjogQ3Vyc29yLFxuICBJbW11dGFibGVPcHRpbWl6YXRpb25zOiBJbW11dGFibGVPcHRpbWl6YXRpb25zLFxuICBSZWZDdXJzb3I6IFJlZkN1cnNvclxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvcmVhY3QtY3Vyc29yLmpzXG4gKiovIiwiaW1wb3J0IHttZXJnZSwgcHVzaCwgdW5zaGlmdCwgc3BsaWNlfSBmcm9tICd1cGRhdGUtaW4nO1xuaW1wb3J0IHttZW1vaXplZCwgZ2V0SW4sIGhhc2hSZWNvcmQsIHJlZlRvSGFzaCwgZGVlcEZyZWV6ZSwgcm9vdEF0fSBmcm9tICcuL3V0aWwnO1xuaW1wb3J0IHttYWtlU3dhcEZyb21SZWFjdCwgbWFrZVZhbHVlRnJvbVJlYWN0LCBpc1JlYWN0Q21wfSBmcm9tICcuL1JlYWN0QWRhcHRlcic7XG5cblxubGV0IGRlYnVnID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJztcblxuXG5sZXQgbWFrZVJlZmluZWRTd2FwID0gbWVtb2l6ZWQoXG4gIChzd2FwRm4sIHBhdGhzKSA9PiByZWZUb0hhc2goc3dhcEZuKSArIGhhc2hSZWNvcmQocGF0aHMpLFxuICAoc3dhcEZuLCBwYXRocykgPT4gKGYpID0+IHN3YXBGbihyb290QXQocGF0aHMsIGYpKSk7XG5cblxuY2xhc3MgQ3Vyc29yIHtcbiAgY29uc3RydWN0b3IgKHZhbHVlLCBzd2FwRm4pIHtcbiAgICB0aGlzLnZhbHVlID0gKCkgPT4gdmFsdWU7XG4gICAgdGhpcy5yZWZpbmUgPSAoLi4ubW9yZVBhdGhzKSA9PiBOZXdDdXJzb3IoZ2V0SW4odmFsdWUsIG1vcmVQYXRocyksIG1ha2VSZWZpbmVkU3dhcChzd2FwRm4sIG1vcmVQYXRocykpO1xuICAgIHRoaXMuc3dhcCA9IChmLCAuLi5hcmdzKSA9PiBzd2FwRm4oKHYpID0+IGYuYXBwbHkobnVsbCwgW3ZdLmNvbmNhdChhcmdzKSkpO1xuXG4gICAgdGhpcy5zZXQgPSAodmFsKSA9PiB0aGlzLnN3YXAodiA9PiB2YWwpO1xuICAgIHRoaXMubWVyZ2UgPSAodmFsKSA9PiB0aGlzLnN3YXAobWVyZ2UsIHZhbCk7XG4gICAgdGhpcy5wdXNoID0gKHhzKSA9PiB0aGlzLnN3YXAocHVzaCwgeHMpO1xuICAgIHRoaXMudW5zaGlmdCA9ICh4cykgPT4gdGhpcy5zd2FwKHVuc2hpZnQsIHhzKTtcbiAgICB0aGlzLnNwbGljZSA9ICh4cykgPT4gdGhpcy5zd2FwKHNwbGljZSwgeHMpO1xuXG4gICAgZGVidWcgJiYgZGVlcEZyZWV6ZSh2YWx1ZSk7XG4gIH1cbn1cblxuXG5sZXQgTmV3Q3Vyc29yID0gbWVtb2l6ZWQoXG4gICAgKHZhbHVlLCBzd2FwKSA9PiByZWZUb0hhc2goc3dhcCkgKyBoYXNoUmVjb3JkKHZhbHVlKSxcbiAgICAodmFsdWUsIHN3YXApID0+IG5ldyBDdXJzb3IodmFsdWUsIHN3YXApKTtcblxuXG5DdXJzb3IuYnVpbGQgPSAodmFsdWUsIHN3YXApID0+IGlzUmVhY3RDbXAodmFsdWUpXG4gICAgPyBOZXdDdXJzb3IobWFrZVZhbHVlRnJvbVJlYWN0KHZhbHVlKSwgbWFrZVN3YXBGcm9tUmVhY3QodmFsdWUpKVxuICAgIDogTmV3Q3Vyc29yKHZhbHVlLCBzd2FwKTtcblxuXG5leHBvcnQgZGVmYXVsdCBDdXJzb3I7XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9DdXJzb3IuanNcbiAqKi8iLCIvLyBzaGltIGZvciB1c2luZyBwcm9jZXNzIGluIGJyb3dzZXJcblxudmFyIHByb2Nlc3MgPSBtb2R1bGUuZXhwb3J0cyA9IHt9O1xudmFyIHF1ZXVlID0gW107XG52YXIgZHJhaW5pbmcgPSBmYWxzZTtcbnZhciBjdXJyZW50UXVldWU7XG52YXIgcXVldWVJbmRleCA9IC0xO1xuXG5mdW5jdGlvbiBjbGVhblVwTmV4dFRpY2soKSB7XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBpZiAoY3VycmVudFF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBxdWV1ZSA9IGN1cnJlbnRRdWV1ZS5jb25jYXQocXVldWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICB9XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBkcmFpblF1ZXVlKCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBkcmFpblF1ZXVlKCkge1xuICAgIGlmIChkcmFpbmluZykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciB0aW1lb3V0ID0gc2V0VGltZW91dChjbGVhblVwTmV4dFRpY2spO1xuICAgIGRyYWluaW5nID0gdHJ1ZTtcblxuICAgIHZhciBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgd2hpbGUobGVuKSB7XG4gICAgICAgIGN1cnJlbnRRdWV1ZSA9IHF1ZXVlO1xuICAgICAgICBxdWV1ZSA9IFtdO1xuICAgICAgICB3aGlsZSAoKytxdWV1ZUluZGV4IDwgbGVuKSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudFF1ZXVlKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudFF1ZXVlW3F1ZXVlSW5kZXhdLnJ1bigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICAgICAgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIH1cbiAgICBjdXJyZW50UXVldWUgPSBudWxsO1xuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xufVxuXG5wcm9jZXNzLm5leHRUaWNrID0gZnVuY3Rpb24gKGZ1bikge1xuICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGggLSAxKTtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGFyZ3NbaSAtIDFdID0gYXJndW1lbnRzW2ldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHF1ZXVlLnB1c2gobmV3IEl0ZW0oZnVuLCBhcmdzKSk7XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCA9PT0gMSAmJiAhZHJhaW5pbmcpIHtcbiAgICAgICAgc2V0VGltZW91dChkcmFpblF1ZXVlLCAwKTtcbiAgICB9XG59O1xuXG4vLyB2OCBsaWtlcyBwcmVkaWN0aWJsZSBvYmplY3RzXG5mdW5jdGlvbiBJdGVtKGZ1biwgYXJyYXkpIHtcbiAgICB0aGlzLmZ1biA9IGZ1bjtcbiAgICB0aGlzLmFycmF5ID0gYXJyYXk7XG59XG5JdGVtLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5mdW4uYXBwbHkobnVsbCwgdGhpcy5hcnJheSk7XG59O1xucHJvY2Vzcy50aXRsZSA9ICdicm93c2VyJztcbnByb2Nlc3MuYnJvd3NlciA9IHRydWU7XG5wcm9jZXNzLmVudiA9IHt9O1xucHJvY2Vzcy5hcmd2ID0gW107XG5wcm9jZXNzLnZlcnNpb24gPSAnJzsgLy8gZW1wdHkgc3RyaW5nIHRvIGF2b2lkIHJlZ2V4cCBpc3N1ZXNcbnByb2Nlc3MudmVyc2lvbnMgPSB7fTtcblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbnByb2Nlc3Mub24gPSBub29wO1xucHJvY2Vzcy5hZGRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLm9uY2UgPSBub29wO1xucHJvY2Vzcy5vZmYgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUFsbExpc3RlbmVycyA9IG5vb3A7XG5wcm9jZXNzLmVtaXQgPSBub29wO1xuXG5wcm9jZXNzLmJpbmRpbmcgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5cbnByb2Nlc3MuY3dkID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gJy8nIH07XG5wcm9jZXNzLmNoZGlyID0gZnVuY3Rpb24gKGRpcikge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5jaGRpciBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xucHJvY2Vzcy51bWFzayA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gMDsgfTtcblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L3Byb2Nlc3MvYnJvd3Nlci5qc1xuICoqIG1vZHVsZSBpZCA9IDJcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsImltcG9ydCB7ZGVmYXVsdCBhcyBwZXJzaXN0ZW50VXBkYXRlfSBmcm9tICdyZWFjdC1hZGRvbnMtdXBkYXRlJztcbmltcG9ydCBpc0VxdWFsIGZyb20gJ2RlZXAtZXF1YWwnO1xuXG5cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZSAoYSwgYikge1xuICByZXR1cm4gcGVyc2lzdGVudFVwZGF0ZShhLCB7JG1lcmdlOiBifSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwdXNoIChhcywgYnMpIHtcbiAgcmV0dXJuIHBlcnNpc3RlbnRVcGRhdGUoYXMsIHskcHVzaDogYnN9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVuc2hpZnQgKGFzLCBicykge1xuICByZXR1cm4gcGVyc2lzdGVudFVwZGF0ZShhcywgeyR1bnNoaWZ0OiBic30pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3BsaWNlIChhcywgc3BsaWNlcykge1xuICAvLyBwZXJzaXN0ZW50VXBkYXRlKFsxMiwgMTcsIDE1XSwgeyRzcGxpY2U6IFtbMSwgMSwgMTMsIDE0XV19KSA9PiBbMTIsIDEzLCAxNCwgMTVdXG4gIHJldHVybiBwZXJzaXN0ZW50VXBkYXRlKGFzLCB7JHNwbGljZTogc3BsaWNlc30pO1xufVxuXG5cbi8qKlxuICogVGhpbiB3cmFwcGVyIG92ZXIgcmVhY3QtYWRkb25zLXVwZGF0ZSB0byBhcHBseSBhIGZ1bmN0aW9uIGF0IHBhdGhcbiAqIHByZXNlcnZpbmcgb3RoZXIgcmVmZXJlbmNlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUluIChyb290VmFsLCBwYXRocywgZiwgLi4uYXJncykge1xuICBsZXQgZmYgPSAodikgPT4gZi5hcHBseShudWxsLCBbdl0uY29uY2F0KGFyZ3MpKTtcblxuICB2YXIgbmV3Um9vdFZhbDtcbiAgaWYgKHBhdGhzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBjb21tYW5kID0gcm9vdEF0KHBhdGhzLCB7JGFwcGx5OiBmZn0pO1xuICAgIG5ld1Jvb3RWYWwgPSBwZXJzaXN0ZW50VXBkYXRlKHJvb3RWYWwsIGNvbW1hbmQpO1xuICB9XG4gIGVsc2UgaWYgKHBhdGhzLmxlbmd0aCA9PT0gMCkge1xuICAgIG5ld1Jvb3RWYWwgPSBmZihyb290VmFsKTtcbiAgfVxuXG4gIC8vIHdvdWxkIGJlIGJldHRlciB0byBkbyB0aGlzIHZhbEVxIGNoZWNrIG9uIGp1c3QgdGhlIGxlYWZcbiAgcmV0dXJuIGlzRXF1YWwocm9vdFZhbCwgbmV3Um9vdFZhbClcbiAgICAgID8gcm9vdFZhbCAvLyBwcmVzZXJ2ZSA9PT0gaWYgc2FtZSB2YWx1ZVxuICAgICAgOiBuZXdSb290VmFsO1xufVxuXG5cblxuLy8gSGVscGVyIG1ldGhvZHMgZm9yIGZvcm1pbmcgcmVhY3QtYWRkb25zLXVwZGF0ZSBjb21tYW5kcy5cblxuLyoqXG4gKiBAcGFyYW0gbGVhZlZhbCBlLmcuIHskYXBwbHk6IGZ9XG4gKiBAcGFyYW0gcGF0aHMgZS5nLiBbJ3gnLCAneScsICd6J11cbiAqIEByZXR1cm5zIGUuZy4ge3g6IHt5OiB7ejogeyRhcHBseTogZn19fVxuICovXG5mdW5jdGlvbiByb290QXQgKHBhdGhzLCBsZWFmVmFsKSB7XG4gIHJldHVybiBwYXRocy5yZWR1Y2VSaWdodCh1bkRlcmVmLCBsZWFmVmFsKVxufVxuXG5cbi8qKlxuICogQHBhcmFtIG9iaiBlLmcgeyRhcHBseTogZn1cbiAqIEBwYXJhbSBrZXkgZS5nLiAnZm9vJ1xuICogQHJldHVybnMgZS5nLiB7Zm9vOiB7JGFwcGx5OiBmfX1cbiAqL1xuZnVuY3Rpb24gdW5EZXJlZihvYmosIGtleSkgeyAvLyBha2EgdW4tZ2V0XG4gIHZhciBuZXh0T2JqID0ge307XG4gIG5leHRPYmpba2V5XSA9IG9iajtcbiAgcmV0dXJuIG5leHRPYmo7XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL34vdXBkYXRlLWluL3NyYy91cGRhdGUtaW4uanNcbiAqKi8iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJ3JlYWN0L2xpYi91cGRhdGUnKTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9yZWFjdC1hZGRvbnMtdXBkYXRlL2luZGV4LmpzXG4gKiogbW9kdWxlIGlkID0gNFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy0yMDE1LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogQHByb3ZpZGVzTW9kdWxlIHVwZGF0ZVxuICovXG5cbi8qIGdsb2JhbCBoYXNPd25Qcm9wZXJ0eTp0cnVlICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIGFzc2lnbiA9IHJlcXVpcmUoJy4vT2JqZWN0LmFzc2lnbicpO1xudmFyIGtleU9mID0gcmVxdWlyZSgnZmJqcy9saWIva2V5T2YnKTtcbnZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTtcbnZhciBoYXNPd25Qcm9wZXJ0eSA9ICh7fSkuaGFzT3duUHJvcGVydHk7XG5cbmZ1bmN0aW9uIHNoYWxsb3dDb3B5KHgpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoeCkpIHtcbiAgICByZXR1cm4geC5jb25jYXQoKTtcbiAgfSBlbHNlIGlmICh4ICYmIHR5cGVvZiB4ID09PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBhc3NpZ24obmV3IHguY29uc3RydWN0b3IoKSwgeCk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHg7XG4gIH1cbn1cblxudmFyIENPTU1BTkRfUFVTSCA9IGtleU9mKHsgJHB1c2g6IG51bGwgfSk7XG52YXIgQ09NTUFORF9VTlNISUZUID0ga2V5T2YoeyAkdW5zaGlmdDogbnVsbCB9KTtcbnZhciBDT01NQU5EX1NQTElDRSA9IGtleU9mKHsgJHNwbGljZTogbnVsbCB9KTtcbnZhciBDT01NQU5EX1NFVCA9IGtleU9mKHsgJHNldDogbnVsbCB9KTtcbnZhciBDT01NQU5EX01FUkdFID0ga2V5T2YoeyAkbWVyZ2U6IG51bGwgfSk7XG52YXIgQ09NTUFORF9BUFBMWSA9IGtleU9mKHsgJGFwcGx5OiBudWxsIH0pO1xuXG52YXIgQUxMX0NPTU1BTkRTX0xJU1QgPSBbQ09NTUFORF9QVVNILCBDT01NQU5EX1VOU0hJRlQsIENPTU1BTkRfU1BMSUNFLCBDT01NQU5EX1NFVCwgQ09NTUFORF9NRVJHRSwgQ09NTUFORF9BUFBMWV07XG5cbnZhciBBTExfQ09NTUFORFNfU0VUID0ge307XG5cbkFMTF9DT01NQU5EU19MSVNULmZvckVhY2goZnVuY3Rpb24gKGNvbW1hbmQpIHtcbiAgQUxMX0NPTU1BTkRTX1NFVFtjb21tYW5kXSA9IHRydWU7XG59KTtcblxuZnVuY3Rpb24gaW52YXJpYW50QXJyYXlDYXNlKHZhbHVlLCBzcGVjLCBjb21tYW5kKSB7XG4gICFBcnJheS5pc0FycmF5KHZhbHVlKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICd1cGRhdGUoKTogZXhwZWN0ZWQgdGFyZ2V0IG9mICVzIHRvIGJlIGFuIGFycmF5OyBnb3QgJXMuJywgY29tbWFuZCwgdmFsdWUpIDogaW52YXJpYW50KGZhbHNlKSA6IHVuZGVmaW5lZDtcbiAgdmFyIHNwZWNWYWx1ZSA9IHNwZWNbY29tbWFuZF07XG4gICFBcnJheS5pc0FycmF5KHNwZWNWYWx1ZSkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAndXBkYXRlKCk6IGV4cGVjdGVkIHNwZWMgb2YgJXMgdG8gYmUgYW4gYXJyYXk7IGdvdCAlcy4gJyArICdEaWQgeW91IGZvcmdldCB0byB3cmFwIHlvdXIgcGFyYW1ldGVyIGluIGFuIGFycmF5PycsIGNvbW1hbmQsIHNwZWNWYWx1ZSkgOiBpbnZhcmlhbnQoZmFsc2UpIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiB1cGRhdGUodmFsdWUsIHNwZWMpIHtcbiAgISh0eXBlb2Ygc3BlYyA9PT0gJ29iamVjdCcpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ3VwZGF0ZSgpOiBZb3UgcHJvdmlkZWQgYSBrZXkgcGF0aCB0byB1cGRhdGUoKSB0aGF0IGRpZCBub3QgY29udGFpbiBvbmUgJyArICdvZiAlcy4gRGlkIHlvdSBmb3JnZXQgdG8gaW5jbHVkZSB7JXM6IC4uLn0/JywgQUxMX0NPTU1BTkRTX0xJU1Quam9pbignLCAnKSwgQ09NTUFORF9TRVQpIDogaW52YXJpYW50KGZhbHNlKSA6IHVuZGVmaW5lZDtcblxuICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChzcGVjLCBDT01NQU5EX1NFVCkpIHtcbiAgICAhKE9iamVjdC5rZXlzKHNwZWMpLmxlbmd0aCA9PT0gMSkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnQ2Fubm90IGhhdmUgbW9yZSB0aGFuIG9uZSBrZXkgaW4gYW4gb2JqZWN0IHdpdGggJXMnLCBDT01NQU5EX1NFVCkgOiBpbnZhcmlhbnQoZmFsc2UpIDogdW5kZWZpbmVkO1xuXG4gICAgcmV0dXJuIHNwZWNbQ09NTUFORF9TRVRdO1xuICB9XG5cbiAgdmFyIG5leHRWYWx1ZSA9IHNoYWxsb3dDb3B5KHZhbHVlKTtcblxuICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChzcGVjLCBDT01NQU5EX01FUkdFKSkge1xuICAgIHZhciBtZXJnZU9iaiA9IHNwZWNbQ09NTUFORF9NRVJHRV07XG4gICAgIShtZXJnZU9iaiAmJiB0eXBlb2YgbWVyZ2VPYmogPT09ICdvYmplY3QnKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICd1cGRhdGUoKTogJXMgZXhwZWN0cyBhIHNwZWMgb2YgdHlwZSBcXCdvYmplY3RcXCc7IGdvdCAlcycsIENPTU1BTkRfTUVSR0UsIG1lcmdlT2JqKSA6IGludmFyaWFudChmYWxzZSkgOiB1bmRlZmluZWQ7XG4gICAgIShuZXh0VmFsdWUgJiYgdHlwZW9mIG5leHRWYWx1ZSA9PT0gJ29iamVjdCcpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ3VwZGF0ZSgpOiAlcyBleHBlY3RzIGEgdGFyZ2V0IG9mIHR5cGUgXFwnb2JqZWN0XFwnOyBnb3QgJXMnLCBDT01NQU5EX01FUkdFLCBuZXh0VmFsdWUpIDogaW52YXJpYW50KGZhbHNlKSA6IHVuZGVmaW5lZDtcbiAgICBhc3NpZ24obmV4dFZhbHVlLCBzcGVjW0NPTU1BTkRfTUVSR0VdKTtcbiAgfVxuXG4gIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHNwZWMsIENPTU1BTkRfUFVTSCkpIHtcbiAgICBpbnZhcmlhbnRBcnJheUNhc2UodmFsdWUsIHNwZWMsIENPTU1BTkRfUFVTSCk7XG4gICAgc3BlY1tDT01NQU5EX1BVU0hdLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIG5leHRWYWx1ZS5wdXNoKGl0ZW0pO1xuICAgIH0pO1xuICB9XG5cbiAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoc3BlYywgQ09NTUFORF9VTlNISUZUKSkge1xuICAgIGludmFyaWFudEFycmF5Q2FzZSh2YWx1ZSwgc3BlYywgQ09NTUFORF9VTlNISUZUKTtcbiAgICBzcGVjW0NPTU1BTkRfVU5TSElGVF0uZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgbmV4dFZhbHVlLnVuc2hpZnQoaXRlbSk7XG4gICAgfSk7XG4gIH1cblxuICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChzcGVjLCBDT01NQU5EX1NQTElDRSkpIHtcbiAgICAhQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnRXhwZWN0ZWQgJXMgdGFyZ2V0IHRvIGJlIGFuIGFycmF5OyBnb3QgJXMnLCBDT01NQU5EX1NQTElDRSwgdmFsdWUpIDogaW52YXJpYW50KGZhbHNlKSA6IHVuZGVmaW5lZDtcbiAgICAhQXJyYXkuaXNBcnJheShzcGVjW0NPTU1BTkRfU1BMSUNFXSkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAndXBkYXRlKCk6IGV4cGVjdGVkIHNwZWMgb2YgJXMgdG8gYmUgYW4gYXJyYXkgb2YgYXJyYXlzOyBnb3QgJXMuICcgKyAnRGlkIHlvdSBmb3JnZXQgdG8gd3JhcCB5b3VyIHBhcmFtZXRlcnMgaW4gYW4gYXJyYXk/JywgQ09NTUFORF9TUExJQ0UsIHNwZWNbQ09NTUFORF9TUExJQ0VdKSA6IGludmFyaWFudChmYWxzZSkgOiB1bmRlZmluZWQ7XG4gICAgc3BlY1tDT01NQU5EX1NQTElDRV0uZm9yRWFjaChmdW5jdGlvbiAoYXJncykge1xuICAgICAgIUFycmF5LmlzQXJyYXkoYXJncykgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAndXBkYXRlKCk6IGV4cGVjdGVkIHNwZWMgb2YgJXMgdG8gYmUgYW4gYXJyYXkgb2YgYXJyYXlzOyBnb3QgJXMuICcgKyAnRGlkIHlvdSBmb3JnZXQgdG8gd3JhcCB5b3VyIHBhcmFtZXRlcnMgaW4gYW4gYXJyYXk/JywgQ09NTUFORF9TUExJQ0UsIHNwZWNbQ09NTUFORF9TUExJQ0VdKSA6IGludmFyaWFudChmYWxzZSkgOiB1bmRlZmluZWQ7XG4gICAgICBuZXh0VmFsdWUuc3BsaWNlLmFwcGx5KG5leHRWYWx1ZSwgYXJncyk7XG4gICAgfSk7XG4gIH1cblxuICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChzcGVjLCBDT01NQU5EX0FQUExZKSkge1xuICAgICEodHlwZW9mIHNwZWNbQ09NTUFORF9BUFBMWV0gPT09ICdmdW5jdGlvbicpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ3VwZGF0ZSgpOiBleHBlY3RlZCBzcGVjIG9mICVzIHRvIGJlIGEgZnVuY3Rpb247IGdvdCAlcy4nLCBDT01NQU5EX0FQUExZLCBzcGVjW0NPTU1BTkRfQVBQTFldKSA6IGludmFyaWFudChmYWxzZSkgOiB1bmRlZmluZWQ7XG4gICAgbmV4dFZhbHVlID0gc3BlY1tDT01NQU5EX0FQUExZXShuZXh0VmFsdWUpO1xuICB9XG5cbiAgZm9yICh2YXIgayBpbiBzcGVjKSB7XG4gICAgaWYgKCEoQUxMX0NPTU1BTkRTX1NFVC5oYXNPd25Qcm9wZXJ0eShrKSAmJiBBTExfQ09NTUFORFNfU0VUW2tdKSkge1xuICAgICAgbmV4dFZhbHVlW2tdID0gdXBkYXRlKHZhbHVlW2tdLCBzcGVjW2tdKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV4dFZhbHVlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHVwZGF0ZTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9yZWFjdC9saWIvdXBkYXRlLmpzXG4gKiogbW9kdWxlIGlkID0gNVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxNC0yMDE1LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogQHByb3ZpZGVzTW9kdWxlIE9iamVjdC5hc3NpZ25cbiAqL1xuXG4vLyBodHRwczovL3Blb3BsZS5tb3ppbGxhLm9yZy9+am9yZW5kb3JmZi9lczYtZHJhZnQuaHRtbCNzZWMtb2JqZWN0LmFzc2lnblxuXG4ndXNlIHN0cmljdCc7XG5cbmZ1bmN0aW9uIGFzc2lnbih0YXJnZXQsIHNvdXJjZXMpIHtcbiAgaWYgKHRhcmdldCA9PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignT2JqZWN0LmFzc2lnbiB0YXJnZXQgY2Fubm90IGJlIG51bGwgb3IgdW5kZWZpbmVkJyk7XG4gIH1cblxuICB2YXIgdG8gPSBPYmplY3QodGFyZ2V0KTtcbiAgdmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcblxuICBmb3IgKHZhciBuZXh0SW5kZXggPSAxOyBuZXh0SW5kZXggPCBhcmd1bWVudHMubGVuZ3RoOyBuZXh0SW5kZXgrKykge1xuICAgIHZhciBuZXh0U291cmNlID0gYXJndW1lbnRzW25leHRJbmRleF07XG4gICAgaWYgKG5leHRTb3VyY2UgPT0gbnVsbCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgdmFyIGZyb20gPSBPYmplY3QobmV4dFNvdXJjZSk7XG5cbiAgICAvLyBXZSBkb24ndCBjdXJyZW50bHkgc3VwcG9ydCBhY2Nlc3NvcnMgbm9yIHByb3hpZXMuIFRoZXJlZm9yZSB0aGlzXG4gICAgLy8gY29weSBjYW5ub3QgdGhyb3cuIElmIHdlIGV2ZXIgc3VwcG9ydGVkIHRoaXMgdGhlbiB3ZSBtdXN0IGhhbmRsZVxuICAgIC8vIGV4Y2VwdGlvbnMgYW5kIHNpZGUtZWZmZWN0cy4gV2UgZG9uJ3Qgc3VwcG9ydCBzeW1ib2xzIHNvIHRoZXkgd29uJ3RcbiAgICAvLyBiZSB0cmFuc2ZlcnJlZC5cblxuICAgIGZvciAodmFyIGtleSBpbiBmcm9tKSB7XG4gICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChmcm9tLCBrZXkpKSB7XG4gICAgICAgIHRvW2tleV0gPSBmcm9tW2tleV07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRvO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFzc2lnbjtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9yZWFjdC9saWIvT2JqZWN0LmFzc2lnbi5qc1xuICoqIG1vZHVsZSBpZCA9IDZcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtMjAxNSwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIEBwcm92aWRlc01vZHVsZSBrZXlPZlxuICovXG5cbi8qKlxuICogQWxsb3dzIGV4dHJhY3Rpb24gb2YgYSBtaW5pZmllZCBrZXkuIExldCdzIHRoZSBidWlsZCBzeXN0ZW0gbWluaWZ5IGtleXNcbiAqIHdpdGhvdXQgbG9zaW5nIHRoZSBhYmlsaXR5IHRvIGR5bmFtaWNhbGx5IHVzZSBrZXkgc3RyaW5ncyBhcyB2YWx1ZXNcbiAqIHRoZW1zZWx2ZXMuIFBhc3MgaW4gYW4gb2JqZWN0IHdpdGggYSBzaW5nbGUga2V5L3ZhbCBwYWlyIGFuZCBpdCB3aWxsIHJldHVyblxuICogeW91IHRoZSBzdHJpbmcga2V5IG9mIHRoYXQgc2luZ2xlIHJlY29yZC4gU3VwcG9zZSB5b3Ugd2FudCB0byBncmFiIHRoZVxuICogdmFsdWUgZm9yIGEga2V5ICdjbGFzc05hbWUnIGluc2lkZSBvZiBhbiBvYmplY3QuIEtleS92YWwgbWluaWZpY2F0aW9uIG1heVxuICogaGF2ZSBhbGlhc2VkIHRoYXQga2V5IHRvIGJlICd4YTEyJy4ga2V5T2Yoe2NsYXNzTmFtZTogbnVsbH0pIHdpbGwgcmV0dXJuXG4gKiAneGExMicgaW4gdGhhdCBjYXNlLiBSZXNvbHZlIGtleXMgeW91IHdhbnQgdG8gdXNlIG9uY2UgYXQgc3RhcnR1cCB0aW1lLCB0aGVuXG4gKiByZXVzZSB0aG9zZSByZXNvbHV0aW9ucy5cbiAqL1xuXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBrZXlPZiA9IGZ1bmN0aW9uIChvbmVLZXlPYmopIHtcbiAgdmFyIGtleTtcbiAgZm9yIChrZXkgaW4gb25lS2V5T2JqKSB7XG4gICAgaWYgKCFvbmVLZXlPYmouaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHJldHVybiBrZXk7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGtleU9mO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2ZianMvbGliL2tleU9mLmpzXG4gKiogbW9kdWxlIGlkID0gN1xuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy0yMDE1LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogQHByb3ZpZGVzTW9kdWxlIGludmFyaWFudFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBVc2UgaW52YXJpYW50KCkgdG8gYXNzZXJ0IHN0YXRlIHdoaWNoIHlvdXIgcHJvZ3JhbSBhc3N1bWVzIHRvIGJlIHRydWUuXG4gKlxuICogUHJvdmlkZSBzcHJpbnRmLXN0eWxlIGZvcm1hdCAob25seSAlcyBpcyBzdXBwb3J0ZWQpIGFuZCBhcmd1bWVudHNcbiAqIHRvIHByb3ZpZGUgaW5mb3JtYXRpb24gYWJvdXQgd2hhdCBicm9rZSBhbmQgd2hhdCB5b3Ugd2VyZVxuICogZXhwZWN0aW5nLlxuICpcbiAqIFRoZSBpbnZhcmlhbnQgbWVzc2FnZSB3aWxsIGJlIHN0cmlwcGVkIGluIHByb2R1Y3Rpb24sIGJ1dCB0aGUgaW52YXJpYW50XG4gKiB3aWxsIHJlbWFpbiB0byBlbnN1cmUgbG9naWMgZG9lcyBub3QgZGlmZmVyIGluIHByb2R1Y3Rpb24uXG4gKi9cblxudmFyIGludmFyaWFudCA9IGZ1bmN0aW9uIChjb25kaXRpb24sIGZvcm1hdCwgYSwgYiwgYywgZCwgZSwgZikge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGlmIChmb3JtYXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhcmlhbnQgcmVxdWlyZXMgYW4gZXJyb3IgbWVzc2FnZSBhcmd1bWVudCcpO1xuICAgIH1cbiAgfVxuXG4gIGlmICghY29uZGl0aW9uKSB7XG4gICAgdmFyIGVycm9yO1xuICAgIGlmIChmb3JtYXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgZXJyb3IgPSBuZXcgRXJyb3IoJ01pbmlmaWVkIGV4Y2VwdGlvbiBvY2N1cnJlZDsgdXNlIHRoZSBub24tbWluaWZpZWQgZGV2IGVudmlyb25tZW50ICcgKyAnZm9yIHRoZSBmdWxsIGVycm9yIG1lc3NhZ2UgYW5kIGFkZGl0aW9uYWwgaGVscGZ1bCB3YXJuaW5ncy4nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGFyZ3MgPSBbYSwgYiwgYywgZCwgZSwgZl07XG4gICAgICB2YXIgYXJnSW5kZXggPSAwO1xuICAgICAgZXJyb3IgPSBuZXcgRXJyb3IoJ0ludmFyaWFudCBWaW9sYXRpb246ICcgKyBmb3JtYXQucmVwbGFjZSgvJXMvZywgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gYXJnc1thcmdJbmRleCsrXTtcbiAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBlcnJvci5mcmFtZXNUb1BvcCA9IDE7IC8vIHdlIGRvbid0IGNhcmUgYWJvdXQgaW52YXJpYW50J3Mgb3duIGZyYW1lXG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gaW52YXJpYW50O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2ZianMvbGliL2ludmFyaWFudC5qc1xuICoqIG1vZHVsZSBpZCA9IDhcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciBwU2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7XG52YXIgb2JqZWN0S2V5cyA9IHJlcXVpcmUoJy4vbGliL2tleXMuanMnKTtcbnZhciBpc0FyZ3VtZW50cyA9IHJlcXVpcmUoJy4vbGliL2lzX2FyZ3VtZW50cy5qcycpO1xuXG52YXIgZGVlcEVxdWFsID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYWN0dWFsLCBleHBlY3RlZCwgb3B0cykge1xuICBpZiAoIW9wdHMpIG9wdHMgPSB7fTtcbiAgLy8gNy4xLiBBbGwgaWRlbnRpY2FsIHZhbHVlcyBhcmUgZXF1aXZhbGVudCwgYXMgZGV0ZXJtaW5lZCBieSA9PT0uXG4gIGlmIChhY3R1YWwgPT09IGV4cGVjdGVkKSB7XG4gICAgcmV0dXJuIHRydWU7XG5cbiAgfSBlbHNlIGlmIChhY3R1YWwgaW5zdGFuY2VvZiBEYXRlICYmIGV4cGVjdGVkIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgIHJldHVybiBhY3R1YWwuZ2V0VGltZSgpID09PSBleHBlY3RlZC5nZXRUaW1lKCk7XG5cbiAgLy8gNy4zLiBPdGhlciBwYWlycyB0aGF0IGRvIG5vdCBib3RoIHBhc3MgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnLFxuICAvLyBlcXVpdmFsZW5jZSBpcyBkZXRlcm1pbmVkIGJ5ID09LlxuICB9IGVsc2UgaWYgKHR5cGVvZiBhY3R1YWwgIT0gJ29iamVjdCcgJiYgdHlwZW9mIGV4cGVjdGVkICE9ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIG9wdHMuc3RyaWN0ID8gYWN0dWFsID09PSBleHBlY3RlZCA6IGFjdHVhbCA9PSBleHBlY3RlZDtcblxuICAvLyA3LjQuIEZvciBhbGwgb3RoZXIgT2JqZWN0IHBhaXJzLCBpbmNsdWRpbmcgQXJyYXkgb2JqZWN0cywgZXF1aXZhbGVuY2UgaXNcbiAgLy8gZGV0ZXJtaW5lZCBieSBoYXZpbmcgdGhlIHNhbWUgbnVtYmVyIG9mIG93bmVkIHByb3BlcnRpZXMgKGFzIHZlcmlmaWVkXG4gIC8vIHdpdGggT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKSwgdGhlIHNhbWUgc2V0IG9mIGtleXNcbiAgLy8gKGFsdGhvdWdoIG5vdCBuZWNlc3NhcmlseSB0aGUgc2FtZSBvcmRlciksIGVxdWl2YWxlbnQgdmFsdWVzIGZvciBldmVyeVxuICAvLyBjb3JyZXNwb25kaW5nIGtleSwgYW5kIGFuIGlkZW50aWNhbCAncHJvdG90eXBlJyBwcm9wZXJ0eS4gTm90ZTogdGhpc1xuICAvLyBhY2NvdW50cyBmb3IgYm90aCBuYW1lZCBhbmQgaW5kZXhlZCBwcm9wZXJ0aWVzIG9uIEFycmF5cy5cbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gb2JqRXF1aXYoYWN0dWFsLCBleHBlY3RlZCwgb3B0cyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNVbmRlZmluZWRPck51bGwodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGlzQnVmZmVyICh4KSB7XG4gIGlmICgheCB8fCB0eXBlb2YgeCAhPT0gJ29iamVjdCcgfHwgdHlwZW9mIHgubGVuZ3RoICE9PSAnbnVtYmVyJykgcmV0dXJuIGZhbHNlO1xuICBpZiAodHlwZW9mIHguY29weSAhPT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgeC5zbGljZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoeC5sZW5ndGggPiAwICYmIHR5cGVvZiB4WzBdICE9PSAnbnVtYmVyJykgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gb2JqRXF1aXYoYSwgYiwgb3B0cykge1xuICB2YXIgaSwga2V5O1xuICBpZiAoaXNVbmRlZmluZWRPck51bGwoYSkgfHwgaXNVbmRlZmluZWRPck51bGwoYikpXG4gICAgcmV0dXJuIGZhbHNlO1xuICAvLyBhbiBpZGVudGljYWwgJ3Byb3RvdHlwZScgcHJvcGVydHkuXG4gIGlmIChhLnByb3RvdHlwZSAhPT0gYi5wcm90b3R5cGUpIHJldHVybiBmYWxzZTtcbiAgLy9+fn5JJ3ZlIG1hbmFnZWQgdG8gYnJlYWsgT2JqZWN0LmtleXMgdGhyb3VnaCBzY3Jld3kgYXJndW1lbnRzIHBhc3NpbmcuXG4gIC8vICAgQ29udmVydGluZyB0byBhcnJheSBzb2x2ZXMgdGhlIHByb2JsZW0uXG4gIGlmIChpc0FyZ3VtZW50cyhhKSkge1xuICAgIGlmICghaXNBcmd1bWVudHMoYikpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgYSA9IHBTbGljZS5jYWxsKGEpO1xuICAgIGIgPSBwU2xpY2UuY2FsbChiKTtcbiAgICByZXR1cm4gZGVlcEVxdWFsKGEsIGIsIG9wdHMpO1xuICB9XG4gIGlmIChpc0J1ZmZlcihhKSkge1xuICAgIGlmICghaXNCdWZmZXIoYikpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGEubGVuZ3RoICE9PSBiLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAoaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoYVtpXSAhPT0gYltpXSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICB0cnkge1xuICAgIHZhciBrYSA9IG9iamVjdEtleXMoYSksXG4gICAgICAgIGtiID0gb2JqZWN0S2V5cyhiKTtcbiAgfSBjYXRjaCAoZSkgey8vaGFwcGVucyB3aGVuIG9uZSBpcyBhIHN0cmluZyBsaXRlcmFsIGFuZCB0aGUgb3RoZXIgaXNuJ3RcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLy8gaGF2aW5nIHRoZSBzYW1lIG51bWJlciBvZiBvd25lZCBwcm9wZXJ0aWVzIChrZXlzIGluY29ycG9yYXRlc1xuICAvLyBoYXNPd25Qcm9wZXJ0eSlcbiAgaWYgKGthLmxlbmd0aCAhPSBrYi5sZW5ndGgpXG4gICAgcmV0dXJuIGZhbHNlO1xuICAvL3RoZSBzYW1lIHNldCBvZiBrZXlzIChhbHRob3VnaCBub3QgbmVjZXNzYXJpbHkgdGhlIHNhbWUgb3JkZXIpLFxuICBrYS5zb3J0KCk7XG4gIGtiLnNvcnQoKTtcbiAgLy9+fn5jaGVhcCBrZXkgdGVzdFxuICBmb3IgKGkgPSBrYS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIGlmIChrYVtpXSAhPSBrYltpXSlcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAvL2VxdWl2YWxlbnQgdmFsdWVzIGZvciBldmVyeSBjb3JyZXNwb25kaW5nIGtleSwgYW5kXG4gIC8vfn5+cG9zc2libHkgZXhwZW5zaXZlIGRlZXAgdGVzdFxuICBmb3IgKGkgPSBrYS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIGtleSA9IGthW2ldO1xuICAgIGlmICghZGVlcEVxdWFsKGFba2V5XSwgYltrZXldLCBvcHRzKSkgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0eXBlb2YgYSA9PT0gdHlwZW9mIGI7XG59XG5cblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9kZWVwLWVxdWFsL2luZGV4LmpzXG4gKiogbW9kdWxlIGlkID0gOVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gdHlwZW9mIE9iamVjdC5rZXlzID09PSAnZnVuY3Rpb24nXG4gID8gT2JqZWN0LmtleXMgOiBzaGltO1xuXG5leHBvcnRzLnNoaW0gPSBzaGltO1xuZnVuY3Rpb24gc2hpbSAob2JqKSB7XG4gIHZhciBrZXlzID0gW107XG4gIGZvciAodmFyIGtleSBpbiBvYmopIGtleXMucHVzaChrZXkpO1xuICByZXR1cm4ga2V5cztcbn1cblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2RlZXAtZXF1YWwvbGliL2tleXMuanNcbiAqKiBtb2R1bGUgaWQgPSAxMFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwidmFyIHN1cHBvcnRzQXJndW1lbnRzQ2xhc3MgPSAoZnVuY3Rpb24oKXtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhcmd1bWVudHMpXG59KSgpID09ICdbb2JqZWN0IEFyZ3VtZW50c10nO1xuXG5leHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBzdXBwb3J0c0FyZ3VtZW50c0NsYXNzID8gc3VwcG9ydGVkIDogdW5zdXBwb3J0ZWQ7XG5cbmV4cG9ydHMuc3VwcG9ydGVkID0gc3VwcG9ydGVkO1xuZnVuY3Rpb24gc3VwcG9ydGVkKG9iamVjdCkge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iamVjdCkgPT0gJ1tvYmplY3QgQXJndW1lbnRzXSc7XG59O1xuXG5leHBvcnRzLnVuc3VwcG9ydGVkID0gdW5zdXBwb3J0ZWQ7XG5mdW5jdGlvbiB1bnN1cHBvcnRlZChvYmplY3Qpe1xuICByZXR1cm4gb2JqZWN0ICYmXG4gICAgdHlwZW9mIG9iamVjdCA9PSAnb2JqZWN0JyAmJlxuICAgIHR5cGVvZiBvYmplY3QubGVuZ3RoID09ICdudW1iZXInICYmXG4gICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgJ2NhbGxlZScpICYmXG4gICAgIU9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChvYmplY3QsICdjYWxsZWUnKSB8fFxuICAgIGZhbHNlO1xufTtcblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2RlZXAtZXF1YWwvbGliL2lzX2FyZ3VtZW50cy5qc1xuICoqIG1vZHVsZSBpZCA9IDExXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJpbXBvcnQgaXNPYmplY3QgZnJvbSAnbG9kYXNoLmlzb2JqZWN0JztcbmltcG9ydCBpc0VxdWFsIGZyb20gJ2RlZXAtZXF1YWwnO1xuaW1wb3J0IHt1cGRhdGVJbn0gZnJvbSAndXBkYXRlLWluJztcblxuXG5leHBvcnQgZnVuY3Rpb24gZmluZChhcnJheSwgcHJlZGljYXRlKSB7XG4gIGlmICh0eXBlb2YgcHJlZGljYXRlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncHJlZGljYXRlIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICB9XG4gIHZhciBsaXN0ID0gT2JqZWN0KGFycmF5KTtcbiAgdmFyIGxlbmd0aCA9IGxpc3QubGVuZ3RoID4+PiAwO1xuICB2YXIgdGhpc0FyZyA9IGFyZ3VtZW50c1sxXTtcbiAgdmFyIHZhbHVlO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICB2YWx1ZSA9IGxpc3RbaV07XG4gICAgaWYgKHByZWRpY2F0ZS5jYWxsKHRoaXNBcmcsIHZhbHVlLCBpLCBsaXN0KSkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0SW4odHJlZSwgcGF0aHMpIHsgLy8gdGhpcyBpcyBnZXQtaW4gaW4gY2xvanVyZVxuICByZXR1cm4gcmVkdWNlKHBhdGhzLCBnZXQsIHRyZWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0KG9iaiwga2V5KSB7XG4gIGNvbnNvbGUuYXNzZXJ0KGtleSBpbiBvYmosIGBCYWQgY3Vyc29yIHJlZmluZTogJyR7a2V5fScgbm90IGZvdW5kIGluIGAsIG9iaik7XG4gIHJldHVybiBvYmpba2V5XTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluaXRpYWwoYXJyYXkpIHtcbiAgcmV0dXJuIGFycmF5LnNsaWNlKDAsIGFycmF5Lmxlbmd0aCAtIDEpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVkdWNlKGFycmF5LCBmLCBtemVybykge1xuICByZXR1cm4gYXJyYXkucmVkdWNlKGYsIG16ZXJvKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZsYXR0ZW4obGlzdE9mTGlzdHMpIHtcbiAgcmV0dXJuIFtdLmNvbmNhdC5hcHBseShbXSwgbGlzdE9mTGlzdHMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFpcnMob2JqKSB7XG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqKTtcbiAgdmFyIGxlbmd0aCA9IGtleXMubGVuZ3RoO1xuICB2YXIgcGFpcnMgPSBBcnJheShsZW5ndGgpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgcGFpcnNbaV0gPSBba2V5c1tpXSwgb2JqW2tleXNbaV1dXTtcbiAgfVxuICByZXR1cm4gcGFpcnM7XG59O1xuXG4vKipcbiAqIEhhc2ggb2YgbnVsbCBpcyBudWxsLCBoYXNoIG9mIHVuZGVmaW5lZCBpcyB1bmRlZmluZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc2hTdHJpbmcoc3RyKSB7XG4gIHZhciBoYXNoID0gMCwgaSwgY2gsIGw7XG4gIGlmIChzdHIgPT09IHVuZGVmaW5lZCB8fCBzdHIgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBzdHI7XG4gIH1cbiAgaWYgKHN0ci5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBoYXNoO1xuICB9XG4gIGZvciAoaSA9IDAsIGwgPSBzdHIubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICBjaCAgPSBzdHIuY2hhckNvZGVBdChpKTtcbiAgICAgIGhhc2ggID0gKChoYXNoIDw8IDUpIC0gaGFzaCkgKyBjaDtcbiAgICAgIGhhc2ggfD0gMDsgLy8gQ29udmVydCB0byAzMmJpdCBpbnRlZ2VyXG4gIH1cbiAgcmV0dXJuIGhhc2g7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNoUmVjb3JkKHJlY29yZCkge1xuICAgIHJldHVybiBoYXNoU3RyaW5nKEpTT04uc3RyaW5naWZ5KHJlY29yZCkpO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlIGEgdW5pcXVlIHRoaW5nIHRvIHVzZSBhcyBhIG1lbW9pemUgcmVzb2x2ZXIgaGFzaCBmb3IgcmVmZXJlbmNlIHR5cGVzLlxuICovXG52YXIgcmVmc0NhY2hlID0ge307IC8vIHsgaWQ6IGNtcCB9XG52YXIgY2FjaGVJZEluZGV4ID0gMDtcbmV4cG9ydCBmdW5jdGlvbiByZWZUb0hhc2ggKGNtcCkge1xuICAvLyBzZWFyY2ggdGhlIGNtcFVuaXF1ZU1hcCBieSByZWZlcmVuY2UgLSBoYXZlIHdlIHNlZW4gaXQgYmVmb3JlP1xuICAvLyBpZiBzbywgdXNlIHRoZSBhc3NpZ25lZCBpZCBhcyB0aGUgaGFzaFxuICAvLyBpZiBub3QsIGFkZCB0byBjYWNoZSBhbmQgaW5jcmVtZW50IGNhY2hlSWRJbmRleCBhcyBhIG5ldyBJRCB0byBoYXNoIG9uXG5cbiAgdmFyIGNtcHNXaXRoVWlkID0gcGFpcnMocmVmc0NhY2hlKTtcbiAgdmFyIGNtcEZvdW5kID0gZmluZChjbXBzV2l0aFVpZCwgZnVuY3Rpb24gKGNtcEFuZElkKSB7IHJldHVybiBjbXBBbmRJZFsxXSA9PT0gY21wOyB9KTtcbiAgaWYgKGNtcEZvdW5kKSB7XG4gICAgcmV0dXJuIGNtcEZvdW5kWzBdOyAvLyByZXR1cm4gdGhlIHVpZFxuICB9XG4gIGVsc2Uge1xuICAgIHZhciB1aWQgPSAoY2FjaGVJZEluZGV4KyspLnRvU3RyaW5nKCk7XG4gICAgcmVmc0NhY2hlW3VpZF0gPSBjbXA7XG4gICAgcmV0dXJuIHVpZDtcbiAgfVxufVxuXG5sZXQgaWRlbnRpdHkgPSB4ID0+IHg7XG5cbmV4cG9ydCBmdW5jdGlvbiBtZW1vaXplZCAoaGFzaGVyID0gaWRlbnRpdHksIGYpIHtcbiAgdmFyIGNhY2hlID0ge307XG4gIHJldHVybiAoLi4uYXJncykgPT4ge1xuICAgIC8vIGhhc2hlciBnZXRzIHRoZSBzYW1lIGFyZ3VtZW50cyBhcyBmLCB0byBjcmVhdGUgdGhlIGhhc2hLZXlcbiAgICBjb25zdCBoYXNoS2V5ID0gaGFzaGVyLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIHJldHVybiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGNhY2hlLCBoYXNoS2V5KVxuICAgICAgICA/IGNhY2hlW2hhc2hLZXldXG4gICAgICAgIDogKGNhY2hlW2hhc2hLZXldID0gZi5hcHBseSh0aGlzLCBhcmdzKSk7XG4gIH07XG59XG5cblxuLy8gY29weSBmcm9tIE1ETiBleGFtcGxlOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9PYmplY3QvZnJlZXplI0V4YW1wbGVzXG5leHBvcnQgZnVuY3Rpb24gZGVlcEZyZWV6ZShvYmopIHtcbiAgaWYgKHR5cGVvZiBPYmplY3QuZnJlZXplICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIGlmICghaXNPYmplY3Qob2JqKSkge1xuICAgIHJldHVybiBvYmo7XG4gIH1cblxuICAvLyBSZXRyaWV2ZSB0aGUgcHJvcGVydHkgbmFtZXMgZGVmaW5lZCBvbiBvYmpcbiAgdmFyIHByb3BOYW1lcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG9iaik7XG5cbiAgLy8gRnJlZXplIHByb3BlcnRpZXMgYmVmb3JlIGZyZWV6aW5nIHNlbGZcbiAgcHJvcE5hbWVzLmZvckVhY2goZnVuY3Rpb24obmFtZSkge1xuICAgIHZhciBwcm9wID0gb2JqW25hbWVdO1xuXG4gICAgLy8gRnJlZXplIHByb3AgaWYgaXQgaXMgYW4gb2JqZWN0XG4gICAgaWYgKHR5cGVvZiBwcm9wID09ICdvYmplY3QnICYmICFPYmplY3QuaXNGcm96ZW4ocHJvcCkpIHtcbiAgICAgIGRlZXBGcmVlemUocHJvcCk7XG4gICAgfVxuICB9KTtcblxuICAvLyBGcmVlemUgc2VsZlxuICByZXR1cm4gT2JqZWN0LmZyZWV6ZShvYmopO1xufVxuXG5leHBvcnQgY29uc3QgdmFsRXEgPSAoYSwgYikgPT4gaXNFcXVhbChhLCBiKTtcbmV4cG9ydCBjb25zdCByZWZFcSA9IChhLCBiKSA9PiBhID09PSBiO1xuXG5leHBvcnQgbGV0IHJvb3RBdCA9IChzZWdtZW50cywgZm4pID0+ICh2YWx1ZSkgPT4gdXBkYXRlSW4odmFsdWUsIHNlZ21lbnRzLCBmbik7XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy91dGlsLmpzXG4gKiovIiwiLyoqXG4gKiBsb2Rhc2ggMy4wLjIgKEN1c3RvbSBCdWlsZCkgPGh0dHBzOi8vbG9kYXNoLmNvbS8+XG4gKiBCdWlsZDogYGxvZGFzaCBtb2Rlcm4gbW9kdWxhcml6ZSBleHBvcnRzPVwibnBtXCIgLW8gLi9gXG4gKiBDb3B5cmlnaHQgMjAxMi0yMDE1IFRoZSBEb2pvIEZvdW5kYXRpb24gPGh0dHA6Ly9kb2pvZm91bmRhdGlvbi5vcmcvPlxuICogQmFzZWQgb24gVW5kZXJzY29yZS5qcyAxLjguMyA8aHR0cDovL3VuZGVyc2NvcmVqcy5vcmcvTElDRU5TRT5cbiAqIENvcHlyaWdodCAyMDA5LTIwMTUgSmVyZW15IEFzaGtlbmFzLCBEb2N1bWVudENsb3VkIGFuZCBJbnZlc3RpZ2F0aXZlIFJlcG9ydGVycyAmIEVkaXRvcnNcbiAqIEF2YWlsYWJsZSB1bmRlciBNSVQgbGljZW5zZSA8aHR0cHM6Ly9sb2Rhc2guY29tL2xpY2Vuc2U+XG4gKi9cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyB0aGUgW2xhbmd1YWdlIHR5cGVdKGh0dHBzOi8vZXM1LmdpdGh1Yi5pby8jeDgpIG9mIGBPYmplY3RgLlxuICogKGUuZy4gYXJyYXlzLCBmdW5jdGlvbnMsIG9iamVjdHMsIHJlZ2V4ZXMsIGBuZXcgTnVtYmVyKDApYCwgYW5kIGBuZXcgU3RyaW5nKCcnKWApXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzT2JqZWN0KHt9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdCgxKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0KHZhbHVlKSB7XG4gIC8vIEF2b2lkIGEgVjggSklUIGJ1ZyBpbiBDaHJvbWUgMTktMjAuXG4gIC8vIFNlZSBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9MjI5MSBmb3IgbW9yZSBkZXRhaWxzLlxuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgcmV0dXJuICEhdmFsdWUgJiYgKHR5cGUgPT0gJ29iamVjdCcgfHwgdHlwZSA9PSAnZnVuY3Rpb24nKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc09iamVjdDtcblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2xvZGFzaC5pc29iamVjdC9pbmRleC5qc1xuICoqIG1vZHVsZSBpZCA9IDEzXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJpbXBvcnQge21lbW9pemVkLCByZWZUb0hhc2h9IGZyb20gJy4vdXRpbCc7XG5cblxuLy8gVG8gc3VwcG9ydCBiaW5kaW5nIGN1cnNvcnMgdG8gcmVhY3Qgc3RhdGUsIHdlIG5lZWQgY21wLnNldFN0YXRlIGFzIGEgZnVuY3Rpb24sIGFuZCB0aGUgZnVuY3Rpb25cbi8vIG5lZWRzIHRvIGJlID09PSBpZiBpdCBjb21lcyBmcm9tIHRoZSBzYW1lIHJlYWN0IGNvbXBvbmVudC4gU2luY2Vcbi8vIGBjbXAuc2V0U3RhdGUuYmluZChjbXApICE9PSBjbXAuc2V0U3RhdGUuYmluZChjbXApYCxcbi8vIHdlIG5lZWQgdG8gbWVtb2l6ZSBiYXNlZCBvbiB0aGUgY21wIHJlZmVyZW5jZS5cbmV4cG9ydCBsZXQgbWFrZVN3YXBGcm9tUmVhY3QgPSBtZW1vaXplZChyZWZUb0hhc2gsIGNtcCA9PiBjbXAuc2V0U3RhdGUuYmluZChjbXApKTtcbmV4cG9ydCBsZXQgbWFrZURlcmVmRnJvbVJlYWN0ID0gbWVtb2l6ZWQocmVmVG9IYXNoLCBjbXAgPT4gKCkgPT4gY21wLnN0YXRlKTtcbmV4cG9ydCBsZXQgbWFrZVZhbHVlRnJvbVJlYWN0ID0gY21wID0+IGNtcC5zdGF0ZTtcbmV4cG9ydCBsZXQgaXNSZWFjdENtcCA9IChhKSA9PiB0eXBlb2YgYS5fX3Byb3RvX18ucmVuZGVyID09PSBcImZ1bmN0aW9uXCI7XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9SZWFjdEFkYXB0ZXIuanNcbiAqKi8iLCJpbXBvcnQge21lbW9pemVkLCByZWZUb0hhc2gsIGhhc2hSZWNvcmQsIGdldEluLCByb290QXR9IGZyb20gJy4vdXRpbCc7XG5pbXBvcnQge21lcmdlLCBwdXNoLCB1bnNoaWZ0LCBzcGxpY2V9IGZyb20gJ3VwZGF0ZS1pbic7XG5pbXBvcnQge21ha2VEZXJlZkZyb21SZWFjdCwgbWFrZVN3YXBGcm9tUmVhY3QsIGlzUmVhY3RDbXB9IGZyb20gJy4vUmVhY3RBZGFwdGVyJztcblxuXG5sZXQgbWFrZVJlZmluZWRTd2FwID0gbWVtb2l6ZWQoXG4gIChzd2FwRm4sIHBhdGhzKSA9PiByZWZUb0hhc2goc3dhcEZuKSArIGhhc2hSZWNvcmQocGF0aHMpLFxuICAoc3dhcEZuLCBwYXRocykgPT4gKGYpID0+IHN3YXBGbihyb290QXQocGF0aHMsIGYpKSk7XG5cblxubGV0IG1ha2VSZWZpbmVkRGVyZWYgPSBtZW1vaXplZChcbiAgKGRlcmVmLCBwYXRocykgPT4gcmVmVG9IYXNoKGRlcmVmKSArIGhhc2hSZWNvcmQocGF0aHMpLFxuICAoZGVyZWYsIHBhdGhzKSA9PiAoKSA9PiBnZXRJbihkZXJlZigpLCBwYXRocykpO1xuXG5cbmNsYXNzIFJlZkN1cnNvciB7XG4gIGNvbnN0cnVjdG9yIChkZXJlZiwgc3dhcEZuKSB7XG4gICAgdGhpcy52YWx1ZSA9IGRlcmVmO1xuICAgIHRoaXMucmVmaW5lID0gKC4uLm1vcmVQYXRocykgPT4gTmV3UmVmQ3Vyc29yKG1ha2VSZWZpbmVkRGVyZWYoZGVyZWYsIG1vcmVQYXRocyksIG1ha2VSZWZpbmVkU3dhcChzd2FwRm4sIG1vcmVQYXRocykpO1xuICAgIHRoaXMuc3dhcCA9IChmLCAuLi5hcmdzKSA9PiBzd2FwRm4oKHYpID0+IGYuYXBwbHkobnVsbCwgW3ZdLmNvbmNhdChhcmdzKSkpO1xuXG4gICAgdGhpcy5zZXQgPSAodmFsKSA9PiB0aGlzLnN3YXAodiA9PiB2YWwpO1xuICAgIHRoaXMubWVyZ2UgPSAodmFsKSA9PiB0aGlzLnN3YXAobWVyZ2UsIHZhbCk7XG4gICAgdGhpcy5wdXNoID0gKHhzKSA9PiB0aGlzLnN3YXAocHVzaCwgeHMpO1xuICAgIHRoaXMudW5zaGlmdCA9ICh4cykgPT4gdGhpcy5zd2FwKHVuc2hpZnQsIHhzKTtcbiAgICB0aGlzLnNwbGljZSA9ICh4cykgPT4gdGhpcy5zd2FwKHNwbGljZSwgeHMpO1xuXG4gICAgLy8gUmVmQ3Vyc29ycyBkb24ndCBvd24gYSB2YWx1ZSwgc28gdGhleSBhcmVuJ3QgcmVzcG9uc2libGUgZm9yIGZyZWV6aW5nIGl0LlxuICB9XG59XG5cblxubGV0IE5ld1JlZkN1cnNvciA9IG1lbW9pemVkKFxuICAgIChkZXJlZiwgc3dhcCkgPT4gcmVmVG9IYXNoKGRlcmVmKSArIHJlZlRvSGFzaChzd2FwKSxcbiAgICAoZGVyZWYsIHN3YXApID0+IG5ldyBSZWZDdXJzb3IoZGVyZWYsIHN3YXApKTtcblxuXG5SZWZDdXJzb3IuYnVpbGQgPSAoZGVyZWYsIHN3YXApID0+IGlzUmVhY3RDbXAoZGVyZWYpXG4gICAgPyBOZXdSZWZDdXJzb3IobWFrZURlcmVmRnJvbVJlYWN0KGRlcmVmKSwgbWFrZVN3YXBGcm9tUmVhY3QoZGVyZWYpKVxuICAgIDogTmV3UmVmQ3Vyc29yKGRlcmVmLCBzd2FwKTtcblxuXG5leHBvcnQgZGVmYXVsdCBSZWZDdXJzb3I7XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9SZWZDdXJzb3IuanNcbiAqKi8iLCJpbXBvcnQgb21pdCBmcm9tICdvbWl0LWtleXMnO1xuaW1wb3J0IHt2YWxFcSwgcmVmRXF9IGZyb20gJy4vdXRpbCc7XG5cblxuZnVuY3Rpb24gSW1tdXRhYmxlT3B0aW1pemF0aW9ucyAocmVmRmllbGRzLCBpZ25vcmVkRmllbGRzLypvcHRpb25hbCovKSB7XG4gIHZhciBub1ZhbHVlQ2hlY2tGaWVsZHMgPSByZWZGaWVsZHMuY29uY2F0KGlnbm9yZWRGaWVsZHMgfHwgW10pO1xuICByZXR1cm4ge1xuICAgIHNob3VsZENvbXBvbmVudFVwZGF0ZTogZnVuY3Rpb24gKG5leHRQcm9wcykge1xuXG4gICAgICB2YXIgdmFsdWVzQ2hhbmdlZCA9ICF2YWxFcShcbiAgICAgICAgb21pdChuZXh0UHJvcHMsIG5vVmFsdWVDaGVja0ZpZWxkcyksXG4gICAgICAgIG9taXQodGhpcy5wcm9wcywgbm9WYWx1ZUNoZWNrRmllbGRzKSk7XG5cbiAgICAgIHZhciByZWZzQ2hhbmdlZCA9ICFyZWZGaWVsZHMuZXZlcnkoKGZpZWxkKSA9PiB7XG4gICAgICAgIHJldHVybiByZWZFcSh0aGlzLnByb3BzW2ZpZWxkXSwgbmV4dFByb3BzW2ZpZWxkXSk7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHZhbHVlc0NoYW5nZWQgfHwgcmVmc0NoYW5nZWQ7XG4gICAgfVxuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBJbW11dGFibGVPcHRpbWl6YXRpb25zO1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvSW1tdXRhYmxlT3B0aW1pemF0aW9ucy5qc1xuICoqLyIsIi8qIVxuICogb21pdC1rZXkgPGh0dHBzOi8vZ2l0aHViLmNvbS9qb25zY2hsaW5rZXJ0L29taXQta2V5PlxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxNCBKb24gU2NobGlua2VydCwgY29udHJpYnV0b3JzLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCdpc29iamVjdCcpO1xudmFyIGRpZmZlcmVuY2UgPSByZXF1aXJlKCdhcnJheS1kaWZmZXJlbmNlJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gb21pdChvYmosIGtleXMpIHtcbiAgaWYgKCFpc09iamVjdChvYmopKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgdmFyIHByb3BzID0gT2JqZWN0LmtleXMob2JqKTtcbiAgdmFyIGxlbiA9IHByb3BzLmxlbmd0aDtcblxuICBrZXlzID0gQXJyYXkuaXNBcnJheShrZXlzKSA/IGtleXMgOiBba2V5c107XG4gIHZhciBkaWZmID0gZGlmZmVyZW5jZShwcm9wcywga2V5cyk7XG4gIHZhciBvID0ge307XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIHZhciBrZXkgPSBkaWZmW2ldO1xuXG4gICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICBvW2tleV0gPSBvYmpba2V5XTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG87XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L29taXQta2V5cy9pbmRleC5qc1xuICoqIG1vZHVsZSBpZCA9IDE3XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvKiFcbiAqIGlzb2JqZWN0IDxodHRwczovL2dpdGh1Yi5jb20vam9uc2NobGlua2VydC9pc29iamVjdD5cbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQgSm9uIFNjaGxpbmtlcnQsIGNvbnRyaWJ1dG9ycy5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZVxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBpcyB0aGUgdmFsdWUgYW4gb2JqZWN0LCBhbmQgbm90IGFuIGFycmF5P1xuICpcbiAqIEBwYXJhbSAgeyp9IGB2YWx1ZWBcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc09iamVjdChvKSB7XG4gIHJldHVybiBvICE9IG51bGwgJiYgdHlwZW9mIG8gPT09ICdvYmplY3QnXG4gICAgJiYgIUFycmF5LmlzQXJyYXkobyk7XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2lzb2JqZWN0L2luZGV4LmpzXG4gKiogbW9kdWxlIGlkID0gMThcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIihmdW5jdGlvbihnbG9iYWwpIHtcblxuXHR2YXIgaW5kZXhPZiA9IEFycmF5LnByb3RvdHlwZS5pbmRleE9mIHx8IGZ1bmN0aW9uKGVsZW0pIHtcblx0XHR2YXIgaWR4LCBsZW47XG5cblx0XHRpZiAodGhpcyA9PSBudWxsKSB7XG5cdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKFwiaW5kZXhPZiBjYWxsZWQgb24gbnVsbCBvciB1bmRlZmluZWRcIik7XG5cdFx0fVxuXG5cdFx0Zm9yIChpZHggPSAwLCBsZW4gPSB0aGlzLmxlbmd0aDsgaWR4IDwgbGVuOyArK2lkeCkge1xuXHRcdFx0aWYgKHRoaXNbaWR4XSA9PT0gZWxlbSkge1xuXHRcdFx0XHRyZXR1cm4gaWR4O1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiAtMTtcblx0fTtcblxuXHRmdW5jdGlvbiBkaWZmZXJlbmNlKGEsIGIpIHtcblx0XHR2YXIgaWR4LCBsZW47XG5cdFx0dmFyIHJlcyA9IFtdO1xuXG5cdFx0Zm9yIChpZHggPSAwLCBsZW4gPSBhLmxlbmd0aDsgaWR4IDwgbGVuOyArK2lkeCkge1xuXHRcdFx0aWYgKGluZGV4T2YuY2FsbChiLCBhW2lkeF0pID09PSAtMSkge1xuXHRcdFx0XHRyZXMucHVzaChhW2lkeF0pO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRmb3IgKGlkeCA9IDAsIGxlbiA9IGIubGVuZ3RoOyBpZHggPCBsZW47ICsraWR4KSB7XG5cdFx0XHRpZiAoaW5kZXhPZi5jYWxsKGEsIGJbaWR4XSkgPT09IC0xKSB7XG5cdFx0XHRcdHJlcy5wdXNoKGJbaWR4XSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiByZXM7XG5cdH1cblxuXHRpZiAodHlwZW9mIG1vZHVsZSA9PT0gXCJvYmplY3RcIiAmJiBtb2R1bGUuZXhwb3J0cykge1xuXHRcdG1vZHVsZS5leHBvcnRzID0gZGlmZmVyZW5jZTtcblx0fSBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkge1xuXHRcdGRlZmluZShmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiBkaWZmZXJlbmNlO1xuXHRcdH0pO1xuXHR9IGVsc2Uge1xuXHRcdGdsb2JhbC5kaWZmZXJlbmNlID0gZGlmZmVyZW5jZTtcblx0fVxuXG59KHRoaXMpKTtcblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2FycmF5LWRpZmZlcmVuY2UvZGlmZmVyZW5jZS5qc1xuICoqIG1vZHVsZSBpZCA9IDE5XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovLy93ZWJwYWNrL2Jvb3RzdHJhcCA0NTY0ZDUzNDc0NTE4ODYyMTIzMCIsIndlYnBhY2s6Ly8vLi9zcmMvcmVhY3QtY3Vyc29yLmpzIiwid2VicGFjazovLy8uL3NyYy9DdXJzb3IuanMiLCJ3ZWJwYWNrOi8vLyh3ZWJwYWNrKS9+L25vZGUtbGlicy1icm93c2VyL34vcHJvY2Vzcy9icm93c2VyLmpzIiwid2VicGFjazovLy8uL34vdXBkYXRlLWluL3NyYy91cGRhdGUtaW4uanMiLCJ3ZWJwYWNrOi8vLy4vfi9yZWFjdC1hZGRvbnMtdXBkYXRlL2luZGV4LmpzIiwid2VicGFjazovLy8uL34vcmVhY3QvbGliL3VwZGF0ZS5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWN0L2xpYi9PYmplY3QuYXNzaWduLmpzIiwid2VicGFjazovLy8uL34vcmVhY3Qvfi9mYmpzL2xpYi9rZXlPZi5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWN0L34vZmJqcy9saWIvaW52YXJpYW50LmpzIiwid2VicGFjazovLy8uL34vZGVlcC1lcXVhbC9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9+L2RlZXAtZXF1YWwvbGliL2tleXMuanMiLCJ3ZWJwYWNrOi8vLy4vfi9kZWVwLWVxdWFsL2xpYi9pc19hcmd1bWVudHMuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3V0aWwuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1JlYWN0QWRhcHRlci5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvUmVmQ3Vyc29yLmpzIiwid2VicGFjazovLy8uL3NyYy9JbW11dGFibGVPcHRpbWl6YXRpb25zLmpzIiwid2VicGFjazovLy8uL34vb21pdC1rZXlzL2luZGV4LmpzIiwid2VicGFjazovLy8uL34vb21pdC1rZXlzL34vaXNvYmplY3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vfi9vbWl0LWtleXMvfi9hcnJheS1kaWZmZXJl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QUFFO0FBQ0Y7QUFDQTs7QUFFQSxFQUFDIiwiZmlsZSI6InJlYWN0LWN1cnNvci5qcyIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFtdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcIlJlYWN0Q3Vyc29yXCJdID0gZmFjdG9yeSgpO1xuXHRlbHNlXG5cdFx0cm9vdFtcIlJlYWN0Q3Vyc29yXCJdID0gZmFjdG9yeSgpO1xufSkodGhpcywgZnVuY3Rpb24oKSB7XG5yZXR1cm4gXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uXG4gKiovIiwiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pXG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG5cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGV4cG9ydHM6IHt9LFxuIFx0XHRcdGlkOiBtb2R1bGVJZCxcbiBcdFx0XHRsb2FkZWQ6IGZhbHNlXG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmxvYWRlZCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiL3N0YXRpYy9cIjtcblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIHdlYnBhY2svYm9vdHN0cmFwIDQ1NjRkNTM0NzQ1MTg4NjIxMjMwXG4gKiovIiwiaW1wb3J0IEN1cnNvciBmcm9tICcuL0N1cnNvcic7XG5pbXBvcnQgUmVmQ3Vyc29yIGZyb20gJy4vUmVmQ3Vyc29yJztcbmltcG9ydCBJbW11dGFibGVPcHRpbWl6YXRpb25zIGZyb20gJy4vSW1tdXRhYmxlT3B0aW1pemF0aW9ucyc7XG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBDdXJzb3I6IEN1cnNvcixcbiAgSW1tdXRhYmxlT3B0aW1pemF0aW9uczogSW1tdXRhYmxlT3B0aW1pemF0aW9ucyxcbiAgUmVmQ3Vyc29yOiBSZWZDdXJzb3Jcbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL3JlYWN0LWN1cnNvci5qc1xuICoqLyIsImltcG9ydCB7bWVyZ2UsIHB1c2gsIHVuc2hpZnQsIHNwbGljZX0gZnJvbSAndXBkYXRlLWluJztcbmltcG9ydCB7bWVtb2l6ZWQsIGdldEluLCBoYXNoUmVjb3JkLCByZWZUb0hhc2gsIGRlZXBGcmVlemUsIHJvb3RBdH0gZnJvbSAnLi91dGlsJztcbmltcG9ydCB7bWFrZVN3YXBGcm9tUmVhY3QsIG1ha2VWYWx1ZUZyb21SZWFjdCwgaXNSZWFjdENtcH0gZnJvbSAnLi9SZWFjdEFkYXB0ZXInO1xuXG5cbmxldCBkZWJ1ZyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbic7XG5cblxubGV0IG1ha2VSZWZpbmVkU3dhcCA9IG1lbW9pemVkKFxuICAoc3dhcEZuLCBwYXRocykgPT4gcmVmVG9IYXNoKHN3YXBGbikgKyBoYXNoUmVjb3JkKHBhdGhzKSxcbiAgKHN3YXBGbiwgcGF0aHMpID0+IChmKSA9PiBzd2FwRm4ocm9vdEF0KHBhdGhzLCBmKSkpO1xuXG5cbmNsYXNzIEN1cnNvciB7XG4gIGNvbnN0cnVjdG9yICh2YWx1ZSwgc3dhcEZuKSB7XG4gICAgdGhpcy52YWx1ZSA9ICgpID0+IHZhbHVlO1xuICAgIHRoaXMucmVmaW5lID0gKC4uLm1vcmVQYXRocykgPT4gTmV3Q3Vyc29yKGdldEluKHZhbHVlLCBtb3JlUGF0aHMpLCBtYWtlUmVmaW5lZFN3YXAoc3dhcEZuLCBtb3JlUGF0aHMpKTtcbiAgICB0aGlzLnN3YXAgPSAoZiwgLi4uYXJncykgPT4gc3dhcEZuKCh2KSA9PiBmLmFwcGx5KG51bGwsIFt2XS5jb25jYXQoYXJncykpKTtcblxuICAgIHRoaXMuc2V0ID0gKHZhbCkgPT4gdGhpcy5zd2FwKHYgPT4gdmFsKTtcbiAgICB0aGlzLm1lcmdlID0gKHZhbCkgPT4gdGhpcy5zd2FwKG1lcmdlLCB2YWwpO1xuICAgIHRoaXMucHVzaCA9ICh4cykgPT4gdGhpcy5zd2FwKHB1c2gsIHhzKTtcbiAgICB0aGlzLnVuc2hpZnQgPSAoeHMpID0+IHRoaXMuc3dhcCh1bnNoaWZ0LCB4cyk7XG4gICAgdGhpcy5zcGxpY2UgPSAoeHMpID0+IHRoaXMuc3dhcChzcGxpY2UsIHhzKTtcblxuICAgIGRlYnVnICYmIGRlZXBGcmVlemUodmFsdWUpO1xuICB9XG59XG5cblxubGV0IE5ld0N1cnNvciA9IG1lbW9pemVkKFxuICAgICh2YWx1ZSwgc3dhcCkgPT4gcmVmVG9IYXNoKHN3YXApICsgaGFzaFJlY29yZCh2YWx1ZSksXG4gICAgKHZhbHVlLCBzd2FwKSA9PiBuZXcgQ3Vyc29yKHZhbHVlLCBzd2FwKSk7XG5cblxuQ3Vyc29yLmJ1aWxkID0gKHZhbHVlLCBzd2FwKSA9PiBpc1JlYWN0Q21wKHZhbHVlKVxuICAgID8gTmV3Q3Vyc29yKG1ha2VWYWx1ZUZyb21SZWFjdCh2YWx1ZSksIG1ha2VTd2FwRnJvbVJlYWN0KHZhbHVlKSlcbiAgICA6IE5ld0N1cnNvcih2YWx1ZSwgc3dhcCk7XG5cblxuZXhwb3J0IGRlZmF1bHQgQ3Vyc29yO1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvQ3Vyc29yLmpzXG4gKiovIiwiLy8gc2hpbSBmb3IgdXNpbmcgcHJvY2VzcyBpbiBicm93c2VyXG5cbnZhciBwcm9jZXNzID0gbW9kdWxlLmV4cG9ydHMgPSB7fTtcbnZhciBxdWV1ZSA9IFtdO1xudmFyIGRyYWluaW5nID0gZmFsc2U7XG52YXIgY3VycmVudFF1ZXVlO1xudmFyIHF1ZXVlSW5kZXggPSAtMTtcblxuZnVuY3Rpb24gY2xlYW5VcE5leHRUaWNrKCkge1xuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgaWYgKGN1cnJlbnRRdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgcXVldWUgPSBjdXJyZW50UXVldWUuY29uY2F0KHF1ZXVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgfVxuICAgIGlmIChxdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgZHJhaW5RdWV1ZSgpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZHJhaW5RdWV1ZSgpIHtcbiAgICBpZiAoZHJhaW5pbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgdGltZW91dCA9IHNldFRpbWVvdXQoY2xlYW5VcE5leHRUaWNrKTtcbiAgICBkcmFpbmluZyA9IHRydWU7XG5cbiAgICB2YXIgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIHdoaWxlKGxlbikge1xuICAgICAgICBjdXJyZW50UXVldWUgPSBxdWV1ZTtcbiAgICAgICAgcXVldWUgPSBbXTtcbiAgICAgICAgd2hpbGUgKCsrcXVldWVJbmRleCA8IGxlbikge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRRdWV1ZSkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRRdWV1ZVtxdWV1ZUluZGV4XS5ydW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgICAgIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB9XG4gICAgY3VycmVudFF1ZXVlID0gbnVsbDtcbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbn1cblxucHJvY2Vzcy5uZXh0VGljayA9IGZ1bmN0aW9uIChmdW4pIHtcbiAgICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSk7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBxdWV1ZS5wdXNoKG5ldyBJdGVtKGZ1biwgYXJncykpO1xuICAgIGlmIChxdWV1ZS5sZW5ndGggPT09IDEgJiYgIWRyYWluaW5nKSB7XG4gICAgICAgIHNldFRpbWVvdXQoZHJhaW5RdWV1ZSwgMCk7XG4gICAgfVxufTtcblxuLy8gdjggbGlrZXMgcHJlZGljdGlibGUgb2JqZWN0c1xuZnVuY3Rpb24gSXRlbShmdW4sIGFycmF5KSB7XG4gICAgdGhpcy5mdW4gPSBmdW47XG4gICAgdGhpcy5hcnJheSA9IGFycmF5O1xufVxuSXRlbS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuZnVuLmFwcGx5KG51bGwsIHRoaXMuYXJyYXkpO1xufTtcbnByb2Nlc3MudGl0bGUgPSAnYnJvd3Nlcic7XG5wcm9jZXNzLmJyb3dzZXIgPSB0cnVlO1xucHJvY2Vzcy5lbnYgPSB7fTtcbnByb2Nlc3MuYXJndiA9IFtdO1xucHJvY2Vzcy52ZXJzaW9uID0gJyc7IC8vIGVtcHR5IHN0cmluZyB0byBhdm9pZCByZWdleHAgaXNzdWVzXG5wcm9jZXNzLnZlcnNpb25zID0ge307XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5wcm9jZXNzLm9uID0gbm9vcDtcbnByb2Nlc3MuYWRkTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5vbmNlID0gbm9vcDtcbnByb2Nlc3Mub2ZmID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBub29wO1xucHJvY2Vzcy5lbWl0ID0gbm9vcDtcblxucHJvY2Vzcy5iaW5kaW5nID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xuXG5wcm9jZXNzLmN3ZCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICcvJyB9O1xucHJvY2Vzcy5jaGRpciA9IGZ1bmN0aW9uIChkaXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcbnByb2Nlc3MudW1hc2sgPSBmdW5jdGlvbigpIHsgcmV0dXJuIDA7IH07XG5cblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqICh3ZWJwYWNrKS9+L25vZGUtbGlicy1icm93c2VyL34vcHJvY2Vzcy9icm93c2VyLmpzXG4gKiogbW9kdWxlIGlkID0gMlxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiaW1wb3J0IHtkZWZhdWx0IGFzIHBlcnNpc3RlbnRVcGRhdGV9IGZyb20gJ3JlYWN0LWFkZG9ucy11cGRhdGUnO1xuaW1wb3J0IGlzRXF1YWwgZnJvbSAnZGVlcC1lcXVhbCc7XG5cblxuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlIChhLCBiKSB7XG4gIHJldHVybiBwZXJzaXN0ZW50VXBkYXRlKGEsIHskbWVyZ2U6IGJ9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHB1c2ggKGFzLCBicykge1xuICByZXR1cm4gcGVyc2lzdGVudFVwZGF0ZShhcywgeyRwdXNoOiBic30pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdW5zaGlmdCAoYXMsIGJzKSB7XG4gIHJldHVybiBwZXJzaXN0ZW50VXBkYXRlKGFzLCB7JHVuc2hpZnQ6IGJzfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGxpY2UgKGFzLCBzcGxpY2VzKSB7XG4gIC8vIHBlcnNpc3RlbnRVcGRhdGUoWzEyLCAxNywgMTVdLCB7JHNwbGljZTogW1sxLCAxLCAxMywgMTRdXX0pID0+IFsxMiwgMTMsIDE0LCAxNV1cbiAgcmV0dXJuIHBlcnNpc3RlbnRVcGRhdGUoYXMsIHskc3BsaWNlOiBzcGxpY2VzfSk7XG59XG5cblxuLyoqXG4gKiBUaGluIHdyYXBwZXIgb3ZlciByZWFjdC1hZGRvbnMtdXBkYXRlIHRvIGFwcGx5IGEgZnVuY3Rpb24gYXQgcGF0aFxuICogcHJlc2VydmluZyBvdGhlciByZWZlcmVuY2VzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlSW4gKHJvb3RWYWwsIHBhdGhzLCBmLCAuLi5hcmdzKSB7XG4gIGxldCBmZiA9ICh2KSA9PiBmLmFwcGx5KG51bGwsIFt2XS5jb25jYXQoYXJncykpO1xuXG4gIHZhciBuZXdSb290VmFsO1xuICBpZiAocGF0aHMubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IGNvbW1hbmQgPSByb290QXQocGF0aHMsIHskYXBwbHk6IGZmfSk7XG4gICAgbmV3Um9vdFZhbCA9IHBlcnNpc3RlbnRVcGRhdGUocm9vdFZhbCwgY29tbWFuZCk7XG4gIH1cbiAgZWxzZSBpZiAocGF0aHMubGVuZ3RoID09PSAwKSB7XG4gICAgbmV3Um9vdFZhbCA9IGZmKHJvb3RWYWwpO1xuICB9XG5cbiAgLy8gd291bGQgYmUgYmV0dGVyIHRvIGRvIHRoaXMgdmFsRXEgY2hlY2sgb24ganVzdCB0aGUgbGVhZlxuICByZXR1cm4gaXNFcXVhbChyb290VmFsLCBuZXdSb290VmFsKVxuICAgICAgPyByb290VmFsIC8vIHByZXNlcnZlID09PSBpZiBzYW1lIHZhbHVlXG4gICAgICA6IG5ld1Jvb3RWYWw7XG59XG5cblxuXG4vLyBIZWxwZXIgbWV0aG9kcyBmb3IgZm9ybWluZyByZWFjdC1hZGRvbnMtdXBkYXRlIGNvbW1hbmRzLlxuXG4vKipcbiAqIEBwYXJhbSBsZWFmVmFsIGUuZy4geyRhcHBseTogZn1cbiAqIEBwYXJhbSBwYXRocyBlLmcuIFsneCcsICd5JywgJ3onXVxuICogQHJldHVybnMgZS5nLiB7eDoge3k6IHt6OiB7JGFwcGx5OiBmfX19XG4gKi9cbmZ1bmN0aW9uIHJvb3RBdCAocGF0aHMsIGxlYWZWYWwpIHtcbiAgcmV0dXJuIHBhdGhzLnJlZHVjZVJpZ2h0KHVuRGVyZWYsIGxlYWZWYWwpXG59XG5cblxuLyoqXG4gKiBAcGFyYW0gb2JqIGUuZyB7JGFwcGx5OiBmfVxuICogQHBhcmFtIGtleSBlLmcuICdmb28nXG4gKiBAcmV0dXJucyBlLmcuIHtmb286IHskYXBwbHk6IGZ9fVxuICovXG5mdW5jdGlvbiB1bkRlcmVmKG9iaiwga2V5KSB7IC8vIGFrYSB1bi1nZXRcbiAgdmFyIG5leHRPYmogPSB7fTtcbiAgbmV4dE9ialtrZXldID0gb2JqO1xuICByZXR1cm4gbmV4dE9iajtcbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vfi91cGRhdGUtaW4vc3JjL3VwZGF0ZS1pbi5qc1xuICoqLyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgncmVhY3QvbGliL3VwZGF0ZScpO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L3JlYWN0LWFkZG9ucy11cGRhdGUvaW5kZXguanNcbiAqKiBtb2R1bGUgaWQgPSA0XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLTIwMTUsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBAcHJvdmlkZXNNb2R1bGUgdXBkYXRlXG4gKi9cblxuLyogZ2xvYmFsIGhhc093blByb3BlcnR5OnRydWUgKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgYXNzaWduID0gcmVxdWlyZSgnLi9PYmplY3QuYXNzaWduJyk7XG52YXIga2V5T2YgPSByZXF1aXJlKCdmYmpzL2xpYi9rZXlPZicpO1xudmFyIGludmFyaWFudCA9IHJlcXVpcmUoJ2ZianMvbGliL2ludmFyaWFudCcpO1xudmFyIGhhc093blByb3BlcnR5ID0gKHt9KS5oYXNPd25Qcm9wZXJ0eTtcblxuZnVuY3Rpb24gc2hhbGxvd0NvcHkoeCkge1xuICBpZiAoQXJyYXkuaXNBcnJheSh4KSkge1xuICAgIHJldHVybiB4LmNvbmNhdCgpO1xuICB9IGVsc2UgaWYgKHggJiYgdHlwZW9mIHggPT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIGFzc2lnbihuZXcgeC5jb25zdHJ1Y3RvcigpLCB4KTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4geDtcbiAgfVxufVxuXG52YXIgQ09NTUFORF9QVVNIID0ga2V5T2YoeyAkcHVzaDogbnVsbCB9KTtcbnZhciBDT01NQU5EX1VOU0hJRlQgPSBrZXlPZih7ICR1bnNoaWZ0OiBudWxsIH0pO1xudmFyIENPTU1BTkRfU1BMSUNFID0ga2V5T2YoeyAkc3BsaWNlOiBudWxsIH0pO1xudmFyIENPTU1BTkRfU0VUID0ga2V5T2YoeyAkc2V0OiBudWxsIH0pO1xudmFyIENPTU1BTkRfTUVSR0UgPSBrZXlPZih7ICRtZXJnZTogbnVsbCB9KTtcbnZhciBDT01NQU5EX0FQUExZID0ga2V5T2YoeyAkYXBwbHk6IG51bGwgfSk7XG5cbnZhciBBTExfQ09NTUFORFNfTElTVCA9IFtDT01NQU5EX1BVU0gsIENPTU1BTkRfVU5TSElGVCwgQ09NTUFORF9TUExJQ0UsIENPTU1BTkRfU0VULCBDT01NQU5EX01FUkdFLCBDT01NQU5EX0FQUExZXTtcblxudmFyIEFMTF9DT01NQU5EU19TRVQgPSB7fTtcblxuQUxMX0NPTU1BTkRTX0xJU1QuZm9yRWFjaChmdW5jdGlvbiAoY29tbWFuZCkge1xuICBBTExfQ09NTUFORFNfU0VUW2NvbW1hbmRdID0gdHJ1ZTtcbn0pO1xuXG5mdW5jdGlvbiBpbnZhcmlhbnRBcnJheUNhc2UodmFsdWUsIHNwZWMsIGNvbW1hbmQpIHtcbiAgIUFycmF5LmlzQXJyYXkodmFsdWUpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ3VwZGF0ZSgpOiBleHBlY3RlZCB0YXJnZXQgb2YgJXMgdG8gYmUgYW4gYXJyYXk7IGdvdCAlcy4nLCBjb21tYW5kLCB2YWx1ZSkgOiBpbnZhcmlhbnQoZmFsc2UpIDogdW5kZWZpbmVkO1xuICB2YXIgc3BlY1ZhbHVlID0gc3BlY1tjb21tYW5kXTtcbiAgIUFycmF5LmlzQXJyYXkoc3BlY1ZhbHVlKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICd1cGRhdGUoKTogZXhwZWN0ZWQgc3BlYyBvZiAlcyB0byBiZSBhbiBhcnJheTsgZ290ICVzLiAnICsgJ0RpZCB5b3UgZm9yZ2V0IHRvIHdyYXAgeW91ciBwYXJhbWV0ZXIgaW4gYW4gYXJyYXk/JywgY29tbWFuZCwgc3BlY1ZhbHVlKSA6IGludmFyaWFudChmYWxzZSkgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZSh2YWx1ZSwgc3BlYykge1xuICAhKHR5cGVvZiBzcGVjID09PSAnb2JqZWN0JykgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAndXBkYXRlKCk6IFlvdSBwcm92aWRlZCBhIGtleSBwYXRoIHRvIHVwZGF0ZSgpIHRoYXQgZGlkIG5vdCBjb250YWluIG9uZSAnICsgJ29mICVzLiBEaWQgeW91IGZvcmdldCB0byBpbmNsdWRlIHslczogLi4ufT8nLCBBTExfQ09NTUFORFNfTElTVC5qb2luKCcsICcpLCBDT01NQU5EX1NFVCkgOiBpbnZhcmlhbnQoZmFsc2UpIDogdW5kZWZpbmVkO1xuXG4gIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHNwZWMsIENPTU1BTkRfU0VUKSkge1xuICAgICEoT2JqZWN0LmtleXMoc3BlYykubGVuZ3RoID09PSAxKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdDYW5ub3QgaGF2ZSBtb3JlIHRoYW4gb25lIGtleSBpbiBhbiBvYmplY3Qgd2l0aCAlcycsIENPTU1BTkRfU0VUKSA6IGludmFyaWFudChmYWxzZSkgOiB1bmRlZmluZWQ7XG5cbiAgICByZXR1cm4gc3BlY1tDT01NQU5EX1NFVF07XG4gIH1cblxuICB2YXIgbmV4dFZhbHVlID0gc2hhbGxvd0NvcHkodmFsdWUpO1xuXG4gIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHNwZWMsIENPTU1BTkRfTUVSR0UpKSB7XG4gICAgdmFyIG1lcmdlT2JqID0gc3BlY1tDT01NQU5EX01FUkdFXTtcbiAgICAhKG1lcmdlT2JqICYmIHR5cGVvZiBtZXJnZU9iaiA9PT0gJ29iamVjdCcpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ3VwZGF0ZSgpOiAlcyBleHBlY3RzIGEgc3BlYyBvZiB0eXBlIFxcJ29iamVjdFxcJzsgZ290ICVzJywgQ09NTUFORF9NRVJHRSwgbWVyZ2VPYmopIDogaW52YXJpYW50KGZhbHNlKSA6IHVuZGVmaW5lZDtcbiAgICAhKG5leHRWYWx1ZSAmJiB0eXBlb2YgbmV4dFZhbHVlID09PSAnb2JqZWN0JykgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAndXBkYXRlKCk6ICVzIGV4cGVjdHMgYSB0YXJnZXQgb2YgdHlwZSBcXCdvYmplY3RcXCc7IGdvdCAlcycsIENPTU1BTkRfTUVSR0UsIG5leHRWYWx1ZSkgOiBpbnZhcmlhbnQoZmFsc2UpIDogdW5kZWZpbmVkO1xuICAgIGFzc2lnbihuZXh0VmFsdWUsIHNwZWNbQ09NTUFORF9NRVJHRV0pO1xuICB9XG5cbiAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoc3BlYywgQ09NTUFORF9QVVNIKSkge1xuICAgIGludmFyaWFudEFycmF5Q2FzZSh2YWx1ZSwgc3BlYywgQ09NTUFORF9QVVNIKTtcbiAgICBzcGVjW0NPTU1BTkRfUFVTSF0uZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgbmV4dFZhbHVlLnB1c2goaXRlbSk7XG4gICAgfSk7XG4gIH1cblxuICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChzcGVjLCBDT01NQU5EX1VOU0hJRlQpKSB7XG4gICAgaW52YXJpYW50QXJyYXlDYXNlKHZhbHVlLCBzcGVjLCBDT01NQU5EX1VOU0hJRlQpO1xuICAgIHNwZWNbQ09NTUFORF9VTlNISUZUXS5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICBuZXh0VmFsdWUudW5zaGlmdChpdGVtKTtcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHNwZWMsIENPTU1BTkRfU1BMSUNFKSkge1xuICAgICFBcnJheS5pc0FycmF5KHZhbHVlKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdFeHBlY3RlZCAlcyB0YXJnZXQgdG8gYmUgYW4gYXJyYXk7IGdvdCAlcycsIENPTU1BTkRfU1BMSUNFLCB2YWx1ZSkgOiBpbnZhcmlhbnQoZmFsc2UpIDogdW5kZWZpbmVkO1xuICAgICFBcnJheS5pc0FycmF5KHNwZWNbQ09NTUFORF9TUExJQ0VdKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICd1cGRhdGUoKTogZXhwZWN0ZWQgc3BlYyBvZiAlcyB0byBiZSBhbiBhcnJheSBvZiBhcnJheXM7IGdvdCAlcy4gJyArICdEaWQgeW91IGZvcmdldCB0byB3cmFwIHlvdXIgcGFyYW1ldGVycyBpbiBhbiBhcnJheT8nLCBDT01NQU5EX1NQTElDRSwgc3BlY1tDT01NQU5EX1NQTElDRV0pIDogaW52YXJpYW50KGZhbHNlKSA6IHVuZGVmaW5lZDtcbiAgICBzcGVjW0NPTU1BTkRfU1BMSUNFXS5mb3JFYWNoKGZ1bmN0aW9uIChhcmdzKSB7XG4gICAgICAhQXJyYXkuaXNBcnJheShhcmdzKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICd1cGRhdGUoKTogZXhwZWN0ZWQgc3BlYyBvZiAlcyB0byBiZSBhbiBhcnJheSBvZiBhcnJheXM7IGdvdCAlcy4gJyArICdEaWQgeW91IGZvcmdldCB0byB3cmFwIHlvdXIgcGFyYW1ldGVycyBpbiBhbiBhcnJheT8nLCBDT01NQU5EX1NQTElDRSwgc3BlY1tDT01NQU5EX1NQTElDRV0pIDogaW52YXJpYW50KGZhbHNlKSA6IHVuZGVmaW5lZDtcbiAgICAgIG5leHRWYWx1ZS5zcGxpY2UuYXBwbHkobmV4dFZhbHVlLCBhcmdzKTtcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHNwZWMsIENPTU1BTkRfQVBQTFkpKSB7XG4gICAgISh0eXBlb2Ygc3BlY1tDT01NQU5EX0FQUExZXSA9PT0gJ2Z1bmN0aW9uJykgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAndXBkYXRlKCk6IGV4cGVjdGVkIHNwZWMgb2YgJXMgdG8gYmUgYSBmdW5jdGlvbjsgZ290ICVzLicsIENPTU1BTkRfQVBQTFksIHNwZWNbQ09NTUFORF9BUFBMWV0pIDogaW52YXJpYW50KGZhbHNlKSA6IHVuZGVmaW5lZDtcbiAgICBuZXh0VmFsdWUgPSBzcGVjW0NPTU1BTkRfQVBQTFldKG5leHRWYWx1ZSk7XG4gIH1cblxuICBmb3IgKHZhciBrIGluIHNwZWMpIHtcbiAgICBpZiAoIShBTExfQ09NTUFORFNfU0VULmhhc093blByb3BlcnR5KGspICYmIEFMTF9DT01NQU5EU19TRVRba10pKSB7XG4gICAgICBuZXh0VmFsdWVba10gPSB1cGRhdGUodmFsdWVba10sIHNwZWNba10pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXh0VmFsdWU7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdXBkYXRlO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L3JlYWN0L2xpYi91cGRhdGUuanNcbiAqKiBtb2R1bGUgaWQgPSA1XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvKipcbiAqIENvcHlyaWdodCAyMDE0LTIwMTUsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBAcHJvdmlkZXNNb2R1bGUgT2JqZWN0LmFzc2lnblxuICovXG5cbi8vIGh0dHBzOi8vcGVvcGxlLm1vemlsbGEub3JnL35qb3JlbmRvcmZmL2VzNi1kcmFmdC5odG1sI3NlYy1vYmplY3QuYXNzaWduXG5cbid1c2Ugc3RyaWN0JztcblxuZnVuY3Rpb24gYXNzaWduKHRhcmdldCwgc291cmNlcykge1xuICBpZiAodGFyZ2V0ID09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdPYmplY3QuYXNzaWduIHRhcmdldCBjYW5ub3QgYmUgbnVsbCBvciB1bmRlZmluZWQnKTtcbiAgfVxuXG4gIHZhciB0byA9IE9iamVjdCh0YXJnZXQpO1xuICB2YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuXG4gIGZvciAodmFyIG5leHRJbmRleCA9IDE7IG5leHRJbmRleCA8IGFyZ3VtZW50cy5sZW5ndGg7IG5leHRJbmRleCsrKSB7XG4gICAgdmFyIG5leHRTb3VyY2UgPSBhcmd1bWVudHNbbmV4dEluZGV4XTtcbiAgICBpZiAobmV4dFNvdXJjZSA9PSBudWxsKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICB2YXIgZnJvbSA9IE9iamVjdChuZXh0U291cmNlKTtcblxuICAgIC8vIFdlIGRvbid0IGN1cnJlbnRseSBzdXBwb3J0IGFjY2Vzc29ycyBub3IgcHJveGllcy4gVGhlcmVmb3JlIHRoaXNcbiAgICAvLyBjb3B5IGNhbm5vdCB0aHJvdy4gSWYgd2UgZXZlciBzdXBwb3J0ZWQgdGhpcyB0aGVuIHdlIG11c3QgaGFuZGxlXG4gICAgLy8gZXhjZXB0aW9ucyBhbmQgc2lkZS1lZmZlY3RzLiBXZSBkb24ndCBzdXBwb3J0IHN5bWJvbHMgc28gdGhleSB3b24ndFxuICAgIC8vIGJlIHRyYW5zZmVycmVkLlxuXG4gICAgZm9yICh2YXIga2V5IGluIGZyb20pIHtcbiAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGZyb20sIGtleSkpIHtcbiAgICAgICAgdG9ba2V5XSA9IGZyb21ba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdG87XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXNzaWduO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L3JlYWN0L2xpYi9PYmplY3QuYXNzaWduLmpzXG4gKiogbW9kdWxlIGlkID0gNlxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy0yMDE1LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogQHByb3ZpZGVzTW9kdWxlIGtleU9mXG4gKi9cblxuLyoqXG4gKiBBbGxvd3MgZXh0cmFjdGlvbiBvZiBhIG1pbmlmaWVkIGtleS4gTGV0J3MgdGhlIGJ1aWxkIHN5c3RlbSBtaW5pZnkga2V5c1xuICogd2l0aG91dCBsb3NpbmcgdGhlIGFiaWxpdHkgdG8gZHluYW1pY2FsbHkgdXNlIGtleSBzdHJpbmdzIGFzIHZhbHVlc1xuICogdGhlbXNlbHZlcy4gUGFzcyBpbiBhbiBvYmplY3Qgd2l0aCBhIHNpbmdsZSBrZXkvdmFsIHBhaXIgYW5kIGl0IHdpbGwgcmV0dXJuXG4gKiB5b3UgdGhlIHN0cmluZyBrZXkgb2YgdGhhdCBzaW5nbGUgcmVjb3JkLiBTdXBwb3NlIHlvdSB3YW50IHRvIGdyYWIgdGhlXG4gKiB2YWx1ZSBmb3IgYSBrZXkgJ2NsYXNzTmFtZScgaW5zaWRlIG9mIGFuIG9iamVjdC4gS2V5L3ZhbCBtaW5pZmljYXRpb24gbWF5XG4gKiBoYXZlIGFsaWFzZWQgdGhhdCBrZXkgdG8gYmUgJ3hhMTInLiBrZXlPZih7Y2xhc3NOYW1lOiBudWxsfSkgd2lsbCByZXR1cm5cbiAqICd4YTEyJyBpbiB0aGF0IGNhc2UuIFJlc29sdmUga2V5cyB5b3Ugd2FudCB0byB1c2Ugb25jZSBhdCBzdGFydHVwIHRpbWUsIHRoZW5cbiAqIHJldXNlIHRob3NlIHJlc29sdXRpb25zLlxuICovXG5cInVzZSBzdHJpY3RcIjtcblxudmFyIGtleU9mID0gZnVuY3Rpb24gKG9uZUtleU9iaikge1xuICB2YXIga2V5O1xuICBmb3IgKGtleSBpbiBvbmVLZXlPYmopIHtcbiAgICBpZiAoIW9uZUtleU9iai5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgcmV0dXJuIGtleTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ga2V5T2Y7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vcmVhY3Qvfi9mYmpzL2xpYi9rZXlPZi5qc1xuICoqIG1vZHVsZSBpZCA9IDdcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtMjAxNSwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIEBwcm92aWRlc01vZHVsZSBpbnZhcmlhbnRcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogVXNlIGludmFyaWFudCgpIHRvIGFzc2VydCBzdGF0ZSB3aGljaCB5b3VyIHByb2dyYW0gYXNzdW1lcyB0byBiZSB0cnVlLlxuICpcbiAqIFByb3ZpZGUgc3ByaW50Zi1zdHlsZSBmb3JtYXQgKG9ubHkgJXMgaXMgc3VwcG9ydGVkKSBhbmQgYXJndW1lbnRzXG4gKiB0byBwcm92aWRlIGluZm9ybWF0aW9uIGFib3V0IHdoYXQgYnJva2UgYW5kIHdoYXQgeW91IHdlcmVcbiAqIGV4cGVjdGluZy5cbiAqXG4gKiBUaGUgaW52YXJpYW50IG1lc3NhZ2Ugd2lsbCBiZSBzdHJpcHBlZCBpbiBwcm9kdWN0aW9uLCBidXQgdGhlIGludmFyaWFudFxuICogd2lsbCByZW1haW4gdG8gZW5zdXJlIGxvZ2ljIGRvZXMgbm90IGRpZmZlciBpbiBwcm9kdWN0aW9uLlxuICovXG5cbmZ1bmN0aW9uIGludmFyaWFudChjb25kaXRpb24sIGZvcm1hdCwgYSwgYiwgYywgZCwgZSwgZikge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGlmIChmb3JtYXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhcmlhbnQgcmVxdWlyZXMgYW4gZXJyb3IgbWVzc2FnZSBhcmd1bWVudCcpO1xuICAgIH1cbiAgfVxuXG4gIGlmICghY29uZGl0aW9uKSB7XG4gICAgdmFyIGVycm9yO1xuICAgIGlmIChmb3JtYXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgZXJyb3IgPSBuZXcgRXJyb3IoJ01pbmlmaWVkIGV4Y2VwdGlvbiBvY2N1cnJlZDsgdXNlIHRoZSBub24tbWluaWZpZWQgZGV2IGVudmlyb25tZW50ICcgKyAnZm9yIHRoZSBmdWxsIGVycm9yIG1lc3NhZ2UgYW5kIGFkZGl0aW9uYWwgaGVscGZ1bCB3YXJuaW5ncy4nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGFyZ3MgPSBbYSwgYiwgYywgZCwgZSwgZl07XG4gICAgICB2YXIgYXJnSW5kZXggPSAwO1xuICAgICAgZXJyb3IgPSBuZXcgRXJyb3IoZm9ybWF0LnJlcGxhY2UoLyVzL2csIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGFyZ3NbYXJnSW5kZXgrK107XG4gICAgICB9KSk7XG4gICAgICBlcnJvci5uYW1lID0gJ0ludmFyaWFudCBWaW9sYXRpb24nO1xuICAgIH1cblxuICAgIGVycm9yLmZyYW1lc1RvUG9wID0gMTsgLy8gd2UgZG9uJ3QgY2FyZSBhYm91dCBpbnZhcmlhbnQncyBvd24gZnJhbWVcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGludmFyaWFudDtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9yZWFjdC9+L2ZianMvbGliL2ludmFyaWFudC5qc1xuICoqIG1vZHVsZSBpZCA9IDhcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciBwU2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7XG52YXIgb2JqZWN0S2V5cyA9IHJlcXVpcmUoJy4vbGliL2tleXMuanMnKTtcbnZhciBpc0FyZ3VtZW50cyA9IHJlcXVpcmUoJy4vbGliL2lzX2FyZ3VtZW50cy5qcycpO1xuXG52YXIgZGVlcEVxdWFsID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYWN0dWFsLCBleHBlY3RlZCwgb3B0cykge1xuICBpZiAoIW9wdHMpIG9wdHMgPSB7fTtcbiAgLy8gNy4xLiBBbGwgaWRlbnRpY2FsIHZhbHVlcyBhcmUgZXF1aXZhbGVudCwgYXMgZGV0ZXJtaW5lZCBieSA9PT0uXG4gIGlmIChhY3R1YWwgPT09IGV4cGVjdGVkKSB7XG4gICAgcmV0dXJuIHRydWU7XG5cbiAgfSBlbHNlIGlmIChhY3R1YWwgaW5zdGFuY2VvZiBEYXRlICYmIGV4cGVjdGVkIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgIHJldHVybiBhY3R1YWwuZ2V0VGltZSgpID09PSBleHBlY3RlZC5nZXRUaW1lKCk7XG5cbiAgLy8gNy4zLiBPdGhlciBwYWlycyB0aGF0IGRvIG5vdCBib3RoIHBhc3MgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnLFxuICAvLyBlcXVpdmFsZW5jZSBpcyBkZXRlcm1pbmVkIGJ5ID09LlxuICB9IGVsc2UgaWYgKHR5cGVvZiBhY3R1YWwgIT0gJ29iamVjdCcgJiYgdHlwZW9mIGV4cGVjdGVkICE9ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIG9wdHMuc3RyaWN0ID8gYWN0dWFsID09PSBleHBlY3RlZCA6IGFjdHVhbCA9PSBleHBlY3RlZDtcblxuICAvLyA3LjQuIEZvciBhbGwgb3RoZXIgT2JqZWN0IHBhaXJzLCBpbmNsdWRpbmcgQXJyYXkgb2JqZWN0cywgZXF1aXZhbGVuY2UgaXNcbiAgLy8gZGV0ZXJtaW5lZCBieSBoYXZpbmcgdGhlIHNhbWUgbnVtYmVyIG9mIG93bmVkIHByb3BlcnRpZXMgKGFzIHZlcmlmaWVkXG4gIC8vIHdpdGggT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKSwgdGhlIHNhbWUgc2V0IG9mIGtleXNcbiAgLy8gKGFsdGhvdWdoIG5vdCBuZWNlc3NhcmlseSB0aGUgc2FtZSBvcmRlciksIGVxdWl2YWxlbnQgdmFsdWVzIGZvciBldmVyeVxuICAvLyBjb3JyZXNwb25kaW5nIGtleSwgYW5kIGFuIGlkZW50aWNhbCAncHJvdG90eXBlJyBwcm9wZXJ0eS4gTm90ZTogdGhpc1xuICAvLyBhY2NvdW50cyBmb3IgYm90aCBuYW1lZCBhbmQgaW5kZXhlZCBwcm9wZXJ0aWVzIG9uIEFycmF5cy5cbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gb2JqRXF1aXYoYWN0dWFsLCBleHBlY3RlZCwgb3B0cyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNVbmRlZmluZWRPck51bGwodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGlzQnVmZmVyICh4KSB7XG4gIGlmICgheCB8fCB0eXBlb2YgeCAhPT0gJ29iamVjdCcgfHwgdHlwZW9mIHgubGVuZ3RoICE9PSAnbnVtYmVyJykgcmV0dXJuIGZhbHNlO1xuICBpZiAodHlwZW9mIHguY29weSAhPT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgeC5zbGljZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoeC5sZW5ndGggPiAwICYmIHR5cGVvZiB4WzBdICE9PSAnbnVtYmVyJykgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gb2JqRXF1aXYoYSwgYiwgb3B0cykge1xuICB2YXIgaSwga2V5O1xuICBpZiAoaXNVbmRlZmluZWRPck51bGwoYSkgfHwgaXNVbmRlZmluZWRPck51bGwoYikpXG4gICAgcmV0dXJuIGZhbHNlO1xuICAvLyBhbiBpZGVudGljYWwgJ3Byb3RvdHlwZScgcHJvcGVydHkuXG4gIGlmIChhLnByb3RvdHlwZSAhPT0gYi5wcm90b3R5cGUpIHJldHVybiBmYWxzZTtcbiAgLy9+fn5JJ3ZlIG1hbmFnZWQgdG8gYnJlYWsgT2JqZWN0LmtleXMgdGhyb3VnaCBzY3Jld3kgYXJndW1lbnRzIHBhc3NpbmcuXG4gIC8vICAgQ29udmVydGluZyB0byBhcnJheSBzb2x2ZXMgdGhlIHByb2JsZW0uXG4gIGlmIChpc0FyZ3VtZW50cyhhKSkge1xuICAgIGlmICghaXNBcmd1bWVudHMoYikpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgYSA9IHBTbGljZS5jYWxsKGEpO1xuICAgIGIgPSBwU2xpY2UuY2FsbChiKTtcbiAgICByZXR1cm4gZGVlcEVxdWFsKGEsIGIsIG9wdHMpO1xuICB9XG4gIGlmIChpc0J1ZmZlcihhKSkge1xuICAgIGlmICghaXNCdWZmZXIoYikpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGEubGVuZ3RoICE9PSBiLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAoaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoYVtpXSAhPT0gYltpXSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICB0cnkge1xuICAgIHZhciBrYSA9IG9iamVjdEtleXMoYSksXG4gICAgICAgIGtiID0gb2JqZWN0S2V5cyhiKTtcbiAgfSBjYXRjaCAoZSkgey8vaGFwcGVucyB3aGVuIG9uZSBpcyBhIHN0cmluZyBsaXRlcmFsIGFuZCB0aGUgb3RoZXIgaXNuJ3RcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLy8gaGF2aW5nIHRoZSBzYW1lIG51bWJlciBvZiBvd25lZCBwcm9wZXJ0aWVzIChrZXlzIGluY29ycG9yYXRlc1xuICAvLyBoYXNPd25Qcm9wZXJ0eSlcbiAgaWYgKGthLmxlbmd0aCAhPSBrYi5sZW5ndGgpXG4gICAgcmV0dXJuIGZhbHNlO1xuICAvL3RoZSBzYW1lIHNldCBvZiBrZXlzIChhbHRob3VnaCBub3QgbmVjZXNzYXJpbHkgdGhlIHNhbWUgb3JkZXIpLFxuICBrYS5zb3J0KCk7XG4gIGtiLnNvcnQoKTtcbiAgLy9+fn5jaGVhcCBrZXkgdGVzdFxuICBmb3IgKGkgPSBrYS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIGlmIChrYVtpXSAhPSBrYltpXSlcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAvL2VxdWl2YWxlbnQgdmFsdWVzIGZvciBldmVyeSBjb3JyZXNwb25kaW5nIGtleSwgYW5kXG4gIC8vfn5+cG9zc2libHkgZXhwZW5zaXZlIGRlZXAgdGVzdFxuICBmb3IgKGkgPSBrYS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIGtleSA9IGthW2ldO1xuICAgIGlmICghZGVlcEVxdWFsKGFba2V5XSwgYltrZXldLCBvcHRzKSkgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0eXBlb2YgYSA9PT0gdHlwZW9mIGI7XG59XG5cblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9kZWVwLWVxdWFsL2luZGV4LmpzXG4gKiogbW9kdWxlIGlkID0gOVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gdHlwZW9mIE9iamVjdC5rZXlzID09PSAnZnVuY3Rpb24nXG4gID8gT2JqZWN0LmtleXMgOiBzaGltO1xuXG5leHBvcnRzLnNoaW0gPSBzaGltO1xuZnVuY3Rpb24gc2hpbSAob2JqKSB7XG4gIHZhciBrZXlzID0gW107XG4gIGZvciAodmFyIGtleSBpbiBvYmopIGtleXMucHVzaChrZXkpO1xuICByZXR1cm4ga2V5cztcbn1cblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2RlZXAtZXF1YWwvbGliL2tleXMuanNcbiAqKiBtb2R1bGUgaWQgPSAxMFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwidmFyIHN1cHBvcnRzQXJndW1lbnRzQ2xhc3MgPSAoZnVuY3Rpb24oKXtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhcmd1bWVudHMpXG59KSgpID09ICdbb2JqZWN0IEFyZ3VtZW50c10nO1xuXG5leHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBzdXBwb3J0c0FyZ3VtZW50c0NsYXNzID8gc3VwcG9ydGVkIDogdW5zdXBwb3J0ZWQ7XG5cbmV4cG9ydHMuc3VwcG9ydGVkID0gc3VwcG9ydGVkO1xuZnVuY3Rpb24gc3VwcG9ydGVkKG9iamVjdCkge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iamVjdCkgPT0gJ1tvYmplY3QgQXJndW1lbnRzXSc7XG59O1xuXG5leHBvcnRzLnVuc3VwcG9ydGVkID0gdW5zdXBwb3J0ZWQ7XG5mdW5jdGlvbiB1bnN1cHBvcnRlZChvYmplY3Qpe1xuICByZXR1cm4gb2JqZWN0ICYmXG4gICAgdHlwZW9mIG9iamVjdCA9PSAnb2JqZWN0JyAmJlxuICAgIHR5cGVvZiBvYmplY3QubGVuZ3RoID09ICdudW1iZXInICYmXG4gICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgJ2NhbGxlZScpICYmXG4gICAgIU9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChvYmplY3QsICdjYWxsZWUnKSB8fFxuICAgIGZhbHNlO1xufTtcblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2RlZXAtZXF1YWwvbGliL2lzX2FyZ3VtZW50cy5qc1xuICoqIG1vZHVsZSBpZCA9IDExXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJpbXBvcnQgaXNFcXVhbCBmcm9tICdkZWVwLWVxdWFsJztcbmltcG9ydCB7dXBkYXRlSW59IGZyb20gJ3VwZGF0ZS1pbic7XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmQoYXJyYXksIHByZWRpY2F0ZSkge1xuICBpZiAodHlwZW9mIHByZWRpY2F0ZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3ByZWRpY2F0ZSBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgfVxuICB2YXIgbGlzdCA9IE9iamVjdChhcnJheSk7XG4gIHZhciBsZW5ndGggPSBsaXN0Lmxlbmd0aCA+Pj4gMDtcbiAgdmFyIHRoaXNBcmcgPSBhcmd1bWVudHNbMV07XG4gIHZhciB2YWx1ZTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgdmFsdWUgPSBsaXN0W2ldO1xuICAgIGlmIChwcmVkaWNhdGUuY2FsbCh0aGlzQXJnLCB2YWx1ZSwgaSwgbGlzdCkpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEluKHRyZWUsIHBhdGhzKSB7IC8vIHRoaXMgaXMgZ2V0LWluIGluIGNsb2p1cmVcbiAgcmV0dXJuIHJlZHVjZShwYXRocywgZ2V0LCB0cmVlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldChvYmosIGtleSkge1xuICBjb25zb2xlLmFzc2VydChrZXkgaW4gb2JqLCBgQmFkIGN1cnNvciByZWZpbmU6ICcke2tleX0nIG5vdCBmb3VuZCBpbiBgLCBvYmopO1xuICByZXR1cm4gb2JqW2tleV07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbml0aWFsKGFycmF5KSB7XG4gIHJldHVybiBhcnJheS5zbGljZSgwLCBhcnJheS5sZW5ndGggLSAxKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlZHVjZShhcnJheSwgZiwgbXplcm8pIHtcbiAgcmV0dXJuIGFycmF5LnJlZHVjZShmLCBtemVybyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmbGF0dGVuKGxpc3RPZkxpc3RzKSB7XG4gIHJldHVybiBbXS5jb25jYXQuYXBwbHkoW10sIGxpc3RPZkxpc3RzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhaXJzKG9iaikge1xuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iaik7XG4gIHZhciBsZW5ndGggPSBrZXlzLmxlbmd0aDtcbiAgdmFyIHBhaXJzID0gQXJyYXkobGVuZ3RoKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgIHBhaXJzW2ldID0gW2tleXNbaV0sIG9ialtrZXlzW2ldXV07XG4gIH1cbiAgcmV0dXJuIHBhaXJzO1xufTtcblxuLyoqXG4gKiBIYXNoIG9mIG51bGwgaXMgbnVsbCwgaGFzaCBvZiB1bmRlZmluZWQgaXMgdW5kZWZpbmVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNoU3RyaW5nKHN0cikge1xuICB2YXIgaGFzaCA9IDAsIGksIGNoLCBsO1xuICBpZiAoc3RyID09PSB1bmRlZmluZWQgfHwgc3RyID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gc3RyO1xuICB9XG4gIGlmIChzdHIubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gaGFzaDtcbiAgfVxuICBmb3IgKGkgPSAwLCBsID0gc3RyLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgY2ggID0gc3RyLmNoYXJDb2RlQXQoaSk7XG4gICAgICBoYXNoICA9ICgoaGFzaCA8PCA1KSAtIGhhc2gpICsgY2g7XG4gICAgICBoYXNoIHw9IDA7IC8vIENvbnZlcnQgdG8gMzJiaXQgaW50ZWdlclxuICB9XG4gIHJldHVybiBoYXNoO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFzaFJlY29yZChyZWNvcmQpIHtcbiAgICByZXR1cm4gaGFzaFN0cmluZyhKU09OLnN0cmluZ2lmeShyZWNvcmQpKTtcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZSBhIHVuaXF1ZSB0aGluZyB0byB1c2UgYXMgYSBtZW1vaXplIHJlc29sdmVyIGhhc2ggZm9yIHJlZmVyZW5jZSB0eXBlcy5cbiAqL1xubGV0IHJlZnNDYWNoZSA9IG5ldyBXZWFrTWFwKCk7XG52YXIgY2FjaGVJZEluZGV4ID0gMDtcbmV4cG9ydCBmdW5jdGlvbiByZWZUb0hhc2ggKG8pIHtcbiAgbGV0IGNhY2hlZFVpZCA9IHJlZnNDYWNoZS5nZXQobyk7XG4gIGxldCB1aWQgPSAgY2FjaGVkVWlkIHx8IChjYWNoZUlkSW5kZXgrKykudG9TdHJpbmcoKTtcbiAgIWNhY2hlZFVpZCAmJiByZWZzQ2FjaGUuc2V0KG8sIHVpZCk7XG4gIHJldHVybiB1aWQ7XG59XG5cbmxldCBpZGVudGl0eSA9IHggPT4geDtcblxuZXhwb3J0IGZ1bmN0aW9uIG1lbW9pemVkIChoYXNoZXIgPSBpZGVudGl0eSwgZikge1xuICB2YXIgY2FjaGUgPSB7fTtcbiAgcmV0dXJuICguLi5hcmdzKSA9PiB7XG4gICAgLy8gaGFzaGVyIGdldHMgdGhlIHNhbWUgYXJndW1lbnRzIGFzIGYsIHRvIGNyZWF0ZSB0aGUgaGFzaEtleVxuICAgIGNvbnN0IGhhc2hLZXkgPSBoYXNoZXIuYXBwbHkodGhpcywgYXJncyk7XG4gICAgcmV0dXJuIGhhc093blByb3BlcnR5LmNhbGwoY2FjaGUsIGhhc2hLZXkpXG4gICAgICAgID8gY2FjaGVbaGFzaEtleV1cbiAgICAgICAgOiAoY2FjaGVbaGFzaEtleV0gPSBmLmFwcGx5KHRoaXMsIGFyZ3MpKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gaXNPYmplY3QodmFsdWUpIHtcbiAgcmV0dXJuICEhdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnO1xufVxuXG4vLyBjb3B5IGZyb20gTUROIGV4YW1wbGU6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL09iamVjdC9mcmVlemUjRXhhbXBsZXNcbmV4cG9ydCBmdW5jdGlvbiBkZWVwRnJlZXplKG9iaikge1xuICBpZiAodHlwZW9mIE9iamVjdC5mcmVlemUgIT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgaWYgKCFpc09iamVjdChvYmopKSB7XG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIC8vIFJldHJpZXZlIHRoZSBwcm9wZXJ0eSBuYW1lcyBkZWZpbmVkIG9uIG9ialxuICB2YXIgcHJvcE5hbWVzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMob2JqKTtcblxuICAvLyBGcmVlemUgcHJvcGVydGllcyBiZWZvcmUgZnJlZXppbmcgc2VsZlxuICBwcm9wTmFtZXMuZm9yRWFjaChmdW5jdGlvbihuYW1lKSB7XG4gICAgdmFyIHByb3AgPSBvYmpbbmFtZV07XG5cbiAgICAvLyBGcmVlemUgcHJvcCBpZiBpdCBpcyBhbiBvYmplY3RcbiAgICBpZiAoaXNPYmplY3QocHJvcCkgJiYgIU9iamVjdC5pc0Zyb3plbihwcm9wKSkge1xuICAgICAgZGVlcEZyZWV6ZShwcm9wKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIEZyZWV6ZSBzZWxmXG4gIHJldHVybiBPYmplY3QuZnJlZXplKG9iaik7XG59XG5cbmV4cG9ydCBjb25zdCB2YWxFcSA9IChhLCBiKSA9PiBpc0VxdWFsKGEsIGIpO1xuZXhwb3J0IGNvbnN0IHJlZkVxID0gKGEsIGIpID0+IGEgPT09IGI7XG5cbmV4cG9ydCBsZXQgcm9vdEF0ID0gKHNlZ21lbnRzLCBmbikgPT4gKHZhbHVlKSA9PiB1cGRhdGVJbih2YWx1ZSwgc2VnbWVudHMsIGZuKTtcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL3V0aWwuanNcbiAqKi8iLCJpbXBvcnQge21lbW9pemVkLCByZWZUb0hhc2h9IGZyb20gJy4vdXRpbCc7XG5cblxuLy8gVG8gc3VwcG9ydCBiaW5kaW5nIGN1cnNvcnMgdG8gcmVhY3Qgc3RhdGUsIHdlIG5lZWQgY21wLnNldFN0YXRlIGFzIGEgZnVuY3Rpb24sIGFuZCB0aGUgZnVuY3Rpb25cbi8vIG5lZWRzIHRvIGJlID09PSBpZiBpdCBjb21lcyBmcm9tIHRoZSBzYW1lIHJlYWN0IGNvbXBvbmVudC4gU2luY2Vcbi8vIGBjbXAuc2V0U3RhdGUuYmluZChjbXApICE9PSBjbXAuc2V0U3RhdGUuYmluZChjbXApYCxcbi8vIHdlIG5lZWQgdG8gbWVtb2l6ZSBiYXNlZCBvbiB0aGUgY21wIHJlZmVyZW5jZS5cbmV4cG9ydCBsZXQgbWFrZVN3YXBGcm9tUmVhY3QgPSBtZW1vaXplZChyZWZUb0hhc2gsIGNtcCA9PiBjbXAuc2V0U3RhdGUuYmluZChjbXApKTtcbmV4cG9ydCBsZXQgbWFrZURlcmVmRnJvbVJlYWN0ID0gbWVtb2l6ZWQocmVmVG9IYXNoLCBjbXAgPT4gKCkgPT4gY21wLnN0YXRlKTtcbmV4cG9ydCBsZXQgbWFrZVZhbHVlRnJvbVJlYWN0ID0gY21wID0+IGNtcC5zdGF0ZTtcbmV4cG9ydCBsZXQgaXNSZWFjdENtcCA9IChhKSA9PiB0eXBlb2YgYS5fX3Byb3RvX18ucmVuZGVyID09PSBcImZ1bmN0aW9uXCI7XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9SZWFjdEFkYXB0ZXIuanNcbiAqKi8iLCJpbXBvcnQge21lbW9pemVkLCByZWZUb0hhc2gsIGhhc2hSZWNvcmQsIGdldEluLCByb290QXR9IGZyb20gJy4vdXRpbCc7XG5pbXBvcnQge21lcmdlLCBwdXNoLCB1bnNoaWZ0LCBzcGxpY2V9IGZyb20gJ3VwZGF0ZS1pbic7XG5pbXBvcnQge21ha2VEZXJlZkZyb21SZWFjdCwgbWFrZVN3YXBGcm9tUmVhY3QsIGlzUmVhY3RDbXB9IGZyb20gJy4vUmVhY3RBZGFwdGVyJztcblxuXG5sZXQgbWFrZVJlZmluZWRTd2FwID0gbWVtb2l6ZWQoXG4gIChzd2FwRm4sIHBhdGhzKSA9PiByZWZUb0hhc2goc3dhcEZuKSArIGhhc2hSZWNvcmQocGF0aHMpLFxuICAoc3dhcEZuLCBwYXRocykgPT4gKGYpID0+IHN3YXBGbihyb290QXQocGF0aHMsIGYpKSk7XG5cblxubGV0IG1ha2VSZWZpbmVkRGVyZWYgPSBtZW1vaXplZChcbiAgKGRlcmVmLCBwYXRocykgPT4gcmVmVG9IYXNoKGRlcmVmKSArIGhhc2hSZWNvcmQocGF0aHMpLFxuICAoZGVyZWYsIHBhdGhzKSA9PiAoKSA9PiBnZXRJbihkZXJlZigpLCBwYXRocykpO1xuXG5cbmNsYXNzIFJlZkN1cnNvciB7XG4gIGNvbnN0cnVjdG9yIChkZXJlZiwgc3dhcEZuKSB7XG4gICAgdGhpcy52YWx1ZSA9IGRlcmVmO1xuICAgIHRoaXMucmVmaW5lID0gKC4uLm1vcmVQYXRocykgPT4gTmV3UmVmQ3Vyc29yKG1ha2VSZWZpbmVkRGVyZWYoZGVyZWYsIG1vcmVQYXRocyksIG1ha2VSZWZpbmVkU3dhcChzd2FwRm4sIG1vcmVQYXRocykpO1xuICAgIHRoaXMuc3dhcCA9IChmLCAuLi5hcmdzKSA9PiBzd2FwRm4oKHYpID0+IGYuYXBwbHkobnVsbCwgW3ZdLmNvbmNhdChhcmdzKSkpO1xuXG4gICAgdGhpcy5zZXQgPSAodmFsKSA9PiB0aGlzLnN3YXAodiA9PiB2YWwpO1xuICAgIHRoaXMubWVyZ2UgPSAodmFsKSA9PiB0aGlzLnN3YXAobWVyZ2UsIHZhbCk7XG4gICAgdGhpcy5wdXNoID0gKHhzKSA9PiB0aGlzLnN3YXAocHVzaCwgeHMpO1xuICAgIHRoaXMudW5zaGlmdCA9ICh4cykgPT4gdGhpcy5zd2FwKHVuc2hpZnQsIHhzKTtcbiAgICB0aGlzLnNwbGljZSA9ICh4cykgPT4gdGhpcy5zd2FwKHNwbGljZSwgeHMpO1xuXG4gICAgLy8gUmVmQ3Vyc29ycyBkb24ndCBvd24gYSB2YWx1ZSwgc28gdGhleSBhcmVuJ3QgcmVzcG9uc2libGUgZm9yIGZyZWV6aW5nIGl0LlxuICB9XG59XG5cblxubGV0IE5ld1JlZkN1cnNvciA9IG1lbW9pemVkKFxuICAgIChkZXJlZiwgc3dhcCkgPT4gcmVmVG9IYXNoKGRlcmVmKSArIHJlZlRvSGFzaChzd2FwKSxcbiAgICAoZGVyZWYsIHN3YXApID0+IG5ldyBSZWZDdXJzb3IoZGVyZWYsIHN3YXApKTtcblxuXG5SZWZDdXJzb3IuYnVpbGQgPSAoZGVyZWYsIHN3YXApID0+IGlzUmVhY3RDbXAoZGVyZWYpXG4gICAgPyBOZXdSZWZDdXJzb3IobWFrZURlcmVmRnJvbVJlYWN0KGRlcmVmKSwgbWFrZVN3YXBGcm9tUmVhY3QoZGVyZWYpKVxuICAgIDogTmV3UmVmQ3Vyc29yKGRlcmVmLCBzd2FwKTtcblxuXG5leHBvcnQgZGVmYXVsdCBSZWZDdXJzb3I7XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9SZWZDdXJzb3IuanNcbiAqKi8iLCJpbXBvcnQgb21pdCBmcm9tICdvbWl0LWtleXMnO1xuaW1wb3J0IHt2YWxFcSwgcmVmRXF9IGZyb20gJy4vdXRpbCc7XG5cblxuZnVuY3Rpb24gSW1tdXRhYmxlT3B0aW1pemF0aW9ucyAocmVmRmllbGRzID0gW10sIGlnbm9yZWRGaWVsZHMgPSBbXSkge1xuICB2YXIgbm9WYWx1ZUNoZWNrRmllbGRzID0gcmVmRmllbGRzLmNvbmNhdChpZ25vcmVkRmllbGRzKTtcbiAgcmV0dXJuIHtcbiAgICBzaG91bGRDb21wb25lbnRVcGRhdGU6IGZ1bmN0aW9uIChuZXh0UHJvcHMpIHtcblxuICAgICAgdmFyIHZhbHVlc0NoYW5nZWQgPSAhdmFsRXEoXG4gICAgICAgIG9taXQobmV4dFByb3BzLCBub1ZhbHVlQ2hlY2tGaWVsZHMpLFxuICAgICAgICBvbWl0KHRoaXMucHJvcHMsIG5vVmFsdWVDaGVja0ZpZWxkcykpO1xuXG4gICAgICB2YXIgcmVmc0NoYW5nZWQgPSAhcmVmRmllbGRzLmV2ZXJ5KChmaWVsZCkgPT4ge1xuICAgICAgICByZXR1cm4gcmVmRXEodGhpcy5wcm9wc1tmaWVsZF0sIG5leHRQcm9wc1tmaWVsZF0pO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB2YWx1ZXNDaGFuZ2VkIHx8IHJlZnNDaGFuZ2VkO1xuICAgIH1cbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgSW1tdXRhYmxlT3B0aW1pemF0aW9ucztcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL0ltbXV0YWJsZU9wdGltaXphdGlvbnMuanNcbiAqKi8iLCIvKiFcbiAqIG9taXQta2V5IDxodHRwczovL2dpdGh1Yi5jb20vam9uc2NobGlua2VydC9vbWl0LWtleT5cbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQgSm9uIFNjaGxpbmtlcnQsIGNvbnRyaWJ1dG9ycy5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZVxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnaXNvYmplY3QnKTtcbnZhciBkaWZmZXJlbmNlID0gcmVxdWlyZSgnYXJyYXktZGlmZmVyZW5jZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIG9taXQob2JqLCBrZXlzKSB7XG4gIGlmICghaXNPYmplY3Qob2JqKSkge1xuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIHZhciBwcm9wcyA9IE9iamVjdC5rZXlzKG9iaik7XG4gIHZhciBsZW4gPSBwcm9wcy5sZW5ndGg7XG5cbiAga2V5cyA9IEFycmF5LmlzQXJyYXkoa2V5cykgPyBrZXlzIDogW2tleXNdO1xuICB2YXIgZGlmZiA9IGRpZmZlcmVuY2UocHJvcHMsIGtleXMpO1xuICB2YXIgbyA9IHt9O1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICB2YXIga2V5ID0gZGlmZltpXTtcblxuICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgb1trZXldID0gb2JqW2tleV07XG4gICAgfVxuICB9XG4gIHJldHVybiBvO1xufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9vbWl0LWtleXMvaW5kZXguanNcbiAqKiBtb2R1bGUgaWQgPSAxNlxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLyohXG4gKiBpc29iamVjdCA8aHR0cHM6Ly9naXRodWIuY29tL2pvbnNjaGxpbmtlcnQvaXNvYmplY3Q+XG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE0IEpvbiBTY2hsaW5rZXJ0LCBjb250cmlidXRvcnMuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2VcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogaXMgdGhlIHZhbHVlIGFuIG9iamVjdCwgYW5kIG5vdCBhbiBhcnJheT9cbiAqXG4gKiBAcGFyYW0gIHsqfSBgdmFsdWVgXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaXNPYmplY3Qobykge1xuICByZXR1cm4gbyAhPSBudWxsICYmIHR5cGVvZiBvID09PSAnb2JqZWN0J1xuICAgICYmICFBcnJheS5pc0FycmF5KG8pO1xufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9vbWl0LWtleXMvfi9pc29iamVjdC9pbmRleC5qc1xuICoqIG1vZHVsZSBpZCA9IDE3XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIoZnVuY3Rpb24oZ2xvYmFsKSB7XG5cblx0dmFyIGluZGV4T2YgPSBBcnJheS5wcm90b3R5cGUuaW5kZXhPZiB8fCBmdW5jdGlvbihlbGVtKSB7XG5cdFx0dmFyIGlkeCwgbGVuO1xuXG5cdFx0aWYgKHRoaXMgPT0gbnVsbCkge1xuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcihcImluZGV4T2YgY2FsbGVkIG9uIG51bGwgb3IgdW5kZWZpbmVkXCIpO1xuXHRcdH1cblxuXHRcdGZvciAoaWR4ID0gMCwgbGVuID0gdGhpcy5sZW5ndGg7IGlkeCA8IGxlbjsgKytpZHgpIHtcblx0XHRcdGlmICh0aGlzW2lkeF0gPT09IGVsZW0pIHtcblx0XHRcdFx0cmV0dXJuIGlkeDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gLTE7XG5cdH07XG5cblx0ZnVuY3Rpb24gZGlmZmVyZW5jZShhLCBiKSB7XG5cdFx0dmFyIGlkeCwgbGVuO1xuXHRcdHZhciByZXMgPSBbXTtcblxuXHRcdGZvciAoaWR4ID0gMCwgbGVuID0gYS5sZW5ndGg7IGlkeCA8IGxlbjsgKytpZHgpIHtcblx0XHRcdGlmIChpbmRleE9mLmNhbGwoYiwgYVtpZHhdKSA9PT0gLTEpIHtcblx0XHRcdFx0cmVzLnB1c2goYVtpZHhdKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0Zm9yIChpZHggPSAwLCBsZW4gPSBiLmxlbmd0aDsgaWR4IDwgbGVuOyArK2lkeCkge1xuXHRcdFx0aWYgKGluZGV4T2YuY2FsbChhLCBiW2lkeF0pID09PSAtMSkge1xuXHRcdFx0XHRyZXMucHVzaChiW2lkeF0pO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gcmVzO1xuXHR9XG5cblx0aWYgKHR5cGVvZiBtb2R1bGUgPT09IFwib2JqZWN0XCIgJiYgbW9kdWxlLmV4cG9ydHMpIHtcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGRpZmZlcmVuY2U7XG5cdH0gZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQpIHtcblx0XHRkZWZpbmUoZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gZGlmZmVyZW5jZTtcblx0XHR9KTtcblx0fSBlbHNlIHtcblx0XHRnbG9iYWwuZGlmZmVyZW5jZSA9IGRpZmZlcmVuY2U7XG5cdH1cblxufSh0aGlzKSk7XG5cblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9vbWl0LWtleXMvfi9hcnJheS1kaWZmZXJlbmNlL2RpZmZlcmVuY2UuanNcbiAqKiBtb2R1bGUgaWQgPSAxOFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIl0sInNvdXJjZVJvb3QiOiIifQ== \ No newline at end of file diff --git a/dist/react-cursor.min.js b/dist/react-cursor.min.js index 8e20453..ea07a4a 100644 --- a/dist/react-cursor.min.js +++ b/dist/react-cursor.min.js @@ -1,13 +1,13 @@ -!function(t,r){"object"==typeof exports&&"object"==typeof module?module.exports=r():"function"==typeof define&&define.amd?define([],r):"object"==typeof exports?exports.ReactCursor=r():t.ReactCursor=r()}(this,function(){return function(t){function r(n){if(e[n])return e[n].exports;var o=e[n]={exports:{},id:n,loaded:!1};return t[n].call(o.exports,o,o.exports,r),o.loaded=!0,o.exports}var e={};return r.m=t,r.c=e,r.p="",r(0)}([function(t,r,e){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}Object.defineProperty(r,"__esModule",{value:!0});var o=e(1),u=n(o),i=e(14),f=n(i),a=e(15),c=n(a);r["default"]={Cursor:u["default"],ImmutableOptimizations:c["default"],RefCursor:f["default"]},t.exports=r["default"]},function(t,r,e){"use strict";function n(t,r){if(!(t instanceof r))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(r,"__esModule",{value:!0});var o=e(2),u=e(11),i=e(13),f=!1,a=(0,u.memoized)(function(t,r){return(0,u.refToHash)(t)+(0,u.hashRecord)(r)},function(t,r){return function(e){return t((0,u.rootAt)(r,e))}}),c=function l(t,r){var e=this;n(this,l),this.value=function(){return t},this.refine=function(){for(var e=arguments.length,n=Array(e),o=0;e>o;o++)n[o]=arguments[o];return s((0,u.getIn)(t,n),a(r,n))},this.swap=function(t){for(var e=arguments.length,n=Array(e>1?e-1:0),o=1;e>o;o++)n[o-1]=arguments[o];return r(function(r){return t.apply(null,[r].concat(n))})},this.set=function(t){return e.swap(function(r){return t})},this.merge=function(t){return e.swap(o.merge,t)},this.push=function(t){return e.swap(o.push,t)},this.unshift=function(t){return e.swap(o.unshift,t)},this.splice=function(t){return e.swap(o.splice,t)},f&&(0,u.deepFreeze)(t)},s=(0,u.memoized)(function(t,r){return(0,u.refToHash)(r)+(0,u.hashRecord)(t)},function(t,r){return new c(t,r)});c.build=function(t,r){return(0,i.isReactCmp)(t)?s((0,i.makeValueFromReact)(t),(0,i.makeSwapFromReact)(t)):s(t,r)},r["default"]=c,t.exports=r["default"]},function(t,r,e){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}function o(t,r){return(0,p["default"])(t,{$merge:r})}function u(t,r){return(0,p["default"])(t,{$push:r})}function i(t,r){return(0,p["default"])(t,{$unshift:r})}function f(t,r){return(0,p["default"])(t,{$splice:r})}function a(t,r,e){for(var n=arguments.length,o=Array(n>3?n-3:0),u=3;n>u;u++)o[u-3]=arguments[u];var i,f=function(t){return e.apply(null,[t].concat(o))};if(r.length>0){var a=c(r,{$apply:f});i=(0,p["default"])(t,a)}else 0===r.length&&(i=f(t));return(0,d["default"])(t,i)?t:i}function c(t,r){return t.reduceRight(s,r)}function s(t,r){var e={};return e[r]=t,e}Object.defineProperty(r,"__esModule",{value:!0}),r.merge=o,r.push=u,r.unshift=i,r.splice=f,r.updateIn=a;var l=e(3),p=n(l),h=e(8),d=n(h)},function(t,r,e){t.exports=e(4)},function(t,r,e){"use strict";function n(t){return Array.isArray(t)?t.concat():t&&"object"==typeof t?i(new t.constructor,t):t}function o(t,r,e){Array.isArray(t)?void 0:a(!1);var n=r[e];Array.isArray(n)?void 0:a(!1)}function u(t,r){if("object"!=typeof r?a(!1):void 0,c.call(r,h))return 1!==Object.keys(r).length?a(!1):void 0,r[h];var e=n(t);if(c.call(r,d)){var f=r[d];f&&"object"==typeof f?void 0:a(!1),e&&"object"==typeof e?void 0:a(!1),i(e,r[d])}c.call(r,s)&&(o(t,r,s),r[s].forEach(function(t){e.push(t)})),c.call(r,l)&&(o(t,r,l),r[l].forEach(function(t){e.unshift(t)})),c.call(r,p)&&(Array.isArray(t)?void 0:a(!1),Array.isArray(r[p])?void 0:a(!1),r[p].forEach(function(t){Array.isArray(t)?void 0:a(!1),e.splice.apply(e,t)})),c.call(r,y)&&("function"!=typeof r[y]?a(!1):void 0,e=r[y](e));for(var v in r)m.hasOwnProperty(v)&&m[v]||(e[v]=u(t[v],r[v]));return e}var i=e(5),f=e(6),a=e(7),c={}.hasOwnProperty,s=f({$push:null}),l=f({$unshift:null}),p=f({$splice:null}),h=f({$set:null}),d=f({$merge:null}),y=f({$apply:null}),v=[s,l,p,h,d,y],m={};v.forEach(function(t){m[t]=!0}),t.exports=u},function(t,r){"use strict";function e(t,r){if(null==t)throw new TypeError("Object.assign target cannot be null or undefined");for(var e=Object(t),n=Object.prototype.hasOwnProperty,o=1;o0&&"number"!=typeof t[0]?!1:!0:!1}function u(t,r,e){var u,s;if(n(t)||n(r))return!1;if(t.prototype!==r.prototype)return!1;if(a(t))return a(r)?(t=i.call(t),r=i.call(r),c(t,r,e)):!1;if(o(t)){if(!o(r))return!1;if(t.length!==r.length)return!1;for(u=0;u=0;u--)if(l[u]!=p[u])return!1;for(u=l.length-1;u>=0;u--)if(s=l[u],!c(t[s],r[s],e))return!1;return typeof t==typeof r}var i=Array.prototype.slice,f=e(9),a=e(10),c=t.exports=function(t,r,e){return e||(e={}),t===r?!0:t instanceof Date&&r instanceof Date?t.getTime()===r.getTime():"object"!=typeof t&&"object"!=typeof r?e.strict?t===r:t==r:u(t,r,e)}},function(t,r){function e(t){var r=[];for(var e in t)r.push(e);return r}r=t.exports="function"==typeof Object.keys?Object.keys:e,r.shim=e},function(t,r){function e(t){return"[object Arguments]"==Object.prototype.toString.call(t)}function n(t){return t&&"object"==typeof t&&"number"==typeof t.length&&Object.prototype.hasOwnProperty.call(t,"callee")&&!Object.prototype.propertyIsEnumerable.call(t,"callee")||!1}var o="[object Arguments]"==function(){return Object.prototype.toString.call(arguments)}();r=t.exports=o?e:n,r.supported=e,r.unsupported=n},function(t,r,e){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}function o(t,r){if("function"!=typeof r)throw new TypeError("predicate must be a function");for(var e,n=Object(t),o=n.length>>>0,u=arguments[1],i=0;o>i;i++)if(e=n[i],r.call(u,e,i,n))return e}function u(t,r){return a(r,i,t)}function i(t,r){return console.assert(r in t,"Bad cursor refine: '"+r+"' not found in ",t),t[r]}function f(t){return t.slice(0,t.length-1)}function a(t,r,e){return t.reduce(r,e)}function c(t){return[].concat.apply([],t)}function s(t){for(var r=Object.keys(t),e=r.length,n=Array(e),o=0;e>o;o++)n[o]=[r[o],t[r[o]]];return n}function l(t){var r,e,n,o=0;if(void 0===t||null===t)return t;if(0===t.length)return o;for(r=0,n=t.length;n>r;r++)e=t.charCodeAt(r),o=(o<<5)-o+e,o|=0;return o}function p(t){return l(JSON.stringify(t))}function h(t){var r=s(w),e=o(r,function(r){return r[1]===t});if(e)return e[0];var n=(O++).toString();return w[n]=t,n}function d(t,r){var e=this;void 0===t&&(t=A);var n={};return function(){for(var o=arguments.length,u=Array(o),i=0;o>i;i++)u[i]=arguments[i];var f=t.apply(e,u);return hasOwnProperty.call(n,f)?n[f]:n[f]=r.apply(e,u)}}function y(t){if("function"!=typeof Object.freeze)return t;if(!(0,m["default"])(t))return t;var r=Object.getOwnPropertyNames(t);return r.forEach(function(r){var e=t[r];"object"!=typeof e||Object.isFrozen(e)||y(e)}),Object.freeze(t)}Object.defineProperty(r,"__esModule",{value:!0}),r.find=o,r.getIn=u,r.get=i,r.initial=f,r.reduce=a,r.flatten=c,r.pairs=s,r.hashString=l,r.hashRecord=p,r.refToHash=h,r.memoized=d,r.deepFreeze=y;var v=e(12),m=n(v),g=e(8),b=n(g),j=e(2),w={},O=0,A=function(t){return t},x=function(t,r){return(0,b["default"])(t,r)};r.valEq=x;var _=function(t,r){return t===r};r.refEq=_;var R=function(t,r){return function(e){return(0,j.updateIn)(e,t,r)}};r.rootAt=R},function(t,r){function e(t){var r=typeof t;return!!t&&("object"==r||"function"==r)}t.exports=e},function(t,r,e){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e(11),o=(0,n.memoized)(n.refToHash,function(t){return t.setState.bind(t)});r.makeSwapFromReact=o;var u=(0,n.memoized)(n.refToHash,function(t){return function(){return t.state}});r.makeDerefFromReact=u;var i=function(t){return t.state};r.makeValueFromReact=i;var f=function(t){return"function"==typeof t.__proto__.render};r.isReactCmp=f},function(t,r,e){"use strict";function n(t,r){if(!(t instanceof r))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(r,"__esModule",{value:!0});var o=e(11),u=e(2),i=e(13),f=(0,o.memoized)(function(t,r){return(0,o.refToHash)(t)+(0,o.hashRecord)(r)},function(t,r){return function(e){return t((0,o.rootAt)(r,e))}}),a=(0,o.memoized)(function(t,r){return(0,o.refToHash)(t)+(0,o.hashRecord)(r)},function(t,r){return function(){return(0,o.getIn)(t(),r)}}),c=function l(t,r){var e=this;n(this,l),this.value=t,this.refine=function(){for(var e=arguments.length,n=Array(e),o=0;e>o;o++)n[o]=arguments[o];return s(a(t,n),f(r,n))},this.swap=function(t){for(var e=arguments.length,n=Array(e>1?e-1:0),o=1;e>o;o++)n[o-1]=arguments[o];return r(function(r){return t.apply(null,[r].concat(n))})},this.set=function(t){return e.swap(function(r){return t})},this.merge=function(t){return e.swap(u.merge,t)},this.push=function(t){return e.swap(u.push,t)},this.unshift=function(t){return e.swap(u.unshift,t)},this.splice=function(t){return e.swap(u.splice,t)}},s=(0,o.memoized)(function(t,r){return(0,o.refToHash)(t)+(0,o.refToHash)(r)},function(t,r){return new c(t,r)});c.build=function(t,r){return(0,i.isReactCmp)(t)?s((0,i.makeDerefFromReact)(t),(0,i.makeSwapFromReact)(t)):s(t,r)},r["default"]=c,t.exports=r["default"]},function(t,r,e){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}function o(t,r){var e=t.concat(r||[]);return{shouldComponentUpdate:function(r){var n=this,o=!(0,f.valEq)((0,i["default"])(r,e),(0,i["default"])(this.props,e)),u=!t.every(function(t){return(0,f.refEq)(n.props[t],r[t])});return o||u}}}Object.defineProperty(r,"__esModule",{value:!0});var u=e(16),i=n(u),f=e(11);r["default"]=o,t.exports=r["default"]},function(t,r,e){/*! +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ReactCursor=e():t.ReactCursor=e()}(this,function(){return function(t){function e(n){if(r[n])return r[n].exports;var u=r[n]={exports:{},id:n,loaded:!1};return t[n].call(u.exports,u,u.exports,e),u.loaded=!0,u.exports}var r={};return e.m=t,e.c=r,e.p="",e(0)}([function(t,e,r){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}Object.defineProperty(e,"__esModule",{value:!0});var u=r(1),o=n(u),i=r(13),a=n(i),f=r(14),c=n(f);e["default"]={Cursor:o["default"],ImmutableOptimizations:c["default"],RefCursor:a["default"]},t.exports=e["default"]},function(t,e,r){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var u=r(2),o=r(11),i=r(12),a=!1,f=(0,o.memoized)(function(t,e){return(0,o.refToHash)(t)+(0,o.hashRecord)(e)},function(t,e){return function(r){return t((0,o.rootAt)(e,r))}}),c=function l(t,e){var r=this;n(this,l),this.value=function(){return t},this.refine=function(){for(var r=arguments.length,n=Array(r),u=0;r>u;u++)n[u]=arguments[u];return s((0,o.getIn)(t,n),f(e,n))},this.swap=function(t){for(var r=arguments.length,n=Array(r>1?r-1:0),u=1;r>u;u++)n[u-1]=arguments[u];return e(function(e){return t.apply(null,[e].concat(n))})},this.set=function(t){return r.swap(function(e){return t})},this.merge=function(t){return r.swap(u.merge,t)},this.push=function(t){return r.swap(u.push,t)},this.unshift=function(t){return r.swap(u.unshift,t)},this.splice=function(t){return r.swap(u.splice,t)},a&&(0,o.deepFreeze)(t)},s=(0,o.memoized)(function(t,e){return(0,o.refToHash)(e)+(0,o.hashRecord)(t)},function(t,e){return new c(t,e)});c.build=function(t,e){return(0,i.isReactCmp)(t)?s((0,i.makeValueFromReact)(t),(0,i.makeSwapFromReact)(t)):s(t,e)},e["default"]=c,t.exports=e["default"]},function(t,e,r){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}function u(t,e){return(0,p["default"])(t,{$merge:e})}function o(t,e){return(0,p["default"])(t,{$push:e})}function i(t,e){return(0,p["default"])(t,{$unshift:e})}function a(t,e){return(0,p["default"])(t,{$splice:e})}function f(t,e,r){for(var n=arguments.length,u=Array(n>3?n-3:0),o=3;n>o;o++)u[o-3]=arguments[o];var i,a=function(t){return r.apply(null,[t].concat(u))};if(e.length>0){var f=c(e,{$apply:a});i=(0,p["default"])(t,f)}else 0===e.length&&(i=a(t));return(0,d["default"])(t,i)?t:i}function c(t,e){return t.reduceRight(s,e)}function s(t,e){var r={};return r[e]=t,r}Object.defineProperty(e,"__esModule",{value:!0}),e.merge=u,e.push=o,e.unshift=i,e.splice=a,e.updateIn=f;var l=r(3),p=n(l),h=r(8),d=n(h)},function(t,e,r){t.exports=r(4)},function(t,e,r){"use strict";function n(t){return Array.isArray(t)?t.concat():t&&"object"==typeof t?i(new t.constructor,t):t}function u(t,e,r){Array.isArray(t)?void 0:f(!1);var n=e[r];Array.isArray(n)?void 0:f(!1)}function o(t,e){if("object"!=typeof e?f(!1):void 0,c.call(e,h))return 1!==Object.keys(e).length?f(!1):void 0,e[h];var r=n(t);if(c.call(e,d)){var a=e[d];a&&"object"==typeof a?void 0:f(!1),r&&"object"==typeof r?void 0:f(!1),i(r,e[d])}c.call(e,s)&&(u(t,e,s),e[s].forEach(function(t){r.push(t)})),c.call(e,l)&&(u(t,e,l),e[l].forEach(function(t){r.unshift(t)})),c.call(e,p)&&(Array.isArray(t)?void 0:f(!1),Array.isArray(e[p])?void 0:f(!1),e[p].forEach(function(t){Array.isArray(t)?void 0:f(!1),r.splice.apply(r,t)})),c.call(e,y)&&("function"!=typeof e[y]?f(!1):void 0,r=e[y](r));for(var v in e)m.hasOwnProperty(v)&&m[v]||(r[v]=o(t[v],e[v]));return r}var i=r(5),a=r(6),f=r(7),c={}.hasOwnProperty,s=a({$push:null}),l=a({$unshift:null}),p=a({$splice:null}),h=a({$set:null}),d=a({$merge:null}),y=a({$apply:null}),v=[s,l,p,h,d,y],m={};v.forEach(function(t){m[t]=!0}),t.exports=o},function(t,e){"use strict";function r(t,e){if(null==t)throw new TypeError("Object.assign target cannot be null or undefined");for(var r=Object(t),n=Object.prototype.hasOwnProperty,u=1;u0&&"number"!=typeof t[0]?!1:!0:!1}function o(t,e,r){var o,s;if(n(t)||n(e))return!1;if(t.prototype!==e.prototype)return!1;if(f(t))return f(e)?(t=i.call(t),e=i.call(e),c(t,e,r)):!1;if(u(t)){if(!u(e))return!1;if(t.length!==e.length)return!1;for(o=0;o=0;o--)if(l[o]!=p[o])return!1;for(o=l.length-1;o>=0;o--)if(s=l[o],!c(t[s],e[s],r))return!1;return typeof t==typeof e}var i=Array.prototype.slice,a=r(9),f=r(10),c=t.exports=function(t,e,r){return r||(r={}),t===e?!0:t instanceof Date&&e instanceof Date?t.getTime()===e.getTime():"object"!=typeof t&&"object"!=typeof e?r.strict?t===e:t==e:o(t,e,r)}},function(t,e){function r(t){var e=[];for(var r in t)e.push(r);return e}e=t.exports="function"==typeof Object.keys?Object.keys:r,e.shim=r},function(t,e){function r(t){return"[object Arguments]"==Object.prototype.toString.call(t)}function n(t){return t&&"object"==typeof t&&"number"==typeof t.length&&Object.prototype.hasOwnProperty.call(t,"callee")&&!Object.prototype.propertyIsEnumerable.call(t,"callee")||!1}var u="[object Arguments]"==function(){return Object.prototype.toString.call(arguments)}();e=t.exports=u?r:n,e.supported=r,e.unsupported=n},function(t,e,r){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}function u(t,e){if("function"!=typeof e)throw new TypeError("predicate must be a function");for(var r,n=Object(t),u=n.length>>>0,o=arguments[1],i=0;u>i;i++)if(r=n[i],e.call(o,r,i,n))return r}function o(t,e){return f(e,i,t)}function i(t,e){return console.assert(e in t,"Bad cursor refine: '"+e+"' not found in ",t),t[e]}function a(t){return t.slice(0,t.length-1)}function f(t,e,r){return t.reduce(e,r)}function c(t){return[].concat.apply([],t)}function s(t){for(var e=Object.keys(t),r=e.length,n=Array(r),u=0;r>u;u++)n[u]=[e[u],t[e[u]]];return n}function l(t){var e,r,n,u=0;if(void 0===t||null===t)return t;if(0===t.length)return u;for(e=0,n=t.length;n>e;e++)r=t.charCodeAt(e),u=(u<<5)-u+r,u|=0;return u}function p(t){return l(JSON.stringify(t))}function h(t){var e=j.get(t),r=e||(w++).toString();return!e&&j.set(t,r),r}function d(t,e){var r=this;void 0===t&&(t=O);var n={};return function(){for(var u=arguments.length,o=Array(u),i=0;u>i;i++)o[i]=arguments[i];var a=t.apply(r,o);return hasOwnProperty.call(n,a)?n[a]:n[a]=e.apply(r,o)}}function y(t){return!!t&&"object"==typeof t}function v(t){if("function"!=typeof Object.freeze)return t;if(!y(t))return t;var e=Object.getOwnPropertyNames(t);return e.forEach(function(e){var r=t[e];y(r)&&!Object.isFrozen(r)&&v(r)}),Object.freeze(t)}Object.defineProperty(e,"__esModule",{value:!0}),e.find=u,e.getIn=o,e.get=i,e.initial=a,e.reduce=f,e.flatten=c,e.pairs=s,e.hashString=l,e.hashRecord=p,e.refToHash=h,e.memoized=d,e.deepFreeze=v;var m=r(8),g=n(m),b=r(2),j=new WeakMap,w=0,O=function(t){return t},A=function(t,e){return(0,g["default"])(t,e)};e.valEq=A;var x=function(t,e){return t===e};e.refEq=x;var _=function(t,e){return function(r){return(0,b.updateIn)(r,t,e)}};e.rootAt=_},function(t,e,r){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var n=r(11),u=(0,n.memoized)(n.refToHash,function(t){return t.setState.bind(t)});e.makeSwapFromReact=u;var o=(0,n.memoized)(n.refToHash,function(t){return function(){return t.state}});e.makeDerefFromReact=o;var i=function(t){return t.state};e.makeValueFromReact=i;var a=function(t){return"function"==typeof t.__proto__.render};e.isReactCmp=a},function(t,e,r){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var u=r(11),o=r(2),i=r(12),a=(0,u.memoized)(function(t,e){return(0,u.refToHash)(t)+(0,u.hashRecord)(e)},function(t,e){return function(r){return t((0,u.rootAt)(e,r))}}),f=(0,u.memoized)(function(t,e){return(0,u.refToHash)(t)+(0,u.hashRecord)(e)},function(t,e){return function(){return(0,u.getIn)(t(),e)}}),c=function l(t,e){var r=this;n(this,l),this.value=t,this.refine=function(){for(var r=arguments.length,n=Array(r),u=0;r>u;u++)n[u]=arguments[u];return s(f(t,n),a(e,n))},this.swap=function(t){for(var r=arguments.length,n=Array(r>1?r-1:0),u=1;r>u;u++)n[u-1]=arguments[u];return e(function(e){return t.apply(null,[e].concat(n))})},this.set=function(t){return r.swap(function(e){return t})},this.merge=function(t){return r.swap(o.merge,t)},this.push=function(t){return r.swap(o.push,t)},this.unshift=function(t){return r.swap(o.unshift,t)},this.splice=function(t){return r.swap(o.splice,t)}},s=(0,u.memoized)(function(t,e){return(0,u.refToHash)(t)+(0,u.refToHash)(e)},function(t,e){return new c(t,e)});c.build=function(t,e){return(0,i.isReactCmp)(t)?s((0,i.makeDerefFromReact)(t),(0,i.makeSwapFromReact)(t)):s(t,e)},e["default"]=c,t.exports=e["default"]},function(t,e,r){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}function u(){var t=arguments.length<=0||void 0===arguments[0]?[]:arguments[0],e=arguments.length<=1||void 0===arguments[1]?[]:arguments[1],r=t.concat(e);return{shouldComponentUpdate:function(e){var n=this,u=!(0,a.valEq)((0,i["default"])(e,r),(0,i["default"])(this.props,r)),o=!t.every(function(t){return(0,a.refEq)(n.props[t],e[t])});return u||o}}}Object.defineProperty(e,"__esModule",{value:!0});var o=r(15),i=n(o),a=r(11);e["default"]=u,t.exports=e["default"]},function(t,e,r){/*! * omit-key * * Copyright (c) 2014 Jon Schlinkert, contributors. * Licensed under the MIT License */ -"use strict";var n=e(17),o=e(18);t.exports=function(t,r){if(!n(t))return{};var e=Object.keys(t),u=e.length;r=Array.isArray(r)?r:[r];for(var i=o(e,r),f={},a=0;u>a;a++){var c=i[a];t.hasOwnProperty(c)&&(f[c]=t[c])}return f}},function(t,r){/*! +"use strict";var n=r(16),u=r(17);t.exports=function(t,e){if(!n(t))return{};var r=Object.keys(t),o=r.length;e=Array.isArray(e)?e:[e];for(var i=u(r,e),a={},f=0;o>f;f++){var c=i[f];t.hasOwnProperty(c)&&(a[c]=t[c])}return a}},function(t,e){/*! * isobject * * Copyright (c) 2014 Jon Schlinkert, contributors. * Licensed under the MIT License */ -"use strict";t.exports=function(t){return null!=t&&"object"==typeof t&&!Array.isArray(t)}},function(t,r,e){var n;!function(o){function u(t,r){var e,n,o=[];for(e=0,n=t.length;n>e;++e)-1===i.call(r,t[e])&&o.push(t[e]);for(e=0,n=r.length;n>e;++e)-1===i.call(t,r[e])&&o.push(r[e]);return o}var i=Array.prototype.indexOf||function(t){var r,e;if(null==this)throw new TypeError("indexOf called on null or undefined");for(r=0,e=this.length;e>r;++r)if(this[r]===t)return r;return-1};"object"==typeof t&&t.exports?t.exports=u:(n=function(){return u}.call(r,e,r,t),!(void 0!==n&&(t.exports=n)))}(this)}])}); \ No newline at end of file +"use strict";t.exports=function(t){return null!=t&&"object"==typeof t&&!Array.isArray(t)}},function(t,e,r){var n;!function(u){function o(t,e){var r,n,u=[];for(r=0,n=t.length;n>r;++r)-1===i.call(e,t[r])&&u.push(t[r]);for(r=0,n=e.length;n>r;++r)-1===i.call(t,e[r])&&u.push(e[r]);return u}var i=Array.prototype.indexOf||function(t){var e,r;if(null==this)throw new TypeError("indexOf called on null or undefined");for(e=0,r=this.length;r>e;++e)if(this[e]===t)return e;return-1};"object"==typeof t&&t.exports?t.exports=o:(n=function(){return o}.call(e,r,e,t),!(void 0!==n&&(t.exports=n)))}(this)}])}); \ No newline at end of file diff --git a/src/util.js b/src/util.js index 395256b..13a3daa 100644 --- a/src/util.js +++ b/src/util.js @@ -1,4 +1,3 @@ -import isObject from 'lodash.isobject'; import isEqual from 'deep-equal'; import {updateIn} from 'update-in'; @@ -100,6 +99,9 @@ export function memoized (hasher = identity, f) { }; } +function isObject(value) { + return !!value && typeof value == 'object'; +} // copy from MDN example: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze#Examples export function deepFreeze(obj) { @@ -119,7 +121,7 @@ export function deepFreeze(obj) { var prop = obj[name]; // Freeze prop if it is an object - if (typeof prop == 'object' && !Object.isFrozen(prop)) { + if (isObject(prop) && !Object.isFrozen(prop)) { deepFreeze(prop); } });