From 35d87685a31b611b7ea6be22897f366bc9cf356e Mon Sep 17 00:00:00 2001 From: Endel Dreyer Date: Sun, 12 Nov 2017 20:37:46 -0200 Subject: [PATCH] prevent potential 'invalid checksum' issues. --- dist/colyseus.js | 2541 ++++++++++++++++++++++++++++++++++++++++----- package.json | 2 +- src/Room.ts | 8 +- test/room_test.ts | 6 +- 4 files changed, 2302 insertions(+), 255 deletions(-) diff --git a/dist/colyseus.js b/dist/colyseus.js index 352c7cb..f8a00de 100644 --- a/dist/colyseus.js +++ b/dist/colyseus.js @@ -840,7 +840,7 @@ exports.SlotList = SlotList; /***/ (function(module, exports, __webpack_require__) { "use strict"; - +/* WEBPACK VAR INJECTION */(function(Buffer) { var __extends = (this && this.__extends) || (function () { var extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || @@ -853,10 +853,10 @@ var __extends = (this && this.__extends) || (function () { })(); Object.defineProperty(exports, "__esModule", { value: true }); var signals_js_1 = __webpack_require__(4); -var Clock = __webpack_require__(21); -var delta_listener_1 = __webpack_require__(22); +var Clock = __webpack_require__(26); +var delta_listener_1 = __webpack_require__(27); var msgpack = __webpack_require__(1); -var fossilDelta = __webpack_require__(25); +var fossilDelta = __webpack_require__(30); var Protocol_1 = __webpack_require__(3); var Room = /** @class */ (function (_super) { __extends(Room, _super); @@ -907,9 +907,10 @@ var Room = /** @class */ (function (_super) { this.leave(); } }; - Room.prototype.setState = function (state, remoteCurrentTime, remoteElapsedTime) { + Room.prototype.setState = function (encodedState, remoteCurrentTime, remoteElapsedTime) { + var state = msgpack.decode(encodedState); this.set(state); - this._previousState = new Uint8Array(msgpack.encode(state)); + this._previousState = new Uint8Array(encodedState); // set remote clock properties if (remoteCurrentTime && remoteElapsedTime) { this.remoteClock.currentTime = remoteCurrentTime; @@ -929,7 +930,7 @@ var Room = /** @class */ (function (_super) { this.lastPatchTime = patchTime; this.clock.tick(); // apply patch - this._previousState = new Uint8Array(fossilDelta.apply(this._previousState, binaryPatch, { verifyChecksum: false })); + this._previousState = Buffer.from(fossilDelta.apply(this._previousState, binaryPatch)); // trigger state callbacks this.set(msgpack.decode(this._previousState)); this.onUpdate.dispatch(this.data); @@ -954,6 +955,7 @@ var Room = /** @class */ (function (_super) { }(delta_listener_1.DeltaContainer)); exports.Room = Room; +/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(21).Buffer)) /***/ }), /* 9 */ @@ -981,7 +983,7 @@ var msgpack = __webpack_require__(1); var signals_js_1 = __webpack_require__(4); var Protocol_1 = __webpack_require__(3); var Room_1 = __webpack_require__(8); -var Connection_1 = __webpack_require__(26); +var Connection_1 = __webpack_require__(31); var Client = /** @class */ (function () { function Client(url) { var _this = this; @@ -2134,260 +2136,2303 @@ exports.Promise = Promise; /***/ (function(module, exports, __webpack_require__) { "use strict"; +/* WEBPACK VAR INJECTION */(function(global) {/*! + * The buffer module from node.js, for the browser. + * + * @author Feross Aboukhadijeh + * @license MIT + */ +/* eslint-disable no-proto */ -var Clock = (function () { - function Clock(useInterval) { - if (useInterval === void 0) { useInterval = false; } - this.running = false; - this.now = (typeof (window) !== "undefined" && window.performance && window.performance.now && (window.performance.now).bind(window.performance)) || Date.now; - this.start(useInterval); - } - Clock.prototype.start = function (useInterval) { - if (useInterval === void 0) { useInterval = false; } - this.deltaTime = 0; - this.currentTime = this.now(); - this.elapsedTime = 0; - this.running = true; - if (useInterval) { - // auto set interval to 60 ticks per second - this._interval = setInterval(this.tick.bind(this), 1000 / 60); - } - }; - Clock.prototype.stop = function () { - this.running = false; - if (this._interval) { - clearInterval(this._interval); - } - }; - Clock.prototype.tick = function (newTime) { - if (newTime === void 0) { newTime = this.now(); } - this.deltaTime = newTime - this.currentTime; - this.currentTime = newTime; - this.elapsedTime += this.deltaTime; - }; - return Clock; -}()); -module.exports = Clock; -/***/ }), -/* 22 */ -/***/ (function(module, exports, __webpack_require__) { +var base64 = __webpack_require__(23) +var ieee754 = __webpack_require__(24) +var isArray = __webpack_require__(25) -"use strict"; +exports.Buffer = Buffer +exports.SlowBuffer = SlowBuffer +exports.INSPECT_MAX_BYTES = 50 -Object.defineProperty(exports, "__esModule", { value: true }); -var DeltaContainer_1 = __webpack_require__(23); -exports.DeltaContainer = DeltaContainer_1.DeltaContainer; +/** + * If `Buffer.TYPED_ARRAY_SUPPORT`: + * === true Use Uint8Array implementation (fastest) + * === false Use Object implementation (most compatible, even IE6) + * + * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+, + * Opera 11.6+, iOS 4.2+. + * + * Due to various browser bugs, sometimes the Object implementation will be used even + * when the browser supports typed arrays. + * + * Note: + * + * - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances, + * See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438. + * + * - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function. + * + * - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of + * incorrect length in some situations. + * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they + * get the Object implementation, which is slower but behaves correctly. + */ +Buffer.TYPED_ARRAY_SUPPORT = global.TYPED_ARRAY_SUPPORT !== undefined + ? global.TYPED_ARRAY_SUPPORT + : typedArraySupport() -/***/ }), -/* 23 */ -/***/ (function(module, exports, __webpack_require__) { +/* + * Export kMaxLength after typed array support is determined. + */ +exports.kMaxLength = kMaxLength() + +function typedArraySupport () { + try { + var arr = new Uint8Array(1) + arr.__proto__ = {__proto__: Uint8Array.prototype, foo: function () { return 42 }} + return arr.foo() === 42 && // typed array instances can be augmented + typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray` + arr.subarray(1, 1).byteLength === 0 // ie10 has broken `subarray` + } catch (e) { + return false + } +} -"use strict"; +function kMaxLength () { + return Buffer.TYPED_ARRAY_SUPPORT + ? 0x7fffffff + : 0x3fffffff +} -Object.defineProperty(exports, "__esModule", { value: true }); -var compare_1 = __webpack_require__(24); -var DeltaContainer = /** @class */ (function () { - function DeltaContainer(data) { - this.listeners = []; - this.matcherPlaceholders = { - ":id": /^([a-zA-Z0-9\-_]+)$/, - ":number": /^([0-9]+)$/, - ":string": /^(\w+)$/, - ":axis": /^([xyz])$/, - ":*": /(.*)/, - }; - this.data = data; - this.reset(); +function createBuffer (that, length) { + if (kMaxLength() < length) { + throw new RangeError('Invalid typed array length') + } + if (Buffer.TYPED_ARRAY_SUPPORT) { + // Return an augmented `Uint8Array` instance, for best performance + that = new Uint8Array(length) + that.__proto__ = Buffer.prototype + } else { + // Fallback: Return an object instance of the Buffer class + if (that === null) { + that = new Buffer(length) } - DeltaContainer.prototype.set = function (newData) { - var patches = compare_1.compare(this.data, newData); - this.checkPatches(patches); - this.data = newData; - return patches; - }; - DeltaContainer.prototype.registerPlaceholder = function (placeholder, matcher) { - this.matcherPlaceholders[placeholder] = matcher; - }; - DeltaContainer.prototype.listen = function (segments, callback) { - var _this = this; - var rules; - if (typeof (segments) === "function") { - rules = []; - callback = segments; - } - else { - rules = segments.split("/"); - } - if (callback.length > 1) { - console.warn(".listen() accepts only one parameter."); - } - var listener = { - callback: callback, - rawRules: rules, - rules: rules.map(function (segment) { - if (typeof (segment) === "string") { - // replace placeholder matchers - return (segment.indexOf(":") === 0) - ? _this.matcherPlaceholders[segment] || _this.matcherPlaceholders[":*"] - : new RegExp("^" + segment + "$"); - } - else { - return segment; - } - }) - }; - if (rules.length === 0) { - this.defaultListener = listener; - } - else { - this.listeners.push(listener); - } - return listener; - }; - DeltaContainer.prototype.removeListener = function (listener) { - for (var i = this.listeners.length - 1; i >= 0; i--) { - if (this.listeners[i] === listener) { - this.listeners.splice(i, 1); - } - } - }; - DeltaContainer.prototype.removeAllListeners = function () { - this.reset(); - }; - DeltaContainer.prototype.checkPatches = function (patches) { - for (var i = patches.length - 1; i >= 0; i--) { - var matched = false; - for (var j = 0, len = this.listeners.length; j < len; j++) { - var listener = this.listeners[j]; - var pathVariables = this.getPathVariables(patches[i], listener); - if (pathVariables) { - listener.callback({ - path: pathVariables, - rawPath: patches[i].path, - operation: patches[i].operation, - value: patches[i].value - }); - matched = true; - } - } - // check for fallback listener - if (!matched && this.defaultListener) { - this.defaultListener.callback(patches[i]); - } - } - }; - DeltaContainer.prototype.getPathVariables = function (patch, listener) { - // skip if rules count differ from patch - if (patch.path.length !== listener.rules.length) { - return false; - } - var path = {}; - for (var i = 0, len = listener.rules.length; i < len; i++) { - var matches = patch.path[i].match(listener.rules[i]); - if (!matches || matches.length === 0 || matches.length > 2) { - return false; - } - else if (listener.rawRules[i].substr(0, 1) === ":") { - path[listener.rawRules[i].substr(1)] = matches[1]; - } - } - return path; - }; - DeltaContainer.prototype.reset = function () { - this.listeners = []; - }; - return DeltaContainer; -}()); -exports.DeltaContainer = DeltaContainer; + that.length = length + } + return that +} -/***/ }), -/* 24 */ -/***/ (function(module, exports, __webpack_require__) { +/** + * The Buffer constructor returns instances of `Uint8Array` that have their + * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of + * `Uint8Array`, so the returned instances will have all the node `Buffer` methods + * and the `Uint8Array` methods. Square bracket notation works as expected -- it + * returns a single octet. + * + * The `Uint8Array` prototype remains unmodified. + */ -"use strict"; +function Buffer (arg, encodingOrOffset, length) { + if (!Buffer.TYPED_ARRAY_SUPPORT && !(this instanceof Buffer)) { + return new Buffer(arg, encodingOrOffset, length) + } -Object.defineProperty(exports, "__esModule", { value: true }); -function compare(tree1, tree2) { - var patches = []; - generate(tree1, tree2, patches, []); - return patches; -} -exports.compare = compare; -function concat(arr, value) { - var newArr = arr.slice(); - newArr.push(value); - return newArr; -} -function objectKeys(obj) { - if (Array.isArray(obj)) { - var keys_1 = new Array(obj.length); - for (var k = 0; k < keys_1.length; k++) { - keys_1[k] = "" + k; - } - return keys_1; - } - if (Object.keys) { - return Object.keys(obj); - } - var keys = []; - for (var i in obj) { - if (obj.hasOwnProperty(i)) { - keys.push(i); - } + // Common case. + if (typeof arg === 'number') { + if (typeof encodingOrOffset === 'string') { + throw new Error( + 'If encoding is specified then the first argument must be a string' + ) } - return keys; + return allocUnsafe(this, arg) + } + return from(this, arg, encodingOrOffset, length) } -; -// Dirty check if obj is different from mirror, generate patches and update mirror -function generate(mirror, obj, patches, path) { - var newKeys = objectKeys(obj); - var oldKeys = objectKeys(mirror); - var changed = false; - var deleted = false; - for (var t = oldKeys.length - 1; t >= 0; t--) { - var key = oldKeys[t]; - var oldVal = mirror[key]; - if (obj.hasOwnProperty(key) && !(obj[key] === undefined && oldVal !== undefined && Array.isArray(obj) === false)) { - var newVal = obj[key]; - if (typeof oldVal == "object" && oldVal != null && typeof newVal == "object" && newVal != null) { - generate(oldVal, newVal, patches, concat(path, key)); - } - else { - if (oldVal !== newVal) { - changed = true; - patches.push({ operation: "replace", path: concat(path, key), value: newVal }); - } - } - } - else { - patches.push({ operation: "remove", path: concat(path, key) }); - deleted = true; // property has been deleted - } - } - if (!deleted && newKeys.length == oldKeys.length) { - return; - } - for (var t = 0; t < newKeys.length; t++) { - var key = newKeys[t]; - if (!mirror.hasOwnProperty(key) && obj[key] !== undefined) { - var newVal = obj[key]; - var addPath = concat(path, key); - // compare deeper additions - if (typeof newVal == "object" && newVal != null) { - generate({}, newVal, patches, addPath); - } - patches.push({ operation: "add", path: addPath, value: newVal }); - } - } + +Buffer.poolSize = 8192 // not used by this implementation + +// TODO: Legacy, not needed anymore. Remove in next major version. +Buffer._augment = function (arr) { + arr.__proto__ = Buffer.prototype + return arr } +function from (that, value, encodingOrOffset, length) { + if (typeof value === 'number') { + throw new TypeError('"value" argument must not be a number') + } + + if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) { + return fromArrayBuffer(that, value, encodingOrOffset, length) + } + + if (typeof value === 'string') { + return fromString(that, value, encodingOrOffset) + } + + return fromObject(that, value) +} + +/** + * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError + * if value is a number. + * Buffer.from(str[, encoding]) + * Buffer.from(array) + * Buffer.from(buffer) + * Buffer.from(arrayBuffer[, byteOffset[, length]]) + **/ +Buffer.from = function (value, encodingOrOffset, length) { + return from(null, value, encodingOrOffset, length) +} + +if (Buffer.TYPED_ARRAY_SUPPORT) { + Buffer.prototype.__proto__ = Uint8Array.prototype + Buffer.__proto__ = Uint8Array + if (typeof Symbol !== 'undefined' && Symbol.species && + Buffer[Symbol.species] === Buffer) { + // Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97 + Object.defineProperty(Buffer, Symbol.species, { + value: null, + configurable: true + }) + } +} + +function assertSize (size) { + if (typeof size !== 'number') { + throw new TypeError('"size" argument must be a number') + } else if (size < 0) { + throw new RangeError('"size" argument must not be negative') + } +} + +function alloc (that, size, fill, encoding) { + assertSize(size) + if (size <= 0) { + return createBuffer(that, size) + } + if (fill !== undefined) { + // Only pay attention to encoding if it's a string. This + // prevents accidentally sending in a number that would + // be interpretted as a start offset. + return typeof encoding === 'string' + ? createBuffer(that, size).fill(fill, encoding) + : createBuffer(that, size).fill(fill) + } + return createBuffer(that, size) +} + +/** + * Creates a new filled Buffer instance. + * alloc(size[, fill[, encoding]]) + **/ +Buffer.alloc = function (size, fill, encoding) { + return alloc(null, size, fill, encoding) +} + +function allocUnsafe (that, size) { + assertSize(size) + that = createBuffer(that, size < 0 ? 0 : checked(size) | 0) + if (!Buffer.TYPED_ARRAY_SUPPORT) { + for (var i = 0; i < size; ++i) { + that[i] = 0 + } + } + return that +} + +/** + * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance. + * */ +Buffer.allocUnsafe = function (size) { + return allocUnsafe(null, size) +} +/** + * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance. + */ +Buffer.allocUnsafeSlow = function (size) { + return allocUnsafe(null, size) +} + +function fromString (that, string, encoding) { + if (typeof encoding !== 'string' || encoding === '') { + encoding = 'utf8' + } + + if (!Buffer.isEncoding(encoding)) { + throw new TypeError('"encoding" must be a valid string encoding') + } + + var length = byteLength(string, encoding) | 0 + that = createBuffer(that, length) + + var actual = that.write(string, encoding) + + if (actual !== length) { + // Writing a hex string, for example, that contains invalid characters will + // cause everything after the first invalid character to be ignored. (e.g. + // 'abxxcd' will be treated as 'ab') + that = that.slice(0, actual) + } + + return that +} + +function fromArrayLike (that, array) { + var length = array.length < 0 ? 0 : checked(array.length) | 0 + that = createBuffer(that, length) + for (var i = 0; i < length; i += 1) { + that[i] = array[i] & 255 + } + return that +} + +function fromArrayBuffer (that, array, byteOffset, length) { + array.byteLength // this throws if `array` is not a valid ArrayBuffer + + if (byteOffset < 0 || array.byteLength < byteOffset) { + throw new RangeError('\'offset\' is out of bounds') + } + + if (array.byteLength < byteOffset + (length || 0)) { + throw new RangeError('\'length\' is out of bounds') + } + + if (byteOffset === undefined && length === undefined) { + array = new Uint8Array(array) + } else if (length === undefined) { + array = new Uint8Array(array, byteOffset) + } else { + array = new Uint8Array(array, byteOffset, length) + } + + if (Buffer.TYPED_ARRAY_SUPPORT) { + // Return an augmented `Uint8Array` instance, for best performance + that = array + that.__proto__ = Buffer.prototype + } else { + // Fallback: Return an object instance of the Buffer class + that = fromArrayLike(that, array) + } + return that +} + +function fromObject (that, obj) { + if (Buffer.isBuffer(obj)) { + var len = checked(obj.length) | 0 + that = createBuffer(that, len) + + if (that.length === 0) { + return that + } + + obj.copy(that, 0, 0, len) + return that + } + + if (obj) { + if ((typeof ArrayBuffer !== 'undefined' && + obj.buffer instanceof ArrayBuffer) || 'length' in obj) { + if (typeof obj.length !== 'number' || isnan(obj.length)) { + return createBuffer(that, 0) + } + return fromArrayLike(that, obj) + } + + if (obj.type === 'Buffer' && isArray(obj.data)) { + return fromArrayLike(that, obj.data) + } + } + + throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.') +} + +function checked (length) { + // Note: cannot use `length < kMaxLength()` here because that fails when + // length is NaN (which is otherwise coerced to zero.) + if (length >= kMaxLength()) { + throw new RangeError('Attempt to allocate Buffer larger than maximum ' + + 'size: 0x' + kMaxLength().toString(16) + ' bytes') + } + return length | 0 +} + +function SlowBuffer (length) { + if (+length != length) { // eslint-disable-line eqeqeq + length = 0 + } + return Buffer.alloc(+length) +} + +Buffer.isBuffer = function isBuffer (b) { + return !!(b != null && b._isBuffer) +} + +Buffer.compare = function compare (a, b) { + if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) { + throw new TypeError('Arguments must be Buffers') + } + + if (a === b) return 0 + + var x = a.length + var y = b.length + + for (var i = 0, len = Math.min(x, y); i < len; ++i) { + if (a[i] !== b[i]) { + x = a[i] + y = b[i] + break + } + } + + if (x < y) return -1 + if (y < x) return 1 + return 0 +} + +Buffer.isEncoding = function isEncoding (encoding) { + switch (String(encoding).toLowerCase()) { + case 'hex': + case 'utf8': + case 'utf-8': + case 'ascii': + case 'latin1': + case 'binary': + case 'base64': + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return true + default: + return false + } +} + +Buffer.concat = function concat (list, length) { + if (!isArray(list)) { + throw new TypeError('"list" argument must be an Array of Buffers') + } + + if (list.length === 0) { + return Buffer.alloc(0) + } + + var i + if (length === undefined) { + length = 0 + for (i = 0; i < list.length; ++i) { + length += list[i].length + } + } + + var buffer = Buffer.allocUnsafe(length) + var pos = 0 + for (i = 0; i < list.length; ++i) { + var buf = list[i] + if (!Buffer.isBuffer(buf)) { + throw new TypeError('"list" argument must be an Array of Buffers') + } + buf.copy(buffer, pos) + pos += buf.length + } + return buffer +} + +function byteLength (string, encoding) { + if (Buffer.isBuffer(string)) { + return string.length + } + if (typeof ArrayBuffer !== 'undefined' && typeof ArrayBuffer.isView === 'function' && + (ArrayBuffer.isView(string) || string instanceof ArrayBuffer)) { + return string.byteLength + } + if (typeof string !== 'string') { + string = '' + string + } + + var len = string.length + if (len === 0) return 0 + + // Use a for loop to avoid recursion + var loweredCase = false + for (;;) { + switch (encoding) { + case 'ascii': + case 'latin1': + case 'binary': + return len + case 'utf8': + case 'utf-8': + case undefined: + return utf8ToBytes(string).length + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return len * 2 + case 'hex': + return len >>> 1 + case 'base64': + return base64ToBytes(string).length + default: + if (loweredCase) return utf8ToBytes(string).length // assume utf8 + encoding = ('' + encoding).toLowerCase() + loweredCase = true + } + } +} +Buffer.byteLength = byteLength + +function slowToString (encoding, start, end) { + var loweredCase = false + + // No need to verify that "this.length <= MAX_UINT32" since it's a read-only + // property of a typed array. + + // This behaves neither like String nor Uint8Array in that we set start/end + // to their upper/lower bounds if the value passed is out of range. + // undefined is handled specially as per ECMA-262 6th Edition, + // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization. + if (start === undefined || start < 0) { + start = 0 + } + // Return early if start > this.length. Done here to prevent potential uint32 + // coercion fail below. + if (start > this.length) { + return '' + } + + if (end === undefined || end > this.length) { + end = this.length + } + + if (end <= 0) { + return '' + } + + // Force coersion to uint32. This will also coerce falsey/NaN values to 0. + end >>>= 0 + start >>>= 0 + + if (end <= start) { + return '' + } + + if (!encoding) encoding = 'utf8' + + while (true) { + switch (encoding) { + case 'hex': + return hexSlice(this, start, end) + + case 'utf8': + case 'utf-8': + return utf8Slice(this, start, end) + + case 'ascii': + return asciiSlice(this, start, end) + + case 'latin1': + case 'binary': + return latin1Slice(this, start, end) + + case 'base64': + return base64Slice(this, start, end) + + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return utf16leSlice(this, start, end) + + default: + if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) + encoding = (encoding + '').toLowerCase() + loweredCase = true + } + } +} + +// The property is used by `Buffer.isBuffer` and `is-buffer` (in Safari 5-7) to detect +// Buffer instances. +Buffer.prototype._isBuffer = true + +function swap (b, n, m) { + var i = b[n] + b[n] = b[m] + b[m] = i +} + +Buffer.prototype.swap16 = function swap16 () { + var len = this.length + if (len % 2 !== 0) { + throw new RangeError('Buffer size must be a multiple of 16-bits') + } + for (var i = 0; i < len; i += 2) { + swap(this, i, i + 1) + } + return this +} + +Buffer.prototype.swap32 = function swap32 () { + var len = this.length + if (len % 4 !== 0) { + throw new RangeError('Buffer size must be a multiple of 32-bits') + } + for (var i = 0; i < len; i += 4) { + swap(this, i, i + 3) + swap(this, i + 1, i + 2) + } + return this +} + +Buffer.prototype.swap64 = function swap64 () { + var len = this.length + if (len % 8 !== 0) { + throw new RangeError('Buffer size must be a multiple of 64-bits') + } + for (var i = 0; i < len; i += 8) { + swap(this, i, i + 7) + swap(this, i + 1, i + 6) + swap(this, i + 2, i + 5) + swap(this, i + 3, i + 4) + } + return this +} + +Buffer.prototype.toString = function toString () { + var length = this.length | 0 + if (length === 0) return '' + if (arguments.length === 0) return utf8Slice(this, 0, length) + return slowToString.apply(this, arguments) +} + +Buffer.prototype.equals = function equals (b) { + if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer') + if (this === b) return true + return Buffer.compare(this, b) === 0 +} + +Buffer.prototype.inspect = function inspect () { + var str = '' + var max = exports.INSPECT_MAX_BYTES + if (this.length > 0) { + str = this.toString('hex', 0, max).match(/.{2}/g).join(' ') + if (this.length > max) str += ' ... ' + } + return '' +} + +Buffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) { + if (!Buffer.isBuffer(target)) { + throw new TypeError('Argument must be a Buffer') + } + + if (start === undefined) { + start = 0 + } + if (end === undefined) { + end = target ? target.length : 0 + } + if (thisStart === undefined) { + thisStart = 0 + } + if (thisEnd === undefined) { + thisEnd = this.length + } + + if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) { + throw new RangeError('out of range index') + } + + if (thisStart >= thisEnd && start >= end) { + return 0 + } + if (thisStart >= thisEnd) { + return -1 + } + if (start >= end) { + return 1 + } + + start >>>= 0 + end >>>= 0 + thisStart >>>= 0 + thisEnd >>>= 0 + + if (this === target) return 0 + + var x = thisEnd - thisStart + var y = end - start + var len = Math.min(x, y) + + var thisCopy = this.slice(thisStart, thisEnd) + var targetCopy = target.slice(start, end) + + for (var i = 0; i < len; ++i) { + if (thisCopy[i] !== targetCopy[i]) { + x = thisCopy[i] + y = targetCopy[i] + break + } + } + + if (x < y) return -1 + if (y < x) return 1 + return 0 +} + +// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`, +// OR the last index of `val` in `buffer` at offset <= `byteOffset`. +// +// Arguments: +// - buffer - a Buffer to search +// - val - a string, Buffer, or number +// - byteOffset - an index into `buffer`; will be clamped to an int32 +// - encoding - an optional encoding, relevant is val is a string +// - dir - true for indexOf, false for lastIndexOf +function bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) { + // Empty buffer means no match + if (buffer.length === 0) return -1 + + // Normalize byteOffset + if (typeof byteOffset === 'string') { + encoding = byteOffset + byteOffset = 0 + } else if (byteOffset > 0x7fffffff) { + byteOffset = 0x7fffffff + } else if (byteOffset < -0x80000000) { + byteOffset = -0x80000000 + } + byteOffset = +byteOffset // Coerce to Number. + if (isNaN(byteOffset)) { + // byteOffset: it it's undefined, null, NaN, "foo", etc, search whole buffer + byteOffset = dir ? 0 : (buffer.length - 1) + } + + // Normalize byteOffset: negative offsets start from the end of the buffer + if (byteOffset < 0) byteOffset = buffer.length + byteOffset + if (byteOffset >= buffer.length) { + if (dir) return -1 + else byteOffset = buffer.length - 1 + } else if (byteOffset < 0) { + if (dir) byteOffset = 0 + else return -1 + } + + // Normalize val + if (typeof val === 'string') { + val = Buffer.from(val, encoding) + } + + // Finally, search either indexOf (if dir is true) or lastIndexOf + if (Buffer.isBuffer(val)) { + // Special case: looking for empty string/buffer always fails + if (val.length === 0) { + return -1 + } + return arrayIndexOf(buffer, val, byteOffset, encoding, dir) + } else if (typeof val === 'number') { + val = val & 0xFF // Search for a byte value [0-255] + if (Buffer.TYPED_ARRAY_SUPPORT && + typeof Uint8Array.prototype.indexOf === 'function') { + if (dir) { + return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset) + } else { + return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset) + } + } + return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir) + } + + throw new TypeError('val must be string, number or Buffer') +} + +function arrayIndexOf (arr, val, byteOffset, encoding, dir) { + var indexSize = 1 + var arrLength = arr.length + var valLength = val.length + + if (encoding !== undefined) { + encoding = String(encoding).toLowerCase() + if (encoding === 'ucs2' || encoding === 'ucs-2' || + encoding === 'utf16le' || encoding === 'utf-16le') { + if (arr.length < 2 || val.length < 2) { + return -1 + } + indexSize = 2 + arrLength /= 2 + valLength /= 2 + byteOffset /= 2 + } + } + + function read (buf, i) { + if (indexSize === 1) { + return buf[i] + } else { + return buf.readUInt16BE(i * indexSize) + } + } + + var i + if (dir) { + var foundIndex = -1 + for (i = byteOffset; i < arrLength; i++) { + if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) { + if (foundIndex === -1) foundIndex = i + if (i - foundIndex + 1 === valLength) return foundIndex * indexSize + } else { + if (foundIndex !== -1) i -= i - foundIndex + foundIndex = -1 + } + } + } else { + if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength + for (i = byteOffset; i >= 0; i--) { + var found = true + for (var j = 0; j < valLength; j++) { + if (read(arr, i + j) !== read(val, j)) { + found = false + break + } + } + if (found) return i + } + } + + return -1 +} + +Buffer.prototype.includes = function includes (val, byteOffset, encoding) { + return this.indexOf(val, byteOffset, encoding) !== -1 +} + +Buffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) { + return bidirectionalIndexOf(this, val, byteOffset, encoding, true) +} + +Buffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) { + return bidirectionalIndexOf(this, val, byteOffset, encoding, false) +} + +function hexWrite (buf, string, offset, length) { + offset = Number(offset) || 0 + var remaining = buf.length - offset + if (!length) { + length = remaining + } else { + length = Number(length) + if (length > remaining) { + length = remaining + } + } + + // must be an even number of digits + var strLen = string.length + if (strLen % 2 !== 0) throw new TypeError('Invalid hex string') + + if (length > strLen / 2) { + length = strLen / 2 + } + for (var i = 0; i < length; ++i) { + var parsed = parseInt(string.substr(i * 2, 2), 16) + if (isNaN(parsed)) return i + buf[offset + i] = parsed + } + return i +} + +function utf8Write (buf, string, offset, length) { + return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length) +} + +function asciiWrite (buf, string, offset, length) { + return blitBuffer(asciiToBytes(string), buf, offset, length) +} + +function latin1Write (buf, string, offset, length) { + return asciiWrite(buf, string, offset, length) +} + +function base64Write (buf, string, offset, length) { + return blitBuffer(base64ToBytes(string), buf, offset, length) +} + +function ucs2Write (buf, string, offset, length) { + return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length) +} + +Buffer.prototype.write = function write (string, offset, length, encoding) { + // Buffer#write(string) + if (offset === undefined) { + encoding = 'utf8' + length = this.length + offset = 0 + // Buffer#write(string, encoding) + } else if (length === undefined && typeof offset === 'string') { + encoding = offset + length = this.length + offset = 0 + // Buffer#write(string, offset[, length][, encoding]) + } else if (isFinite(offset)) { + offset = offset | 0 + if (isFinite(length)) { + length = length | 0 + if (encoding === undefined) encoding = 'utf8' + } else { + encoding = length + length = undefined + } + // legacy write(string, encoding, offset, length) - remove in v0.13 + } else { + throw new Error( + 'Buffer.write(string, encoding, offset[, length]) is no longer supported' + ) + } + + var remaining = this.length - offset + if (length === undefined || length > remaining) length = remaining + + if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) { + throw new RangeError('Attempt to write outside buffer bounds') + } + + if (!encoding) encoding = 'utf8' + + var loweredCase = false + for (;;) { + switch (encoding) { + case 'hex': + return hexWrite(this, string, offset, length) + + case 'utf8': + case 'utf-8': + return utf8Write(this, string, offset, length) + + case 'ascii': + return asciiWrite(this, string, offset, length) + + case 'latin1': + case 'binary': + return latin1Write(this, string, offset, length) + + case 'base64': + // Warning: maxLength not taken into account in base64Write + return base64Write(this, string, offset, length) + + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return ucs2Write(this, string, offset, length) + + default: + if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) + encoding = ('' + encoding).toLowerCase() + loweredCase = true + } + } +} + +Buffer.prototype.toJSON = function toJSON () { + return { + type: 'Buffer', + data: Array.prototype.slice.call(this._arr || this, 0) + } +} + +function base64Slice (buf, start, end) { + if (start === 0 && end === buf.length) { + return base64.fromByteArray(buf) + } else { + return base64.fromByteArray(buf.slice(start, end)) + } +} + +function utf8Slice (buf, start, end) { + end = Math.min(buf.length, end) + var res = [] + + var i = start + while (i < end) { + var firstByte = buf[i] + var codePoint = null + var bytesPerSequence = (firstByte > 0xEF) ? 4 + : (firstByte > 0xDF) ? 3 + : (firstByte > 0xBF) ? 2 + : 1 + + if (i + bytesPerSequence <= end) { + var secondByte, thirdByte, fourthByte, tempCodePoint + + switch (bytesPerSequence) { + case 1: + if (firstByte < 0x80) { + codePoint = firstByte + } + break + case 2: + secondByte = buf[i + 1] + if ((secondByte & 0xC0) === 0x80) { + tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F) + if (tempCodePoint > 0x7F) { + codePoint = tempCodePoint + } + } + break + case 3: + secondByte = buf[i + 1] + thirdByte = buf[i + 2] + if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) { + tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F) + if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) { + codePoint = tempCodePoint + } + } + break + case 4: + secondByte = buf[i + 1] + thirdByte = buf[i + 2] + fourthByte = buf[i + 3] + if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) { + tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F) + if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) { + codePoint = tempCodePoint + } + } + } + } + + if (codePoint === null) { + // we did not generate a valid codePoint so insert a + // replacement char (U+FFFD) and advance only 1 byte + codePoint = 0xFFFD + bytesPerSequence = 1 + } else if (codePoint > 0xFFFF) { + // encode to utf16 (surrogate pair dance) + codePoint -= 0x10000 + res.push(codePoint >>> 10 & 0x3FF | 0xD800) + codePoint = 0xDC00 | codePoint & 0x3FF + } + + res.push(codePoint) + i += bytesPerSequence + } + + return decodeCodePointsArray(res) +} + +// Based on http://stackoverflow.com/a/22747272/680742, the browser with +// the lowest limit is Chrome, with 0x10000 args. +// We go 1 magnitude less, for safety +var MAX_ARGUMENTS_LENGTH = 0x1000 + +function decodeCodePointsArray (codePoints) { + var len = codePoints.length + if (len <= MAX_ARGUMENTS_LENGTH) { + return String.fromCharCode.apply(String, codePoints) // avoid extra slice() + } + + // Decode in chunks to avoid "call stack size exceeded". + var res = '' + var i = 0 + while (i < len) { + res += String.fromCharCode.apply( + String, + codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH) + ) + } + return res +} + +function asciiSlice (buf, start, end) { + var ret = '' + end = Math.min(buf.length, end) + + for (var i = start; i < end; ++i) { + ret += String.fromCharCode(buf[i] & 0x7F) + } + return ret +} + +function latin1Slice (buf, start, end) { + var ret = '' + end = Math.min(buf.length, end) + + for (var i = start; i < end; ++i) { + ret += String.fromCharCode(buf[i]) + } + return ret +} + +function hexSlice (buf, start, end) { + var len = buf.length + + if (!start || start < 0) start = 0 + if (!end || end < 0 || end > len) end = len + + var out = '' + for (var i = start; i < end; ++i) { + out += toHex(buf[i]) + } + return out +} + +function utf16leSlice (buf, start, end) { + var bytes = buf.slice(start, end) + var res = '' + for (var i = 0; i < bytes.length; i += 2) { + res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256) + } + return res +} + +Buffer.prototype.slice = function slice (start, end) { + var len = this.length + start = ~~start + end = end === undefined ? len : ~~end + + if (start < 0) { + start += len + if (start < 0) start = 0 + } else if (start > len) { + start = len + } + + if (end < 0) { + end += len + if (end < 0) end = 0 + } else if (end > len) { + end = len + } + + if (end < start) end = start + + var newBuf + if (Buffer.TYPED_ARRAY_SUPPORT) { + newBuf = this.subarray(start, end) + newBuf.__proto__ = Buffer.prototype + } else { + var sliceLen = end - start + newBuf = new Buffer(sliceLen, undefined) + for (var i = 0; i < sliceLen; ++i) { + newBuf[i] = this[i + start] + } + } + + return newBuf +} + +/* + * Need to make sure that buffer isn't trying to write out of bounds. + */ +function checkOffset (offset, ext, length) { + if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint') + if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length') +} + +Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) { + offset = offset | 0 + byteLength = byteLength | 0 + if (!noAssert) checkOffset(offset, byteLength, this.length) + + var val = this[offset] + var mul = 1 + var i = 0 + while (++i < byteLength && (mul *= 0x100)) { + val += this[offset + i] * mul + } + + return val +} + +Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) { + offset = offset | 0 + byteLength = byteLength | 0 + if (!noAssert) { + checkOffset(offset, byteLength, this.length) + } + + var val = this[offset + --byteLength] + var mul = 1 + while (byteLength > 0 && (mul *= 0x100)) { + val += this[offset + --byteLength] * mul + } + + return val +} + +Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) { + if (!noAssert) checkOffset(offset, 1, this.length) + return this[offset] +} + +Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 2, this.length) + return this[offset] | (this[offset + 1] << 8) +} + +Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 2, this.length) + return (this[offset] << 8) | this[offset + 1] +} + +Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 4, this.length) + + return ((this[offset]) | + (this[offset + 1] << 8) | + (this[offset + 2] << 16)) + + (this[offset + 3] * 0x1000000) +} + +Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 4, this.length) + + return (this[offset] * 0x1000000) + + ((this[offset + 1] << 16) | + (this[offset + 2] << 8) | + this[offset + 3]) +} + +Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) { + offset = offset | 0 + byteLength = byteLength | 0 + if (!noAssert) checkOffset(offset, byteLength, this.length) + + var val = this[offset] + var mul = 1 + var i = 0 + while (++i < byteLength && (mul *= 0x100)) { + val += this[offset + i] * mul + } + mul *= 0x80 + + if (val >= mul) val -= Math.pow(2, 8 * byteLength) + + return val +} + +Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) { + offset = offset | 0 + byteLength = byteLength | 0 + if (!noAssert) checkOffset(offset, byteLength, this.length) + + var i = byteLength + var mul = 1 + var val = this[offset + --i] + while (i > 0 && (mul *= 0x100)) { + val += this[offset + --i] * mul + } + mul *= 0x80 + + if (val >= mul) val -= Math.pow(2, 8 * byteLength) + + return val +} + +Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) { + if (!noAssert) checkOffset(offset, 1, this.length) + if (!(this[offset] & 0x80)) return (this[offset]) + return ((0xff - this[offset] + 1) * -1) +} + +Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 2, this.length) + var val = this[offset] | (this[offset + 1] << 8) + return (val & 0x8000) ? val | 0xFFFF0000 : val +} + +Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 2, this.length) + var val = this[offset + 1] | (this[offset] << 8) + return (val & 0x8000) ? val | 0xFFFF0000 : val +} + +Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 4, this.length) + + return (this[offset]) | + (this[offset + 1] << 8) | + (this[offset + 2] << 16) | + (this[offset + 3] << 24) +} + +Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 4, this.length) + + return (this[offset] << 24) | + (this[offset + 1] << 16) | + (this[offset + 2] << 8) | + (this[offset + 3]) +} + +Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 4, this.length) + return ieee754.read(this, offset, true, 23, 4) +} + +Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 4, this.length) + return ieee754.read(this, offset, false, 23, 4) +} + +Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 8, this.length) + return ieee754.read(this, offset, true, 52, 8) +} + +Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 8, this.length) + return ieee754.read(this, offset, false, 52, 8) +} + +function checkInt (buf, value, offset, ext, max, min) { + if (!Buffer.isBuffer(buf)) throw new TypeError('"buffer" argument must be a Buffer instance') + if (value > max || value < min) throw new RangeError('"value" argument is out of bounds') + if (offset + ext > buf.length) throw new RangeError('Index out of range') +} + +Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) { + value = +value + offset = offset | 0 + byteLength = byteLength | 0 + if (!noAssert) { + var maxBytes = Math.pow(2, 8 * byteLength) - 1 + checkInt(this, value, offset, byteLength, maxBytes, 0) + } + + var mul = 1 + var i = 0 + this[offset] = value & 0xFF + while (++i < byteLength && (mul *= 0x100)) { + this[offset + i] = (value / mul) & 0xFF + } + + return offset + byteLength +} + +Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) { + value = +value + offset = offset | 0 + byteLength = byteLength | 0 + if (!noAssert) { + var maxBytes = Math.pow(2, 8 * byteLength) - 1 + checkInt(this, value, offset, byteLength, maxBytes, 0) + } + + var i = byteLength - 1 + var mul = 1 + this[offset + i] = value & 0xFF + while (--i >= 0 && (mul *= 0x100)) { + this[offset + i] = (value / mul) & 0xFF + } + + return offset + byteLength +} + +Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0) + if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value) + this[offset] = (value & 0xff) + return offset + 1 +} + +function objectWriteUInt16 (buf, value, offset, littleEndian) { + if (value < 0) value = 0xffff + value + 1 + for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; ++i) { + buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>> + (littleEndian ? i : 1 - i) * 8 + } +} + +Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0) + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset] = (value & 0xff) + this[offset + 1] = (value >>> 8) + } else { + objectWriteUInt16(this, value, offset, true) + } + return offset + 2 +} + +Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0) + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset] = (value >>> 8) + this[offset + 1] = (value & 0xff) + } else { + objectWriteUInt16(this, value, offset, false) + } + return offset + 2 +} + +function objectWriteUInt32 (buf, value, offset, littleEndian) { + if (value < 0) value = 0xffffffff + value + 1 + for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; ++i) { + buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff + } +} + +Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0) + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset + 3] = (value >>> 24) + this[offset + 2] = (value >>> 16) + this[offset + 1] = (value >>> 8) + this[offset] = (value & 0xff) + } else { + objectWriteUInt32(this, value, offset, true) + } + return offset + 4 +} + +Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0) + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset] = (value >>> 24) + this[offset + 1] = (value >>> 16) + this[offset + 2] = (value >>> 8) + this[offset + 3] = (value & 0xff) + } else { + objectWriteUInt32(this, value, offset, false) + } + return offset + 4 +} + +Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) { + var limit = Math.pow(2, 8 * byteLength - 1) + + checkInt(this, value, offset, byteLength, limit - 1, -limit) + } + + var i = 0 + var mul = 1 + var sub = 0 + this[offset] = value & 0xFF + while (++i < byteLength && (mul *= 0x100)) { + if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) { + sub = 1 + } + this[offset + i] = ((value / mul) >> 0) - sub & 0xFF + } + + return offset + byteLength +} + +Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) { + var limit = Math.pow(2, 8 * byteLength - 1) + + checkInt(this, value, offset, byteLength, limit - 1, -limit) + } + + var i = byteLength - 1 + var mul = 1 + var sub = 0 + this[offset + i] = value & 0xFF + while (--i >= 0 && (mul *= 0x100)) { + if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) { + sub = 1 + } + this[offset + i] = ((value / mul) >> 0) - sub & 0xFF + } + + return offset + byteLength +} + +Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80) + if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value) + if (value < 0) value = 0xff + value + 1 + this[offset] = (value & 0xff) + return offset + 1 +} + +Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000) + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset] = (value & 0xff) + this[offset + 1] = (value >>> 8) + } else { + objectWriteUInt16(this, value, offset, true) + } + return offset + 2 +} + +Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000) + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset] = (value >>> 8) + this[offset + 1] = (value & 0xff) + } else { + objectWriteUInt16(this, value, offset, false) + } + return offset + 2 +} + +Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000) + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset] = (value & 0xff) + this[offset + 1] = (value >>> 8) + this[offset + 2] = (value >>> 16) + this[offset + 3] = (value >>> 24) + } else { + objectWriteUInt32(this, value, offset, true) + } + return offset + 4 +} + +Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000) + if (value < 0) value = 0xffffffff + value + 1 + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset] = (value >>> 24) + this[offset + 1] = (value >>> 16) + this[offset + 2] = (value >>> 8) + this[offset + 3] = (value & 0xff) + } else { + objectWriteUInt32(this, value, offset, false) + } + return offset + 4 +} + +function checkIEEE754 (buf, value, offset, ext, max, min) { + if (offset + ext > buf.length) throw new RangeError('Index out of range') + if (offset < 0) throw new RangeError('Index out of range') +} + +function writeFloat (buf, value, offset, littleEndian, noAssert) { + if (!noAssert) { + checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38) + } + ieee754.write(buf, value, offset, littleEndian, 23, 4) + return offset + 4 +} + +Buffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) { + return writeFloat(this, value, offset, true, noAssert) +} + +Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) { + return writeFloat(this, value, offset, false, noAssert) +} + +function writeDouble (buf, value, offset, littleEndian, noAssert) { + if (!noAssert) { + checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308) + } + ieee754.write(buf, value, offset, littleEndian, 52, 8) + return offset + 8 +} + +Buffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) { + return writeDouble(this, value, offset, true, noAssert) +} + +Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) { + return writeDouble(this, value, offset, false, noAssert) +} + +// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length) +Buffer.prototype.copy = function copy (target, targetStart, start, end) { + if (!start) start = 0 + if (!end && end !== 0) end = this.length + if (targetStart >= target.length) targetStart = target.length + if (!targetStart) targetStart = 0 + if (end > 0 && end < start) end = start + + // Copy 0 bytes; we're done + if (end === start) return 0 + if (target.length === 0 || this.length === 0) return 0 + + // Fatal error conditions + if (targetStart < 0) { + throw new RangeError('targetStart out of bounds') + } + if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds') + if (end < 0) throw new RangeError('sourceEnd out of bounds') + + // Are we oob? + if (end > this.length) end = this.length + if (target.length - targetStart < end - start) { + end = target.length - targetStart + start + } + + var len = end - start + var i + + if (this === target && start < targetStart && targetStart < end) { + // descending copy from end + for (i = len - 1; i >= 0; --i) { + target[i + targetStart] = this[i + start] + } + } else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) { + // ascending copy from start + for (i = 0; i < len; ++i) { + target[i + targetStart] = this[i + start] + } + } else { + Uint8Array.prototype.set.call( + target, + this.subarray(start, start + len), + targetStart + ) + } + + return len +} + +// Usage: +// buffer.fill(number[, offset[, end]]) +// buffer.fill(buffer[, offset[, end]]) +// buffer.fill(string[, offset[, end]][, encoding]) +Buffer.prototype.fill = function fill (val, start, end, encoding) { + // Handle string cases: + if (typeof val === 'string') { + if (typeof start === 'string') { + encoding = start + start = 0 + end = this.length + } else if (typeof end === 'string') { + encoding = end + end = this.length + } + if (val.length === 1) { + var code = val.charCodeAt(0) + if (code < 256) { + val = code + } + } + if (encoding !== undefined && typeof encoding !== 'string') { + throw new TypeError('encoding must be a string') + } + if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) { + throw new TypeError('Unknown encoding: ' + encoding) + } + } else if (typeof val === 'number') { + val = val & 255 + } + + // Invalid ranges are not set to a default, so can range check early. + if (start < 0 || this.length < start || this.length < end) { + throw new RangeError('Out of range index') + } + + if (end <= start) { + return this + } + + start = start >>> 0 + end = end === undefined ? this.length : end >>> 0 + + if (!val) val = 0 + + var i + if (typeof val === 'number') { + for (i = start; i < end; ++i) { + this[i] = val + } + } else { + var bytes = Buffer.isBuffer(val) + ? val + : utf8ToBytes(new Buffer(val, encoding).toString()) + var len = bytes.length + for (i = 0; i < end - start; ++i) { + this[i + start] = bytes[i % len] + } + } + + return this +} + +// HELPER FUNCTIONS +// ================ + +var INVALID_BASE64_RE = /[^+\/0-9A-Za-z-_]/g + +function base64clean (str) { + // Node strips out invalid characters like \n and \t from the string, base64-js does not + str = stringtrim(str).replace(INVALID_BASE64_RE, '') + // Node converts strings with length < 2 to '' + if (str.length < 2) return '' + // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not + while (str.length % 4 !== 0) { + str = str + '=' + } + return str +} + +function stringtrim (str) { + if (str.trim) return str.trim() + return str.replace(/^\s+|\s+$/g, '') +} + +function toHex (n) { + if (n < 16) return '0' + n.toString(16) + return n.toString(16) +} + +function utf8ToBytes (string, units) { + units = units || Infinity + var codePoint + var length = string.length + var leadSurrogate = null + var bytes = [] + + for (var i = 0; i < length; ++i) { + codePoint = string.charCodeAt(i) + + // is surrogate component + if (codePoint > 0xD7FF && codePoint < 0xE000) { + // last char was a lead + if (!leadSurrogate) { + // no lead yet + if (codePoint > 0xDBFF) { + // unexpected trail + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) + continue + } else if (i + 1 === length) { + // unpaired lead + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) + continue + } + + // valid lead + leadSurrogate = codePoint + + continue + } + + // 2 leads in a row + if (codePoint < 0xDC00) { + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) + leadSurrogate = codePoint + continue + } + + // valid surrogate pair + codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000 + } else if (leadSurrogate) { + // valid bmp char, but last char was a lead + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) + } + + leadSurrogate = null + + // encode utf8 + if (codePoint < 0x80) { + if ((units -= 1) < 0) break + bytes.push(codePoint) + } else if (codePoint < 0x800) { + if ((units -= 2) < 0) break + bytes.push( + codePoint >> 0x6 | 0xC0, + codePoint & 0x3F | 0x80 + ) + } else if (codePoint < 0x10000) { + if ((units -= 3) < 0) break + bytes.push( + codePoint >> 0xC | 0xE0, + codePoint >> 0x6 & 0x3F | 0x80, + codePoint & 0x3F | 0x80 + ) + } else if (codePoint < 0x110000) { + if ((units -= 4) < 0) break + bytes.push( + codePoint >> 0x12 | 0xF0, + codePoint >> 0xC & 0x3F | 0x80, + codePoint >> 0x6 & 0x3F | 0x80, + codePoint & 0x3F | 0x80 + ) + } else { + throw new Error('Invalid code point') + } + } + + return bytes +} + +function asciiToBytes (str) { + var byteArray = [] + for (var i = 0; i < str.length; ++i) { + // Node's code seems to be doing this and not & 0x7F.. + byteArray.push(str.charCodeAt(i) & 0xFF) + } + return byteArray +} + +function utf16leToBytes (str, units) { + var c, hi, lo + var byteArray = [] + for (var i = 0; i < str.length; ++i) { + if ((units -= 2) < 0) break + + c = str.charCodeAt(i) + hi = c >> 8 + lo = c % 256 + byteArray.push(lo) + byteArray.push(hi) + } + + return byteArray +} + +function base64ToBytes (str) { + return base64.toByteArray(base64clean(str)) +} + +function blitBuffer (src, dst, offset, length) { + for (var i = 0; i < length; ++i) { + if ((i + offset >= dst.length) || (i >= src.length)) break + dst[i + offset] = src[i] + } + return i +} + +function isnan (val) { + return val !== val // eslint-disable-line no-self-compare +} + +/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(22))) + +/***/ }), +/* 22 */ +/***/ (function(module, exports) { + +var g; + +// This works in non-strict mode +g = (function() { + return this; +})(); + +try { + // This works if eval is allowed (see CSP) + g = g || Function("return this")() || (1,eval)("this"); +} catch(e) { + // This works if the window reference is available + if(typeof window === "object") + g = window; +} + +// g can still be undefined, but nothing to do about it... +// We return undefined, instead of nothing here, so it's +// easier to handle this case. if(!global) { ...} + +module.exports = g; + + +/***/ }), +/* 23 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +exports.byteLength = byteLength +exports.toByteArray = toByteArray +exports.fromByteArray = fromByteArray + +var lookup = [] +var revLookup = [] +var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array + +var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' +for (var i = 0, len = code.length; i < len; ++i) { + lookup[i] = code[i] + revLookup[code.charCodeAt(i)] = i +} + +revLookup['-'.charCodeAt(0)] = 62 +revLookup['_'.charCodeAt(0)] = 63 + +function placeHoldersCount (b64) { + var len = b64.length + if (len % 4 > 0) { + throw new Error('Invalid string. Length must be a multiple of 4') + } + + // the number of equal signs (place holders) + // if there are two placeholders, than the two characters before it + // represent one byte + // if there is only one, then the three characters before it represent 2 bytes + // this is just a cheap hack to not do indexOf twice + return b64[len - 2] === '=' ? 2 : b64[len - 1] === '=' ? 1 : 0 +} + +function byteLength (b64) { + // base64 is 4/3 + up to two characters of the original data + return (b64.length * 3 / 4) - placeHoldersCount(b64) +} + +function toByteArray (b64) { + var i, l, tmp, placeHolders, arr + var len = b64.length + placeHolders = placeHoldersCount(b64) + + arr = new Arr((len * 3 / 4) - placeHolders) + + // if there are placeholders, only get up to the last complete 4 chars + l = placeHolders > 0 ? len - 4 : len + + var L = 0 + + for (i = 0; i < l; i += 4) { + tmp = (revLookup[b64.charCodeAt(i)] << 18) | (revLookup[b64.charCodeAt(i + 1)] << 12) | (revLookup[b64.charCodeAt(i + 2)] << 6) | revLookup[b64.charCodeAt(i + 3)] + arr[L++] = (tmp >> 16) & 0xFF + arr[L++] = (tmp >> 8) & 0xFF + arr[L++] = tmp & 0xFF + } + + if (placeHolders === 2) { + tmp = (revLookup[b64.charCodeAt(i)] << 2) | (revLookup[b64.charCodeAt(i + 1)] >> 4) + arr[L++] = tmp & 0xFF + } else if (placeHolders === 1) { + tmp = (revLookup[b64.charCodeAt(i)] << 10) | (revLookup[b64.charCodeAt(i + 1)] << 4) | (revLookup[b64.charCodeAt(i + 2)] >> 2) + arr[L++] = (tmp >> 8) & 0xFF + arr[L++] = tmp & 0xFF + } + + return arr +} + +function tripletToBase64 (num) { + return lookup[num >> 18 & 0x3F] + lookup[num >> 12 & 0x3F] + lookup[num >> 6 & 0x3F] + lookup[num & 0x3F] +} + +function encodeChunk (uint8, start, end) { + var tmp + var output = [] + for (var i = start; i < end; i += 3) { + tmp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2]) + output.push(tripletToBase64(tmp)) + } + return output.join('') +} + +function fromByteArray (uint8) { + var tmp + var len = uint8.length + var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes + var output = '' + var parts = [] + var maxChunkLength = 16383 // must be multiple of 3 + + // go through the array every three bytes, we'll deal with trailing stuff later + for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) { + parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength))) + } + + // pad the end with zeros, but make sure to not forget the extra bytes + if (extraBytes === 1) { + tmp = uint8[len - 1] + output += lookup[tmp >> 2] + output += lookup[(tmp << 4) & 0x3F] + output += '==' + } else if (extraBytes === 2) { + tmp = (uint8[len - 2] << 8) + (uint8[len - 1]) + output += lookup[tmp >> 10] + output += lookup[(tmp >> 4) & 0x3F] + output += lookup[(tmp << 2) & 0x3F] + output += '=' + } + + parts.push(output) + + return parts.join('') +} + + +/***/ }), +/* 24 */ +/***/ (function(module, exports) { + +exports.read = function (buffer, offset, isLE, mLen, nBytes) { + var e, m + var eLen = nBytes * 8 - mLen - 1 + var eMax = (1 << eLen) - 1 + var eBias = eMax >> 1 + var nBits = -7 + var i = isLE ? (nBytes - 1) : 0 + var d = isLE ? -1 : 1 + var s = buffer[offset + i] + + i += d + + e = s & ((1 << (-nBits)) - 1) + s >>= (-nBits) + nBits += eLen + for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {} + + m = e & ((1 << (-nBits)) - 1) + e >>= (-nBits) + nBits += mLen + for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {} + + if (e === 0) { + e = 1 - eBias + } else if (e === eMax) { + return m ? NaN : ((s ? -1 : 1) * Infinity) + } else { + m = m + Math.pow(2, mLen) + e = e - eBias + } + return (s ? -1 : 1) * m * Math.pow(2, e - mLen) +} + +exports.write = function (buffer, value, offset, isLE, mLen, nBytes) { + var e, m, c + var eLen = nBytes * 8 - mLen - 1 + var eMax = (1 << eLen) - 1 + var eBias = eMax >> 1 + var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0) + var i = isLE ? 0 : (nBytes - 1) + var d = isLE ? 1 : -1 + var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0 + + value = Math.abs(value) + + if (isNaN(value) || value === Infinity) { + m = isNaN(value) ? 1 : 0 + e = eMax + } else { + e = Math.floor(Math.log(value) / Math.LN2) + if (value * (c = Math.pow(2, -e)) < 1) { + e-- + c *= 2 + } + if (e + eBias >= 1) { + value += rt / c + } else { + value += rt * Math.pow(2, 1 - eBias) + } + if (value * c >= 2) { + e++ + c /= 2 + } + + if (e + eBias >= eMax) { + m = 0 + e = eMax + } else if (e + eBias >= 1) { + m = (value * c - 1) * Math.pow(2, mLen) + e = e + eBias + } else { + m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen) + e = 0 + } + } + + for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {} + + e = (e << mLen) | m + eLen += mLen + for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {} + + buffer[offset + i - d] |= s * 128 +} + + +/***/ }), +/* 25 */ +/***/ (function(module, exports) { + +var toString = {}.toString; + +module.exports = Array.isArray || function (arr) { + return toString.call(arr) == '[object Array]'; +}; + /***/ }), -/* 25 */ +/* 26 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var Clock = (function () { + function Clock(useInterval) { + if (useInterval === void 0) { useInterval = false; } + this.running = false; + this.now = (typeof (window) !== "undefined" && window.performance && window.performance.now && (window.performance.now).bind(window.performance)) || Date.now; + this.start(useInterval); + } + Clock.prototype.start = function (useInterval) { + if (useInterval === void 0) { useInterval = false; } + this.deltaTime = 0; + this.currentTime = this.now(); + this.elapsedTime = 0; + this.running = true; + if (useInterval) { + // auto set interval to 60 ticks per second + this._interval = setInterval(this.tick.bind(this), 1000 / 60); + } + }; + Clock.prototype.stop = function () { + this.running = false; + if (this._interval) { + clearInterval(this._interval); + } + }; + Clock.prototype.tick = function (newTime) { + if (newTime === void 0) { newTime = this.now(); } + this.deltaTime = newTime - this.currentTime; + this.currentTime = newTime; + this.elapsedTime += this.deltaTime; + }; + return Clock; +}()); +module.exports = Clock; + + +/***/ }), +/* 27 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +var DeltaContainer_1 = __webpack_require__(28); +exports.DeltaContainer = DeltaContainer_1.DeltaContainer; + + +/***/ }), +/* 28 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +var compare_1 = __webpack_require__(29); +var DeltaContainer = /** @class */ (function () { + function DeltaContainer(data) { + this.listeners = []; + this.matcherPlaceholders = { + ":id": /^([a-zA-Z0-9\-_]+)$/, + ":number": /^([0-9]+)$/, + ":string": /^(\w+)$/, + ":axis": /^([xyz])$/, + ":*": /(.*)/, + }; + this.data = data; + this.reset(); + } + DeltaContainer.prototype.set = function (newData) { + var patches = compare_1.compare(this.data, newData); + this.checkPatches(patches); + this.data = newData; + return patches; + }; + DeltaContainer.prototype.registerPlaceholder = function (placeholder, matcher) { + this.matcherPlaceholders[placeholder] = matcher; + }; + DeltaContainer.prototype.listen = function (segments, callback) { + var _this = this; + var rules; + if (typeof (segments) === "function") { + rules = []; + callback = segments; + } + else { + rules = segments.split("/"); + } + var listener = { + callback: callback, + rawRules: rules, + rules: rules.map(function (segment) { + if (typeof (segment) === "string") { + // replace placeholder matchers + return (segment.indexOf(":") === 0) + ? _this.matcherPlaceholders[segment] || _this.matcherPlaceholders[":*"] + : new RegExp("^" + segment + "$"); + } + else { + return segment; + } + }) + }; + if (rules.length === 0) { + this.defaultListener = listener; + } + else { + this.listeners.push(listener); + } + return listener; + }; + DeltaContainer.prototype.removeListener = function (listener) { + for (var i = this.listeners.length - 1; i >= 0; i--) { + if (this.listeners[i] === listener) { + this.listeners.splice(i, 1); + } + } + }; + DeltaContainer.prototype.removeAllListeners = function () { + this.reset(); + }; + DeltaContainer.prototype.checkPatches = function (patches) { + for (var i = patches.length - 1; i >= 0; i--) { + var matched = false; + for (var j = 0, len = this.listeners.length; j < len; j++) { + var listener = this.listeners[j]; + var pathVariables = this.getPathVariables(patches[i], listener); + if (pathVariables) { + listener.callback({ + path: pathVariables, + rawPath: patches[i].path, + operation: patches[i].operation, + value: patches[i].value + }); + matched = true; + } + } + // check for fallback listener + if (!matched && this.defaultListener) { + this.defaultListener.callback(patches[i]); + } + } + }; + DeltaContainer.prototype.getPathVariables = function (patch, listener) { + // skip if rules count differ from patch + if (patch.path.length !== listener.rules.length) { + return false; + } + var path = {}; + for (var i = 0, len = listener.rules.length; i < len; i++) { + var matches = patch.path[i].match(listener.rules[i]); + if (!matches || matches.length === 0 || matches.length > 2) { + return false; + } + else if (listener.rawRules[i].substr(0, 1) === ":") { + path[listener.rawRules[i].substr(1)] = matches[1]; + } + } + return path; + }; + DeltaContainer.prototype.reset = function () { + this.listeners = []; + }; + return DeltaContainer; +}()); +exports.DeltaContainer = DeltaContainer; + + +/***/ }), +/* 29 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +function compare(tree1, tree2) { + var patches = []; + generate(tree1, tree2, patches, []); + return patches; +} +exports.compare = compare; +function concat(arr, value) { + var newArr = arr.slice(); + newArr.push(value); + return newArr; +} +function objectKeys(obj) { + if (Array.isArray(obj)) { + var keys_1 = new Array(obj.length); + for (var k = 0; k < keys_1.length; k++) { + keys_1[k] = "" + k; + } + return keys_1; + } + if (Object.keys) { + return Object.keys(obj); + } + var keys = []; + for (var i in obj) { + if (obj.hasOwnProperty(i)) { + keys.push(i); + } + } + return keys; +} +; +// Dirty check if obj is different from mirror, generate patches and update mirror +function generate(mirror, obj, patches, path) { + var newKeys = objectKeys(obj); + var oldKeys = objectKeys(mirror); + var changed = false; + var deleted = false; + for (var t = oldKeys.length - 1; t >= 0; t--) { + var key = oldKeys[t]; + var oldVal = mirror[key]; + if (obj.hasOwnProperty(key) && !(obj[key] === undefined && oldVal !== undefined && Array.isArray(obj) === false)) { + var newVal = obj[key]; + if (typeof oldVal == "object" && oldVal != null && typeof newVal == "object" && newVal != null) { + generate(oldVal, newVal, patches, concat(path, key)); + } + else { + if (oldVal !== newVal) { + changed = true; + patches.push({ operation: "replace", path: concat(path, key), value: newVal }); + } + } + } + else { + patches.push({ operation: "remove", path: concat(path, key) }); + deleted = true; // property has been deleted + } + } + if (!deleted && newKeys.length == oldKeys.length) { + return; + } + for (var t = 0; t < newKeys.length; t++) { + var key = newKeys[t]; + if (!mirror.hasOwnProperty(key) && obj[key] !== undefined) { + var newVal = obj[key]; + var addPath = concat(path, key); + // compare deeper additions + if (typeof newVal == "object" && newVal != null) { + generate({}, newVal, patches, addPath); + } + patches.push({ operation: "add", path: addPath, value: newVal }); + } + } +} + + +/***/ }), +/* 30 */ /***/ (function(module, exports) { // Fossil SCM delta compression algorithm @@ -2843,7 +4888,7 @@ return fossilDelta; /***/ }), -/* 26 */ +/* 31 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -2859,7 +4904,7 @@ var __extends = (this && this.__extends) || (function () { }; })(); Object.defineProperty(exports, "__esModule", { value: true }); -var websocket_1 = __webpack_require__(27); +var websocket_1 = __webpack_require__(32); var msgpack = __webpack_require__(1); var Connection = /** @class */ (function (_super) { __extends(Connection, _super); @@ -2896,11 +4941,11 @@ exports.Connection = Connection; /***/ }), -/* 27 */ +/* 32 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -Object.defineProperty(exports,"__esModule",{value:true});var _createClass=function(){function defineProperties(target,props){for(var i=0;i2&&arguments[2]!==undefined?arguments[2]:{};_classCallCheck(this,WebSocketClient);this.url=url;this.protocols=protocols;this.reconnectEnabled=true;this.listeners={};this.backoff=createBackoff(options.backoff||'exponential',options);this.backoff.onReady=this.onBackoffReady.bind(this);this.open();}_createClass(WebSocketClient,[{key:'open',value:function open(){var reconnect=arguments.length>0&&arguments[0]!==undefined?arguments[0]:false;this.isReconnect=reconnect;// keep binaryType used on previous WebSocket connection @@ -2978,7 +5023,7 @@ this.open(true);}/** */WebSocketClient.CLOSED=WebSocket.CLOSED;exports.default=WebSocketClient; /***/ }), -/* 28 */ +/* 33 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -2986,4 +5031,4 @@ Object.defineProperty(exports,"__esModule",{value:true});exports.createBackoff=c /***/ }) /******/ ]); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAgMTRiMDU2MjU1MGI5ZWM4NzIxNTkiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3NpZ25hbHMuanMvbGliL29yZy9vc2ZsYXNoL3NpZ25hbHMvU2xvdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbm90ZXBhY2suaW8vbGliL2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9zaWduYWxzLmpzL2xpYi9vcmcvb3NmbGFzaC9zaWduYWxzL09uY2VTaWduYWwuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1Byb3RvY29sLnRzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9zaWduYWxzLmpzL2xpYi9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvc2lnbmFscy5qcy9saWIvb3JnL29zZmxhc2gvc2lnbmFscy9Qcmlvcml0eVNpZ25hbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvc2lnbmFscy5qcy9saWIvb3JnL29zZmxhc2gvc2lnbmFscy9TaWduYWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3NpZ25hbHMuanMvbGliL29yZy9vc2ZsYXNoL3NpZ25hbHMvU2xvdExpc3QuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1Jvb20udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2luZGV4LnRzIiwid2VicGFjazovLy8uL3NyYy9DbGllbnQudHMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL25vdGVwYWNrLmlvL2Jyb3dzZXIvZW5jb2RlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9ub3RlcGFjay5pby9icm93c2VyL2RlY29kZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvc2lnbmFscy5qcy9saWIvb3JnL29zZmxhc2gvc2lnbmFscy9EZWx1eGVTaWduYWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3NpZ25hbHMuanMvbGliL29yZy9vc2ZsYXNoL3NpZ25hbHMvZXZlbnRzL0dlbmVyaWNFdmVudC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvc2lnbmFscy5qcy9saWIvb3JnL29zZmxhc2gvc2lnbmFscy9JT25jZVNpZ25hbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvc2lnbmFscy5qcy9saWIvb3JnL29zZmxhc2gvc2lnbmFscy9JUHJpb3JpdHlTaWduYWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3NpZ25hbHMuanMvbGliL29yZy9vc2ZsYXNoL3NpZ25hbHMvSVNpZ25hbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvc2lnbmFscy5qcy9saWIvb3JnL29zZmxhc2gvc2lnbmFscy9JU2xvdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvc2lnbmFscy5qcy9saWIvb3JnL29zZmxhc2gvc2lnbmFscy9Nb25vU2lnbmFsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9zaWduYWxzLmpzL2xpYi9vcmcvb3NmbGFzaC9zaWduYWxzL1Byb21pc2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BnYW1lc3RkaW8vY2xvY2svZGlzdC9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZGVsdGEtbGlzdGVuZXIvbGliL2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kZWx0YS1saXN0ZW5lci9saWIvRGVsdGFDb250YWluZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2RlbHRhLWxpc3RlbmVyL2xpYi9jb21wYXJlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9mb3NzaWwtZGVsdGEvZm9zc2lsLWRlbHRhLmpzIiwid2VicGFjazovLy8uL3NyYy9Db25uZWN0aW9uLnRzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZ2FtZXN0ZGlvL3dlYnNvY2tldC9saWIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BnYW1lc3RkaW8vd2Vic29ja2V0L2xpYi9iYWNrb2ZmLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG1DQUEyQiwwQkFBMEIsRUFBRTtBQUN2RCx5Q0FBaUMsZUFBZTtBQUNoRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw4REFBc0QsK0RBQStEOztBQUVySDtBQUNBOztBQUVBO0FBQ0E7Ozs7Ozs7O0FDN0RBO0FBQ0EsOENBQThDLGNBQWM7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEIsY0FBYztBQUM1QyxrQ0FBa0MsY0FBYztBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLGdDOzs7Ozs7QUNyTEE7QUFDQTs7Ozs7Ozs7QUNEQTtBQUNBLDhDQUE4QyxjQUFjO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDLGVBQWU7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3Qix1QkFBdUI7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxtREFBbUQsS0FBSztBQUN4RDtBQUNBO0FBQ0E7QUFDQSw4RUFBOEU7QUFDOUU7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLHVCQUF1QjtBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIscUJBQXFCO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QixjQUFjO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0Esc0M7Ozs7Ozs7QUMxSkE7QUFDQTtBQUNBLDhDQUE4QyxjQUFjO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyx1REFBdUQ7Ozs7Ozs7O0FDaEJ4RDtBQUNBLDhDQUE4QyxjQUFjO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQzs7Ozs7OztBQzVCQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLGdCQUFnQixzQ0FBc0MsaUJBQWlCLEVBQUU7QUFDbkYseUJBQXlCLHVEQUF1RDtBQUNoRjtBQUNBO0FBQ0EsdUJBQXVCLHNCQUFzQjtBQUM3QztBQUNBO0FBQ0EsQ0FBQztBQUNELDhDQUE4QyxjQUFjO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3Qix1QkFBdUI7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQyxjQUFjO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0MsY0FBYztBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QixjQUFjO0FBQzVDO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QixjQUFjO0FBQzVDLGtDQUFrQyxjQUFjO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQSwwQzs7Ozs7OztBQy9EQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLGdCQUFnQixzQ0FBc0MsaUJBQWlCLEVBQUU7QUFDbkYseUJBQXlCLHVEQUF1RDtBQUNoRjtBQUNBO0FBQ0EsdUJBQXVCLHNCQUFzQjtBQUM3QztBQUNBO0FBQ0EsQ0FBQztBQUNELDhDQUE4QyxjQUFjO0FBQzVEO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQyxlQUFlO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3Qix1QkFBdUI7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLGtDOzs7Ozs7O0FDL0RBO0FBQ0EsOENBQThDLGNBQWM7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLGFBQWE7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7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RjtBQUMvRjtBQUNBLE1BQU0sRUFBRSx3Q0FBd0MsbUNBQW1DLG9CQUFvQixpQ0FBaUM7QUFDeEk7QUFDQSxNQUFNLEVBQUUsNkNBQTZDLHdDQUF3QyxvQkFBb0IsdUNBQXVDLEdBQUcsd0JBQXdCLEdBQUc7QUFDdEw7QUFDQSxtREFBbUQ7QUFDbkQ7QUFDQSx1Q0FBdUM7QUFDdkM7QUFDQSw2Q0FBNkM7QUFDN0M7QUFDQSwyQ0FBMkMsZ0M7Ozs7Ozs7QUMzRTlCLDRDQUE0QyxXQUFXLEVBQUUsb0NBQW9DLGFBQWEsZ0RBQWdELDREQUE0RCw2Q0FBNkMsY0FBYyxvQkFBb0IscUJBQXFCLGdCQUFnQixjQUFjLFNBQVMsc0JBQXNCLGFBQWEsZUFBZSxrREFBa0QscUNBQXFDLDJDQUEyQywrQkFBK0IsZUFBZSxnQkFBZ0IsK0VBQStFLHFDQUFxQyxpRSIsImZpbGUiOiJjb2x5c2V1cy5qcyIsInNvdXJjZXNDb250ZW50IjpbIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwge1xuIFx0XHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcbiBcdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG4gXHRcdFx0XHRnZXQ6IGdldHRlclxuIFx0XHRcdH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDkpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2svYm9vdHN0cmFwIDE0YjA1NjI1NTBiOWVjODcyMTU5IiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG4vKipcbiAqIFRoZSBTbG90IGNsYXNzIHJlcHJlc2VudHMgYSBzaWduYWwgc2xvdC5cbiAqXG4gKiBAYXV0aG9yIFJvYmVydCBQZW5uZXJcbiAqIEBhdXRob3IgSm9hIEViZXJ0XG4gKi9cbnZhciBTbG90ID0gKGZ1bmN0aW9uICgpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IFNsb3Qgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lciBhc3NvY2lhdGVkIHdpdGggdGhlIHNsb3QuXG4gICAgICogQHBhcmFtIHNpZ25hbCBUaGUgc2lnbmFsIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2xvdC5cbiAgICAgKiBAcGFyYW0gb25jZSBXaGV0aGVyIG9yIG5vdCB0aGUgbGlzdGVuZXIgc2hvdWxkIGJlIGV4ZWN1dGVkIG9ubHkgb25jZS5cbiAgICAgKiBAcGFyYW0gcHJpb3JpdHkgVGhlIHByaW9yaXR5IG9mIHRoZSBzbG90LlxuICAgICAqXG4gICAgICogQHRocm93cyBBcmd1bWVudEVycm9yIDxjb2RlPkFyZ3VtZW50RXJyb3I8L2NvZGU+OiBHaXZlbiBsaXN0ZW5lciBpcyA8Y29kZT5udWxsPC9jb2RlPi5cbiAgICAgKiBAdGhyb3dzIEVycm9yIDxjb2RlPkVycm9yPC9jb2RlPjogSW50ZXJuYWwgc2lnbmFsIHJlZmVyZW5jZSBoYXMgbm90IGJlZW4gc2V0IHlldC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBTbG90KGxpc3RlbmVyLCBzaWduYWwsIG9uY2UsIHByaW9yaXR5KSB7XG4gICAgICAgIGlmIChvbmNlID09PSB2b2lkIDApIHsgb25jZSA9IGZhbHNlOyB9XG4gICAgICAgIGlmIChwcmlvcml0eSA9PT0gdm9pZCAwKSB7IHByaW9yaXR5ID0gMDsgfVxuICAgICAgICB0aGlzLl9lbmFibGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fb25jZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9wcmlvcml0eSA9IDA7XG4gICAgICAgIHRoaXMuX2xpc3RlbmVyID0gbGlzdGVuZXI7XG4gICAgICAgIHRoaXMuX29uY2UgPSBvbmNlO1xuICAgICAgICB0aGlzLl9zaWduYWwgPSBzaWduYWw7XG4gICAgICAgIHRoaXMuX3ByaW9yaXR5ID0gcHJpb3JpdHk7XG4gICAgICAgIHRoaXMudmVyaWZ5TGlzdGVuZXIobGlzdGVuZXIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIFNsb3QucHJvdG90eXBlLmV4ZWN1dGUwID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIXRoaXMuX2VuYWJsZWQpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGlmICh0aGlzLl9vbmNlKVxuICAgICAgICAgICAgdGhpcy5yZW1vdmUoKTtcbiAgICAgICAgaWYgKHRoaXMuX3BhcmFtcyAmJiB0aGlzLl9wYXJhbXMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLl9saXN0ZW5lci5hcHBseShudWxsLCB0aGlzLl9wYXJhbXMpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2xpc3RlbmVyKCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIFNsb3QucHJvdG90eXBlLmV4ZWN1dGUxID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIGlmICghdGhpcy5fZW5hYmxlZClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgaWYgKHRoaXMuX29uY2UpXG4gICAgICAgICAgICB0aGlzLnJlbW92ZSgpO1xuICAgICAgICBpZiAodGhpcy5fcGFyYW1zICYmIHRoaXMuX3BhcmFtcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuX2xpc3RlbmVyLmFwcGx5KG51bGwsIFt2YWx1ZV0uY29uY2F0KHRoaXMuX3BhcmFtcykpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2xpc3RlbmVyKHZhbHVlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgU2xvdC5wcm90b3R5cGUuZXhlY3V0ZSA9IGZ1bmN0aW9uICh2YWx1ZU9iamVjdHMpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9lbmFibGVkKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBpZiAodGhpcy5fb25jZSlcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlKCk7XG4gICAgICAgIC8vIElmIHdlIGhhdmUgcGFyYW1ldGVycywgYWRkIHRoZW0gdG8gdGhlIHZhbHVlT2JqZWN0XG4gICAgICAgIC8vIE5vdGU6IFRoaXMgY291bGQgYmUgZXhwZW5zaXZlIGlmIHdlJ3JlIGFmdGVyIHRoZSBmYXN0ZXN0IGRpc3BhdGNoIHBvc3NpYmxlLlxuICAgICAgICBpZiAodGhpcy5fcGFyYW1zICYmIHRoaXMuX3BhcmFtcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHZhbHVlT2JqZWN0cyA9IHZhbHVlT2JqZWN0cy5jb25jYXQodGhpcy5fcGFyYW1zKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBOT1RFOiBzaW1wbGUgaWZzIGFyZSBmYXN0ZXIgdGhhbiBzd2l0Y2g6IGh0dHA6Ly9qYWNrc29uZHVuc3Rhbi5jb20vYXJ0aWNsZXMvMTAwN1xuICAgICAgICB2YXIgbnVtVmFsdWVPYmplY3RzID0gdmFsdWVPYmplY3RzLmxlbmd0aDtcbiAgICAgICAgaWYgKG51bVZhbHVlT2JqZWN0cyA9PSAwKSB7XG4gICAgICAgICAgICB0aGlzLl9saXN0ZW5lcigpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG51bVZhbHVlT2JqZWN0cyA9PSAxKSB7XG4gICAgICAgICAgICB0aGlzLl9saXN0ZW5lcih2YWx1ZU9iamVjdHNbMF0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG51bVZhbHVlT2JqZWN0cyA9PSAyKSB7XG4gICAgICAgICAgICB0aGlzLl9saXN0ZW5lcih2YWx1ZU9iamVjdHNbMF0sIHZhbHVlT2JqZWN0c1sxXSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobnVtVmFsdWVPYmplY3RzID09IDMpIHtcbiAgICAgICAgICAgIHRoaXMuX2xpc3RlbmVyKHZhbHVlT2JqZWN0c1swXSwgdmFsdWVPYmplY3RzWzFdLCB2YWx1ZU9iamVjdHNbMl0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fbGlzdGVuZXIuYXBwbHkobnVsbCwgdmFsdWVPYmplY3RzKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFNsb3QucHJvdG90eXBlLCBcImxpc3RlbmVyXCIsIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBpbmhlcml0RG9jXG4gICAgICAgICAqIEB0aHJvd3MgQXJndW1lbnRFcnJvciA8Y29kZT5Bcmd1bWVudEVycm9yPC9jb2RlPjogR2l2ZW4gbGlzdGVuZXIgaXMgPGNvZGU+bnVsbDwvY29kZT4uIERpZCB5b3Ugd2FudCB0byBzZXQgZW5hYmxlZCB0byBmYWxzZSBpbnN0ZWFkP1xuICAgICAgICAgKiBAdGhyb3dzIEVycm9yIDxjb2RlPkVycm9yPC9jb2RlPjogSW50ZXJuYWwgc2lnbmFsIHJlZmVyZW5jZSBoYXMgbm90IGJlZW4gc2V0IHlldC5cbiAgICAgICAgICovXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2xpc3RlbmVyO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgaWYgKG51bGwgPT0gdmFsdWUpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdHaXZlbiBsaXN0ZW5lciBpcyBudWxsLlxcbkRpZCB5b3Ugd2FudCB0byBzZXQgZW5hYmxlZCB0byBmYWxzZSBpbnN0ZWFkPycpO1xuICAgICAgICAgICAgdGhpcy52ZXJpZnlMaXN0ZW5lcih2YWx1ZSk7XG4gICAgICAgICAgICB0aGlzLl9saXN0ZW5lciA9IHZhbHVlO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU2xvdC5wcm90b3R5cGUsIFwib25jZVwiLCB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaW5oZXJpdERvY1xuICAgICAgICAgKi9cbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fb25jZTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFNsb3QucHJvdG90eXBlLCBcInByaW9yaXR5XCIsIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBpbmhlcml0RG9jXG4gICAgICAgICAqL1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wcmlvcml0eTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbmQgcmV0dXJucyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjdXJyZW50IG9iamVjdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgY3VycmVudCBvYmplY3QuXG4gICAgICovXG4gICAgU2xvdC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBcIltTbG90IGxpc3RlbmVyOiBcIiArIHRoaXMuX2xpc3RlbmVyICsgXCIsIG9uY2U6IFwiICsgdGhpcy5fb25jZVxuICAgICAgICAgICAgKyBcIiwgcHJpb3JpdHk6IFwiICsgdGhpcy5fcHJpb3JpdHkgKyBcIiwgZW5hYmxlZDogXCIgKyB0aGlzLl9lbmFibGVkICsgXCJdXCI7XG4gICAgfTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU2xvdC5wcm90b3R5cGUsIFwiZW5hYmxlZFwiLCB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaW5oZXJpdERvY1xuICAgICAgICAgKi9cbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZW5hYmxlZDtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuX2VuYWJsZWQgPSB2YWx1ZTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFNsb3QucHJvdG90eXBlLCBcInBhcmFtc1wiLCB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaW5oZXJpdERvY1xuICAgICAgICAgKi9cbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcGFyYW1zO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5fcGFyYW1zID0gdmFsdWU7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgU2xvdC5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl9zaWduYWwucmVtb3ZlKHRoaXMuX2xpc3RlbmVyKTtcbiAgICB9O1xuICAgIFNsb3QucHJvdG90eXBlLnZlcmlmeUxpc3RlbmVyID0gZnVuY3Rpb24gKGxpc3RlbmVyKSB7XG4gICAgICAgIGlmIChudWxsID09IGxpc3RlbmVyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0dpdmVuIGxpc3RlbmVyIGlzIG51bGwuJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG51bGwgPT0gdGhpcy5fc2lnbmFsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludGVybmFsIHNpZ25hbCByZWZlcmVuY2UgaGFzIG5vdCBiZWVuIHNldCB5ZXQuJyk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBTbG90O1xufSgpKTtcbmV4cG9ydHMuU2xvdCA9IFNsb3Q7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TbG90LmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL3NpZ25hbHMuanMvbGliL29yZy9vc2ZsYXNoL3NpZ25hbHMvU2xvdC5qc1xuLy8gbW9kdWxlIGlkID0gMFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJleHBvcnRzLmVuY29kZSA9IHJlcXVpcmUoJy4vZW5jb2RlJyk7XG5leHBvcnRzLmRlY29kZSA9IHJlcXVpcmUoJy4vZGVjb2RlJyk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9ub3RlcGFjay5pby9saWIvaW5kZXguanNcbi8vIG1vZHVsZSBpZCA9IDFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgU2xvdExpc3RfMSA9IHJlcXVpcmUoXCIuL1Nsb3RMaXN0XCIpO1xudmFyIFNsb3RfMSA9IHJlcXVpcmUoXCIuL1Nsb3RcIik7XG4vKipcbiAqIEFsbG93cyB0aGUgdmFsdWVDbGFzc2VzIHRvIGJlIHNldCBpbiBNWE1MLCBlLmcuXG4gKiA8c2lnbmFsczpTaWduYWwgaWQ9XCJuYW1lQ2hhbmdlZFwiPntbU3RyaW5nLCB1aW50XX08L3NpZ25hbHM6U2lnbmFsPlxuICovXG4vKltEZWZhdWx0UHJvcGVydHkoXCJ2YWx1ZUNsYXNzZXNcIildKi9cbi8qKlxuICogU2lnbmFsIGRpc3BhdGNoZXMgZXZlbnRzIHRvIG11bHRpcGxlIGxpc3RlbmVycy5cbiAqIEl0IGlzIGluc3BpcmVkIGJ5IEMjIGV2ZW50cyBhbmQgZGVsZWdhdGVzLCBhbmQgYnlcbiAqIDxhIHRhcmdldD1cIl90b3BcIiBocmVmPVwiaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TaWduYWxzX2FuZF9zbG90c1wiPnNpZ25hbHMgYW5kIHNsb3RzPC9hPlxuICogaW4gUXQuXG4gKiBBIFNpZ25hbCBhZGRzIGV2ZW50IGRpc3BhdGNoaW5nIGZ1bmN0aW9uYWxpdHkgdGhyb3VnaCBjb21wb3NpdGlvbiBhbmQgaW50ZXJmYWNlcyxcbiAqIHJhdGhlciB0aGFuIGluaGVyaXRpbmcgZnJvbSBhIGRpc3BhdGNoZXIuXG4gKiA8YnIvPjxici8+XG4gKiBQcm9qZWN0IGhvbWU6IDxhIHRhcmdldD1cIl90b3BcIiBocmVmPVwiaHR0cDovL2dpdGh1Yi5jb20vcm9iZXJ0cGVubmVyL2FzMy1zaWduYWxzL1wiPmh0dHA6Ly9naXRodWIuY29tL3JvYmVydHBlbm5lci9hczMtc2lnbmFscy88L2E+XG4gKi9cbnZhciBPbmNlU2lnbmFsID0gKGZ1bmN0aW9uICgpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgU2lnbmFsIGluc3RhbmNlIHRvIGRpc3BhdGNoIHZhbHVlIG9iamVjdHMuXG4gICAgICogQHBhcmFtICAgIHZhbHVlQ2xhc3NlcyBBbnkgbnVtYmVyIG9mIGNsYXNzIHJlZmVyZW5jZXMgdGhhdCBlbmFibGUgdHlwZSBjaGVja3MgaW4gZGlzcGF0Y2goKS5cbiAgICAgKiBGb3IgZXhhbXBsZSwgbmV3IFNpZ25hbChTdHJpbmcsIHVpbnQpXG4gICAgICogd291bGQgYWxsb3c6IHNpZ25hbC5kaXNwYXRjaChcInRoZSBBbnN3ZXJcIiwgNDIpXG4gICAgICogYnV0IG5vdDogc2lnbmFsLmRpc3BhdGNoKHRydWUsIDQyLjUpXG4gICAgICogbm9yOiBzaWduYWwuZGlzcGF0Y2goKVxuICAgICAqXG4gICAgICogTk9URTogSW4gQVMzLCBzdWJjbGFzc2VzIGNhbm5vdCBjYWxsIHN1cGVyLmFwcGx5KG51bGwsIHZhbHVlQ2xhc3NlcyksXG4gICAgICogYnV0IHRoaXMgY29uc3RydWN0b3IgaGFzIGxvZ2ljIHRvIHN1cHBvcnQgc3VwZXIodmFsdWVDbGFzc2VzKS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBPbmNlU2lnbmFsKCkge1xuICAgICAgICB2YXIgdmFsdWVDbGFzc2VzID0gW107XG4gICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICB2YWx1ZUNsYXNzZXNbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNsb3RzID0gU2xvdExpc3RfMS5TbG90TGlzdC5OSUw7XG4gICAgICAgIC8vIENhbm5vdCB1c2Ugc3VwZXIuYXBwbHkobnVsbCwgdmFsdWVDbGFzc2VzKSwgc28gYWxsb3cgdGhlIHN1YmNsYXNzIHRvIGNhbGwgc3VwZXIodmFsdWVDbGFzc2VzKS5cbiAgICAgICAgdGhpcy52YWx1ZUNsYXNzZXMgPSAodmFsdWVDbGFzc2VzLmxlbmd0aCA9PSAxICYmIHZhbHVlQ2xhc3Nlc1swXSBpbnN0YW5jZW9mIEFycmF5KSA/IHZhbHVlQ2xhc3Nlc1swXSA6IHZhbHVlQ2xhc3NlcztcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KE9uY2VTaWduYWwucHJvdG90eXBlLCBcInZhbHVlQ2xhc3Nlc1wiLCB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaW5oZXJpdERvY1xuICAgICAgICAgKiBAdGhyb3dzIEFyZ3VtZW50RXJyb3IgPGNvZGU+QXJndW1lbnRFcnJvcjwvY29kZT46IEludmFsaWQgdmFsdWVDbGFzc2VzIGFyZ3VtZW50OiBpdGVtIGF0IGluZGV4IHNob3VsZCBiZSBhIENsYXNzIGJ1dCB3YXMgbm90LlxuICAgICAgICAgKi9cbiAgICAgICAgLypbQXJyYXlFbGVtZW50VHlwZShcIkNsYXNzXCIpXSovXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlQ2xhc3NlcztcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIC8vIENsb25lIHNvIHRoZSBBcnJheSBjYW5ub3QgYmUgYWZmZWN0ZWQgZnJvbSBvdXRzaWRlLlxuICAgICAgICAgICAgdGhpcy5fdmFsdWVDbGFzc2VzID0gdmFsdWUgPyB2YWx1ZS5zbGljZSgpIDogW107XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gdGhpcy5fdmFsdWVDbGFzc2VzLmxlbmd0aDsgaS0tOykge1xuICAgICAgICAgICAgICAgIGlmICghKHRoaXMuX3ZhbHVlQ2xhc3Nlc1tpXSBpbnN0YW5jZW9mIE9iamVjdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHZhbHVlQ2xhc3NlcyBhcmd1bWVudDogJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnaXRlbSBhdCBpbmRleCAnICsgaSArICcgc2hvdWxkIGJlIGEgQ2xhc3MgYnV0IHdhczo8JyArXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZUNsYXNzZXNbaV0gKyAnPi4nICsgdGhpcy5fdmFsdWVDbGFzc2VzW2ldKTsgLy9AQ0hBTkdFRCAtIHRlbXAgcmVwbGFjZW1lbnQgZm9yIGdldFF1YWxpZmllZENsYXNzQnlOYW1lKClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShPbmNlU2lnbmFsLnByb3RvdHlwZSwgXCJudW1MaXN0ZW5lcnNcIiwge1xuICAgICAgICAvKiogQGluaGVyaXREb2MgKi9cbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zbG90cy5sZW5ndGg7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICogQHRocm93cyBmbGFzaC5lcnJvcnMuSWxsZWdhbE9wZXJhdGlvbkVycm9yIDxjb2RlPklsbGVnYWxPcGVyYXRpb25FcnJvcjwvY29kZT46IFlvdSBjYW5ub3QgYWRkT25jZSgpIHRoZW4gYWRkKCkgdGhlIHNhbWUgbGlzdGVuZXIgd2l0aG91dCByZW1vdmluZyB0aGUgcmVsYXRpb25zaGlwIGZpcnN0LlxuICAgICAqIEB0aHJvd3MgQXJndW1lbnRFcnJvciA8Y29kZT5Bcmd1bWVudEVycm9yPC9jb2RlPjogR2l2ZW4gbGlzdGVuZXIgaXMgPGNvZGU+bnVsbDwvY29kZT4uXG4gICAgICovXG4gICAgT25jZVNpZ25hbC5wcm90b3R5cGUuYWRkT25jZSA9IGZ1bmN0aW9uIChsaXN0ZW5lcikge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWdpc3Rlckxpc3RlbmVyKGxpc3RlbmVyLCB0cnVlKTtcbiAgICB9O1xuICAgIC8qKiBAaW5oZXJpdERvYyAqL1xuICAgIE9uY2VTaWduYWwucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uIChsaXN0ZW5lcikge1xuICAgICAgICB2YXIgc2xvdCA9IHRoaXMuc2xvdHMuZmluZChsaXN0ZW5lcik7XG4gICAgICAgIGlmICghc2xvdClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB0aGlzLnNsb3RzID0gdGhpcy5zbG90cy5maWx0ZXJOb3QobGlzdGVuZXIpO1xuICAgICAgICByZXR1cm4gc2xvdDtcbiAgICB9O1xuICAgIC8qKiBAaW5oZXJpdERvYyAqL1xuICAgIE9uY2VTaWduYWwucHJvdG90eXBlLnJlbW92ZUFsbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5zbG90cyA9IFNsb3RMaXN0XzEuU2xvdExpc3QuTklMO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKiBAdGhyb3dzIEFyZ3VtZW50RXJyb3IgPGNvZGU+QXJndW1lbnRFcnJvcjwvY29kZT46IEluY29ycmVjdCBudW1iZXIgb2YgYXJndW1lbnRzLlxuICAgICAqIEB0aHJvd3MgQXJndW1lbnRFcnJvciA8Y29kZT5Bcmd1bWVudEVycm9yPC9jb2RlPjogVmFsdWUgb2JqZWN0IGlzIG5vdCBhbiBpbnN0YW5jZSBvZiB0aGUgYXBwcm9wcmlhdGUgdmFsdWVDbGFzc2VzIENsYXNzLlxuICAgICAqL1xuICAgIE9uY2VTaWduYWwucHJvdG90eXBlLmRpc3BhdGNoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdmFsdWVPYmplY3RzID0gW107XG4gICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICB2YWx1ZU9iamVjdHNbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiB2YWx1ZUNsYXNzZXMgaXMgZW1wdHksIHZhbHVlIG9iamVjdHMgYXJlIG5vdCB0eXBlLWNoZWNrZWQuXG4gICAgICAgIHZhciBudW1WYWx1ZUNsYXNzZXMgPSB0aGlzLl92YWx1ZUNsYXNzZXMubGVuZ3RoO1xuICAgICAgICB2YXIgbnVtVmFsdWVPYmplY3RzID0gdmFsdWVPYmplY3RzLmxlbmd0aDtcbiAgICAgICAgLy8gQ2Fubm90IGRpc3BhdGNoIGZld2VyIG9iamVjdHMgdGhhbiBkZWNsYXJlZCBjbGFzc2VzLlxuICAgICAgICBpZiAobnVtVmFsdWVPYmplY3RzIDwgbnVtVmFsdWVDbGFzc2VzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0luY29ycmVjdCBudW1iZXIgb2YgYXJndW1lbnRzLiAnICtcbiAgICAgICAgICAgICAgICAnRXhwZWN0ZWQgYXQgbGVhc3QgJyArIG51bVZhbHVlQ2xhc3NlcyArICcgYnV0IHJlY2VpdmVkICcgK1xuICAgICAgICAgICAgICAgIG51bVZhbHVlT2JqZWN0cyArICcuJyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ2Fubm90IGRpc3BhdGNoIGRpZmZlcmVudGx5IHR5cGVkIG9iamVjdHMgdGhhbiBkZWNsYXJlZCBjbGFzc2VzLlxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bVZhbHVlQ2xhc3NlczsgaSsrKSB7XG4gICAgICAgICAgICAvLyBPcHRpbWl6ZWQgZm9yIHRoZSBvcHRpbWlzdGljIGNhc2UgdGhhdCB2YWx1ZXMgYXJlIGNvcnJlY3QuXG4gICAgICAgICAgICBpZiAodmFsdWVPYmplY3RzW2ldID09PSBudWxsIHx8XG4gICAgICAgICAgICAgICAgKHZhbHVlT2JqZWN0c1tpXSBpbnN0YW5jZW9mIHRoaXMuX3ZhbHVlQ2xhc3Nlc1tpXSB8fCB2YWx1ZU9iamVjdHNbaV0uY29uc3RydWN0b3IgPT09IHRoaXMuX3ZhbHVlQ2xhc3Nlc1tpXSkpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVmFsdWUgb2JqZWN0IDwnICsgdmFsdWVPYmplY3RzW2ldXG4gICAgICAgICAgICAgICAgKyAnPiBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgPCcgKyB0aGlzLl92YWx1ZUNsYXNzZXNbaV0gKyAnPi4nKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBCcm9hZGNhc3QgdG8gbGlzdGVuZXJzLlxuICAgICAgICB2YXIgc2xvdHNUb1Byb2Nlc3MgPSB0aGlzLnNsb3RzO1xuICAgICAgICBpZiAoc2xvdHNUb1Byb2Nlc3Mubm9uRW1wdHkpIHtcbiAgICAgICAgICAgIHdoaWxlIChzbG90c1RvUHJvY2Vzcy5ub25FbXB0eSkge1xuICAgICAgICAgICAgICAgIHNsb3RzVG9Qcm9jZXNzLmhlYWQuZXhlY3V0ZSh2YWx1ZU9iamVjdHMpO1xuICAgICAgICAgICAgICAgIHNsb3RzVG9Qcm9jZXNzID0gc2xvdHNUb1Byb2Nlc3MudGFpbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgT25jZVNpZ25hbC5wcm90b3R5cGUucmVnaXN0ZXJMaXN0ZW5lciA9IGZ1bmN0aW9uIChsaXN0ZW5lciwgb25jZSkge1xuICAgICAgICBpZiAob25jZSA9PT0gdm9pZCAwKSB7IG9uY2UgPSBmYWxzZTsgfVxuICAgICAgICBpZiAodGhpcy5yZWdpc3RyYXRpb25Qb3NzaWJsZShsaXN0ZW5lciwgb25jZSkpIHtcbiAgICAgICAgICAgIHZhciBuZXdTbG90ID0gbmV3IFNsb3RfMS5TbG90KGxpc3RlbmVyLCB0aGlzLCBvbmNlKTtcbiAgICAgICAgICAgIHRoaXMuc2xvdHMgPSB0aGlzLnNsb3RzLnByZXBlbmQobmV3U2xvdCk7XG4gICAgICAgICAgICByZXR1cm4gbmV3U2xvdDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5zbG90cy5maW5kKGxpc3RlbmVyKTtcbiAgICB9O1xuICAgIE9uY2VTaWduYWwucHJvdG90eXBlLnJlZ2lzdHJhdGlvblBvc3NpYmxlID0gZnVuY3Rpb24gKGxpc3RlbmVyLCBvbmNlKSB7XG4gICAgICAgIGlmICghdGhpcy5zbG90cy5ub25FbXB0eSlcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB2YXIgZXhpc3RpbmdTbG90ID0gdGhpcy5zbG90cy5maW5kKGxpc3RlbmVyKTtcbiAgICAgICAgaWYgKCFleGlzdGluZ1Nsb3QpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKGV4aXN0aW5nU2xvdC5vbmNlICE9IG9uY2UpIHtcbiAgICAgICAgICAgIC8vIElmIHRoZSBsaXN0ZW5lciB3YXMgcHJldmlvdXNseSBhZGRlZCwgZGVmaW5pdGVseSBkb24ndCBhZGQgaXQgYWdhaW4uXG4gICAgICAgICAgICAvLyBCdXQgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZWlyIG9uY2UgdmFsdWVzIGRpZmZlci5cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignWW91IGNhbm5vdCBhZGRPbmNlKCkgdGhlbiBhZGQoKSB0aGUgc2FtZSBsaXN0ZW5lciB3aXRob3V0IHJlbW92aW5nIHRoZSByZWxhdGlvbnNoaXAgZmlyc3QuJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBMaXN0ZW5lciB3YXMgYWxyZWFkeSByZWdpc3RlcmVkLlxuICAgIH07XG4gICAgcmV0dXJuIE9uY2VTaWduYWw7XG59KCkpO1xuZXhwb3J0cy5PbmNlU2lnbmFsID0gT25jZVNpZ25hbDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU9uY2VTaWduYWwuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvc2lnbmFscy5qcy9saWIvb3JnL29zZmxhc2gvc2lnbmFscy9PbmNlU2lnbmFsLmpzXG4vLyBtb2R1bGUgaWQgPSAyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIlwidXNlIHN0cmljdFwiO1xuLy8gVXNlIGNvZGVzIGJldHdlZW4gMH4xMjcgZm9yIGxlc3NlciB0aHJvdWdocHV0ICgxIGJ5dGUpXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgUHJvdG9jb2w7XG4oZnVuY3Rpb24gKFByb3RvY29sKSB7XG4gICAgLy8gVXNlci1yZWxhdGVkICgwfjEwKVxuICAgIFByb3RvY29sW1Byb3RvY29sW1wiVVNFUl9JRFwiXSA9IDFdID0gXCJVU0VSX0lEXCI7XG4gICAgLy8gUm9vbS1yZWxhdGVkICgxMH4yMClcbiAgICBQcm90b2NvbFtQcm90b2NvbFtcIkpPSU5fUk9PTVwiXSA9IDEwXSA9IFwiSk9JTl9ST09NXCI7XG4gICAgUHJvdG9jb2xbUHJvdG9jb2xbXCJKT0lOX0VSUk9SXCJdID0gMTFdID0gXCJKT0lOX0VSUk9SXCI7XG4gICAgUHJvdG9jb2xbUHJvdG9jb2xbXCJMRUFWRV9ST09NXCJdID0gMTJdID0gXCJMRUFWRV9ST09NXCI7XG4gICAgUHJvdG9jb2xbUHJvdG9jb2xbXCJST09NX0RBVEFcIl0gPSAxM10gPSBcIlJPT01fREFUQVwiO1xuICAgIFByb3RvY29sW1Byb3RvY29sW1wiUk9PTV9TVEFURVwiXSA9IDE0XSA9IFwiUk9PTV9TVEFURVwiO1xuICAgIFByb3RvY29sW1Byb3RvY29sW1wiUk9PTV9TVEFURV9QQVRDSFwiXSA9IDE1XSA9IFwiUk9PTV9TVEFURV9QQVRDSFwiO1xuICAgIC8vIEdlbmVyaWMgbWVzc2FnZXMgKDUwfjYwKVxuICAgIFByb3RvY29sW1Byb3RvY29sW1wiQkFEX1JFUVVFU1RcIl0gPSA1MF0gPSBcIkJBRF9SRVFVRVNUXCI7XG59KShQcm90b2NvbCA9IGV4cG9ydHMuUHJvdG9jb2wgfHwgKGV4cG9ydHMuUHJvdG9jb2wgPSB7fSkpO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9zcmMvUHJvdG9jb2wudHNcbi8vIG1vZHVsZSBpZCA9IDNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgRGVsdXhlU2lnbmFsXzEgPSByZXF1aXJlKFwiLi9vcmcvb3NmbGFzaC9zaWduYWxzL0RlbHV4ZVNpZ25hbFwiKTtcbmV4cG9ydHMuRGVsdXhlU2lnbmFsID0gRGVsdXhlU2lnbmFsXzEuRGVsdXhlU2lnbmFsO1xudmFyIEdlbmVyaWNFdmVudF8xID0gcmVxdWlyZShcIi4vb3JnL29zZmxhc2gvc2lnbmFscy9ldmVudHMvR2VuZXJpY0V2ZW50XCIpO1xuZXhwb3J0cy5HZW5lcmljRXZlbnQgPSBHZW5lcmljRXZlbnRfMS5HZW5lcmljRXZlbnQ7XG52YXIgSU9uY2VTaWduYWxfMSA9IHJlcXVpcmUoXCIuL29yZy9vc2ZsYXNoL3NpZ25hbHMvSU9uY2VTaWduYWxcIik7XG5leHBvcnRzLklPbmNlU2lnbmFsID0gSU9uY2VTaWduYWxfMS5JT25jZVNpZ25hbDtcbnZhciBJUHJpb3JpdHlTaWduYWxfMSA9IHJlcXVpcmUoXCIuL29yZy9vc2ZsYXNoL3NpZ25hbHMvSVByaW9yaXR5U2lnbmFsXCIpO1xuZXhwb3J0cy5JUHJpb3JpdHlTaWduYWwgPSBJUHJpb3JpdHlTaWduYWxfMS5JUHJpb3JpdHlTaWduYWw7XG52YXIgSVNpZ25hbF8xID0gcmVxdWlyZShcIi4vb3JnL29zZmxhc2gvc2lnbmFscy9JU2lnbmFsXCIpO1xuZXhwb3J0cy5JU2lnbmFsID0gSVNpZ25hbF8xLklTaWduYWw7XG52YXIgSVNsb3RfMSA9IHJlcXVpcmUoXCIuL29yZy9vc2ZsYXNoL3NpZ25hbHMvSVNsb3RcIik7XG5leHBvcnRzLklTbG90ID0gSVNsb3RfMS5JU2xvdDtcbnZhciBNb25vU2lnbmFsXzEgPSByZXF1aXJlKFwiLi9vcmcvb3NmbGFzaC9zaWduYWxzL01vbm9TaWduYWxcIik7XG5leHBvcnRzLk1vbm9TaWduYWwgPSBNb25vU2lnbmFsXzEuTW9ub1NpZ25hbDtcbnZhciBPbmNlU2lnbmFsXzEgPSByZXF1aXJlKFwiLi9vcmcvb3NmbGFzaC9zaWduYWxzL09uY2VTaWduYWxcIik7XG5leHBvcnRzLk9uY2VTaWduYWwgPSBPbmNlU2lnbmFsXzEuT25jZVNpZ25hbDtcbnZhciBQcmlvcml0eVNpZ25hbF8xID0gcmVxdWlyZShcIi4vb3JnL29zZmxhc2gvc2lnbmFscy9Qcmlvcml0eVNpZ25hbFwiKTtcbmV4cG9ydHMuUHJpb3JpdHlTaWduYWwgPSBQcmlvcml0eVNpZ25hbF8xLlByaW9yaXR5U2lnbmFsO1xudmFyIFByb21pc2VfMSA9IHJlcXVpcmUoXCIuL29yZy9vc2ZsYXNoL3NpZ25hbHMvUHJvbWlzZVwiKTtcbmV4cG9ydHMuUHJvbWlzZSA9IFByb21pc2VfMS5Qcm9taXNlO1xudmFyIFNpZ25hbF8xID0gcmVxdWlyZShcIi4vb3JnL29zZmxhc2gvc2lnbmFscy9TaWduYWxcIik7XG5leHBvcnRzLlNpZ25hbCA9IFNpZ25hbF8xLlNpZ25hbDtcbnZhciBTbG90XzEgPSByZXF1aXJlKFwiLi9vcmcvb3NmbGFzaC9zaWduYWxzL1Nsb3RcIik7XG5leHBvcnRzLlNsb3QgPSBTbG90XzEuU2xvdDtcbnZhciBTbG90TGlzdF8xID0gcmVxdWlyZShcIi4vb3JnL29zZmxhc2gvc2lnbmFscy9TbG90TGlzdFwiKTtcbmV4cG9ydHMuU2xvdExpc3QgPSBTbG90TGlzdF8xLlNsb3RMaXN0O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvc2lnbmFscy5qcy9saWIvaW5kZXguanNcbi8vIG1vZHVsZSBpZCA9IDRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcbiAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxuICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTsgfTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbiAgICB9O1xufSkoKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciBTaWduYWxfMSA9IHJlcXVpcmUoXCIuL1NpZ25hbFwiKTtcbnZhciBTbG90XzEgPSByZXF1aXJlKFwiLi9TbG90XCIpO1xudmFyIFByaW9yaXR5U2lnbmFsID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUHJpb3JpdHlTaWduYWwsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUHJpb3JpdHlTaWduYWwoKSB7XG4gICAgICAgIHZhciB2YWx1ZUNsYXNzZXMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIHZhbHVlQ2xhc3Nlc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICB9XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIC8vIENhbm5vdCB1c2Ugc3VwZXIuYXBwbHkobnVsbCwgdmFsdWVDbGFzc2VzKSwgc28gYWxsb3cgdGhlIHN1YmNsYXNzIHRvIGNhbGwgc3VwZXIodmFsdWVDbGFzc2VzKS5cbiAgICAgICAgdmFsdWVDbGFzc2VzID0gKHZhbHVlQ2xhc3Nlcy5sZW5ndGggPT0gMSAmJiB2YWx1ZUNsYXNzZXNbMF0gaW5zdGFuY2VvZiBBcnJheSkgPyB2YWx1ZUNsYXNzZXNbMF0gOiB2YWx1ZUNsYXNzZXM7XG4gICAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgdmFsdWVDbGFzc2VzKSB8fCB0aGlzO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICogQHRocm93cyBmbGFzaC5lcnJvcnMuSWxsZWdhbE9wZXJhdGlvbkVycm9yIDxjb2RlPklsbGVnYWxPcGVyYXRpb25FcnJvcjwvY29kZT46IFlvdSBjYW5ub3QgYWRkT25jZSgpIHRoZW4gYWRkKCkgdGhlIHNhbWUgbGlzdGVuZXIgd2l0aG91dCByZW1vdmluZyB0aGUgcmVsYXRpb25zaGlwIGZpcnN0LlxuICAgICAqIEB0aHJvd3MgQXJndW1lbnRFcnJvciA8Y29kZT5Bcmd1bWVudEVycm9yPC9jb2RlPjogR2l2ZW4gbGlzdGVuZXIgaXMgPGNvZGU+bnVsbDwvY29kZT4uXG4gICAgICovXG4gICAgUHJpb3JpdHlTaWduYWwucHJvdG90eXBlLmFkZFdpdGhQcmlvcml0eSA9IGZ1bmN0aW9uIChsaXN0ZW5lciwgcHJpb3JpdHkpIHtcbiAgICAgICAgaWYgKHByaW9yaXR5ID09PSB2b2lkIDApIHsgcHJpb3JpdHkgPSAwOyB9XG4gICAgICAgIHJldHVybiB0aGlzLnJlZ2lzdGVyTGlzdGVuZXJXaXRoUHJpb3JpdHkobGlzdGVuZXIsIGZhbHNlLCBwcmlvcml0eSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqIEB0aHJvd3MgZmxhc2guZXJyb3JzLklsbGVnYWxPcGVyYXRpb25FcnJvciA8Y29kZT5JbGxlZ2FsT3BlcmF0aW9uRXJyb3I8L2NvZGU+OiBZb3UgY2Fubm90IGFkZE9uY2UoKSB0aGVuIGFkZCgpIHRoZSBzYW1lIGxpc3RlbmVyIHdpdGhvdXQgcmVtb3ZpbmcgdGhlIHJlbGF0aW9uc2hpcCBmaXJzdC5cbiAgICAgKiBAdGhyb3dzIEFyZ3VtZW50RXJyb3IgPGNvZGU+QXJndW1lbnRFcnJvcjwvY29kZT46IEdpdmVuIGxpc3RlbmVyIGlzIDxjb2RlPm51bGw8L2NvZGU+LlxuICAgICAqL1xuICAgIFByaW9yaXR5U2lnbmFsLnByb3RvdHlwZS5hZGRPbmNlV2l0aFByaW9yaXR5ID0gZnVuY3Rpb24gKGxpc3RlbmVyLCBwcmlvcml0eSkge1xuICAgICAgICBpZiAocHJpb3JpdHkgPT09IHZvaWQgMCkgeyBwcmlvcml0eSA9IDA7IH1cbiAgICAgICAgcmV0dXJuIHRoaXMucmVnaXN0ZXJMaXN0ZW5lcldpdGhQcmlvcml0eShsaXN0ZW5lciwgdHJ1ZSwgcHJpb3JpdHkpO1xuICAgIH07XG4gICAgLypvdmVycmlkZSovXG4gICAgUHJpb3JpdHlTaWduYWwucHJvdG90eXBlLnJlZ2lzdGVyTGlzdGVuZXIgPSBmdW5jdGlvbiAobGlzdGVuZXIsIG9uY2UpIHtcbiAgICAgICAgaWYgKG9uY2UgPT09IHZvaWQgMCkgeyBvbmNlID0gZmFsc2U7IH1cbiAgICAgICAgcmV0dXJuIHRoaXMucmVnaXN0ZXJMaXN0ZW5lcldpdGhQcmlvcml0eShsaXN0ZW5lciwgb25jZSk7XG4gICAgfTtcbiAgICBQcmlvcml0eVNpZ25hbC5wcm90b3R5cGUucmVnaXN0ZXJMaXN0ZW5lcldpdGhQcmlvcml0eSA9IGZ1bmN0aW9uIChsaXN0ZW5lciwgb25jZSwgcHJpb3JpdHkpIHtcbiAgICAgICAgaWYgKG9uY2UgPT09IHZvaWQgMCkgeyBvbmNlID0gZmFsc2U7IH1cbiAgICAgICAgaWYgKHByaW9yaXR5ID09PSB2b2lkIDApIHsgcHJpb3JpdHkgPSAwOyB9XG4gICAgICAgIGlmICh0aGlzLnJlZ2lzdHJhdGlvblBvc3NpYmxlKGxpc3RlbmVyLCBvbmNlKSkge1xuICAgICAgICAgICAgdmFyIHNsb3QgPSBuZXcgU2xvdF8xLlNsb3QobGlzdGVuZXIsIHRoaXMsIG9uY2UsIHByaW9yaXR5KTtcbiAgICAgICAgICAgIHRoaXMuc2xvdHMgPSB0aGlzLnNsb3RzLmluc2VydFdpdGhQcmlvcml0eShzbG90KTtcbiAgICAgICAgICAgIHJldHVybiBzbG90O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnNsb3RzLmZpbmQobGlzdGVuZXIpO1xuICAgIH07XG4gICAgcmV0dXJuIFByaW9yaXR5U2lnbmFsO1xufShTaWduYWxfMS5TaWduYWwpKTtcbmV4cG9ydHMuUHJpb3JpdHlTaWduYWwgPSBQcmlvcml0eVNpZ25hbDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVByaW9yaXR5U2lnbmFsLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL3NpZ25hbHMuanMvbGliL29yZy9vc2ZsYXNoL3NpZ25hbHMvUHJpb3JpdHlTaWduYWwuanNcbi8vIG1vZHVsZSBpZCA9IDVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcbiAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxuICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTsgfTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbiAgICB9O1xufSkoKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciBPbmNlU2lnbmFsXzEgPSByZXF1aXJlKFwiLi9PbmNlU2lnbmFsXCIpO1xuLyoqXG4gKiBBbGxvd3MgdGhlIHZhbHVlQ2xhc3NlcyB0byBiZSBzZXQgaW4gTVhNTCwgZS5nLlxuICogPHNpZ25hbHM6U2lnbmFsIGlkPVwibmFtZUNoYW5nZWRcIj57W1N0cmluZywgdWludF19PC9zaWduYWxzOlNpZ25hbD5cbiAqL1xuLypbRGVmYXVsdFByb3BlcnR5KFwidmFsdWVDbGFzc2VzXCIpXSovXG4vKipcbiAqIFNpZ25hbCBkaXNwYXRjaGVzIGV2ZW50cyB0byBtdWx0aXBsZSBsaXN0ZW5lcnMuXG4gKiBJdCBpcyBpbnNwaXJlZCBieSBDIyBldmVudHMgYW5kIGRlbGVnYXRlcywgYW5kIGJ5XG4gKiA8YSB0YXJnZXQ9XCJfdG9wXCIgaHJlZj1cImh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU2lnbmFsc19hbmRfc2xvdHNcIj5zaWduYWxzIGFuZCBzbG90czwvYT5cbiAqIGluIFF0LlxuICogQSBTaWduYWwgYWRkcyBldmVudCBkaXNwYXRjaGluZyBmdW5jdGlvbmFsaXR5IHRocm91Z2ggY29tcG9zaXRpb24gYW5kIGludGVyZmFjZXMsXG4gKiByYXRoZXIgdGhhbiBpbmhlcml0aW5nIGZyb20gYSBkaXNwYXRjaGVyLlxuICogPGJyLz48YnIvPlxuICogUHJvamVjdCBob21lOiA8YSB0YXJnZXQ9XCJfdG9wXCIgaHJlZj1cImh0dHA6Ly9naXRodWIuY29tL3JvYmVydHBlbm5lci9hczMtc2lnbmFscy9cIj5odHRwOi8vZ2l0aHViLmNvbS9yb2JlcnRwZW5uZXIvYXMzLXNpZ25hbHMvPC9hPlxuICovXG52YXIgU2lnbmFsID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoU2lnbmFsLCBfc3VwZXIpO1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBTaWduYWwgaW5zdGFuY2UgdG8gZGlzcGF0Y2ggdmFsdWUgb2JqZWN0cy5cbiAgICAgKiBAcGFyYW0gICAgdmFsdWVDbGFzc2VzIEFueSBudW1iZXIgb2YgY2xhc3MgcmVmZXJlbmNlcyB0aGF0IGVuYWJsZSB0eXBlIGNoZWNrcyBpbiBkaXNwYXRjaCgpLlxuICAgICAqIEZvciBleGFtcGxlLCBuZXcgU2lnbmFsKFN0cmluZywgdWludClcbiAgICAgKiB3b3VsZCBhbGxvdzogc2lnbmFsLmRpc3BhdGNoKFwidGhlIEFuc3dlclwiLCA0MilcbiAgICAgKiBidXQgbm90OiBzaWduYWwuZGlzcGF0Y2godHJ1ZSwgNDIuNSlcbiAgICAgKiBub3I6IHNpZ25hbC5kaXNwYXRjaCgpXG4gICAgICpcbiAgICAgKiBOT1RFOiBJbiBBUzMsIHN1YmNsYXNzZXMgY2Fubm90IGNhbGwgc3VwZXIuYXBwbHkobnVsbCwgdmFsdWVDbGFzc2VzKSxcbiAgICAgKiBidXQgdGhpcyBjb25zdHJ1Y3RvciBoYXMgbG9naWMgdG8gc3VwcG9ydCBzdXBlcih2YWx1ZUNsYXNzZXMpLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIFNpZ25hbCgpIHtcbiAgICAgICAgdmFyIHZhbHVlQ2xhc3NlcyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgdmFsdWVDbGFzc2VzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgIH1cbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgLy8gQ2Fubm90IHVzZSBzdXBlci5hcHBseShudWxsLCB2YWx1ZUNsYXNzZXMpLCBzbyBhbGxvdyB0aGUgc3ViY2xhc3MgdG8gY2FsbCBzdXBlcih2YWx1ZUNsYXNzZXMpLlxuICAgICAgICB2YWx1ZUNsYXNzZXMgPSAodmFsdWVDbGFzc2VzLmxlbmd0aCA9PSAxICYmIHZhbHVlQ2xhc3Nlc1swXSBpbnN0YW5jZW9mIEFycmF5KSA/IHZhbHVlQ2xhc3Nlc1swXSA6IHZhbHVlQ2xhc3NlcztcbiAgICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCB2YWx1ZUNsYXNzZXMpIHx8IHRoaXM7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKiBAdGhyb3dzIGZsYXNoLmVycm9ycy5JbGxlZ2FsT3BlcmF0aW9uRXJyb3IgPGNvZGU+SWxsZWdhbE9wZXJhdGlvbkVycm9yPC9jb2RlPjogWW91IGNhbm5vdCBhZGRPbmNlKCkgdGhlbiBhZGQoKSB0aGUgc2FtZSBsaXN0ZW5lciB3aXRob3V0IHJlbW92aW5nIHRoZSByZWxhdGlvbnNoaXAgZmlyc3QuXG4gICAgICogQHRocm93cyBBcmd1bWVudEVycm9yIDxjb2RlPkFyZ3VtZW50RXJyb3I8L2NvZGU+OiBHaXZlbiBsaXN0ZW5lciBpcyA8Y29kZT5udWxsPC9jb2RlPi5cbiAgICAgKi9cbiAgICBTaWduYWwucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIChsaXN0ZW5lcikge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWdpc3Rlckxpc3RlbmVyKGxpc3RlbmVyKTtcbiAgICB9O1xuICAgIHJldHVybiBTaWduYWw7XG59KE9uY2VTaWduYWxfMS5PbmNlU2lnbmFsKSk7XG5leHBvcnRzLlNpZ25hbCA9IFNpZ25hbDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNpZ25hbC5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9zaWduYWxzLmpzL2xpYi9vcmcvb3NmbGFzaC9zaWduYWxzL1NpZ25hbC5qc1xuLy8gbW9kdWxlIGlkID0gNlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbi8qKlxuICogVGhlIFNsb3RMaXN0IGNsYXNzIHJlcHJlc2VudHMgYW4gaW1tdXRhYmxlIGxpc3Qgb2YgU2xvdCBvYmplY3RzLlxuICpcbiAqIEBhdXRob3IgSm9hIEViZXJ0XG4gKiBAYXV0aG9yIFJvYmVydCBQZW5uZXJcbiAqL1xudmFyIFNsb3RMaXN0ID0gKGZ1bmN0aW9uICgpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IFNsb3RMaXN0IG9iamVjdC5cbiAgICAgKlxuICAgICAqIDxwPkEgdXNlciBuZXZlciBoYXMgdG8gY3JlYXRlIGEgU2xvdExpc3QgbWFudWFsbHkuXG4gICAgICogVXNlIHRoZSA8Y29kZT5OSUw8L2NvZGU+IGVsZW1lbnQgdG8gcmVwcmVzZW50IGFuIGVtcHR5IGxpc3QuXG4gICAgICogPGNvZGU+TklMLnByZXBlbmQodmFsdWUpPC9jb2RlPiB3b3VsZCBjcmVhdGUgYSBsaXN0IGNvbnRhaW5pbmcgPGNvZGU+dmFsdWU8L2NvZGU+PC9wPi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBoZWFkIFRoZSBmaXJzdCBzbG90IGluIHRoZSBsaXN0LlxuICAgICAqIEBwYXJhbSB0YWlsIEEgbGlzdCBjb250YWluaW5nIGFsbCBzbG90cyBleGNlcHQgaGVhZC5cbiAgICAgKlxuICAgICAqIEB0aHJvd3MgQXJndW1lbnRFcnJvciA8Y29kZT5Bcmd1bWVudEVycm9yPC9jb2RlPjogUGFyYW1ldGVycyBoZWFkIGFuZCB0YWlsIGFyZSBudWxsLiBVc2UgdGhlIE5JTCBlbGVtZW50IGluc3RlYWQuXG4gICAgICogQHRocm93cyBBcmd1bWVudEVycm9yIDxjb2RlPkFyZ3VtZW50RXJyb3I8L2NvZGU+OiBQYXJhbWV0ZXIgaGVhZCBjYW5ub3QgYmUgbnVsbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBTbG90TGlzdChoZWFkLCB0YWlsKSB7XG4gICAgICAgIGlmICh0YWlsID09PSB2b2lkIDApIHsgdGFpbCA9IG51bGw7IH1cbiAgICAgICAgdGhpcy5ub25FbXB0eSA9IGZhbHNlO1xuICAgICAgICBpZiAoIWhlYWQgJiYgIXRhaWwpIHtcbiAgICAgICAgICAgIGlmIChTbG90TGlzdC5OSUwpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQYXJhbWV0ZXJzIGhlYWQgYW5kIHRhaWwgYXJlIG51bGwuIFVzZSB0aGUgTklMIGVsZW1lbnQgaW5zdGVhZC4nKTtcbiAgICAgICAgICAgIC8vdGhpcyBpcyB0aGUgTklMIGVsZW1lbnQgYXMgcGVyIGRlZmluaXRpb25cbiAgICAgICAgICAgIHRoaXMubm9uRW1wdHkgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghaGVhZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQYXJhbWV0ZXIgaGVhZCBjYW5ub3QgYmUgbnVsbC4nKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaGVhZCA9IGhlYWQ7XG4gICAgICAgICAgICB0aGlzLnRhaWwgPSB0YWlsIHx8IFNsb3RMaXN0Lk5JTDtcbiAgICAgICAgICAgIHRoaXMubm9uRW1wdHkgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTbG90TGlzdC5wcm90b3R5cGUsIFwibGVuZ3RoXCIsIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBudW1iZXIgb2Ygc2xvdHMgaW4gdGhlIGxpc3QuXG4gICAgICAgICAqL1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5ub25FbXB0eSlcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIGlmICh0aGlzLnRhaWwgPT0gU2xvdExpc3QuTklMKVxuICAgICAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICAgICAgLy8gV2UgY291bGQgY2FjaGUgdGhlIGxlbmd0aCwgYnV0IGl0IHdvdWxkIG1ha2UgbWV0aG9kcyBsaWtlIGZpbHRlck5vdCB1bm5lY2Vzc2FyaWx5IGNvbXBsaWNhdGVkLlxuICAgICAgICAgICAgLy8gSW5zdGVhZCB3ZSBhc3N1bWUgdGhhdCBPKG4pIGlzIG9rYXkgc2luY2UgdGhlIGxlbmd0aCBwcm9wZXJ0eSBpcyB1c2VkIGluIHJhcmUgY2FzZXMuXG4gICAgICAgICAgICAvLyBXZSBjb3VsZCBhbHNvIGNhY2hlIHRoZSBsZW5ndGggbGF6eSwgYnV0IHRoYXQgaXMgYSB3YXN0ZSBvZiBhbm90aGVyIDhiIHBlciBsaXN0IG5vZGUgKGF0IGxlYXN0KS5cbiAgICAgICAgICAgIHZhciByZXN1bHQgPSAwO1xuICAgICAgICAgICAgdmFyIHAgPSB0aGlzO1xuICAgICAgICAgICAgd2hpbGUgKHAubm9uRW1wdHkpIHtcbiAgICAgICAgICAgICAgICArK3Jlc3VsdDtcbiAgICAgICAgICAgICAgICBwID0gcC50YWlsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgLyoqXG4gICAgICogUHJlcGVuZHMgYSBzbG90IHRvIHRoaXMgbGlzdC5cbiAgICAgKiBAcGFyYW0gICAgc2xvdCBUaGUgaXRlbSB0byBiZSBwcmVwZW5kZWQuXG4gICAgICogQHJldHVybiAgICBBIGxpc3QgY29uc2lzdGluZyBvZiBzbG90IGZvbGxvd2VkIGJ5IGFsbCBlbGVtZW50cyBvZiB0aGlzIGxpc3QuXG4gICAgICpcbiAgICAgKiBAdGhyb3dzIEFyZ3VtZW50RXJyb3IgPGNvZGU+QXJndW1lbnRFcnJvcjwvY29kZT46IFBhcmFtZXRlciBoZWFkIGNhbm5vdCBiZSBudWxsLlxuICAgICAqL1xuICAgIFNsb3RMaXN0LnByb3RvdHlwZS5wcmVwZW5kID0gZnVuY3Rpb24gKHNsb3QpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTbG90TGlzdChzbG90LCB0aGlzKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEFwcGVuZHMgYSBzbG90IHRvIHRoaXMgbGlzdC5cbiAgICAgKiBOb3RlOiBhcHBlbmRpbmcgaXMgTyhuKS4gV2hlcmUgcG9zc2libGUsIHByZXBlbmQgd2hpY2ggaXMgTygxKS5cbiAgICAgKiBJbiBzb21lIGNhc2VzLCBtYW55IGxpc3QgaXRlbXMgbXVzdCBiZSBjbG9uZWQgdG9cbiAgICAgKiBhdm9pZCBjaGFuZ2luZyBleGlzdGluZyBsaXN0cy5cbiAgICAgKiBAcGFyYW0gICAgc2xvdCBUaGUgaXRlbSB0byBiZSBhcHBlbmRlZC5cbiAgICAgKiBAcmV0dXJuICAgIEEgbGlzdCBjb25zaXN0aW5nIG9mIGFsbCBlbGVtZW50cyBvZiB0aGlzIGxpc3QgZm9sbG93ZWQgYnkgc2xvdC5cbiAgICAgKi9cbiAgICBTbG90TGlzdC5wcm90b3R5cGUuYXBwZW5kID0gZnVuY3Rpb24gKHNsb3QpIHtcbiAgICAgICAgaWYgKCFzbG90KVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIGlmICghdGhpcy5ub25FbXB0eSlcbiAgICAgICAgICAgIHJldHVybiBuZXcgU2xvdExpc3Qoc2xvdCk7XG4gICAgICAgIC8vIFNwZWNpYWwgY2FzZToganVzdCBvbmUgc2xvdCBjdXJyZW50bHkgaW4gdGhlIGxpc3QuXG4gICAgICAgIGlmICh0aGlzLnRhaWwgPT0gU2xvdExpc3QuTklMKVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBTbG90TGlzdChzbG90KS5wcmVwZW5kKHRoaXMuaGVhZCk7XG4gICAgICAgIC8vIFRoZSBsaXN0IGFscmVhZHkgaGFzIHR3byBvciBtb3JlIHNsb3RzLlxuICAgICAgICAvLyBXZSBoYXZlIHRvIGJ1aWxkIGEgbmV3IGxpc3Qgd2l0aCBjbG9uZWQgaXRlbXMgYmVjYXVzZSB0aGV5IGFyZSBpbW11dGFibGUuXG4gICAgICAgIHZhciB3aG9sZUNsb25lID0gbmV3IFNsb3RMaXN0KHRoaXMuaGVhZCk7XG4gICAgICAgIHZhciBzdWJDbG9uZSA9IHdob2xlQ2xvbmU7XG4gICAgICAgIHZhciBjdXJyZW50ID0gdGhpcy50YWlsO1xuICAgICAgICB3aGlsZSAoY3VycmVudC5ub25FbXB0eSkge1xuICAgICAgICAgICAgc3ViQ2xvbmUgPSBzdWJDbG9uZS50YWlsID0gbmV3IFNsb3RMaXN0KGN1cnJlbnQuaGVhZCk7XG4gICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC50YWlsO1xuICAgICAgICB9XG4gICAgICAgIC8vIEFwcGVuZCB0aGUgbmV3IHNsb3QgbGFzdC5cbiAgICAgICAgc3ViQ2xvbmUudGFpbCA9IG5ldyBTbG90TGlzdChzbG90KTtcbiAgICAgICAgcmV0dXJuIHdob2xlQ2xvbmU7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBJbnNlcnQgYSBzbG90IGludG8gdGhlIGxpc3QgaW4gYSBwb3NpdGlvbiBhY2NvcmRpbmcgdG8gaXRzIHByaW9yaXR5LlxuICAgICAqIFRoZSBoaWdoZXIgdGhlIHByaW9yaXR5LCB0aGUgY2xvc2VyIHRoZSBpdGVtIHdpbGwgYmUgaW5zZXJ0ZWQgdG8gdGhlIGxpc3QgaGVhZC5cbiAgICAgKiBAcGFyYW1zIHNsb3QgVGhlIGl0ZW0gdG8gYmUgaW5zZXJ0ZWQuXG4gICAgICpcbiAgICAgKiBAdGhyb3dzIEFyZ3VtZW50RXJyb3IgPGNvZGU+QXJndW1lbnRFcnJvcjwvY29kZT46IFBhcmFtZXRlcnMgaGVhZCBhbmQgdGFpbCBhcmUgbnVsbC4gVXNlIHRoZSBOSUwgZWxlbWVudCBpbnN0ZWFkLlxuICAgICAqIEB0aHJvd3MgQXJndW1lbnRFcnJvciA8Y29kZT5Bcmd1bWVudEVycm9yPC9jb2RlPjogUGFyYW1ldGVyIGhlYWQgY2Fubm90IGJlIG51bGwuXG4gICAgICovXG4gICAgU2xvdExpc3QucHJvdG90eXBlLmluc2VydFdpdGhQcmlvcml0eSA9IGZ1bmN0aW9uIChzbG90KSB7XG4gICAgICAgIGlmICghdGhpcy5ub25FbXB0eSlcbiAgICAgICAgICAgIHJldHVybiBuZXcgU2xvdExpc3Qoc2xvdCk7XG4gICAgICAgIHZhciBwcmlvcml0eSA9IHNsb3QucHJpb3JpdHk7XG4gICAgICAgIC8vIFNwZWNpYWwgY2FzZTogbmV3IHNsb3QgaGFzIHRoZSBoaWdoZXN0IHByaW9yaXR5LlxuICAgICAgICBpZiAocHJpb3JpdHkgPiB0aGlzLmhlYWQucHJpb3JpdHkpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcmVwZW5kKHNsb3QpO1xuICAgICAgICB2YXIgd2hvbGVDbG9uZSA9IG5ldyBTbG90TGlzdCh0aGlzLmhlYWQpO1xuICAgICAgICB2YXIgc3ViQ2xvbmUgPSB3aG9sZUNsb25lO1xuICAgICAgICB2YXIgY3VycmVudCA9IHRoaXMudGFpbDtcbiAgICAgICAgLy8gRmluZCBhIHNsb3Qgd2l0aCBsb3dlciBwcmlvcml0eSBhbmQgZ28gaW4gZnJvbnQgb2YgaXQuXG4gICAgICAgIHdoaWxlIChjdXJyZW50Lm5vbkVtcHR5KSB7XG4gICAgICAgICAgICBpZiAocHJpb3JpdHkgPiBjdXJyZW50LmhlYWQucHJpb3JpdHkpIHtcbiAgICAgICAgICAgICAgICBzdWJDbG9uZS50YWlsID0gY3VycmVudC5wcmVwZW5kKHNsb3QpO1xuICAgICAgICAgICAgICAgIHJldHVybiB3aG9sZUNsb25lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3ViQ2xvbmUgPSBzdWJDbG9uZS50YWlsID0gbmV3IFNsb3RMaXN0KGN1cnJlbnQuaGVhZCk7XG4gICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC50YWlsO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNsb3QgaGFzIGxvd2VzdCBwcmlvcml0eS5cbiAgICAgICAgc3ViQ2xvbmUudGFpbCA9IG5ldyBTbG90TGlzdChzbG90KTtcbiAgICAgICAgcmV0dXJuIHdob2xlQ2xvbmU7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBzbG90cyBpbiB0aGlzIGxpc3QgdGhhdCBkbyBub3QgY29udGFpbiB0aGUgc3VwcGxpZWQgbGlzdGVuZXIuXG4gICAgICogTm90ZTogYXNzdW1lcyB0aGUgbGlzdGVuZXIgaXMgbm90IHJlcGVhdGVkIHdpdGhpbiB0aGUgbGlzdC5cbiAgICAgKiBAcGFyYW0gICAgbGlzdGVuZXIgVGhlIGZ1bmN0aW9uIHRvIHJlbW92ZS5cbiAgICAgKiBAcmV0dXJuIEEgbGlzdCBjb25zaXN0aW5nIG9mIGFsbCBlbGVtZW50cyBvZiB0aGlzIGxpc3QgdGhhdCBkbyBub3QgaGF2ZSBsaXN0ZW5lci5cbiAgICAgKi9cbiAgICBTbG90TGlzdC5wcm90b3R5cGUuZmlsdGVyTm90ID0gZnVuY3Rpb24gKGxpc3RlbmVyKSB7XG4gICAgICAgIGlmICghdGhpcy5ub25FbXB0eSB8fCBsaXN0ZW5lciA9PSBudWxsKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIGlmIChsaXN0ZW5lciA9PSB0aGlzLmhlYWQubGlzdGVuZXIpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy50YWlsO1xuICAgICAgICAvLyBUaGUgZmlyc3QgaXRlbSB3YXNuJ3QgYSBtYXRjaCBzbyB0aGUgZmlsdGVyZWQgbGlzdCB3aWxsIGNvbnRhaW4gaXQuXG4gICAgICAgIHZhciB3aG9sZUNsb25lID0gbmV3IFNsb3RMaXN0KHRoaXMuaGVhZCk7XG4gICAgICAgIHZhciBzdWJDbG9uZSA9IHdob2xlQ2xvbmU7XG4gICAgICAgIHZhciBjdXJyZW50ID0gdGhpcy50YWlsO1xuICAgICAgICB3aGlsZSAoY3VycmVudC5ub25FbXB0eSkge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnQuaGVhZC5saXN0ZW5lciA9PSBsaXN0ZW5lcikge1xuICAgICAgICAgICAgICAgIC8vIFNwbGljZSBvdXQgdGhlIGN1cnJlbnQgaGVhZC5cbiAgICAgICAgICAgICAgICBzdWJDbG9uZS50YWlsID0gY3VycmVudC50YWlsO1xuICAgICAgICAgICAgICAgIHJldHVybiB3aG9sZUNsb25lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3ViQ2xvbmUgPSBzdWJDbG9uZS50YWlsID0gbmV3IFNsb3RMaXN0KGN1cnJlbnQuaGVhZCk7XG4gICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC50YWlsO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRoZSBsaXN0ZW5lciB3YXMgbm90IGZvdW5kIHNvIHRoaXMgbGlzdCBpcyB1bmNoYW5nZWQuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBzdXBwbGllZCBsaXN0ZW5lciBGdW5jdGlvbiBpcyBjb250YWluZWQgd2l0aGluIHRoaXMgbGlzdFxuICAgICAqL1xuICAgIFNsb3RMaXN0LnByb3RvdHlwZS5jb250YWlucyA9IGZ1bmN0aW9uIChsaXN0ZW5lcikge1xuICAgICAgICBpZiAoIXRoaXMubm9uRW1wdHkpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHZhciBwID0gdGhpcztcbiAgICAgICAgd2hpbGUgKHAubm9uRW1wdHkpIHtcbiAgICAgICAgICAgIGlmIChwLmhlYWQubGlzdGVuZXIgPT0gbGlzdGVuZXIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICBwID0gcC50YWlsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHJpZXZlcyB0aGUgSVNsb3QgYXNzb2NpYXRlZCB3aXRoIGEgc3VwcGxpZWQgbGlzdGVuZXIgd2l0aGluIHRoZSBTbG90TGlzdC5cbiAgICAgKiBAcGFyYW0gICBsaXN0ZW5lciBUaGUgRnVuY3Rpb24gYmVpbmcgc2VhcmNoZWQgZm9yXG4gICAgICogQHJldHVybiAgVGhlIElTbG90IGluIHRoaXMgbGlzdCBhc3NvY2lhdGVkIHdpdGggdGhlIGxpc3RlbmVyIHBhcmFtZXRlciB0aHJvdWdoIHRoZSBJU2xvdC5saXN0ZW5lciBwcm9wZXJ0eS5cbiAgICAgKiAgICAgICAgICBSZXR1cm5zIG51bGwgaWYgbm8gc3VjaCBJU2xvdCBpbnN0YW5jZSBleGlzdHMgb3IgdGhlIGxpc3QgaXMgZW1wdHkuXG4gICAgICovXG4gICAgU2xvdExpc3QucHJvdG90eXBlLmZpbmQgPSBmdW5jdGlvbiAobGlzdGVuZXIpIHtcbiAgICAgICAgaWYgKCF0aGlzLm5vbkVtcHR5KVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIHZhciBwID0gdGhpcztcbiAgICAgICAgd2hpbGUgKHAubm9uRW1wdHkpIHtcbiAgICAgICAgICAgIGlmIChwLmhlYWQubGlzdGVuZXIgPT0gbGlzdGVuZXIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHAuaGVhZDtcbiAgICAgICAgICAgIHAgPSBwLnRhaWw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgICBTbG90TGlzdC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBidWZmZXIgPSAnJztcbiAgICAgICAgdmFyIHAgPSB0aGlzO1xuICAgICAgICB3aGlsZSAocC5ub25FbXB0eSkge1xuICAgICAgICAgICAgYnVmZmVyICs9IHAuaGVhZCArIFwiIC0+IFwiO1xuICAgICAgICAgICAgcCA9IHAudGFpbDtcbiAgICAgICAgfVxuICAgICAgICBidWZmZXIgKz0gXCJOSUxcIjtcbiAgICAgICAgcmV0dXJuIFwiW0xpc3QgXCIgKyBidWZmZXIgKyBcIl1cIjtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYW4gZW1wdHkgbGlzdC4gVXNlZCBhcyB0aGUgbGlzdCB0ZXJtaW5hdG9yLlxuICAgICAqL1xuICAgIFNsb3RMaXN0Lk5JTCA9IG5ldyBTbG90TGlzdChudWxsLCBudWxsKTtcbiAgICByZXR1cm4gU2xvdExpc3Q7XG59KCkpO1xuZXhwb3J0cy5TbG90TGlzdCA9IFNsb3RMaXN0O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U2xvdExpc3QuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvc2lnbmFscy5qcy9saWIvb3JnL29zZmxhc2gvc2lnbmFscy9TbG90TGlzdC5qc1xuLy8gbW9kdWxlIGlkID0gN1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2V4dGVuZHMgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxuICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XG4gICAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdOyB9O1xuICAgIHJldHVybiBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgICBleHRlbmRTdGF0aWNzKGQsIGIpO1xuICAgICAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgICAgICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xuICAgIH07XG59KSgpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIHNpZ25hbHNfanNfMSA9IHJlcXVpcmUoXCJzaWduYWxzLmpzXCIpO1xudmFyIENsb2NrID0gcmVxdWlyZShcIkBnYW1lc3RkaW8vY2xvY2tcIik7XG52YXIgZGVsdGFfbGlzdGVuZXJfMSA9IHJlcXVpcmUoXCJkZWx0YS1saXN0ZW5lclwiKTtcbnZhciBtc2dwYWNrID0gcmVxdWlyZShcIm5vdGVwYWNrLmlvXCIpO1xudmFyIGZvc3NpbERlbHRhID0gcmVxdWlyZShcImZvc3NpbC1kZWx0YVwiKTtcbnZhciBQcm90b2NvbF8xID0gcmVxdWlyZShcIi4vUHJvdG9jb2xcIik7XG52YXIgUm9vbSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUm9vbSwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBSb29tKG5hbWUpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywge30pIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLmNsb2NrID0gbmV3IENsb2NrKCk7IC8vIGV4cGVyaW1lbnRhbFxuICAgICAgICBfdGhpcy5yZW1vdGVDbG9jayA9IG5ldyBDbG9jaygpOyAvLyBleHBlcmltZW50YWxcbiAgICAgICAgLy8gUHVibGljIHNpZ25hbHNcbiAgICAgICAgX3RoaXMub25Kb2luID0gbmV3IHNpZ25hbHNfanNfMS5TaWduYWwoKTtcbiAgICAgICAgX3RoaXMub25VcGRhdGUgPSBuZXcgc2lnbmFsc19qc18xLlNpZ25hbCgpO1xuICAgICAgICBfdGhpcy5vbkRhdGEgPSBuZXcgc2lnbmFsc19qc18xLlNpZ25hbCgpO1xuICAgICAgICBfdGhpcy5vbkVycm9yID0gbmV3IHNpZ25hbHNfanNfMS5TaWduYWwoKTtcbiAgICAgICAgX3RoaXMub25MZWF2ZSA9IG5ldyBzaWduYWxzX2pzXzEuU2lnbmFsKCk7XG4gICAgICAgIF90aGlzLmlkID0gbnVsbDtcbiAgICAgICAgX3RoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIF90aGlzLm9uTGVhdmUuYWRkKGZ1bmN0aW9uICgpIHsgcmV0dXJuIF90aGlzLnJlbW92ZUFsbExpc3RlbmVycygpOyB9KTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBSb29tLnByb3RvdHlwZS5jb25uZWN0ID0gZnVuY3Rpb24gKGNvbm5lY3Rpb24pIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdGhpcy5jb25uZWN0aW9uID0gY29ubmVjdGlvbjtcbiAgICAgICAgdGhpcy5jb25uZWN0aW9uLm9ubWVzc2FnZSA9IHRoaXMub25NZXNzYWdlQ2FsbGJhY2suYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5jb25uZWN0aW9uLm9uY2xvc2UgPSBmdW5jdGlvbiAoZSkgeyByZXR1cm4gX3RoaXMub25MZWF2ZS5kaXNwYXRjaChlKTsgfTtcbiAgICB9O1xuICAgIFJvb20ucHJvdG90eXBlLm9uTWVzc2FnZUNhbGxiYWNrID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIHZhciBtZXNzYWdlID0gbXNncGFjay5kZWNvZGUobmV3IFVpbnQ4QXJyYXkoZXZlbnQuZGF0YSkpO1xuICAgICAgICB2YXIgY29kZSA9IG1lc3NhZ2VbMF07XG4gICAgICAgIGlmIChjb2RlID09IFByb3RvY29sXzEuUHJvdG9jb2wuSk9JTl9ST09NKSB7XG4gICAgICAgICAgICB0aGlzLnNlc3Npb25JZCA9IG1lc3NhZ2VbMV07XG4gICAgICAgICAgICB0aGlzLm9uSm9pbi5kaXNwYXRjaCgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNvZGUgPT0gUHJvdG9jb2xfMS5Qcm90b2NvbC5KT0lOX0VSUk9SKSB7XG4gICAgICAgICAgICB0aGlzLm9uRXJyb3IuZGlzcGF0Y2gobWVzc2FnZVsyXSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY29kZSA9PSBQcm90b2NvbF8xLlByb3RvY29sLlJPT01fU1RBVEUpIHtcbiAgICAgICAgICAgIHZhciBzdGF0ZSA9IG1lc3NhZ2VbMl07XG4gICAgICAgICAgICB2YXIgcmVtb3RlQ3VycmVudFRpbWUgPSBtZXNzYWdlWzNdO1xuICAgICAgICAgICAgdmFyIHJlbW90ZUVsYXBzZWRUaW1lID0gbWVzc2FnZVs0XTtcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoc3RhdGUsIHJlbW90ZUN1cnJlbnRUaW1lLCByZW1vdGVFbGFwc2VkVGltZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY29kZSA9PSBQcm90b2NvbF8xLlByb3RvY29sLlJPT01fU1RBVEVfUEFUQ0gpIHtcbiAgICAgICAgICAgIHRoaXMucGF0Y2gobWVzc2FnZVsyXSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY29kZSA9PSBQcm90b2NvbF8xLlByb3RvY29sLlJPT01fREFUQSkge1xuICAgICAgICAgICAgdGhpcy5vbkRhdGEuZGlzcGF0Y2gobWVzc2FnZVsyXSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY29kZSA9PSBQcm90b2NvbF8xLlByb3RvY29sLkxFQVZFX1JPT00pIHtcbiAgICAgICAgICAgIHRoaXMubGVhdmUoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgUm9vbS5wcm90b3R5cGUuc2V0U3RhdGUgPSBmdW5jdGlvbiAoc3RhdGUsIHJlbW90ZUN1cnJlbnRUaW1lLCByZW1vdGVFbGFwc2VkVGltZSkge1xuICAgICAgICB0aGlzLnNldChzdGF0ZSk7XG4gICAgICAgIHRoaXMuX3ByZXZpb3VzU3RhdGUgPSBuZXcgVWludDhBcnJheShtc2dwYWNrLmVuY29kZShzdGF0ZSkpO1xuICAgICAgICAvLyBzZXQgcmVtb3RlIGNsb2NrIHByb3BlcnRpZXNcbiAgICAgICAgaWYgKHJlbW90ZUN1cnJlbnRUaW1lICYmIHJlbW90ZUVsYXBzZWRUaW1lKSB7XG4gICAgICAgICAgICB0aGlzLnJlbW90ZUNsb2NrLmN1cnJlbnRUaW1lID0gcmVtb3RlQ3VycmVudFRpbWU7XG4gICAgICAgICAgICB0aGlzLnJlbW90ZUNsb2NrLmVsYXBzZWRUaW1lID0gcmVtb3RlRWxhcHNlZFRpbWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jbG9jay5zdGFydCgpO1xuICAgICAgICB0aGlzLm9uVXBkYXRlLmRpc3BhdGNoKHN0YXRlKTtcbiAgICB9O1xuICAgIFJvb20ucHJvdG90eXBlLnBhdGNoID0gZnVuY3Rpb24gKGJpbmFyeVBhdGNoKSB7XG4gICAgICAgIC8vXG4gICAgICAgIC8vIGNhbGN1bGF0ZSBjbGllbnQtc2lkZSBwaW5nXG4gICAgICAgIC8vXG4gICAgICAgIHZhciBwYXRjaFRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICBpZiAodGhpcy5sYXN0UGF0Y2hUaW1lKSB7XG4gICAgICAgICAgICB0aGlzLnBpbmcgPSBwYXRjaFRpbWUgLSB0aGlzLmxhc3RQYXRjaFRpbWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5sYXN0UGF0Y2hUaW1lID0gcGF0Y2hUaW1lO1xuICAgICAgICB0aGlzLmNsb2NrLnRpY2soKTtcbiAgICAgICAgLy8gYXBwbHkgcGF0Y2hcbiAgICAgICAgdGhpcy5fcHJldmlvdXNTdGF0ZSA9IG5ldyBVaW50OEFycmF5KGZvc3NpbERlbHRhLmFwcGx5KHRoaXMuX3ByZXZpb3VzU3RhdGUsIGJpbmFyeVBhdGNoLCB7IHZlcmlmeUNoZWNrc3VtOiBmYWxzZSB9KSk7XG4gICAgICAgIC8vIHRyaWdnZXIgc3RhdGUgY2FsbGJhY2tzXG4gICAgICAgIHRoaXMuc2V0KG1zZ3BhY2suZGVjb2RlKHRoaXMuX3ByZXZpb3VzU3RhdGUpKTtcbiAgICAgICAgdGhpcy5vblVwZGF0ZS5kaXNwYXRjaCh0aGlzLmRhdGEpO1xuICAgIH07XG4gICAgUm9vbS5wcm90b3R5cGUubGVhdmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmlkKSB7XG4gICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24uY2xvc2UoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgUm9vbS5wcm90b3R5cGUuc2VuZCA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIHRoaXMuY29ubmVjdGlvbi5zZW5kKFtQcm90b2NvbF8xLlByb3RvY29sLlJPT01fREFUQSwgdGhpcy5pZCwgZGF0YV0pO1xuICAgIH07XG4gICAgUm9vbS5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBfc3VwZXIucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycy5jYWxsKHRoaXMpO1xuICAgICAgICB0aGlzLm9uSm9pbi5yZW1vdmVBbGwoKTtcbiAgICAgICAgdGhpcy5vblVwZGF0ZS5yZW1vdmVBbGwoKTtcbiAgICAgICAgdGhpcy5vbkRhdGEucmVtb3ZlQWxsKCk7XG4gICAgICAgIHRoaXMub25FcnJvci5yZW1vdmVBbGwoKTtcbiAgICAgICAgdGhpcy5vbkxlYXZlLnJlbW92ZUFsbCgpO1xuICAgIH07XG4gICAgcmV0dXJuIFJvb207XG59KGRlbHRhX2xpc3RlbmVyXzEuRGVsdGFDb250YWluZXIpKTtcbmV4cG9ydHMuUm9vbSA9IFJvb207XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL3NyYy9Sb29tLnRzXG4vLyBtb2R1bGUgaWQgPSA4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIENsaWVudF8xID0gcmVxdWlyZShcIi4vQ2xpZW50XCIpO1xuZXhwb3J0cy5DbGllbnQgPSBDbGllbnRfMS5DbGllbnQ7XG52YXIgUHJvdG9jb2xfMSA9IHJlcXVpcmUoXCIuL1Byb3RvY29sXCIpO1xuZXhwb3J0cy5Qcm90b2NvbCA9IFByb3RvY29sXzEuUHJvdG9jb2w7XG52YXIgUm9vbV8xID0gcmVxdWlyZShcIi4vUm9vbVwiKTtcbmV4cG9ydHMuUm9vbSA9IFJvb21fMS5Sb29tO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9zcmMvaW5kZXgudHNcbi8vIG1vZHVsZSBpZCA9IDlcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgbXNncGFjayA9IHJlcXVpcmUoXCJub3RlcGFjay5pb1wiKTtcbnZhciBzaWduYWxzX2pzXzEgPSByZXF1aXJlKFwic2lnbmFscy5qc1wiKTtcbnZhciBQcm90b2NvbF8xID0gcmVxdWlyZShcIi4vUHJvdG9jb2xcIik7XG52YXIgUm9vbV8xID0gcmVxdWlyZShcIi4vUm9vbVwiKTtcbnZhciBDb25uZWN0aW9uXzEgPSByZXF1aXJlKFwiLi9Db25uZWN0aW9uXCIpO1xudmFyIENsaWVudCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBDbGllbnQodXJsKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIC8vIHNpZ25hbHNcbiAgICAgICAgdGhpcy5vbk9wZW4gPSBuZXcgc2lnbmFsc19qc18xLlNpZ25hbCgpO1xuICAgICAgICB0aGlzLm9uTWVzc2FnZSA9IG5ldyBzaWduYWxzX2pzXzEuU2lnbmFsKCk7XG4gICAgICAgIHRoaXMub25DbG9zZSA9IG5ldyBzaWduYWxzX2pzXzEuU2lnbmFsKCk7XG4gICAgICAgIHRoaXMub25FcnJvciA9IG5ldyBzaWduYWxzX2pzXzEuU2lnbmFsKCk7XG4gICAgICAgIHRoaXMucm9vbXMgPSB7fTtcbiAgICAgICAgdGhpcy5jb25uZWN0aW5nUm9vbXMgPSB7fTtcbiAgICAgICAgdGhpcy5qb2luUmVxdWVzdElkID0gMDtcbiAgICAgICAgdGhpcy5zdG9yYWdlID0gd2luZG93LmxvY2FsU3RvcmFnZTtcbiAgICAgICAgdGhpcy5ob3N0bmFtZSA9IHVybDtcbiAgICAgICAgdmFyIGNvbHlzZXVzaWQgPSB0aGlzLnN0b3JhZ2UuZ2V0SXRlbSgnY29seXNldXNpZCcpO1xuICAgICAgICBpZiAoIShjb2x5c2V1c2lkIGluc3RhbmNlb2YgUHJvbWlzZSkpIHtcbiAgICAgICAgICAgIC8vIGJyb3dzZXIgaGFzIHN5bmNocm9ub3VzIHJldHVyblxuICAgICAgICAgICAgdGhpcy5jcmVhdGVDb25uZWN0aW9uKGNvbHlzZXVzaWQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gcmVhY3QtbmF0aXZlIGlzIGFzeW5jaHJvbm91c1xuICAgICAgICAgICAgY29seXNldXNpZC50aGVuKGZ1bmN0aW9uIChpZCkgeyByZXR1cm4gX3RoaXMuY3JlYXRlQ29ubmVjdGlvbihpZCk7IH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIENsaWVudC5wcm90b3R5cGUuY3JlYXRlQ29ubmVjdGlvbiA9IGZ1bmN0aW9uIChjb2x5c2V1c2lkKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHRoaXMuaWQgPSBjb2x5c2V1c2lkIHx8IFwiXCI7XG4gICAgICAgIHRoaXMuY29ubmVjdGlvbiA9IG5ldyBDb25uZWN0aW9uXzEuQ29ubmVjdGlvbih0aGlzLmhvc3RuYW1lICsgXCIvP2NvbHlzZXVzaWQ9XCIgKyB0aGlzLmlkKTtcbiAgICAgICAgdGhpcy5jb25uZWN0aW9uLm9ubWVzc2FnZSA9IHRoaXMub25NZXNzYWdlQ2FsbGJhY2suYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5jb25uZWN0aW9uLm9uY2xvc2UgPSBmdW5jdGlvbiAoZSkgeyByZXR1cm4gX3RoaXMub25DbG9zZS5kaXNwYXRjaCgpOyB9O1xuICAgICAgICB0aGlzLmNvbm5lY3Rpb24ub25lcnJvciA9IGZ1bmN0aW9uIChlKSB7IHJldHVybiBfdGhpcy5vbkVycm9yLmRpc3BhdGNoKCk7IH07XG4gICAgICAgIC8vIGNoZWNrIGZvciBpZCBvbiBjb29raWVcbiAgICAgICAgdGhpcy5jb25uZWN0aW9uLm9ub3BlbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmIChfdGhpcy5pZCkge1xuICAgICAgICAgICAgICAgIF90aGlzLm9uT3Blbi5kaXNwYXRjaCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH07XG4gICAgQ2xpZW50LnByb3RvdHlwZS5qb2luID0gZnVuY3Rpb24gKHJvb21OYW1lLCBvcHRpb25zKSB7XG4gICAgICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgICAgIG9wdGlvbnMucmVxdWVzdElkID0gKyt0aGlzLmpvaW5SZXF1ZXN0SWQ7XG4gICAgICAgIHRoaXMuY29ubmVjdGluZ1Jvb21zW29wdGlvbnMucmVxdWVzdElkXSA9IG5ldyBSb29tXzEuUm9vbShyb29tTmFtZSk7XG4gICAgICAgIHRoaXMuY29ubmVjdGlvbi5zZW5kKFtQcm90b2NvbF8xLlByb3RvY29sLkpPSU5fUk9PTSwgcm9vbU5hbWUsIG9wdGlvbnNdKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdGluZ1Jvb21zW29wdGlvbnMucmVxdWVzdElkXTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBvdmVycmlkZVxuICAgICAqL1xuICAgIENsaWVudC5wcm90b3R5cGUub25NZXNzYWdlQ2FsbGJhY2sgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIG1lc3NhZ2UgPSBtc2dwYWNrLmRlY29kZShuZXcgVWludDhBcnJheShldmVudC5kYXRhKSk7XG4gICAgICAgIHZhciBjb2RlID0gbWVzc2FnZVswXTtcbiAgICAgICAgaWYgKGNvZGUgPT0gUHJvdG9jb2xfMS5Qcm90b2NvbC5VU0VSX0lEKSB7XG4gICAgICAgICAgICB0aGlzLnN0b3JhZ2Uuc2V0SXRlbSgnY29seXNldXNpZCcsIG1lc3NhZ2VbMV0pO1xuICAgICAgICAgICAgdGhpcy5pZCA9IG1lc3NhZ2VbMV07XG4gICAgICAgICAgICB0aGlzLm9uT3Blbi5kaXNwYXRjaCgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNvZGUgPT0gUHJvdG9jb2xfMS5Qcm90b2NvbC5KT0lOX1JPT00pIHtcbiAgICAgICAgICAgIHZhciByZXF1ZXN0SWQgPSBtZXNzYWdlWzJdO1xuICAgICAgICAgICAgdmFyIHJvb21fMSA9IHRoaXMuY29ubmVjdGluZ1Jvb21zW3JlcXVlc3RJZF07XG4gICAgICAgICAgICB0aGlzLnJvb21zW3Jvb21fMS5pZF0gPSByb29tXzE7XG4gICAgICAgICAgICByb29tXzEuaWQgPSBtZXNzYWdlWzFdO1xuICAgICAgICAgICAgcm9vbV8xLmNvbm5lY3QobmV3IENvbm5lY3Rpb25fMS5Db25uZWN0aW9uKHRoaXMuaG9zdG5hbWUgKyBcIi9cIiArIHJvb21fMS5pZCArIFwiP2NvbHlzZXVzaWQ9XCIgKyB0aGlzLmlkKSk7XG4gICAgICAgICAgICByb29tXzEub25MZWF2ZS5hZGQoZnVuY3Rpb24gKCkgeyByZXR1cm4gZGVsZXRlIF90aGlzLnJvb21zW3Jvb21fMS5pZF07IH0pO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuY29ubmVjdGluZ1Jvb21zW3JlcXVlc3RJZF07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY29kZSA9PSBQcm90b2NvbF8xLlByb3RvY29sLkpPSU5fRVJST1IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJzZXJ2ZXIgZXJyb3I6XCIsIG1lc3NhZ2VbMl0pO1xuICAgICAgICAgICAgLy8gZ2VuZXJhbCBlcnJvclxuICAgICAgICAgICAgdGhpcy5vbkVycm9yLmRpc3BhdGNoKG1lc3NhZ2VbMl0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5vbk1lc3NhZ2UuZGlzcGF0Y2gobWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBDbGllbnQ7XG59KCkpO1xuZXhwb3J0cy5DbGllbnQgPSBDbGllbnQ7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL3NyYy9DbGllbnQudHNcbi8vIG1vZHVsZSBpZCA9IDEwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcblxuZnVuY3Rpb24gdXRmOFdyaXRlKHZpZXcsIG9mZnNldCwgc3RyKSB7XG4gIHZhciBjID0gMDtcbiAgZm9yICh2YXIgaSA9IDAsIGwgPSBzdHIubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgYyA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgIGlmIChjIDwgMHg4MCkge1xuICAgICAgdmlldy5zZXRVaW50OChvZmZzZXQrKywgYyk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGMgPCAweDgwMCkge1xuICAgICAgdmlldy5zZXRVaW50OChvZmZzZXQrKywgMHhjMCB8IChjID4+IDYpKTtcbiAgICAgIHZpZXcuc2V0VWludDgob2Zmc2V0KyssIDB4ODAgfCAoYyAmIDB4M2YpKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoYyA8IDB4ZDgwMCB8fCBjID49IDB4ZTAwMCkge1xuICAgICAgdmlldy5zZXRVaW50OChvZmZzZXQrKywgMHhlMCB8IChjID4+IDEyKSk7XG4gICAgICB2aWV3LnNldFVpbnQ4KG9mZnNldCsrLCAweDgwIHwgKGMgPj4gNikgJiAweDNmKTtcbiAgICAgIHZpZXcuc2V0VWludDgob2Zmc2V0KyssIDB4ODAgfCAoYyAmIDB4M2YpKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBpKys7XG4gICAgICBjID0gMHgxMDAwMCArICgoKGMgJiAweDNmZikgPDwgMTApIHwgKHN0ci5jaGFyQ29kZUF0KGkpICYgMHgzZmYpKTtcbiAgICAgIHZpZXcuc2V0VWludDgob2Zmc2V0KyssIDB4ZjAgfCAoYyA+PiAxOCkpO1xuICAgICAgdmlldy5zZXRVaW50OChvZmZzZXQrKywgMHg4MCB8IChjID4+IDEyKSAmIDB4M2YpO1xuICAgICAgdmlldy5zZXRVaW50OChvZmZzZXQrKywgMHg4MCB8IChjID4+IDYpICYgMHgzZik7XG4gICAgICB2aWV3LnNldFVpbnQ4KG9mZnNldCsrLCAweDgwIHwgKGMgJiAweDNmKSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHV0ZjhMZW5ndGgoc3RyKSB7XG4gIHZhciBjID0gMCwgbGVuZ3RoID0gMDtcbiAgZm9yICh2YXIgaSA9IDAsIGwgPSBzdHIubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgYyA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgIGlmIChjIDwgMHg4MCkge1xuICAgICAgbGVuZ3RoICs9IDE7XG4gICAgfVxuICAgIGVsc2UgaWYgKGMgPCAweDgwMCkge1xuICAgICAgbGVuZ3RoICs9IDI7XG4gICAgfVxuICAgIGVsc2UgaWYgKGMgPCAweGQ4MDAgfHwgYyA+PSAweGUwMDApIHtcbiAgICAgIGxlbmd0aCArPSAzO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGkrKztcbiAgICAgIGxlbmd0aCArPSA0O1xuICAgIH1cbiAgfVxuICByZXR1cm4gbGVuZ3RoO1xufVxuXG5mdW5jdGlvbiBfZW5jb2RlKGJ5dGVzLCBkZWZlcnMsIHZhbHVlKSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlLCBpID0gMCwgbCA9IDAsIGhpID0gMCwgbG8gPSAwLCBsZW5ndGggPSAwLCBzaXplID0gMDtcblxuICBpZiAodHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICBsZW5ndGggPSB1dGY4TGVuZ3RoKHZhbHVlKTtcblxuICAgIC8vIGZpeHN0clxuICAgIGlmIChsZW5ndGggPCAweDIwKSB7XG4gICAgICBieXRlcy5wdXNoKGxlbmd0aCB8IDB4YTApO1xuICAgICAgc2l6ZSA9IDE7XG4gICAgfVxuICAgIC8vIHN0ciA4XG4gICAgZWxzZSBpZiAobGVuZ3RoIDwgMHgxMDApIHtcbiAgICAgIGJ5dGVzLnB1c2goMHhkOSwgbGVuZ3RoKTtcbiAgICAgIHNpemUgPSAyO1xuICAgIH1cbiAgICAvLyBzdHIgMTZcbiAgICBlbHNlIGlmIChsZW5ndGggPCAweDEwMDAwKSB7XG4gICAgICBieXRlcy5wdXNoKDB4ZGEsIGxlbmd0aCA+PiA4LCBsZW5ndGgpO1xuICAgICAgc2l6ZSA9IDM7XG4gICAgfVxuICAgIC8vIHN0ciAzMlxuICAgIGVsc2UgaWYgKGxlbmd0aCA8IDB4MTAwMDAwMDAwKSB7XG4gICAgICBieXRlcy5wdXNoKDB4ZGIsIGxlbmd0aCA+PiAyNCwgbGVuZ3RoID4+IDE2LCBsZW5ndGggPj4gOCwgbGVuZ3RoKTtcbiAgICAgIHNpemUgPSA1O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1N0cmluZyB0b28gbG9uZycpO1xuICAgIH1cbiAgICBkZWZlcnMucHVzaCh7IHN0cjogdmFsdWUsIGxlbmd0aDogbGVuZ3RoLCBvZmZzZXQ6IGJ5dGVzLmxlbmd0aCB9KTtcbiAgICByZXR1cm4gc2l6ZSArIGxlbmd0aDtcbiAgfVxuICBpZiAodHlwZSA9PT0gJ251bWJlcicpIHtcbiAgICAvLyBUT0RPOiBlbmNvZGUgdG8gZmxvYXQgMzI/XG5cbiAgICAvLyBmbG9hdCA2NFxuICAgIGlmIChNYXRoLmZsb29yKHZhbHVlKSAhPT0gdmFsdWUgfHwgIWlzRmluaXRlKHZhbHVlKSkge1xuICAgICAgYnl0ZXMucHVzaCgweGNiKTtcbiAgICAgIGRlZmVycy5wdXNoKHsgZmxvYXQ6IHZhbHVlLCBsZW5ndGg6IDgsIG9mZnNldDogYnl0ZXMubGVuZ3RoIH0pO1xuICAgICAgcmV0dXJuIDk7XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlID49IDApIHtcbiAgICAgIC8vIHBvc2l0aXZlIGZpeG51bVxuICAgICAgaWYgKHZhbHVlIDwgMHg4MCkge1xuICAgICAgICBieXRlcy5wdXNoKHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICB9XG4gICAgICAvLyB1aW50IDhcbiAgICAgIGlmICh2YWx1ZSA8IDB4MTAwKSB7XG4gICAgICAgIGJ5dGVzLnB1c2goMHhjYywgdmFsdWUpO1xuICAgICAgICByZXR1cm4gMjtcbiAgICAgIH1cbiAgICAgIC8vIHVpbnQgMTZcbiAgICAgIGlmICh2YWx1ZSA8IDB4MTAwMDApIHtcbiAgICAgICAgYnl0ZXMucHVzaCgweGNkLCB2YWx1ZSA+PiA4LCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiAzO1xuICAgICAgfVxuICAgICAgLy8gdWludCAzMlxuICAgICAgaWYgKHZhbHVlIDwgMHgxMDAwMDAwMDApIHtcbiAgICAgICAgYnl0ZXMucHVzaCgweGNlLCB2YWx1ZSA+PiAyNCwgdmFsdWUgPj4gMTYsIHZhbHVlID4+IDgsIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIDU7XG4gICAgICB9XG4gICAgICAvLyB1aW50IDY0XG4gICAgICBoaSA9ICh2YWx1ZSAvIE1hdGgucG93KDIsIDMyKSkgPj4gMDtcbiAgICAgIGxvID0gdmFsdWUgPj4+IDA7XG4gICAgICBieXRlcy5wdXNoKDB4Y2YsIGhpID4+IDI0LCBoaSA+PiAxNiwgaGkgPj4gOCwgaGksIGxvID4+IDI0LCBsbyA+PiAxNiwgbG8gPj4gOCwgbG8pO1xuICAgICAgcmV0dXJuIDk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIG5lZ2F0aXZlIGZpeG51bVxuICAgICAgaWYgKHZhbHVlID49IC0weDIwKSB7XG4gICAgICAgIGJ5dGVzLnB1c2godmFsdWUpO1xuICAgICAgICByZXR1cm4gMTtcbiAgICAgIH1cbiAgICAgIC8vIGludCA4XG4gICAgICBpZiAodmFsdWUgPj0gLTB4ODApIHtcbiAgICAgICAgYnl0ZXMucHVzaCgweGQwLCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiAyO1xuICAgICAgfVxuICAgICAgLy8gaW50IDE2XG4gICAgICBpZiAodmFsdWUgPj0gLTB4ODAwMCkge1xuICAgICAgICBieXRlcy5wdXNoKDB4ZDEsIHZhbHVlID4+IDgsIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIDM7XG4gICAgICB9XG4gICAgICAvLyBpbnQgMzJcbiAgICAgIGlmICh2YWx1ZSA+PSAtMHg4MDAwMDAwMCkge1xuICAgICAgICBieXRlcy5wdXNoKDB4ZDIsIHZhbHVlID4+IDI0LCB2YWx1ZSA+PiAxNiwgdmFsdWUgPj4gOCwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gNTtcbiAgICAgIH1cbiAgICAgIC8vIGludCA2NFxuICAgICAgaGkgPSBNYXRoLmZsb29yKHZhbHVlIC8gTWF0aC5wb3coMiwgMzIpKTtcbiAgICAgIGxvID0gdmFsdWUgPj4+IDA7XG4gICAgICBieXRlcy5wdXNoKDB4ZDMsIGhpID4+IDI0LCBoaSA+PiAxNiwgaGkgPj4gOCwgaGksIGxvID4+IDI0LCBsbyA+PiAxNiwgbG8gPj4gOCwgbG8pO1xuICAgICAgcmV0dXJuIDk7XG4gICAgfVxuICB9XG4gIGlmICh0eXBlID09PSAnb2JqZWN0Jykge1xuICAgIC8vIG5pbFxuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgYnl0ZXMucHVzaCgweGMwKTtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgbGVuZ3RoID0gdmFsdWUubGVuZ3RoO1xuXG4gICAgICAvLyBmaXhhcnJheVxuICAgICAgaWYgKGxlbmd0aCA8IDB4MTApIHtcbiAgICAgICAgYnl0ZXMucHVzaChsZW5ndGggfCAweDkwKTtcbiAgICAgICAgc2l6ZSA9IDE7XG4gICAgICB9XG4gICAgICAvLyBhcnJheSAxNlxuICAgICAgZWxzZSBpZiAobGVuZ3RoIDwgMHgxMDAwMCkge1xuICAgICAgICBieXRlcy5wdXNoKDB4ZGMsIGxlbmd0aCA+PiA4LCBsZW5ndGgpO1xuICAgICAgICBzaXplID0gMztcbiAgICAgIH1cbiAgICAgIC8vIGFycmF5IDMyXG4gICAgICBlbHNlIGlmIChsZW5ndGggPCAweDEwMDAwMDAwMCkge1xuICAgICAgICBieXRlcy5wdXNoKDB4ZGQsIGxlbmd0aCA+PiAyNCwgbGVuZ3RoID4+IDE2LCBsZW5ndGggPj4gOCwgbGVuZ3RoKTtcbiAgICAgICAgc2l6ZSA9IDU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FycmF5IHRvbyBsYXJnZScpO1xuICAgICAgfVxuICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHNpemUgKz0gX2VuY29kZShieXRlcywgZGVmZXJzLCB2YWx1ZVtpXSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc2l6ZTtcbiAgICB9XG5cbiAgICAvLyBmaXhleHQgOCAvIERhdGVcbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICB2YXIgdGltZSA9IHZhbHVlLmdldFRpbWUoKTtcbiAgICAgIGhpID0gTWF0aC5mbG9vcih0aW1lIC8gTWF0aC5wb3coMiwgMzIpKTtcbiAgICAgIGxvID0gdGltZSA+Pj4gMDtcbiAgICAgIGJ5dGVzLnB1c2goMHhkNywgMCwgaGkgPj4gMjQsIGhpID4+IDE2LCBoaSA+PiA4LCBoaSwgbG8gPj4gMjQsIGxvID4+IDE2LCBsbyA+PiA4LCBsbyk7XG4gICAgICByZXR1cm4gMTA7XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICAgIGxlbmd0aCA9IHZhbHVlLmJ5dGVMZW5ndGg7XG5cbiAgICAgIC8vIGJpbiA4XG4gICAgICBpZiAobGVuZ3RoIDwgMHgxMDApIHtcbiAgICAgICAgYnl0ZXMucHVzaCgweGM0LCBsZW5ndGgpO1xuICAgICAgICBzaXplID0gMjtcbiAgICAgIH0gZWxzZVxuICAgICAgLy8gYmluIDE2XG4gICAgICBpZiAobGVuZ3RoIDwgMHgxMDAwMCkge1xuICAgICAgICBieXRlcy5wdXNoKDB4YzUsIGxlbmd0aCA+PiA4LCBsZW5ndGgpO1xuICAgICAgICBzaXplID0gMztcbiAgICAgIH0gZWxzZVxuICAgICAgLy8gYmluIDMyXG4gICAgICBpZiAobGVuZ3RoIDwgMHgxMDAwMDAwMDApIHtcbiAgICAgICAgYnl0ZXMucHVzaCgweGM2LCBsZW5ndGggPj4gMjQsIGxlbmd0aCA+PiAxNiwgbGVuZ3RoID4+IDgsIGxlbmd0aCk7XG4gICAgICAgIHNpemUgPSA1O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdCdWZmZXIgdG9vIGxhcmdlJyk7XG4gICAgICB9XG4gICAgICBkZWZlcnMucHVzaCh7IGJpbjogdmFsdWUsIGxlbmd0aDogbGVuZ3RoLCBvZmZzZXQ6IGJ5dGVzLmxlbmd0aCB9KTtcbiAgICAgIHJldHVybiBzaXplICsgbGVuZ3RoO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmFsdWUudG9KU09OID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gX2VuY29kZShieXRlcywgZGVmZXJzLCB2YWx1ZS50b0pTT04oKSk7XG4gICAgfVxuXG4gICAgdmFyIGtleXMgPSBbXSwga2V5ID0gJyc7XG5cbiAgICB2YXIgYWxsS2V5cyA9IE9iamVjdC5rZXlzKHZhbHVlKTtcbiAgICBmb3IgKGkgPSAwLCBsID0gYWxsS2V5cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIGtleSA9IGFsbEtleXNbaV07XG4gICAgICBpZiAodHlwZW9mIHZhbHVlW2tleV0gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgICB9XG4gICAgfVxuICAgIGxlbmd0aCA9IGtleXMubGVuZ3RoO1xuXG4gICAgLy8gZml4bWFwXG4gICAgaWYgKGxlbmd0aCA8IDB4MTApIHtcbiAgICAgIGJ5dGVzLnB1c2gobGVuZ3RoIHwgMHg4MCk7XG4gICAgICBzaXplID0gMTtcbiAgICB9XG4gICAgLy8gbWFwIDE2XG4gICAgZWxzZSBpZiAobGVuZ3RoIDwgMHgxMDAwMCkge1xuICAgICAgYnl0ZXMucHVzaCgweGRlLCBsZW5ndGggPj4gOCwgbGVuZ3RoKTtcbiAgICAgIHNpemUgPSAzO1xuICAgIH1cbiAgICAvLyBtYXAgMzJcbiAgICBlbHNlIGlmIChsZW5ndGggPCAweDEwMDAwMDAwMCkge1xuICAgICAgYnl0ZXMucHVzaCgweGRmLCBsZW5ndGggPj4gMjQsIGxlbmd0aCA+PiAxNiwgbGVuZ3RoID4+IDgsIGxlbmd0aCk7XG4gICAgICBzaXplID0gNTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdPYmplY3QgdG9vIGxhcmdlJyk7XG4gICAgfVxuXG4gICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICBrZXkgPSBrZXlzW2ldO1xuICAgICAgc2l6ZSArPSBfZW5jb2RlKGJ5dGVzLCBkZWZlcnMsIGtleSk7XG4gICAgICBzaXplICs9IF9lbmNvZGUoYnl0ZXMsIGRlZmVycywgdmFsdWVba2V5XSk7XG4gICAgfVxuICAgIHJldHVybiBzaXplO1xuICB9XG4gIC8vIGZhbHNlL3RydWVcbiAgaWYgKHR5cGUgPT09ICdib29sZWFuJykge1xuICAgIGJ5dGVzLnB1c2godmFsdWUgPyAweGMzIDogMHhjMik7XG4gICAgcmV0dXJuIDE7XG4gIH1cbiAgLy8gZml4ZXh0IDEgLyB1bmRlZmluZWRcbiAgaWYgKHR5cGUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgYnl0ZXMucHVzaCgweGQ0LCAwLCAwKTtcbiAgICByZXR1cm4gMztcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBlbmNvZGUnKTtcbn1cblxuZnVuY3Rpb24gZW5jb2RlKHZhbHVlKSB7XG4gIHZhciBieXRlcyA9IFtdO1xuICB2YXIgZGVmZXJzID0gW107XG4gIHZhciBzaXplID0gX2VuY29kZShieXRlcywgZGVmZXJzLCB2YWx1ZSk7XG4gIHZhciBidWYgPSBuZXcgQXJyYXlCdWZmZXIoc2l6ZSk7XG4gIHZhciB2aWV3ID0gbmV3IERhdGFWaWV3KGJ1Zik7XG5cbiAgdmFyIGRlZmVySW5kZXggPSAwO1xuICB2YXIgZGVmZXJXcml0dGVuID0gMDtcbiAgdmFyIG5leHRPZmZzZXQgPSAtMTtcbiAgaWYgKGRlZmVycy5sZW5ndGggPiAwKSB7XG4gICAgbmV4dE9mZnNldCA9IGRlZmVyc1swXS5vZmZzZXQ7XG4gIH1cblxuICB2YXIgZGVmZXIsIGRlZmVyTGVuZ3RoID0gMCwgb2Zmc2V0ID0gMDtcbiAgZm9yICh2YXIgaSA9IDAsIGwgPSBieXRlcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICB2aWV3LnNldFVpbnQ4KGRlZmVyV3JpdHRlbiArIGksIGJ5dGVzW2ldKTtcbiAgICBpZiAoaSArIDEgIT09IG5leHRPZmZzZXQpIHsgY29udGludWU7IH1cbiAgICBkZWZlciA9IGRlZmVyc1tkZWZlckluZGV4XTtcbiAgICBkZWZlckxlbmd0aCA9IGRlZmVyLmxlbmd0aDtcbiAgICBvZmZzZXQgPSBkZWZlcldyaXR0ZW4gKyBuZXh0T2Zmc2V0O1xuICAgIGlmIChkZWZlci5iaW4pIHtcbiAgICAgIHZhciBiaW4gPSBuZXcgVWludDhBcnJheShkZWZlci5iaW4pO1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBkZWZlckxlbmd0aDsgaisrKSB7XG4gICAgICAgIHZpZXcuc2V0VWludDgob2Zmc2V0ICsgaiwgYmluW2pdKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGRlZmVyLnN0cikge1xuICAgICAgdXRmOFdyaXRlKHZpZXcsIG9mZnNldCwgZGVmZXIuc3RyKTtcbiAgICB9IGVsc2UgaWYgKGRlZmVyLmZsb2F0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHZpZXcuc2V0RmxvYXQ2NChvZmZzZXQsIGRlZmVyLmZsb2F0KTtcbiAgICB9XG4gICAgZGVmZXJJbmRleCsrO1xuICAgIGRlZmVyV3JpdHRlbiArPSBkZWZlckxlbmd0aDtcbiAgICBpZiAoZGVmZXJzW2RlZmVySW5kZXhdKSB7XG4gICAgICBuZXh0T2Zmc2V0ID0gZGVmZXJzW2RlZmVySW5kZXhdLm9mZnNldDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGJ1Zjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBlbmNvZGU7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9ub3RlcGFjay5pby9icm93c2VyL2VuY29kZS5qc1xuLy8gbW9kdWxlIGlkID0gMTFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xuXG5mdW5jdGlvbiBEZWNvZGVyKGJ1ZmZlcikge1xuICB0aGlzLm9mZnNldCA9IDA7XG4gIGlmIChidWZmZXIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgIHRoaXMuYnVmZmVyID0gYnVmZmVyO1xuICAgIHRoaXMudmlldyA9IG5ldyBEYXRhVmlldyh0aGlzLmJ1ZmZlcik7XG4gIH0gZWxzZSBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KGJ1ZmZlcikpIHtcbiAgICB0aGlzLmJ1ZmZlciA9IGJ1ZmZlci5idWZmZXI7XG4gICAgdGhpcy52aWV3ID0gbmV3IERhdGFWaWV3KHRoaXMuYnVmZmVyLCBidWZmZXIuYnl0ZU9mZnNldCwgYnVmZmVyLmJ5dGVMZW5ndGgpO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBhcmd1bWVudCcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHV0ZjhSZWFkKHZpZXcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHZhciBzdHJpbmcgPSAnJywgY2hyID0gMDtcbiAgZm9yICh2YXIgaSA9IG9mZnNldCwgZW5kID0gb2Zmc2V0ICsgbGVuZ3RoOyBpIDwgZW5kOyBpKyspIHtcbiAgICB2YXIgYnl0ZSA9IHZpZXcuZ2V0VWludDgoaSk7XG4gICAgaWYgKChieXRlICYgMHg4MCkgPT09IDB4MDApIHtcbiAgICAgIHN0cmluZyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ5dGUpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmICgoYnl0ZSAmIDB4ZTApID09PSAweGMwKSB7XG4gICAgICBzdHJpbmcgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShcbiAgICAgICAgKChieXRlICYgMHgwZikgPDwgNikgfFxuICAgICAgICAodmlldy5nZXRVaW50OCgrK2kpICYgMHgzZilcbiAgICAgICk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKChieXRlICYgMHhmMCkgPT09IDB4ZTApIHtcbiAgICAgIHN0cmluZyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKFxuICAgICAgICAoKGJ5dGUgJiAweDBmKSA8PCAxMikgfFxuICAgICAgICAoKHZpZXcuZ2V0VWludDgoKytpKSAmIDB4M2YpIDw8IDYpIHxcbiAgICAgICAgKCh2aWV3LmdldFVpbnQ4KCsraSkgJiAweDNmKSA8PCAwKVxuICAgICAgKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoKGJ5dGUgJiAweGY4KSA9PT0gMHhmMCkge1xuICAgICAgY2hyID0gKChieXRlICYgMHgwNykgPDwgMTgpIHxcbiAgICAgICAgKCh2aWV3LmdldFVpbnQ4KCsraSkgJiAweDNmKSA8PCAxMikgfFxuICAgICAgICAoKHZpZXcuZ2V0VWludDgoKytpKSAmIDB4M2YpIDw8IDYpIHxcbiAgICAgICAgKCh2aWV3LmdldFVpbnQ4KCsraSkgJiAweDNmKSA8PCAwKTtcbiAgICAgIGlmIChjaHIgPj0gMHgwMTAwMDApIHsgLy8gc3Vycm9nYXRlIHBhaXJcbiAgICAgICAgY2hyIC09IDB4MDEwMDAwO1xuICAgICAgICBzdHJpbmcgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgoY2hyID4+PiAxMCkgKyAweEQ4MDAsIChjaHIgJiAweDNGRikgKyAweERDMDApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RyaW5nICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoY2hyKTtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYnl0ZSAnICsgYnl0ZS50b1N0cmluZygxNikpO1xuICB9XG4gIHJldHVybiBzdHJpbmc7XG59XG5cbkRlY29kZXIucHJvdG90eXBlLmFycmF5ID0gZnVuY3Rpb24gKGxlbmd0aCkge1xuICB2YXIgdmFsdWUgPSBuZXcgQXJyYXkobGVuZ3RoKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgIHZhbHVlW2ldID0gdGhpcy5wYXJzZSgpO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn07XG5cbkRlY29kZXIucHJvdG90eXBlLm1hcCA9IGZ1bmN0aW9uIChsZW5ndGgpIHtcbiAgdmFyIGtleSA9ICcnLCB2YWx1ZSA9IHt9O1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAga2V5ID0gdGhpcy5wYXJzZSgpO1xuICAgIHZhbHVlW2tleV0gPSB0aGlzLnBhcnNlKCk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufTtcblxuRGVjb2Rlci5wcm90b3R5cGUuc3RyID0gZnVuY3Rpb24gKGxlbmd0aCkge1xuICB2YXIgdmFsdWUgPSB1dGY4UmVhZCh0aGlzLnZpZXcsIHRoaXMub2Zmc2V0LCBsZW5ndGgpO1xuICB0aGlzLm9mZnNldCArPSBsZW5ndGg7XG4gIHJldHVybiB2YWx1ZTtcbn07XG5cbkRlY29kZXIucHJvdG90eXBlLmJpbiA9IGZ1bmN0aW9uIChsZW5ndGgpIHtcbiAgdmFyIHZhbHVlID0gdGhpcy5idWZmZXIuc2xpY2UodGhpcy5vZmZzZXQsIHRoaXMub2Zmc2V0ICsgbGVuZ3RoKTtcbiAgdGhpcy5vZmZzZXQgKz0gbGVuZ3RoO1xuICByZXR1cm4gdmFsdWU7XG59O1xuXG5EZWNvZGVyLnByb3RvdHlwZS5wYXJzZSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHByZWZpeCA9IHRoaXMudmlldy5nZXRVaW50OCh0aGlzLm9mZnNldCsrKTtcbiAgdmFyIHZhbHVlLCBsZW5ndGggPSAwLCB0eXBlID0gMCwgaGkgPSAwLCBsbyA9IDA7XG5cbiAgaWYgKHByZWZpeCA8IDB4YzApIHtcbiAgICAvLyBwb3NpdGl2ZSBmaXhpbnRcbiAgICBpZiAocHJlZml4IDwgMHg4MCkge1xuICAgICAgcmV0dXJuIHByZWZpeDtcbiAgICB9XG4gICAgLy8gZml4bWFwXG4gICAgaWYgKHByZWZpeCA8IDB4OTApIHtcbiAgICAgIHJldHVybiB0aGlzLm1hcChwcmVmaXggJiAweDBmKTtcbiAgICB9XG4gICAgLy8gZml4YXJyYXlcbiAgICBpZiAocHJlZml4IDwgMHhhMCkge1xuICAgICAgcmV0dXJuIHRoaXMuYXJyYXkocHJlZml4ICYgMHgwZik7XG4gICAgfVxuICAgIC8vIGZpeHN0clxuICAgIHJldHVybiB0aGlzLnN0cihwcmVmaXggJiAweDFmKTtcbiAgfVxuXG4gIC8vIG5lZ2F0aXZlIGZpeGludFxuICBpZiAocHJlZml4ID4gMHhkZikge1xuICAgIHJldHVybiAoMHhmZiAtIHByZWZpeCArIDEpICogLTE7XG4gIH1cblxuICBzd2l0Y2ggKHByZWZpeCkge1xuICAgIC8vIG5pbFxuICAgIGNhc2UgMHhjMDpcbiAgICAgIHJldHVybiBudWxsO1xuICAgIC8vIGZhbHNlXG4gICAgY2FzZSAweGMyOlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIC8vIHRydWVcbiAgICBjYXNlIDB4YzM6XG4gICAgICByZXR1cm4gdHJ1ZTtcblxuICAgIC8vIGJpblxuICAgIGNhc2UgMHhjNDpcbiAgICAgIGxlbmd0aCA9IHRoaXMudmlldy5nZXRVaW50OCh0aGlzLm9mZnNldCk7XG4gICAgICB0aGlzLm9mZnNldCArPSAxO1xuICAgICAgcmV0dXJuIHRoaXMuYmluKGxlbmd0aCk7XG4gICAgY2FzZSAweGM1OlxuICAgICAgbGVuZ3RoID0gdGhpcy52aWV3LmdldFVpbnQxNih0aGlzLm9mZnNldCk7XG4gICAgICB0aGlzLm9mZnNldCArPSAyO1xuICAgICAgcmV0dXJuIHRoaXMuYmluKGxlbmd0aCk7XG4gICAgY2FzZSAweGM2OlxuICAgICAgbGVuZ3RoID0gdGhpcy52aWV3LmdldFVpbnQzMih0aGlzLm9mZnNldCk7XG4gICAgICB0aGlzLm9mZnNldCArPSA0O1xuICAgICAgcmV0dXJuIHRoaXMuYmluKGxlbmd0aCk7XG5cbiAgICAvLyBleHRcbiAgICBjYXNlIDB4Yzc6XG4gICAgICBsZW5ndGggPSB0aGlzLnZpZXcuZ2V0VWludDgodGhpcy5vZmZzZXQpO1xuICAgICAgdHlwZSA9IHRoaXMudmlldy5nZXRJbnQ4KHRoaXMub2Zmc2V0ICsgMSk7XG4gICAgICB0aGlzLm9mZnNldCArPSAyO1xuICAgICAgcmV0dXJuIFt0eXBlLCB0aGlzLmJpbihsZW5ndGgpXTtcbiAgICBjYXNlIDB4Yzg6XG4gICAgICBsZW5ndGggPSB0aGlzLnZpZXcuZ2V0VWludDE2KHRoaXMub2Zmc2V0KTtcbiAgICAgIHR5cGUgPSB0aGlzLnZpZXcuZ2V0SW50OCh0aGlzLm9mZnNldCArIDIpO1xuICAgICAgdGhpcy5vZmZzZXQgKz0gMztcbiAgICAgIHJldHVybiBbdHlwZSwgdGhpcy5iaW4obGVuZ3RoKV07XG4gICAgY2FzZSAweGM5OlxuICAgICAgbGVuZ3RoID0gdGhpcy52aWV3LmdldFVpbnQzMih0aGlzLm9mZnNldCk7XG4gICAgICB0eXBlID0gdGhpcy52aWV3LmdldEludDgodGhpcy5vZmZzZXQgKyA0KTtcbiAgICAgIHRoaXMub2Zmc2V0ICs9IDU7XG4gICAgICByZXR1cm4gW3R5cGUsIHRoaXMuYmluKGxlbmd0aCldO1xuXG4gICAgLy8gZmxvYXRcbiAgICBjYXNlIDB4Y2E6XG4gICAgICB2YWx1ZSA9IHRoaXMudmlldy5nZXRGbG9hdDMyKHRoaXMub2Zmc2V0KTtcbiAgICAgIHRoaXMub2Zmc2V0ICs9IDQ7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgY2FzZSAweGNiOlxuICAgICAgdmFsdWUgPSB0aGlzLnZpZXcuZ2V0RmxvYXQ2NCh0aGlzLm9mZnNldCk7XG4gICAgICB0aGlzLm9mZnNldCArPSA4O1xuICAgICAgcmV0dXJuIHZhbHVlO1xuXG4gICAgLy8gdWludFxuICAgIGNhc2UgMHhjYzpcbiAgICAgIHZhbHVlID0gdGhpcy52aWV3LmdldFVpbnQ4KHRoaXMub2Zmc2V0KTtcbiAgICAgIHRoaXMub2Zmc2V0ICs9IDE7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgY2FzZSAweGNkOlxuICAgICAgdmFsdWUgPSB0aGlzLnZpZXcuZ2V0VWludDE2KHRoaXMub2Zmc2V0KTtcbiAgICAgIHRoaXMub2Zmc2V0ICs9IDI7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgY2FzZSAweGNlOlxuICAgICAgdmFsdWUgPSB0aGlzLnZpZXcuZ2V0VWludDMyKHRoaXMub2Zmc2V0KTtcbiAgICAgIHRoaXMub2Zmc2V0ICs9IDQ7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgY2FzZSAweGNmOlxuICAgICAgaGkgPSB0aGlzLnZpZXcuZ2V0VWludDMyKHRoaXMub2Zmc2V0KSAqIE1hdGgucG93KDIsIDMyKTtcbiAgICAgIGxvID0gdGhpcy52aWV3LmdldFVpbnQzMih0aGlzLm9mZnNldCArIDQpO1xuICAgICAgdGhpcy5vZmZzZXQgKz0gODtcbiAgICAgIHJldHVybiBoaSArIGxvO1xuXG4gICAgLy8gaW50XG4gICAgY2FzZSAweGQwOlxuICAgICAgdmFsdWUgPSB0aGlzLnZpZXcuZ2V0SW50OCh0aGlzLm9mZnNldCk7XG4gICAgICB0aGlzLm9mZnNldCArPSAxO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIGNhc2UgMHhkMTpcbiAgICAgIHZhbHVlID0gdGhpcy52aWV3LmdldEludDE2KHRoaXMub2Zmc2V0KTtcbiAgICAgIHRoaXMub2Zmc2V0ICs9IDI7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgY2FzZSAweGQyOlxuICAgICAgdmFsdWUgPSB0aGlzLnZpZXcuZ2V0SW50MzIodGhpcy5vZmZzZXQpO1xuICAgICAgdGhpcy5vZmZzZXQgKz0gNDtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICBjYXNlIDB4ZDM6XG4gICAgICBoaSA9IHRoaXMudmlldy5nZXRJbnQzMih0aGlzLm9mZnNldCkgKiBNYXRoLnBvdygyLCAzMik7XG4gICAgICBsbyA9IHRoaXMudmlldy5nZXRVaW50MzIodGhpcy5vZmZzZXQgKyA0KTtcbiAgICAgIHRoaXMub2Zmc2V0ICs9IDg7XG4gICAgICByZXR1cm4gaGkgKyBsbztcblxuICAgIC8vIGZpeGV4dFxuICAgIGNhc2UgMHhkNDpcbiAgICAgIHR5cGUgPSB0aGlzLnZpZXcuZ2V0SW50OCh0aGlzLm9mZnNldCk7XG4gICAgICB0aGlzLm9mZnNldCArPSAxO1xuICAgICAgaWYgKHR5cGUgPT09IDB4MDApIHtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gMTtcbiAgICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbdHlwZSwgdGhpcy5iaW4oMSldO1xuICAgIGNhc2UgMHhkNTpcbiAgICAgIHR5cGUgPSB0aGlzLnZpZXcuZ2V0SW50OCh0aGlzLm9mZnNldCk7XG4gICAgICB0aGlzLm9mZnNldCArPSAxO1xuICAgICAgcmV0dXJuIFt0eXBlLCB0aGlzLmJpbigyKV07XG4gICAgY2FzZSAweGQ2OlxuICAgICAgdHlwZSA9IHRoaXMudmlldy5nZXRJbnQ4KHRoaXMub2Zmc2V0KTtcbiAgICAgIHRoaXMub2Zmc2V0ICs9IDE7XG4gICAgICByZXR1cm4gW3R5cGUsIHRoaXMuYmluKDQpXTtcbiAgICBjYXNlIDB4ZDc6XG4gICAgICB0eXBlID0gdGhpcy52aWV3LmdldEludDgodGhpcy5vZmZzZXQpO1xuICAgICAgdGhpcy5vZmZzZXQgKz0gMTtcbiAgICAgIGlmICh0eXBlID09PSAweDAwKSB7XG4gICAgICAgIGhpID0gdGhpcy52aWV3LmdldEludDMyKHRoaXMub2Zmc2V0KSAqIE1hdGgucG93KDIsIDMyKTtcbiAgICAgICAgbG8gPSB0aGlzLnZpZXcuZ2V0VWludDMyKHRoaXMub2Zmc2V0ICsgNCk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDg7XG4gICAgICAgIHJldHVybiBuZXcgRGF0ZShoaSArIGxvKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbdHlwZSwgdGhpcy5iaW4oOCldO1xuICAgIGNhc2UgMHhkODpcbiAgICAgIHR5cGUgPSB0aGlzLnZpZXcuZ2V0SW50OCh0aGlzLm9mZnNldCk7XG4gICAgICB0aGlzLm9mZnNldCArPSAxO1xuICAgICAgcmV0dXJuIFt0eXBlLCB0aGlzLmJpbigxNildO1xuXG4gICAgLy8gc3RyXG4gICAgY2FzZSAweGQ5OlxuICAgICAgbGVuZ3RoID0gdGhpcy52aWV3LmdldFVpbnQ4KHRoaXMub2Zmc2V0KTtcbiAgICAgIHRoaXMub2Zmc2V0ICs9IDE7XG4gICAgICByZXR1cm4gdGhpcy5zdHIobGVuZ3RoKTtcbiAgICBjYXNlIDB4ZGE6XG4gICAgICBsZW5ndGggPSB0aGlzLnZpZXcuZ2V0VWludDE2KHRoaXMub2Zmc2V0KTtcbiAgICAgIHRoaXMub2Zmc2V0ICs9IDI7XG4gICAgICByZXR1cm4gdGhpcy5zdHIobGVuZ3RoKTtcbiAgICBjYXNlIDB4ZGI6XG4gICAgICBsZW5ndGggPSB0aGlzLnZpZXcuZ2V0VWludDMyKHRoaXMub2Zmc2V0KTtcbiAgICAgIHRoaXMub2Zmc2V0ICs9IDQ7XG4gICAgICByZXR1cm4gdGhpcy5zdHIobGVuZ3RoKTtcblxuICAgIC8vIGFycmF5XG4gICAgY2FzZSAweGRjOlxuICAgICAgbGVuZ3RoID0gdGhpcy52aWV3LmdldFVpbnQxNih0aGlzLm9mZnNldCk7XG4gICAgICB0aGlzLm9mZnNldCArPSAyO1xuICAgICAgcmV0dXJuIHRoaXMuYXJyYXkobGVuZ3RoKTtcbiAgICBjYXNlIDB4ZGQ6XG4gICAgICBsZW5ndGggPSB0aGlzLnZpZXcuZ2V0VWludDMyKHRoaXMub2Zmc2V0KTtcbiAgICAgIHRoaXMub2Zmc2V0ICs9IDQ7XG4gICAgICByZXR1cm4gdGhpcy5hcnJheShsZW5ndGgpO1xuXG4gICAgLy8gbWFwXG4gICAgY2FzZSAweGRlOlxuICAgICAgbGVuZ3RoID0gdGhpcy52aWV3LmdldFVpbnQxNih0aGlzLm9mZnNldCk7XG4gICAgICB0aGlzLm9mZnNldCArPSAyO1xuICAgICAgcmV0dXJuIHRoaXMubWFwKGxlbmd0aCk7XG4gICAgY2FzZSAweGRmOlxuICAgICAgbGVuZ3RoID0gdGhpcy52aWV3LmdldFVpbnQzMih0aGlzLm9mZnNldCk7XG4gICAgICB0aGlzLm9mZnNldCArPSA0O1xuICAgICAgcmV0dXJuIHRoaXMubWFwKGxlbmd0aCk7XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBwYXJzZScpO1xufTtcblxuZnVuY3Rpb24gZGVjb2RlKGJ1ZmZlcikge1xuICB2YXIgZGVjb2RlciA9IG5ldyBEZWNvZGVyKGJ1ZmZlcik7XG4gIHZhciB2YWx1ZSA9IGRlY29kZXIucGFyc2UoKTtcbiAgaWYgKGRlY29kZXIub2Zmc2V0ICE9PSBidWZmZXIuYnl0ZUxlbmd0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcigoYnVmZmVyLmJ5dGVMZW5ndGggLSBkZWNvZGVyLm9mZnNldCkgKyAnIHRyYWlsaW5nIGJ5dGVzJyk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGRlY29kZTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL25vdGVwYWNrLmlvL2Jyb3dzZXIvZGVjb2RlLmpzXG4vLyBtb2R1bGUgaWQgPSAxMlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2V4dGVuZHMgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxuICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XG4gICAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdOyB9O1xuICAgIHJldHVybiBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgICBleHRlbmRTdGF0aWNzKGQsIGIpO1xuICAgICAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgICAgICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xuICAgIH07XG59KSgpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIFByaW9yaXR5U2lnbmFsXzEgPSByZXF1aXJlKFwiLi9Qcmlvcml0eVNpZ25hbFwiKTtcbi8qKlxuICogQWxsb3dzIHRoZSB2YWx1ZUNsYXNzZXMgdG8gYmUgc2V0IGluIE1YTUwsIGUuZy5cbiAqIDxzaWduYWxzOlNpZ25hbCBpZD1cIm5hbWVDaGFuZ2VkXCI+e1tTdHJpbmcsIHVpbnRdfTwvc2lnbmFsczpTaWduYWw+XG4gKi9cbi8qW0RlZmF1bHRQcm9wZXJ0eShcInZhbHVlQ2xhc3Nlc1wiKV0qL1xuLyoqXG4gKiBTaWduYWwgZGlzcGF0Y2hlcyBldmVudHMgdG8gbXVsdGlwbGUgbGlzdGVuZXJzLlxuICogSXQgaXMgaW5zcGlyZWQgYnkgQyMgZXZlbnRzIGFuZCBkZWxlZ2F0ZXMsIGFuZCBieVxuICogPGEgdGFyZ2V0PVwiX3RvcFwiIGhyZWY9XCJodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1NpZ25hbHNfYW5kX3Nsb3RzXCI+c2lnbmFscyBhbmQgc2xvdHM8L2E+XG4gKiBpbiBRdC5cbiAqIEEgU2lnbmFsIGFkZHMgZXZlbnQgZGlzcGF0Y2hpbmcgZnVuY3Rpb25hbGl0eSB0aHJvdWdoIGNvbXBvc2l0aW9uIGFuZCBpbnRlcmZhY2VzLFxuICogcmF0aGVyIHRoYW4gaW5oZXJpdGluZyBmcm9tIGEgZGlzcGF0Y2hlci5cbiAqIDxici8+PGJyLz5cbiAqIFByb2plY3QgaG9tZTogPGEgdGFyZ2V0PVwiX3RvcFwiIGhyZWY9XCJodHRwOi8vZ2l0aHViLmNvbS9yb2JlcnRwZW5uZXIvYXMzLXNpZ25hbHMvXCI+aHR0cDovL2dpdGh1Yi5jb20vcm9iZXJ0cGVubmVyL2FzMy1zaWduYWxzLzwvYT5cbiAqL1xudmFyIERlbHV4ZVNpZ25hbCA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKERlbHV4ZVNpZ25hbCwgX3N1cGVyKTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgRGVsdXhlU2lnbmFsIGluc3RhbmNlIHRvIGRpc3BhdGNoIGV2ZW50cyBvbiBiZWhhbGYgb2YgYSB0YXJnZXQgb2JqZWN0LlxuICAgICAqIEBwYXJhbSAgICB0YXJnZXQgVGhlIG9iamVjdCB0aGUgc2lnbmFsIGlzIGRpc3BhdGNoaW5nIGV2ZW50cyBvbiBiZWhhbGYgb2YuXG4gICAgICogQHBhcmFtICAgIHZhbHVlQ2xhc3NlcyBBbnkgbnVtYmVyIG9mIGNsYXNzIHJlZmVyZW5jZXMgdGhhdCBlbmFibGUgdHlwZSBjaGVja3MgaW4gZGlzcGF0Y2goKS5cbiAgICAgKiBGb3IgZXhhbXBsZSwgbmV3IERlbHV4ZVNpZ25hbCh0aGlzLCBTdHJpbmcsIHVpbnQpXG4gICAgICogd291bGQgYWxsb3c6IHNpZ25hbC5kaXNwYXRjaChcInRoZSBBbnN3ZXJcIiwgNDIpXG4gICAgICogYnV0IG5vdDogc2lnbmFsLmRpc3BhdGNoKHRydWUsIDQyLjUpXG4gICAgICogbm9yOiBzaWduYWwuZGlzcGF0Y2goKVxuICAgICAqXG4gICAgICogTk9URTogU3ViY2xhc3NlcyBjYW5ub3QgY2FsbCBzdXBlci5hcHBseShudWxsLCB2YWx1ZUNsYXNzZXMpLFxuICAgICAqIGJ1dCB0aGlzIGNvbnN0cnVjdG9yIGhhcyBsb2dpYyB0byBzdXBwb3J0IHN1cGVyKHZhbHVlQ2xhc3NlcykuXG4gICAgICovXG4gICAgZnVuY3Rpb24gRGVsdXhlU2lnbmFsKHRhcmdldCkge1xuICAgICAgICBpZiAodGFyZ2V0ID09PSB2b2lkIDApIHsgdGFyZ2V0ID0gbnVsbDsgfVxuICAgICAgICB2YXIgdmFsdWVDbGFzc2VzID0gW107XG4gICAgICAgIGZvciAodmFyIF9pID0gMTsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICB2YWx1ZUNsYXNzZXNbX2kgLSAxXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgIH1cbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgLy8gQ2Fubm90IHVzZSBzdXBlci5hcHBseShudWxsLCB2YWx1ZUNsYXNzZXMpLCBzbyBhbGxvdyB0aGUgc3ViY2xhc3MgdG8gY2FsbCBzdXBlcih2YWx1ZUNsYXNzZXMpLlxuICAgICAgICB2YWx1ZUNsYXNzZXMgPSAodmFsdWVDbGFzc2VzLmxlbmd0aCA9PSAxICYmIHZhbHVlQ2xhc3Nlc1swXSBpbnN0YW5jZW9mIEFycmF5KSA/IHZhbHVlQ2xhc3Nlc1swXSA6IHZhbHVlQ2xhc3NlcztcbiAgICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCB2YWx1ZUNsYXNzZXMpIHx8IHRoaXM7XG4gICAgICAgIC8vQENIQU5HRUQgLSB0aGlzIHdhcyB0aGUgZmlyc3QgY2FsbCBpbiB0aGUgY29uc3RydWN0b3JcbiAgICAgICAgLy9UeXBlc2NyaXB0IGRvZXMgbm90IGFsbG93IFwidGhpc1wiIHRvIGJlIGNhbGxlZCBiZWZvcmUgc3VwZXJcbiAgICAgICAgX3RoaXMuX3RhcmdldCA9IHRhcmdldDtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRGVsdXhlU2lnbmFsLnByb3RvdHlwZSwgXCJ0YXJnZXRcIiwge1xuICAgICAgICAvKiogQGluaGVyaXREb2MgKi9cbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdGFyZ2V0O1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgaWYgKHZhbHVlID09IHRoaXMuX3RhcmdldClcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB0aGlzLnJlbW92ZUFsbCgpO1xuICAgICAgICAgICAgdGhpcy5fdGFyZ2V0ID0gdmFsdWU7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICogQHRocm93cyBBcmd1bWVudEVycm9yIDxjb2RlPkFyZ3VtZW50RXJyb3I8L2NvZGU+OiBJbmNvcnJlY3QgbnVtYmVyIG9mIGFyZ3VtZW50cy5cbiAgICAgKiBAdGhyb3dzIEFyZ3VtZW50RXJyb3IgPGNvZGU+QXJndW1lbnRFcnJvcjwvY29kZT46IFZhbHVlIG9iamVjdCBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgdGhlIGFwcHJvcHJpYXRlIHZhbHVlQ2xhc3NlcyBDbGFzcy5cbiAgICAgKi9cbiAgICAvKm92ZXJyaWRlKi9cbiAgICBEZWx1eGVTaWduYWwucHJvdG90eXBlLmRpc3BhdGNoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdmFsdWVPYmplY3RzID0gW107XG4gICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICB2YWx1ZU9iamVjdHNbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICAvLyBWYWxpZGF0ZSB2YWx1ZSBvYmplY3RzIGFnYWluc3QgcHJlLWRlZmluZWQgdmFsdWUgY2xhc3Nlcy5cbiAgICAgICAgdmFyIG51bVZhbHVlQ2xhc3NlcyA9IHRoaXMuX3ZhbHVlQ2xhc3Nlcy5sZW5ndGg7XG4gICAgICAgIHZhciBudW1WYWx1ZU9iamVjdHMgPSB2YWx1ZU9iamVjdHMubGVuZ3RoO1xuICAgICAgICBpZiAobnVtVmFsdWVPYmplY3RzIDwgbnVtVmFsdWVDbGFzc2VzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0luY29ycmVjdCBudW1iZXIgb2YgYXJndW1lbnRzLiAnICtcbiAgICAgICAgICAgICAgICAnRXhwZWN0ZWQgYXQgbGVhc3QgJyArIG51bVZhbHVlQ2xhc3NlcyArICcgYnV0IHJlY2VpdmVkICcgK1xuICAgICAgICAgICAgICAgIG51bVZhbHVlT2JqZWN0cyArICcuJyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ2Fubm90IGRpc3BhdGNoIGRpZmZlcmVudGx5IHR5cGVkIG9iamVjdHMgdGhhbiBkZWNsYXJlZCBjbGFzc2VzLlxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bVZhbHVlQ2xhc3NlczsgaSsrKSB7XG4gICAgICAgICAgICAvLyBPcHRpbWl6ZWQgZm9yIHRoZSBvcHRpbWlzdGljIGNhc2UgdGhhdCB2YWx1ZXMgYXJlIGNvcnJlY3QuXG4gICAgICAgICAgICBpZiAodmFsdWVPYmplY3RzW2ldID09PSBudWxsIHx8IHZhbHVlT2JqZWN0c1tpXS5jb25zdHJ1Y3RvciA9PT0gdGhpcy5fdmFsdWVDbGFzc2VzW2ldKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdWYWx1ZSBvYmplY3QgPCcgKyB2YWx1ZU9iamVjdHNbaV1cbiAgICAgICAgICAgICAgICArICc+IGlzIG5vdCBhbiBpbnN0YW5jZSBvZiA8JyArIHRoaXMuX3ZhbHVlQ2xhc3Nlc1tpXSArICc+LicpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEV4dHJhY3QgYW5kIGNsb25lIGV2ZW50IG9iamVjdCBpZiBuZWNlc3NhcnkuXG4gICAgICAgIHZhciBldmVudCA9IHZhbHVlT2JqZWN0c1swXTtcbiAgICAgICAgaWYgKGV2ZW50KSB7XG4gICAgICAgICAgICBpZiAoZXZlbnQudGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgZXZlbnQgPSBldmVudC5jbG9uZSgpO1xuICAgICAgICAgICAgICAgIHZhbHVlT2JqZWN0c1swXSA9IGV2ZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZXZlbnQudGFyZ2V0ID0gdGhpcy50YXJnZXQ7XG4gICAgICAgICAgICBldmVudC5jdXJyZW50VGFyZ2V0ID0gdGhpcy50YXJnZXQ7XG4gICAgICAgICAgICBldmVudC5zaWduYWwgPSB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIC8vIEJyb2FkY2FzdCB0byBsaXN0ZW5lcnMuXG4gICAgICAgIHZhciBzbG90c1RvUHJvY2VzcyA9IHRoaXMuc2xvdHM7XG4gICAgICAgIHdoaWxlIChzbG90c1RvUHJvY2Vzcy5ub25FbXB0eSkge1xuICAgICAgICAgICAgc2xvdHNUb1Byb2Nlc3MuaGVhZC5leGVjdXRlKHZhbHVlT2JqZWN0cyk7XG4gICAgICAgICAgICBzbG90c1RvUHJvY2VzcyA9IHNsb3RzVG9Qcm9jZXNzLnRhaWw7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQnViYmxlIHRoZSBldmVudCBhcyBmYXIgYXMgcG9zc2libGUuXG4gICAgICAgIGlmICghZXZlbnQgfHwgIWV2ZW50LmJ1YmJsZXMpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHZhciBjdXJyZW50VGFyZ2V0ID0gdGhpcy50YXJnZXQ7XG4gICAgICAgIHdoaWxlIChjdXJyZW50VGFyZ2V0ICYmIGN1cnJlbnRUYXJnZXQuaGFzT3duUHJvcGVydHkoXCJwYXJlbnRcIikpIHtcbiAgICAgICAgICAgIGN1cnJlbnRUYXJnZXQgPSBjdXJyZW50VGFyZ2V0W1wicGFyZW50XCJdO1xuICAgICAgICAgICAgaWYgKCFjdXJyZW50VGFyZ2V0KVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRUYXJnZXQub25FdmVudEJ1YmJsZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGV2ZW50LmN1cnJlbnRUYXJnZXQgPSBjdXJyZW50VGFyZ2V0O1xuICAgICAgICAgICAgICAgIC8vIG9uRXZlbnRCdWJibGVkKCkgY2FuIHN0b3AgdGhlIGJ1YmJsaW5nIGJ5IHJldHVybmluZyBmYWxzZS5cbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudFRhcmdldC5vbkV2ZW50QnViYmxlZChldmVudCkpXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gRGVsdXhlU2lnbmFsO1xufShQcmlvcml0eVNpZ25hbF8xLlByaW9yaXR5U2lnbmFsKSk7XG5leHBvcnRzLkRlbHV4ZVNpZ25hbCA9IERlbHV4ZVNpZ25hbDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPURlbHV4ZVNpZ25hbC5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9zaWduYWxzLmpzL2xpYi9vcmcvb3NmbGFzaC9zaWduYWxzL0RlbHV4ZVNpZ25hbC5qc1xuLy8gbW9kdWxlIGlkID0gMTNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG4vKipcbiAqXG4gKiBAc2VlIG9yZy5vc2ZsYXNoLnNpZ25hbHMuZXZlbnRzLklFdmVudFxuICogRG9jdW1lbnRhdGlvbiBmb3IgdGhlIGV2ZW50IGludGVyZmFjZSBiZWluZyBtYWludGFpbmVkIGluIElFdmVudCB0byBhdm9pZCBkdXBsaWNhdGlvbiBmb3Igbm93LlxuICovXG52YXIgR2VuZXJpY0V2ZW50ID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBHZW5lcmljRXZlbnQoYnViYmxlcykge1xuICAgICAgICBpZiAoYnViYmxlcyA9PT0gdm9pZCAwKSB7IGJ1YmJsZXMgPSBmYWxzZTsgfVxuICAgICAgICB0aGlzLl9idWJibGVzID0gYnViYmxlcztcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEdlbmVyaWNFdmVudC5wcm90b3R5cGUsIFwic2lnbmFsXCIsIHtcbiAgICAgICAgLyoqIEBpbmhlcml0RG9jICovXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3NpZ25hbDtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuX3NpZ25hbCA9IHZhbHVlO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoR2VuZXJpY0V2ZW50LnByb3RvdHlwZSwgXCJ0YXJnZXRcIiwge1xuICAgICAgICAvKiogQGluaGVyaXREb2MgKi9cbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdGFyZ2V0O1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5fdGFyZ2V0ID0gdmFsdWU7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShHZW5lcmljRXZlbnQucHJvdG90eXBlLCBcImN1cnJlbnRUYXJnZXRcIiwge1xuICAgICAgICAvKiogQGluaGVyaXREb2MgKi9cbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fY3VycmVudFRhcmdldDtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRUYXJnZXQgPSB2YWx1ZTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEdlbmVyaWNFdmVudC5wcm90b3R5cGUsIFwiYnViYmxlc1wiLCB7XG4gICAgICAgIC8qKiBAaW5oZXJpdERvYyAqL1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9idWJibGVzO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5fYnViYmxlcyA9IHZhbHVlO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICAvKiogQGluaGVyaXREb2MgKi9cbiAgICBHZW5lcmljRXZlbnQucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gbmV3IEdlbmVyaWNFdmVudCh0aGlzLl9idWJibGVzKTtcbiAgICB9O1xuICAgIHJldHVybiBHZW5lcmljRXZlbnQ7XG59KCkpO1xuZXhwb3J0cy5HZW5lcmljRXZlbnQgPSBHZW5lcmljRXZlbnQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1HZW5lcmljRXZlbnQuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvc2lnbmFscy5qcy9saWIvb3JnL29zZmxhc2gvc2lnbmFscy9ldmVudHMvR2VuZXJpY0V2ZW50LmpzXG4vLyBtb2R1bGUgaWQgPSAxNFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbi8qKlxuICpcbiAqL1xuZXhwb3J0cy5JT25jZVNpZ25hbCA9IFN5bWJvbChcIklPbmNlU2lnbmFsXCIpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9SU9uY2VTaWduYWwuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvc2lnbmFscy5qcy9saWIvb3JnL29zZmxhc2gvc2lnbmFscy9JT25jZVNpZ25hbC5qc1xuLy8gbW9kdWxlIGlkID0gMTVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG4vKipcbiAqXG4gKi9cbmV4cG9ydHMuSVByaW9yaXR5U2lnbmFsID0gU3ltYm9sKFwiSVByaW9yaXR5U2lnbmFsXCIpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9SVByaW9yaXR5U2lnbmFsLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL3NpZ25hbHMuanMvbGliL29yZy9vc2ZsYXNoL3NpZ25hbHMvSVByaW9yaXR5U2lnbmFsLmpzXG4vLyBtb2R1bGUgaWQgPSAxNlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbi8qKlxuICpcbiAqL1xuZXhwb3J0cy5JU2lnbmFsID0gU3ltYm9sKFwiSVNpZ25hbFwiKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUlTaWduYWwuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvc2lnbmFscy5qcy9saWIvb3JnL29zZmxhc2gvc2lnbmFscy9JU2lnbmFsLmpzXG4vLyBtb2R1bGUgaWQgPSAxN1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbi8qKlxuICogVGhlIElTbG90IGludGVyZmFjZSBkZWZpbmVzIHRoZSBiYXNpYyBwcm9wZXJ0aWVzIG9mIGFcbiAqIGxpc3RlbmVyIGFzc29jaWF0ZWQgd2l0aCBhIFNpZ25hbC5cbiAqXG4gKiBAYXV0aG9yIEpvYSBFYmVydFxuICogQGF1dGhvciBSb2JlcnQgUGVubmVyXG4gKi9cbmV4cG9ydHMuSVNsb3QgPSBTeW1ib2woXCJJU2xvdFwiKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUlTbG90LmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL3NpZ25hbHMuanMvbGliL29yZy9vc2ZsYXNoL3NpZ25hbHMvSVNsb3QuanNcbi8vIG1vZHVsZSBpZCA9IDE4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIFNsb3RfMSA9IHJlcXVpcmUoXCIuL1Nsb3RcIik7XG4vKipcbiAqIEFsbG93cyB0aGUgdmFsdWVDbGFzc2VzIHRvIGJlIHNldCBpbiBNWE1MLCBlLmcuXG4gKiA8c2lnbmFsczpTaWduYWwgaWQ9XCJuYW1lQ2hhbmdlZFwiPntbU3RyaW5nLCB1aW50XX08L3NpZ25hbHM6U2lnbmFsPlxuICovXG4vKltEZWZhdWx0UHJvcGVydHkoXCJ2YWx1ZUNsYXNzZXNcIildKi9cbi8qKlxuICogQSBNb25vU2lnbmFsIGNhbiBoYXZlIG9ubHkgb25lIGxpc3RlbmVyLlxuICovXG52YXIgTW9ub1NpZ25hbCA9IChmdW5jdGlvbiAoKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIE1vbm9TaWduYWwgaW5zdGFuY2UgdG8gZGlzcGF0Y2ggdmFsdWUgb2JqZWN0cy5cbiAgICAgKiBAcGFyYW0gICAgdmFsdWVDbGFzc2VzIEFueSBudW1iZXIgb2YgY2xhc3MgcmVmZXJlbmNlcyB0aGF0IGVuYWJsZSB0eXBlIGNoZWNrcyBpbiBkaXNwYXRjaCgpLlxuICAgICAqIEZvciBleGFtcGxlLCBuZXcgU2lnbmFsKFN0cmluZywgdWludClcbiAgICAgKiB3b3VsZCBhbGxvdzogc2lnbmFsLmRpc3BhdGNoKFwidGhlIEFuc3dlclwiLCA0MilcbiAgICAgKiBidXQgbm90OiBzaWduYWwuZGlzcGF0Y2godHJ1ZSwgNDIuNSlcbiAgICAgKiBub3I6IHNpZ25hbC5kaXNwYXRjaCgpXG4gICAgICpcbiAgICAgKiBOT1RFOiBTdWJjbGFzc2VzIGNhbm5vdCBjYWxsIHN1cGVyLmFwcGx5KG51bGwsIHZhbHVlQ2xhc3NlcyksXG4gICAgICogYnV0IHRoaXMgY29uc3RydWN0b3IgaGFzIGxvZ2ljIHRvIHN1cHBvcnQgc3VwZXIodmFsdWVDbGFzc2VzKS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBNb25vU2lnbmFsKCkge1xuICAgICAgICB2YXIgdmFsdWVDbGFzc2VzID0gW107XG4gICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICB2YWx1ZUNsYXNzZXNbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICAvLyBDYW5ub3QgdXNlIHN1cGVyLmFwcGx5KG51bGwsIHZhbHVlQ2xhc3NlcyksIHNvIGFsbG93IHRoZSBzdWJjbGFzcyB0byBjYWxsIHN1cGVyKHZhbHVlQ2xhc3NlcykuXG4gICAgICAgIHRoaXMudmFsdWVDbGFzc2VzID0gKHZhbHVlQ2xhc3Nlcy5sZW5ndGggPT0gMSAmJiB2YWx1ZUNsYXNzZXNbMF0gaW5zdGFuY2VvZiBBcnJheSkgPyB2YWx1ZUNsYXNzZXNbMF0gOiB2YWx1ZUNsYXNzZXM7XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShNb25vU2lnbmFsLnByb3RvdHlwZSwgXCJ2YWx1ZUNsYXNzZXNcIiwge1xuICAgICAgICAvKipcbiAgICAgICAgICogQGluaGVyaXREb2NcbiAgICAgICAgICogQHRocm93cyBBcmd1bWVudEVycm9yIDxjb2RlPkFyZ3VtZW50RXJyb3I8L2NvZGU+OiBJbnZhbGlkIHZhbHVlQ2xhc3NlcyBhcmd1bWVudDogaXRlbSBhdCBpbmRleCBzaG91bGQgYmUgYSBDbGFzcyBidXQgd2FzIG5vdC5cbiAgICAgICAgICovXG4gICAgICAgIC8qW0FycmF5RWxlbWVudFR5cGUoXCJDbGFzc1wiKV0qL1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl92YWx1ZUNsYXNzZXM7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAvLyBDbG9uZSBzbyB0aGUgQXJyYXkgY2Fubm90IGJlIGFmZmVjdGVkIGZyb20gb3V0c2lkZS5cbiAgICAgICAgICAgIHRoaXMuX3ZhbHVlQ2xhc3NlcyA9IHZhbHVlID8gdmFsdWUuc2xpY2UoKSA6IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IHRoaXMuX3ZhbHVlQ2xhc3Nlcy5sZW5ndGg7IGktLTspIHtcbiAgICAgICAgICAgICAgICBpZiAoISh0aGlzLl92YWx1ZUNsYXNzZXNbaV0gaW5zdGFuY2VvZiBPYmplY3QpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB2YWx1ZUNsYXNzZXMgYXJndW1lbnQ6ICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ2l0ZW0gYXQgaW5kZXggJyArIGkgKyAnIHNob3VsZCBiZSBhIENsYXNzIGJ1dCB3YXM6PCcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmFsdWVDbGFzc2VzW2ldICsgJz4uJyArIHRoaXMuX3ZhbHVlQ2xhc3Nlc1tpXSk7IC8vQENIQU5HRUQgLSB0ZW1wIHJlcGxhY2VtZW50IGZvciBnZXRRdWFsaWZpZWRDbGFzc0J5TmFtZSgpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoTW9ub1NpZ25hbC5wcm90b3R5cGUsIFwibnVtTGlzdGVuZXJzXCIsIHtcbiAgICAgICAgLyoqIEBpbmhlcml0RG9jICovXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2xvdCA/IDEgOiAwO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqIEB0aHJvd3MgZmxhc2guZXJyb3JzLklsbGVnYWxPcGVyYXRpb25FcnJvciA8Y29kZT5JbGxlZ2FsT3BlcmF0aW9uRXJyb3I8L2NvZGU+OiBZb3UgY2Fubm90IGFkZCBvciBhZGRPbmNlIHdpdGggYSBsaXN0ZW5lciBhbHJlYWR5IGFkZGVkLCByZW1vdmUgdGhlIGN1cnJlbnQgbGlzdGVuZXIgZmlyc3QuXG4gICAgICogQHRocm93cyBBcmd1bWVudEVycm9yIDxjb2RlPkFyZ3VtZW50RXJyb3I8L2NvZGU+OiBHaXZlbiBsaXN0ZW5lciBpcyA8Y29kZT5udWxsPC9jb2RlPi5cbiAgICAgKi9cbiAgICBNb25vU2lnbmFsLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAobGlzdGVuZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVnaXN0ZXJMaXN0ZW5lcihsaXN0ZW5lcik7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqIEB0aHJvd3MgZmxhc2guZXJyb3JzLklsbGVnYWxPcGVyYXRpb25FcnJvciA8Y29kZT5JbGxlZ2FsT3BlcmF0aW9uRXJyb3I8L2NvZGU+OiBZb3UgY2Fubm90IGFkZCBvciBhZGRPbmNlIHdpdGggYSBsaXN0ZW5lciBhbHJlYWR5IGFkZGVkLCByZW1vdmUgdGhlIGN1cnJlbnQgbGlzdGVuZXIgZmlyc3QuXG4gICAgICogQHRocm93cyBBcmd1bWVudEVycm9yIDxjb2RlPkFyZ3VtZW50RXJyb3I8L2NvZGU+OiBHaXZlbiBsaXN0ZW5lciBpcyA8Y29kZT5udWxsPC9jb2RlPi5cbiAgICAgKi9cbiAgICBNb25vU2lnbmFsLnByb3RvdHlwZS5hZGRPbmNlID0gZnVuY3Rpb24gKGxpc3RlbmVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlZ2lzdGVyTGlzdGVuZXIobGlzdGVuZXIsIHRydWUpO1xuICAgIH07XG4gICAgLyoqIEBpbmhlcml0RG9jICovXG4gICAgTW9ub1NpZ25hbC5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24gKGxpc3RlbmVyKSB7XG4gICAgICAgIGlmICh0aGlzLnNsb3QgJiYgdGhpcy5zbG90Lmxpc3RlbmVyID09IGxpc3RlbmVyKSB7XG4gICAgICAgICAgICB2YXIgdGhlU2xvdCA9IHRoaXMuc2xvdDtcbiAgICAgICAgICAgIHRoaXMuc2xvdCA9IG51bGw7XG4gICAgICAgICAgICByZXR1cm4gdGhlU2xvdDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICAgIC8qKiBAaW5oZXJpdERvYyAqL1xuICAgIE1vbm9TaWduYWwucHJvdG90eXBlLnJlbW92ZUFsbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuc2xvdClcbiAgICAgICAgICAgIHRoaXMuc2xvdC5yZW1vdmUoKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICogQHRocm93cyBBcmd1bWVudEVycm9yIDxjb2RlPkFyZ3VtZW50RXJyb3I8L2NvZGU+OiBJbmNvcnJlY3QgbnVtYmVyIG9mIGFyZ3VtZW50cy5cbiAgICAgKiBAdGhyb3dzIEFyZ3VtZW50RXJyb3IgPGNvZGU+QXJndW1lbnRFcnJvcjwvY29kZT46IFZhbHVlIG9iamVjdCBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgdGhlIGFwcHJvcHJpYXRlIHZhbHVlQ2xhc3NlcyBDbGFzcy5cbiAgICAgKi9cbiAgICBNb25vU2lnbmFsLnByb3RvdHlwZS5kaXNwYXRjaCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHZhbHVlT2JqZWN0cyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgdmFsdWVPYmplY3RzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgdmFsdWVDbGFzc2VzIGlzIGVtcHR5LCB2YWx1ZSBvYmplY3RzIGFyZSBub3QgdHlwZS1jaGVja2VkLlxuICAgICAgICB2YXIgbnVtVmFsdWVDbGFzc2VzID0gdGhpcy5fdmFsdWVDbGFzc2VzLmxlbmd0aDtcbiAgICAgICAgdmFyIG51bVZhbHVlT2JqZWN0cyA9IHZhbHVlT2JqZWN0cy5sZW5ndGg7XG4gICAgICAgIC8vIENhbm5vdCBkaXNwYXRjaCBmZXdlciBvYmplY3RzIHRoYW4gZGVjbGFyZWQgY2xhc3Nlcy5cbiAgICAgICAgaWYgKG51bVZhbHVlT2JqZWN0cyA8IG51bVZhbHVlQ2xhc3Nlcykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbmNvcnJlY3QgbnVtYmVyIG9mIGFyZ3VtZW50cy4gJyArXG4gICAgICAgICAgICAgICAgJ0V4cGVjdGVkIGF0IGxlYXN0ICcgKyBudW1WYWx1ZUNsYXNzZXMgKyAnIGJ1dCByZWNlaXZlZCAnICtcbiAgICAgICAgICAgICAgICBudW1WYWx1ZU9iamVjdHMgKyAnLicpO1xuICAgICAgICB9XG4gICAgICAgIC8vIENhbm5vdCBkaXNwYXRjaCBkaWZmZXJlbnRseSB0eXBlZCBvYmplY3RzIHRoYW4gZGVjbGFyZWQgY2xhc3Nlcy5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1WYWx1ZUNsYXNzZXM7IGkrKykge1xuICAgICAgICAgICAgLy8gT3B0aW1pemVkIGZvciB0aGUgb3B0aW1pc3RpYyBjYXNlIHRoYXQgdmFsdWVzIGFyZSBjb3JyZWN0LlxuICAgICAgICAgICAgaWYgKHZhbHVlT2JqZWN0c1tpXSA9PT0gbnVsbCB8fFxuICAgICAgICAgICAgICAgICh2YWx1ZU9iamVjdHNbaV0gaW5zdGFuY2VvZiB0aGlzLl92YWx1ZUNsYXNzZXNbaV0gfHwgdmFsdWVPYmplY3RzW2ldLmNvbnN0cnVjdG9yID09PSB0aGlzLl92YWx1ZUNsYXNzZXNbaV0pKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1ZhbHVlIG9iamVjdCA8JyArIHZhbHVlT2JqZWN0c1tpXVxuICAgICAgICAgICAgICAgICsgJz4gaXMgbm90IGFuIGluc3RhbmNlIG9mIDwnICsgdGhpcy5fdmFsdWVDbGFzc2VzW2ldICsgJz4uJyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQnJvYWRjYXN0IHRvIHRoZSBvbmUgbGlzdGVuZXIuXG4gICAgICAgIGlmICh0aGlzLnNsb3QpIHtcbiAgICAgICAgICAgIHRoaXMuc2xvdC5leGVjdXRlKHZhbHVlT2JqZWN0cyk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIE1vbm9TaWduYWwucHJvdG90eXBlLnJlZ2lzdGVyTGlzdGVuZXIgPSBmdW5jdGlvbiAobGlzdGVuZXIsIG9uY2UpIHtcbiAgICAgICAgaWYgKG9uY2UgPT09IHZvaWQgMCkgeyBvbmNlID0gZmFsc2U7IH1cbiAgICAgICAgaWYgKHRoaXMuc2xvdCkge1xuICAgICAgICAgICAgLy8gSWYgdGhlIGxpc3RlbmVyIGV4aXRzIHByZXZpb3VzbHkgYWRkZWQsIGRlZmluaXRlbHkgZG9uJ3QgYWRkIGl0LlxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgY2Fubm90IGFkZCBvciBhZGRPbmNlIHdpdGggYSBsaXN0ZW5lciBhbHJlYWR5IGFkZGVkLCByZW1vdmUgdGhlIGN1cnJlbnQgbGlzdGVuZXIgZmlyc3QuJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICh0aGlzLnNsb3QgPSBuZXcgU2xvdF8xLlNsb3QobGlzdGVuZXIsIHRoaXMsIG9uY2UpKTtcbiAgICB9O1xuICAgIHJldHVybiBNb25vU2lnbmFsO1xufSgpKTtcbmV4cG9ydHMuTW9ub1NpZ25hbCA9IE1vbm9TaWduYWw7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Nb25vU2lnbmFsLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL3NpZ25hbHMuanMvbGliL29yZy9vc2ZsYXNoL3NpZ25hbHMvTW9ub1NpZ25hbC5qc1xuLy8gbW9kdWxlIGlkID0gMTlcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcbiAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxuICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTsgfTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbiAgICB9O1xufSkoKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciBPbmNlU2lnbmFsXzEgPSByZXF1aXJlKFwiLi9PbmNlU2lnbmFsXCIpO1xudmFyIFByb21pc2UgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQcm9taXNlLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFByb21pc2UoKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICB9XG4gICAgLyoqIEBpbmhlcml0RG9jICovXG4gICAgLypvdmVycmlkZSovXG4gICAgUHJvbWlzZS5wcm90b3R5cGUuYWRkT25jZSA9IGZ1bmN0aW9uIChsaXN0ZW5lcikge1xuICAgICAgICB2YXIgc2xvdCA9IF9zdXBlci5wcm90b3R5cGUuYWRkT25jZS5jYWxsKHRoaXMsIGxpc3RlbmVyKTtcbiAgICAgICAgaWYgKHRoaXMuaXNEaXNwYXRjaGVkKSB7XG4gICAgICAgICAgICBzbG90LmV4ZWN1dGUodGhpcy52YWx1ZU9iamVjdHMpO1xuICAgICAgICAgICAgc2xvdC5yZW1vdmUoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2xvdDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICogQHRocm93cyBmbGFzaC5lcnJvcnMuSWxsZWdhbE9wZXJhdGlvbkVycm9yIDxjb2RlPklsbGVnYWxPcGVyYXRpb25FcnJvcjwvY29kZT46IFlvdSBjYW5ub3QgZGlzcGF0Y2goKSBhIFByb21pc2UgbW9yZSB0aGFuIG9uY2VcbiAgICAgKi9cbiAgICAvKm92ZXJyaWRlKi9cbiAgICBQcm9taXNlLnByb3RvdHlwZS5kaXNwYXRjaCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHZhbHVlT2JqZWN0cyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgdmFsdWVPYmplY3RzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaXNEaXNwYXRjaGVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJZb3UgY2Fubm90IGRpc3BhdGNoKCkgYSBQcm9taXNlIG1vcmUgdGhhbiBvbmNlXCIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5pc0Rpc3BhdGNoZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy52YWx1ZU9iamVjdHMgPSB2YWx1ZU9iamVjdHM7XG4gICAgICAgICAgICBfc3VwZXIucHJvdG90eXBlLmRpc3BhdGNoLmFwcGx5KHRoaXMsIHZhbHVlT2JqZWN0cyk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBQcm9taXNlO1xufShPbmNlU2lnbmFsXzEuT25jZVNpZ25hbCkpO1xuZXhwb3J0cy5Qcm9taXNlID0gUHJvbWlzZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVByb21pc2UuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvc2lnbmFscy5qcy9saWIvb3JnL29zZmxhc2gvc2lnbmFscy9Qcm9taXNlLmpzXG4vLyBtb2R1bGUgaWQgPSAyMFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJcInVzZSBzdHJpY3RcIjtcbnZhciBDbG9jayA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQ2xvY2sodXNlSW50ZXJ2YWwpIHtcbiAgICAgICAgaWYgKHVzZUludGVydmFsID09PSB2b2lkIDApIHsgdXNlSW50ZXJ2YWwgPSBmYWxzZTsgfVxuICAgICAgICB0aGlzLnJ1bm5pbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5ub3cgPSAodHlwZW9mICh3aW5kb3cpICE9PSBcInVuZGVmaW5lZFwiICYmIHdpbmRvdy5wZXJmb3JtYW5jZSAmJiB3aW5kb3cucGVyZm9ybWFuY2Uubm93ICYmICh3aW5kb3cucGVyZm9ybWFuY2Uubm93KS5iaW5kKHdpbmRvdy5wZXJmb3JtYW5jZSkpIHx8IERhdGUubm93O1xuICAgICAgICB0aGlzLnN0YXJ0KHVzZUludGVydmFsKTtcbiAgICB9XG4gICAgQ2xvY2sucHJvdG90eXBlLnN0YXJ0ID0gZnVuY3Rpb24gKHVzZUludGVydmFsKSB7XG4gICAgICAgIGlmICh1c2VJbnRlcnZhbCA9PT0gdm9pZCAwKSB7IHVzZUludGVydmFsID0gZmFsc2U7IH1cbiAgICAgICAgdGhpcy5kZWx0YVRpbWUgPSAwO1xuICAgICAgICB0aGlzLmN1cnJlbnRUaW1lID0gdGhpcy5ub3coKTtcbiAgICAgICAgdGhpcy5lbGFwc2VkVGltZSA9IDA7XG4gICAgICAgIHRoaXMucnVubmluZyA9IHRydWU7XG4gICAgICAgIGlmICh1c2VJbnRlcnZhbCkge1xuICAgICAgICAgICAgLy8gYXV0byBzZXQgaW50ZXJ2YWwgdG8gNjAgdGlja3MgcGVyIHNlY29uZFxuICAgICAgICAgICAgdGhpcy5faW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCh0aGlzLnRpY2suYmluZCh0aGlzKSwgMTAwMCAvIDYwKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgQ2xvY2sucHJvdG90eXBlLnN0b3AgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMucnVubmluZyA9IGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5faW50ZXJ2YWwpIHtcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5faW50ZXJ2YWwpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBDbG9jay5wcm90b3R5cGUudGljayA9IGZ1bmN0aW9uIChuZXdUaW1lKSB7XG4gICAgICAgIGlmIChuZXdUaW1lID09PSB2b2lkIDApIHsgbmV3VGltZSA9IHRoaXMubm93KCk7IH1cbiAgICAgICAgdGhpcy5kZWx0YVRpbWUgPSBuZXdUaW1lIC0gdGhpcy5jdXJyZW50VGltZTtcbiAgICAgICAgdGhpcy5jdXJyZW50VGltZSA9IG5ld1RpbWU7XG4gICAgICAgIHRoaXMuZWxhcHNlZFRpbWUgKz0gdGhpcy5kZWx0YVRpbWU7XG4gICAgfTtcbiAgICByZXR1cm4gQ2xvY2s7XG59KCkpO1xubW9kdWxlLmV4cG9ydHMgPSBDbG9jaztcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0BnYW1lc3RkaW8vY2xvY2svZGlzdC9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gMjFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgRGVsdGFDb250YWluZXJfMSA9IHJlcXVpcmUoXCIuL0RlbHRhQ29udGFpbmVyXCIpO1xuZXhwb3J0cy5EZWx0YUNvbnRhaW5lciA9IERlbHRhQ29udGFpbmVyXzEuRGVsdGFDb250YWluZXI7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9kZWx0YS1saXN0ZW5lci9saWIvaW5kZXguanNcbi8vIG1vZHVsZSBpZCA9IDIyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIGNvbXBhcmVfMSA9IHJlcXVpcmUoXCIuL2NvbXBhcmVcIik7XG52YXIgRGVsdGFDb250YWluZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gRGVsdGFDb250YWluZXIoZGF0YSkge1xuICAgICAgICB0aGlzLmxpc3RlbmVycyA9IFtdO1xuICAgICAgICB0aGlzLm1hdGNoZXJQbGFjZWhvbGRlcnMgPSB7XG4gICAgICAgICAgICBcIjppZFwiOiAvXihbYS16QS1aMC05XFwtX10rKSQvLFxuICAgICAgICAgICAgXCI6bnVtYmVyXCI6IC9eKFswLTldKykkLyxcbiAgICAgICAgICAgIFwiOnN0cmluZ1wiOiAvXihcXHcrKSQvLFxuICAgICAgICAgICAgXCI6YXhpc1wiOiAvXihbeHl6XSkkLyxcbiAgICAgICAgICAgIFwiOipcIjogLyguKikvLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgfVxuICAgIERlbHRhQ29udGFpbmVyLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAobmV3RGF0YSkge1xuICAgICAgICB2YXIgcGF0Y2hlcyA9IGNvbXBhcmVfMS5jb21wYXJlKHRoaXMuZGF0YSwgbmV3RGF0YSk7XG4gICAgICAgIHRoaXMuY2hlY2tQYXRjaGVzKHBhdGNoZXMpO1xuICAgICAgICB0aGlzLmRhdGEgPSBuZXdEYXRhO1xuICAgICAgICByZXR1cm4gcGF0Y2hlcztcbiAgICB9O1xuICAgIERlbHRhQ29udGFpbmVyLnByb3RvdHlwZS5yZWdpc3RlclBsYWNlaG9sZGVyID0gZnVuY3Rpb24gKHBsYWNlaG9sZGVyLCBtYXRjaGVyKSB7XG4gICAgICAgIHRoaXMubWF0Y2hlclBsYWNlaG9sZGVyc1twbGFjZWhvbGRlcl0gPSBtYXRjaGVyO1xuICAgIH07XG4gICAgRGVsdGFDb250YWluZXIucHJvdG90eXBlLmxpc3RlbiA9IGZ1bmN0aW9uIChzZWdtZW50cywgY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIHJ1bGVzO1xuICAgICAgICBpZiAodHlwZW9mIChzZWdtZW50cykgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgcnVsZXMgPSBbXTtcbiAgICAgICAgICAgIGNhbGxiYWNrID0gc2VnbWVudHM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBydWxlcyA9IHNlZ21lbnRzLnNwbGl0KFwiL1wiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2FsbGJhY2subGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKFwiLmxpc3RlbigpIGFjY2VwdHMgb25seSBvbmUgcGFyYW1ldGVyLlwiKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbGlzdGVuZXIgPSB7XG4gICAgICAgICAgICBjYWxsYmFjazogY2FsbGJhY2ssXG4gICAgICAgICAgICByYXdSdWxlczogcnVsZXMsXG4gICAgICAgICAgICBydWxlczogcnVsZXMubWFwKGZ1bmN0aW9uIChzZWdtZW50KSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiAoc2VnbWVudCkgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gcmVwbGFjZSBwbGFjZWhvbGRlciBtYXRjaGVyc1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHNlZ21lbnQuaW5kZXhPZihcIjpcIikgPT09IDApXG4gICAgICAgICAgICAgICAgICAgICAgICA/IF90aGlzLm1hdGNoZXJQbGFjZWhvbGRlcnNbc2VnbWVudF0gfHwgX3RoaXMubWF0Y2hlclBsYWNlaG9sZGVyc1tcIjoqXCJdXG4gICAgICAgICAgICAgICAgICAgICAgICA6IG5ldyBSZWdFeHAoXCJeXCIgKyBzZWdtZW50ICsgXCIkXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlZ21lbnQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHJ1bGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5kZWZhdWx0TGlzdGVuZXIgPSBsaXN0ZW5lcjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsaXN0ZW5lcjtcbiAgICB9O1xuICAgIERlbHRhQ29udGFpbmVyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lciA9IGZ1bmN0aW9uIChsaXN0ZW5lcikge1xuICAgICAgICBmb3IgKHZhciBpID0gdGhpcy5saXN0ZW5lcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmxpc3RlbmVyc1tpXSA9PT0gbGlzdGVuZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxpc3RlbmVycy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIERlbHRhQ29udGFpbmVyLnByb3RvdHlwZS5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICB9O1xuICAgIERlbHRhQ29udGFpbmVyLnByb3RvdHlwZS5jaGVja1BhdGNoZXMgPSBmdW5jdGlvbiAocGF0Y2hlcykge1xuICAgICAgICBmb3IgKHZhciBpID0gcGF0Y2hlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgdmFyIG1hdGNoZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGZvciAodmFyIGogPSAwLCBsZW4gPSB0aGlzLmxpc3RlbmVycy5sZW5ndGg7IGogPCBsZW47IGorKykge1xuICAgICAgICAgICAgICAgIHZhciBsaXN0ZW5lciA9IHRoaXMubGlzdGVuZXJzW2pdO1xuICAgICAgICAgICAgICAgIHZhciBwYXRoVmFyaWFibGVzID0gdGhpcy5nZXRQYXRoVmFyaWFibGVzKHBhdGNoZXNbaV0sIGxpc3RlbmVyKTtcbiAgICAgICAgICAgICAgICBpZiAocGF0aFZhcmlhYmxlcykge1xuICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci5jYWxsYmFjayh7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiBwYXRoVmFyaWFibGVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmF3UGF0aDogcGF0Y2hlc1tpXS5wYXRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uOiBwYXRjaGVzW2ldLm9wZXJhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBwYXRjaGVzW2ldLnZhbHVlXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBtYXRjaGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBjaGVjayBmb3IgZmFsbGJhY2sgbGlzdGVuZXJcbiAgICAgICAgICAgIGlmICghbWF0Y2hlZCAmJiB0aGlzLmRlZmF1bHRMaXN0ZW5lcikge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdExpc3RlbmVyLmNhbGxiYWNrKHBhdGNoZXNbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBEZWx0YUNvbnRhaW5lci5wcm90b3R5cGUuZ2V0UGF0aFZhcmlhYmxlcyA9IGZ1bmN0aW9uIChwYXRjaCwgbGlzdGVuZXIpIHtcbiAgICAgICAgLy8gc2tpcCBpZiBydWxlcyBjb3VudCBkaWZmZXIgZnJvbSBwYXRjaFxuICAgICAgICBpZiAocGF0Y2gucGF0aC5sZW5ndGggIT09IGxpc3RlbmVyLnJ1bGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHZhciBwYXRoID0ge307XG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBsaXN0ZW5lci5ydWxlcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgdmFyIG1hdGNoZXMgPSBwYXRjaC5wYXRoW2ldLm1hdGNoKGxpc3RlbmVyLnJ1bGVzW2ldKTtcbiAgICAgICAgICAgIGlmICghbWF0Y2hlcyB8fCBtYXRjaGVzLmxlbmd0aCA9PT0gMCB8fCBtYXRjaGVzLmxlbmd0aCA+IDIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChsaXN0ZW5lci5yYXdSdWxlc1tpXS5zdWJzdHIoMCwgMSkgPT09IFwiOlwiKSB7XG4gICAgICAgICAgICAgICAgcGF0aFtsaXN0ZW5lci5yYXdSdWxlc1tpXS5zdWJzdHIoMSldID0gbWF0Y2hlc1sxXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGF0aDtcbiAgICB9O1xuICAgIERlbHRhQ29udGFpbmVyLnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5saXN0ZW5lcnMgPSBbXTtcbiAgICB9O1xuICAgIHJldHVybiBEZWx0YUNvbnRhaW5lcjtcbn0oKSk7XG5leHBvcnRzLkRlbHRhQ29udGFpbmVyID0gRGVsdGFDb250YWluZXI7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9kZWx0YS1saXN0ZW5lci9saWIvRGVsdGFDb250YWluZXIuanNcbi8vIG1vZHVsZSBpZCA9IDIzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZnVuY3Rpb24gY29tcGFyZSh0cmVlMSwgdHJlZTIpIHtcbiAgICB2YXIgcGF0Y2hlcyA9IFtdO1xuICAgIGdlbmVyYXRlKHRyZWUxLCB0cmVlMiwgcGF0Y2hlcywgW10pO1xuICAgIHJldHVybiBwYXRjaGVzO1xufVxuZXhwb3J0cy5jb21wYXJlID0gY29tcGFyZTtcbmZ1bmN0aW9uIGNvbmNhdChhcnIsIHZhbHVlKSB7XG4gICAgdmFyIG5ld0FyciA9IGFyci5zbGljZSgpO1xuICAgIG5ld0Fyci5wdXNoKHZhbHVlKTtcbiAgICByZXR1cm4gbmV3QXJyO1xufVxuZnVuY3Rpb24gb2JqZWN0S2V5cyhvYmopIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgICAgIHZhciBrZXlzXzEgPSBuZXcgQXJyYXkob2JqLmxlbmd0aCk7XG4gICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwga2V5c18xLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICBrZXlzXzFba10gPSBcIlwiICsgaztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ga2V5c18xO1xuICAgIH1cbiAgICBpZiAoT2JqZWN0LmtleXMpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKG9iaik7XG4gICAgfVxuICAgIHZhciBrZXlzID0gW107XG4gICAgZm9yICh2YXIgaSBpbiBvYmopIHtcbiAgICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShpKSkge1xuICAgICAgICAgICAga2V5cy5wdXNoKGkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBrZXlzO1xufVxuO1xuLy8gRGlydHkgY2hlY2sgaWYgb2JqIGlzIGRpZmZlcmVudCBmcm9tIG1pcnJvciwgZ2VuZXJhdGUgcGF0Y2hlcyBhbmQgdXBkYXRlIG1pcnJvclxuZnVuY3Rpb24gZ2VuZXJhdGUobWlycm9yLCBvYmosIHBhdGNoZXMsIHBhdGgpIHtcbiAgICB2YXIgbmV3S2V5cyA9IG9iamVjdEtleXMob2JqKTtcbiAgICB2YXIgb2xkS2V5cyA9IG9iamVjdEtleXMobWlycm9yKTtcbiAgICB2YXIgY2hhbmdlZCA9IGZhbHNlO1xuICAgIHZhciBkZWxldGVkID0gZmFsc2U7XG4gICAgZm9yICh2YXIgdCA9IG9sZEtleXMubGVuZ3RoIC0gMTsgdCA+PSAwOyB0LS0pIHtcbiAgICAgICAgdmFyIGtleSA9IG9sZEtleXNbdF07XG4gICAgICAgIHZhciBvbGRWYWwgPSBtaXJyb3Jba2V5XTtcbiAgICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrZXkpICYmICEob2JqW2tleV0gPT09IHVuZGVmaW5lZCAmJiBvbGRWYWwgIT09IHVuZGVmaW5lZCAmJiBBcnJheS5pc0FycmF5KG9iaikgPT09IGZhbHNlKSkge1xuICAgICAgICAgICAgdmFyIG5ld1ZhbCA9IG9ialtrZXldO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBvbGRWYWwgPT0gXCJvYmplY3RcIiAmJiBvbGRWYWwgIT0gbnVsbCAmJiB0eXBlb2YgbmV3VmFsID09IFwib2JqZWN0XCIgJiYgbmV3VmFsICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBnZW5lcmF0ZShvbGRWYWwsIG5ld1ZhbCwgcGF0Y2hlcywgY29uY2F0KHBhdGgsIGtleSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKG9sZFZhbCAhPT0gbmV3VmFsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBwYXRjaGVzLnB1c2goeyBvcGVyYXRpb246IFwicmVwbGFjZVwiLCBwYXRoOiBjb25jYXQocGF0aCwga2V5KSwgdmFsdWU6IG5ld1ZhbCB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBwYXRjaGVzLnB1c2goeyBvcGVyYXRpb246IFwicmVtb3ZlXCIsIHBhdGg6IGNvbmNhdChwYXRoLCBrZXkpIH0pO1xuICAgICAgICAgICAgZGVsZXRlZCA9IHRydWU7IC8vIHByb3BlcnR5IGhhcyBiZWVuIGRlbGV0ZWRcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWRlbGV0ZWQgJiYgbmV3S2V5cy5sZW5ndGggPT0gb2xkS2V5cy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKHZhciB0ID0gMDsgdCA8IG5ld0tleXMubGVuZ3RoOyB0KyspIHtcbiAgICAgICAgdmFyIGtleSA9IG5ld0tleXNbdF07XG4gICAgICAgIGlmICghbWlycm9yLmhhc093blByb3BlcnR5KGtleSkgJiYgb2JqW2tleV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdmFyIG5ld1ZhbCA9IG9ialtrZXldO1xuICAgICAgICAgICAgdmFyIGFkZFBhdGggPSBjb25jYXQocGF0aCwga2V5KTtcbiAgICAgICAgICAgIC8vIGNvbXBhcmUgZGVlcGVyIGFkZGl0aW9uc1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBuZXdWYWwgPT0gXCJvYmplY3RcIiAmJiBuZXdWYWwgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGdlbmVyYXRlKHt9LCBuZXdWYWwsIHBhdGNoZXMsIGFkZFBhdGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGF0Y2hlcy5wdXNoKHsgb3BlcmF0aW9uOiBcImFkZFwiLCBwYXRoOiBhZGRQYXRoLCB2YWx1ZTogbmV3VmFsIH0pO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvZGVsdGEtbGlzdGVuZXIvbGliL2NvbXBhcmUuanNcbi8vIG1vZHVsZSBpZCA9IDI0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIEZvc3NpbCBTQ00gZGVsdGEgY29tcHJlc3Npb24gYWxnb3JpdGhtXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy9cbi8vIEZvcm1hdDpcbi8vIGh0dHA6Ly93d3cuZm9zc2lsLXNjbS5vcmcvaW5kZXguaHRtbC9kb2MvdGlwL3d3dy9kZWx0YV9mb3JtYXQud2lraVxuLy9cbi8vIEFsZ29yaXRobTpcbi8vIGh0dHA6Ly93d3cuZm9zc2lsLXNjbS5vcmcvaW5kZXguaHRtbC9kb2MvdGlwL3d3dy9kZWx0YV9lbmNvZGVyX2FsZ29yaXRobS53aWtpXG4vL1xuLy8gT3JpZ2luYWwgaW1wbGVtZW50YXRpb246XG4vLyBodHRwOi8vd3d3LmZvc3NpbC1zY20ub3JnL2luZGV4Lmh0bWwvYXJ0aWZhY3QvZDFiMDU5OGFkY2Q2NTBiMzU1MWY2M2IxN2RmYzg2NGU3Mzc3NWMzZFxuLy9cbi8vIExJQ0VOU0Vcbi8vIC0tLS0tLS1cbi8vXG4vLyBDb3B5cmlnaHQgMjAxNCBEbWl0cnkgQ2hlc3RueWtoIChKYXZhU2NyaXB0IHBvcnQpXG4vLyBDb3B5cmlnaHQgMjAwNyBELiBSaWNoYXJkIEhpcHAgIChvcmlnaW5hbCBDIHZlcnNpb24pXG4vLyBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy9cbi8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Jcbi8vIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuLy9cbi8vICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZVxuLy8gICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlXG4vLyAgICAgIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuLy9cbi8vICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZVxuLy8gICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlXG4vLyAgICAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlclxuLy8gICAgICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuLy9cbi8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUlMgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRURcbi8vIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuLy8gQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPTlRSSUJVVE9SUyBCRVxuLy8gTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuLy8gQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0Zcbi8vIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUlxuLy8gQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksXG4vLyBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRVxuLy8gT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSxcbi8vIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4vL1xuLy8gVGhlIHZpZXdzIGFuZCBjb25jbHVzaW9ucyBjb250YWluZWQgaW4gdGhlIHNvZnR3YXJlIGFuZCBkb2N1bWVudGF0aW9uXG4vLyBhcmUgdGhvc2Ugb2YgdGhlIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycyBhbmQgc2hvdWxkIG5vdCBiZSBpbnRlcnByZXRlZFxuLy8gYXMgcmVwcmVzZW50aW5nIG9mZmljaWFsIHBvbGljaWVzLCBlaXRoZXIgZXhwcmVzc2VkIG9yIGltcGxpZWQsIG9mIGFueWJvZHlcbi8vIGVsc2UuXG4vL1xuKGZ1bmN0aW9uKHJvb3QsIGZhY3RvcnkpIHtcbiAgaWYgKHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnICYmIG1vZHVsZS5leHBvcnRzKSBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcbiAgZWxzZSByb290LmZvc3NpbERlbHRhID0gZmFjdG9yeSgpO1xufSkodGhpcywgZnVuY3Rpb24oKSB7XG4ndXNlIHN0cmljdCc7XG5cbnZhciBmb3NzaWxEZWx0YSA9IHt9O1xuXG4vLyBIYXNoIHdpbmRvdyB3aWR0aCBpbiBieXRlcy4gTXVzdCBiZSBhIHBvd2VyIG9mIHR3by5cbnZhciBOSEFTSCA9IDE2O1xuXG5mdW5jdGlvbiBSb2xsaW5nSGFzaCgpIHtcbiAgdGhpcy5hID0gMDsgLy8gaGFzaCAgICAgKDE2LWJpdCB1bnNpZ25lZClcbiAgdGhpcy5iID0gMDsgLy8gdmFsdWVzICAgKDE2LWJpdCB1bnNpZ25lZClcbiAgdGhpcy5pID0gMDsgLy8gc3RhcnQgb2YgdGhlIGhhc2ggd2luZG93ICgxNi1iaXQgdW5zaWduZWQpXG4gIHRoaXMueiA9IG5ldyBBcnJheShOSEFTSCk7IC8vIHRoZSB2YWx1ZXMgdGhhdCBoYXZlIGJlZW4gaGFzaGVkLlxufVxuXG4vLyBJbml0aWFsaXplIHRoZSByb2xsaW5nIGhhc2ggdXNpbmcgdGhlIGZpcnN0IE5IQVNIIGJ5dGVzIG9mXG4vLyB6IGF0IHRoZSBnaXZlbiBwb3NpdGlvbi5cblJvbGxpbmdIYXNoLnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24oeiwgcG9zKSB7XG4gIHZhciBhID0gMCwgYiA9IDAsIGksIHg7XG4gIGZvcihpID0gMDsgaSA8IE5IQVNIOyBpKyspe1xuICAgIHggPSB6W3BvcytpXTtcbiAgICBhID0gKGEgKyB4KSAmIDB4ZmZmZjtcbiAgICBiID0gKGIgKyAoTkhBU0gtaSkqeCkgJiAweGZmZmY7XG4gICAgdGhpcy56W2ldID0geDtcbiAgfVxuICB0aGlzLmEgPSBhICYgMHhmZmZmO1xuICB0aGlzLmIgPSBiICYgMHhmZmZmO1xuICB0aGlzLmkgPSAwO1xufTtcblxuLy8gQWR2YW5jZSB0aGUgcm9sbGluZyBoYXNoIGJ5IGEgc2luZ2xlIGJ5dGUgXCJjXCIuXG5Sb2xsaW5nSGFzaC5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uKGMpIHtcbiAgdmFyIG9sZCA9IHRoaXMuelt0aGlzLmldO1xuICB0aGlzLnpbdGhpcy5pXSA9IGM7XG4gIHRoaXMuaSA9ICh0aGlzLmkrMSkmKE5IQVNILTEpO1xuICB0aGlzLmEgPSAodGhpcy5hIC0gb2xkICsgYykgJiAweGZmZmY7XG4gIHRoaXMuYiA9ICh0aGlzLmIgLSBOSEFTSCpvbGQgKyB0aGlzLmEpICYgMHhmZmZmO1xufTtcblxuLy8gUmV0dXJuIGEgMzItYml0IGhhc2ggdmFsdWUuXG5Sb2xsaW5nSGFzaC5wcm90b3R5cGUudmFsdWUgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuICgodGhpcy5hICYgMHhmZmZmKSB8ICh0aGlzLmIgJiAweGZmZmYpPDwxNik+Pj4wO1xufTtcblxudmFyIHpEaWdpdHMgPSBcIjAxMjM0NTY3ODlBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5en5cIi5cbiAgICAgICAgICAgICAgICBzcGxpdCgnJykubWFwKGZ1bmN0aW9uICh4KSB7IHJldHVybiB4LmNoYXJDb2RlQXQoMCk7IH0pO1xuXG52YXIgelZhbHVlID0gW1xuICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLFxuICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLFxuICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLFxuICAgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsICAgIDgsICA5LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLFxuICAtMSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsICAgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LFxuICAyNSwgMjYsIDI3LCAyOCwgMjksIDMwLCAzMSwgMzIsICAgMzMsIDM0LCAzNSwgLTEsIC0xLCAtMSwgLTEsIDM2LFxuICAtMSwgMzcsIDM4LCAzOSwgNDAsIDQxLCA0MiwgNDMsICAgNDQsIDQ1LCA0NiwgNDcsIDQ4LCA0OSwgNTAsIDUxLFxuICA1MiwgNTMsIDU0LCA1NSwgNTYsIDU3LCA1OCwgNTksICAgNjAsIDYxLCA2MiwgLTEsIC0xLCAtMSwgNjMsIC0xXG5dO1xuXG4vLyBSZWFkZXIgcmVhZHMgYnl0ZXMsIGNoYXJzLCBpbnRzIGZyb20gYXJyYXkuXG5mdW5jdGlvbiBSZWFkZXIoYXJyYXkpIHtcbiAgdGhpcy5hID0gYXJyYXk7IC8vIHNvdXJjZSBhcnJheVxuICB0aGlzLnBvcyA9IDA7ICAgLy8gY3VycmVudCBwb3NpdGlvbiBpbiBhcnJheVxufVxuXG5SZWFkZXIucHJvdG90eXBlLmhhdmVCeXRlcyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5wb3MgPCB0aGlzLmEubGVuZ3RoO1xufTtcblxuUmVhZGVyLnByb3RvdHlwZS5nZXRCeXRlID0gZnVuY3Rpb24oKSB7XG4gIHZhciBiID0gdGhpcy5hW3RoaXMucG9zXTtcbiAgdGhpcy5wb3MrKztcbiAgaWYgKHRoaXMucG9zID4gdGhpcy5hLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ291dCBvZiBib3VuZHMnKTtcbiAgcmV0dXJuIGI7XG59O1xuXG5SZWFkZXIucHJvdG90eXBlLmdldENoYXIgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUodGhpcy5nZXRCeXRlKCkpO1xufTtcblxuLy8gUmVhZCBiYXNlNjQtZW5jb2RlZCB1bnNpZ25lZCBpbnRlZ2VyLlxuUmVhZGVyLnByb3RvdHlwZS5nZXRJbnQgPSBmdW5jdGlvbigpe1xuICB2YXIgdiA9IDAsIGM7XG4gIHdoaWxlKHRoaXMuaGF2ZUJ5dGVzKCkgJiYgKGMgPSB6VmFsdWVbMHg3ZiAmIHRoaXMuZ2V0Qnl0ZSgpXSkgPj0gMCkge1xuICAgICB2ID0gKHY8PDYpICsgYztcbiAgfVxuICB0aGlzLnBvcy0tO1xuICByZXR1cm4gdiA+Pj4gMDtcbn07XG5cblxuLy8gV3JpdGUgd3JpdGVzIGFuIGFycmF5LlxuZnVuY3Rpb24gV3JpdGVyKCkge1xuICB0aGlzLmEgPSBbXTtcbn1cblxuV3JpdGVyLnByb3RvdHlwZS50b0FycmF5ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLmE7XG59O1xuXG5Xcml0ZXIucHJvdG90eXBlLnB1dEJ5dGUgPSBmdW5jdGlvbihiKSB7XG4gIHRoaXMuYS5wdXNoKGIgJiAweGZmKTtcbn07XG5cbi8vIFdyaXRlIGFuIEFTQ0lJIGNoYXJhY3RlciAocyBpcyBhIG9uZS1jaGFyIHN0cmluZykuXG5Xcml0ZXIucHJvdG90eXBlLnB1dENoYXIgPSBmdW5jdGlvbihzKSB7XG4gIHRoaXMucHV0Qnl0ZShzLmNoYXJDb2RlQXQoMCkpO1xufTtcblxuLy8gV3JpdGUgYSBiYXNlNjQgdW5zaWduZWQgaW50ZWdlci5cbldyaXRlci5wcm90b3R5cGUucHV0SW50ID0gZnVuY3Rpb24odil7XG4gIHZhciBpLCBqLCB6QnVmID0gW107XG4gIGlmICh2ID09PSAwKSB7XG4gICAgdGhpcy5wdXRDaGFyKCcwJyk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGZvciAoaSA9IDA7IHYgPiAwOyBpKyssIHYgPj4+PSA2KVxuICAgIHpCdWYucHVzaCh6RGlnaXRzW3YmMHgzZl0pO1xuICBmb3IgKGogPSBpLTE7IGogPj0gMDsgai0tKVxuICAgIHRoaXMucHV0Qnl0ZSh6QnVmW2pdKTtcbn07XG5cbi8vIENvcHkgZnJvbSBhcnJheSBhdCBzdGFydCB0byBlbmQuXG5Xcml0ZXIucHJvdG90eXBlLnB1dEFycmF5ID0gZnVuY3Rpb24oYSwgc3RhcnQsIGVuZCkge1xuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykgdGhpcy5hLnB1c2goYVtpXSk7XG59O1xuXG4vLyBSZXR1cm4gdGhlIG51bWJlciBkaWdpdHMgaW4gdGhlIGJhc2U2NCByZXByZXNlbnRhdGlvbiBvZiBhIHBvc2l0aXZlIGludGVnZXIuXG5mdW5jdGlvbiBkaWdpdENvdW50KHYpe1xuICB2YXIgaSwgeDtcbiAgZm9yIChpID0gMSwgeCA9IDY0OyB2ID49IHg7IGkrKywgeCA8PD0gNil7IC8qIG5vdGhpbmcgKi8gfVxuICByZXR1cm4gaTtcbn1cblxuLy8gUmV0dXJuIGEgMzItYml0IGNoZWNrc3VtIG9mIHRoZSBhcnJheS5cbmZ1bmN0aW9uIGNoZWNrc3VtKGFycikge1xuICB2YXIgc3VtMCA9IDAsIHN1bTEgPSAwLCBzdW0yID0gMCwgc3VtMyA9IDAsXG4gICAgICB6ID0gMCwgTiA9IGFyci5sZW5ndGg7XG4gIC8vVE9ETyBtZWFzdXJlIGlmIHRoaXMgdW5yb2xsaW5nIGlzIGhlbHBmdWwuXG4gIHdoaWxlIChOID49IDE2KSB7XG4gICAgc3VtMCA9IHN1bTAgKyBhcnJbeiswXSB8IDA7XG4gICAgc3VtMSA9IHN1bTEgKyBhcnJbeisxXSB8IDA7XG4gICAgc3VtMiA9IHN1bTIgKyBhcnJbeisyXSB8IDA7XG4gICAgc3VtMyA9IHN1bTMgKyBhcnJbeiszXSB8IDA7XG5cbiAgICBzdW0wID0gc3VtMCArIGFyclt6KzRdIHwgMDtcbiAgICBzdW0xID0gc3VtMSArIGFyclt6KzVdIHwgMDtcbiAgICBzdW0yID0gc3VtMiArIGFyclt6KzZdIHwgMDtcbiAgICBzdW0zID0gc3VtMyArIGFyclt6KzddIHwgMDtcblxuICAgIHN1bTAgPSBzdW0wICsgYXJyW3orOF0gfCAwO1xuICAgIHN1bTEgPSBzdW0xICsgYXJyW3orOV0gfCAwO1xuICAgIHN1bTIgPSBzdW0yICsgYXJyW3orMTBdIHwgMDtcbiAgICBzdW0zID0gc3VtMyArIGFyclt6KzExXSB8IDA7XG5cbiAgICBzdW0wID0gc3VtMCArIGFyclt6KzEyXSB8IDA7XG4gICAgc3VtMSA9IHN1bTEgKyBhcnJbeisxM10gfCAwO1xuICAgIHN1bTIgPSBzdW0yICsgYXJyW3orMTRdIHwgMDtcbiAgICBzdW0zID0gc3VtMyArIGFyclt6KzE1XSB8IDA7XG5cbiAgICB6ICs9IDE2O1xuICAgIE4gLT0gMTY7XG4gIH1cbiAgd2hpbGUgKE4gPj0gNCkge1xuICAgIHN1bTAgPSBzdW0wICsgYXJyW3orMF0gfCAwO1xuICAgIHN1bTEgPSBzdW0xICsgYXJyW3orMV0gfCAwO1xuICAgIHN1bTIgPSBzdW0yICsgYXJyW3orMl0gfCAwO1xuICAgIHN1bTMgPSBzdW0zICsgYXJyW3orM10gfCAwO1xuICAgIHogKz0gNDtcbiAgICBOIC09IDQ7XG4gIH1cbiAgc3VtMyA9ICgoKHN1bTMgKyAoc3VtMiA8PCA4KSB8IDApICsgKHN1bTEgPDwgMTYpIHwgMCkgKyAoc3VtMCA8PCAyNCkgfCAwKTtcbiAgLyoganNoaW50IC1XMDg2ICovXG4gIHN3aXRjaCAoTikge1xuICAgIGNhc2UgMzogc3VtMyA9IHN1bTMgKyAoYXJyW3orMl0gPDwgIDgpIHwgMDsgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgMjogc3VtMyA9IHN1bTMgKyAoYXJyW3orMV0gPDwgMTYpIHwgMDsgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgMTogc3VtMyA9IHN1bTMgKyAoYXJyW3orMF0gPDwgMjQpIHwgMDsgLyogZmFsbHMgdGhyb3VnaCAqL1xuICB9XG4gIHJldHVybiBzdW0zID4+PiAwO1xufVxuXG4vLyBDcmVhdGUgYSBuZXcgZGVsdGEgZnJvbSBzcmMgdG8gb3V0LlxuZm9zc2lsRGVsdGEuY3JlYXRlID0gZnVuY3Rpb24oc3JjLCBvdXQpIHtcbiAgdmFyIHpEZWx0YSA9IG5ldyBXcml0ZXIoKTtcbiAgdmFyIGxlbk91dCA9IG91dC5sZW5ndGg7XG4gIHZhciBsZW5TcmMgPSBzcmMubGVuZ3RoO1xuICB2YXIgaSwgbGFzdFJlYWQgPSAtMTtcblxuICB6RGVsdGEucHV0SW50KGxlbk91dCk7XG4gIHpEZWx0YS5wdXRDaGFyKCdcXG4nKTtcblxuICAvLyBJZiB0aGUgc291cmNlIGlzIHZlcnkgc21hbGwsIGl0IG1lYW5zIHRoYXQgd2UgaGF2ZSBub1xuICAvLyBjaGFuY2Ugb2YgZXZlciBkb2luZyBhIGNvcHkgY29tbWFuZC4gIEp1c3Qgb3V0cHV0IGEgc2luZ2xlXG4gIC8vIGxpdGVyYWwgc2VnbWVudCBmb3IgdGhlIGVudGlyZSB0YXJnZXQgYW5kIGV4aXQuXG4gIGlmIChsZW5TcmMgPD0gTkhBU0gpIHtcbiAgICB6RGVsdGEucHV0SW50KGxlbk91dCk7XG4gICAgekRlbHRhLnB1dENoYXIoJzonKTtcbiAgICB6RGVsdGEucHV0QXJyYXkob3V0LCAwLCBsZW5PdXQpO1xuICAgIHpEZWx0YS5wdXRJbnQoY2hlY2tzdW0ob3V0KSk7XG4gICAgekRlbHRhLnB1dENoYXIoJzsnKTtcbiAgICByZXR1cm4gekRlbHRhLnRvQXJyYXkoKTtcbiAgfVxuXG4gIC8vIENvbXB1dGUgdGhlIGhhc2ggdGFibGUgdXNlZCB0byBsb2NhdGUgbWF0Y2hpbmcgc2VjdGlvbnMgaW4gdGhlIHNvdXJjZS5cbiAgdmFyIG5IYXNoID0gTWF0aC5jZWlsKGxlblNyYyAvIE5IQVNIKTtcbiAgdmFyIGNvbGxpZGUgPSAgbmV3IEFycmF5KG5IYXNoKTtcbiAgdmFyIGxhbmRtYXJrID0gbmV3IEFycmF5KG5IYXNoKTtcbiAgZm9yIChpID0gMDsgaSA8IGNvbGxpZGUubGVuZ3RoOyBpKyspIGNvbGxpZGVbaV0gPSAtMTtcbiAgZm9yIChpID0gMDsgaSA8IGxhbmRtYXJrLmxlbmd0aDsgaSsrKSBsYW5kbWFya1tpXSA9IC0xO1xuICB2YXIgaHYsIGggPSBuZXcgUm9sbGluZ0hhc2goKTtcbiAgZm9yIChpID0gMDsgaSA8IGxlblNyYy1OSEFTSDsgaSArPSBOSEFTSCkge1xuICAgIGguaW5pdChzcmMsIGkpO1xuICAgIGh2ID0gaC52YWx1ZSgpICUgbkhhc2g7XG4gICAgY29sbGlkZVtpL05IQVNIXSA9IGxhbmRtYXJrW2h2XTtcbiAgICBsYW5kbWFya1todl0gPSBpL05IQVNIO1xuICB9XG5cbiAgdmFyIGJhc2UgPSAwO1xuICB2YXIgaVNyYywgaUJsb2NrLCBiZXN0Q250LCBiZXN0T2ZzdCwgYmVzdExpdHN6O1xuICB3aGlsZSAoYmFzZStOSEFTSDxsZW5PdXQpIHtcbiAgICBiZXN0T2ZzdD0wO1xuICAgIGJlc3RMaXRzej0wO1xuICAgIGguaW5pdChvdXQsIGJhc2UpO1xuICAgIGkgPSAwOyAvLyBUcnlpbmcgdG8gbWF0Y2ggYSBsYW5kbWFyayBhZ2FpbnN0IHpPdXRbYmFzZStpXVxuICAgIGJlc3RDbnQgPSAwO1xuICAgIHdoaWxlKDEpIHtcbiAgICAgIHZhciBsaW1pdCA9IDI1MDtcbiAgICAgIGh2ID0gaC52YWx1ZSgpICUgbkhhc2g7XG4gICAgICBpQmxvY2sgPSBsYW5kbWFya1todl07XG4gICAgICB3aGlsZSAoaUJsb2NrID49IDAgJiYgKGxpbWl0LS0pPjAgKSB7XG4gICAgICAgIC8vXG4gICAgICAgIC8vIFRoZSBoYXNoIHdpbmRvdyBoYXMgaWRlbnRpZmllZCBhIHBvdGVudGlhbCBtYXRjaCBhZ2FpbnN0XG4gICAgICAgIC8vIGxhbmRtYXJrIGJsb2NrIGlCbG9jay4gIEJ1dCB3ZSBuZWVkIHRvIGludmVzdGlnYXRlIGZ1cnRoZXIuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIExvb2sgZm9yIGEgcmVnaW9uIGluIHpPdXQgdGhhdCBtYXRjaGVzIHpTcmMuIEFuY2hvciB0aGUgc2VhcmNoXG4gICAgICAgIC8vIGF0IHpTcmNbaVNyY10gYW5kIHpPdXRbYmFzZStpXS4gIERvIG5vdCBpbmNsdWRlIGFueXRoaW5nIHByaW9yIHRvXG4gICAgICAgIC8vIHpPdXRbYmFzZV0gb3IgYWZ0ZXIgek91dFtvdXRMZW5dIG5vciBhbnl0aGluZyBhZnRlciB6U3JjW3NyY0xlbl0uXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFNldCBjbnQgZXF1YWwgdG8gdGhlIGxlbmd0aCBvZiB0aGUgbWF0Y2ggYW5kIHNldCBvZnN0IHNvIHRoYXRcbiAgICAgICAgLy8gelNyY1tvZnN0XSBpcyB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgbWF0Y2guICBsaXRzeiBpcyB0aGUgbnVtYmVyXG4gICAgICAgIC8vIG9mIGNoYXJhY3RlcnMgYmV0d2VlbiB6T3V0W2Jhc2VdIGFuZCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBtYXRjaC5cbiAgICAgICAgLy8gc3ogd2lsbCBiZSB0aGUgb3ZlcmhlYWQgKGluIGJ5dGVzKSBuZWVkZWQgdG8gZW5jb2RlIHRoZSBjb3B5XG4gICAgICAgIC8vIGNvbW1hbmQuICBPbmx5IGdlbmVyYXRlIGNvcHkgY29tbWFuZCBpZiB0aGUgb3ZlcmhlYWQgb2YgdGhlXG4gICAgICAgIC8vIGNvcHkgY29tbWFuZCBpcyBsZXNzIHRoYW4gdGhlIGFtb3VudCBvZiBsaXRlcmFsIHRleHQgdG8gYmUgY29waWVkLlxuICAgICAgICAvL1xuICAgICAgICB2YXIgY250LCBvZnN0LCBsaXRzejtcbiAgICAgICAgdmFyIGosIGssIHgsIHk7XG4gICAgICAgIHZhciBzejtcblxuICAgICAgICAvLyBCZWdpbm5pbmcgYXQgaVNyYywgbWF0Y2ggZm9yd2FyZHMgYXMgZmFyIGFzIHdlIGNhbi5cbiAgICAgICAgLy8gaiBjb3VudHMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRoYXQgbWF0Y2guXG4gICAgICAgIGlTcmMgPSBpQmxvY2sqTkhBU0g7XG4gICAgICAgIGZvciAoaiA9IDAsIHggPSBpU3JjLCB5ID0gYmFzZStpOyB4IDwgbGVuU3JjICYmIHkgPCBsZW5PdXQ7IGorKywgeCsrLCB5KyspIHtcbiAgICAgICAgICBpZiAoc3JjW3hdICE9PSBvdXRbeV0pIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGotLTtcblxuICAgICAgICAvLyBCZWdpbm5pbmcgYXQgaVNyYy0xLCBtYXRjaCBiYWNrd2FyZHMgYXMgZmFyIGFzIHdlIGNhbi5cbiAgICAgICAgLy8gayBjb3VudHMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRoYXQgbWF0Y2guXG4gICAgICAgIGZvciAoayA9IDE7IGsgPCBpU3JjICYmIGsgPD0gaTsgaysrKSB7XG4gICAgICAgICAgaWYgKHNyY1tpU3JjLWtdICE9PSBvdXRbYmFzZStpLWtdKSBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBrLS07XG5cbiAgICAgICAgLy8gQ29tcHV0ZSB0aGUgb2Zmc2V0IGFuZCBzaXplIG9mIHRoZSBtYXRjaGluZyByZWdpb24uXG4gICAgICAgIG9mc3QgPSBpU3JjLWs7XG4gICAgICAgIGNudCA9IGoraysxO1xuICAgICAgICBsaXRzeiA9IGktazsgIC8vIE51bWJlciBvZiBieXRlcyBvZiBsaXRlcmFsIHRleHQgYmVmb3JlIHRoZSBjb3B5XG4gICAgICAgIC8vIHN6IHdpbGwgaG9sZCB0aGUgbnVtYmVyIG9mIGJ5dGVzIG5lZWRlZCB0byBlbmNvZGUgdGhlIFwiaW5zZXJ0XCJcbiAgICAgICAgLy8gY29tbWFuZCBhbmQgdGhlIGNvcHkgY29tbWFuZCwgbm90IGNvdW50aW5nIHRoZSBcImluc2VydFwiIHRleHQuXG4gICAgICAgIHN6ID0gZGlnaXRDb3VudChpLWspK2RpZ2l0Q291bnQoY250KStkaWdpdENvdW50KG9mc3QpKzM7XG4gICAgICAgIGlmIChjbnQgPj0gc3ogJiYgY250ID4gYmVzdENudCkge1xuICAgICAgICAgIC8vIFJlbWVtYmVyIHRoaXMgbWF0Y2ggb25seSBpZiBpdCBpcyB0aGUgYmVzdCBzbyBmYXIgYW5kIGl0XG4gICAgICAgICAgLy8gZG9lcyBub3QgaW5jcmVhc2UgdGhlIGZpbGUgc2l6ZS5cbiAgICAgICAgICBiZXN0Q250ID0gY250O1xuICAgICAgICAgIGJlc3RPZnN0ID0gaVNyYy1rO1xuICAgICAgICAgIGJlc3RMaXRzeiA9IGxpdHN6O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgdGhlIG5leHQgbWF0Y2hpbmcgYmxvY2tcbiAgICAgICAgaUJsb2NrID0gY29sbGlkZVtpQmxvY2tdO1xuICAgICAgfVxuXG4gICAgICAvLyBXZSBoYXZlIGEgY29weSBjb21tYW5kIHRoYXQgZG9lcyBub3QgY2F1c2UgdGhlIGRlbHRhIHRvIGJlIGxhcmdlclxuICAgICAgLy8gdGhhbiBhIGxpdGVyYWwgaW5zZXJ0LiAgU28gYWRkIHRoZSBjb3B5IGNvbW1hbmQgdG8gdGhlIGRlbHRhLlxuICAgICAgaWYgKGJlc3RDbnQgPiAwKSB7XG4gICAgICAgIGlmIChiZXN0TGl0c3ogPiAwKSB7XG4gICAgICAgICAgLy8gQWRkIGFuIGluc2VydCBjb21tYW5kIGJlZm9yZSB0aGUgY29weS5cbiAgICAgICAgICB6RGVsdGEucHV0SW50KGJlc3RMaXRzeik7XG4gICAgICAgICAgekRlbHRhLnB1dENoYXIoJzonKTtcbiAgICAgICAgICB6RGVsdGEucHV0QXJyYXkob3V0LCBiYXNlLCBiYXNlK2Jlc3RMaXRzeik7XG4gICAgICAgICAgYmFzZSArPSBiZXN0TGl0c3o7XG4gICAgICAgIH1cbiAgICAgICAgYmFzZSArPSBiZXN0Q250O1xuICAgICAgICB6RGVsdGEucHV0SW50KGJlc3RDbnQpO1xuICAgICAgICB6RGVsdGEucHV0Q2hhcignQCcpO1xuICAgICAgICB6RGVsdGEucHV0SW50KGJlc3RPZnN0KTtcbiAgICAgICAgekRlbHRhLnB1dENoYXIoJywnKTtcbiAgICAgICAgaWYgKGJlc3RPZnN0ICsgYmVzdENudCAtMSA+IGxhc3RSZWFkKSB7XG4gICAgICAgICAgbGFzdFJlYWQgPSBiZXN0T2ZzdCArIGJlc3RDbnQgLSAxO1xuICAgICAgICB9XG4gICAgICAgIGJlc3RDbnQgPSAwO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgLy8gSWYgd2UgcmVhY2ggdGhpcyBwb2ludCwgaXQgbWVhbnMgbm8gbWF0Y2ggaXMgZm91bmQgc28gZmFyXG4gICAgICBpZiAoYmFzZStpK05IQVNIID49IGxlbk91dCl7XG4gICAgICAgIC8vIFdlIGhhdmUgcmVhY2hlZCB0aGUgZW5kIGFuZCBoYXZlIG5vdCBmb3VuZCBhbnlcbiAgICAgICAgLy8gbWF0Y2hlcy4gIERvIGFuIFwiaW5zZXJ0XCIgZm9yIGV2ZXJ5dGhpbmcgdGhhdCBkb2VzIG5vdCBtYXRjaFxuICAgICAgICB6RGVsdGEucHV0SW50KGxlbk91dC1iYXNlKTtcbiAgICAgICAgekRlbHRhLnB1dENoYXIoJzonKTtcbiAgICAgICAgekRlbHRhLnB1dEFycmF5KG91dCwgYmFzZSwgYmFzZStsZW5PdXQtYmFzZSk7XG4gICAgICAgIGJhc2UgPSBsZW5PdXQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICAvLyBBZHZhbmNlIHRoZSBoYXNoIGJ5IG9uZSBjaGFyYWN0ZXIuIEtlZXAgbG9va2luZyBmb3IgYSBtYXRjaC5cbiAgICAgIGgubmV4dChvdXRbYmFzZStpK05IQVNIXSk7XG4gICAgICBpKys7XG4gICAgfVxuICB9XG4gIC8vIE91dHB1dCBhIGZpbmFsIFwiaW5zZXJ0XCIgcmVjb3JkIHRvIGdldCBhbGwgdGhlIHRleHQgYXQgdGhlIGVuZCBvZlxuICAvLyB0aGUgZmlsZSB0aGF0IGRvZXMgbm90IG1hdGNoIGFueXRoaW5nIGluIHRoZSBzb3VyY2UuXG4gIGlmKGJhc2UgPCBsZW5PdXQpIHtcbiAgICB6RGVsdGEucHV0SW50KGxlbk91dC1iYXNlKTtcbiAgICB6RGVsdGEucHV0Q2hhcignOicpO1xuICAgIHpEZWx0YS5wdXRBcnJheShvdXQsIGJhc2UsIGJhc2UrbGVuT3V0LWJhc2UpO1xuICB9XG4gIC8vIE91dHB1dCB0aGUgZmluYWwgY2hlY2tzdW0gcmVjb3JkLlxuICB6RGVsdGEucHV0SW50KGNoZWNrc3VtKG91dCkpO1xuICB6RGVsdGEucHV0Q2hhcignOycpO1xuICByZXR1cm4gekRlbHRhLnRvQXJyYXkoKTtcbn07XG5cbi8vIFJldHVybiB0aGUgc2l6ZSAoaW4gYnl0ZXMpIG9mIHRoZSBvdXRwdXQgZnJvbSBhcHBseWluZyBhIGRlbHRhLlxuZm9zc2lsRGVsdGEub3V0cHV0U2l6ZSA9IGZ1bmN0aW9uKGRlbHRhKXtcbiAgdmFyIHpEZWx0YSA9IG5ldyBSZWFkZXIoZGVsdGEpO1xuICB2YXIgc2l6ZSA9IHpEZWx0YS5nZXRJbnQoKTtcbiAgaWYgKHpEZWx0YS5nZXRDaGFyKCkgIT09ICdcXG4nKVxuICAgIHRocm93IG5ldyBFcnJvcignc2l6ZSBpbnRlZ2VyIG5vdCB0ZXJtaW5hdGVkIGJ5IFxcJ1xcXFxuXFwnJyk7XG4gIHJldHVybiBzaXplO1xufTtcblxuLy8gQXBwbHkgYSBkZWx0YS5cbmZvc3NpbERlbHRhLmFwcGx5ID0gZnVuY3Rpb24oc3JjLCBkZWx0YSwgb3B0cykge1xuICB2YXIgbGltaXQsIHRvdGFsID0gMDtcbiAgdmFyIHpEZWx0YSA9IG5ldyBSZWFkZXIoZGVsdGEpO1xuICB2YXIgbGVuU3JjID0gc3JjLmxlbmd0aDtcbiAgdmFyIGxlbkRlbHRhID0gZGVsdGEubGVuZ3RoO1xuXG4gIGxpbWl0ID0gekRlbHRhLmdldEludCgpO1xuICBpZiAoekRlbHRhLmdldENoYXIoKSAhPT0gJ1xcbicpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdzaXplIGludGVnZXIgbm90IHRlcm1pbmF0ZWQgYnkgXFwnXFxcXG5cXCcnKTtcbiAgdmFyIHpPdXQgPSBuZXcgV3JpdGVyKCk7XG4gIHdoaWxlKHpEZWx0YS5oYXZlQnl0ZXMoKSkge1xuICAgIHZhciBjbnQsIG9mc3Q7XG4gICAgY250ID0gekRlbHRhLmdldEludCgpO1xuXG4gICAgc3dpdGNoICh6RGVsdGEuZ2V0Q2hhcigpKSB7XG4gICAgICBjYXNlICdAJzpcbiAgICAgICAgb2ZzdCA9IHpEZWx0YS5nZXRJbnQoKTtcbiAgICAgICAgaWYgKHpEZWx0YS5oYXZlQnl0ZXMoKSAmJiB6RGVsdGEuZ2V0Q2hhcigpICE9PSAnLCcpXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb3B5IGNvbW1hbmQgbm90IHRlcm1pbmF0ZWQgYnkgXFwnLFxcJycpO1xuICAgICAgICB0b3RhbCArPSBjbnQ7XG4gICAgICAgIGlmICh0b3RhbCA+IGxpbWl0KVxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignY29weSBleGNlZWRzIG91dHB1dCBmaWxlIHNpemUnKTtcbiAgICAgICAgaWYgKG9mc3QrY250ID4gbGVuU3JjKVxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignY29weSBleHRlbmRzIHBhc3QgZW5kIG9mIGlucHV0Jyk7XG4gICAgICAgIHpPdXQucHV0QXJyYXkoc3JjLCBvZnN0LCBvZnN0K2NudCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICc6JzpcbiAgICAgICAgdG90YWwgKz0gY250O1xuICAgICAgICBpZiAodG90YWwgPiBsaW1pdClcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2luc2VydCBjb21tYW5kIGdpdmVzIGFuIG91dHB1dCBsYXJnZXIgdGhhbiBwcmVkaWN0ZWQnKTtcbiAgICAgICAgaWYgKGNudCA+IGxlbkRlbHRhKVxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaW5zZXJ0IGNvdW50IGV4Y2VlZHMgc2l6ZSBvZiBkZWx0YScpO1xuICAgICAgICB6T3V0LnB1dEFycmF5KHpEZWx0YS5hLCB6RGVsdGEucG9zLCB6RGVsdGEucG9zK2NudCk7XG4gICAgICAgIHpEZWx0YS5wb3MgKz0gY250O1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnOyc6XG4gICAgICAgIHZhciBvdXQgPSB6T3V0LnRvQXJyYXkoKTtcbiAgICAgICAgaWYgKCghb3B0cyB8fCBvcHRzLnZlcmlmeUNoZWNrc3VtICE9PSBmYWxzZSkgJiYgY250ICE9PSBjaGVja3N1bShvdXQpKVxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignYmFkIGNoZWNrc3VtJyk7XG4gICAgICAgIGlmICh0b3RhbCAhPT0gbGltaXQpXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdnZW5lcmF0ZWQgc2l6ZSBkb2VzIG5vdCBtYXRjaCBwcmVkaWN0ZWQgc2l6ZScpO1xuICAgICAgICByZXR1cm4gb3V0O1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Vua25vd24gZGVsdGEgb3BlcmF0b3InKTtcbiAgICB9XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKCd1bnRlcm1pbmF0ZWQgZGVsdGEnKTtcbn07XG5cbnJldHVybiBmb3NzaWxEZWx0YTtcblxufSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9mb3NzaWwtZGVsdGEvZm9zc2lsLWRlbHRhLmpzXG4vLyBtb2R1bGUgaWQgPSAyNVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2V4dGVuZHMgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxuICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XG4gICAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdOyB9O1xuICAgIHJldHVybiBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgICBleHRlbmRTdGF0aWNzKGQsIGIpO1xuICAgICAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgICAgICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xuICAgIH07XG59KSgpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIHdlYnNvY2tldF8xID0gcmVxdWlyZShcIkBnYW1lc3RkaW8vd2Vic29ja2V0XCIpO1xudmFyIG1zZ3BhY2sgPSByZXF1aXJlKFwibm90ZXBhY2suaW9cIik7XG52YXIgQ29ubmVjdGlvbiA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoQ29ubmVjdGlvbiwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBDb25uZWN0aW9uKHVybCwgcXVlcnkpIHtcbiAgICAgICAgaWYgKHF1ZXJ5ID09PSB2b2lkIDApIHsgcXVlcnkgPSB7fTsgfVxuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCB1cmwpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLl9lbnF1ZXVlZENhbGxzID0gW107XG4gICAgICAgIF90aGlzLmJpbmFyeVR5cGUgPSBcImFycmF5YnVmZmVyXCI7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgQ29ubmVjdGlvbi5wcm90b3R5cGUub25PcGVuQ2FsbGJhY2sgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgX3N1cGVyLnByb3RvdHlwZS5vbk9wZW5DYWxsYmFjay5jYWxsKHRoaXMpO1xuICAgICAgICBpZiAodGhpcy5fZW5xdWV1ZWRDYWxscy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX2VucXVldWVkQ2FsbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgX2EgPSB0aGlzLl9lbnF1ZXVlZENhbGxzW2ldLCBtZXRob2QgPSBfYVswXSwgYXJncyA9IF9hWzFdO1xuICAgICAgICAgICAgICAgIHRoaXNbbWV0aG9kXS5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgQ29ubmVjdGlvbi5wcm90b3R5cGUuc2VuZCA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIGlmICh0aGlzLndzLnJlYWR5U3RhdGUgPT0gV2ViU29ja2V0Lk9QRU4pIHtcbiAgICAgICAgICAgIHJldHVybiBfc3VwZXIucHJvdG90eXBlLnNlbmQuY2FsbCh0aGlzLCBtc2dwYWNrLmVuY29kZShkYXRhKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXCJjb2x5c2V1cy5qczogdHJ5aW5nIHRvIHNlbmQgZGF0YSB3aGlsZSBpbiBcIiArIHRoaXMud3MucmVhZHlTdGF0ZSArIFwiIHN0YXRlXCIpO1xuICAgICAgICAgICAgLy8gV2ViU29ja2V0IG5vdCBjb25uZWN0ZWQuXG4gICAgICAgICAgICAvLyBFbnF1ZXVlIGRhdGEgdG8gYmUgc2VudCB3aGVuIHJlYWR5U3RhdGUgPT0gT1BFTlxuICAgICAgICAgICAgdGhpcy5fZW5xdWV1ZWRDYWxscy5wdXNoKFsnc2VuZCcsIFtkYXRhXV0pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gQ29ubmVjdGlvbjtcbn0od2Vic29ja2V0XzEuZGVmYXVsdCkpO1xuZXhwb3J0cy5Db25uZWN0aW9uID0gQ29ubmVjdGlvbjtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vc3JjL0Nvbm5lY3Rpb24udHNcbi8vIG1vZHVsZSBpZCA9IDI2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cyxcIl9fZXNNb2R1bGVcIix7dmFsdWU6dHJ1ZX0pO3ZhciBfY3JlYXRlQ2xhc3M9ZnVuY3Rpb24oKXtmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCxwcm9wcyl7Zm9yKHZhciBpPTA7aTxwcm9wcy5sZW5ndGg7aSsrKXt2YXIgZGVzY3JpcHRvcj1wcm9wc1tpXTtkZXNjcmlwdG9yLmVudW1lcmFibGU9ZGVzY3JpcHRvci5lbnVtZXJhYmxlfHxmYWxzZTtkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZT10cnVlO2lmKFwidmFsdWVcImluIGRlc2NyaXB0b3IpZGVzY3JpcHRvci53cml0YWJsZT10cnVlO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsZGVzY3JpcHRvci5rZXksZGVzY3JpcHRvcik7fX1yZXR1cm4gZnVuY3Rpb24oQ29uc3RydWN0b3IscHJvdG9Qcm9wcyxzdGF0aWNQcm9wcyl7aWYocHJvdG9Qcm9wcylkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSxwcm90b1Byb3BzKTtpZihzdGF0aWNQcm9wcylkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLHN0YXRpY1Byb3BzKTtyZXR1cm4gQ29uc3RydWN0b3I7fTt9KCk7ZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLENvbnN0cnVjdG9yKXtpZighKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKXt0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpO319dmFyIGNyZWF0ZUJhY2tvZmY9cmVxdWlyZSgnLi9iYWNrb2ZmJykuY3JlYXRlQmFja29mZjt2YXIgV2ViU29ja2V0Q2xpZW50PWZ1bmN0aW9uKCl7LyoqXG4gICAqIEBwYXJhbSB1cmwgRE9NU3RyaW5nIFRoZSBVUkwgdG8gd2hpY2ggdG8gY29ubmVjdDsgdGhpcyBzaG91bGQgYmUgdGhlIFVSTCB0byB3aGljaCB0aGUgV2ViU29ja2V0IHNlcnZlciB3aWxsIHJlc3BvbmQuXG4gICAqIEBwYXJhbSBwcm90b2NvbHMgRE9NU3RyaW5nfERPTVN0cmluZ1tdIEVpdGhlciBhIHNpbmdsZSBwcm90b2NvbCBzdHJpbmcgb3IgYW4gYXJyYXkgb2YgcHJvdG9jb2wgc3RyaW5ncy4gVGhlc2Ugc3RyaW5ncyBhcmUgdXNlZCB0byBpbmRpY2F0ZSBzdWItcHJvdG9jb2xzLCBzbyB0aGF0IGEgc2luZ2xlIHNlcnZlciBjYW4gaW1wbGVtZW50IG11bHRpcGxlIFdlYlNvY2tldCBzdWItcHJvdG9jb2xzIChmb3IgZXhhbXBsZSwgeW91IG1pZ2h0IHdhbnQgb25lIHNlcnZlciB0byBiZSBhYmxlIHRvIGhhbmRsZSBkaWZmZXJlbnQgdHlwZXMgb2YgaW50ZXJhY3Rpb25zIGRlcGVuZGluZyBvbiB0aGUgc3BlY2lmaWVkIHByb3RvY29sKS4gSWYgeW91IGRvbid0IHNwZWNpZnkgYSBwcm90b2NvbCBzdHJpbmcsIGFuIGVtcHR5IHN0cmluZyBpcyBhc3N1bWVkLlxuICAgKi9mdW5jdGlvbiBXZWJTb2NrZXRDbGllbnQodXJsLHByb3RvY29scyl7dmFyIG9wdGlvbnM9YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT11bmRlZmluZWQ/YXJndW1lbnRzWzJdOnt9O19jbGFzc0NhbGxDaGVjayh0aGlzLFdlYlNvY2tldENsaWVudCk7dGhpcy51cmw9dXJsO3RoaXMucHJvdG9jb2xzPXByb3RvY29sczt0aGlzLnJlY29ubmVjdEVuYWJsZWQ9dHJ1ZTt0aGlzLmxpc3RlbmVycz17fTt0aGlzLmJhY2tvZmY9Y3JlYXRlQmFja29mZihvcHRpb25zLmJhY2tvZmZ8fCdleHBvbmVudGlhbCcsb3B0aW9ucyk7dGhpcy5iYWNrb2ZmLm9uUmVhZHk9dGhpcy5vbkJhY2tvZmZSZWFkeS5iaW5kKHRoaXMpO3RoaXMub3BlbigpO31fY3JlYXRlQ2xhc3MoV2ViU29ja2V0Q2xpZW50LFt7a2V5OidvcGVuJyx2YWx1ZTpmdW5jdGlvbiBvcGVuKCl7dmFyIHJlY29ubmVjdD1hcmd1bWVudHMubGVuZ3RoPjAmJmFyZ3VtZW50c1swXSE9PXVuZGVmaW5lZD9hcmd1bWVudHNbMF06ZmFsc2U7dGhpcy5pc1JlY29ubmVjdD1yZWNvbm5lY3Q7Ly8ga2VlcCBiaW5hcnlUeXBlIHVzZWQgb24gcHJldmlvdXMgV2ViU29ja2V0IGNvbm5lY3Rpb25cbnZhciBiaW5hcnlUeXBlPXRoaXMud3MmJnRoaXMud3MuYmluYXJ5VHlwZTt0aGlzLndzPW5ldyBXZWJTb2NrZXQodGhpcy51cmwsdGhpcy5wcm90b2NvbHMpO3RoaXMud3Mub25jbG9zZT10aGlzLm9uQ2xvc2VDYWxsYmFjay5iaW5kKHRoaXMpO3RoaXMud3Mub25lcnJvcj10aGlzLm9uRXJyb3JDYWxsYmFjay5iaW5kKHRoaXMpO3RoaXMud3Mub25tZXNzYWdlPXRoaXMub25NZXNzYWdlQ2FsbGJhY2suYmluZCh0aGlzKTt0aGlzLndzLm9ub3Blbj10aGlzLm9uT3BlbkNhbGxiYWNrLmJpbmQodGhpcyk7aWYoYmluYXJ5VHlwZSl7dGhpcy53cy5iaW5hcnlUeXBlPWJpbmFyeVR5cGU7fX0vKipcbiAgICogQGlnbm9yZVxuICAgKi99LHtrZXk6J29uQmFja29mZlJlYWR5Jyx2YWx1ZTpmdW5jdGlvbiBvbkJhY2tvZmZSZWFkeShudW1iZXIsZGVsYXkpey8vIGNvbnNvbGUubG9nKFwib25CYWNrb2ZmUmVhZHlcIiwgbnVtYmVyICsgJyAnICsgZGVsYXkgKyAnbXMnKTtcbnRoaXMub3Blbih0cnVlKTt9LyoqXG4gICAqIEBpZ25vcmVcbiAgICovfSx7a2V5OidvbkNsb3NlQ2FsbGJhY2snLHZhbHVlOmZ1bmN0aW9uIG9uQ2xvc2VDYWxsYmFjayhlKXtpZighdGhpcy5pc1JlY29ubmVjdCYmdGhpcy5saXN0ZW5lcnNbJ29uY2xvc2UnXSl7dGhpcy5saXN0ZW5lcnNbJ29uY2xvc2UnXS5hcHBseShudWxsLGFyZ3VtZW50cyk7fWlmKHRoaXMucmVjb25uZWN0RW5hYmxlZCYmZS5jb2RlPDMwMDApe3RoaXMuYmFja29mZi5iYWNrb2ZmKCk7fX0vKipcbiAgICogQGlnbm9yZVxuICAgKi99LHtrZXk6J29uRXJyb3JDYWxsYmFjaycsdmFsdWU6ZnVuY3Rpb24gb25FcnJvckNhbGxiYWNrKCl7aWYodGhpcy5saXN0ZW5lcnNbJ29uZXJyb3InXSl7dGhpcy5saXN0ZW5lcnNbJ29uZXJyb3InXS5hcHBseShudWxsLGFyZ3VtZW50cyk7fX0vKipcbiAgICogQGlnbm9yZVxuICAgKi99LHtrZXk6J29uTWVzc2FnZUNhbGxiYWNrJyx2YWx1ZTpmdW5jdGlvbiBvbk1lc3NhZ2VDYWxsYmFjaygpe2lmKHRoaXMubGlzdGVuZXJzWydvbm1lc3NhZ2UnXSl7dGhpcy5saXN0ZW5lcnNbJ29ubWVzc2FnZSddLmFwcGx5KG51bGwsYXJndW1lbnRzKTt9fS8qKlxuICAgKiBAaWdub3JlXG4gICAqL30se2tleTonb25PcGVuQ2FsbGJhY2snLHZhbHVlOmZ1bmN0aW9uIG9uT3BlbkNhbGxiYWNrKCl7aWYodGhpcy5saXN0ZW5lcnNbJ29ub3BlbiddKXt0aGlzLmxpc3RlbmVyc1snb25vcGVuJ10uYXBwbHkobnVsbCxhcmd1bWVudHMpO31pZih0aGlzLmlzUmVjb25uZWN0JiZ0aGlzLmxpc3RlbmVyc1snb25yZWNvbm5lY3QnXSl7dGhpcy5saXN0ZW5lcnNbJ29ucmVjb25uZWN0J10uYXBwbHkobnVsbCxhcmd1bWVudHMpO310aGlzLmlzUmVjb25uZWN0PWZhbHNlO30vKipcbiAgICogVGhlIG51bWJlciBvZiBieXRlcyBvZiBkYXRhIHRoYXQgaGF2ZSBiZWVuIHF1ZXVlZCB1c2luZyBjYWxscyB0byBzZW5kKClcbiAgICogYnV0IG5vdCB5ZXQgdHJhbnNtaXR0ZWQgdG8gdGhlIG5ldHdvcmsuIFRoaXMgdmFsdWUgZG9lcyBub3QgcmVzZXQgdG8gemVyb1xuICAgKiB3aGVuIHRoZSBjb25uZWN0aW9uIGlzIGNsb3NlZDsgaWYgeW91IGtlZXAgY2FsbGluZyBzZW5kKCksIHRoaXMgd2lsbFxuICAgKiBjb250aW51ZSB0byBjbGltYi5cbiAgICpcbiAgICogQHR5cGUgdW5zaWduZWQgbG9uZ1xuICAgKiBAcmVhZG9ubHlcbiAgICovfSx7a2V5OidjbG9zZScsLyoqXG4gICAqIENsb3NlcyB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb24gb3IgY29ubmVjdGlvbiBhdHRlbXB0LCBpZiBhbnkuIElmIHRoZVxuICAgKiBjb25uZWN0aW9uIGlzIGFscmVhZHkgQ0xPU0VELCB0aGlzIG1ldGhvZCBkb2VzIG5vdGhpbmcuXG4gICAqXG4gICAqIEBwYXJhbSBjb2RlIEEgbnVtZXJpYyB2YWx1ZSBpbmRpY2F0aW5nIHRoZSBzdGF0dXMgY29kZSBleHBsYWluaW5nIHdoeSB0aGUgY29ubmVjdGlvbiBpcyBiZWluZyBjbG9zZWQuIElmIHRoaXMgcGFyYW1ldGVyIGlzIG5vdCBzcGVjaWZpZWQsIGEgZGVmYXVsdCB2YWx1ZSBvZiAxMDAwIChpbmRpY2F0aW5nIGEgbm9ybWFsIFwidHJhbnNhY3Rpb24gY29tcGxldGVcIiBjbG9zdXJlKSBpcyBhc3N1bWVkLiBTZWUgdGhlIGxpc3Qgb2Ygc3RhdHVzIGNvZGVzIG9uIHRoZSBDbG9zZUV2ZW50IHBhZ2UgZm9yIHBlcm1pdHRlZCB2YWx1ZXMuXG4gICAqIEBwYXJhbSByZWFzb24gQSBodW1hbi1yZWFkYWJsZSBzdHJpbmcgZXhwbGFpbmluZyB3aHkgdGhlIGNvbm5lY3Rpb24gaXMgY2xvc2luZy4gVGhpcyBzdHJpbmcgbXVzdCBiZSBubyBsb25nZXIgdGhhbiAxMjMgYnl0ZXMgb2YgVVRGLTggdGV4dCAobm90IGNoYXJhY3RlcnMpLlxuICAgKlxuICAgKiBAcmV0dXJuIHZvaWRcbiAgICovdmFsdWU6ZnVuY3Rpb24gY2xvc2UoY29kZSxyZWFzb24pe2lmKHR5cGVvZiBjb2RlPT0ndW5kZWZpbmVkJyl7Y29kZT0xMDAwO310aGlzLnJlY29ubmVjdEVuYWJsZWQ9ZmFsc2U7dGhpcy53cy5jbG9zZShjb2RlLHJlYXNvbik7fS8qKlxuICAgKiBUcmFuc21pdHMgZGF0YSB0byB0aGUgc2VydmVyIG92ZXIgdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uLlxuICAgKiBAcGFyYW0gZGF0YSBET01TdHJpbmd8QXJyYXlCdWZmZXJ8QmxvYlxuICAgKiBAcmV0dXJuIHZvaWRcbiAgICovfSx7a2V5OidzZW5kJyx2YWx1ZTpmdW5jdGlvbiBzZW5kKGRhdGEpe3RoaXMud3Muc2VuZChkYXRhKTt9LyoqXG4gICAqIEFuIGV2ZW50IGxpc3RlbmVyIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvbidzIHJlYWR5U3RhdGUgY2hhbmdlcyB0byBDTE9TRUQuIFRoZSBsaXN0ZW5lciByZWNlaXZlcyBhIENsb3NlRXZlbnQgbmFtZWQgXCJjbG9zZVwiLlxuICAgKiBAcGFyYW0gbGlzdGVuZXIgRXZlbnRMaXN0ZW5lclxuICAgKi99LHtrZXk6J2J1ZmZlcmVkQW1vdW50JyxnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMud3MuYnVmZmVyZWRBbW91bnQ7fS8qKlxuICAgKiBUaGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgY29ubmVjdGlvbjsgdGhpcyBpcyBvbmUgb2YgdGhlIFJlYWR5IHN0YXRlIGNvbnN0YW50cy5cbiAgICogQHR5cGUgdW5zaWduZWQgc2hvcnRcbiAgICogQHJlYWRvbmx5XG4gICAqL30se2tleToncmVhZHlTdGF0ZScsZ2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLndzLnJlYWR5U3RhdGU7fS8qKlxuICAgKiBBIHN0cmluZyBpbmRpY2F0aW5nIHRoZSB0eXBlIG9mIGJpbmFyeSBkYXRhIGJlaW5nIHRyYW5zbWl0dGVkIGJ5IHRoZVxuICAgKiBjb25uZWN0aW9uLiBUaGlzIHNob3VsZCBiZSBlaXRoZXIgXCJibG9iXCIgaWYgRE9NIEJsb2Igb2JqZWN0cyBhcmUgYmVpbmdcbiAgICogdXNlZCBvciBcImFycmF5YnVmZmVyXCIgaWYgQXJyYXlCdWZmZXIgb2JqZWN0cyBhcmUgYmVpbmcgdXNlZC5cbiAgICogQHR5cGUgRE9NU3RyaW5nXG4gICAqL30se2tleTonYmluYXJ5VHlwZScsZ2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLndzLmJpbmFyeVR5cGU7fSxzZXQ6ZnVuY3Rpb24gc2V0KGJpbmFyeVR5cGUpe3RoaXMud3MuYmluYXJ5VHlwZT1iaW5hcnlUeXBlO30vKipcbiAgICogVGhlIGV4dGVuc2lvbnMgc2VsZWN0ZWQgYnkgdGhlIHNlcnZlci4gVGhpcyBpcyBjdXJyZW50bHkgb25seSB0aGUgZW1wdHlcbiAgICogc3RyaW5nIG9yIGEgbGlzdCBvZiBleHRlbnNpb25zIGFzIG5lZ290aWF0ZWQgYnkgdGhlIGNvbm5lY3Rpb24uXG4gICAqIEB0eXBlIERPTVN0cmluZ1xuICAgKi99LHtrZXk6J2V4dGVuc2lvbnMnLGdldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy53cy5leHRlbnNpb25zO30sc2V0OmZ1bmN0aW9uIHNldChleHRlbnNpb25zKXt0aGlzLndzLmV4dGVuc2lvbnM9ZXh0ZW5zaW9uczt9LyoqXG4gICAqIEEgc3RyaW5nIGluZGljYXRpbmcgdGhlIG5hbWUgb2YgdGhlIHN1Yi1wcm90b2NvbCB0aGUgc2VydmVyIHNlbGVjdGVkO1xuICAgKiB0aGlzIHdpbGwgYmUgb25lIG9mIHRoZSBzdHJpbmdzIHNwZWNpZmllZCBpbiB0aGUgcHJvdG9jb2xzIHBhcmFtZXRlciB3aGVuXG4gICAqIGNyZWF0aW5nIHRoZSBXZWJTb2NrZXQgb2JqZWN0LlxuICAgKiBAdHlwZSBET01TdHJpbmdcbiAgICovfSx7a2V5Oidwcm90b2NvbCcsZ2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLndzLnByb3RvY29sO30sc2V0OmZ1bmN0aW9uIHNldChwcm90b2NvbCl7dGhpcy53cy5wcm90b2NvbD1wcm90b2NvbDt9fSx7a2V5OidvbmNsb3NlJyxzZXQ6ZnVuY3Rpb24gc2V0KGxpc3RlbmVyKXt0aGlzLmxpc3RlbmVyc1snb25jbG9zZSddPWxpc3RlbmVyO30sZ2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLmxpc3RlbmVyc1snb25jbG9zZSddO30vKipcbiAgICogQW4gZXZlbnQgbGlzdGVuZXIgdG8gYmUgY2FsbGVkIHdoZW4gYW4gZXJyb3Igb2NjdXJzLiBUaGlzIGlzIGEgc2ltcGxlIGV2ZW50IG5hbWVkIFwiZXJyb3JcIi5cbiAgICogQHBhcmFtIGxpc3RlbmVyIEV2ZW50TGlzdGVuZXJcbiAgICovfSx7a2V5OidvbmVycm9yJyxzZXQ6ZnVuY3Rpb24gc2V0KGxpc3RlbmVyKXt0aGlzLmxpc3RlbmVyc1snb25lcnJvciddPWxpc3RlbmVyO30sZ2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLmxpc3RlbmVyc1snb25lcnJvciddO30vKipcbiAgICogQW4gZXZlbnQgbGlzdGVuZXIgdG8gYmUgY2FsbGVkIHdoZW4gYSBtZXNzYWdlIGlzIHJlY2VpdmVkIGZyb20gdGhlIHNlcnZlci4gVGhlIGxpc3RlbmVyIHJlY2VpdmVzIGEgTWVzc2FnZUV2ZW50IG5hbWVkIFwibWVzc2FnZVwiLlxuICAgKiBAcGFyYW0gbGlzdGVuZXIgRXZlbnRMaXN0ZW5lclxuICAgKi99LHtrZXk6J29ubWVzc2FnZScsc2V0OmZ1bmN0aW9uIHNldChsaXN0ZW5lcil7dGhpcy5saXN0ZW5lcnNbJ29ubWVzc2FnZSddPWxpc3RlbmVyO30sZ2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLmxpc3RlbmVyc1snb25tZXNzYWdlJ107fS8qKlxuICAgKiBBbiBldmVudCBsaXN0ZW5lciB0byBiZSBjYWxsZWQgd2hlbiB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb24ncyByZWFkeVN0YXRlIGNoYW5nZXMgdG8gT1BFTjsgdGhpcyBpbmRpY2F0ZXMgdGhhdCB0aGUgY29ubmVjdGlvbiBpcyByZWFkeSB0byBzZW5kIGFuZCByZWNlaXZlIGRhdGEuIFRoZSBldmVudCBpcyBhIHNpbXBsZSBvbmUgd2l0aCB0aGUgbmFtZSBcIm9wZW5cIi5cbiAgICogQHBhcmFtIGxpc3RlbmVyIEV2ZW50TGlzdGVuZXJcbiAgICovfSx7a2V5Oidvbm9wZW4nLHNldDpmdW5jdGlvbiBzZXQobGlzdGVuZXIpe3RoaXMubGlzdGVuZXJzWydvbm9wZW4nXT1saXN0ZW5lcjt9LGdldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5saXN0ZW5lcnNbJ29ub3BlbiddO30vKipcbiAgICogQHBhcmFtIGxpc3RlbmVyIEV2ZW50TGlzdGVuZXJcbiAgICovfSx7a2V5OidvbnJlY29ubmVjdCcsc2V0OmZ1bmN0aW9uIHNldChsaXN0ZW5lcil7dGhpcy5saXN0ZW5lcnNbJ29ucmVjb25uZWN0J109bGlzdGVuZXI7fSxnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMubGlzdGVuZXJzWydvbnJlY29ubmVjdCddO319XSk7cmV0dXJuIFdlYlNvY2tldENsaWVudDt9KCk7LyoqXG4gKiBUaGUgY29ubmVjdGlvbiBpcyBub3QgeWV0IG9wZW4uXG4gKi9XZWJTb2NrZXRDbGllbnQuQ09OTkVDVElORz1XZWJTb2NrZXQuQ09OTkVDVElORzsvKipcbiAqIFRoZSBjb25uZWN0aW9uIGlzIG9wZW4gYW5kIHJlYWR5IHRvIGNvbW11bmljYXRlLlxuICovV2ViU29ja2V0Q2xpZW50Lk9QRU49V2ViU29ja2V0Lk9QRU47LyoqXG4gKiBUaGUgY29ubmVjdGlvbiBpcyBpbiB0aGUgcHJvY2VzcyBvZiBjbG9zaW5nLlxuICovV2ViU29ja2V0Q2xpZW50LkNMT1NJTkc9V2ViU29ja2V0LkNMT1NJTkc7LyoqXG4gKiBUaGUgY29ubmVjdGlvbiBpcyBjbG9zZWQgb3IgY291bGRuJ3QgYmUgb3BlbmVkLlxuICovV2ViU29ja2V0Q2xpZW50LkNMT1NFRD1XZWJTb2NrZXQuQ0xPU0VEO2V4cG9ydHMuZGVmYXVsdD1XZWJTb2NrZXRDbGllbnQ7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGdhbWVzdGRpby93ZWJzb2NrZXQvbGliL2luZGV4LmpzXG4vLyBtb2R1bGUgaWQgPSAyN1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cyxcIl9fZXNNb2R1bGVcIix7dmFsdWU6dHJ1ZX0pO2V4cG9ydHMuY3JlYXRlQmFja29mZj1jcmVhdGVCYWNrb2ZmO3ZhciBiYWNrb2ZmPXtleHBvbmVudGlhbDpmdW5jdGlvbiBleHBvbmVudGlhbChhdHRlbXB0LGRlbGF5KXtyZXR1cm4gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKk1hdGgucG93KDIsYXR0ZW1wdCkqZGVsYXkpO30sZmlib25hY2NpOmZ1bmN0aW9uIGZpYm9uYWNjaShhdHRlbXB0LGRlbGF5KXt2YXIgY3VycmVudD0xO2lmKGF0dGVtcHQ+Y3VycmVudCl7dmFyIHByZXY9MSxjdXJyZW50PTI7Zm9yKHZhciBpbmRleD0yO2luZGV4PGF0dGVtcHQ7aW5kZXgrKyl7dmFyIG5leHQ9cHJlditjdXJyZW50O3ByZXY9Y3VycmVudDtjdXJyZW50PW5leHQ7fX1yZXR1cm4gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmN1cnJlbnQqZGVsYXkpO319O2Z1bmN0aW9uIGNyZWF0ZUJhY2tvZmYodHlwZSxvcHRpb25zKXtyZXR1cm4gbmV3IEJhY2tvZmYoYmFja29mZlt0eXBlXSxvcHRpb25zKTt9ZnVuY3Rpb24gQmFja29mZihmdW5jLG9wdGlvbnMpe3RoaXMuZnVuYz1mdW5jO3RoaXMuYXR0ZW1wdHM9MDt0aGlzLmRlbGF5PXR5cGVvZiBvcHRpb25zLmluaXRpYWxEZWxheSE9PVwidW5kZWZpbmVkXCI/b3B0aW9ucy5pbml0aWFsRGVsYXk6MTAwO31CYWNrb2ZmLnByb3RvdHlwZS5iYWNrb2ZmPWZ1bmN0aW9uKCl7c2V0VGltZW91dCh0aGlzLm9uUmVhZHksdGhpcy5mdW5jKCsrdGhpcy5hdHRlbXB0cyx0aGlzLmRlbGF5KSk7fTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZ2FtZXN0ZGlvL3dlYnNvY2tldC9saWIvYmFja29mZi5qc1xuLy8gbW9kdWxlIGlkID0gMjhcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sInNvdXJjZVJvb3QiOiIifQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAgY2IwODVjZTkyN2Q2NTc3NmZiYzAiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3NpZ25hbHMuanMvbGliL29yZy9vc2ZsYXNoL3NpZ25hbHMvU2xvdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbm90ZXBhY2suaW8vbGliL2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9zaWduYWxzLmpzL2xpYi9vcmcvb3NmbGFzaC9zaWduYWxzL09uY2VTaWduYWwuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1Byb3RvY29sLnRzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9zaWduYWxzLmpzL2xpYi9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvc2lnbmFscy5qcy9saWIvb3JnL29zZmxhc2gvc2lnbmFscy9Qcmlvcml0eVNpZ25hbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvc2lnbmFscy5qcy9saWIvb3JnL29zZmxhc2gvc2lnbmFscy9TaWduYWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3NpZ25hbHMuanMvbGliL29yZy9vc2ZsYXNoL3NpZ25hbHMvU2xvdExpc3QuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1Jvb20udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2luZGV4LnRzIiwid2VicGFjazovLy8uL3NyYy9DbGllbnQudHMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL25vdGVwYWNrLmlvL2Jyb3dzZXIvZW5jb2RlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9ub3RlcGFjay5pby9icm93c2VyL2RlY29kZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvc2lnbmFscy5qcy9saWIvb3JnL29zZmxhc2gvc2lnbmFscy9EZWx1eGVTaWduYWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3NpZ25hbHMuanMvbGliL29yZy9vc2ZsYXNoL3NpZ25hbHMvZXZlbnRzL0dlbmVyaWNFdmVudC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvc2lnbmFscy5qcy9saWIvb3JnL29zZmxhc2gvc2lnbmFscy9JT25jZVNpZ25hbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvc2lnbmFscy5qcy9saWIvb3JnL29zZmxhc2gvc2lnbmFscy9JUHJpb3JpdHlTaWduYWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3NpZ25hbHMuanMvbGliL29yZy9vc2ZsYXNoL3NpZ25hbHMvSVNpZ25hbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvc2lnbmFscy5qcy9saWIvb3JnL29zZmxhc2gvc2lnbmFscy9JU2xvdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvc2lnbmFscy5qcy9saWIvb3JnL29zZmxhc2gvc2lnbmFscy9Nb25vU2lnbmFsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9zaWduYWxzLmpzL2xpYi9vcmcvb3NmbGFzaC9zaWduYWxzL1Byb21pc2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL25vZGUtbGlicy1icm93c2VyL25vZGVfbW9kdWxlcy9idWZmZXIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLyh3ZWJwYWNrKS9idWlsZGluL2dsb2JhbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYmFzZTY0LWpzL2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9pZWVlNzU0L2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9pc2FycmF5L2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZ2FtZXN0ZGlvL2Nsb2NrL2Rpc3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2RlbHRhLWxpc3RlbmVyL2xpYi9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZGVsdGEtbGlzdGVuZXIvbGliL0RlbHRhQ29udGFpbmVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kZWx0YS1saXN0ZW5lci9saWIvY29tcGFyZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZm9zc2lsLWRlbHRhL2Zvc3NpbC1kZWx0YS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvQ29ubmVjdGlvbi50cyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGdhbWVzdGRpby93ZWJzb2NrZXQvbGliL2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZ2FtZXN0ZGlvL3dlYnNvY2tldC9saWIvYmFja29mZi5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBMkIsMEJBQTBCLEVBQUU7QUFDdkQseUNBQWlDLGVBQWU7QUFDaEQ7QUFDQTtBQUNBOztBQUVBO0FBQ0EsOERBQXNELCtEQUErRDs7QUFFckg7QUFDQTs7QUFFQTtBQUNBOzs7Ozs7OztBQzdEQTtBQUNBLDhDQUE4QyxjQUFjO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLGNBQWM7QUFDNUMsa0NBQWtDLGNBQWM7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQSxnQzs7Ozs7O0FDckxBO0FBQ0E7Ozs7Ozs7O0FDREE7QUFDQSw4Q0FBOEMsY0FBYztBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQyxlQUFlO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsdUJBQXVCO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQSxrQzs7Ozs7OztBQy9EQTtBQUNBLDhDQUE4QyxjQUFjO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QixhQUFhO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsaUJBQWlCLFlBQVk7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGlCQUFpQixZQUFZO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7OztBQ3hSQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLGdCQUFnQixzQ0FBc0MsaUJBQWlCLEVBQUU7QUFDbkYseUJBQXlCLHVEQUF1RDtBQUNoRjtBQUNBO0FBQ0EsdUJBQXVCLHNCQUFzQjtBQUM3QztBQUNBO0FBQ0EsQ0FBQztBQUNELDhDQUE4QyxjQUFjO0FBQzVEO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQyxlQUFlO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyxlQUFlO0FBQy9DO0FBQ0Esd0JBQXdCLHVCQUF1QjtBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsdUJBQXVCO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIscUJBQXFCO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0Esd0M7Ozs7Ozs7QUN0SUE7QUFDQSw4Q0FBOEMsY0FBYztBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxpQkFBaUI7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0Esd0M7Ozs7Ozs7QUMvREE7QUFDQSw4Q0FBOEMsY0FBYztBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDOzs7Ozs7O0FDTkE7QUFDQSw4Q0FBOEMsY0FBYztBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJDOzs7Ozs7O0FDTkE7QUFDQSw4Q0FBOEMsY0FBYztBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DOzs7Ozs7O0FDTkE7QUFDQSw4Q0FBOEMsY0FBYztBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixVQUFVO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixZQUFZO0FBQzdCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUEsdUNBQXVDLFNBQVM7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSxpQkFBaUI7QUFDaEM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxhQUFhLGlCQUFpQjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsU0FBUztBQUMxQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLFNBQVM7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLFNBQVM7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnREFBZ0QsRUFBRTtBQUNsRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxpQkFBaUIsU0FBUztBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsZUFBZTtBQUN2QztBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSx3QkFBd0IsUUFBUTtBQUNoQztBQUNBLHFCQUFxQixlQUFlO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixZQUFZO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxxQkFBcUIsU0FBUztBQUM5QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEscUJBQXFCLFNBQVM7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EscUJBQXFCLFNBQVM7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLGtCQUFrQjtBQUNuQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsbUJBQW1CLGNBQWM7QUFDakM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHVEQUF1RCxPQUFPO0FBQzlEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx1REFBdUQsT0FBTztBQUM5RDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxrQkFBa0I7QUFDbEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxxQkFBcUIsUUFBUTtBQUM3QjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsZUFBZSxTQUFTO0FBQ3hCO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsbUJBQW1CLFNBQVM7QUFDNUI7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsaUJBQWlCO0FBQ2hDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsaUJBQWlCLFlBQVk7QUFDN0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGlCQUFpQixnQkFBZ0I7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsZ0JBQWdCO0FBQ2pDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGlCQUFpQixZQUFZO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7Ozs7OztBQzV2REE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtB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b0Isa0NBQWtDO0FBQzNJO0FBQ0E7QUFDQSxNQUFNLEVBQUUsMkNBQTJDLHNDQUFzQyxvQkFBb0Isb0NBQW9DO0FBQ2pKLCtGQUErRjtBQUMvRjtBQUNBLE1BQU0sRUFBRSx3Q0FBd0MsbUNBQW1DLG9CQUFvQixpQ0FBaUM7QUFDeEk7QUFDQSxNQUFNLEVBQUUsNkNBQTZDLHdDQUF3QyxvQkFBb0IsdUNBQXVDLEdBQUcsd0JBQXdCLEdBQUc7QUFDdEw7QUFDQSxtREFBbUQ7QUFDbkQ7QUFDQSx1Q0FBdUM7QUFDdkM7QUFDQSw2Q0FBNkM7QUFDN0M7QUFDQSwyQ0FBMkMsZ0M7Ozs7Ozs7QUMzRTlCLDRDQUE0QyxXQUFXLEVBQUUsb0NBQW9DLGFBQWEsZ0RBQWdELDREQUE0RCw2Q0FBNkMsY0FBYyxvQkFBb0IscUJBQXFCLGdCQUFnQixjQUFjLFNBQVMsc0JBQXNCLGFBQWEsZUFBZSxrREFBa0QscUNBQXFDLDJDQUEyQywrQkFBK0IsZUFBZSxnQkFBZ0IsK0VBQStFLHFDQUFxQyxpRSIsImZpbGUiOiJjb2x5c2V1cy5qcyIsInNvdXJjZXNDb250ZW50IjpbIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwge1xuIFx0XHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcbiBcdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG4gXHRcdFx0XHRnZXQ6IGdldHRlclxuIFx0XHRcdH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDkpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2svYm9vdHN0cmFwIGNiMDg1Y2U5MjdkNjU3NzZmYmMwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG4vKipcbiAqIFRoZSBTbG90IGNsYXNzIHJlcHJlc2VudHMgYSBzaWduYWwgc2xvdC5cbiAqXG4gKiBAYXV0aG9yIFJvYmVydCBQZW5uZXJcbiAqIEBhdXRob3IgSm9hIEViZXJ0XG4gKi9cbnZhciBTbG90ID0gKGZ1bmN0aW9uICgpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IFNsb3Qgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lciBhc3NvY2lhdGVkIHdpdGggdGhlIHNsb3QuXG4gICAgICogQHBhcmFtIHNpZ25hbCBUaGUgc2lnbmFsIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2xvdC5cbiAgICAgKiBAcGFyYW0gb25jZSBXaGV0aGVyIG9yIG5vdCB0aGUgbGlzdGVuZXIgc2hvdWxkIGJlIGV4ZWN1dGVkIG9ubHkgb25jZS5cbiAgICAgKiBAcGFyYW0gcHJpb3JpdHkgVGhlIHByaW9yaXR5IG9mIHRoZSBzbG90LlxuICAgICAqXG4gICAgICogQHRocm93cyBBcmd1bWVudEVycm9yIDxjb2RlPkFyZ3VtZW50RXJyb3I8L2NvZGU+OiBHaXZlbiBsaXN0ZW5lciBpcyA8Y29kZT5udWxsPC9jb2RlPi5cbiAgICAgKiBAdGhyb3dzIEVycm9yIDxjb2RlPkVycm9yPC9jb2RlPjogSW50ZXJuYWwgc2lnbmFsIHJlZmVyZW5jZSBoYXMgbm90IGJlZW4gc2V0IHlldC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBTbG90KGxpc3RlbmVyLCBzaWduYWwsIG9uY2UsIHByaW9yaXR5KSB7XG4gICAgICAgIGlmIChvbmNlID09PSB2b2lkIDApIHsgb25jZSA9IGZhbHNlOyB9XG4gICAgICAgIGlmIChwcmlvcml0eSA9PT0gdm9pZCAwKSB7IHByaW9yaXR5ID0gMDsgfVxuICAgICAgICB0aGlzLl9lbmFibGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fb25jZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9wcmlvcml0eSA9IDA7XG4gICAgICAgIHRoaXMuX2xpc3RlbmVyID0gbGlzdGVuZXI7XG4gICAgICAgIHRoaXMuX29uY2UgPSBvbmNlO1xuICAgICAgICB0aGlzLl9zaWduYWwgPSBzaWduYWw7XG4gICAgICAgIHRoaXMuX3ByaW9yaXR5ID0gcHJpb3JpdHk7XG4gICAgICAgIHRoaXMudmVyaWZ5TGlzdGVuZXIobGlzdGVuZXIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIFNsb3QucHJvdG90eXBlLmV4ZWN1dGUwID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIXRoaXMuX2VuYWJsZWQpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGlmICh0aGlzLl9vbmNlKVxuICAgICAgICAgICAgdGhpcy5yZW1vdmUoKTtcbiAgICAgICAgaWYgKHRoaXMuX3BhcmFtcyAmJiB0aGlzLl9wYXJhbXMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLl9saXN0ZW5lci5hcHBseShudWxsLCB0aGlzLl9wYXJhbXMpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2xpc3RlbmVyKCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIFNsb3QucHJvdG90eXBlLmV4ZWN1dGUxID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIGlmICghdGhpcy5fZW5hYmxlZClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgaWYgKHRoaXMuX29uY2UpXG4gICAgICAgICAgICB0aGlzLnJlbW92ZSgpO1xuICAgICAgICBpZiAodGhpcy5fcGFyYW1zICYmIHRoaXMuX3BhcmFtcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuX2xpc3RlbmVyLmFwcGx5KG51bGwsIFt2YWx1ZV0uY29uY2F0KHRoaXMuX3BhcmFtcykpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2xpc3RlbmVyKHZhbHVlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgU2xvdC5wcm90b3R5cGUuZXhlY3V0ZSA9IGZ1bmN0aW9uICh2YWx1ZU9iamVjdHMpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9lbmFibGVkKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBpZiAodGhpcy5fb25jZSlcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlKCk7XG4gICAgICAgIC8vIElmIHdlIGhhdmUgcGFyYW1ldGVycywgYWRkIHRoZW0gdG8gdGhlIHZhbHVlT2JqZWN0XG4gICAgICAgIC8vIE5vdGU6IFRoaXMgY291bGQgYmUgZXhwZW5zaXZlIGlmIHdlJ3JlIGFmdGVyIHRoZSBmYXN0ZXN0IGRpc3BhdGNoIHBvc3NpYmxlLlxuICAgICAgICBpZiAodGhpcy5fcGFyYW1zICYmIHRoaXMuX3BhcmFtcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHZhbHVlT2JqZWN0cyA9IHZhbHVlT2JqZWN0cy5jb25jYXQodGhpcy5fcGFyYW1zKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBOT1RFOiBzaW1wbGUgaWZzIGFyZSBmYXN0ZXIgdGhhbiBzd2l0Y2g6IGh0dHA6Ly9qYWNrc29uZHVuc3Rhbi5jb20vYXJ0aWNsZXMvMTAwN1xuICAgICAgICB2YXIgbnVtVmFsdWVPYmplY3RzID0gdmFsdWVPYmplY3RzLmxlbmd0aDtcbiAgICAgICAgaWYgKG51bVZhbHVlT2JqZWN0cyA9PSAwKSB7XG4gICAgICAgICAgICB0aGlzLl9saXN0ZW5lcigpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG51bVZhbHVlT2JqZWN0cyA9PSAxKSB7XG4gICAgICAgICAgICB0aGlzLl9saXN0ZW5lcih2YWx1ZU9iamVjdHNbMF0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG51bVZhbHVlT2JqZWN0cyA9PSAyKSB7XG4gICAgICAgICAgICB0aGlzLl9saXN0ZW5lcih2YWx1ZU9iamVjdHNbMF0sIHZhbHVlT2JqZWN0c1sxXSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobnVtVmFsdWVPYmplY3RzID09IDMpIHtcbiAgICAgICAgICAgIHRoaXMuX2xpc3RlbmVyKHZhbHVlT2JqZWN0c1swXSwgdmFsdWVPYmplY3RzWzFdLCB2YWx1ZU9iamVjdHNbMl0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fbGlzdGVuZXIuYXBwbHkobnVsbCwgdmFsdWVPYmplY3RzKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFNsb3QucHJvdG90eXBlLCBcImxpc3RlbmVyXCIsIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBpbmhlcml0RG9jXG4gICAgICAgICAqIEB0aHJvd3MgQXJndW1lbnRFcnJvciA8Y29kZT5Bcmd1bWVudEVycm9yPC9jb2RlPjogR2l2ZW4gbGlzdGVuZXIgaXMgPGNvZGU+bnVsbDwvY29kZT4uIERpZCB5b3Ugd2FudCB0byBzZXQgZW5hYmxlZCB0byBmYWxzZSBpbnN0ZWFkP1xuICAgICAgICAgKiBAdGhyb3dzIEVycm9yIDxjb2RlPkVycm9yPC9jb2RlPjogSW50ZXJuYWwgc2lnbmFsIHJlZmVyZW5jZSBoYXMgbm90IGJlZW4gc2V0IHlldC5cbiAgICAgICAgICovXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2xpc3RlbmVyO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgaWYgKG51bGwgPT0gdmFsdWUpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdHaXZlbiBsaXN0ZW5lciBpcyBudWxsLlxcbkRpZCB5b3Ugd2FudCB0byBzZXQgZW5hYmxlZCB0byBmYWxzZSBpbnN0ZWFkPycpO1xuICAgICAgICAgICAgdGhpcy52ZXJpZnlMaXN0ZW5lcih2YWx1ZSk7XG4gICAgICAgICAgICB0aGlzLl9saXN0ZW5lciA9IHZhbHVlO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU2xvdC5wcm90b3R5cGUsIFwib25jZVwiLCB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaW5oZXJpdERvY1xuICAgICAgICAgKi9cbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fb25jZTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFNsb3QucHJvdG90eXBlLCBcInByaW9yaXR5XCIsIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBpbmhlcml0RG9jXG4gICAgICAgICAqL1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wcmlvcml0eTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbmQgcmV0dXJucyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjdXJyZW50IG9iamVjdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgY3VycmVudCBvYmplY3QuXG4gICAgICovXG4gICAgU2xvdC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBcIltTbG90IGxpc3RlbmVyOiBcIiArIHRoaXMuX2xpc3RlbmVyICsgXCIsIG9uY2U6IFwiICsgdGhpcy5fb25jZVxuICAgICAgICAgICAgKyBcIiwgcHJpb3JpdHk6IFwiICsgdGhpcy5fcHJpb3JpdHkgKyBcIiwgZW5hYmxlZDogXCIgKyB0aGlzLl9lbmFibGVkICsgXCJdXCI7XG4gICAgfTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU2xvdC5wcm90b3R5cGUsIFwiZW5hYmxlZFwiLCB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaW5oZXJpdERvY1xuICAgICAgICAgKi9cbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZW5hYmxlZDtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuX2VuYWJsZWQgPSB2YWx1ZTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFNsb3QucHJvdG90eXBlLCBcInBhcmFtc1wiLCB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaW5oZXJpdERvY1xuICAgICAgICAgKi9cbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcGFyYW1zO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5fcGFyYW1zID0gdmFsdWU7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgU2xvdC5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl9zaWduYWwucmVtb3ZlKHRoaXMuX2xpc3RlbmVyKTtcbiAgICB9O1xuICAgIFNsb3QucHJvdG90eXBlLnZlcmlmeUxpc3RlbmVyID0gZnVuY3Rpb24gKGxpc3RlbmVyKSB7XG4gICAgICAgIGlmIChudWxsID09IGxpc3RlbmVyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0dpdmVuIGxpc3RlbmVyIGlzIG51bGwuJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG51bGwgPT0gdGhpcy5fc2lnbmFsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludGVybmFsIHNpZ25hbCByZWZlcmVuY2UgaGFzIG5vdCBiZWVuIHNldCB5ZXQuJyk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBTbG90O1xufSgpKTtcbmV4cG9ydHMuU2xvdCA9IFNsb3Q7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TbG90LmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL3NpZ25hbHMuanMvbGliL29yZy9vc2ZsYXNoL3NpZ25hbHMvU2xvdC5qc1xuLy8gbW9kdWxlIGlkID0gMFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJleHBvcnRzLmVuY29kZSA9IHJlcXVpcmUoJy4vZW5jb2RlJyk7XG5leHBvcnRzLmRlY29kZSA9IHJlcXVpcmUoJy4vZGVjb2RlJyk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9ub3RlcGFjay5pby9saWIvaW5kZXguanNcbi8vIG1vZHVsZSBpZCA9IDFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgU2xvdExpc3RfMSA9IHJlcXVpcmUoXCIuL1Nsb3RMaXN0XCIpO1xudmFyIFNsb3RfMSA9IHJlcXVpcmUoXCIuL1Nsb3RcIik7XG4vKipcbiAqIEFsbG93cyB0aGUgdmFsdWVDbGFzc2VzIHRvIGJlIHNldCBpbiBNWE1MLCBlLmcuXG4gKiA8c2lnbmFsczpTaWduYWwgaWQ9XCJuYW1lQ2hhbmdlZFwiPntbU3RyaW5nLCB1aW50XX08L3NpZ25hbHM6U2lnbmFsPlxuICovXG4vKltEZWZhdWx0UHJvcGVydHkoXCJ2YWx1ZUNsYXNzZXNcIildKi9cbi8qKlxuICogU2lnbmFsIGRpc3BhdGNoZXMgZXZlbnRzIHRvIG11bHRpcGxlIGxpc3RlbmVycy5cbiAqIEl0IGlzIGluc3BpcmVkIGJ5IEMjIGV2ZW50cyBhbmQgZGVsZWdhdGVzLCBhbmQgYnlcbiAqIDxhIHRhcmdldD1cIl90b3BcIiBocmVmPVwiaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TaWduYWxzX2FuZF9zbG90c1wiPnNpZ25hbHMgYW5kIHNsb3RzPC9hPlxuICogaW4gUXQuXG4gKiBBIFNpZ25hbCBhZGRzIGV2ZW50IGRpc3BhdGNoaW5nIGZ1bmN0aW9uYWxpdHkgdGhyb3VnaCBjb21wb3NpdGlvbiBhbmQgaW50ZXJmYWNlcyxcbiAqIHJhdGhlciB0aGFuIGluaGVyaXRpbmcgZnJvbSBhIGRpc3BhdGNoZXIuXG4gKiA8YnIvPjxici8+XG4gKiBQcm9qZWN0IGhvbWU6IDxhIHRhcmdldD1cIl90b3BcIiBocmVmPVwiaHR0cDovL2dpdGh1Yi5jb20vcm9iZXJ0cGVubmVyL2FzMy1zaWduYWxzL1wiPmh0dHA6Ly9naXRodWIuY29tL3JvYmVydHBlbm5lci9hczMtc2lnbmFscy88L2E+XG4gKi9cbnZhciBPbmNlU2lnbmFsID0gKGZ1bmN0aW9uICgpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgU2lnbmFsIGluc3RhbmNlIHRvIGRpc3BhdGNoIHZhbHVlIG9iamVjdHMuXG4gICAgICogQHBhcmFtICAgIHZhbHVlQ2xhc3NlcyBBbnkgbnVtYmVyIG9mIGNsYXNzIHJlZmVyZW5jZXMgdGhhdCBlbmFibGUgdHlwZSBjaGVja3MgaW4gZGlzcGF0Y2goKS5cbiAgICAgKiBGb3IgZXhhbXBsZSwgbmV3IFNpZ25hbChTdHJpbmcsIHVpbnQpXG4gICAgICogd291bGQgYWxsb3c6IHNpZ25hbC5kaXNwYXRjaChcInRoZSBBbnN3ZXJcIiwgNDIpXG4gICAgICogYnV0IG5vdDogc2lnbmFsLmRpc3BhdGNoKHRydWUsIDQyLjUpXG4gICAgICogbm9yOiBzaWduYWwuZGlzcGF0Y2goKVxuICAgICAqXG4gICAgICogTk9URTogSW4gQVMzLCBzdWJjbGFzc2VzIGNhbm5vdCBjYWxsIHN1cGVyLmFwcGx5KG51bGwsIHZhbHVlQ2xhc3NlcyksXG4gICAgICogYnV0IHRoaXMgY29uc3RydWN0b3IgaGFzIGxvZ2ljIHRvIHN1cHBvcnQgc3VwZXIodmFsdWVDbGFzc2VzKS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBPbmNlU2lnbmFsKCkge1xuICAgICAgICB2YXIgdmFsdWVDbGFzc2VzID0gW107XG4gICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICB2YWx1ZUNsYXNzZXNbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNsb3RzID0gU2xvdExpc3RfMS5TbG90TGlzdC5OSUw7XG4gICAgICAgIC8vIENhbm5vdCB1c2Ugc3VwZXIuYXBwbHkobnVsbCwgdmFsdWVDbGFzc2VzKSwgc28gYWxsb3cgdGhlIHN1YmNsYXNzIHRvIGNhbGwgc3VwZXIodmFsdWVDbGFzc2VzKS5cbiAgICAgICAgdGhpcy52YWx1ZUNsYXNzZXMgPSAodmFsdWVDbGFzc2VzLmxlbmd0aCA9PSAxICYmIHZhbHVlQ2xhc3Nlc1swXSBpbnN0YW5jZW9mIEFycmF5KSA/IHZhbHVlQ2xhc3Nlc1swXSA6IHZhbHVlQ2xhc3NlcztcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KE9uY2VTaWduYWwucHJvdG90eXBlLCBcInZhbHVlQ2xhc3Nlc1wiLCB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaW5oZXJpdERvY1xuICAgICAgICAgKiBAdGhyb3dzIEFyZ3VtZW50RXJyb3IgPGNvZGU+QXJndW1lbnRFcnJvcjwvY29kZT46IEludmFsaWQgdmFsdWVDbGFzc2VzIGFyZ3VtZW50OiBpdGVtIGF0IGluZGV4IHNob3VsZCBiZSBhIENsYXNzIGJ1dCB3YXMgbm90LlxuICAgICAgICAgKi9cbiAgICAgICAgLypbQXJyYXlFbGVtZW50VHlwZShcIkNsYXNzXCIpXSovXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlQ2xhc3NlcztcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIC8vIENsb25lIHNvIHRoZSBBcnJheSBjYW5ub3QgYmUgYWZmZWN0ZWQgZnJvbSBvdXRzaWRlLlxuICAgICAgICAgICAgdGhpcy5fdmFsdWVDbGFzc2VzID0gdmFsdWUgPyB2YWx1ZS5zbGljZSgpIDogW107XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gdGhpcy5fdmFsdWVDbGFzc2VzLmxlbmd0aDsgaS0tOykge1xuICAgICAgICAgICAgICAgIGlmICghKHRoaXMuX3ZhbHVlQ2xhc3Nlc1tpXSBpbnN0YW5jZW9mIE9iamVjdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHZhbHVlQ2xhc3NlcyBhcmd1bWVudDogJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnaXRlbSBhdCBpbmRleCAnICsgaSArICcgc2hvdWxkIGJlIGEgQ2xhc3MgYnV0IHdhczo8JyArXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZUNsYXNzZXNbaV0gKyAnPi4nICsgdGhpcy5fdmFsdWVDbGFzc2VzW2ldKTsgLy9AQ0hBTkdFRCAtIHRlbXAgcmVwbGFjZW1lbnQgZm9yIGdldFF1YWxpZmllZENsYXNzQnlOYW1lKClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShPbmNlU2lnbmFsLnByb3RvdHlwZSwgXCJudW1MaXN0ZW5lcnNcIiwge1xuICAgICAgICAvKiogQGluaGVyaXREb2MgKi9cbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zbG90cy5sZW5ndGg7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICogQHRocm93cyBmbGFzaC5lcnJvcnMuSWxsZWdhbE9wZXJhdGlvbkVycm9yIDxjb2RlPklsbGVnYWxPcGVyYXRpb25FcnJvcjwvY29kZT46IFlvdSBjYW5ub3QgYWRkT25jZSgpIHRoZW4gYWRkKCkgdGhlIHNhbWUgbGlzdGVuZXIgd2l0aG91dCByZW1vdmluZyB0aGUgcmVsYXRpb25zaGlwIGZpcnN0LlxuICAgICAqIEB0aHJvd3MgQXJndW1lbnRFcnJvciA8Y29kZT5Bcmd1bWVudEVycm9yPC9jb2RlPjogR2l2ZW4gbGlzdGVuZXIgaXMgPGNvZGU+bnVsbDwvY29kZT4uXG4gICAgICovXG4gICAgT25jZVNpZ25hbC5wcm90b3R5cGUuYWRkT25jZSA9IGZ1bmN0aW9uIChsaXN0ZW5lcikge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWdpc3Rlckxpc3RlbmVyKGxpc3RlbmVyLCB0cnVlKTtcbiAgICB9O1xuICAgIC8qKiBAaW5oZXJpdERvYyAqL1xuICAgIE9uY2VTaWduYWwucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uIChsaXN0ZW5lcikge1xuICAgICAgICB2YXIgc2xvdCA9IHRoaXMuc2xvdHMuZmluZChsaXN0ZW5lcik7XG4gICAgICAgIGlmICghc2xvdClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB0aGlzLnNsb3RzID0gdGhpcy5zbG90cy5maWx0ZXJOb3QobGlzdGVuZXIpO1xuICAgICAgICByZXR1cm4gc2xvdDtcbiAgICB9O1xuICAgIC8qKiBAaW5oZXJpdERvYyAqL1xuICAgIE9uY2VTaWduYWwucHJvdG90eXBlLnJlbW92ZUFsbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5zbG90cyA9IFNsb3RMaXN0XzEuU2xvdExpc3QuTklMO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKiBAdGhyb3dzIEFyZ3VtZW50RXJyb3IgPGNvZGU+QXJndW1lbnRFcnJvcjwvY29kZT46IEluY29ycmVjdCBudW1iZXIgb2YgYXJndW1lbnRzLlxuICAgICAqIEB0aHJvd3MgQXJndW1lbnRFcnJvciA8Y29kZT5Bcmd1bWVudEVycm9yPC9jb2RlPjogVmFsdWUgb2JqZWN0IGlzIG5vdCBhbiBpbnN0YW5jZSBvZiB0aGUgYXBwcm9wcmlhdGUgdmFsdWVDbGFzc2VzIENsYXNzLlxuICAgICAqL1xuICAgIE9uY2VTaWduYWwucHJvdG90eXBlLmRpc3BhdGNoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdmFsdWVPYmplY3RzID0gW107XG4gICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICB2YWx1ZU9iamVjdHNbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiB2YWx1ZUNsYXNzZXMgaXMgZW1wdHksIHZhbHVlIG9iamVjdHMgYXJlIG5vdCB0eXBlLWNoZWNrZWQuXG4gICAgICAgIHZhciBudW1WYWx1ZUNsYXNzZXMgPSB0aGlzLl92YWx1ZUNsYXNzZXMubGVuZ3RoO1xuICAgICAgICB2YXIgbnVtVmFsdWVPYmplY3RzID0gdmFsdWVPYmplY3RzLmxlbmd0aDtcbiAgICAgICAgLy8gQ2Fubm90IGRpc3BhdGNoIGZld2VyIG9iamVjdHMgdGhhbiBkZWNsYXJlZCBjbGFzc2VzLlxuICAgICAgICBpZiAobnVtVmFsdWVPYmplY3RzIDwgbnVtVmFsdWVDbGFzc2VzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0luY29ycmVjdCBudW1iZXIgb2YgYXJndW1lbnRzLiAnICtcbiAgICAgICAgICAgICAgICAnRXhwZWN0ZWQgYXQgbGVhc3QgJyArIG51bVZhbHVlQ2xhc3NlcyArICcgYnV0IHJlY2VpdmVkICcgK1xuICAgICAgICAgICAgICAgIG51bVZhbHVlT2JqZWN0cyArICcuJyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ2Fubm90IGRpc3BhdGNoIGRpZmZlcmVudGx5IHR5cGVkIG9iamVjdHMgdGhhbiBkZWNsYXJlZCBjbGFzc2VzLlxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bVZhbHVlQ2xhc3NlczsgaSsrKSB7XG4gICAgICAgICAgICAvLyBPcHRpbWl6ZWQgZm9yIHRoZSBvcHRpbWlzdGljIGNhc2UgdGhhdCB2YWx1ZXMgYXJlIGNvcnJlY3QuXG4gICAgICAgICAgICBpZiAodmFsdWVPYmplY3RzW2ldID09PSBudWxsIHx8XG4gICAgICAgICAgICAgICAgKHZhbHVlT2JqZWN0c1tpXSBpbnN0YW5jZW9mIHRoaXMuX3ZhbHVlQ2xhc3Nlc1tpXSB8fCB2YWx1ZU9iamVjdHNbaV0uY29uc3RydWN0b3IgPT09IHRoaXMuX3ZhbHVlQ2xhc3Nlc1tpXSkpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVmFsdWUgb2JqZWN0IDwnICsgdmFsdWVPYmplY3RzW2ldXG4gICAgICAgICAgICAgICAgKyAnPiBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgPCcgKyB0aGlzLl92YWx1ZUNsYXNzZXNbaV0gKyAnPi4nKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBCcm9hZGNhc3QgdG8gbGlzdGVuZXJzLlxuICAgICAgICB2YXIgc2xvdHNUb1Byb2Nlc3MgPSB0aGlzLnNsb3RzO1xuICAgICAgICBpZiAoc2xvdHNUb1Byb2Nlc3Mubm9uRW1wdHkpIHtcbiAgICAgICAgICAgIHdoaWxlIChzbG90c1RvUHJvY2Vzcy5ub25FbXB0eSkge1xuICAgICAgICAgICAgICAgIHNsb3RzVG9Qcm9jZXNzLmhlYWQuZXhlY3V0ZSh2YWx1ZU9iamVjdHMpO1xuICAgICAgICAgICAgICAgIHNsb3RzVG9Qcm9jZXNzID0gc2xvdHNUb1Byb2Nlc3MudGFpbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgT25jZVNpZ25hbC5wcm90b3R5cGUucmVnaXN0ZXJMaXN0ZW5lciA9IGZ1bmN0aW9uIChsaXN0ZW5lciwgb25jZSkge1xuICAgICAgICBpZiAob25jZSA9PT0gdm9pZCAwKSB7IG9uY2UgPSBmYWxzZTsgfVxuICAgICAgICBpZiAodGhpcy5yZWdpc3RyYXRpb25Qb3NzaWJsZShsaXN0ZW5lciwgb25jZSkpIHtcbiAgICAgICAgICAgIHZhciBuZXdTbG90ID0gbmV3IFNsb3RfMS5TbG90KGxpc3RlbmVyLCB0aGlzLCBvbmNlKTtcbiAgICAgICAgICAgIHRoaXMuc2xvdHMgPSB0aGlzLnNsb3RzLnByZXBlbmQobmV3U2xvdCk7XG4gICAgICAgICAgICByZXR1cm4gbmV3U2xvdDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5zbG90cy5maW5kKGxpc3RlbmVyKTtcbiAgICB9O1xuICAgIE9uY2VTaWduYWwucHJvdG90eXBlLnJlZ2lzdHJhdGlvblBvc3NpYmxlID0gZnVuY3Rpb24gKGxpc3RlbmVyLCBvbmNlKSB7XG4gICAgICAgIGlmICghdGhpcy5zbG90cy5ub25FbXB0eSlcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB2YXIgZXhpc3RpbmdTbG90ID0gdGhpcy5zbG90cy5maW5kKGxpc3RlbmVyKTtcbiAgICAgICAgaWYgKCFleGlzdGluZ1Nsb3QpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKGV4aXN0aW5nU2xvdC5vbmNlICE9IG9uY2UpIHtcbiAgICAgICAgICAgIC8vIElmIHRoZSBsaXN0ZW5lciB3YXMgcHJldmlvdXNseSBhZGRlZCwgZGVmaW5pdGVseSBkb24ndCBhZGQgaXQgYWdhaW4uXG4gICAgICAgICAgICAvLyBCdXQgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZWlyIG9uY2UgdmFsdWVzIGRpZmZlci5cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignWW91IGNhbm5vdCBhZGRPbmNlKCkgdGhlbiBhZGQoKSB0aGUgc2FtZSBsaXN0ZW5lciB3aXRob3V0IHJlbW92aW5nIHRoZSByZWxhdGlvbnNoaXAgZmlyc3QuJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBMaXN0ZW5lciB3YXMgYWxyZWFkeSByZWdpc3RlcmVkLlxuICAgIH07XG4gICAgcmV0dXJuIE9uY2VTaWduYWw7XG59KCkpO1xuZXhwb3J0cy5PbmNlU2lnbmFsID0gT25jZVNpZ25hbDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU9uY2VTaWduYWwuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvc2lnbmFscy5qcy9saWIvb3JnL29zZmxhc2gvc2lnbmFscy9PbmNlU2lnbmFsLmpzXG4vLyBtb2R1bGUgaWQgPSAyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIlwidXNlIHN0cmljdFwiO1xuLy8gVXNlIGNvZGVzIGJldHdlZW4gMH4xMjcgZm9yIGxlc3NlciB0aHJvdWdocHV0ICgxIGJ5dGUpXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgUHJvdG9jb2w7XG4oZnVuY3Rpb24gKFByb3RvY29sKSB7XG4gICAgLy8gVXNlci1yZWxhdGVkICgwfjEwKVxuICAgIFByb3RvY29sW1Byb3RvY29sW1wiVVNFUl9JRFwiXSA9IDFdID0gXCJVU0VSX0lEXCI7XG4gICAgLy8gUm9vbS1yZWxhdGVkICgxMH4yMClcbiAgICBQcm90b2NvbFtQcm90b2NvbFtcIkpPSU5fUk9PTVwiXSA9IDEwXSA9IFwiSk9JTl9ST09NXCI7XG4gICAgUHJvdG9jb2xbUHJvdG9jb2xbXCJKT0lOX0VSUk9SXCJdID0gMTFdID0gXCJKT0lOX0VSUk9SXCI7XG4gICAgUHJvdG9jb2xbUHJvdG9jb2xbXCJMRUFWRV9ST09NXCJdID0gMTJdID0gXCJMRUFWRV9ST09NXCI7XG4gICAgUHJvdG9jb2xbUHJvdG9jb2xbXCJST09NX0RBVEFcIl0gPSAxM10gPSBcIlJPT01fREFUQVwiO1xuICAgIFByb3RvY29sW1Byb3RvY29sW1wiUk9PTV9TVEFURVwiXSA9IDE0XSA9IFwiUk9PTV9TVEFURVwiO1xuICAgIFByb3RvY29sW1Byb3RvY29sW1wiUk9PTV9TVEFURV9QQVRDSFwiXSA9IDE1XSA9IFwiUk9PTV9TVEFURV9QQVRDSFwiO1xuICAgIC8vIEdlbmVyaWMgbWVzc2FnZXMgKDUwfjYwKVxuICAgIFByb3RvY29sW1Byb3RvY29sW1wiQkFEX1JFUVVFU1RcIl0gPSA1MF0gPSBcIkJBRF9SRVFVRVNUXCI7XG59KShQcm90b2NvbCA9IGV4cG9ydHMuUHJvdG9jb2wgfHwgKGV4cG9ydHMuUHJvdG9jb2wgPSB7fSkpO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9zcmMvUHJvdG9jb2wudHNcbi8vIG1vZHVsZSBpZCA9IDNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgRGVsdXhlU2lnbmFsXzEgPSByZXF1aXJlKFwiLi9vcmcvb3NmbGFzaC9zaWduYWxzL0RlbHV4ZVNpZ25hbFwiKTtcbmV4cG9ydHMuRGVsdXhlU2lnbmFsID0gRGVsdXhlU2lnbmFsXzEuRGVsdXhlU2lnbmFsO1xudmFyIEdlbmVyaWNFdmVudF8xID0gcmVxdWlyZShcIi4vb3JnL29zZmxhc2gvc2lnbmFscy9ldmVudHMvR2VuZXJpY0V2ZW50XCIpO1xuZXhwb3J0cy5HZW5lcmljRXZlbnQgPSBHZW5lcmljRXZlbnRfMS5HZW5lcmljRXZlbnQ7XG52YXIgSU9uY2VTaWduYWxfMSA9IHJlcXVpcmUoXCIuL29yZy9vc2ZsYXNoL3NpZ25hbHMvSU9uY2VTaWduYWxcIik7XG5leHBvcnRzLklPbmNlU2lnbmFsID0gSU9uY2VTaWduYWxfMS5JT25jZVNpZ25hbDtcbnZhciBJUHJpb3JpdHlTaWduYWxfMSA9IHJlcXVpcmUoXCIuL29yZy9vc2ZsYXNoL3NpZ25hbHMvSVByaW9yaXR5U2lnbmFsXCIpO1xuZXhwb3J0cy5JUHJpb3JpdHlTaWduYWwgPSBJUHJpb3JpdHlTaWduYWxfMS5JUHJpb3JpdHlTaWduYWw7XG52YXIgSVNpZ25hbF8xID0gcmVxdWlyZShcIi4vb3JnL29zZmxhc2gvc2lnbmFscy9JU2lnbmFsXCIpO1xuZXhwb3J0cy5JU2lnbmFsID0gSVNpZ25hbF8xLklTaWduYWw7XG52YXIgSVNsb3RfMSA9IHJlcXVpcmUoXCIuL29yZy9vc2ZsYXNoL3NpZ25hbHMvSVNsb3RcIik7XG5leHBvcnRzLklTbG90ID0gSVNsb3RfMS5JU2xvdDtcbnZhciBNb25vU2lnbmFsXzEgPSByZXF1aXJlKFwiLi9vcmcvb3NmbGFzaC9zaWduYWxzL01vbm9TaWduYWxcIik7XG5leHBvcnRzLk1vbm9TaWduYWwgPSBNb25vU2lnbmFsXzEuTW9ub1NpZ25hbDtcbnZhciBPbmNlU2lnbmFsXzEgPSByZXF1aXJlKFwiLi9vcmcvb3NmbGFzaC9zaWduYWxzL09uY2VTaWduYWxcIik7XG5leHBvcnRzLk9uY2VTaWduYWwgPSBPbmNlU2lnbmFsXzEuT25jZVNpZ25hbDtcbnZhciBQcmlvcml0eVNpZ25hbF8xID0gcmVxdWlyZShcIi4vb3JnL29zZmxhc2gvc2lnbmFscy9Qcmlvcml0eVNpZ25hbFwiKTtcbmV4cG9ydHMuUHJpb3JpdHlTaWduYWwgPSBQcmlvcml0eVNpZ25hbF8xLlByaW9yaXR5U2lnbmFsO1xudmFyIFByb21pc2VfMSA9IHJlcXVpcmUoXCIuL29yZy9vc2ZsYXNoL3NpZ25hbHMvUHJvbWlzZVwiKTtcbmV4cG9ydHMuUHJvbWlzZSA9IFByb21pc2VfMS5Qcm9taXNlO1xudmFyIFNpZ25hbF8xID0gcmVxdWlyZShcIi4vb3JnL29zZmxhc2gvc2lnbmFscy9TaWduYWxcIik7XG5leHBvcnRzLlNpZ25hbCA9IFNpZ25hbF8xLlNpZ25hbDtcbnZhciBTbG90XzEgPSByZXF1aXJlKFwiLi9vcmcvb3NmbGFzaC9zaWduYWxzL1Nsb3RcIik7XG5leHBvcnRzLlNsb3QgPSBTbG90XzEuU2xvdDtcbnZhciBTbG90TGlzdF8xID0gcmVxdWlyZShcIi4vb3JnL29zZmxhc2gvc2lnbmFscy9TbG90TGlzdFwiKTtcbmV4cG9ydHMuU2xvdExpc3QgPSBTbG90TGlzdF8xLlNsb3RMaXN0O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvc2lnbmFscy5qcy9saWIvaW5kZXguanNcbi8vIG1vZHVsZSBpZCA9IDRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcbiAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxuICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTsgfTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbiAgICB9O1xufSkoKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciBTaWduYWxfMSA9IHJlcXVpcmUoXCIuL1NpZ25hbFwiKTtcbnZhciBTbG90XzEgPSByZXF1aXJlKFwiLi9TbG90XCIpO1xudmFyIFByaW9yaXR5U2lnbmFsID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUHJpb3JpdHlTaWduYWwsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUHJpb3JpdHlTaWduYWwoKSB7XG4gICAgICAgIHZhciB2YWx1ZUNsYXNzZXMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIHZhbHVlQ2xhc3Nlc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICB9XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIC8vIENhbm5vdCB1c2Ugc3VwZXIuYXBwbHkobnVsbCwgdmFsdWVDbGFzc2VzKSwgc28gYWxsb3cgdGhlIHN1YmNsYXNzIHRvIGNhbGwgc3VwZXIodmFsdWVDbGFzc2VzKS5cbiAgICAgICAgdmFsdWVDbGFzc2VzID0gKHZhbHVlQ2xhc3Nlcy5sZW5ndGggPT0gMSAmJiB2YWx1ZUNsYXNzZXNbMF0gaW5zdGFuY2VvZiBBcnJheSkgPyB2YWx1ZUNsYXNzZXNbMF0gOiB2YWx1ZUNsYXNzZXM7XG4gICAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgdmFsdWVDbGFzc2VzKSB8fCB0aGlzO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICogQHRocm93cyBmbGFzaC5lcnJvcnMuSWxsZWdhbE9wZXJhdGlvbkVycm9yIDxjb2RlPklsbGVnYWxPcGVyYXRpb25FcnJvcjwvY29kZT46IFlvdSBjYW5ub3QgYWRkT25jZSgpIHRoZW4gYWRkKCkgdGhlIHNhbWUgbGlzdGVuZXIgd2l0aG91dCByZW1vdmluZyB0aGUgcmVsYXRpb25zaGlwIGZpcnN0LlxuICAgICAqIEB0aHJvd3MgQXJndW1lbnRFcnJvciA8Y29kZT5Bcmd1bWVudEVycm9yPC9jb2RlPjogR2l2ZW4gbGlzdGVuZXIgaXMgPGNvZGU+bnVsbDwvY29kZT4uXG4gICAgICovXG4gICAgUHJpb3JpdHlTaWduYWwucHJvdG90eXBlLmFkZFdpdGhQcmlvcml0eSA9IGZ1bmN0aW9uIChsaXN0ZW5lciwgcHJpb3JpdHkpIHtcbiAgICAgICAgaWYgKHByaW9yaXR5ID09PSB2b2lkIDApIHsgcHJpb3JpdHkgPSAwOyB9XG4gICAgICAgIHJldHVybiB0aGlzLnJlZ2lzdGVyTGlzdGVuZXJXaXRoUHJpb3JpdHkobGlzdGVuZXIsIGZhbHNlLCBwcmlvcml0eSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqIEB0aHJvd3MgZmxhc2guZXJyb3JzLklsbGVnYWxPcGVyYXRpb25FcnJvciA8Y29kZT5JbGxlZ2FsT3BlcmF0aW9uRXJyb3I8L2NvZGU+OiBZb3UgY2Fubm90IGFkZE9uY2UoKSB0aGVuIGFkZCgpIHRoZSBzYW1lIGxpc3RlbmVyIHdpdGhvdXQgcmVtb3ZpbmcgdGhlIHJlbGF0aW9uc2hpcCBmaXJzdC5cbiAgICAgKiBAdGhyb3dzIEFyZ3VtZW50RXJyb3IgPGNvZGU+QXJndW1lbnRFcnJvcjwvY29kZT46IEdpdmVuIGxpc3RlbmVyIGlzIDxjb2RlPm51bGw8L2NvZGU+LlxuICAgICAqL1xuICAgIFByaW9yaXR5U2lnbmFsLnByb3RvdHlwZS5hZGRPbmNlV2l0aFByaW9yaXR5ID0gZnVuY3Rpb24gKGxpc3RlbmVyLCBwcmlvcml0eSkge1xuICAgICAgICBpZiAocHJpb3JpdHkgPT09IHZvaWQgMCkgeyBwcmlvcml0eSA9IDA7IH1cbiAgICAgICAgcmV0dXJuIHRoaXMucmVnaXN0ZXJMaXN0ZW5lcldpdGhQcmlvcml0eShsaXN0ZW5lciwgdHJ1ZSwgcHJpb3JpdHkpO1xuICAgIH07XG4gICAgLypvdmVycmlkZSovXG4gICAgUHJpb3JpdHlTaWduYWwucHJvdG90eXBlLnJlZ2lzdGVyTGlzdGVuZXIgPSBmdW5jdGlvbiAobGlzdGVuZXIsIG9uY2UpIHtcbiAgICAgICAgaWYgKG9uY2UgPT09IHZvaWQgMCkgeyBvbmNlID0gZmFsc2U7IH1cbiAgICAgICAgcmV0dXJuIHRoaXMucmVnaXN0ZXJMaXN0ZW5lcldpdGhQcmlvcml0eShsaXN0ZW5lciwgb25jZSk7XG4gICAgfTtcbiAgICBQcmlvcml0eVNpZ25hbC5wcm90b3R5cGUucmVnaXN0ZXJMaXN0ZW5lcldpdGhQcmlvcml0eSA9IGZ1bmN0aW9uIChsaXN0ZW5lciwgb25jZSwgcHJpb3JpdHkpIHtcbiAgICAgICAgaWYgKG9uY2UgPT09IHZvaWQgMCkgeyBvbmNlID0gZmFsc2U7IH1cbiAgICAgICAgaWYgKHByaW9yaXR5ID09PSB2b2lkIDApIHsgcHJpb3JpdHkgPSAwOyB9XG4gICAgICAgIGlmICh0aGlzLnJlZ2lzdHJhdGlvblBvc3NpYmxlKGxpc3RlbmVyLCBvbmNlKSkge1xuICAgICAgICAgICAgdmFyIHNsb3QgPSBuZXcgU2xvdF8xLlNsb3QobGlzdGVuZXIsIHRoaXMsIG9uY2UsIHByaW9yaXR5KTtcbiAgICAgICAgICAgIHRoaXMuc2xvdHMgPSB0aGlzLnNsb3RzLmluc2VydFdpdGhQcmlvcml0eShzbG90KTtcbiAgICAgICAgICAgIHJldHVybiBzbG90O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnNsb3RzLmZpbmQobGlzdGVuZXIpO1xuICAgIH07XG4gICAgcmV0dXJuIFByaW9yaXR5U2lnbmFsO1xufShTaWduYWxfMS5TaWduYWwpKTtcbmV4cG9ydHMuUHJpb3JpdHlTaWduYWwgPSBQcmlvcml0eVNpZ25hbDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVByaW9yaXR5U2lnbmFsLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL3NpZ25hbHMuanMvbGliL29yZy9vc2ZsYXNoL3NpZ25hbHMvUHJpb3JpdHlTaWduYWwuanNcbi8vIG1vZHVsZSBpZCA9IDVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcbiAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxuICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTsgfTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbiAgICB9O1xufSkoKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciBPbmNlU2lnbmFsXzEgPSByZXF1aXJlKFwiLi9PbmNlU2lnbmFsXCIpO1xuLyoqXG4gKiBBbGxvd3MgdGhlIHZhbHVlQ2xhc3NlcyB0byBiZSBzZXQgaW4gTVhNTCwgZS5nLlxuICogPHNpZ25hbHM6U2lnbmFsIGlkPVwibmFtZUNoYW5nZWRcIj57W1N0cmluZywgdWludF19PC9zaWduYWxzOlNpZ25hbD5cbiAqL1xuLypbRGVmYXVsdFByb3BlcnR5KFwidmFsdWVDbGFzc2VzXCIpXSovXG4vKipcbiAqIFNpZ25hbCBkaXNwYXRjaGVzIGV2ZW50cyB0byBtdWx0aXBsZSBsaXN0ZW5lcnMuXG4gKiBJdCBpcyBpbnNwaXJlZCBieSBDIyBldmVudHMgYW5kIGRlbGVnYXRlcywgYW5kIGJ5XG4gKiA8YSB0YXJnZXQ9XCJfdG9wXCIgaHJlZj1cImh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU2lnbmFsc19hbmRfc2xvdHNcIj5zaWduYWxzIGFuZCBzbG90czwvYT5cbiAqIGluIFF0LlxuICogQSBTaWduYWwgYWRkcyBldmVudCBkaXNwYXRjaGluZyBmdW5jdGlvbmFsaXR5IHRocm91Z2ggY29tcG9zaXRpb24gYW5kIGludGVyZmFjZXMsXG4gKiByYXRoZXIgdGhhbiBpbmhlcml0aW5nIGZyb20gYSBkaXNwYXRjaGVyLlxuICogPGJyLz48YnIvPlxuICogUHJvamVjdCBob21lOiA8YSB0YXJnZXQ9XCJfdG9wXCIgaHJlZj1cImh0dHA6Ly9naXRodWIuY29tL3JvYmVydHBlbm5lci9hczMtc2lnbmFscy9cIj5odHRwOi8vZ2l0aHViLmNvbS9yb2JlcnRwZW5uZXIvYXMzLXNpZ25hbHMvPC9hPlxuICovXG52YXIgU2lnbmFsID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoU2lnbmFsLCBfc3VwZXIpO1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBTaWduYWwgaW5zdGFuY2UgdG8gZGlzcGF0Y2ggdmFsdWUgb2JqZWN0cy5cbiAgICAgKiBAcGFyYW0gICAgdmFsdWVDbGFzc2VzIEFueSBudW1iZXIgb2YgY2xhc3MgcmVmZXJlbmNlcyB0aGF0IGVuYWJsZSB0eXBlIGNoZWNrcyBpbiBkaXNwYXRjaCgpLlxuICAgICAqIEZvciBleGFtcGxlLCBuZXcgU2lnbmFsKFN0cmluZywgdWludClcbiAgICAgKiB3b3VsZCBhbGxvdzogc2lnbmFsLmRpc3BhdGNoKFwidGhlIEFuc3dlclwiLCA0MilcbiAgICAgKiBidXQgbm90OiBzaWduYWwuZGlzcGF0Y2godHJ1ZSwgNDIuNSlcbiAgICAgKiBub3I6IHNpZ25hbC5kaXNwYXRjaCgpXG4gICAgICpcbiAgICAgKiBOT1RFOiBJbiBBUzMsIHN1YmNsYXNzZXMgY2Fubm90IGNhbGwgc3VwZXIuYXBwbHkobnVsbCwgdmFsdWVDbGFzc2VzKSxcbiAgICAgKiBidXQgdGhpcyBjb25zdHJ1Y3RvciBoYXMgbG9naWMgdG8gc3VwcG9ydCBzdXBlcih2YWx1ZUNsYXNzZXMpLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIFNpZ25hbCgpIHtcbiAgICAgICAgdmFyIHZhbHVlQ2xhc3NlcyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgdmFsdWVDbGFzc2VzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgIH1cbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgLy8gQ2Fubm90IHVzZSBzdXBlci5hcHBseShudWxsLCB2YWx1ZUNsYXNzZXMpLCBzbyBhbGxvdyB0aGUgc3ViY2xhc3MgdG8gY2FsbCBzdXBlcih2YWx1ZUNsYXNzZXMpLlxuICAgICAgICB2YWx1ZUNsYXNzZXMgPSAodmFsdWVDbGFzc2VzLmxlbmd0aCA9PSAxICYmIHZhbHVlQ2xhc3Nlc1swXSBpbnN0YW5jZW9mIEFycmF5KSA/IHZhbHVlQ2xhc3Nlc1swXSA6IHZhbHVlQ2xhc3NlcztcbiAgICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCB2YWx1ZUNsYXNzZXMpIHx8IHRoaXM7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKiBAdGhyb3dzIGZsYXNoLmVycm9ycy5JbGxlZ2FsT3BlcmF0aW9uRXJyb3IgPGNvZGU+SWxsZWdhbE9wZXJhdGlvbkVycm9yPC9jb2RlPjogWW91IGNhbm5vdCBhZGRPbmNlKCkgdGhlbiBhZGQoKSB0aGUgc2FtZSBsaXN0ZW5lciB3aXRob3V0IHJlbW92aW5nIHRoZSByZWxhdGlvbnNoaXAgZmlyc3QuXG4gICAgICogQHRocm93cyBBcmd1bWVudEVycm9yIDxjb2RlPkFyZ3VtZW50RXJyb3I8L2NvZGU+OiBHaXZlbiBsaXN0ZW5lciBpcyA8Y29kZT5udWxsPC9jb2RlPi5cbiAgICAgKi9cbiAgICBTaWduYWwucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIChsaXN0ZW5lcikge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWdpc3Rlckxpc3RlbmVyKGxpc3RlbmVyKTtcbiAgICB9O1xuICAgIHJldHVybiBTaWduYWw7XG59KE9uY2VTaWduYWxfMS5PbmNlU2lnbmFsKSk7XG5leHBvcnRzLlNpZ25hbCA9IFNpZ25hbDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNpZ25hbC5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9zaWduYWxzLmpzL2xpYi9vcmcvb3NmbGFzaC9zaWduYWxzL1NpZ25hbC5qc1xuLy8gbW9kdWxlIGlkID0gNlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbi8qKlxuICogVGhlIFNsb3RMaXN0IGNsYXNzIHJlcHJlc2VudHMgYW4gaW1tdXRhYmxlIGxpc3Qgb2YgU2xvdCBvYmplY3RzLlxuICpcbiAqIEBhdXRob3IgSm9hIEViZXJ0XG4gKiBAYXV0aG9yIFJvYmVydCBQZW5uZXJcbiAqL1xudmFyIFNsb3RMaXN0ID0gKGZ1bmN0aW9uICgpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IFNsb3RMaXN0IG9iamVjdC5cbiAgICAgKlxuICAgICAqIDxwPkEgdXNlciBuZXZlciBoYXMgdG8gY3JlYXRlIGEgU2xvdExpc3QgbWFudWFsbHkuXG4gICAgICogVXNlIHRoZSA8Y29kZT5OSUw8L2NvZGU+IGVsZW1lbnQgdG8gcmVwcmVzZW50IGFuIGVtcHR5IGxpc3QuXG4gICAgICogPGNvZGU+TklMLnByZXBlbmQodmFsdWUpPC9jb2RlPiB3b3VsZCBjcmVhdGUgYSBsaXN0IGNvbnRhaW5pbmcgPGNvZGU+dmFsdWU8L2NvZGU+PC9wPi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBoZWFkIFRoZSBmaXJzdCBzbG90IGluIHRoZSBsaXN0LlxuICAgICAqIEBwYXJhbSB0YWlsIEEgbGlzdCBjb250YWluaW5nIGFsbCBzbG90cyBleGNlcHQgaGVhZC5cbiAgICAgKlxuICAgICAqIEB0aHJvd3MgQXJndW1lbnRFcnJvciA8Y29kZT5Bcmd1bWVudEVycm9yPC9jb2RlPjogUGFyYW1ldGVycyBoZWFkIGFuZCB0YWlsIGFyZSBudWxsLiBVc2UgdGhlIE5JTCBlbGVtZW50IGluc3RlYWQuXG4gICAgICogQHRocm93cyBBcmd1bWVudEVycm9yIDxjb2RlPkFyZ3VtZW50RXJyb3I8L2NvZGU+OiBQYXJhbWV0ZXIgaGVhZCBjYW5ub3QgYmUgbnVsbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBTbG90TGlzdChoZWFkLCB0YWlsKSB7XG4gICAgICAgIGlmICh0YWlsID09PSB2b2lkIDApIHsgdGFpbCA9IG51bGw7IH1cbiAgICAgICAgdGhpcy5ub25FbXB0eSA9IGZhbHNlO1xuICAgICAgICBpZiAoIWhlYWQgJiYgIXRhaWwpIHtcbiAgICAgICAgICAgIGlmIChTbG90TGlzdC5OSUwpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQYXJhbWV0ZXJzIGhlYWQgYW5kIHRhaWwgYXJlIG51bGwuIFVzZSB0aGUgTklMIGVsZW1lbnQgaW5zdGVhZC4nKTtcbiAgICAgICAgICAgIC8vdGhpcyBpcyB0aGUgTklMIGVsZW1lbnQgYXMgcGVyIGRlZmluaXRpb25cbiAgICAgICAgICAgIHRoaXMubm9uRW1wdHkgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghaGVhZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQYXJhbWV0ZXIgaGVhZCBjYW5ub3QgYmUgbnVsbC4nKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaGVhZCA9IGhlYWQ7XG4gICAgICAgICAgICB0aGlzLnRhaWwgPSB0YWlsIHx8IFNsb3RMaXN0Lk5JTDtcbiAgICAgICAgICAgIHRoaXMubm9uRW1wdHkgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTbG90TGlzdC5wcm90b3R5cGUsIFwibGVuZ3RoXCIsIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBudW1iZXIgb2Ygc2xvdHMgaW4gdGhlIGxpc3QuXG4gICAgICAgICAqL1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5ub25FbXB0eSlcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIGlmICh0aGlzLnRhaWwgPT0gU2xvdExpc3QuTklMKVxuICAgICAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICAgICAgLy8gV2UgY291bGQgY2FjaGUgdGhlIGxlbmd0aCwgYnV0IGl0IHdvdWxkIG1ha2UgbWV0aG9kcyBsaWtlIGZpbHRlck5vdCB1bm5lY2Vzc2FyaWx5IGNvbXBsaWNhdGVkLlxuICAgICAgICAgICAgLy8gSW5zdGVhZCB3ZSBhc3N1bWUgdGhhdCBPKG4pIGlzIG9rYXkgc2luY2UgdGhlIGxlbmd0aCBwcm9wZXJ0eSBpcyB1c2VkIGluIHJhcmUgY2FzZXMuXG4gICAgICAgICAgICAvLyBXZSBjb3VsZCBhbHNvIGNhY2hlIHRoZSBsZW5ndGggbGF6eSwgYnV0IHRoYXQgaXMgYSB3YXN0ZSBvZiBhbm90aGVyIDhiIHBlciBsaXN0IG5vZGUgKGF0IGxlYXN0KS5cbiAgICAgICAgICAgIHZhciByZXN1bHQgPSAwO1xuICAgICAgICAgICAgdmFyIHAgPSB0aGlzO1xuICAgICAgICAgICAgd2hpbGUgKHAubm9uRW1wdHkpIHtcbiAgICAgICAgICAgICAgICArK3Jlc3VsdDtcbiAgICAgICAgICAgICAgICBwID0gcC50YWlsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgLyoqXG4gICAgICogUHJlcGVuZHMgYSBzbG90IHRvIHRoaXMgbGlzdC5cbiAgICAgKiBAcGFyYW0gICAgc2xvdCBUaGUgaXRlbSB0byBiZSBwcmVwZW5kZWQuXG4gICAgICogQHJldHVybiAgICBBIGxpc3QgY29uc2lzdGluZyBvZiBzbG90IGZvbGxvd2VkIGJ5IGFsbCBlbGVtZW50cyBvZiB0aGlzIGxpc3QuXG4gICAgICpcbiAgICAgKiBAdGhyb3dzIEFyZ3VtZW50RXJyb3IgPGNvZGU+QXJndW1lbnRFcnJvcjwvY29kZT46IFBhcmFtZXRlciBoZWFkIGNhbm5vdCBiZSBudWxsLlxuICAgICAqL1xuICAgIFNsb3RMaXN0LnByb3RvdHlwZS5wcmVwZW5kID0gZnVuY3Rpb24gKHNsb3QpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTbG90TGlzdChzbG90LCB0aGlzKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEFwcGVuZHMgYSBzbG90IHRvIHRoaXMgbGlzdC5cbiAgICAgKiBOb3RlOiBhcHBlbmRpbmcgaXMgTyhuKS4gV2hlcmUgcG9zc2libGUsIHByZXBlbmQgd2hpY2ggaXMgTygxKS5cbiAgICAgKiBJbiBzb21lIGNhc2VzLCBtYW55IGxpc3QgaXRlbXMgbXVzdCBiZSBjbG9uZWQgdG9cbiAgICAgKiBhdm9pZCBjaGFuZ2luZyBleGlzdGluZyBsaXN0cy5cbiAgICAgKiBAcGFyYW0gICAgc2xvdCBUaGUgaXRlbSB0byBiZSBhcHBlbmRlZC5cbiAgICAgKiBAcmV0dXJuICAgIEEgbGlzdCBjb25zaXN0aW5nIG9mIGFsbCBlbGVtZW50cyBvZiB0aGlzIGxpc3QgZm9sbG93ZWQgYnkgc2xvdC5cbiAgICAgKi9cbiAgICBTbG90TGlzdC5wcm90b3R5cGUuYXBwZW5kID0gZnVuY3Rpb24gKHNsb3QpIHtcbiAgICAgICAgaWYgKCFzbG90KVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIGlmICghdGhpcy5ub25FbXB0eSlcbiAgICAgICAgICAgIHJldHVybiBuZXcgU2xvdExpc3Qoc2xvdCk7XG4gICAgICAgIC8vIFNwZWNpYWwgY2FzZToganVzdCBvbmUgc2xvdCBjdXJyZW50bHkgaW4gdGhlIGxpc3QuXG4gICAgICAgIGlmICh0aGlzLnRhaWwgPT0gU2xvdExpc3QuTklMKVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBTbG90TGlzdChzbG90KS5wcmVwZW5kKHRoaXMuaGVhZCk7XG4gICAgICAgIC8vIFRoZSBsaXN0IGFscmVhZHkgaGFzIHR3byBvciBtb3JlIHNsb3RzLlxuICAgICAgICAvLyBXZSBoYXZlIHRvIGJ1aWxkIGEgbmV3IGxpc3Qgd2l0aCBjbG9uZWQgaXRlbXMgYmVjYXVzZSB0aGV5IGFyZSBpbW11dGFibGUuXG4gICAgICAgIHZhciB3aG9sZUNsb25lID0gbmV3IFNsb3RMaXN0KHRoaXMuaGVhZCk7XG4gICAgICAgIHZhciBzdWJDbG9uZSA9IHdob2xlQ2xvbmU7XG4gICAgICAgIHZhciBjdXJyZW50ID0gdGhpcy50YWlsO1xuICAgICAgICB3aGlsZSAoY3VycmVudC5ub25FbXB0eSkge1xuICAgICAgICAgICAgc3ViQ2xvbmUgPSBzdWJDbG9uZS50YWlsID0gbmV3IFNsb3RMaXN0KGN1cnJlbnQuaGVhZCk7XG4gICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC50YWlsO1xuICAgICAgICB9XG4gICAgICAgIC8vIEFwcGVuZCB0aGUgbmV3IHNsb3QgbGFzdC5cbiAgICAgICAgc3ViQ2xvbmUudGFpbCA9IG5ldyBTbG90TGlzdChzbG90KTtcbiAgICAgICAgcmV0dXJuIHdob2xlQ2xvbmU7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBJbnNlcnQgYSBzbG90IGludG8gdGhlIGxpc3QgaW4gYSBwb3NpdGlvbiBhY2NvcmRpbmcgdG8gaXRzIHByaW9yaXR5LlxuICAgICAqIFRoZSBoaWdoZXIgdGhlIHByaW9yaXR5LCB0aGUgY2xvc2VyIHRoZSBpdGVtIHdpbGwgYmUgaW5zZXJ0ZWQgdG8gdGhlIGxpc3QgaGVhZC5cbiAgICAgKiBAcGFyYW1zIHNsb3QgVGhlIGl0ZW0gdG8gYmUgaW5zZXJ0ZWQuXG4gICAgICpcbiAgICAgKiBAdGhyb3dzIEFyZ3VtZW50RXJyb3IgPGNvZGU+QXJndW1lbnRFcnJvcjwvY29kZT46IFBhcmFtZXRlcnMgaGVhZCBhbmQgdGFpbCBhcmUgbnVsbC4gVXNlIHRoZSBOSUwgZWxlbWVudCBpbnN0ZWFkLlxuICAgICAqIEB0aHJvd3MgQXJndW1lbnRFcnJvciA8Y29kZT5Bcmd1bWVudEVycm9yPC9jb2RlPjogUGFyYW1ldGVyIGhlYWQgY2Fubm90IGJlIG51bGwuXG4gICAgICovXG4gICAgU2xvdExpc3QucHJvdG90eXBlLmluc2VydFdpdGhQcmlvcml0eSA9IGZ1bmN0aW9uIChzbG90KSB7XG4gICAgICAgIGlmICghdGhpcy5ub25FbXB0eSlcbiAgICAgICAgICAgIHJldHVybiBuZXcgU2xvdExpc3Qoc2xvdCk7XG4gICAgICAgIHZhciBwcmlvcml0eSA9IHNsb3QucHJpb3JpdHk7XG4gICAgICAgIC8vIFNwZWNpYWwgY2FzZTogbmV3IHNsb3QgaGFzIHRoZSBoaWdoZXN0IHByaW9yaXR5LlxuICAgICAgICBpZiAocHJpb3JpdHkgPiB0aGlzLmhlYWQucHJpb3JpdHkpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcmVwZW5kKHNsb3QpO1xuICAgICAgICB2YXIgd2hvbGVDbG9uZSA9IG5ldyBTbG90TGlzdCh0aGlzLmhlYWQpO1xuICAgICAgICB2YXIgc3ViQ2xvbmUgPSB3aG9sZUNsb25lO1xuICAgICAgICB2YXIgY3VycmVudCA9IHRoaXMudGFpbDtcbiAgICAgICAgLy8gRmluZCBhIHNsb3Qgd2l0aCBsb3dlciBwcmlvcml0eSBhbmQgZ28gaW4gZnJvbnQgb2YgaXQuXG4gICAgICAgIHdoaWxlIChjdXJyZW50Lm5vbkVtcHR5KSB7XG4gICAgICAgICAgICBpZiAocHJpb3JpdHkgPiBjdXJyZW50LmhlYWQucHJpb3JpdHkpIHtcbiAgICAgICAgICAgICAgICBzdWJDbG9uZS50YWlsID0gY3VycmVudC5wcmVwZW5kKHNsb3QpO1xuICAgICAgICAgICAgICAgIHJldHVybiB3aG9sZUNsb25lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3ViQ2xvbmUgPSBzdWJDbG9uZS50YWlsID0gbmV3IFNsb3RMaXN0KGN1cnJlbnQuaGVhZCk7XG4gICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC50YWlsO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNsb3QgaGFzIGxvd2VzdCBwcmlvcml0eS5cbiAgICAgICAgc3ViQ2xvbmUudGFpbCA9IG5ldyBTbG90TGlzdChzbG90KTtcbiAgICAgICAgcmV0dXJuIHdob2xlQ2xvbmU7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBzbG90cyBpbiB0aGlzIGxpc3QgdGhhdCBkbyBub3QgY29udGFpbiB0aGUgc3VwcGxpZWQgbGlzdGVuZXIuXG4gICAgICogTm90ZTogYXNzdW1lcyB0aGUgbGlzdGVuZXIgaXMgbm90IHJlcGVhdGVkIHdpdGhpbiB0aGUgbGlzdC5cbiAgICAgKiBAcGFyYW0gICAgbGlzdGVuZXIgVGhlIGZ1bmN0aW9uIHRvIHJlbW92ZS5cbiAgICAgKiBAcmV0dXJuIEEgbGlzdCBjb25zaXN0aW5nIG9mIGFsbCBlbGVtZW50cyBvZiB0aGlzIGxpc3QgdGhhdCBkbyBub3QgaGF2ZSBsaXN0ZW5lci5cbiAgICAgKi9cbiAgICBTbG90TGlzdC5wcm90b3R5cGUuZmlsdGVyTm90ID0gZnVuY3Rpb24gKGxpc3RlbmVyKSB7XG4gICAgICAgIGlmICghdGhpcy5ub25FbXB0eSB8fCBsaXN0ZW5lciA9PSBudWxsKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIGlmIChsaXN0ZW5lciA9PSB0aGlzLmhlYWQubGlzdGVuZXIpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy50YWlsO1xuICAgICAgICAvLyBUaGUgZmlyc3QgaXRlbSB3YXNuJ3QgYSBtYXRjaCBzbyB0aGUgZmlsdGVyZWQgbGlzdCB3aWxsIGNvbnRhaW4gaXQuXG4gICAgICAgIHZhciB3aG9sZUNsb25lID0gbmV3IFNsb3RMaXN0KHRoaXMuaGVhZCk7XG4gICAgICAgIHZhciBzdWJDbG9uZSA9IHdob2xlQ2xvbmU7XG4gICAgICAgIHZhciBjdXJyZW50ID0gdGhpcy50YWlsO1xuICAgICAgICB3aGlsZSAoY3VycmVudC5ub25FbXB0eSkge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnQuaGVhZC5saXN0ZW5lciA9PSBsaXN0ZW5lcikge1xuICAgICAgICAgICAgICAgIC8vIFNwbGljZSBvdXQgdGhlIGN1cnJlbnQgaGVhZC5cbiAgICAgICAgICAgICAgICBzdWJDbG9uZS50YWlsID0gY3VycmVudC50YWlsO1xuICAgICAgICAgICAgICAgIHJldHVybiB3aG9sZUNsb25lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3ViQ2xvbmUgPSBzdWJDbG9uZS50YWlsID0gbmV3IFNsb3RMaXN0KGN1cnJlbnQuaGVhZCk7XG4gICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC50YWlsO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRoZSBsaXN0ZW5lciB3YXMgbm90IGZvdW5kIHNvIHRoaXMgbGlzdCBpcyB1bmNoYW5nZWQuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBzdXBwbGllZCBsaXN0ZW5lciBGdW5jdGlvbiBpcyBjb250YWluZWQgd2l0aGluIHRoaXMgbGlzdFxuICAgICAqL1xuICAgIFNsb3RMaXN0LnByb3RvdHlwZS5jb250YWlucyA9IGZ1bmN0aW9uIChsaXN0ZW5lcikge1xuICAgICAgICBpZiAoIXRoaXMubm9uRW1wdHkpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHZhciBwID0gdGhpcztcbiAgICAgICAgd2hpbGUgKHAubm9uRW1wdHkpIHtcbiAgICAgICAgICAgIGlmIChwLmhlYWQubGlzdGVuZXIgPT0gbGlzdGVuZXIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICBwID0gcC50YWlsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHJpZXZlcyB0aGUgSVNsb3QgYXNzb2NpYXRlZCB3aXRoIGEgc3VwcGxpZWQgbGlzdGVuZXIgd2l0aGluIHRoZSBTbG90TGlzdC5cbiAgICAgKiBAcGFyYW0gICBsaXN0ZW5lciBUaGUgRnVuY3Rpb24gYmVpbmcgc2VhcmNoZWQgZm9yXG4gICAgICogQHJldHVybiAgVGhlIElTbG90IGluIHRoaXMgbGlzdCBhc3NvY2lhdGVkIHdpdGggdGhlIGxpc3RlbmVyIHBhcmFtZXRlciB0aHJvdWdoIHRoZSBJU2xvdC5saXN0ZW5lciBwcm9wZXJ0eS5cbiAgICAgKiAgICAgICAgICBSZXR1cm5zIG51bGwgaWYgbm8gc3VjaCBJU2xvdCBpbnN0YW5jZSBleGlzdHMgb3IgdGhlIGxpc3QgaXMgZW1wdHkuXG4gICAgICovXG4gICAgU2xvdExpc3QucHJvdG90eXBlLmZpbmQgPSBmdW5jdGlvbiAobGlzdGVuZXIpIHtcbiAgICAgICAgaWYgKCF0aGlzLm5vbkVtcHR5KVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIHZhciBwID0gdGhpcztcbiAgICAgICAgd2hpbGUgKHAubm9uRW1wdHkpIHtcbiAgICAgICAgICAgIGlmIChwLmhlYWQubGlzdGVuZXIgPT0gbGlzdGVuZXIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHAuaGVhZDtcbiAgICAgICAgICAgIHAgPSBwLnRhaWw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgICBTbG90TGlzdC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBidWZmZXIgPSAnJztcbiAgICAgICAgdmFyIHAgPSB0aGlzO1xuICAgICAgICB3aGlsZSAocC5ub25FbXB0eSkge1xuICAgICAgICAgICAgYnVmZmVyICs9IHAuaGVhZCArIFwiIC0+IFwiO1xuICAgICAgICAgICAgcCA9IHAudGFpbDtcbiAgICAgICAgfVxuICAgICAgICBidWZmZXIgKz0gXCJOSUxcIjtcbiAgICAgICAgcmV0dXJuIFwiW0xpc3QgXCIgKyBidWZmZXIgKyBcIl1cIjtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYW4gZW1wdHkgbGlzdC4gVXNlZCBhcyB0aGUgbGlzdCB0ZXJtaW5hdG9yLlxuICAgICAqL1xuICAgIFNsb3RMaXN0Lk5JTCA9IG5ldyBTbG90TGlzdChudWxsLCBudWxsKTtcbiAgICByZXR1cm4gU2xvdExpc3Q7XG59KCkpO1xuZXhwb3J0cy5TbG90TGlzdCA9IFNsb3RMaXN0O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U2xvdExpc3QuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvc2lnbmFscy5qcy9saWIvb3JnL29zZmxhc2gvc2lnbmFscy9TbG90TGlzdC5qc1xuLy8gbW9kdWxlIGlkID0gN1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2V4dGVuZHMgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxuICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XG4gICAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdOyB9O1xuICAgIHJldHVybiBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgICBleHRlbmRTdGF0aWNzKGQsIGIpO1xuICAgICAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgICAgICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xuICAgIH07XG59KSgpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIHNpZ25hbHNfanNfMSA9IHJlcXVpcmUoXCJzaWduYWxzLmpzXCIpO1xudmFyIENsb2NrID0gcmVxdWlyZShcIkBnYW1lc3RkaW8vY2xvY2tcIik7XG52YXIgZGVsdGFfbGlzdGVuZXJfMSA9IHJlcXVpcmUoXCJkZWx0YS1saXN0ZW5lclwiKTtcbnZhciBtc2dwYWNrID0gcmVxdWlyZShcIm5vdGVwYWNrLmlvXCIpO1xudmFyIGZvc3NpbERlbHRhID0gcmVxdWlyZShcImZvc3NpbC1kZWx0YVwiKTtcbnZhciBQcm90b2NvbF8xID0gcmVxdWlyZShcIi4vUHJvdG9jb2xcIik7XG52YXIgUm9vbSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUm9vbSwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBSb29tKG5hbWUpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywge30pIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLmNsb2NrID0gbmV3IENsb2NrKCk7IC8vIGV4cGVyaW1lbnRhbFxuICAgICAgICBfdGhpcy5yZW1vdGVDbG9jayA9IG5ldyBDbG9jaygpOyAvLyBleHBlcmltZW50YWxcbiAgICAgICAgLy8gUHVibGljIHNpZ25hbHNcbiAgICAgICAgX3RoaXMub25Kb2luID0gbmV3IHNpZ25hbHNfanNfMS5TaWduYWwoKTtcbiAgICAgICAgX3RoaXMub25VcGRhdGUgPSBuZXcgc2lnbmFsc19qc18xLlNpZ25hbCgpO1xuICAgICAgICBfdGhpcy5vbkRhdGEgPSBuZXcgc2lnbmFsc19qc18xLlNpZ25hbCgpO1xuICAgICAgICBfdGhpcy5vbkVycm9yID0gbmV3IHNpZ25hbHNfanNfMS5TaWduYWwoKTtcbiAgICAgICAgX3RoaXMub25MZWF2ZSA9IG5ldyBzaWduYWxzX2pzXzEuU2lnbmFsKCk7XG4gICAgICAgIF90aGlzLmlkID0gbnVsbDtcbiAgICAgICAgX3RoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIF90aGlzLm9uTGVhdmUuYWRkKGZ1bmN0aW9uICgpIHsgcmV0dXJuIF90aGlzLnJlbW92ZUFsbExpc3RlbmVycygpOyB9KTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBSb29tLnByb3RvdHlwZS5jb25uZWN0ID0gZnVuY3Rpb24gKGNvbm5lY3Rpb24pIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdGhpcy5jb25uZWN0aW9uID0gY29ubmVjdGlvbjtcbiAgICAgICAgdGhpcy5jb25uZWN0aW9uLm9ubWVzc2FnZSA9IHRoaXMub25NZXNzYWdlQ2FsbGJhY2suYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5jb25uZWN0aW9uLm9uY2xvc2UgPSBmdW5jdGlvbiAoZSkgeyByZXR1cm4gX3RoaXMub25MZWF2ZS5kaXNwYXRjaChlKTsgfTtcbiAgICB9O1xuICAgIFJvb20ucHJvdG90eXBlLm9uTWVzc2FnZUNhbGxiYWNrID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIHZhciBtZXNzYWdlID0gbXNncGFjay5kZWNvZGUobmV3IFVpbnQ4QXJyYXkoZXZlbnQuZGF0YSkpO1xuICAgICAgICB2YXIgY29kZSA9IG1lc3NhZ2VbMF07XG4gICAgICAgIGlmIChjb2RlID09IFByb3RvY29sXzEuUHJvdG9jb2wuSk9JTl9ST09NKSB7XG4gICAgICAgICAgICB0aGlzLnNlc3Npb25JZCA9IG1lc3NhZ2VbMV07XG4gICAgICAgICAgICB0aGlzLm9uSm9pbi5kaXNwYXRjaCgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNvZGUgPT0gUHJvdG9jb2xfMS5Qcm90b2NvbC5KT0lOX0VSUk9SKSB7XG4gICAgICAgICAgICB0aGlzLm9uRXJyb3IuZGlzcGF0Y2gobWVzc2FnZVsyXSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY29kZSA9PSBQcm90b2NvbF8xLlByb3RvY29sLlJPT01fU1RBVEUpIHtcbiAgICAgICAgICAgIHZhciBzdGF0ZSA9IG1lc3NhZ2VbMl07XG4gICAgICAgICAgICB2YXIgcmVtb3RlQ3VycmVudFRpbWUgPSBtZXNzYWdlWzNdO1xuICAgICAgICAgICAgdmFyIHJlbW90ZUVsYXBzZWRUaW1lID0gbWVzc2FnZVs0XTtcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoc3RhdGUsIHJlbW90ZUN1cnJlbnRUaW1lLCByZW1vdGVFbGFwc2VkVGltZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY29kZSA9PSBQcm90b2NvbF8xLlByb3RvY29sLlJPT01fU1RBVEVfUEFUQ0gpIHtcbiAgICAgICAgICAgIHRoaXMucGF0Y2gobWVzc2FnZVsyXSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY29kZSA9PSBQcm90b2NvbF8xLlByb3RvY29sLlJPT01fREFUQSkge1xuICAgICAgICAgICAgdGhpcy5vbkRhdGEuZGlzcGF0Y2gobWVzc2FnZVsyXSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY29kZSA9PSBQcm90b2NvbF8xLlByb3RvY29sLkxFQVZFX1JPT00pIHtcbiAgICAgICAgICAgIHRoaXMubGVhdmUoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgUm9vbS5wcm90b3R5cGUuc2V0U3RhdGUgPSBmdW5jdGlvbiAoZW5jb2RlZFN0YXRlLCByZW1vdGVDdXJyZW50VGltZSwgcmVtb3RlRWxhcHNlZFRpbWUpIHtcbiAgICAgICAgdmFyIHN0YXRlID0gbXNncGFjay5kZWNvZGUoZW5jb2RlZFN0YXRlKTtcbiAgICAgICAgdGhpcy5zZXQoc3RhdGUpO1xuICAgICAgICB0aGlzLl9wcmV2aW91c1N0YXRlID0gbmV3IFVpbnQ4QXJyYXkoZW5jb2RlZFN0YXRlKTtcbiAgICAgICAgLy8gc2V0IHJlbW90ZSBjbG9jayBwcm9wZXJ0aWVzXG4gICAgICAgIGlmIChyZW1vdGVDdXJyZW50VGltZSAmJiByZW1vdGVFbGFwc2VkVGltZSkge1xuICAgICAgICAgICAgdGhpcy5yZW1vdGVDbG9jay5jdXJyZW50VGltZSA9IHJlbW90ZUN1cnJlbnRUaW1lO1xuICAgICAgICAgICAgdGhpcy5yZW1vdGVDbG9jay5lbGFwc2VkVGltZSA9IHJlbW90ZUVsYXBzZWRUaW1lO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2xvY2suc3RhcnQoKTtcbiAgICAgICAgdGhpcy5vblVwZGF0ZS5kaXNwYXRjaChzdGF0ZSk7XG4gICAgfTtcbiAgICBSb29tLnByb3RvdHlwZS5wYXRjaCA9IGZ1bmN0aW9uIChiaW5hcnlQYXRjaCkge1xuICAgICAgICAvL1xuICAgICAgICAvLyBjYWxjdWxhdGUgY2xpZW50LXNpZGUgcGluZ1xuICAgICAgICAvL1xuICAgICAgICB2YXIgcGF0Y2hUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgaWYgKHRoaXMubGFzdFBhdGNoVGltZSkge1xuICAgICAgICAgICAgdGhpcy5waW5nID0gcGF0Y2hUaW1lIC0gdGhpcy5sYXN0UGF0Y2hUaW1lO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubGFzdFBhdGNoVGltZSA9IHBhdGNoVGltZTtcbiAgICAgICAgdGhpcy5jbG9jay50aWNrKCk7XG4gICAgICAgIC8vIGFwcGx5IHBhdGNoXG4gICAgICAgIHRoaXMuX3ByZXZpb3VzU3RhdGUgPSBCdWZmZXIuZnJvbShmb3NzaWxEZWx0YS5hcHBseSh0aGlzLl9wcmV2aW91c1N0YXRlLCBiaW5hcnlQYXRjaCkpO1xuICAgICAgICAvLyB0cmlnZ2VyIHN0YXRlIGNhbGxiYWNrc1xuICAgICAgICB0aGlzLnNldChtc2dwYWNrLmRlY29kZSh0aGlzLl9wcmV2aW91c1N0YXRlKSk7XG4gICAgICAgIHRoaXMub25VcGRhdGUuZGlzcGF0Y2godGhpcy5kYXRhKTtcbiAgICB9O1xuICAgIFJvb20ucHJvdG90eXBlLmxlYXZlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5pZCkge1xuICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uLmNsb3NlKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFJvb20ucHJvdG90eXBlLnNlbmQgPSBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICB0aGlzLmNvbm5lY3Rpb24uc2VuZChbUHJvdG9jb2xfMS5Qcm90b2NvbC5ST09NX0RBVEEsIHRoaXMuaWQsIGRhdGFdKTtcbiAgICB9O1xuICAgIFJvb20ucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgX3N1cGVyLnByb3RvdHlwZS5yZW1vdmVBbGxMaXN0ZW5lcnMuY2FsbCh0aGlzKTtcbiAgICAgICAgdGhpcy5vbkpvaW4ucmVtb3ZlQWxsKCk7XG4gICAgICAgIHRoaXMub25VcGRhdGUucmVtb3ZlQWxsKCk7XG4gICAgICAgIHRoaXMub25EYXRhLnJlbW92ZUFsbCgpO1xuICAgICAgICB0aGlzLm9uRXJyb3IucmVtb3ZlQWxsKCk7XG4gICAgICAgIHRoaXMub25MZWF2ZS5yZW1vdmVBbGwoKTtcbiAgICB9O1xuICAgIHJldHVybiBSb29tO1xufShkZWx0YV9saXN0ZW5lcl8xLkRlbHRhQ29udGFpbmVyKSk7XG5leHBvcnRzLlJvb20gPSBSb29tO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9zcmMvUm9vbS50c1xuLy8gbW9kdWxlIGlkID0gOFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciBDbGllbnRfMSA9IHJlcXVpcmUoXCIuL0NsaWVudFwiKTtcbmV4cG9ydHMuQ2xpZW50ID0gQ2xpZW50XzEuQ2xpZW50O1xudmFyIFByb3RvY29sXzEgPSByZXF1aXJlKFwiLi9Qcm90b2NvbFwiKTtcbmV4cG9ydHMuUHJvdG9jb2wgPSBQcm90b2NvbF8xLlByb3RvY29sO1xudmFyIFJvb21fMSA9IHJlcXVpcmUoXCIuL1Jvb21cIik7XG5leHBvcnRzLlJvb20gPSBSb29tXzEuUm9vbTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vc3JjL2luZGV4LnRzXG4vLyBtb2R1bGUgaWQgPSA5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIG1zZ3BhY2sgPSByZXF1aXJlKFwibm90ZXBhY2suaW9cIik7XG52YXIgc2lnbmFsc19qc18xID0gcmVxdWlyZShcInNpZ25hbHMuanNcIik7XG52YXIgUHJvdG9jb2xfMSA9IHJlcXVpcmUoXCIuL1Byb3RvY29sXCIpO1xudmFyIFJvb21fMSA9IHJlcXVpcmUoXCIuL1Jvb21cIik7XG52YXIgQ29ubmVjdGlvbl8xID0gcmVxdWlyZShcIi4vQ29ubmVjdGlvblwiKTtcbnZhciBDbGllbnQgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQ2xpZW50KHVybCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAvLyBzaWduYWxzXG4gICAgICAgIHRoaXMub25PcGVuID0gbmV3IHNpZ25hbHNfanNfMS5TaWduYWwoKTtcbiAgICAgICAgdGhpcy5vbk1lc3NhZ2UgPSBuZXcgc2lnbmFsc19qc18xLlNpZ25hbCgpO1xuICAgICAgICB0aGlzLm9uQ2xvc2UgPSBuZXcgc2lnbmFsc19qc18xLlNpZ25hbCgpO1xuICAgICAgICB0aGlzLm9uRXJyb3IgPSBuZXcgc2lnbmFsc19qc18xLlNpZ25hbCgpO1xuICAgICAgICB0aGlzLnJvb21zID0ge307XG4gICAgICAgIHRoaXMuY29ubmVjdGluZ1Jvb21zID0ge307XG4gICAgICAgIHRoaXMuam9pblJlcXVlc3RJZCA9IDA7XG4gICAgICAgIHRoaXMuc3RvcmFnZSA9IHdpbmRvdy5sb2NhbFN0b3JhZ2U7XG4gICAgICAgIHRoaXMuaG9zdG5hbWUgPSB1cmw7XG4gICAgICAgIHZhciBjb2x5c2V1c2lkID0gdGhpcy5zdG9yYWdlLmdldEl0ZW0oJ2NvbHlzZXVzaWQnKTtcbiAgICAgICAgaWYgKCEoY29seXNldXNpZCBpbnN0YW5jZW9mIFByb21pc2UpKSB7XG4gICAgICAgICAgICAvLyBicm93c2VyIGhhcyBzeW5jaHJvbm91cyByZXR1cm5cbiAgICAgICAgICAgIHRoaXMuY3JlYXRlQ29ubmVjdGlvbihjb2x5c2V1c2lkKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIHJlYWN0LW5hdGl2ZSBpcyBhc3luY2hyb25vdXNcbiAgICAgICAgICAgIGNvbHlzZXVzaWQudGhlbihmdW5jdGlvbiAoaWQpIHsgcmV0dXJuIF90aGlzLmNyZWF0ZUNvbm5lY3Rpb24oaWQpOyB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBDbGllbnQucHJvdG90eXBlLmNyZWF0ZUNvbm5lY3Rpb24gPSBmdW5jdGlvbiAoY29seXNldXNpZCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB0aGlzLmlkID0gY29seXNldXNpZCB8fCBcIlwiO1xuICAgICAgICB0aGlzLmNvbm5lY3Rpb24gPSBuZXcgQ29ubmVjdGlvbl8xLkNvbm5lY3Rpb24odGhpcy5ob3N0bmFtZSArIFwiLz9jb2x5c2V1c2lkPVwiICsgdGhpcy5pZCk7XG4gICAgICAgIHRoaXMuY29ubmVjdGlvbi5vbm1lc3NhZ2UgPSB0aGlzLm9uTWVzc2FnZUNhbGxiYWNrLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuY29ubmVjdGlvbi5vbmNsb3NlID0gZnVuY3Rpb24gKGUpIHsgcmV0dXJuIF90aGlzLm9uQ2xvc2UuZGlzcGF0Y2goKTsgfTtcbiAgICAgICAgdGhpcy5jb25uZWN0aW9uLm9uZXJyb3IgPSBmdW5jdGlvbiAoZSkgeyByZXR1cm4gX3RoaXMub25FcnJvci5kaXNwYXRjaCgpOyB9O1xuICAgICAgICAvLyBjaGVjayBmb3IgaWQgb24gY29va2llXG4gICAgICAgIHRoaXMuY29ubmVjdGlvbi5vbm9wZW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoX3RoaXMuaWQpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5vbk9wZW4uZGlzcGF0Y2goKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9O1xuICAgIENsaWVudC5wcm90b3R5cGUuam9pbiA9IGZ1bmN0aW9uIChyb29tTmFtZSwgb3B0aW9ucykge1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgICAgICBvcHRpb25zLnJlcXVlc3RJZCA9ICsrdGhpcy5qb2luUmVxdWVzdElkO1xuICAgICAgICB0aGlzLmNvbm5lY3RpbmdSb29tc1tvcHRpb25zLnJlcXVlc3RJZF0gPSBuZXcgUm9vbV8xLlJvb20ocm9vbU5hbWUpO1xuICAgICAgICB0aGlzLmNvbm5lY3Rpb24uc2VuZChbUHJvdG9jb2xfMS5Qcm90b2NvbC5KT0lOX1JPT00sIHJvb21OYW1lLCBvcHRpb25zXSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbm5lY3RpbmdSb29tc1tvcHRpb25zLnJlcXVlc3RJZF07XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAb3ZlcnJpZGVcbiAgICAgKi9cbiAgICBDbGllbnQucHJvdG90eXBlLm9uTWVzc2FnZUNhbGxiYWNrID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBtZXNzYWdlID0gbXNncGFjay5kZWNvZGUobmV3IFVpbnQ4QXJyYXkoZXZlbnQuZGF0YSkpO1xuICAgICAgICB2YXIgY29kZSA9IG1lc3NhZ2VbMF07XG4gICAgICAgIGlmIChjb2RlID09IFByb3RvY29sXzEuUHJvdG9jb2wuVVNFUl9JRCkge1xuICAgICAgICAgICAgdGhpcy5zdG9yYWdlLnNldEl0ZW0oJ2NvbHlzZXVzaWQnLCBtZXNzYWdlWzFdKTtcbiAgICAgICAgICAgIHRoaXMuaWQgPSBtZXNzYWdlWzFdO1xuICAgICAgICAgICAgdGhpcy5vbk9wZW4uZGlzcGF0Y2goKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjb2RlID09IFByb3RvY29sXzEuUHJvdG9jb2wuSk9JTl9ST09NKSB7XG4gICAgICAgICAgICB2YXIgcmVxdWVzdElkID0gbWVzc2FnZVsyXTtcbiAgICAgICAgICAgIHZhciByb29tXzEgPSB0aGlzLmNvbm5lY3RpbmdSb29tc1tyZXF1ZXN0SWRdO1xuICAgICAgICAgICAgdGhpcy5yb29tc1tyb29tXzEuaWRdID0gcm9vbV8xO1xuICAgICAgICAgICAgcm9vbV8xLmlkID0gbWVzc2FnZVsxXTtcbiAgICAgICAgICAgIHJvb21fMS5jb25uZWN0KG5ldyBDb25uZWN0aW9uXzEuQ29ubmVjdGlvbih0aGlzLmhvc3RuYW1lICsgXCIvXCIgKyByb29tXzEuaWQgKyBcIj9jb2x5c2V1c2lkPVwiICsgdGhpcy5pZCkpO1xuICAgICAgICAgICAgcm9vbV8xLm9uTGVhdmUuYWRkKGZ1bmN0aW9uICgpIHsgcmV0dXJuIGRlbGV0ZSBfdGhpcy5yb29tc1tyb29tXzEuaWRdOyB9KTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNvbm5lY3RpbmdSb29tc1tyZXF1ZXN0SWRdO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNvZGUgPT0gUHJvdG9jb2xfMS5Qcm90b2NvbC5KT0lOX0VSUk9SKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwic2VydmVyIGVycm9yOlwiLCBtZXNzYWdlWzJdKTtcbiAgICAgICAgICAgIC8vIGdlbmVyYWwgZXJyb3JcbiAgICAgICAgICAgIHRoaXMub25FcnJvci5kaXNwYXRjaChtZXNzYWdlWzJdKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMub25NZXNzYWdlLmRpc3BhdGNoKG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gQ2xpZW50O1xufSgpKTtcbmV4cG9ydHMuQ2xpZW50ID0gQ2xpZW50O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9zcmMvQ2xpZW50LnRzXG4vLyBtb2R1bGUgaWQgPSAxMFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG5cbmZ1bmN0aW9uIHV0ZjhXcml0ZSh2aWV3LCBvZmZzZXQsIHN0cikge1xuICB2YXIgYyA9IDA7XG4gIGZvciAodmFyIGkgPSAwLCBsID0gc3RyLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGMgPSBzdHIuY2hhckNvZGVBdChpKTtcbiAgICBpZiAoYyA8IDB4ODApIHtcbiAgICAgIHZpZXcuc2V0VWludDgob2Zmc2V0KyssIGMpO1xuICAgIH1cbiAgICBlbHNlIGlmIChjIDwgMHg4MDApIHtcbiAgICAgIHZpZXcuc2V0VWludDgob2Zmc2V0KyssIDB4YzAgfCAoYyA+PiA2KSk7XG4gICAgICB2aWV3LnNldFVpbnQ4KG9mZnNldCsrLCAweDgwIHwgKGMgJiAweDNmKSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGMgPCAweGQ4MDAgfHwgYyA+PSAweGUwMDApIHtcbiAgICAgIHZpZXcuc2V0VWludDgob2Zmc2V0KyssIDB4ZTAgfCAoYyA+PiAxMikpO1xuICAgICAgdmlldy5zZXRVaW50OChvZmZzZXQrKywgMHg4MCB8IChjID4+IDYpICYgMHgzZik7XG4gICAgICB2aWV3LnNldFVpbnQ4KG9mZnNldCsrLCAweDgwIHwgKGMgJiAweDNmKSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgaSsrO1xuICAgICAgYyA9IDB4MTAwMDAgKyAoKChjICYgMHgzZmYpIDw8IDEwKSB8IChzdHIuY2hhckNvZGVBdChpKSAmIDB4M2ZmKSk7XG4gICAgICB2aWV3LnNldFVpbnQ4KG9mZnNldCsrLCAweGYwIHwgKGMgPj4gMTgpKTtcbiAgICAgIHZpZXcuc2V0VWludDgob2Zmc2V0KyssIDB4ODAgfCAoYyA+PiAxMikgJiAweDNmKTtcbiAgICAgIHZpZXcuc2V0VWludDgob2Zmc2V0KyssIDB4ODAgfCAoYyA+PiA2KSAmIDB4M2YpO1xuICAgICAgdmlldy5zZXRVaW50OChvZmZzZXQrKywgMHg4MCB8IChjICYgMHgzZikpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB1dGY4TGVuZ3RoKHN0cikge1xuICB2YXIgYyA9IDAsIGxlbmd0aCA9IDA7XG4gIGZvciAodmFyIGkgPSAwLCBsID0gc3RyLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGMgPSBzdHIuY2hhckNvZGVBdChpKTtcbiAgICBpZiAoYyA8IDB4ODApIHtcbiAgICAgIGxlbmd0aCArPSAxO1xuICAgIH1cbiAgICBlbHNlIGlmIChjIDwgMHg4MDApIHtcbiAgICAgIGxlbmd0aCArPSAyO1xuICAgIH1cbiAgICBlbHNlIGlmIChjIDwgMHhkODAwIHx8IGMgPj0gMHhlMDAwKSB7XG4gICAgICBsZW5ndGggKz0gMztcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBpKys7XG4gICAgICBsZW5ndGggKz0gNDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGxlbmd0aDtcbn1cblxuZnVuY3Rpb24gX2VuY29kZShieXRlcywgZGVmZXJzLCB2YWx1ZSkge1xuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZSwgaSA9IDAsIGwgPSAwLCBoaSA9IDAsIGxvID0gMCwgbGVuZ3RoID0gMCwgc2l6ZSA9IDA7XG5cbiAgaWYgKHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgbGVuZ3RoID0gdXRmOExlbmd0aCh2YWx1ZSk7XG5cbiAgICAvLyBmaXhzdHJcbiAgICBpZiAobGVuZ3RoIDwgMHgyMCkge1xuICAgICAgYnl0ZXMucHVzaChsZW5ndGggfCAweGEwKTtcbiAgICAgIHNpemUgPSAxO1xuICAgIH1cbiAgICAvLyBzdHIgOFxuICAgIGVsc2UgaWYgKGxlbmd0aCA8IDB4MTAwKSB7XG4gICAgICBieXRlcy5wdXNoKDB4ZDksIGxlbmd0aCk7XG4gICAgICBzaXplID0gMjtcbiAgICB9XG4gICAgLy8gc3RyIDE2XG4gICAgZWxzZSBpZiAobGVuZ3RoIDwgMHgxMDAwMCkge1xuICAgICAgYnl0ZXMucHVzaCgweGRhLCBsZW5ndGggPj4gOCwgbGVuZ3RoKTtcbiAgICAgIHNpemUgPSAzO1xuICAgIH1cbiAgICAvLyBzdHIgMzJcbiAgICBlbHNlIGlmIChsZW5ndGggPCAweDEwMDAwMDAwMCkge1xuICAgICAgYnl0ZXMucHVzaCgweGRiLCBsZW5ndGggPj4gMjQsIGxlbmd0aCA+PiAxNiwgbGVuZ3RoID4+IDgsIGxlbmd0aCk7XG4gICAgICBzaXplID0gNTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTdHJpbmcgdG9vIGxvbmcnKTtcbiAgICB9XG4gICAgZGVmZXJzLnB1c2goeyBzdHI6IHZhbHVlLCBsZW5ndGg6IGxlbmd0aCwgb2Zmc2V0OiBieXRlcy5sZW5ndGggfSk7XG4gICAgcmV0dXJuIHNpemUgKyBsZW5ndGg7XG4gIH1cbiAgaWYgKHR5cGUgPT09ICdudW1iZXInKSB7XG4gICAgLy8gVE9ETzogZW5jb2RlIHRvIGZsb2F0IDMyP1xuXG4gICAgLy8gZmxvYXQgNjRcbiAgICBpZiAoTWF0aC5mbG9vcih2YWx1ZSkgIT09IHZhbHVlIHx8ICFpc0Zpbml0ZSh2YWx1ZSkpIHtcbiAgICAgIGJ5dGVzLnB1c2goMHhjYik7XG4gICAgICBkZWZlcnMucHVzaCh7IGZsb2F0OiB2YWx1ZSwgbGVuZ3RoOiA4LCBvZmZzZXQ6IGJ5dGVzLmxlbmd0aCB9KTtcbiAgICAgIHJldHVybiA5O1xuICAgIH1cblxuICAgIGlmICh2YWx1ZSA+PSAwKSB7XG4gICAgICAvLyBwb3NpdGl2ZSBmaXhudW1cbiAgICAgIGlmICh2YWx1ZSA8IDB4ODApIHtcbiAgICAgICAgYnl0ZXMucHVzaCh2YWx1ZSk7XG4gICAgICAgIHJldHVybiAxO1xuICAgICAgfVxuICAgICAgLy8gdWludCA4XG4gICAgICBpZiAodmFsdWUgPCAweDEwMCkge1xuICAgICAgICBieXRlcy5wdXNoKDB4Y2MsIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIDI7XG4gICAgICB9XG4gICAgICAvLyB1aW50IDE2XG4gICAgICBpZiAodmFsdWUgPCAweDEwMDAwKSB7XG4gICAgICAgIGJ5dGVzLnB1c2goMHhjZCwgdmFsdWUgPj4gOCwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gMztcbiAgICAgIH1cbiAgICAgIC8vIHVpbnQgMzJcbiAgICAgIGlmICh2YWx1ZSA8IDB4MTAwMDAwMDAwKSB7XG4gICAgICAgIGJ5dGVzLnB1c2goMHhjZSwgdmFsdWUgPj4gMjQsIHZhbHVlID4+IDE2LCB2YWx1ZSA+PiA4LCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiA1O1xuICAgICAgfVxuICAgICAgLy8gdWludCA2NFxuICAgICAgaGkgPSAodmFsdWUgLyBNYXRoLnBvdygyLCAzMikpID4+IDA7XG4gICAgICBsbyA9IHZhbHVlID4+PiAwO1xuICAgICAgYnl0ZXMucHVzaCgweGNmLCBoaSA+PiAyNCwgaGkgPj4gMTYsIGhpID4+IDgsIGhpLCBsbyA+PiAyNCwgbG8gPj4gMTYsIGxvID4+IDgsIGxvKTtcbiAgICAgIHJldHVybiA5O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBuZWdhdGl2ZSBmaXhudW1cbiAgICAgIGlmICh2YWx1ZSA+PSAtMHgyMCkge1xuICAgICAgICBieXRlcy5wdXNoKHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICB9XG4gICAgICAvLyBpbnQgOFxuICAgICAgaWYgKHZhbHVlID49IC0weDgwKSB7XG4gICAgICAgIGJ5dGVzLnB1c2goMHhkMCwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gMjtcbiAgICAgIH1cbiAgICAgIC8vIGludCAxNlxuICAgICAgaWYgKHZhbHVlID49IC0weDgwMDApIHtcbiAgICAgICAgYnl0ZXMucHVzaCgweGQxLCB2YWx1ZSA+PiA4LCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiAzO1xuICAgICAgfVxuICAgICAgLy8gaW50IDMyXG4gICAgICBpZiAodmFsdWUgPj0gLTB4ODAwMDAwMDApIHtcbiAgICAgICAgYnl0ZXMucHVzaCgweGQyLCB2YWx1ZSA+PiAyNCwgdmFsdWUgPj4gMTYsIHZhbHVlID4+IDgsIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIDU7XG4gICAgICB9XG4gICAgICAvLyBpbnQgNjRcbiAgICAgIGhpID0gTWF0aC5mbG9vcih2YWx1ZSAvIE1hdGgucG93KDIsIDMyKSk7XG4gICAgICBsbyA9IHZhbHVlID4+PiAwO1xuICAgICAgYnl0ZXMucHVzaCgweGQzLCBoaSA+PiAyNCwgaGkgPj4gMTYsIGhpID4+IDgsIGhpLCBsbyA+PiAyNCwgbG8gPj4gMTYsIGxvID4+IDgsIGxvKTtcbiAgICAgIHJldHVybiA5O1xuICAgIH1cbiAgfVxuICBpZiAodHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICAvLyBuaWxcbiAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgIGJ5dGVzLnB1c2goMHhjMCk7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIGxlbmd0aCA9IHZhbHVlLmxlbmd0aDtcblxuICAgICAgLy8gZml4YXJyYXlcbiAgICAgIGlmIChsZW5ndGggPCAweDEwKSB7XG4gICAgICAgIGJ5dGVzLnB1c2gobGVuZ3RoIHwgMHg5MCk7XG4gICAgICAgIHNpemUgPSAxO1xuICAgICAgfVxuICAgICAgLy8gYXJyYXkgMTZcbiAgICAgIGVsc2UgaWYgKGxlbmd0aCA8IDB4MTAwMDApIHtcbiAgICAgICAgYnl0ZXMucHVzaCgweGRjLCBsZW5ndGggPj4gOCwgbGVuZ3RoKTtcbiAgICAgICAgc2l6ZSA9IDM7XG4gICAgICB9XG4gICAgICAvLyBhcnJheSAzMlxuICAgICAgZWxzZSBpZiAobGVuZ3RoIDwgMHgxMDAwMDAwMDApIHtcbiAgICAgICAgYnl0ZXMucHVzaCgweGRkLCBsZW5ndGggPj4gMjQsIGxlbmd0aCA+PiAxNiwgbGVuZ3RoID4+IDgsIGxlbmd0aCk7XG4gICAgICAgIHNpemUgPSA1O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBcnJheSB0b28gbGFyZ2UnKTtcbiAgICAgIH1cbiAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICBzaXplICs9IF9lbmNvZGUoYnl0ZXMsIGRlZmVycywgdmFsdWVbaV0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHNpemU7XG4gICAgfVxuXG4gICAgLy8gZml4ZXh0IDggLyBEYXRlXG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgdmFyIHRpbWUgPSB2YWx1ZS5nZXRUaW1lKCk7XG4gICAgICBoaSA9IE1hdGguZmxvb3IodGltZSAvIE1hdGgucG93KDIsIDMyKSk7XG4gICAgICBsbyA9IHRpbWUgPj4+IDA7XG4gICAgICBieXRlcy5wdXNoKDB4ZDcsIDAsIGhpID4+IDI0LCBoaSA+PiAxNiwgaGkgPj4gOCwgaGksIGxvID4+IDI0LCBsbyA+PiAxNiwgbG8gPj4gOCwgbG8pO1xuICAgICAgcmV0dXJuIDEwO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7XG4gICAgICBsZW5ndGggPSB2YWx1ZS5ieXRlTGVuZ3RoO1xuXG4gICAgICAvLyBiaW4gOFxuICAgICAgaWYgKGxlbmd0aCA8IDB4MTAwKSB7XG4gICAgICAgIGJ5dGVzLnB1c2goMHhjNCwgbGVuZ3RoKTtcbiAgICAgICAgc2l6ZSA9IDI7XG4gICAgICB9IGVsc2VcbiAgICAgIC8vIGJpbiAxNlxuICAgICAgaWYgKGxlbmd0aCA8IDB4MTAwMDApIHtcbiAgICAgICAgYnl0ZXMucHVzaCgweGM1LCBsZW5ndGggPj4gOCwgbGVuZ3RoKTtcbiAgICAgICAgc2l6ZSA9IDM7XG4gICAgICB9IGVsc2VcbiAgICAgIC8vIGJpbiAzMlxuICAgICAgaWYgKGxlbmd0aCA8IDB4MTAwMDAwMDAwKSB7XG4gICAgICAgIGJ5dGVzLnB1c2goMHhjNiwgbGVuZ3RoID4+IDI0LCBsZW5ndGggPj4gMTYsIGxlbmd0aCA+PiA4LCBsZW5ndGgpO1xuICAgICAgICBzaXplID0gNTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQnVmZmVyIHRvbyBsYXJnZScpO1xuICAgICAgfVxuICAgICAgZGVmZXJzLnB1c2goeyBiaW46IHZhbHVlLCBsZW5ndGg6IGxlbmd0aCwgb2Zmc2V0OiBieXRlcy5sZW5ndGggfSk7XG4gICAgICByZXR1cm4gc2l6ZSArIGxlbmd0aDtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlLnRvSlNPTiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIF9lbmNvZGUoYnl0ZXMsIGRlZmVycywgdmFsdWUudG9KU09OKCkpO1xuICAgIH1cblxuICAgIHZhciBrZXlzID0gW10sIGtleSA9ICcnO1xuXG4gICAgdmFyIGFsbEtleXMgPSBPYmplY3Qua2V5cyh2YWx1ZSk7XG4gICAgZm9yIChpID0gMCwgbCA9IGFsbEtleXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICBrZXkgPSBhbGxLZXlzW2ldO1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZVtrZXldICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGtleXMucHVzaChrZXkpO1xuICAgICAgfVxuICAgIH1cbiAgICBsZW5ndGggPSBrZXlzLmxlbmd0aDtcblxuICAgIC8vIGZpeG1hcFxuICAgIGlmIChsZW5ndGggPCAweDEwKSB7XG4gICAgICBieXRlcy5wdXNoKGxlbmd0aCB8IDB4ODApO1xuICAgICAgc2l6ZSA9IDE7XG4gICAgfVxuICAgIC8vIG1hcCAxNlxuICAgIGVsc2UgaWYgKGxlbmd0aCA8IDB4MTAwMDApIHtcbiAgICAgIGJ5dGVzLnB1c2goMHhkZSwgbGVuZ3RoID4+IDgsIGxlbmd0aCk7XG4gICAgICBzaXplID0gMztcbiAgICB9XG4gICAgLy8gbWFwIDMyXG4gICAgZWxzZSBpZiAobGVuZ3RoIDwgMHgxMDAwMDAwMDApIHtcbiAgICAgIGJ5dGVzLnB1c2goMHhkZiwgbGVuZ3RoID4+IDI0LCBsZW5ndGggPj4gMTYsIGxlbmd0aCA+PiA4LCBsZW5ndGgpO1xuICAgICAgc2l6ZSA9IDU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignT2JqZWN0IHRvbyBsYXJnZScpO1xuICAgIH1cblxuICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAga2V5ID0ga2V5c1tpXTtcbiAgICAgIHNpemUgKz0gX2VuY29kZShieXRlcywgZGVmZXJzLCBrZXkpO1xuICAgICAgc2l6ZSArPSBfZW5jb2RlKGJ5dGVzLCBkZWZlcnMsIHZhbHVlW2tleV0pO1xuICAgIH1cbiAgICByZXR1cm4gc2l6ZTtcbiAgfVxuICAvLyBmYWxzZS90cnVlXG4gIGlmICh0eXBlID09PSAnYm9vbGVhbicpIHtcbiAgICBieXRlcy5wdXNoKHZhbHVlID8gMHhjMyA6IDB4YzIpO1xuICAgIHJldHVybiAxO1xuICB9XG4gIC8vIGZpeGV4dCAxIC8gdW5kZWZpbmVkXG4gIGlmICh0eXBlID09PSAndW5kZWZpbmVkJykge1xuICAgIGJ5dGVzLnB1c2goMHhkNCwgMCwgMCk7XG4gICAgcmV0dXJuIDM7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgZW5jb2RlJyk7XG59XG5cbmZ1bmN0aW9uIGVuY29kZSh2YWx1ZSkge1xuICB2YXIgYnl0ZXMgPSBbXTtcbiAgdmFyIGRlZmVycyA9IFtdO1xuICB2YXIgc2l6ZSA9IF9lbmNvZGUoYnl0ZXMsIGRlZmVycywgdmFsdWUpO1xuICB2YXIgYnVmID0gbmV3IEFycmF5QnVmZmVyKHNpemUpO1xuICB2YXIgdmlldyA9IG5ldyBEYXRhVmlldyhidWYpO1xuXG4gIHZhciBkZWZlckluZGV4ID0gMDtcbiAgdmFyIGRlZmVyV3JpdHRlbiA9IDA7XG4gIHZhciBuZXh0T2Zmc2V0ID0gLTE7XG4gIGlmIChkZWZlcnMubGVuZ3RoID4gMCkge1xuICAgIG5leHRPZmZzZXQgPSBkZWZlcnNbMF0ub2Zmc2V0O1xuICB9XG5cbiAgdmFyIGRlZmVyLCBkZWZlckxlbmd0aCA9IDAsIG9mZnNldCA9IDA7XG4gIGZvciAodmFyIGkgPSAwLCBsID0gYnl0ZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgdmlldy5zZXRVaW50OChkZWZlcldyaXR0ZW4gKyBpLCBieXRlc1tpXSk7XG4gICAgaWYgKGkgKyAxICE9PSBuZXh0T2Zmc2V0KSB7IGNvbnRpbnVlOyB9XG4gICAgZGVmZXIgPSBkZWZlcnNbZGVmZXJJbmRleF07XG4gICAgZGVmZXJMZW5ndGggPSBkZWZlci5sZW5ndGg7XG4gICAgb2Zmc2V0ID0gZGVmZXJXcml0dGVuICsgbmV4dE9mZnNldDtcbiAgICBpZiAoZGVmZXIuYmluKSB7XG4gICAgICB2YXIgYmluID0gbmV3IFVpbnQ4QXJyYXkoZGVmZXIuYmluKTtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgZGVmZXJMZW5ndGg7IGorKykge1xuICAgICAgICB2aWV3LnNldFVpbnQ4KG9mZnNldCArIGosIGJpbltqXSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChkZWZlci5zdHIpIHtcbiAgICAgIHV0ZjhXcml0ZSh2aWV3LCBvZmZzZXQsIGRlZmVyLnN0cik7XG4gICAgfSBlbHNlIGlmIChkZWZlci5mbG9hdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB2aWV3LnNldEZsb2F0NjQob2Zmc2V0LCBkZWZlci5mbG9hdCk7XG4gICAgfVxuICAgIGRlZmVySW5kZXgrKztcbiAgICBkZWZlcldyaXR0ZW4gKz0gZGVmZXJMZW5ndGg7XG4gICAgaWYgKGRlZmVyc1tkZWZlckluZGV4XSkge1xuICAgICAgbmV4dE9mZnNldCA9IGRlZmVyc1tkZWZlckluZGV4XS5vZmZzZXQ7XG4gICAgfVxuICB9XG4gIHJldHVybiBidWY7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZW5jb2RlO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvbm90ZXBhY2suaW8vYnJvd3Nlci9lbmNvZGUuanNcbi8vIG1vZHVsZSBpZCA9IDExXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcblxuZnVuY3Rpb24gRGVjb2RlcihidWZmZXIpIHtcbiAgdGhpcy5vZmZzZXQgPSAwO1xuICBpZiAoYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICB0aGlzLmJ1ZmZlciA9IGJ1ZmZlcjtcbiAgICB0aGlzLnZpZXcgPSBuZXcgRGF0YVZpZXcodGhpcy5idWZmZXIpO1xuICB9IGVsc2UgaWYgKEFycmF5QnVmZmVyLmlzVmlldyhidWZmZXIpKSB7XG4gICAgdGhpcy5idWZmZXIgPSBidWZmZXIuYnVmZmVyO1xuICAgIHRoaXMudmlldyA9IG5ldyBEYXRhVmlldyh0aGlzLmJ1ZmZlciwgYnVmZmVyLmJ5dGVPZmZzZXQsIGJ1ZmZlci5ieXRlTGVuZ3RoKTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYXJndW1lbnQnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiB1dGY4UmVhZCh2aWV3LCBvZmZzZXQsIGxlbmd0aCkge1xuICB2YXIgc3RyaW5nID0gJycsIGNociA9IDA7XG4gIGZvciAodmFyIGkgPSBvZmZzZXQsIGVuZCA9IG9mZnNldCArIGxlbmd0aDsgaSA8IGVuZDsgaSsrKSB7XG4gICAgdmFyIGJ5dGUgPSB2aWV3LmdldFVpbnQ4KGkpO1xuICAgIGlmICgoYnl0ZSAmIDB4ODApID09PSAweDAwKSB7XG4gICAgICBzdHJpbmcgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShieXRlKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoKGJ5dGUgJiAweGUwKSA9PT0gMHhjMCkge1xuICAgICAgc3RyaW5nICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoXG4gICAgICAgICgoYnl0ZSAmIDB4MGYpIDw8IDYpIHxcbiAgICAgICAgKHZpZXcuZ2V0VWludDgoKytpKSAmIDB4M2YpXG4gICAgICApO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmICgoYnl0ZSAmIDB4ZjApID09PSAweGUwKSB7XG4gICAgICBzdHJpbmcgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShcbiAgICAgICAgKChieXRlICYgMHgwZikgPDwgMTIpIHxcbiAgICAgICAgKCh2aWV3LmdldFVpbnQ4KCsraSkgJiAweDNmKSA8PCA2KSB8XG4gICAgICAgICgodmlldy5nZXRVaW50OCgrK2kpICYgMHgzZikgPDwgMClcbiAgICAgICk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKChieXRlICYgMHhmOCkgPT09IDB4ZjApIHtcbiAgICAgIGNociA9ICgoYnl0ZSAmIDB4MDcpIDw8IDE4KSB8XG4gICAgICAgICgodmlldy5nZXRVaW50OCgrK2kpICYgMHgzZikgPDwgMTIpIHxcbiAgICAgICAgKCh2aWV3LmdldFVpbnQ4KCsraSkgJiAweDNmKSA8PCA2KSB8XG4gICAgICAgICgodmlldy5nZXRVaW50OCgrK2kpICYgMHgzZikgPDwgMCk7XG4gICAgICBpZiAoY2hyID49IDB4MDEwMDAwKSB7IC8vIHN1cnJvZ2F0ZSBwYWlyXG4gICAgICAgIGNociAtPSAweDAxMDAwMDtcbiAgICAgICAgc3RyaW5nICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoKGNociA+Pj4gMTApICsgMHhEODAwLCAoY2hyICYgMHgzRkYpICsgMHhEQzAwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0cmluZyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNocik7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGJ5dGUgJyArIGJ5dGUudG9TdHJpbmcoMTYpKTtcbiAgfVxuICByZXR1cm4gc3RyaW5nO1xufVxuXG5EZWNvZGVyLnByb3RvdHlwZS5hcnJheSA9IGZ1bmN0aW9uIChsZW5ndGgpIHtcbiAgdmFyIHZhbHVlID0gbmV3IEFycmF5KGxlbmd0aCk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICB2YWx1ZVtpXSA9IHRoaXMucGFyc2UoKTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59O1xuXG5EZWNvZGVyLnByb3RvdHlwZS5tYXAgPSBmdW5jdGlvbiAobGVuZ3RoKSB7XG4gIHZhciBrZXkgPSAnJywgdmFsdWUgPSB7fTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgIGtleSA9IHRoaXMucGFyc2UoKTtcbiAgICB2YWx1ZVtrZXldID0gdGhpcy5wYXJzZSgpO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn07XG5cbkRlY29kZXIucHJvdG90eXBlLnN0ciA9IGZ1bmN0aW9uIChsZW5ndGgpIHtcbiAgdmFyIHZhbHVlID0gdXRmOFJlYWQodGhpcy52aWV3LCB0aGlzLm9mZnNldCwgbGVuZ3RoKTtcbiAgdGhpcy5vZmZzZXQgKz0gbGVuZ3RoO1xuICByZXR1cm4gdmFsdWU7XG59O1xuXG5EZWNvZGVyLnByb3RvdHlwZS5iaW4gPSBmdW5jdGlvbiAobGVuZ3RoKSB7XG4gIHZhciB2YWx1ZSA9IHRoaXMuYnVmZmVyLnNsaWNlKHRoaXMub2Zmc2V0LCB0aGlzLm9mZnNldCArIGxlbmd0aCk7XG4gIHRoaXMub2Zmc2V0ICs9IGxlbmd0aDtcbiAgcmV0dXJuIHZhbHVlO1xufTtcblxuRGVjb2Rlci5wcm90b3R5cGUucGFyc2UgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBwcmVmaXggPSB0aGlzLnZpZXcuZ2V0VWludDgodGhpcy5vZmZzZXQrKyk7XG4gIHZhciB2YWx1ZSwgbGVuZ3RoID0gMCwgdHlwZSA9IDAsIGhpID0gMCwgbG8gPSAwO1xuXG4gIGlmIChwcmVmaXggPCAweGMwKSB7XG4gICAgLy8gcG9zaXRpdmUgZml4aW50XG4gICAgaWYgKHByZWZpeCA8IDB4ODApIHtcbiAgICAgIHJldHVybiBwcmVmaXg7XG4gICAgfVxuICAgIC8vIGZpeG1hcFxuICAgIGlmIChwcmVmaXggPCAweDkwKSB7XG4gICAgICByZXR1cm4gdGhpcy5tYXAocHJlZml4ICYgMHgwZik7XG4gICAgfVxuICAgIC8vIGZpeGFycmF5XG4gICAgaWYgKHByZWZpeCA8IDB4YTApIHtcbiAgICAgIHJldHVybiB0aGlzLmFycmF5KHByZWZpeCAmIDB4MGYpO1xuICAgIH1cbiAgICAvLyBmaXhzdHJcbiAgICByZXR1cm4gdGhpcy5zdHIocHJlZml4ICYgMHgxZik7XG4gIH1cblxuICAvLyBuZWdhdGl2ZSBmaXhpbnRcbiAgaWYgKHByZWZpeCA+IDB4ZGYpIHtcbiAgICByZXR1cm4gKDB4ZmYgLSBwcmVmaXggKyAxKSAqIC0xO1xuICB9XG5cbiAgc3dpdGNoIChwcmVmaXgpIHtcbiAgICAvLyBuaWxcbiAgICBjYXNlIDB4YzA6XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICAvLyBmYWxzZVxuICAgIGNhc2UgMHhjMjpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICAvLyB0cnVlXG4gICAgY2FzZSAweGMzOlxuICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICAvLyBiaW5cbiAgICBjYXNlIDB4YzQ6XG4gICAgICBsZW5ndGggPSB0aGlzLnZpZXcuZ2V0VWludDgodGhpcy5vZmZzZXQpO1xuICAgICAgdGhpcy5vZmZzZXQgKz0gMTtcbiAgICAgIHJldHVybiB0aGlzLmJpbihsZW5ndGgpO1xuICAgIGNhc2UgMHhjNTpcbiAgICAgIGxlbmd0aCA9IHRoaXMudmlldy5nZXRVaW50MTYodGhpcy5vZmZzZXQpO1xuICAgICAgdGhpcy5vZmZzZXQgKz0gMjtcbiAgICAgIHJldHVybiB0aGlzLmJpbihsZW5ndGgpO1xuICAgIGNhc2UgMHhjNjpcbiAgICAgIGxlbmd0aCA9IHRoaXMudmlldy5nZXRVaW50MzIodGhpcy5vZmZzZXQpO1xuICAgICAgdGhpcy5vZmZzZXQgKz0gNDtcbiAgICAgIHJldHVybiB0aGlzLmJpbihsZW5ndGgpO1xuXG4gICAgLy8gZXh0XG4gICAgY2FzZSAweGM3OlxuICAgICAgbGVuZ3RoID0gdGhpcy52aWV3LmdldFVpbnQ4KHRoaXMub2Zmc2V0KTtcbiAgICAgIHR5cGUgPSB0aGlzLnZpZXcuZ2V0SW50OCh0aGlzLm9mZnNldCArIDEpO1xuICAgICAgdGhpcy5vZmZzZXQgKz0gMjtcbiAgICAgIHJldHVybiBbdHlwZSwgdGhpcy5iaW4obGVuZ3RoKV07XG4gICAgY2FzZSAweGM4OlxuICAgICAgbGVuZ3RoID0gdGhpcy52aWV3LmdldFVpbnQxNih0aGlzLm9mZnNldCk7XG4gICAgICB0eXBlID0gdGhpcy52aWV3LmdldEludDgodGhpcy5vZmZzZXQgKyAyKTtcbiAgICAgIHRoaXMub2Zmc2V0ICs9IDM7XG4gICAgICByZXR1cm4gW3R5cGUsIHRoaXMuYmluKGxlbmd0aCldO1xuICAgIGNhc2UgMHhjOTpcbiAgICAgIGxlbmd0aCA9IHRoaXMudmlldy5nZXRVaW50MzIodGhpcy5vZmZzZXQpO1xuICAgICAgdHlwZSA9IHRoaXMudmlldy5nZXRJbnQ4KHRoaXMub2Zmc2V0ICsgNCk7XG4gICAgICB0aGlzLm9mZnNldCArPSA1O1xuICAgICAgcmV0dXJuIFt0eXBlLCB0aGlzLmJpbihsZW5ndGgpXTtcblxuICAgIC8vIGZsb2F0XG4gICAgY2FzZSAweGNhOlxuICAgICAgdmFsdWUgPSB0aGlzLnZpZXcuZ2V0RmxvYXQzMih0aGlzLm9mZnNldCk7XG4gICAgICB0aGlzLm9mZnNldCArPSA0O1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIGNhc2UgMHhjYjpcbiAgICAgIHZhbHVlID0gdGhpcy52aWV3LmdldEZsb2F0NjQodGhpcy5vZmZzZXQpO1xuICAgICAgdGhpcy5vZmZzZXQgKz0gODtcbiAgICAgIHJldHVybiB2YWx1ZTtcblxuICAgIC8vIHVpbnRcbiAgICBjYXNlIDB4Y2M6XG4gICAgICB2YWx1ZSA9IHRoaXMudmlldy5nZXRVaW50OCh0aGlzLm9mZnNldCk7XG4gICAgICB0aGlzLm9mZnNldCArPSAxO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIGNhc2UgMHhjZDpcbiAgICAgIHZhbHVlID0gdGhpcy52aWV3LmdldFVpbnQxNih0aGlzLm9mZnNldCk7XG4gICAgICB0aGlzLm9mZnNldCArPSAyO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIGNhc2UgMHhjZTpcbiAgICAgIHZhbHVlID0gdGhpcy52aWV3LmdldFVpbnQzMih0aGlzLm9mZnNldCk7XG4gICAgICB0aGlzLm9mZnNldCArPSA0O1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIGNhc2UgMHhjZjpcbiAgICAgIGhpID0gdGhpcy52aWV3LmdldFVpbnQzMih0aGlzLm9mZnNldCkgKiBNYXRoLnBvdygyLCAzMik7XG4gICAgICBsbyA9IHRoaXMudmlldy5nZXRVaW50MzIodGhpcy5vZmZzZXQgKyA0KTtcbiAgICAgIHRoaXMub2Zmc2V0ICs9IDg7XG4gICAgICByZXR1cm4gaGkgKyBsbztcblxuICAgIC8vIGludFxuICAgIGNhc2UgMHhkMDpcbiAgICAgIHZhbHVlID0gdGhpcy52aWV3LmdldEludDgodGhpcy5vZmZzZXQpO1xuICAgICAgdGhpcy5vZmZzZXQgKz0gMTtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICBjYXNlIDB4ZDE6XG4gICAgICB2YWx1ZSA9IHRoaXMudmlldy5nZXRJbnQxNih0aGlzLm9mZnNldCk7XG4gICAgICB0aGlzLm9mZnNldCArPSAyO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIGNhc2UgMHhkMjpcbiAgICAgIHZhbHVlID0gdGhpcy52aWV3LmdldEludDMyKHRoaXMub2Zmc2V0KTtcbiAgICAgIHRoaXMub2Zmc2V0ICs9IDQ7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgY2FzZSAweGQzOlxuICAgICAgaGkgPSB0aGlzLnZpZXcuZ2V0SW50MzIodGhpcy5vZmZzZXQpICogTWF0aC5wb3coMiwgMzIpO1xuICAgICAgbG8gPSB0aGlzLnZpZXcuZ2V0VWludDMyKHRoaXMub2Zmc2V0ICsgNCk7XG4gICAgICB0aGlzLm9mZnNldCArPSA4O1xuICAgICAgcmV0dXJuIGhpICsgbG87XG5cbiAgICAvLyBmaXhleHRcbiAgICBjYXNlIDB4ZDQ6XG4gICAgICB0eXBlID0gdGhpcy52aWV3LmdldEludDgodGhpcy5vZmZzZXQpO1xuICAgICAgdGhpcy5vZmZzZXQgKz0gMTtcbiAgICAgIGlmICh0eXBlID09PSAweDAwKSB7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDE7XG4gICAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgICB9XG4gICAgICByZXR1cm4gW3R5cGUsIHRoaXMuYmluKDEpXTtcbiAgICBjYXNlIDB4ZDU6XG4gICAgICB0eXBlID0gdGhpcy52aWV3LmdldEludDgodGhpcy5vZmZzZXQpO1xuICAgICAgdGhpcy5vZmZzZXQgKz0gMTtcbiAgICAgIHJldHVybiBbdHlwZSwgdGhpcy5iaW4oMildO1xuICAgIGNhc2UgMHhkNjpcbiAgICAgIHR5cGUgPSB0aGlzLnZpZXcuZ2V0SW50OCh0aGlzLm9mZnNldCk7XG4gICAgICB0aGlzLm9mZnNldCArPSAxO1xuICAgICAgcmV0dXJuIFt0eXBlLCB0aGlzLmJpbig0KV07XG4gICAgY2FzZSAweGQ3OlxuICAgICAgdHlwZSA9IHRoaXMudmlldy5nZXRJbnQ4KHRoaXMub2Zmc2V0KTtcbiAgICAgIHRoaXMub2Zmc2V0ICs9IDE7XG4gICAgICBpZiAodHlwZSA9PT0gMHgwMCkge1xuICAgICAgICBoaSA9IHRoaXMudmlldy5nZXRJbnQzMih0aGlzLm9mZnNldCkgKiBNYXRoLnBvdygyLCAzMik7XG4gICAgICAgIGxvID0gdGhpcy52aWV3LmdldFVpbnQzMih0aGlzLm9mZnNldCArIDQpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSA4O1xuICAgICAgICByZXR1cm4gbmV3IERhdGUoaGkgKyBsbyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gW3R5cGUsIHRoaXMuYmluKDgpXTtcbiAgICBjYXNlIDB4ZDg6XG4gICAgICB0eXBlID0gdGhpcy52aWV3LmdldEludDgodGhpcy5vZmZzZXQpO1xuICAgICAgdGhpcy5vZmZzZXQgKz0gMTtcbiAgICAgIHJldHVybiBbdHlwZSwgdGhpcy5iaW4oMTYpXTtcblxuICAgIC8vIHN0clxuICAgIGNhc2UgMHhkOTpcbiAgICAgIGxlbmd0aCA9IHRoaXMudmlldy5nZXRVaW50OCh0aGlzLm9mZnNldCk7XG4gICAgICB0aGlzLm9mZnNldCArPSAxO1xuICAgICAgcmV0dXJuIHRoaXMuc3RyKGxlbmd0aCk7XG4gICAgY2FzZSAweGRhOlxuICAgICAgbGVuZ3RoID0gdGhpcy52aWV3LmdldFVpbnQxNih0aGlzLm9mZnNldCk7XG4gICAgICB0aGlzLm9mZnNldCArPSAyO1xuICAgICAgcmV0dXJuIHRoaXMuc3RyKGxlbmd0aCk7XG4gICAgY2FzZSAweGRiOlxuICAgICAgbGVuZ3RoID0gdGhpcy52aWV3LmdldFVpbnQzMih0aGlzLm9mZnNldCk7XG4gICAgICB0aGlzLm9mZnNldCArPSA0O1xuICAgICAgcmV0dXJuIHRoaXMuc3RyKGxlbmd0aCk7XG5cbiAgICAvLyBhcnJheVxuICAgIGNhc2UgMHhkYzpcbiAgICAgIGxlbmd0aCA9IHRoaXMudmlldy5nZXRVaW50MTYodGhpcy5vZmZzZXQpO1xuICAgICAgdGhpcy5vZmZzZXQgKz0gMjtcbiAgICAgIHJldHVybiB0aGlzLmFycmF5KGxlbmd0aCk7XG4gICAgY2FzZSAweGRkOlxuICAgICAgbGVuZ3RoID0gdGhpcy52aWV3LmdldFVpbnQzMih0aGlzLm9mZnNldCk7XG4gICAgICB0aGlzLm9mZnNldCArPSA0O1xuICAgICAgcmV0dXJuIHRoaXMuYXJyYXkobGVuZ3RoKTtcblxuICAgIC8vIG1hcFxuICAgIGNhc2UgMHhkZTpcbiAgICAgIGxlbmd0aCA9IHRoaXMudmlldy5nZXRVaW50MTYodGhpcy5vZmZzZXQpO1xuICAgICAgdGhpcy5vZmZzZXQgKz0gMjtcbiAgICAgIHJldHVybiB0aGlzLm1hcChsZW5ndGgpO1xuICAgIGNhc2UgMHhkZjpcbiAgICAgIGxlbmd0aCA9IHRoaXMudmlldy5nZXRVaW50MzIodGhpcy5vZmZzZXQpO1xuICAgICAgdGhpcy5vZmZzZXQgKz0gNDtcbiAgICAgIHJldHVybiB0aGlzLm1hcChsZW5ndGgpO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgcGFyc2UnKTtcbn07XG5cbmZ1bmN0aW9uIGRlY29kZShidWZmZXIpIHtcbiAgdmFyIGRlY29kZXIgPSBuZXcgRGVjb2RlcihidWZmZXIpO1xuICB2YXIgdmFsdWUgPSBkZWNvZGVyLnBhcnNlKCk7XG4gIGlmIChkZWNvZGVyLm9mZnNldCAhPT0gYnVmZmVyLmJ5dGVMZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoKGJ1ZmZlci5ieXRlTGVuZ3RoIC0gZGVjb2Rlci5vZmZzZXQpICsgJyB0cmFpbGluZyBieXRlcycpO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBkZWNvZGU7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9ub3RlcGFjay5pby9icm93c2VyL2RlY29kZS5qc1xuLy8gbW9kdWxlIGlkID0gMTJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcbiAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxuICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTsgfTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbiAgICB9O1xufSkoKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciBQcmlvcml0eVNpZ25hbF8xID0gcmVxdWlyZShcIi4vUHJpb3JpdHlTaWduYWxcIik7XG4vKipcbiAqIEFsbG93cyB0aGUgdmFsdWVDbGFzc2VzIHRvIGJlIHNldCBpbiBNWE1MLCBlLmcuXG4gKiA8c2lnbmFsczpTaWduYWwgaWQ9XCJuYW1lQ2hhbmdlZFwiPntbU3RyaW5nLCB1aW50XX08L3NpZ25hbHM6U2lnbmFsPlxuICovXG4vKltEZWZhdWx0UHJvcGVydHkoXCJ2YWx1ZUNsYXNzZXNcIildKi9cbi8qKlxuICogU2lnbmFsIGRpc3BhdGNoZXMgZXZlbnRzIHRvIG11bHRpcGxlIGxpc3RlbmVycy5cbiAqIEl0IGlzIGluc3BpcmVkIGJ5IEMjIGV2ZW50cyBhbmQgZGVsZWdhdGVzLCBhbmQgYnlcbiAqIDxhIHRhcmdldD1cIl90b3BcIiBocmVmPVwiaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TaWduYWxzX2FuZF9zbG90c1wiPnNpZ25hbHMgYW5kIHNsb3RzPC9hPlxuICogaW4gUXQuXG4gKiBBIFNpZ25hbCBhZGRzIGV2ZW50IGRpc3BhdGNoaW5nIGZ1bmN0aW9uYWxpdHkgdGhyb3VnaCBjb21wb3NpdGlvbiBhbmQgaW50ZXJmYWNlcyxcbiAqIHJhdGhlciB0aGFuIGluaGVyaXRpbmcgZnJvbSBhIGRpc3BhdGNoZXIuXG4gKiA8YnIvPjxici8+XG4gKiBQcm9qZWN0IGhvbWU6IDxhIHRhcmdldD1cIl90b3BcIiBocmVmPVwiaHR0cDovL2dpdGh1Yi5jb20vcm9iZXJ0cGVubmVyL2FzMy1zaWduYWxzL1wiPmh0dHA6Ly9naXRodWIuY29tL3JvYmVydHBlbm5lci9hczMtc2lnbmFscy88L2E+XG4gKi9cbnZhciBEZWx1eGVTaWduYWwgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhEZWx1eGVTaWduYWwsIF9zdXBlcik7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIERlbHV4ZVNpZ25hbCBpbnN0YW5jZSB0byBkaXNwYXRjaCBldmVudHMgb24gYmVoYWxmIG9mIGEgdGFyZ2V0IG9iamVjdC5cbiAgICAgKiBAcGFyYW0gICAgdGFyZ2V0IFRoZSBvYmplY3QgdGhlIHNpZ25hbCBpcyBkaXNwYXRjaGluZyBldmVudHMgb24gYmVoYWxmIG9mLlxuICAgICAqIEBwYXJhbSAgICB2YWx1ZUNsYXNzZXMgQW55IG51bWJlciBvZiBjbGFzcyByZWZlcmVuY2VzIHRoYXQgZW5hYmxlIHR5cGUgY2hlY2tzIGluIGRpc3BhdGNoKCkuXG4gICAgICogRm9yIGV4YW1wbGUsIG5ldyBEZWx1eGVTaWduYWwodGhpcywgU3RyaW5nLCB1aW50KVxuICAgICAqIHdvdWxkIGFsbG93OiBzaWduYWwuZGlzcGF0Y2goXCJ0aGUgQW5zd2VyXCIsIDQyKVxuICAgICAqIGJ1dCBub3Q6IHNpZ25hbC5kaXNwYXRjaCh0cnVlLCA0Mi41KVxuICAgICAqIG5vcjogc2lnbmFsLmRpc3BhdGNoKClcbiAgICAgKlxuICAgICAqIE5PVEU6IFN1YmNsYXNzZXMgY2Fubm90IGNhbGwgc3VwZXIuYXBwbHkobnVsbCwgdmFsdWVDbGFzc2VzKSxcbiAgICAgKiBidXQgdGhpcyBjb25zdHJ1Y3RvciBoYXMgbG9naWMgdG8gc3VwcG9ydCBzdXBlcih2YWx1ZUNsYXNzZXMpLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIERlbHV4ZVNpZ25hbCh0YXJnZXQpIHtcbiAgICAgICAgaWYgKHRhcmdldCA9PT0gdm9pZCAwKSB7IHRhcmdldCA9IG51bGw7IH1cbiAgICAgICAgdmFyIHZhbHVlQ2xhc3NlcyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDE7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgdmFsdWVDbGFzc2VzW19pIC0gMV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICB9XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIC8vIENhbm5vdCB1c2Ugc3VwZXIuYXBwbHkobnVsbCwgdmFsdWVDbGFzc2VzKSwgc28gYWxsb3cgdGhlIHN1YmNsYXNzIHRvIGNhbGwgc3VwZXIodmFsdWVDbGFzc2VzKS5cbiAgICAgICAgdmFsdWVDbGFzc2VzID0gKHZhbHVlQ2xhc3Nlcy5sZW5ndGggPT0gMSAmJiB2YWx1ZUNsYXNzZXNbMF0gaW5zdGFuY2VvZiBBcnJheSkgPyB2YWx1ZUNsYXNzZXNbMF0gOiB2YWx1ZUNsYXNzZXM7XG4gICAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgdmFsdWVDbGFzc2VzKSB8fCB0aGlzO1xuICAgICAgICAvL0BDSEFOR0VEIC0gdGhpcyB3YXMgdGhlIGZpcnN0IGNhbGwgaW4gdGhlIGNvbnN0cnVjdG9yXG4gICAgICAgIC8vVHlwZXNjcmlwdCBkb2VzIG5vdCBhbGxvdyBcInRoaXNcIiB0byBiZSBjYWxsZWQgYmVmb3JlIHN1cGVyXG4gICAgICAgIF90aGlzLl90YXJnZXQgPSB0YXJnZXQ7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KERlbHV4ZVNpZ25hbC5wcm90b3R5cGUsIFwidGFyZ2V0XCIsIHtcbiAgICAgICAgLyoqIEBpbmhlcml0RG9jICovXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3RhcmdldDtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PSB0aGlzLl90YXJnZXQpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVBbGwoKTtcbiAgICAgICAgICAgIHRoaXMuX3RhcmdldCA9IHZhbHVlO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqIEB0aHJvd3MgQXJndW1lbnRFcnJvciA8Y29kZT5Bcmd1bWVudEVycm9yPC9jb2RlPjogSW5jb3JyZWN0IG51bWJlciBvZiBhcmd1bWVudHMuXG4gICAgICogQHRocm93cyBBcmd1bWVudEVycm9yIDxjb2RlPkFyZ3VtZW50RXJyb3I8L2NvZGU+OiBWYWx1ZSBvYmplY3QgaXMgbm90IGFuIGluc3RhbmNlIG9mIHRoZSBhcHByb3ByaWF0ZSB2YWx1ZUNsYXNzZXMgQ2xhc3MuXG4gICAgICovXG4gICAgLypvdmVycmlkZSovXG4gICAgRGVsdXhlU2lnbmFsLnByb3RvdHlwZS5kaXNwYXRjaCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHZhbHVlT2JqZWN0cyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgdmFsdWVPYmplY3RzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgIH1cbiAgICAgICAgLy8gVmFsaWRhdGUgdmFsdWUgb2JqZWN0cyBhZ2FpbnN0IHByZS1kZWZpbmVkIHZhbHVlIGNsYXNzZXMuXG4gICAgICAgIHZhciBudW1WYWx1ZUNsYXNzZXMgPSB0aGlzLl92YWx1ZUNsYXNzZXMubGVuZ3RoO1xuICAgICAgICB2YXIgbnVtVmFsdWVPYmplY3RzID0gdmFsdWVPYmplY3RzLmxlbmd0aDtcbiAgICAgICAgaWYgKG51bVZhbHVlT2JqZWN0cyA8IG51bVZhbHVlQ2xhc3Nlcykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbmNvcnJlY3QgbnVtYmVyIG9mIGFyZ3VtZW50cy4gJyArXG4gICAgICAgICAgICAgICAgJ0V4cGVjdGVkIGF0IGxlYXN0ICcgKyBudW1WYWx1ZUNsYXNzZXMgKyAnIGJ1dCByZWNlaXZlZCAnICtcbiAgICAgICAgICAgICAgICBudW1WYWx1ZU9iamVjdHMgKyAnLicpO1xuICAgICAgICB9XG4gICAgICAgIC8vIENhbm5vdCBkaXNwYXRjaCBkaWZmZXJlbnRseSB0eXBlZCBvYmplY3RzIHRoYW4gZGVjbGFyZWQgY2xhc3Nlcy5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1WYWx1ZUNsYXNzZXM7IGkrKykge1xuICAgICAgICAgICAgLy8gT3B0aW1pemVkIGZvciB0aGUgb3B0aW1pc3RpYyBjYXNlIHRoYXQgdmFsdWVzIGFyZSBjb3JyZWN0LlxuICAgICAgICAgICAgaWYgKHZhbHVlT2JqZWN0c1tpXSA9PT0gbnVsbCB8fCB2YWx1ZU9iamVjdHNbaV0uY29uc3RydWN0b3IgPT09IHRoaXMuX3ZhbHVlQ2xhc3Nlc1tpXSlcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVmFsdWUgb2JqZWN0IDwnICsgdmFsdWVPYmplY3RzW2ldXG4gICAgICAgICAgICAgICAgKyAnPiBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgPCcgKyB0aGlzLl92YWx1ZUNsYXNzZXNbaV0gKyAnPi4nKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBFeHRyYWN0IGFuZCBjbG9uZSBldmVudCBvYmplY3QgaWYgbmVjZXNzYXJ5LlxuICAgICAgICB2YXIgZXZlbnQgPSB2YWx1ZU9iamVjdHNbMF07XG4gICAgICAgIGlmIChldmVudCkge1xuICAgICAgICAgICAgaWYgKGV2ZW50LnRhcmdldCkge1xuICAgICAgICAgICAgICAgIGV2ZW50ID0gZXZlbnQuY2xvbmUoKTtcbiAgICAgICAgICAgICAgICB2YWx1ZU9iamVjdHNbMF0gPSBldmVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGV2ZW50LnRhcmdldCA9IHRoaXMudGFyZ2V0O1xuICAgICAgICAgICAgZXZlbnQuY3VycmVudFRhcmdldCA9IHRoaXMudGFyZ2V0O1xuICAgICAgICAgICAgZXZlbnQuc2lnbmFsID0gdGhpcztcbiAgICAgICAgfVxuICAgICAgICAvLyBCcm9hZGNhc3QgdG8gbGlzdGVuZXJzLlxuICAgICAgICB2YXIgc2xvdHNUb1Byb2Nlc3MgPSB0aGlzLnNsb3RzO1xuICAgICAgICB3aGlsZSAoc2xvdHNUb1Byb2Nlc3Mubm9uRW1wdHkpIHtcbiAgICAgICAgICAgIHNsb3RzVG9Qcm9jZXNzLmhlYWQuZXhlY3V0ZSh2YWx1ZU9iamVjdHMpO1xuICAgICAgICAgICAgc2xvdHNUb1Byb2Nlc3MgPSBzbG90c1RvUHJvY2Vzcy50YWlsO1xuICAgICAgICB9XG4gICAgICAgIC8vIEJ1YmJsZSB0aGUgZXZlbnQgYXMgZmFyIGFzIHBvc3NpYmxlLlxuICAgICAgICBpZiAoIWV2ZW50IHx8ICFldmVudC5idWJibGVzKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB2YXIgY3VycmVudFRhcmdldCA9IHRoaXMudGFyZ2V0O1xuICAgICAgICB3aGlsZSAoY3VycmVudFRhcmdldCAmJiBjdXJyZW50VGFyZ2V0Lmhhc093blByb3BlcnR5KFwicGFyZW50XCIpKSB7XG4gICAgICAgICAgICBjdXJyZW50VGFyZ2V0ID0gY3VycmVudFRhcmdldFtcInBhcmVudFwiXTtcbiAgICAgICAgICAgIGlmICghY3VycmVudFRhcmdldClcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGlmIChjdXJyZW50VGFyZ2V0Lm9uRXZlbnRCdWJibGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBldmVudC5jdXJyZW50VGFyZ2V0ID0gY3VycmVudFRhcmdldDtcbiAgICAgICAgICAgICAgICAvLyBvbkV2ZW50QnViYmxlZCgpIGNhbiBzdG9wIHRoZSBidWJibGluZyBieSByZXR1cm5pbmcgZmFsc2UuXG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRUYXJnZXQub25FdmVudEJ1YmJsZWQoZXZlbnQpKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIERlbHV4ZVNpZ25hbDtcbn0oUHJpb3JpdHlTaWduYWxfMS5Qcmlvcml0eVNpZ25hbCkpO1xuZXhwb3J0cy5EZWx1eGVTaWduYWwgPSBEZWx1eGVTaWduYWw7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1EZWx1eGVTaWduYWwuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvc2lnbmFscy5qcy9saWIvb3JnL29zZmxhc2gvc2lnbmFscy9EZWx1eGVTaWduYWwuanNcbi8vIG1vZHVsZSBpZCA9IDEzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuLyoqXG4gKlxuICogQHNlZSBvcmcub3NmbGFzaC5zaWduYWxzLmV2ZW50cy5JRXZlbnRcbiAqIERvY3VtZW50YXRpb24gZm9yIHRoZSBldmVudCBpbnRlcmZhY2UgYmVpbmcgbWFpbnRhaW5lZCBpbiBJRXZlbnQgdG8gYXZvaWQgZHVwbGljYXRpb24gZm9yIG5vdy5cbiAqL1xudmFyIEdlbmVyaWNFdmVudCA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gR2VuZXJpY0V2ZW50KGJ1YmJsZXMpIHtcbiAgICAgICAgaWYgKGJ1YmJsZXMgPT09IHZvaWQgMCkgeyBidWJibGVzID0gZmFsc2U7IH1cbiAgICAgICAgdGhpcy5fYnViYmxlcyA9IGJ1YmJsZXM7XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShHZW5lcmljRXZlbnQucHJvdG90eXBlLCBcInNpZ25hbFwiLCB7XG4gICAgICAgIC8qKiBAaW5oZXJpdERvYyAqL1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9zaWduYWw7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLl9zaWduYWwgPSB2YWx1ZTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEdlbmVyaWNFdmVudC5wcm90b3R5cGUsIFwidGFyZ2V0XCIsIHtcbiAgICAgICAgLyoqIEBpbmhlcml0RG9jICovXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3RhcmdldDtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuX3RhcmdldCA9IHZhbHVlO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoR2VuZXJpY0V2ZW50LnByb3RvdHlwZSwgXCJjdXJyZW50VGFyZ2V0XCIsIHtcbiAgICAgICAgLyoqIEBpbmhlcml0RG9jICovXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRUYXJnZXQ7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLl9jdXJyZW50VGFyZ2V0ID0gdmFsdWU7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShHZW5lcmljRXZlbnQucHJvdG90eXBlLCBcImJ1YmJsZXNcIiwge1xuICAgICAgICAvKiogQGluaGVyaXREb2MgKi9cbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fYnViYmxlcztcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuX2J1YmJsZXMgPSB2YWx1ZTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgLyoqIEBpbmhlcml0RG9jICovXG4gICAgR2VuZXJpY0V2ZW50LnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBHZW5lcmljRXZlbnQodGhpcy5fYnViYmxlcyk7XG4gICAgfTtcbiAgICByZXR1cm4gR2VuZXJpY0V2ZW50O1xufSgpKTtcbmV4cG9ydHMuR2VuZXJpY0V2ZW50ID0gR2VuZXJpY0V2ZW50O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9R2VuZXJpY0V2ZW50LmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL3NpZ25hbHMuanMvbGliL29yZy9vc2ZsYXNoL3NpZ25hbHMvZXZlbnRzL0dlbmVyaWNFdmVudC5qc1xuLy8gbW9kdWxlIGlkID0gMTRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG4vKipcbiAqXG4gKi9cbmV4cG9ydHMuSU9uY2VTaWduYWwgPSBTeW1ib2woXCJJT25jZVNpZ25hbFwiKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUlPbmNlU2lnbmFsLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL3NpZ25hbHMuanMvbGliL29yZy9vc2ZsYXNoL3NpZ25hbHMvSU9uY2VTaWduYWwuanNcbi8vIG1vZHVsZSBpZCA9IDE1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuLyoqXG4gKlxuICovXG5leHBvcnRzLklQcmlvcml0eVNpZ25hbCA9IFN5bWJvbChcIklQcmlvcml0eVNpZ25hbFwiKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUlQcmlvcml0eVNpZ25hbC5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9zaWduYWxzLmpzL2xpYi9vcmcvb3NmbGFzaC9zaWduYWxzL0lQcmlvcml0eVNpZ25hbC5qc1xuLy8gbW9kdWxlIGlkID0gMTZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG4vKipcbiAqXG4gKi9cbmV4cG9ydHMuSVNpZ25hbCA9IFN5bWJvbChcIklTaWduYWxcIik7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1JU2lnbmFsLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL3NpZ25hbHMuanMvbGliL29yZy9vc2ZsYXNoL3NpZ25hbHMvSVNpZ25hbC5qc1xuLy8gbW9kdWxlIGlkID0gMTdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG4vKipcbiAqIFRoZSBJU2xvdCBpbnRlcmZhY2UgZGVmaW5lcyB0aGUgYmFzaWMgcHJvcGVydGllcyBvZiBhXG4gKiBsaXN0ZW5lciBhc3NvY2lhdGVkIHdpdGggYSBTaWduYWwuXG4gKlxuICogQGF1dGhvciBKb2EgRWJlcnRcbiAqIEBhdXRob3IgUm9iZXJ0IFBlbm5lclxuICovXG5leHBvcnRzLklTbG90ID0gU3ltYm9sKFwiSVNsb3RcIik7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1JU2xvdC5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9zaWduYWxzLmpzL2xpYi9vcmcvb3NmbGFzaC9zaWduYWxzL0lTbG90LmpzXG4vLyBtb2R1bGUgaWQgPSAxOFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciBTbG90XzEgPSByZXF1aXJlKFwiLi9TbG90XCIpO1xuLyoqXG4gKiBBbGxvd3MgdGhlIHZhbHVlQ2xhc3NlcyB0byBiZSBzZXQgaW4gTVhNTCwgZS5nLlxuICogPHNpZ25hbHM6U2lnbmFsIGlkPVwibmFtZUNoYW5nZWRcIj57W1N0cmluZywgdWludF19PC9zaWduYWxzOlNpZ25hbD5cbiAqL1xuLypbRGVmYXVsdFByb3BlcnR5KFwidmFsdWVDbGFzc2VzXCIpXSovXG4vKipcbiAqIEEgTW9ub1NpZ25hbCBjYW4gaGF2ZSBvbmx5IG9uZSBsaXN0ZW5lci5cbiAqL1xudmFyIE1vbm9TaWduYWwgPSAoZnVuY3Rpb24gKCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBNb25vU2lnbmFsIGluc3RhbmNlIHRvIGRpc3BhdGNoIHZhbHVlIG9iamVjdHMuXG4gICAgICogQHBhcmFtICAgIHZhbHVlQ2xhc3NlcyBBbnkgbnVtYmVyIG9mIGNsYXNzIHJlZmVyZW5jZXMgdGhhdCBlbmFibGUgdHlwZSBjaGVja3MgaW4gZGlzcGF0Y2goKS5cbiAgICAgKiBGb3IgZXhhbXBsZSwgbmV3IFNpZ25hbChTdHJpbmcsIHVpbnQpXG4gICAgICogd291bGQgYWxsb3c6IHNpZ25hbC5kaXNwYXRjaChcInRoZSBBbnN3ZXJcIiwgNDIpXG4gICAgICogYnV0IG5vdDogc2lnbmFsLmRpc3BhdGNoKHRydWUsIDQyLjUpXG4gICAgICogbm9yOiBzaWduYWwuZGlzcGF0Y2goKVxuICAgICAqXG4gICAgICogTk9URTogU3ViY2xhc3NlcyBjYW5ub3QgY2FsbCBzdXBlci5hcHBseShudWxsLCB2YWx1ZUNsYXNzZXMpLFxuICAgICAqIGJ1dCB0aGlzIGNvbnN0cnVjdG9yIGhhcyBsb2dpYyB0byBzdXBwb3J0IHN1cGVyKHZhbHVlQ2xhc3NlcykuXG4gICAgICovXG4gICAgZnVuY3Rpb24gTW9ub1NpZ25hbCgpIHtcbiAgICAgICAgdmFyIHZhbHVlQ2xhc3NlcyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgdmFsdWVDbGFzc2VzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ2Fubm90IHVzZSBzdXBlci5hcHBseShudWxsLCB2YWx1ZUNsYXNzZXMpLCBzbyBhbGxvdyB0aGUgc3ViY2xhc3MgdG8gY2FsbCBzdXBlcih2YWx1ZUNsYXNzZXMpLlxuICAgICAgICB0aGlzLnZhbHVlQ2xhc3NlcyA9ICh2YWx1ZUNsYXNzZXMubGVuZ3RoID09IDEgJiYgdmFsdWVDbGFzc2VzWzBdIGluc3RhbmNlb2YgQXJyYXkpID8gdmFsdWVDbGFzc2VzWzBdIDogdmFsdWVDbGFzc2VzO1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoTW9ub1NpZ25hbC5wcm90b3R5cGUsIFwidmFsdWVDbGFzc2VzXCIsIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBpbmhlcml0RG9jXG4gICAgICAgICAqIEB0aHJvd3MgQXJndW1lbnRFcnJvciA8Y29kZT5Bcmd1bWVudEVycm9yPC9jb2RlPjogSW52YWxpZCB2YWx1ZUNsYXNzZXMgYXJndW1lbnQ6IGl0ZW0gYXQgaW5kZXggc2hvdWxkIGJlIGEgQ2xhc3MgYnV0IHdhcyBub3QuXG4gICAgICAgICAqL1xuICAgICAgICAvKltBcnJheUVsZW1lbnRUeXBlKFwiQ2xhc3NcIildKi9cbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdmFsdWVDbGFzc2VzO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgLy8gQ2xvbmUgc28gdGhlIEFycmF5IGNhbm5vdCBiZSBhZmZlY3RlZCBmcm9tIG91dHNpZGUuXG4gICAgICAgICAgICB0aGlzLl92YWx1ZUNsYXNzZXMgPSB2YWx1ZSA/IHZhbHVlLnNsaWNlKCkgOiBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSB0aGlzLl92YWx1ZUNsYXNzZXMubGVuZ3RoOyBpLS07KSB7XG4gICAgICAgICAgICAgICAgaWYgKCEodGhpcy5fdmFsdWVDbGFzc2VzW2ldIGluc3RhbmNlb2YgT2JqZWN0KSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdmFsdWVDbGFzc2VzIGFyZ3VtZW50OiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdpdGVtIGF0IGluZGV4ICcgKyBpICsgJyBzaG91bGQgYmUgYSBDbGFzcyBidXQgd2FzOjwnICtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlQ2xhc3Nlc1tpXSArICc+LicgKyB0aGlzLl92YWx1ZUNsYXNzZXNbaV0pOyAvL0BDSEFOR0VEIC0gdGVtcCByZXBsYWNlbWVudCBmb3IgZ2V0UXVhbGlmaWVkQ2xhc3NCeU5hbWUoKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KE1vbm9TaWduYWwucHJvdG90eXBlLCBcIm51bUxpc3RlbmVyc1wiLCB7XG4gICAgICAgIC8qKiBAaW5oZXJpdERvYyAqL1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNsb3QgPyAxIDogMDtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKiBAdGhyb3dzIGZsYXNoLmVycm9ycy5JbGxlZ2FsT3BlcmF0aW9uRXJyb3IgPGNvZGU+SWxsZWdhbE9wZXJhdGlvbkVycm9yPC9jb2RlPjogWW91IGNhbm5vdCBhZGQgb3IgYWRkT25jZSB3aXRoIGEgbGlzdGVuZXIgYWxyZWFkeSBhZGRlZCwgcmVtb3ZlIHRoZSBjdXJyZW50IGxpc3RlbmVyIGZpcnN0LlxuICAgICAqIEB0aHJvd3MgQXJndW1lbnRFcnJvciA8Y29kZT5Bcmd1bWVudEVycm9yPC9jb2RlPjogR2l2ZW4gbGlzdGVuZXIgaXMgPGNvZGU+bnVsbDwvY29kZT4uXG4gICAgICovXG4gICAgTW9ub1NpZ25hbC5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gKGxpc3RlbmVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlZ2lzdGVyTGlzdGVuZXIobGlzdGVuZXIpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKiBAdGhyb3dzIGZsYXNoLmVycm9ycy5JbGxlZ2FsT3BlcmF0aW9uRXJyb3IgPGNvZGU+SWxsZWdhbE9wZXJhdGlvbkVycm9yPC9jb2RlPjogWW91IGNhbm5vdCBhZGQgb3IgYWRkT25jZSB3aXRoIGEgbGlzdGVuZXIgYWxyZWFkeSBhZGRlZCwgcmVtb3ZlIHRoZSBjdXJyZW50IGxpc3RlbmVyIGZpcnN0LlxuICAgICAqIEB0aHJvd3MgQXJndW1lbnRFcnJvciA8Y29kZT5Bcmd1bWVudEVycm9yPC9jb2RlPjogR2l2ZW4gbGlzdGVuZXIgaXMgPGNvZGU+bnVsbDwvY29kZT4uXG4gICAgICovXG4gICAgTW9ub1NpZ25hbC5wcm90b3R5cGUuYWRkT25jZSA9IGZ1bmN0aW9uIChsaXN0ZW5lcikge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWdpc3Rlckxpc3RlbmVyKGxpc3RlbmVyLCB0cnVlKTtcbiAgICB9O1xuICAgIC8qKiBAaW5oZXJpdERvYyAqL1xuICAgIE1vbm9TaWduYWwucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uIChsaXN0ZW5lcikge1xuICAgICAgICBpZiAodGhpcy5zbG90ICYmIHRoaXMuc2xvdC5saXN0ZW5lciA9PSBsaXN0ZW5lcikge1xuICAgICAgICAgICAgdmFyIHRoZVNsb3QgPSB0aGlzLnNsb3Q7XG4gICAgICAgICAgICB0aGlzLnNsb3QgPSBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHRoZVNsb3Q7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgICAvKiogQGluaGVyaXREb2MgKi9cbiAgICBNb25vU2lnbmFsLnByb3RvdHlwZS5yZW1vdmVBbGwgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLnNsb3QpXG4gICAgICAgICAgICB0aGlzLnNsb3QucmVtb3ZlKCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqIEB0aHJvd3MgQXJndW1lbnRFcnJvciA8Y29kZT5Bcmd1bWVudEVycm9yPC9jb2RlPjogSW5jb3JyZWN0IG51bWJlciBvZiBhcmd1bWVudHMuXG4gICAgICogQHRocm93cyBBcmd1bWVudEVycm9yIDxjb2RlPkFyZ3VtZW50RXJyb3I8L2NvZGU+OiBWYWx1ZSBvYmplY3QgaXMgbm90IGFuIGluc3RhbmNlIG9mIHRoZSBhcHByb3ByaWF0ZSB2YWx1ZUNsYXNzZXMgQ2xhc3MuXG4gICAgICovXG4gICAgTW9ub1NpZ25hbC5wcm90b3R5cGUuZGlzcGF0Y2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB2YWx1ZU9iamVjdHMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIHZhbHVlT2JqZWN0c1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICB9XG4gICAgICAgIC8vIElmIHZhbHVlQ2xhc3NlcyBpcyBlbXB0eSwgdmFsdWUgb2JqZWN0cyBhcmUgbm90IHR5cGUtY2hlY2tlZC5cbiAgICAgICAgdmFyIG51bVZhbHVlQ2xhc3NlcyA9IHRoaXMuX3ZhbHVlQ2xhc3Nlcy5sZW5ndGg7XG4gICAgICAgIHZhciBudW1WYWx1ZU9iamVjdHMgPSB2YWx1ZU9iamVjdHMubGVuZ3RoO1xuICAgICAgICAvLyBDYW5ub3QgZGlzcGF0Y2ggZmV3ZXIgb2JqZWN0cyB0aGFuIGRlY2xhcmVkIGNsYXNzZXMuXG4gICAgICAgIGlmIChudW1WYWx1ZU9iamVjdHMgPCBudW1WYWx1ZUNsYXNzZXMpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW5jb3JyZWN0IG51bWJlciBvZiBhcmd1bWVudHMuICcgK1xuICAgICAgICAgICAgICAgICdFeHBlY3RlZCBhdCBsZWFzdCAnICsgbnVtVmFsdWVDbGFzc2VzICsgJyBidXQgcmVjZWl2ZWQgJyArXG4gICAgICAgICAgICAgICAgbnVtVmFsdWVPYmplY3RzICsgJy4nKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBDYW5ub3QgZGlzcGF0Y2ggZGlmZmVyZW50bHkgdHlwZWQgb2JqZWN0cyB0aGFuIGRlY2xhcmVkIGNsYXNzZXMuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtVmFsdWVDbGFzc2VzOyBpKyspIHtcbiAgICAgICAgICAgIC8vIE9wdGltaXplZCBmb3IgdGhlIG9wdGltaXN0aWMgY2FzZSB0aGF0IHZhbHVlcyBhcmUgY29ycmVjdC5cbiAgICAgICAgICAgIGlmICh2YWx1ZU9iamVjdHNbaV0gPT09IG51bGwgfHxcbiAgICAgICAgICAgICAgICAodmFsdWVPYmplY3RzW2ldIGluc3RhbmNlb2YgdGhpcy5fdmFsdWVDbGFzc2VzW2ldIHx8IHZhbHVlT2JqZWN0c1tpXS5jb25zdHJ1Y3RvciA9PT0gdGhpcy5fdmFsdWVDbGFzc2VzW2ldKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdWYWx1ZSBvYmplY3QgPCcgKyB2YWx1ZU9iamVjdHNbaV1cbiAgICAgICAgICAgICAgICArICc+IGlzIG5vdCBhbiBpbnN0YW5jZSBvZiA8JyArIHRoaXMuX3ZhbHVlQ2xhc3Nlc1tpXSArICc+LicpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEJyb2FkY2FzdCB0byB0aGUgb25lIGxpc3RlbmVyLlxuICAgICAgICBpZiAodGhpcy5zbG90KSB7XG4gICAgICAgICAgICB0aGlzLnNsb3QuZXhlY3V0ZSh2YWx1ZU9iamVjdHMpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBNb25vU2lnbmFsLnByb3RvdHlwZS5yZWdpc3Rlckxpc3RlbmVyID0gZnVuY3Rpb24gKGxpc3RlbmVyLCBvbmNlKSB7XG4gICAgICAgIGlmIChvbmNlID09PSB2b2lkIDApIHsgb25jZSA9IGZhbHNlOyB9XG4gICAgICAgIGlmICh0aGlzLnNsb3QpIHtcbiAgICAgICAgICAgIC8vIElmIHRoZSBsaXN0ZW5lciBleGl0cyBwcmV2aW91c2x5IGFkZGVkLCBkZWZpbml0ZWx5IGRvbid0IGFkZCBpdC5cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignWW91IGNhbm5vdCBhZGQgb3IgYWRkT25jZSB3aXRoIGEgbGlzdGVuZXIgYWxyZWFkeSBhZGRlZCwgcmVtb3ZlIHRoZSBjdXJyZW50IGxpc3RlbmVyIGZpcnN0LicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAodGhpcy5zbG90ID0gbmV3IFNsb3RfMS5TbG90KGxpc3RlbmVyLCB0aGlzLCBvbmNlKSk7XG4gICAgfTtcbiAgICByZXR1cm4gTW9ub1NpZ25hbDtcbn0oKSk7XG5leHBvcnRzLk1vbm9TaWduYWwgPSBNb25vU2lnbmFsO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TW9ub1NpZ25hbC5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9zaWduYWxzLmpzL2xpYi9vcmcvb3NmbGFzaC9zaWduYWxzL01vbm9TaWduYWwuanNcbi8vIG1vZHVsZSBpZCA9IDE5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XG4gICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcbiAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07IH07XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgICAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG4gICAgfTtcbn0pKCk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgT25jZVNpZ25hbF8xID0gcmVxdWlyZShcIi4vT25jZVNpZ25hbFwiKTtcbnZhciBQcm9taXNlID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUHJvbWlzZSwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQcm9taXNlKCkge1xuICAgICAgICByZXR1cm4gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgfVxuICAgIC8qKiBAaW5oZXJpdERvYyAqL1xuICAgIC8qb3ZlcnJpZGUqL1xuICAgIFByb21pc2UucHJvdG90eXBlLmFkZE9uY2UgPSBmdW5jdGlvbiAobGlzdGVuZXIpIHtcbiAgICAgICAgdmFyIHNsb3QgPSBfc3VwZXIucHJvdG90eXBlLmFkZE9uY2UuY2FsbCh0aGlzLCBsaXN0ZW5lcik7XG4gICAgICAgIGlmICh0aGlzLmlzRGlzcGF0Y2hlZCkge1xuICAgICAgICAgICAgc2xvdC5leGVjdXRlKHRoaXMudmFsdWVPYmplY3RzKTtcbiAgICAgICAgICAgIHNsb3QucmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNsb3Q7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqIEB0aHJvd3MgZmxhc2guZXJyb3JzLklsbGVnYWxPcGVyYXRpb25FcnJvciA8Y29kZT5JbGxlZ2FsT3BlcmF0aW9uRXJyb3I8L2NvZGU+OiBZb3UgY2Fubm90IGRpc3BhdGNoKCkgYSBQcm9taXNlIG1vcmUgdGhhbiBvbmNlXG4gICAgICovXG4gICAgLypvdmVycmlkZSovXG4gICAgUHJvbWlzZS5wcm90b3R5cGUuZGlzcGF0Y2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB2YWx1ZU9iamVjdHMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIHZhbHVlT2JqZWN0c1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmlzRGlzcGF0Y2hlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiWW91IGNhbm5vdCBkaXNwYXRjaCgpIGEgUHJvbWlzZSBtb3JlIHRoYW4gb25jZVwiKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaXNEaXNwYXRjaGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMudmFsdWVPYmplY3RzID0gdmFsdWVPYmplY3RzO1xuICAgICAgICAgICAgX3N1cGVyLnByb3RvdHlwZS5kaXNwYXRjaC5hcHBseSh0aGlzLCB2YWx1ZU9iamVjdHMpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gUHJvbWlzZTtcbn0oT25jZVNpZ25hbF8xLk9uY2VTaWduYWwpKTtcbmV4cG9ydHMuUHJvbWlzZSA9IFByb21pc2U7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Qcm9taXNlLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL3NpZ25hbHMuanMvbGliL29yZy9vc2ZsYXNoL3NpZ25hbHMvUHJvbWlzZS5qc1xuLy8gbW9kdWxlIGlkID0gMjBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLyohXG4gKiBUaGUgYnVmZmVyIG1vZHVsZSBmcm9tIG5vZGUuanMsIGZvciB0aGUgYnJvd3Nlci5cbiAqXG4gKiBAYXV0aG9yICAgRmVyb3NzIEFib3VraGFkaWplaCA8ZmVyb3NzQGZlcm9zcy5vcmc+IDxodHRwOi8vZmVyb3NzLm9yZz5cbiAqIEBsaWNlbnNlICBNSVRcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tcHJvdG8gKi9cblxuJ3VzZSBzdHJpY3QnXG5cbnZhciBiYXNlNjQgPSByZXF1aXJlKCdiYXNlNjQtanMnKVxudmFyIGllZWU3NTQgPSByZXF1aXJlKCdpZWVlNzU0JylcbnZhciBpc0FycmF5ID0gcmVxdWlyZSgnaXNhcnJheScpXG5cbmV4cG9ydHMuQnVmZmVyID0gQnVmZmVyXG5leHBvcnRzLlNsb3dCdWZmZXIgPSBTbG93QnVmZmVyXG5leHBvcnRzLklOU1BFQ1RfTUFYX0JZVEVTID0gNTBcblxuLyoqXG4gKiBJZiBgQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlRgOlxuICogICA9PT0gdHJ1ZSAgICBVc2UgVWludDhBcnJheSBpbXBsZW1lbnRhdGlvbiAoZmFzdGVzdClcbiAqICAgPT09IGZhbHNlICAgVXNlIE9iamVjdCBpbXBsZW1lbnRhdGlvbiAobW9zdCBjb21wYXRpYmxlLCBldmVuIElFNilcbiAqXG4gKiBCcm93c2VycyB0aGF0IHN1cHBvcnQgdHlwZWQgYXJyYXlzIGFyZSBJRSAxMCssIEZpcmVmb3ggNCssIENocm9tZSA3KywgU2FmYXJpIDUuMSssXG4gKiBPcGVyYSAxMS42KywgaU9TIDQuMisuXG4gKlxuICogRHVlIHRvIHZhcmlvdXMgYnJvd3NlciBidWdzLCBzb21ldGltZXMgdGhlIE9iamVjdCBpbXBsZW1lbnRhdGlvbiB3aWxsIGJlIHVzZWQgZXZlblxuICogd2hlbiB0aGUgYnJvd3NlciBzdXBwb3J0cyB0eXBlZCBhcnJheXMuXG4gKlxuICogTm90ZTpcbiAqXG4gKiAgIC0gRmlyZWZveCA0LTI5IGxhY2tzIHN1cHBvcnQgZm9yIGFkZGluZyBuZXcgcHJvcGVydGllcyB0byBgVWludDhBcnJheWAgaW5zdGFuY2VzLFxuICogICAgIFNlZTogaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njk1NDM4LlxuICpcbiAqICAgLSBDaHJvbWUgOS0xMCBpcyBtaXNzaW5nIHRoZSBgVHlwZWRBcnJheS5wcm90b3R5cGUuc3ViYXJyYXlgIGZ1bmN0aW9uLlxuICpcbiAqICAgLSBJRTEwIGhhcyBhIGJyb2tlbiBgVHlwZWRBcnJheS5wcm90b3R5cGUuc3ViYXJyYXlgIGZ1bmN0aW9uIHdoaWNoIHJldHVybnMgYXJyYXlzIG9mXG4gKiAgICAgaW5jb3JyZWN0IGxlbmd0aCBpbiBzb21lIHNpdHVhdGlvbnMuXG5cbiAqIFdlIGRldGVjdCB0aGVzZSBidWdneSBicm93c2VycyBhbmQgc2V0IGBCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVGAgdG8gYGZhbHNlYCBzbyB0aGV5XG4gKiBnZXQgdGhlIE9iamVjdCBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggaXMgc2xvd2VyIGJ1dCBiZWhhdmVzIGNvcnJlY3RseS5cbiAqL1xuQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgPSBnbG9iYWwuVFlQRURfQVJSQVlfU1VQUE9SVCAhPT0gdW5kZWZpbmVkXG4gID8gZ2xvYmFsLlRZUEVEX0FSUkFZX1NVUFBPUlRcbiAgOiB0eXBlZEFycmF5U3VwcG9ydCgpXG5cbi8qXG4gKiBFeHBvcnQga01heExlbmd0aCBhZnRlciB0eXBlZCBhcnJheSBzdXBwb3J0IGlzIGRldGVybWluZWQuXG4gKi9cbmV4cG9ydHMua01heExlbmd0aCA9IGtNYXhMZW5ndGgoKVxuXG5mdW5jdGlvbiB0eXBlZEFycmF5U3VwcG9ydCAoKSB7XG4gIHRyeSB7XG4gICAgdmFyIGFyciA9IG5ldyBVaW50OEFycmF5KDEpXG4gICAgYXJyLl9fcHJvdG9fXyA9IHtfX3Byb3RvX186IFVpbnQ4QXJyYXkucHJvdG90eXBlLCBmb286IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDQyIH19XG4gICAgcmV0dXJuIGFyci5mb28oKSA9PT0gNDIgJiYgLy8gdHlwZWQgYXJyYXkgaW5zdGFuY2VzIGNhbiBiZSBhdWdtZW50ZWRcbiAgICAgICAgdHlwZW9mIGFyci5zdWJhcnJheSA9PT0gJ2Z1bmN0aW9uJyAmJiAvLyBjaHJvbWUgOS0xMCBsYWNrIGBzdWJhcnJheWBcbiAgICAgICAgYXJyLnN1YmFycmF5KDEsIDEpLmJ5dGVMZW5ndGggPT09IDAgLy8gaWUxMCBoYXMgYnJva2VuIGBzdWJhcnJheWBcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbmZ1bmN0aW9uIGtNYXhMZW5ndGggKCkge1xuICByZXR1cm4gQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlRcbiAgICA/IDB4N2ZmZmZmZmZcbiAgICA6IDB4M2ZmZmZmZmZcbn1cblxuZnVuY3Rpb24gY3JlYXRlQnVmZmVyICh0aGF0LCBsZW5ndGgpIHtcbiAgaWYgKGtNYXhMZW5ndGgoKSA8IGxlbmd0aCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbnZhbGlkIHR5cGVkIGFycmF5IGxlbmd0aCcpXG4gIH1cbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgLy8gUmV0dXJuIGFuIGF1Z21lbnRlZCBgVWludDhBcnJheWAgaW5zdGFuY2UsIGZvciBiZXN0IHBlcmZvcm1hbmNlXG4gICAgdGhhdCA9IG5ldyBVaW50OEFycmF5KGxlbmd0aClcbiAgICB0aGF0Ll9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGVcbiAgfSBlbHNlIHtcbiAgICAvLyBGYWxsYmFjazogUmV0dXJuIGFuIG9iamVjdCBpbnN0YW5jZSBvZiB0aGUgQnVmZmVyIGNsYXNzXG4gICAgaWYgKHRoYXQgPT09IG51bGwpIHtcbiAgICAgIHRoYXQgPSBuZXcgQnVmZmVyKGxlbmd0aClcbiAgICB9XG4gICAgdGhhdC5sZW5ndGggPSBsZW5ndGhcbiAgfVxuXG4gIHJldHVybiB0aGF0XG59XG5cbi8qKlxuICogVGhlIEJ1ZmZlciBjb25zdHJ1Y3RvciByZXR1cm5zIGluc3RhbmNlcyBvZiBgVWludDhBcnJheWAgdGhhdCBoYXZlIHRoZWlyXG4gKiBwcm90b3R5cGUgY2hhbmdlZCB0byBgQnVmZmVyLnByb3RvdHlwZWAuIEZ1cnRoZXJtb3JlLCBgQnVmZmVyYCBpcyBhIHN1YmNsYXNzIG9mXG4gKiBgVWludDhBcnJheWAsIHNvIHRoZSByZXR1cm5lZCBpbnN0YW5jZXMgd2lsbCBoYXZlIGFsbCB0aGUgbm9kZSBgQnVmZmVyYCBtZXRob2RzXG4gKiBhbmQgdGhlIGBVaW50OEFycmF5YCBtZXRob2RzLiBTcXVhcmUgYnJhY2tldCBub3RhdGlvbiB3b3JrcyBhcyBleHBlY3RlZCAtLSBpdFxuICogcmV0dXJucyBhIHNpbmdsZSBvY3RldC5cbiAqXG4gKiBUaGUgYFVpbnQ4QXJyYXlgIHByb3RvdHlwZSByZW1haW5zIHVubW9kaWZpZWQuXG4gKi9cblxuZnVuY3Rpb24gQnVmZmVyIChhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUICYmICEodGhpcyBpbnN0YW5jZW9mIEJ1ZmZlcikpIHtcbiAgICByZXR1cm4gbmV3IEJ1ZmZlcihhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbiAgfVxuXG4gIC8vIENvbW1vbiBjYXNlLlxuICBpZiAodHlwZW9mIGFyZyA9PT0gJ251bWJlcicpIHtcbiAgICBpZiAodHlwZW9mIGVuY29kaW5nT3JPZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdJZiBlbmNvZGluZyBpcyBzcGVjaWZpZWQgdGhlbiB0aGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZydcbiAgICAgIClcbiAgICB9XG4gICAgcmV0dXJuIGFsbG9jVW5zYWZlKHRoaXMsIGFyZylcbiAgfVxuICByZXR1cm4gZnJvbSh0aGlzLCBhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbn1cblxuQnVmZmVyLnBvb2xTaXplID0gODE5MiAvLyBub3QgdXNlZCBieSB0aGlzIGltcGxlbWVudGF0aW9uXG5cbi8vIFRPRE86IExlZ2FjeSwgbm90IG5lZWRlZCBhbnltb3JlLiBSZW1vdmUgaW4gbmV4dCBtYWpvciB2ZXJzaW9uLlxuQnVmZmVyLl9hdWdtZW50ID0gZnVuY3Rpb24gKGFycikge1xuICBhcnIuX19wcm90b19fID0gQnVmZmVyLnByb3RvdHlwZVxuICByZXR1cm4gYXJyXG59XG5cbmZ1bmN0aW9uIGZyb20gKHRoYXQsIHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcInZhbHVlXCIgYXJndW1lbnQgbXVzdCBub3QgYmUgYSBudW1iZXInKVxuICB9XG5cbiAgaWYgKHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiYgdmFsdWUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgIHJldHVybiBmcm9tQXJyYXlCdWZmZXIodGhhdCwgdmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZyb21TdHJpbmcodGhhdCwgdmFsdWUsIGVuY29kaW5nT3JPZmZzZXQpXG4gIH1cblxuICByZXR1cm4gZnJvbU9iamVjdCh0aGF0LCB2YWx1ZSlcbn1cblxuLyoqXG4gKiBGdW5jdGlvbmFsbHkgZXF1aXZhbGVudCB0byBCdWZmZXIoYXJnLCBlbmNvZGluZykgYnV0IHRocm93cyBhIFR5cGVFcnJvclxuICogaWYgdmFsdWUgaXMgYSBudW1iZXIuXG4gKiBCdWZmZXIuZnJvbShzdHJbLCBlbmNvZGluZ10pXG4gKiBCdWZmZXIuZnJvbShhcnJheSlcbiAqIEJ1ZmZlci5mcm9tKGJ1ZmZlcilcbiAqIEJ1ZmZlci5mcm9tKGFycmF5QnVmZmVyWywgYnl0ZU9mZnNldFssIGxlbmd0aF1dKVxuICoqL1xuQnVmZmVyLmZyb20gPSBmdW5jdGlvbiAodmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gZnJvbShudWxsLCB2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxufVxuXG5pZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgQnVmZmVyLnByb3RvdHlwZS5fX3Byb3RvX18gPSBVaW50OEFycmF5LnByb3RvdHlwZVxuICBCdWZmZXIuX19wcm90b19fID0gVWludDhBcnJheVxuICBpZiAodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnNwZWNpZXMgJiZcbiAgICAgIEJ1ZmZlcltTeW1ib2wuc3BlY2llc10gPT09IEJ1ZmZlcikge1xuICAgIC8vIEZpeCBzdWJhcnJheSgpIGluIEVTMjAxNi4gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlci9wdWxsLzk3XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEJ1ZmZlciwgU3ltYm9sLnNwZWNpZXMsIHtcbiAgICAgIHZhbHVlOiBudWxsLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSlcbiAgfVxufVxuXG5mdW5jdGlvbiBhc3NlcnRTaXplIChzaXplKSB7XG4gIGlmICh0eXBlb2Ygc2l6ZSAhPT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcInNpemVcIiBhcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyJylcbiAgfSBlbHNlIGlmIChzaXplIDwgMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdcInNpemVcIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBuZWdhdGl2ZScpXG4gIH1cbn1cblxuZnVuY3Rpb24gYWxsb2MgKHRoYXQsIHNpemUsIGZpbGwsIGVuY29kaW5nKSB7XG4gIGFzc2VydFNpemUoc2l6ZSlcbiAgaWYgKHNpemUgPD0gMCkge1xuICAgIHJldHVybiBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSlcbiAgfVxuICBpZiAoZmlsbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gT25seSBwYXkgYXR0ZW50aW9uIHRvIGVuY29kaW5nIGlmIGl0J3MgYSBzdHJpbmcuIFRoaXNcbiAgICAvLyBwcmV2ZW50cyBhY2NpZGVudGFsbHkgc2VuZGluZyBpbiBhIG51bWJlciB0aGF0IHdvdWxkXG4gICAgLy8gYmUgaW50ZXJwcmV0dGVkIGFzIGEgc3RhcnQgb2Zmc2V0LlxuICAgIHJldHVybiB0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnXG4gICAgICA/IGNyZWF0ZUJ1ZmZlcih0aGF0LCBzaXplKS5maWxsKGZpbGwsIGVuY29kaW5nKVxuICAgICAgOiBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSkuZmlsbChmaWxsKVxuICB9XG4gIHJldHVybiBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSlcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGZpbGxlZCBCdWZmZXIgaW5zdGFuY2UuXG4gKiBhbGxvYyhzaXplWywgZmlsbFssIGVuY29kaW5nXV0pXG4gKiovXG5CdWZmZXIuYWxsb2MgPSBmdW5jdGlvbiAoc2l6ZSwgZmlsbCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIGFsbG9jKG51bGwsIHNpemUsIGZpbGwsIGVuY29kaW5nKVxufVxuXG5mdW5jdGlvbiBhbGxvY1Vuc2FmZSAodGhhdCwgc2l6ZSkge1xuICBhc3NlcnRTaXplKHNpemUpXG4gIHRoYXQgPSBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSA8IDAgPyAwIDogY2hlY2tlZChzaXplKSB8IDApXG4gIGlmICghQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNpemU7ICsraSkge1xuICAgICAgdGhhdFtpXSA9IDBcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoYXRcbn1cblxuLyoqXG4gKiBFcXVpdmFsZW50IHRvIEJ1ZmZlcihudW0pLCBieSBkZWZhdWx0IGNyZWF0ZXMgYSBub24temVyby1maWxsZWQgQnVmZmVyIGluc3RhbmNlLlxuICogKi9cbkJ1ZmZlci5hbGxvY1Vuc2FmZSA9IGZ1bmN0aW9uIChzaXplKSB7XG4gIHJldHVybiBhbGxvY1Vuc2FmZShudWxsLCBzaXplKVxufVxuLyoqXG4gKiBFcXVpdmFsZW50IHRvIFNsb3dCdWZmZXIobnVtKSwgYnkgZGVmYXVsdCBjcmVhdGVzIGEgbm9uLXplcm8tZmlsbGVkIEJ1ZmZlciBpbnN0YW5jZS5cbiAqL1xuQnVmZmVyLmFsbG9jVW5zYWZlU2xvdyA9IGZ1bmN0aW9uIChzaXplKSB7XG4gIHJldHVybiBhbGxvY1Vuc2FmZShudWxsLCBzaXplKVxufVxuXG5mdW5jdGlvbiBmcm9tU3RyaW5nICh0aGF0LCBzdHJpbmcsIGVuY29kaW5nKSB7XG4gIGlmICh0eXBlb2YgZW5jb2RpbmcgIT09ICdzdHJpbmcnIHx8IGVuY29kaW5nID09PSAnJykge1xuICAgIGVuY29kaW5nID0gJ3V0ZjgnXG4gIH1cblxuICBpZiAoIUJ1ZmZlci5pc0VuY29kaW5nKGVuY29kaW5nKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wiZW5jb2RpbmdcIiBtdXN0IGJlIGEgdmFsaWQgc3RyaW5nIGVuY29kaW5nJylcbiAgfVxuXG4gIHZhciBsZW5ndGggPSBieXRlTGVuZ3RoKHN0cmluZywgZW5jb2RpbmcpIHwgMFxuICB0aGF0ID0gY3JlYXRlQnVmZmVyKHRoYXQsIGxlbmd0aClcblxuICB2YXIgYWN0dWFsID0gdGhhdC53cml0ZShzdHJpbmcsIGVuY29kaW5nKVxuXG4gIGlmIChhY3R1YWwgIT09IGxlbmd0aCkge1xuICAgIC8vIFdyaXRpbmcgYSBoZXggc3RyaW5nLCBmb3IgZXhhbXBsZSwgdGhhdCBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlcnMgd2lsbFxuICAgIC8vIGNhdXNlIGV2ZXJ5dGhpbmcgYWZ0ZXIgdGhlIGZpcnN0IGludmFsaWQgY2hhcmFjdGVyIHRvIGJlIGlnbm9yZWQuIChlLmcuXG4gICAgLy8gJ2FieHhjZCcgd2lsbCBiZSB0cmVhdGVkIGFzICdhYicpXG4gICAgdGhhdCA9IHRoYXQuc2xpY2UoMCwgYWN0dWFsKVxuICB9XG5cbiAgcmV0dXJuIHRoYXRcbn1cblxuZnVuY3Rpb24gZnJvbUFycmF5TGlrZSAodGhhdCwgYXJyYXkpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCA8IDAgPyAwIDogY2hlY2tlZChhcnJheS5sZW5ndGgpIHwgMFxuICB0aGF0ID0gY3JlYXRlQnVmZmVyKHRoYXQsIGxlbmd0aClcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMSkge1xuICAgIHRoYXRbaV0gPSBhcnJheVtpXSAmIDI1NVxuICB9XG4gIHJldHVybiB0aGF0XG59XG5cbmZ1bmN0aW9uIGZyb21BcnJheUJ1ZmZlciAodGhhdCwgYXJyYXksIGJ5dGVPZmZzZXQsIGxlbmd0aCkge1xuICBhcnJheS5ieXRlTGVuZ3RoIC8vIHRoaXMgdGhyb3dzIGlmIGBhcnJheWAgaXMgbm90IGEgdmFsaWQgQXJyYXlCdWZmZXJcblxuICBpZiAoYnl0ZU9mZnNldCA8IDAgfHwgYXJyYXkuYnl0ZUxlbmd0aCA8IGJ5dGVPZmZzZXQpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXFwnb2Zmc2V0XFwnIGlzIG91dCBvZiBib3VuZHMnKVxuICB9XG5cbiAgaWYgKGFycmF5LmJ5dGVMZW5ndGggPCBieXRlT2Zmc2V0ICsgKGxlbmd0aCB8fCAwKSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdcXCdsZW5ndGhcXCcgaXMgb3V0IG9mIGJvdW5kcycpXG4gIH1cblxuICBpZiAoYnl0ZU9mZnNldCA9PT0gdW5kZWZpbmVkICYmIGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYXJyYXkgPSBuZXcgVWludDhBcnJheShhcnJheSlcbiAgfSBlbHNlIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgIGFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXksIGJ5dGVPZmZzZXQpXG4gIH0gZWxzZSB7XG4gICAgYXJyYXkgPSBuZXcgVWludDhBcnJheShhcnJheSwgYnl0ZU9mZnNldCwgbGVuZ3RoKVxuICB9XG5cbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgLy8gUmV0dXJuIGFuIGF1Z21lbnRlZCBgVWludDhBcnJheWAgaW5zdGFuY2UsIGZvciBiZXN0IHBlcmZvcm1hbmNlXG4gICAgdGhhdCA9IGFycmF5XG4gICAgdGhhdC5fX3Byb3RvX18gPSBCdWZmZXIucHJvdG90eXBlXG4gIH0gZWxzZSB7XG4gICAgLy8gRmFsbGJhY2s6IFJldHVybiBhbiBvYmplY3QgaW5zdGFuY2Ugb2YgdGhlIEJ1ZmZlciBjbGFzc1xuICAgIHRoYXQgPSBmcm9tQXJyYXlMaWtlKHRoYXQsIGFycmF5KVxuICB9XG4gIHJldHVybiB0aGF0XG59XG5cbmZ1bmN0aW9uIGZyb21PYmplY3QgKHRoYXQsIG9iaikge1xuICBpZiAoQnVmZmVyLmlzQnVmZmVyKG9iaikpIHtcbiAgICB2YXIgbGVuID0gY2hlY2tlZChvYmoubGVuZ3RoKSB8IDBcbiAgICB0aGF0ID0gY3JlYXRlQnVmZmVyKHRoYXQsIGxlbilcblxuICAgIGlmICh0aGF0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRoYXRcbiAgICB9XG5cbiAgICBvYmouY29weSh0aGF0LCAwLCAwLCBsZW4pXG4gICAgcmV0dXJuIHRoYXRcbiAgfVxuXG4gIGlmIChvYmopIHtcbiAgICBpZiAoKHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgb2JqLmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB8fCAnbGVuZ3RoJyBpbiBvYmopIHtcbiAgICAgIGlmICh0eXBlb2Ygb2JqLmxlbmd0aCAhPT0gJ251bWJlcicgfHwgaXNuYW4ob2JqLmxlbmd0aCkpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUJ1ZmZlcih0aGF0LCAwKVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZyb21BcnJheUxpa2UodGhhdCwgb2JqKVxuICAgIH1cblxuICAgIGlmIChvYmoudHlwZSA9PT0gJ0J1ZmZlcicgJiYgaXNBcnJheShvYmouZGF0YSkpIHtcbiAgICAgIHJldHVybiBmcm9tQXJyYXlMaWtlKHRoYXQsIG9iai5kYXRhKVxuICAgIH1cbiAgfVxuXG4gIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcsIEJ1ZmZlciwgQXJyYXlCdWZmZXIsIEFycmF5LCBvciBhcnJheS1saWtlIG9iamVjdC4nKVxufVxuXG5mdW5jdGlvbiBjaGVja2VkIChsZW5ndGgpIHtcbiAgLy8gTm90ZTogY2Fubm90IHVzZSBgbGVuZ3RoIDwga01heExlbmd0aCgpYCBoZXJlIGJlY2F1c2UgdGhhdCBmYWlscyB3aGVuXG4gIC8vIGxlbmd0aCBpcyBOYU4gKHdoaWNoIGlzIG90aGVyd2lzZSBjb2VyY2VkIHRvIHplcm8uKVxuICBpZiAobGVuZ3RoID49IGtNYXhMZW5ndGgoKSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdBdHRlbXB0IHRvIGFsbG9jYXRlIEJ1ZmZlciBsYXJnZXIgdGhhbiBtYXhpbXVtICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICdzaXplOiAweCcgKyBrTWF4TGVuZ3RoKCkudG9TdHJpbmcoMTYpICsgJyBieXRlcycpXG4gIH1cbiAgcmV0dXJuIGxlbmd0aCB8IDBcbn1cblxuZnVuY3Rpb24gU2xvd0J1ZmZlciAobGVuZ3RoKSB7XG4gIGlmICgrbGVuZ3RoICE9IGxlbmd0aCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGVxZXFlcVxuICAgIGxlbmd0aCA9IDBcbiAgfVxuICByZXR1cm4gQnVmZmVyLmFsbG9jKCtsZW5ndGgpXG59XG5cbkJ1ZmZlci5pc0J1ZmZlciA9IGZ1bmN0aW9uIGlzQnVmZmVyIChiKSB7XG4gIHJldHVybiAhIShiICE9IG51bGwgJiYgYi5faXNCdWZmZXIpXG59XG5cbkJ1ZmZlci5jb21wYXJlID0gZnVuY3Rpb24gY29tcGFyZSAoYSwgYikge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihhKSB8fCAhQnVmZmVyLmlzQnVmZmVyKGIpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnRzIG11c3QgYmUgQnVmZmVycycpXG4gIH1cblxuICBpZiAoYSA9PT0gYikgcmV0dXJuIDBcblxuICB2YXIgeCA9IGEubGVuZ3RoXG4gIHZhciB5ID0gYi5sZW5ndGhcblxuICBmb3IgKHZhciBpID0gMCwgbGVuID0gTWF0aC5taW4oeCwgeSk7IGkgPCBsZW47ICsraSkge1xuICAgIGlmIChhW2ldICE9PSBiW2ldKSB7XG4gICAgICB4ID0gYVtpXVxuICAgICAgeSA9IGJbaV1cbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgaWYgKHggPCB5KSByZXR1cm4gLTFcbiAgaWYgKHkgPCB4KSByZXR1cm4gMVxuICByZXR1cm4gMFxufVxuXG5CdWZmZXIuaXNFbmNvZGluZyA9IGZ1bmN0aW9uIGlzRW5jb2RpbmcgKGVuY29kaW5nKSB7XG4gIHN3aXRjaCAoU3RyaW5nKGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgY2FzZSAnaGV4JzpcbiAgICBjYXNlICd1dGY4JzpcbiAgICBjYXNlICd1dGYtOCc6XG4gICAgY2FzZSAnYXNjaWknOlxuICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgY2FzZSAnYmluYXJ5JzpcbiAgICBjYXNlICdiYXNlNjQnOlxuICAgIGNhc2UgJ3VjczInOlxuICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICBjYXNlICd1dGYxNmxlJzpcbiAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5CdWZmZXIuY29uY2F0ID0gZnVuY3Rpb24gY29uY2F0IChsaXN0LCBsZW5ndGgpIHtcbiAgaWYgKCFpc0FycmF5KGxpc3QpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJsaXN0XCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJylcbiAgfVxuXG4gIGlmIChsaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBCdWZmZXIuYWxsb2MoMClcbiAgfVxuXG4gIHZhciBpXG4gIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgIGxlbmd0aCA9IDBcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7ICsraSkge1xuICAgICAgbGVuZ3RoICs9IGxpc3RbaV0ubGVuZ3RoXG4gICAgfVxuICB9XG5cbiAgdmFyIGJ1ZmZlciA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShsZW5ndGgpXG4gIHZhciBwb3MgPSAwXG4gIGZvciAoaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgKytpKSB7XG4gICAgdmFyIGJ1ZiA9IGxpc3RbaV1cbiAgICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihidWYpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImxpc3RcIiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKVxuICAgIH1cbiAgICBidWYuY29weShidWZmZXIsIHBvcylcbiAgICBwb3MgKz0gYnVmLmxlbmd0aFxuICB9XG4gIHJldHVybiBidWZmZXJcbn1cblxuZnVuY3Rpb24gYnl0ZUxlbmd0aCAoc3RyaW5nLCBlbmNvZGluZykge1xuICBpZiAoQnVmZmVyLmlzQnVmZmVyKHN0cmluZykpIHtcbiAgICByZXR1cm4gc3RyaW5nLmxlbmd0aFxuICB9XG4gIGlmICh0eXBlb2YgQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBBcnJheUJ1ZmZlci5pc1ZpZXcgPT09ICdmdW5jdGlvbicgJiZcbiAgICAgIChBcnJheUJ1ZmZlci5pc1ZpZXcoc3RyaW5nKSB8fCBzdHJpbmcgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikpIHtcbiAgICByZXR1cm4gc3RyaW5nLmJ5dGVMZW5ndGhcbiAgfVxuICBpZiAodHlwZW9mIHN0cmluZyAhPT0gJ3N0cmluZycpIHtcbiAgICBzdHJpbmcgPSAnJyArIHN0cmluZ1xuICB9XG5cbiAgdmFyIGxlbiA9IHN0cmluZy5sZW5ndGhcbiAgaWYgKGxlbiA9PT0gMCkgcmV0dXJuIDBcblxuICAvLyBVc2UgYSBmb3IgbG9vcCB0byBhdm9pZCByZWN1cnNpb25cbiAgdmFyIGxvd2VyZWRDYXNlID0gZmFsc2VcbiAgZm9yICg7Oykge1xuICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gbGVuXG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgIGNhc2UgdW5kZWZpbmVkOlxuICAgICAgICByZXR1cm4gdXRmOFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGhcbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiBsZW4gKiAyXG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gbGVuID4+PiAxXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICByZXR1cm4gYmFzZTY0VG9CeXRlcyhzdHJpbmcpLmxlbmd0aFxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSByZXR1cm4gdXRmOFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGggLy8gYXNzdW1lIHV0ZjhcbiAgICAgICAgZW5jb2RpbmcgPSAoJycgKyBlbmNvZGluZykudG9Mb3dlckNhc2UoKVxuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWVcbiAgICB9XG4gIH1cbn1cbkJ1ZmZlci5ieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aFxuXG5mdW5jdGlvbiBzbG93VG9TdHJpbmcgKGVuY29kaW5nLCBzdGFydCwgZW5kKSB7XG4gIHZhciBsb3dlcmVkQ2FzZSA9IGZhbHNlXG5cbiAgLy8gTm8gbmVlZCB0byB2ZXJpZnkgdGhhdCBcInRoaXMubGVuZ3RoIDw9IE1BWF9VSU5UMzJcIiBzaW5jZSBpdCdzIGEgcmVhZC1vbmx5XG4gIC8vIHByb3BlcnR5IG9mIGEgdHlwZWQgYXJyYXkuXG5cbiAgLy8gVGhpcyBiZWhhdmVzIG5laXRoZXIgbGlrZSBTdHJpbmcgbm9yIFVpbnQ4QXJyYXkgaW4gdGhhdCB3ZSBzZXQgc3RhcnQvZW5kXG4gIC8vIHRvIHRoZWlyIHVwcGVyL2xvd2VyIGJvdW5kcyBpZiB0aGUgdmFsdWUgcGFzc2VkIGlzIG91dCBvZiByYW5nZS5cbiAgLy8gdW5kZWZpbmVkIGlzIGhhbmRsZWQgc3BlY2lhbGx5IGFzIHBlciBFQ01BLTI2MiA2dGggRWRpdGlvbixcbiAgLy8gU2VjdGlvbiAxMy4zLjMuNyBSdW50aW1lIFNlbWFudGljczogS2V5ZWRCaW5kaW5nSW5pdGlhbGl6YXRpb24uXG4gIGlmIChzdGFydCA9PT0gdW5kZWZpbmVkIHx8IHN0YXJ0IDwgMCkge1xuICAgIHN0YXJ0ID0gMFxuICB9XG4gIC8vIFJldHVybiBlYXJseSBpZiBzdGFydCA+IHRoaXMubGVuZ3RoLiBEb25lIGhlcmUgdG8gcHJldmVudCBwb3RlbnRpYWwgdWludDMyXG4gIC8vIGNvZXJjaW9uIGZhaWwgYmVsb3cuXG4gIGlmIChzdGFydCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICBpZiAoZW5kID09PSB1bmRlZmluZWQgfHwgZW5kID4gdGhpcy5sZW5ndGgpIHtcbiAgICBlbmQgPSB0aGlzLmxlbmd0aFxuICB9XG5cbiAgaWYgKGVuZCA8PSAwKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICAvLyBGb3JjZSBjb2Vyc2lvbiB0byB1aW50MzIuIFRoaXMgd2lsbCBhbHNvIGNvZXJjZSBmYWxzZXkvTmFOIHZhbHVlcyB0byAwLlxuICBlbmQgPj4+PSAwXG4gIHN0YXJ0ID4+Pj0gMFxuXG4gIGlmIChlbmQgPD0gc3RhcnQpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIGlmICghZW5jb2RpbmcpIGVuY29kaW5nID0gJ3V0ZjgnXG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gaGV4U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICAgIHJldHVybiB1dGY4U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgICByZXR1cm4gYXNjaWlTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgcmV0dXJuIGxhdGluMVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgIHJldHVybiBiYXNlNjRTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gdXRmMTZsZVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChsb3dlcmVkQ2FzZSkgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICAgICAgICBlbmNvZGluZyA9IChlbmNvZGluZyArICcnKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZVxuICAgIH1cbiAgfVxufVxuXG4vLyBUaGUgcHJvcGVydHkgaXMgdXNlZCBieSBgQnVmZmVyLmlzQnVmZmVyYCBhbmQgYGlzLWJ1ZmZlcmAgKGluIFNhZmFyaSA1LTcpIHRvIGRldGVjdFxuLy8gQnVmZmVyIGluc3RhbmNlcy5cbkJ1ZmZlci5wcm90b3R5cGUuX2lzQnVmZmVyID0gdHJ1ZVxuXG5mdW5jdGlvbiBzd2FwIChiLCBuLCBtKSB7XG4gIHZhciBpID0gYltuXVxuICBiW25dID0gYlttXVxuICBiW21dID0gaVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnN3YXAxNiA9IGZ1bmN0aW9uIHN3YXAxNiAoKSB7XG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aFxuICBpZiAobGVuICUgMiAhPT0gMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYtYml0cycpXG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkgKz0gMikge1xuICAgIHN3YXAodGhpcywgaSwgaSArIDEpXG4gIH1cbiAgcmV0dXJuIHRoaXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zd2FwMzIgPSBmdW5jdGlvbiBzd2FwMzIgKCkge1xuICB2YXIgbGVuID0gdGhpcy5sZW5ndGhcbiAgaWYgKGxlbiAlIDQgIT09IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDMyLWJpdHMnKVxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDQpIHtcbiAgICBzd2FwKHRoaXMsIGksIGkgKyAzKVxuICAgIHN3YXAodGhpcywgaSArIDEsIGkgKyAyKVxuICB9XG4gIHJldHVybiB0aGlzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc3dhcDY0ID0gZnVuY3Rpb24gc3dhcDY0ICgpIHtcbiAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoXG4gIGlmIChsZW4gJSA4ICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0J1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA2NC1iaXRzJylcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSArPSA4KSB7XG4gICAgc3dhcCh0aGlzLCBpLCBpICsgNylcbiAgICBzd2FwKHRoaXMsIGkgKyAxLCBpICsgNilcbiAgICBzd2FwKHRoaXMsIGkgKyAyLCBpICsgNSlcbiAgICBzd2FwKHRoaXMsIGkgKyAzLCBpICsgNClcbiAgfVxuICByZXR1cm4gdGhpc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcgKCkge1xuICB2YXIgbGVuZ3RoID0gdGhpcy5sZW5ndGggfCAwXG4gIGlmIChsZW5ndGggPT09IDApIHJldHVybiAnJ1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHV0ZjhTbGljZSh0aGlzLCAwLCBsZW5ndGgpXG4gIHJldHVybiBzbG93VG9TdHJpbmcuYXBwbHkodGhpcywgYXJndW1lbnRzKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uIGVxdWFscyAoYikge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihiKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlcicpXG4gIGlmICh0aGlzID09PSBiKSByZXR1cm4gdHJ1ZVxuICByZXR1cm4gQnVmZmVyLmNvbXBhcmUodGhpcywgYikgPT09IDBcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5pbnNwZWN0ID0gZnVuY3Rpb24gaW5zcGVjdCAoKSB7XG4gIHZhciBzdHIgPSAnJ1xuICB2YXIgbWF4ID0gZXhwb3J0cy5JTlNQRUNUX01BWF9CWVRFU1xuICBpZiAodGhpcy5sZW5ndGggPiAwKSB7XG4gICAgc3RyID0gdGhpcy50b1N0cmluZygnaGV4JywgMCwgbWF4KS5tYXRjaCgvLnsyfS9nKS5qb2luKCcgJylcbiAgICBpZiAodGhpcy5sZW5ndGggPiBtYXgpIHN0ciArPSAnIC4uLiAnXG4gIH1cbiAgcmV0dXJuICc8QnVmZmVyICcgKyBzdHIgKyAnPidcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5jb21wYXJlID0gZnVuY3Rpb24gY29tcGFyZSAodGFyZ2V0LCBzdGFydCwgZW5kLCB0aGlzU3RhcnQsIHRoaXNFbmQpIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIodGFyZ2V0KSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXInKVxuICB9XG5cbiAgaWYgKHN0YXJ0ID09PSB1bmRlZmluZWQpIHtcbiAgICBzdGFydCA9IDBcbiAgfVxuICBpZiAoZW5kID09PSB1bmRlZmluZWQpIHtcbiAgICBlbmQgPSB0YXJnZXQgPyB0YXJnZXQubGVuZ3RoIDogMFxuICB9XG4gIGlmICh0aGlzU3RhcnQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRoaXNTdGFydCA9IDBcbiAgfVxuICBpZiAodGhpc0VuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhpc0VuZCA9IHRoaXMubGVuZ3RoXG4gIH1cblxuICBpZiAoc3RhcnQgPCAwIHx8IGVuZCA+IHRhcmdldC5sZW5ndGggfHwgdGhpc1N0YXJ0IDwgMCB8fCB0aGlzRW5kID4gdGhpcy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignb3V0IG9mIHJhbmdlIGluZGV4JylcbiAgfVxuXG4gIGlmICh0aGlzU3RhcnQgPj0gdGhpc0VuZCAmJiBzdGFydCA+PSBlbmQpIHtcbiAgICByZXR1cm4gMFxuICB9XG4gIGlmICh0aGlzU3RhcnQgPj0gdGhpc0VuZCkge1xuICAgIHJldHVybiAtMVxuICB9XG4gIGlmIChzdGFydCA+PSBlbmQpIHtcbiAgICByZXR1cm4gMVxuICB9XG5cbiAgc3RhcnQgPj4+PSAwXG4gIGVuZCA+Pj49IDBcbiAgdGhpc1N0YXJ0ID4+Pj0gMFxuICB0aGlzRW5kID4+Pj0gMFxuXG4gIGlmICh0aGlzID09PSB0YXJnZXQpIHJldHVybiAwXG5cbiAgdmFyIHggPSB0aGlzRW5kIC0gdGhpc1N0YXJ0XG4gIHZhciB5ID0gZW5kIC0gc3RhcnRcbiAgdmFyIGxlbiA9IE1hdGgubWluKHgsIHkpXG5cbiAgdmFyIHRoaXNDb3B5ID0gdGhpcy5zbGljZSh0aGlzU3RhcnQsIHRoaXNFbmQpXG4gIHZhciB0YXJnZXRDb3B5ID0gdGFyZ2V0LnNsaWNlKHN0YXJ0LCBlbmQpXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSkge1xuICAgIGlmICh0aGlzQ29weVtpXSAhPT0gdGFyZ2V0Q29weVtpXSkge1xuICAgICAgeCA9IHRoaXNDb3B5W2ldXG4gICAgICB5ID0gdGFyZ2V0Q29weVtpXVxuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICBpZiAoeCA8IHkpIHJldHVybiAtMVxuICBpZiAoeSA8IHgpIHJldHVybiAxXG4gIHJldHVybiAwXG59XG5cbi8vIEZpbmRzIGVpdGhlciB0aGUgZmlyc3QgaW5kZXggb2YgYHZhbGAgaW4gYGJ1ZmZlcmAgYXQgb2Zmc2V0ID49IGBieXRlT2Zmc2V0YCxcbi8vIE9SIHRoZSBsYXN0IGluZGV4IG9mIGB2YWxgIGluIGBidWZmZXJgIGF0IG9mZnNldCA8PSBgYnl0ZU9mZnNldGAuXG4vL1xuLy8gQXJndW1lbnRzOlxuLy8gLSBidWZmZXIgLSBhIEJ1ZmZlciB0byBzZWFyY2hcbi8vIC0gdmFsIC0gYSBzdHJpbmcsIEJ1ZmZlciwgb3IgbnVtYmVyXG4vLyAtIGJ5dGVPZmZzZXQgLSBhbiBpbmRleCBpbnRvIGBidWZmZXJgOyB3aWxsIGJlIGNsYW1wZWQgdG8gYW4gaW50MzJcbi8vIC0gZW5jb2RpbmcgLSBhbiBvcHRpb25hbCBlbmNvZGluZywgcmVsZXZhbnQgaXMgdmFsIGlzIGEgc3RyaW5nXG4vLyAtIGRpciAtIHRydWUgZm9yIGluZGV4T2YsIGZhbHNlIGZvciBsYXN0SW5kZXhPZlxuZnVuY3Rpb24gYmlkaXJlY3Rpb25hbEluZGV4T2YgKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKSB7XG4gIC8vIEVtcHR5IGJ1ZmZlciBtZWFucyBubyBtYXRjaFxuICBpZiAoYnVmZmVyLmxlbmd0aCA9PT0gMCkgcmV0dXJuIC0xXG5cbiAgLy8gTm9ybWFsaXplIGJ5dGVPZmZzZXRcbiAgaWYgKHR5cGVvZiBieXRlT2Zmc2V0ID09PSAnc3RyaW5nJykge1xuICAgIGVuY29kaW5nID0gYnl0ZU9mZnNldFxuICAgIGJ5dGVPZmZzZXQgPSAwXG4gIH0gZWxzZSBpZiAoYnl0ZU9mZnNldCA+IDB4N2ZmZmZmZmYpIHtcbiAgICBieXRlT2Zmc2V0ID0gMHg3ZmZmZmZmZlxuICB9IGVsc2UgaWYgKGJ5dGVPZmZzZXQgPCAtMHg4MDAwMDAwMCkge1xuICAgIGJ5dGVPZmZzZXQgPSAtMHg4MDAwMDAwMFxuICB9XG4gIGJ5dGVPZmZzZXQgPSArYnl0ZU9mZnNldCAgLy8gQ29lcmNlIHRvIE51bWJlci5cbiAgaWYgKGlzTmFOKGJ5dGVPZmZzZXQpKSB7XG4gICAgLy8gYnl0ZU9mZnNldDogaXQgaXQncyB1bmRlZmluZWQsIG51bGwsIE5hTiwgXCJmb29cIiwgZXRjLCBzZWFyY2ggd2hvbGUgYnVmZmVyXG4gICAgYnl0ZU9mZnNldCA9IGRpciA/IDAgOiAoYnVmZmVyLmxlbmd0aCAtIDEpXG4gIH1cblxuICAvLyBOb3JtYWxpemUgYnl0ZU9mZnNldDogbmVnYXRpdmUgb2Zmc2V0cyBzdGFydCBmcm9tIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlclxuICBpZiAoYnl0ZU9mZnNldCA8IDApIGJ5dGVPZmZzZXQgPSBidWZmZXIubGVuZ3RoICsgYnl0ZU9mZnNldFxuICBpZiAoYnl0ZU9mZnNldCA+PSBidWZmZXIubGVuZ3RoKSB7XG4gICAgaWYgKGRpcikgcmV0dXJuIC0xXG4gICAgZWxzZSBieXRlT2Zmc2V0ID0gYnVmZmVyLmxlbmd0aCAtIDFcbiAgfSBlbHNlIGlmIChieXRlT2Zmc2V0IDwgMCkge1xuICAgIGlmIChkaXIpIGJ5dGVPZmZzZXQgPSAwXG4gICAgZWxzZSByZXR1cm4gLTFcbiAgfVxuXG4gIC8vIE5vcm1hbGl6ZSB2YWxcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgdmFsID0gQnVmZmVyLmZyb20odmFsLCBlbmNvZGluZylcbiAgfVxuXG4gIC8vIEZpbmFsbHksIHNlYXJjaCBlaXRoZXIgaW5kZXhPZiAoaWYgZGlyIGlzIHRydWUpIG9yIGxhc3RJbmRleE9mXG4gIGlmIChCdWZmZXIuaXNCdWZmZXIodmFsKSkge1xuICAgIC8vIFNwZWNpYWwgY2FzZTogbG9va2luZyBmb3IgZW1wdHkgc3RyaW5nL2J1ZmZlciBhbHdheXMgZmFpbHNcbiAgICBpZiAodmFsLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIC0xXG4gICAgfVxuICAgIHJldHVybiBhcnJheUluZGV4T2YoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpXG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICB2YWwgPSB2YWwgJiAweEZGIC8vIFNlYXJjaCBmb3IgYSBieXRlIHZhbHVlIFswLTI1NV1cbiAgICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgJiZcbiAgICAgICAgdHlwZW9mIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGlmIChkaXIpIHtcbiAgICAgICAgcmV0dXJuIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbChidWZmZXIsIHZhbCwgYnl0ZU9mZnNldClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBVaW50OEFycmF5LnByb3RvdHlwZS5sYXN0SW5kZXhPZi5jYWxsKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0KVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYXJyYXlJbmRleE9mKGJ1ZmZlciwgWyB2YWwgXSwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcilcbiAgfVxuXG4gIHRocm93IG5ldyBUeXBlRXJyb3IoJ3ZhbCBtdXN0IGJlIHN0cmluZywgbnVtYmVyIG9yIEJ1ZmZlcicpXG59XG5cbmZ1bmN0aW9uIGFycmF5SW5kZXhPZiAoYXJyLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpIHtcbiAgdmFyIGluZGV4U2l6ZSA9IDFcbiAgdmFyIGFyckxlbmd0aCA9IGFyci5sZW5ndGhcbiAgdmFyIHZhbExlbmd0aCA9IHZhbC5sZW5ndGhcblxuICBpZiAoZW5jb2RpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgIGVuY29kaW5nID0gU3RyaW5nKGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpXG4gICAgaWYgKGVuY29kaW5nID09PSAndWNzMicgfHwgZW5jb2RpbmcgPT09ICd1Y3MtMicgfHxcbiAgICAgICAgZW5jb2RpbmcgPT09ICd1dGYxNmxlJyB8fCBlbmNvZGluZyA9PT0gJ3V0Zi0xNmxlJykge1xuICAgICAgaWYgKGFyci5sZW5ndGggPCAyIHx8IHZhbC5sZW5ndGggPCAyKSB7XG4gICAgICAgIHJldHVybiAtMVxuICAgICAgfVxuICAgICAgaW5kZXhTaXplID0gMlxuICAgICAgYXJyTGVuZ3RoIC89IDJcbiAgICAgIHZhbExlbmd0aCAvPSAyXG4gICAgICBieXRlT2Zmc2V0IC89IDJcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiByZWFkIChidWYsIGkpIHtcbiAgICBpZiAoaW5kZXhTaXplID09PSAxKSB7XG4gICAgICByZXR1cm4gYnVmW2ldXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBidWYucmVhZFVJbnQxNkJFKGkgKiBpbmRleFNpemUpXG4gICAgfVxuICB9XG5cbiAgdmFyIGlcbiAgaWYgKGRpcikge1xuICAgIHZhciBmb3VuZEluZGV4ID0gLTFcbiAgICBmb3IgKGkgPSBieXRlT2Zmc2V0OyBpIDwgYXJyTGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChyZWFkKGFyciwgaSkgPT09IHJlYWQodmFsLCBmb3VuZEluZGV4ID09PSAtMSA/IDAgOiBpIC0gZm91bmRJbmRleCkpIHtcbiAgICAgICAgaWYgKGZvdW5kSW5kZXggPT09IC0xKSBmb3VuZEluZGV4ID0gaVxuICAgICAgICBpZiAoaSAtIGZvdW5kSW5kZXggKyAxID09PSB2YWxMZW5ndGgpIHJldHVybiBmb3VuZEluZGV4ICogaW5kZXhTaXplXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoZm91bmRJbmRleCAhPT0gLTEpIGkgLT0gaSAtIGZvdW5kSW5kZXhcbiAgICAgICAgZm91bmRJbmRleCA9IC0xXG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChieXRlT2Zmc2V0ICsgdmFsTGVuZ3RoID4gYXJyTGVuZ3RoKSBieXRlT2Zmc2V0ID0gYXJyTGVuZ3RoIC0gdmFsTGVuZ3RoXG4gICAgZm9yIChpID0gYnl0ZU9mZnNldDsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciBmb3VuZCA9IHRydWVcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdmFsTGVuZ3RoOyBqKyspIHtcbiAgICAgICAgaWYgKHJlYWQoYXJyLCBpICsgaikgIT09IHJlYWQodmFsLCBqKSkge1xuICAgICAgICAgIGZvdW5kID0gZmFsc2VcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZm91bmQpIHJldHVybiBpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIC0xXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuaW5jbHVkZXMgPSBmdW5jdGlvbiBpbmNsdWRlcyAodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykge1xuICByZXR1cm4gdGhpcy5pbmRleE9mKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpICE9PSAtMVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmluZGV4T2YgPSBmdW5jdGlvbiBpbmRleE9mICh2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7XG4gIHJldHVybiBiaWRpcmVjdGlvbmFsSW5kZXhPZih0aGlzLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCB0cnVlKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmxhc3RJbmRleE9mID0gZnVuY3Rpb24gbGFzdEluZGV4T2YgKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIGJpZGlyZWN0aW9uYWxJbmRleE9mKHRoaXMsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGZhbHNlKVxufVxuXG5mdW5jdGlvbiBoZXhXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIG9mZnNldCA9IE51bWJlcihvZmZzZXQpIHx8IDBcbiAgdmFyIHJlbWFpbmluZyA9IGJ1Zi5sZW5ndGggLSBvZmZzZXRcbiAgaWYgKCFsZW5ndGgpIHtcbiAgICBsZW5ndGggPSByZW1haW5pbmdcbiAgfSBlbHNlIHtcbiAgICBsZW5ndGggPSBOdW1iZXIobGVuZ3RoKVxuICAgIGlmIChsZW5ndGggPiByZW1haW5pbmcpIHtcbiAgICAgIGxlbmd0aCA9IHJlbWFpbmluZ1xuICAgIH1cbiAgfVxuXG4gIC8vIG11c3QgYmUgYW4gZXZlbiBudW1iZXIgb2YgZGlnaXRzXG4gIHZhciBzdHJMZW4gPSBzdHJpbmcubGVuZ3RoXG4gIGlmIChzdHJMZW4gJSAyICE9PSAwKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIGhleCBzdHJpbmcnKVxuXG4gIGlmIChsZW5ndGggPiBzdHJMZW4gLyAyKSB7XG4gICAgbGVuZ3RoID0gc3RyTGVuIC8gMlxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICB2YXIgcGFyc2VkID0gcGFyc2VJbnQoc3RyaW5nLnN1YnN0cihpICogMiwgMiksIDE2KVxuICAgIGlmIChpc05hTihwYXJzZWQpKSByZXR1cm4gaVxuICAgIGJ1ZltvZmZzZXQgKyBpXSA9IHBhcnNlZFxuICB9XG4gIHJldHVybiBpXG59XG5cbmZ1bmN0aW9uIHV0ZjhXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKHV0ZjhUb0J5dGVzKHN0cmluZywgYnVmLmxlbmd0aCAtIG9mZnNldCksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIGFzY2lpV3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcihhc2NpaVRvQnl0ZXMoc3RyaW5nKSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gbGF0aW4xV3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYXNjaWlXcml0ZShidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIGJhc2U2NFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIoYmFzZTY0VG9CeXRlcyhzdHJpbmcpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiB1Y3MyV3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcih1dGYxNmxlVG9CeXRlcyhzdHJpbmcsIGJ1Zi5sZW5ndGggLSBvZmZzZXQpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gd3JpdGUgKHN0cmluZywgb2Zmc2V0LCBsZW5ndGgsIGVuY29kaW5nKSB7XG4gIC8vIEJ1ZmZlciN3cml0ZShzdHJpbmcpXG4gIGlmIChvZmZzZXQgPT09IHVuZGVmaW5lZCkge1xuICAgIGVuY29kaW5nID0gJ3V0ZjgnXG4gICAgbGVuZ3RoID0gdGhpcy5sZW5ndGhcbiAgICBvZmZzZXQgPSAwXG4gIC8vIEJ1ZmZlciN3cml0ZShzdHJpbmcsIGVuY29kaW5nKVxuICB9IGVsc2UgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkICYmIHR5cGVvZiBvZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgZW5jb2RpbmcgPSBvZmZzZXRcbiAgICBsZW5ndGggPSB0aGlzLmxlbmd0aFxuICAgIG9mZnNldCA9IDBcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZywgb2Zmc2V0WywgbGVuZ3RoXVssIGVuY29kaW5nXSlcbiAgfSBlbHNlIGlmIChpc0Zpbml0ZShvZmZzZXQpKSB7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICAgIGlmIChpc0Zpbml0ZShsZW5ndGgpKSB7XG4gICAgICBsZW5ndGggPSBsZW5ndGggfCAwXG4gICAgICBpZiAoZW5jb2RpbmcgPT09IHVuZGVmaW5lZCkgZW5jb2RpbmcgPSAndXRmOCdcbiAgICB9IGVsc2Uge1xuICAgICAgZW5jb2RpbmcgPSBsZW5ndGhcbiAgICAgIGxlbmd0aCA9IHVuZGVmaW5lZFxuICAgIH1cbiAgLy8gbGVnYWN5IHdyaXRlKHN0cmluZywgZW5jb2RpbmcsIG9mZnNldCwgbGVuZ3RoKSAtIHJlbW92ZSBpbiB2MC4xM1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdCdWZmZXIud3JpdGUoc3RyaW5nLCBlbmNvZGluZywgb2Zmc2V0WywgbGVuZ3RoXSkgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCdcbiAgICApXG4gIH1cblxuICB2YXIgcmVtYWluaW5nID0gdGhpcy5sZW5ndGggLSBvZmZzZXRcbiAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkIHx8IGxlbmd0aCA+IHJlbWFpbmluZykgbGVuZ3RoID0gcmVtYWluaW5nXG5cbiAgaWYgKChzdHJpbmcubGVuZ3RoID4gMCAmJiAobGVuZ3RoIDwgMCB8fCBvZmZzZXQgPCAwKSkgfHwgb2Zmc2V0ID4gdGhpcy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQXR0ZW1wdCB0byB3cml0ZSBvdXRzaWRlIGJ1ZmZlciBib3VuZHMnKVxuICB9XG5cbiAgaWYgKCFlbmNvZGluZykgZW5jb2RpbmcgPSAndXRmOCdcblxuICB2YXIgbG93ZXJlZENhc2UgPSBmYWxzZVxuICBmb3IgKDs7KSB7XG4gICAgc3dpdGNoIChlbmNvZGluZykge1xuICAgICAgY2FzZSAnaGV4JzpcbiAgICAgICAgcmV0dXJuIGhleFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgICByZXR1cm4gdXRmOFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgICAgcmV0dXJuIGFzY2lpV3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAnbGF0aW4xJzpcbiAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAgIHJldHVybiBsYXRpbjFXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICAvLyBXYXJuaW5nOiBtYXhMZW5ndGggbm90IHRha2VuIGludG8gYWNjb3VudCBpbiBiYXNlNjRXcml0ZVxuICAgICAgICByZXR1cm4gYmFzZTY0V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAndWNzMic6XG4gICAgICBjYXNlICd1Y3MtMic6XG4gICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgICAgcmV0dXJuIHVjczJXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAobG93ZXJlZENhc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgICAgICAgZW5jb2RpbmcgPSAoJycgKyBlbmNvZGluZykudG9Mb3dlckNhc2UoKVxuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWVcbiAgICB9XG4gIH1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiB0b0pTT04gKCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICdCdWZmZXInLFxuICAgIGRhdGE6IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuX2FyciB8fCB0aGlzLCAwKVxuICB9XG59XG5cbmZ1bmN0aW9uIGJhc2U2NFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgaWYgKHN0YXJ0ID09PSAwICYmIGVuZCA9PT0gYnVmLmxlbmd0aCkge1xuICAgIHJldHVybiBiYXNlNjQuZnJvbUJ5dGVBcnJheShidWYpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGJhc2U2NC5mcm9tQnl0ZUFycmF5KGJ1Zi5zbGljZShzdGFydCwgZW5kKSlcbiAgfVxufVxuXG5mdW5jdGlvbiB1dGY4U2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpXG4gIHZhciByZXMgPSBbXVxuXG4gIHZhciBpID0gc3RhcnRcbiAgd2hpbGUgKGkgPCBlbmQpIHtcbiAgICB2YXIgZmlyc3RCeXRlID0gYnVmW2ldXG4gICAgdmFyIGNvZGVQb2ludCA9IG51bGxcbiAgICB2YXIgYnl0ZXNQZXJTZXF1ZW5jZSA9IChmaXJzdEJ5dGUgPiAweEVGKSA/IDRcbiAgICAgIDogKGZpcnN0Qnl0ZSA+IDB4REYpID8gM1xuICAgICAgOiAoZmlyc3RCeXRlID4gMHhCRikgPyAyXG4gICAgICA6IDFcblxuICAgIGlmIChpICsgYnl0ZXNQZXJTZXF1ZW5jZSA8PSBlbmQpIHtcbiAgICAgIHZhciBzZWNvbmRCeXRlLCB0aGlyZEJ5dGUsIGZvdXJ0aEJ5dGUsIHRlbXBDb2RlUG9pbnRcblxuICAgICAgc3dpdGNoIChieXRlc1BlclNlcXVlbmNlKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBpZiAoZmlyc3RCeXRlIDwgMHg4MCkge1xuICAgICAgICAgICAgY29kZVBvaW50ID0gZmlyc3RCeXRlXG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXVxuICAgICAgICAgIGlmICgoc2Vjb25kQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4MUYpIDw8IDB4NiB8IChzZWNvbmRCeXRlICYgMHgzRilcbiAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gMHg3Rikge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXVxuICAgICAgICAgIHRoaXJkQnl0ZSA9IGJ1ZltpICsgMl1cbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAodGhpcmRCeXRlICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICAgIHRlbXBDb2RlUG9pbnQgPSAoZmlyc3RCeXRlICYgMHhGKSA8PCAweEMgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpIDw8IDB4NiB8ICh0aGlyZEJ5dGUgJiAweDNGKVxuICAgICAgICAgICAgaWYgKHRlbXBDb2RlUG9pbnQgPiAweDdGRiAmJiAodGVtcENvZGVQb2ludCA8IDB4RDgwMCB8fCB0ZW1wQ29kZVBvaW50ID4gMHhERkZGKSkge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgNDpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXVxuICAgICAgICAgIHRoaXJkQnl0ZSA9IGJ1ZltpICsgMl1cbiAgICAgICAgICBmb3VydGhCeXRlID0gYnVmW2kgKyAzXVxuICAgICAgICAgIGlmICgoc2Vjb25kQnl0ZSAmIDB4QzApID09PSAweDgwICYmICh0aGlyZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAoZm91cnRoQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4RikgPDwgMHgxMiB8IChzZWNvbmRCeXRlICYgMHgzRikgPDwgMHhDIHwgKHRoaXJkQnl0ZSAmIDB4M0YpIDw8IDB4NiB8IChmb3VydGhCeXRlICYgMHgzRilcbiAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gMHhGRkZGICYmIHRlbXBDb2RlUG9pbnQgPCAweDExMDAwMCkge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb2RlUG9pbnQgPT09IG51bGwpIHtcbiAgICAgIC8vIHdlIGRpZCBub3QgZ2VuZXJhdGUgYSB2YWxpZCBjb2RlUG9pbnQgc28gaW5zZXJ0IGFcbiAgICAgIC8vIHJlcGxhY2VtZW50IGNoYXIgKFUrRkZGRCkgYW5kIGFkdmFuY2Ugb25seSAxIGJ5dGVcbiAgICAgIGNvZGVQb2ludCA9IDB4RkZGRFxuICAgICAgYnl0ZXNQZXJTZXF1ZW5jZSA9IDFcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA+IDB4RkZGRikge1xuICAgICAgLy8gZW5jb2RlIHRvIHV0ZjE2IChzdXJyb2dhdGUgcGFpciBkYW5jZSlcbiAgICAgIGNvZGVQb2ludCAtPSAweDEwMDAwXG4gICAgICByZXMucHVzaChjb2RlUG9pbnQgPj4+IDEwICYgMHgzRkYgfCAweEQ4MDApXG4gICAgICBjb2RlUG9pbnQgPSAweERDMDAgfCBjb2RlUG9pbnQgJiAweDNGRlxuICAgIH1cblxuICAgIHJlcy5wdXNoKGNvZGVQb2ludClcbiAgICBpICs9IGJ5dGVzUGVyU2VxdWVuY2VcbiAgfVxuXG4gIHJldHVybiBkZWNvZGVDb2RlUG9pbnRzQXJyYXkocmVzKVxufVxuXG4vLyBCYXNlZCBvbiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8yMjc0NzI3Mi82ODA3NDIsIHRoZSBicm93c2VyIHdpdGhcbi8vIHRoZSBsb3dlc3QgbGltaXQgaXMgQ2hyb21lLCB3aXRoIDB4MTAwMDAgYXJncy5cbi8vIFdlIGdvIDEgbWFnbml0dWRlIGxlc3MsIGZvciBzYWZldHlcbnZhciBNQVhfQVJHVU1FTlRTX0xFTkdUSCA9IDB4MTAwMFxuXG5mdW5jdGlvbiBkZWNvZGVDb2RlUG9pbnRzQXJyYXkgKGNvZGVQb2ludHMpIHtcbiAgdmFyIGxlbiA9IGNvZGVQb2ludHMubGVuZ3RoXG4gIGlmIChsZW4gPD0gTUFYX0FSR1VNRU5UU19MRU5HVEgpIHtcbiAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsIGNvZGVQb2ludHMpIC8vIGF2b2lkIGV4dHJhIHNsaWNlKClcbiAgfVxuXG4gIC8vIERlY29kZSBpbiBjaHVua3MgdG8gYXZvaWQgXCJjYWxsIHN0YWNrIHNpemUgZXhjZWVkZWRcIi5cbiAgdmFyIHJlcyA9ICcnXG4gIHZhciBpID0gMFxuICB3aGlsZSAoaSA8IGxlbikge1xuICAgIHJlcyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFxuICAgICAgU3RyaW5nLFxuICAgICAgY29kZVBvaW50cy5zbGljZShpLCBpICs9IE1BWF9BUkdVTUVOVFNfTEVOR1RIKVxuICAgIClcbiAgfVxuICByZXR1cm4gcmVzXG59XG5cbmZ1bmN0aW9uIGFzY2lpU2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgcmV0ID0gJydcbiAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKVxuXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgcmV0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnVmW2ldICYgMHg3RilcbiAgfVxuICByZXR1cm4gcmV0XG59XG5cbmZ1bmN0aW9uIGxhdGluMVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIHJldCA9ICcnXG4gIGVuZCA9IE1hdGgubWluKGJ1Zi5sZW5ndGgsIGVuZClcblxuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgIHJldCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpXSlcbiAgfVxuICByZXR1cm4gcmV0XG59XG5cbmZ1bmN0aW9uIGhleFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGxlbiA9IGJ1Zi5sZW5ndGhcblxuICBpZiAoIXN0YXJ0IHx8IHN0YXJ0IDwgMCkgc3RhcnQgPSAwXG4gIGlmICghZW5kIHx8IGVuZCA8IDAgfHwgZW5kID4gbGVuKSBlbmQgPSBsZW5cblxuICB2YXIgb3V0ID0gJydcbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICBvdXQgKz0gdG9IZXgoYnVmW2ldKVxuICB9XG4gIHJldHVybiBvdXRcbn1cblxuZnVuY3Rpb24gdXRmMTZsZVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGJ5dGVzID0gYnVmLnNsaWNlKHN0YXJ0LCBlbmQpXG4gIHZhciByZXMgPSAnJ1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgcmVzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnl0ZXNbaV0gKyBieXRlc1tpICsgMV0gKiAyNTYpXG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnNsaWNlID0gZnVuY3Rpb24gc2xpY2UgKHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoXG4gIHN0YXJ0ID0gfn5zdGFydFxuICBlbmQgPSBlbmQgPT09IHVuZGVmaW5lZCA/IGxlbiA6IH5+ZW5kXG5cbiAgaWYgKHN0YXJ0IDwgMCkge1xuICAgIHN0YXJ0ICs9IGxlblxuICAgIGlmIChzdGFydCA8IDApIHN0YXJ0ID0gMFxuICB9IGVsc2UgaWYgKHN0YXJ0ID4gbGVuKSB7XG4gICAgc3RhcnQgPSBsZW5cbiAgfVxuXG4gIGlmIChlbmQgPCAwKSB7XG4gICAgZW5kICs9IGxlblxuICAgIGlmIChlbmQgPCAwKSBlbmQgPSAwXG4gIH0gZWxzZSBpZiAoZW5kID4gbGVuKSB7XG4gICAgZW5kID0gbGVuXG4gIH1cblxuICBpZiAoZW5kIDwgc3RhcnQpIGVuZCA9IHN0YXJ0XG5cbiAgdmFyIG5ld0J1ZlxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICBuZXdCdWYgPSB0aGlzLnN1YmFycmF5KHN0YXJ0LCBlbmQpXG4gICAgbmV3QnVmLl9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGVcbiAgfSBlbHNlIHtcbiAgICB2YXIgc2xpY2VMZW4gPSBlbmQgLSBzdGFydFxuICAgIG5ld0J1ZiA9IG5ldyBCdWZmZXIoc2xpY2VMZW4sIHVuZGVmaW5lZClcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNsaWNlTGVuOyArK2kpIHtcbiAgICAgIG5ld0J1ZltpXSA9IHRoaXNbaSArIHN0YXJ0XVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXdCdWZcbn1cblxuLypcbiAqIE5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgYnVmZmVyIGlzbid0IHRyeWluZyB0byB3cml0ZSBvdXQgb2YgYm91bmRzLlxuICovXG5mdW5jdGlvbiBjaGVja09mZnNldCAob2Zmc2V0LCBleHQsIGxlbmd0aCkge1xuICBpZiAoKG9mZnNldCAlIDEpICE9PSAwIHx8IG9mZnNldCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdvZmZzZXQgaXMgbm90IHVpbnQnKVxuICBpZiAob2Zmc2V0ICsgZXh0ID4gbGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVHJ5aW5nIHRvIGFjY2VzcyBiZXlvbmQgYnVmZmVyIGxlbmd0aCcpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnRMRSA9IGZ1bmN0aW9uIHJlYWRVSW50TEUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcblxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXRdXG4gIHZhciBtdWwgPSAxXG4gIHZhciBpID0gMFxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIGldICogbXVsXG4gIH1cblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnRCRSA9IGZ1bmN0aW9uIHJlYWRVSW50QkUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG4gIH1cblxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXQgKyAtLWJ5dGVMZW5ndGhdXG4gIHZhciBtdWwgPSAxXG4gIHdoaWxlIChieXRlTGVuZ3RoID4gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIC0tYnl0ZUxlbmd0aF0gKiBtdWxcbiAgfVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDggPSBmdW5jdGlvbiByZWFkVUludDggKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAxLCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIHRoaXNbb2Zmc2V0XVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MTZMRSA9IGZ1bmN0aW9uIHJlYWRVSW50MTZMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gdGhpc1tvZmZzZXRdIHwgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDE2QkUgPSBmdW5jdGlvbiByZWFkVUludDE2QkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuICh0aGlzW29mZnNldF0gPDwgOCkgfCB0aGlzW29mZnNldCArIDFdXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQzMkxFID0gZnVuY3Rpb24gcmVhZFVJbnQzMkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICgodGhpc1tvZmZzZXRdKSB8XG4gICAgICAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KSB8XG4gICAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCAxNikpICtcbiAgICAgICh0aGlzW29mZnNldCArIDNdICogMHgxMDAwMDAwKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MzJCRSA9IGZ1bmN0aW9uIHJlYWRVSW50MzJCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdICogMHgxMDAwMDAwKSArXG4gICAgKCh0aGlzW29mZnNldCArIDFdIDw8IDE2KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgOCkgfFxuICAgIHRoaXNbb2Zmc2V0ICsgM10pXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludExFID0gZnVuY3Rpb24gcmVhZEludExFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG5cbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0XVxuICB2YXIgbXVsID0gMVxuICB2YXIgaSA9IDBcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyBpXSAqIG11bFxuICB9XG4gIG11bCAqPSAweDgwXG5cbiAgaWYgKHZhbCA+PSBtdWwpIHZhbCAtPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aClcblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludEJFID0gZnVuY3Rpb24gcmVhZEludEJFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG5cbiAgdmFyIGkgPSBieXRlTGVuZ3RoXG4gIHZhciBtdWwgPSAxXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldCArIC0taV1cbiAgd2hpbGUgKGkgPiAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgLS1pXSAqIG11bFxuICB9XG4gIG11bCAqPSAweDgwXG5cbiAgaWYgKHZhbCA+PSBtdWwpIHZhbCAtPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aClcblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDggPSBmdW5jdGlvbiByZWFkSW50OCAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDEsIHRoaXMubGVuZ3RoKVxuICBpZiAoISh0aGlzW29mZnNldF0gJiAweDgwKSkgcmV0dXJuICh0aGlzW29mZnNldF0pXG4gIHJldHVybiAoKDB4ZmYgLSB0aGlzW29mZnNldF0gKyAxKSAqIC0xKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQxNkxFID0gZnVuY3Rpb24gcmVhZEludDE2TEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0XSB8ICh0aGlzW29mZnNldCArIDFdIDw8IDgpXG4gIHJldHVybiAodmFsICYgMHg4MDAwKSA/IHZhbCB8IDB4RkZGRjAwMDAgOiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MTZCRSA9IGZ1bmN0aW9uIHJlYWRJbnQxNkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldCArIDFdIHwgKHRoaXNbb2Zmc2V0XSA8PCA4KVxuICByZXR1cm4gKHZhbCAmIDB4ODAwMCkgPyB2YWwgfCAweEZGRkYwMDAwIDogdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDMyTEUgPSBmdW5jdGlvbiByZWFkSW50MzJMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdKSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOCkgfFxuICAgICh0aGlzW29mZnNldCArIDJdIDw8IDE2KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgM10gPDwgMjQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDMyQkUgPSBmdW5jdGlvbiByZWFkSW50MzJCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdIDw8IDI0KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgMTYpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCA4KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgM10pXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEZsb2F0TEUgPSBmdW5jdGlvbiByZWFkRmxvYXRMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgdHJ1ZSwgMjMsIDQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEZsb2F0QkUgPSBmdW5jdGlvbiByZWFkRmxvYXRCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgZmFsc2UsIDIzLCA0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWREb3VibGVMRSA9IGZ1bmN0aW9uIHJlYWREb3VibGVMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDgsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgdHJ1ZSwgNTIsIDgpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZERvdWJsZUJFID0gZnVuY3Rpb24gcmVhZERvdWJsZUJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgOCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCBmYWxzZSwgNTIsIDgpXG59XG5cbmZ1bmN0aW9uIGNoZWNrSW50IChidWYsIHZhbHVlLCBvZmZzZXQsIGV4dCwgbWF4LCBtaW4pIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYnVmKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJidWZmZXJcIiBhcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIGluc3RhbmNlJylcbiAgaWYgKHZhbHVlID4gbWF4IHx8IHZhbHVlIDwgbWluKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXCJ2YWx1ZVwiIGFyZ3VtZW50IGlzIG91dCBvZiBib3VuZHMnKVxuICBpZiAob2Zmc2V0ICsgZXh0ID4gYnVmLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0luZGV4IG91dCBvZiByYW5nZScpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50TEUgPSBmdW5jdGlvbiB3cml0ZVVJbnRMRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBtYXhCeXRlcyA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKSAtIDFcbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBtYXhCeXRlcywgMClcbiAgfVxuXG4gIHZhciBtdWwgPSAxXG4gIHZhciBpID0gMFxuICB0aGlzW29mZnNldF0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB0aGlzW29mZnNldCArIGldID0gKHZhbHVlIC8gbXVsKSAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50QkUgPSBmdW5jdGlvbiB3cml0ZVVJbnRCRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBtYXhCeXRlcyA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKSAtIDFcbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBtYXhCeXRlcywgMClcbiAgfVxuXG4gIHZhciBpID0gYnl0ZUxlbmd0aCAtIDFcbiAgdmFyIG11bCA9IDFcbiAgdGhpc1tvZmZzZXQgKyBpXSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoLS1pID49IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB0aGlzW29mZnNldCArIGldID0gKHZhbHVlIC8gbXVsKSAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50OCA9IGZ1bmN0aW9uIHdyaXRlVUludDggKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMSwgMHhmZiwgMClcbiAgaWYgKCFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkgdmFsdWUgPSBNYXRoLmZsb29yKHZhbHVlKVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICByZXR1cm4gb2Zmc2V0ICsgMVxufVxuXG5mdW5jdGlvbiBvYmplY3RXcml0ZVVJbnQxNiAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4pIHtcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmZmYgKyB2YWx1ZSArIDFcbiAgZm9yICh2YXIgaSA9IDAsIGogPSBNYXRoLm1pbihidWYubGVuZ3RoIC0gb2Zmc2V0LCAyKTsgaSA8IGo7ICsraSkge1xuICAgIGJ1ZltvZmZzZXQgKyBpXSA9ICh2YWx1ZSAmICgweGZmIDw8ICg4ICogKGxpdHRsZUVuZGlhbiA/IGkgOiAxIC0gaSkpKSkgPj4+XG4gICAgICAobGl0dGxlRW5kaWFuID8gaSA6IDEgLSBpKSAqIDhcbiAgfVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDE2TEUgPSBmdW5jdGlvbiB3cml0ZVVJbnQxNkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4ZmZmZiwgMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDE2KHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQxNkJFID0gZnVuY3Rpb24gd3JpdGVVSW50MTZCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweGZmZmYsIDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5mdW5jdGlvbiBvYmplY3RXcml0ZVVJbnQzMiAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4pIHtcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmZmZmZmZmICsgdmFsdWUgKyAxXG4gIGZvciAodmFyIGkgPSAwLCBqID0gTWF0aC5taW4oYnVmLmxlbmd0aCAtIG9mZnNldCwgNCk7IGkgPCBqOyArK2kpIHtcbiAgICBidWZbb2Zmc2V0ICsgaV0gPSAodmFsdWUgPj4+IChsaXR0bGVFbmRpYW4gPyBpIDogMyAtIGkpICogOCkgJiAweGZmXG4gIH1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQzMkxFID0gZnVuY3Rpb24gd3JpdGVVSW50MzJMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweGZmZmZmZmZmLCAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlID4+PiAyNClcbiAgICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiAxNilcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MzIodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDMyQkUgPSBmdW5jdGlvbiB3cml0ZVVJbnQzMkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4ZmZmZmZmZmYsIDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gMjQpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gICAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQzMih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50TEUgPSBmdW5jdGlvbiB3cml0ZUludExFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbGltaXQgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCAtIDEpXG5cbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBsaW1pdCAtIDEsIC1saW1pdClcbiAgfVxuXG4gIHZhciBpID0gMFxuICB2YXIgbXVsID0gMVxuICB2YXIgc3ViID0gMFxuICB0aGlzW29mZnNldF0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICBpZiAodmFsdWUgPCAwICYmIHN1YiA9PT0gMCAmJiB0aGlzW29mZnNldCArIGkgLSAxXSAhPT0gMCkge1xuICAgICAgc3ViID0gMVxuICAgIH1cbiAgICB0aGlzW29mZnNldCArIGldID0gKCh2YWx1ZSAvIG11bCkgPj4gMCkgLSBzdWIgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50QkUgPSBmdW5jdGlvbiB3cml0ZUludEJFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbGltaXQgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCAtIDEpXG5cbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBsaW1pdCAtIDEsIC1saW1pdClcbiAgfVxuXG4gIHZhciBpID0gYnl0ZUxlbmd0aCAtIDFcbiAgdmFyIG11bCA9IDFcbiAgdmFyIHN1YiA9IDBcbiAgdGhpc1tvZmZzZXQgKyBpXSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoLS1pID49IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICBpZiAodmFsdWUgPCAwICYmIHN1YiA9PT0gMCAmJiB0aGlzW29mZnNldCArIGkgKyAxXSAhPT0gMCkge1xuICAgICAgc3ViID0gMVxuICAgIH1cbiAgICB0aGlzW29mZnNldCArIGldID0gKCh2YWx1ZSAvIG11bCkgPj4gMCkgLSBzdWIgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50OCA9IGZ1bmN0aW9uIHdyaXRlSW50OCAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAxLCAweDdmLCAtMHg4MClcbiAgaWYgKCFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkgdmFsdWUgPSBNYXRoLmZsb29yKHZhbHVlKVxuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmYgKyB2YWx1ZSArIDFcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDFcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDE2TEUgPSBmdW5jdGlvbiB3cml0ZUludDE2TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHg3ZmZmLCAtMHg4MDAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MTYodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MTZCRSA9IGZ1bmN0aW9uIHdyaXRlSW50MTZCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweDdmZmYsIC0weDgwMDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MzJMRSA9IGZ1bmN0aW9uIHdyaXRlSW50MzJMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweDdmZmZmZmZmLCAtMHg4MDAwMDAwMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDE2KVxuICAgIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgPj4+IDI0KVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDMyQkUgPSBmdW5jdGlvbiB3cml0ZUludDMyQkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHg3ZmZmZmZmZiwgLTB4ODAwMDAwMDApXG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZmZmZmZmZiArIHZhbHVlICsgMVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDI0KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDE2KVxuICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MzIodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuZnVuY3Rpb24gY2hlY2tJRUVFNzU0IChidWYsIHZhbHVlLCBvZmZzZXQsIGV4dCwgbWF4LCBtaW4pIHtcbiAgaWYgKG9mZnNldCArIGV4dCA+IGJ1Zi5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbmRleCBvdXQgb2YgcmFuZ2UnKVxuICBpZiAob2Zmc2V0IDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0luZGV4IG91dCBvZiByYW5nZScpXG59XG5cbmZ1bmN0aW9uIHdyaXRlRmxvYXQgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY2hlY2tJRUVFNzU0KGJ1ZiwgdmFsdWUsIG9mZnNldCwgNCwgMy40MDI4MjM0NjYzODUyODg2ZSszOCwgLTMuNDAyODIzNDY2Mzg1Mjg4NmUrMzgpXG4gIH1cbiAgaWVlZTc1NC53cml0ZShidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgMjMsIDQpXG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVGbG9hdExFID0gZnVuY3Rpb24gd3JpdGVGbG9hdExFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVGbG9hdCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlLCBub0Fzc2VydClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUZsb2F0QkUgPSBmdW5jdGlvbiB3cml0ZUZsb2F0QkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZUZsb2F0KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlLCBub0Fzc2VydClcbn1cblxuZnVuY3Rpb24gd3JpdGVEb3VibGUgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY2hlY2tJRUVFNzU0KGJ1ZiwgdmFsdWUsIG9mZnNldCwgOCwgMS43OTc2OTMxMzQ4NjIzMTU3RSszMDgsIC0xLjc5NzY5MzEzNDg2MjMxNTdFKzMwOClcbiAgfVxuICBpZWVlNzU0LndyaXRlKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCA1MiwgOClcbiAgcmV0dXJuIG9mZnNldCArIDhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZURvdWJsZUxFID0gZnVuY3Rpb24gd3JpdGVEb3VibGVMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRG91YmxlKHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUsIG5vQXNzZXJ0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRG91YmxlQkUgPSBmdW5jdGlvbiB3cml0ZURvdWJsZUJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVEb3VibGUodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UsIG5vQXNzZXJ0KVxufVxuXG4vLyBjb3B5KHRhcmdldEJ1ZmZlciwgdGFyZ2V0U3RhcnQ9MCwgc291cmNlU3RhcnQ9MCwgc291cmNlRW5kPWJ1ZmZlci5sZW5ndGgpXG5CdWZmZXIucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiBjb3B5ICh0YXJnZXQsIHRhcmdldFN0YXJ0LCBzdGFydCwgZW5kKSB7XG4gIGlmICghc3RhcnQpIHN0YXJ0ID0gMFxuICBpZiAoIWVuZCAmJiBlbmQgIT09IDApIGVuZCA9IHRoaXMubGVuZ3RoXG4gIGlmICh0YXJnZXRTdGFydCA+PSB0YXJnZXQubGVuZ3RoKSB0YXJnZXRTdGFydCA9IHRhcmdldC5sZW5ndGhcbiAgaWYgKCF0YXJnZXRTdGFydCkgdGFyZ2V0U3RhcnQgPSAwXG4gIGlmIChlbmQgPiAwICYmIGVuZCA8IHN0YXJ0KSBlbmQgPSBzdGFydFxuXG4gIC8vIENvcHkgMCBieXRlczsgd2UncmUgZG9uZVxuICBpZiAoZW5kID09PSBzdGFydCkgcmV0dXJuIDBcbiAgaWYgKHRhcmdldC5sZW5ndGggPT09IDAgfHwgdGhpcy5sZW5ndGggPT09IDApIHJldHVybiAwXG5cbiAgLy8gRmF0YWwgZXJyb3IgY29uZGl0aW9uc1xuICBpZiAodGFyZ2V0U3RhcnQgPCAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3RhcmdldFN0YXJ0IG91dCBvZiBib3VuZHMnKVxuICB9XG4gIGlmIChzdGFydCA8IDAgfHwgc3RhcnQgPj0gdGhpcy5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdzb3VyY2VTdGFydCBvdXQgb2YgYm91bmRzJylcbiAgaWYgKGVuZCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdzb3VyY2VFbmQgb3V0IG9mIGJvdW5kcycpXG5cbiAgLy8gQXJlIHdlIG9vYj9cbiAgaWYgKGVuZCA+IHRoaXMubGVuZ3RoKSBlbmQgPSB0aGlzLmxlbmd0aFxuICBpZiAodGFyZ2V0Lmxlbmd0aCAtIHRhcmdldFN0YXJ0IDwgZW5kIC0gc3RhcnQpIHtcbiAgICBlbmQgPSB0YXJnZXQubGVuZ3RoIC0gdGFyZ2V0U3RhcnQgKyBzdGFydFxuICB9XG5cbiAgdmFyIGxlbiA9IGVuZCAtIHN0YXJ0XG4gIHZhciBpXG5cbiAgaWYgKHRoaXMgPT09IHRhcmdldCAmJiBzdGFydCA8IHRhcmdldFN0YXJ0ICYmIHRhcmdldFN0YXJ0IDwgZW5kKSB7XG4gICAgLy8gZGVzY2VuZGluZyBjb3B5IGZyb20gZW5kXG4gICAgZm9yIChpID0gbGVuIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgIHRhcmdldFtpICsgdGFyZ2V0U3RhcnRdID0gdGhpc1tpICsgc3RhcnRdXG4gICAgfVxuICB9IGVsc2UgaWYgKGxlbiA8IDEwMDAgfHwgIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgLy8gYXNjZW5kaW5nIGNvcHkgZnJvbSBzdGFydFxuICAgIGZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkge1xuICAgICAgdGFyZ2V0W2kgKyB0YXJnZXRTdGFydF0gPSB0aGlzW2kgKyBzdGFydF1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgVWludDhBcnJheS5wcm90b3R5cGUuc2V0LmNhbGwoXG4gICAgICB0YXJnZXQsXG4gICAgICB0aGlzLnN1YmFycmF5KHN0YXJ0LCBzdGFydCArIGxlbiksXG4gICAgICB0YXJnZXRTdGFydFxuICAgIClcbiAgfVxuXG4gIHJldHVybiBsZW5cbn1cblxuLy8gVXNhZ2U6XG4vLyAgICBidWZmZXIuZmlsbChudW1iZXJbLCBvZmZzZXRbLCBlbmRdXSlcbi8vICAgIGJ1ZmZlci5maWxsKGJ1ZmZlclssIG9mZnNldFssIGVuZF1dKVxuLy8gICAgYnVmZmVyLmZpbGwoc3RyaW5nWywgb2Zmc2V0WywgZW5kXV1bLCBlbmNvZGluZ10pXG5CdWZmZXIucHJvdG90eXBlLmZpbGwgPSBmdW5jdGlvbiBmaWxsICh2YWwsIHN0YXJ0LCBlbmQsIGVuY29kaW5nKSB7XG4gIC8vIEhhbmRsZSBzdHJpbmcgY2FzZXM6XG4gIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgIGlmICh0eXBlb2Ygc3RhcnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBlbmNvZGluZyA9IHN0YXJ0XG4gICAgICBzdGFydCA9IDBcbiAgICAgIGVuZCA9IHRoaXMubGVuZ3RoXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZW5kID09PSAnc3RyaW5nJykge1xuICAgICAgZW5jb2RpbmcgPSBlbmRcbiAgICAgIGVuZCA9IHRoaXMubGVuZ3RoXG4gICAgfVxuICAgIGlmICh2YWwubGVuZ3RoID09PSAxKSB7XG4gICAgICB2YXIgY29kZSA9IHZhbC5jaGFyQ29kZUF0KDApXG4gICAgICBpZiAoY29kZSA8IDI1Nikge1xuICAgICAgICB2YWwgPSBjb2RlXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChlbmNvZGluZyAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBlbmNvZGluZyAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2VuY29kaW5nIG11c3QgYmUgYSBzdHJpbmcnKVxuICAgIH1cbiAgICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJyAmJiAhQnVmZmVyLmlzRW5jb2RpbmcoZW5jb2RpbmcpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpXG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgdmFsID0gdmFsICYgMjU1XG4gIH1cblxuICAvLyBJbnZhbGlkIHJhbmdlcyBhcmUgbm90IHNldCB0byBhIGRlZmF1bHQsIHNvIGNhbiByYW5nZSBjaGVjayBlYXJseS5cbiAgaWYgKHN0YXJ0IDwgMCB8fCB0aGlzLmxlbmd0aCA8IHN0YXJ0IHx8IHRoaXMubGVuZ3RoIDwgZW5kKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ091dCBvZiByYW5nZSBpbmRleCcpXG4gIH1cblxuICBpZiAoZW5kIDw9IHN0YXJ0KSB7XG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHN0YXJ0ID0gc3RhcnQgPj4+IDBcbiAgZW5kID0gZW5kID09PSB1bmRlZmluZWQgPyB0aGlzLmxlbmd0aCA6IGVuZCA+Pj4gMFxuXG4gIGlmICghdmFsKSB2YWwgPSAwXG5cbiAgdmFyIGlcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgZm9yIChpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgICAgdGhpc1tpXSA9IHZhbFxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YXIgYnl0ZXMgPSBCdWZmZXIuaXNCdWZmZXIodmFsKVxuICAgICAgPyB2YWxcbiAgICAgIDogdXRmOFRvQnl0ZXMobmV3IEJ1ZmZlcih2YWwsIGVuY29kaW5nKS50b1N0cmluZygpKVxuICAgIHZhciBsZW4gPSBieXRlcy5sZW5ndGhcbiAgICBmb3IgKGkgPSAwOyBpIDwgZW5kIC0gc3RhcnQ7ICsraSkge1xuICAgICAgdGhpc1tpICsgc3RhcnRdID0gYnl0ZXNbaSAlIGxlbl1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGhpc1xufVxuXG4vLyBIRUxQRVIgRlVOQ1RJT05TXG4vLyA9PT09PT09PT09PT09PT09XG5cbnZhciBJTlZBTElEX0JBU0U2NF9SRSA9IC9bXitcXC8wLTlBLVphLXotX10vZ1xuXG5mdW5jdGlvbiBiYXNlNjRjbGVhbiAoc3RyKSB7XG4gIC8vIE5vZGUgc3RyaXBzIG91dCBpbnZhbGlkIGNoYXJhY3RlcnMgbGlrZSBcXG4gYW5kIFxcdCBmcm9tIHRoZSBzdHJpbmcsIGJhc2U2NC1qcyBkb2VzIG5vdFxuICBzdHIgPSBzdHJpbmd0cmltKHN0cikucmVwbGFjZShJTlZBTElEX0JBU0U2NF9SRSwgJycpXG4gIC8vIE5vZGUgY29udmVydHMgc3RyaW5ncyB3aXRoIGxlbmd0aCA8IDIgdG8gJydcbiAgaWYgKHN0ci5sZW5ndGggPCAyKSByZXR1cm4gJydcbiAgLy8gTm9kZSBhbGxvd3MgZm9yIG5vbi1wYWRkZWQgYmFzZTY0IHN0cmluZ3MgKG1pc3NpbmcgdHJhaWxpbmcgPT09KSwgYmFzZTY0LWpzIGRvZXMgbm90XG4gIHdoaWxlIChzdHIubGVuZ3RoICUgNCAhPT0gMCkge1xuICAgIHN0ciA9IHN0ciArICc9J1xuICB9XG4gIHJldHVybiBzdHJcbn1cblxuZnVuY3Rpb24gc3RyaW5ndHJpbSAoc3RyKSB7XG4gIGlmIChzdHIudHJpbSkgcmV0dXJuIHN0ci50cmltKClcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC9eXFxzK3xcXHMrJC9nLCAnJylcbn1cblxuZnVuY3Rpb24gdG9IZXggKG4pIHtcbiAgaWYgKG4gPCAxNikgcmV0dXJuICcwJyArIG4udG9TdHJpbmcoMTYpXG4gIHJldHVybiBuLnRvU3RyaW5nKDE2KVxufVxuXG5mdW5jdGlvbiB1dGY4VG9CeXRlcyAoc3RyaW5nLCB1bml0cykge1xuICB1bml0cyA9IHVuaXRzIHx8IEluZmluaXR5XG4gIHZhciBjb2RlUG9pbnRcbiAgdmFyIGxlbmd0aCA9IHN0cmluZy5sZW5ndGhcbiAgdmFyIGxlYWRTdXJyb2dhdGUgPSBudWxsXG4gIHZhciBieXRlcyA9IFtdXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIGNvZGVQb2ludCA9IHN0cmluZy5jaGFyQ29kZUF0KGkpXG5cbiAgICAvLyBpcyBzdXJyb2dhdGUgY29tcG9uZW50XG4gICAgaWYgKGNvZGVQb2ludCA+IDB4RDdGRiAmJiBjb2RlUG9pbnQgPCAweEUwMDApIHtcbiAgICAgIC8vIGxhc3QgY2hhciB3YXMgYSBsZWFkXG4gICAgICBpZiAoIWxlYWRTdXJyb2dhdGUpIHtcbiAgICAgICAgLy8gbm8gbGVhZCB5ZXRcbiAgICAgICAgaWYgKGNvZGVQb2ludCA+IDB4REJGRikge1xuICAgICAgICAgIC8vIHVuZXhwZWN0ZWQgdHJhaWxcbiAgICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9IGVsc2UgaWYgKGkgKyAxID09PSBsZW5ndGgpIHtcbiAgICAgICAgICAvLyB1bnBhaXJlZCBsZWFkXG4gICAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHZhbGlkIGxlYWRcbiAgICAgICAgbGVhZFN1cnJvZ2F0ZSA9IGNvZGVQb2ludFxuXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8vIDIgbGVhZHMgaW4gYSByb3dcbiAgICAgIGlmIChjb2RlUG9pbnQgPCAweERDMDApIHtcbiAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgICAgIGxlYWRTdXJyb2dhdGUgPSBjb2RlUG9pbnRcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLy8gdmFsaWQgc3Vycm9nYXRlIHBhaXJcbiAgICAgIGNvZGVQb2ludCA9IChsZWFkU3Vycm9nYXRlIC0gMHhEODAwIDw8IDEwIHwgY29kZVBvaW50IC0gMHhEQzAwKSArIDB4MTAwMDBcbiAgICB9IGVsc2UgaWYgKGxlYWRTdXJyb2dhdGUpIHtcbiAgICAgIC8vIHZhbGlkIGJtcCBjaGFyLCBidXQgbGFzdCBjaGFyIHdhcyBhIGxlYWRcbiAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgIH1cblxuICAgIGxlYWRTdXJyb2dhdGUgPSBudWxsXG5cbiAgICAvLyBlbmNvZGUgdXRmOFxuICAgIGlmIChjb2RlUG9pbnQgPCAweDgwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDEpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goY29kZVBvaW50KVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgMHg4MDApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gMikgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChcbiAgICAgICAgY29kZVBvaW50ID4+IDB4NiB8IDB4QzAsXG4gICAgICAgIGNvZGVQb2ludCAmIDB4M0YgfCAweDgwXG4gICAgICApXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDEwMDAwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDMpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goXG4gICAgICAgIGNvZGVQb2ludCA+PiAweEMgfCAweEUwLFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHg2ICYgMHgzRiB8IDB4ODAsXG4gICAgICAgIGNvZGVQb2ludCAmIDB4M0YgfCAweDgwXG4gICAgICApXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDExMDAwMCkge1xuICAgICAgaWYgKCh1bml0cyAtPSA0KSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHgxMiB8IDB4RjAsXG4gICAgICAgIGNvZGVQb2ludCA+PiAweEMgJiAweDNGIHwgMHg4MCxcbiAgICAgICAgY29kZVBvaW50ID4+IDB4NiAmIDB4M0YgfCAweDgwLFxuICAgICAgICBjb2RlUG9pbnQgJiAweDNGIHwgMHg4MFxuICAgICAgKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY29kZSBwb2ludCcpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJ5dGVzXG59XG5cbmZ1bmN0aW9uIGFzY2lpVG9CeXRlcyAoc3RyKSB7XG4gIHZhciBieXRlQXJyYXkgPSBbXVxuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7ICsraSkge1xuICAgIC8vIE5vZGUncyBjb2RlIHNlZW1zIHRvIGJlIGRvaW5nIHRoaXMgYW5kIG5vdCAmIDB4N0YuLlxuICAgIGJ5dGVBcnJheS5wdXNoKHN0ci5jaGFyQ29kZUF0KGkpICYgMHhGRilcbiAgfVxuICByZXR1cm4gYnl0ZUFycmF5XG59XG5cbmZ1bmN0aW9uIHV0ZjE2bGVUb0J5dGVzIChzdHIsIHVuaXRzKSB7XG4gIHZhciBjLCBoaSwgbG9cbiAgdmFyIGJ5dGVBcnJheSA9IFtdXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7XG4gICAgaWYgKCh1bml0cyAtPSAyKSA8IDApIGJyZWFrXG5cbiAgICBjID0gc3RyLmNoYXJDb2RlQXQoaSlcbiAgICBoaSA9IGMgPj4gOFxuICAgIGxvID0gYyAlIDI1NlxuICAgIGJ5dGVBcnJheS5wdXNoKGxvKVxuICAgIGJ5dGVBcnJheS5wdXNoKGhpKVxuICB9XG5cbiAgcmV0dXJuIGJ5dGVBcnJheVxufVxuXG5mdW5jdGlvbiBiYXNlNjRUb0J5dGVzIChzdHIpIHtcbiAgcmV0dXJuIGJhc2U2NC50b0J5dGVBcnJheShiYXNlNjRjbGVhbihzdHIpKVxufVxuXG5mdW5jdGlvbiBibGl0QnVmZmVyIChzcmMsIGRzdCwgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIGlmICgoaSArIG9mZnNldCA+PSBkc3QubGVuZ3RoKSB8fCAoaSA+PSBzcmMubGVuZ3RoKSkgYnJlYWtcbiAgICBkc3RbaSArIG9mZnNldF0gPSBzcmNbaV1cbiAgfVxuICByZXR1cm4gaVxufVxuXG5mdW5jdGlvbiBpc25hbiAodmFsKSB7XG4gIHJldHVybiB2YWwgIT09IHZhbCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNlbGYtY29tcGFyZVxufVxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvbm9kZS1saWJzLWJyb3dzZXIvbm9kZV9tb2R1bGVzL2J1ZmZlci9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gMjFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIGc7XG5cbi8vIFRoaXMgd29ya3MgaW4gbm9uLXN0cmljdCBtb2RlXG5nID0gKGZ1bmN0aW9uKCkge1xuXHRyZXR1cm4gdGhpcztcbn0pKCk7XG5cbnRyeSB7XG5cdC8vIFRoaXMgd29ya3MgaWYgZXZhbCBpcyBhbGxvd2VkIChzZWUgQ1NQKVxuXHRnID0gZyB8fCBGdW5jdGlvbihcInJldHVybiB0aGlzXCIpKCkgfHwgKDEsZXZhbCkoXCJ0aGlzXCIpO1xufSBjYXRjaChlKSB7XG5cdC8vIFRoaXMgd29ya3MgaWYgdGhlIHdpbmRvdyByZWZlcmVuY2UgaXMgYXZhaWxhYmxlXG5cdGlmKHR5cGVvZiB3aW5kb3cgPT09IFwib2JqZWN0XCIpXG5cdFx0ZyA9IHdpbmRvdztcbn1cblxuLy8gZyBjYW4gc3RpbGwgYmUgdW5kZWZpbmVkLCBidXQgbm90aGluZyB0byBkbyBhYm91dCBpdC4uLlxuLy8gV2UgcmV0dXJuIHVuZGVmaW5lZCwgaW5zdGVhZCBvZiBub3RoaW5nIGhlcmUsIHNvIGl0J3Ncbi8vIGVhc2llciB0byBoYW5kbGUgdGhpcyBjYXNlLiBpZighZ2xvYmFsKSB7IC4uLn1cblxubW9kdWxlLmV4cG9ydHMgPSBnO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gKHdlYnBhY2spL2J1aWxkaW4vZ2xvYmFsLmpzXG4vLyBtb2R1bGUgaWQgPSAyMlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCdcblxuZXhwb3J0cy5ieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aFxuZXhwb3J0cy50b0J5dGVBcnJheSA9IHRvQnl0ZUFycmF5XG5leHBvcnRzLmZyb21CeXRlQXJyYXkgPSBmcm9tQnl0ZUFycmF5XG5cbnZhciBsb29rdXAgPSBbXVxudmFyIHJldkxvb2t1cCA9IFtdXG52YXIgQXJyID0gdHlwZW9mIFVpbnQ4QXJyYXkgIT09ICd1bmRlZmluZWQnID8gVWludDhBcnJheSA6IEFycmF5XG5cbnZhciBjb2RlID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8nXG5mb3IgKHZhciBpID0gMCwgbGVuID0gY29kZS5sZW5ndGg7IGkgPCBsZW47ICsraSkge1xuICBsb29rdXBbaV0gPSBjb2RlW2ldXG4gIHJldkxvb2t1cFtjb2RlLmNoYXJDb2RlQXQoaSldID0gaVxufVxuXG5yZXZMb29rdXBbJy0nLmNoYXJDb2RlQXQoMCldID0gNjJcbnJldkxvb2t1cFsnXycuY2hhckNvZGVBdCgwKV0gPSA2M1xuXG5mdW5jdGlvbiBwbGFjZUhvbGRlcnNDb3VudCAoYjY0KSB7XG4gIHZhciBsZW4gPSBiNjQubGVuZ3RoXG4gIGlmIChsZW4gJSA0ID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzdHJpbmcuIExlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCcpXG4gIH1cblxuICAvLyB0aGUgbnVtYmVyIG9mIGVxdWFsIHNpZ25zIChwbGFjZSBob2xkZXJzKVxuICAvLyBpZiB0aGVyZSBhcmUgdHdvIHBsYWNlaG9sZGVycywgdGhhbiB0aGUgdHdvIGNoYXJhY3RlcnMgYmVmb3JlIGl0XG4gIC8vIHJlcHJlc2VudCBvbmUgYnl0ZVxuICAvLyBpZiB0aGVyZSBpcyBvbmx5IG9uZSwgdGhlbiB0aGUgdGhyZWUgY2hhcmFjdGVycyBiZWZvcmUgaXQgcmVwcmVzZW50IDIgYnl0ZXNcbiAgLy8gdGhpcyBpcyBqdXN0IGEgY2hlYXAgaGFjayB0byBub3QgZG8gaW5kZXhPZiB0d2ljZVxuICByZXR1cm4gYjY0W2xlbiAtIDJdID09PSAnPScgPyAyIDogYjY0W2xlbiAtIDFdID09PSAnPScgPyAxIDogMFxufVxuXG5mdW5jdGlvbiBieXRlTGVuZ3RoIChiNjQpIHtcbiAgLy8gYmFzZTY0IGlzIDQvMyArIHVwIHRvIHR3byBjaGFyYWN0ZXJzIG9mIHRoZSBvcmlnaW5hbCBkYXRhXG4gIHJldHVybiAoYjY0Lmxlbmd0aCAqIDMgLyA0KSAtIHBsYWNlSG9sZGVyc0NvdW50KGI2NClcbn1cblxuZnVuY3Rpb24gdG9CeXRlQXJyYXkgKGI2NCkge1xuICB2YXIgaSwgbCwgdG1wLCBwbGFjZUhvbGRlcnMsIGFyclxuICB2YXIgbGVuID0gYjY0Lmxlbmd0aFxuICBwbGFjZUhvbGRlcnMgPSBwbGFjZUhvbGRlcnNDb3VudChiNjQpXG5cbiAgYXJyID0gbmV3IEFycigobGVuICogMyAvIDQpIC0gcGxhY2VIb2xkZXJzKVxuXG4gIC8vIGlmIHRoZXJlIGFyZSBwbGFjZWhvbGRlcnMsIG9ubHkgZ2V0IHVwIHRvIHRoZSBsYXN0IGNvbXBsZXRlIDQgY2hhcnNcbiAgbCA9IHBsYWNlSG9sZGVycyA+IDAgPyBsZW4gLSA0IDogbGVuXG5cbiAgdmFyIEwgPSAwXG5cbiAgZm9yIChpID0gMDsgaSA8IGw7IGkgKz0gNCkge1xuICAgIHRtcCA9IChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSldIDw8IDE4KSB8IChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDEpXSA8PCAxMikgfCAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAyKV0gPDwgNikgfCByZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDMpXVxuICAgIGFycltMKytdID0gKHRtcCA+PiAxNikgJiAweEZGXG4gICAgYXJyW0wrK10gPSAodG1wID4+IDgpICYgMHhGRlxuICAgIGFycltMKytdID0gdG1wICYgMHhGRlxuICB9XG5cbiAgaWYgKHBsYWNlSG9sZGVycyA9PT0gMikge1xuICAgIHRtcCA9IChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSldIDw8IDIpIHwgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldID4+IDQpXG4gICAgYXJyW0wrK10gPSB0bXAgJiAweEZGXG4gIH0gZWxzZSBpZiAocGxhY2VIb2xkZXJzID09PSAxKSB7XG4gICAgdG1wID0gKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKV0gPDwgMTApIHwgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldIDw8IDQpIHwgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMildID4+IDIpXG4gICAgYXJyW0wrK10gPSAodG1wID4+IDgpICYgMHhGRlxuICAgIGFycltMKytdID0gdG1wICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIGFyclxufVxuXG5mdW5jdGlvbiB0cmlwbGV0VG9CYXNlNjQgKG51bSkge1xuICByZXR1cm4gbG9va3VwW251bSA+PiAxOCAmIDB4M0ZdICsgbG9va3VwW251bSA+PiAxMiAmIDB4M0ZdICsgbG9va3VwW251bSA+PiA2ICYgMHgzRl0gKyBsb29rdXBbbnVtICYgMHgzRl1cbn1cblxuZnVuY3Rpb24gZW5jb2RlQ2h1bmsgKHVpbnQ4LCBzdGFydCwgZW5kKSB7XG4gIHZhciB0bXBcbiAgdmFyIG91dHB1dCA9IFtdXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgaSArPSAzKSB7XG4gICAgdG1wID0gKHVpbnQ4W2ldIDw8IDE2KSArICh1aW50OFtpICsgMV0gPDwgOCkgKyAodWludDhbaSArIDJdKVxuICAgIG91dHB1dC5wdXNoKHRyaXBsZXRUb0Jhc2U2NCh0bXApKVxuICB9XG4gIHJldHVybiBvdXRwdXQuam9pbignJylcbn1cblxuZnVuY3Rpb24gZnJvbUJ5dGVBcnJheSAodWludDgpIHtcbiAgdmFyIHRtcFxuICB2YXIgbGVuID0gdWludDgubGVuZ3RoXG4gIHZhciBleHRyYUJ5dGVzID0gbGVuICUgMyAvLyBpZiB3ZSBoYXZlIDEgYnl0ZSBsZWZ0LCBwYWQgMiBieXRlc1xuICB2YXIgb3V0cHV0ID0gJydcbiAgdmFyIHBhcnRzID0gW11cbiAgdmFyIG1heENodW5rTGVuZ3RoID0gMTYzODMgLy8gbXVzdCBiZSBtdWx0aXBsZSBvZiAzXG5cbiAgLy8gZ28gdGhyb3VnaCB0aGUgYXJyYXkgZXZlcnkgdGhyZWUgYnl0ZXMsIHdlJ2xsIGRlYWwgd2l0aCB0cmFpbGluZyBzdHVmZiBsYXRlclxuICBmb3IgKHZhciBpID0gMCwgbGVuMiA9IGxlbiAtIGV4dHJhQnl0ZXM7IGkgPCBsZW4yOyBpICs9IG1heENodW5rTGVuZ3RoKSB7XG4gICAgcGFydHMucHVzaChlbmNvZGVDaHVuayh1aW50OCwgaSwgKGkgKyBtYXhDaHVua0xlbmd0aCkgPiBsZW4yID8gbGVuMiA6IChpICsgbWF4Q2h1bmtMZW5ndGgpKSlcbiAgfVxuXG4gIC8vIHBhZCB0aGUgZW5kIHdpdGggemVyb3MsIGJ1dCBtYWtlIHN1cmUgdG8gbm90IGZvcmdldCB0aGUgZXh0cmEgYnl0ZXNcbiAgaWYgKGV4dHJhQnl0ZXMgPT09IDEpIHtcbiAgICB0bXAgPSB1aW50OFtsZW4gLSAxXVxuICAgIG91dHB1dCArPSBsb29rdXBbdG1wID4+IDJdXG4gICAgb3V0cHV0ICs9IGxvb2t1cFsodG1wIDw8IDQpICYgMHgzRl1cbiAgICBvdXRwdXQgKz0gJz09J1xuICB9IGVsc2UgaWYgKGV4dHJhQnl0ZXMgPT09IDIpIHtcbiAgICB0bXAgPSAodWludDhbbGVuIC0gMl0gPDwgOCkgKyAodWludDhbbGVuIC0gMV0pXG4gICAgb3V0cHV0ICs9IGxvb2t1cFt0bXAgPj4gMTBdXG4gICAgb3V0cHV0ICs9IGxvb2t1cFsodG1wID4+IDQpICYgMHgzRl1cbiAgICBvdXRwdXQgKz0gbG9va3VwWyh0bXAgPDwgMikgJiAweDNGXVxuICAgIG91dHB1dCArPSAnPSdcbiAgfVxuXG4gIHBhcnRzLnB1c2gob3V0cHV0KVxuXG4gIHJldHVybiBwYXJ0cy5qb2luKCcnKVxufVxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvYmFzZTY0LWpzL2luZGV4LmpzXG4vLyBtb2R1bGUgaWQgPSAyM1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJleHBvcnRzLnJlYWQgPSBmdW5jdGlvbiAoYnVmZmVyLCBvZmZzZXQsIGlzTEUsIG1MZW4sIG5CeXRlcykge1xuICB2YXIgZSwgbVxuICB2YXIgZUxlbiA9IG5CeXRlcyAqIDggLSBtTGVuIC0gMVxuICB2YXIgZU1heCA9ICgxIDw8IGVMZW4pIC0gMVxuICB2YXIgZUJpYXMgPSBlTWF4ID4+IDFcbiAgdmFyIG5CaXRzID0gLTdcbiAgdmFyIGkgPSBpc0xFID8gKG5CeXRlcyAtIDEpIDogMFxuICB2YXIgZCA9IGlzTEUgPyAtMSA6IDFcbiAgdmFyIHMgPSBidWZmZXJbb2Zmc2V0ICsgaV1cblxuICBpICs9IGRcblxuICBlID0gcyAmICgoMSA8PCAoLW5CaXRzKSkgLSAxKVxuICBzID4+PSAoLW5CaXRzKVxuICBuQml0cyArPSBlTGVuXG4gIGZvciAoOyBuQml0cyA+IDA7IGUgPSBlICogMjU2ICsgYnVmZmVyW29mZnNldCArIGldLCBpICs9IGQsIG5CaXRzIC09IDgpIHt9XG5cbiAgbSA9IGUgJiAoKDEgPDwgKC1uQml0cykpIC0gMSlcbiAgZSA+Pj0gKC1uQml0cylcbiAgbkJpdHMgKz0gbUxlblxuICBmb3IgKDsgbkJpdHMgPiAwOyBtID0gbSAqIDI1NiArIGJ1ZmZlcltvZmZzZXQgKyBpXSwgaSArPSBkLCBuQml0cyAtPSA4KSB7fVxuXG4gIGlmIChlID09PSAwKSB7XG4gICAgZSA9IDEgLSBlQmlhc1xuICB9IGVsc2UgaWYgKGUgPT09IGVNYXgpIHtcbiAgICByZXR1cm4gbSA/IE5hTiA6ICgocyA/IC0xIDogMSkgKiBJbmZpbml0eSlcbiAgfSBlbHNlIHtcbiAgICBtID0gbSArIE1hdGgucG93KDIsIG1MZW4pXG4gICAgZSA9IGUgLSBlQmlhc1xuICB9XG4gIHJldHVybiAocyA/IC0xIDogMSkgKiBtICogTWF0aC5wb3coMiwgZSAtIG1MZW4pXG59XG5cbmV4cG9ydHMud3JpdGUgPSBmdW5jdGlvbiAoYnVmZmVyLCB2YWx1ZSwgb2Zmc2V0LCBpc0xFLCBtTGVuLCBuQnl0ZXMpIHtcbiAgdmFyIGUsIG0sIGNcbiAgdmFyIGVMZW4gPSBuQnl0ZXMgKiA4IC0gbUxlbiAtIDFcbiAgdmFyIGVNYXggPSAoMSA8PCBlTGVuKSAtIDFcbiAgdmFyIGVCaWFzID0gZU1heCA+PiAxXG4gIHZhciBydCA9IChtTGVuID09PSAyMyA/IE1hdGgucG93KDIsIC0yNCkgLSBNYXRoLnBvdygyLCAtNzcpIDogMClcbiAgdmFyIGkgPSBpc0xFID8gMCA6IChuQnl0ZXMgLSAxKVxuICB2YXIgZCA9IGlzTEUgPyAxIDogLTFcbiAgdmFyIHMgPSB2YWx1ZSA8IDAgfHwgKHZhbHVlID09PSAwICYmIDEgLyB2YWx1ZSA8IDApID8gMSA6IDBcblxuICB2YWx1ZSA9IE1hdGguYWJzKHZhbHVlKVxuXG4gIGlmIChpc05hTih2YWx1ZSkgfHwgdmFsdWUgPT09IEluZmluaXR5KSB7XG4gICAgbSA9IGlzTmFOKHZhbHVlKSA/IDEgOiAwXG4gICAgZSA9IGVNYXhcbiAgfSBlbHNlIHtcbiAgICBlID0gTWF0aC5mbG9vcihNYXRoLmxvZyh2YWx1ZSkgLyBNYXRoLkxOMilcbiAgICBpZiAodmFsdWUgKiAoYyA9IE1hdGgucG93KDIsIC1lKSkgPCAxKSB7XG4gICAgICBlLS1cbiAgICAgIGMgKj0gMlxuICAgIH1cbiAgICBpZiAoZSArIGVCaWFzID49IDEpIHtcbiAgICAgIHZhbHVlICs9IHJ0IC8gY1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWx1ZSArPSBydCAqIE1hdGgucG93KDIsIDEgLSBlQmlhcylcbiAgICB9XG4gICAgaWYgKHZhbHVlICogYyA+PSAyKSB7XG4gICAgICBlKytcbiAgICAgIGMgLz0gMlxuICAgIH1cblxuICAgIGlmIChlICsgZUJpYXMgPj0gZU1heCkge1xuICAgICAgbSA9IDBcbiAgICAgIGUgPSBlTWF4XG4gICAgfSBlbHNlIGlmIChlICsgZUJpYXMgPj0gMSkge1xuICAgICAgbSA9ICh2YWx1ZSAqIGMgLSAxKSAqIE1hdGgucG93KDIsIG1MZW4pXG4gICAgICBlID0gZSArIGVCaWFzXG4gICAgfSBlbHNlIHtcbiAgICAgIG0gPSB2YWx1ZSAqIE1hdGgucG93KDIsIGVCaWFzIC0gMSkgKiBNYXRoLnBvdygyLCBtTGVuKVxuICAgICAgZSA9IDBcbiAgICB9XG4gIH1cblxuICBmb3IgKDsgbUxlbiA+PSA4OyBidWZmZXJbb2Zmc2V0ICsgaV0gPSBtICYgMHhmZiwgaSArPSBkLCBtIC89IDI1NiwgbUxlbiAtPSA4KSB7fVxuXG4gIGUgPSAoZSA8PCBtTGVuKSB8IG1cbiAgZUxlbiArPSBtTGVuXG4gIGZvciAoOyBlTGVuID4gMDsgYnVmZmVyW29mZnNldCArIGldID0gZSAmIDB4ZmYsIGkgKz0gZCwgZSAvPSAyNTYsIGVMZW4gLT0gOCkge31cblxuICBidWZmZXJbb2Zmc2V0ICsgaSAtIGRdIHw9IHMgKiAxMjhcbn1cblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2llZWU3NTQvaW5kZXguanNcbi8vIG1vZHVsZSBpZCA9IDI0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciB0b1N0cmluZyA9IHt9LnRvU3RyaW5nO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24gKGFycikge1xuICByZXR1cm4gdG9TdHJpbmcuY2FsbChhcnIpID09ICdbb2JqZWN0IEFycmF5XSc7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvaXNhcnJheS9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gMjVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgQ2xvY2sgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIENsb2NrKHVzZUludGVydmFsKSB7XG4gICAgICAgIGlmICh1c2VJbnRlcnZhbCA9PT0gdm9pZCAwKSB7IHVzZUludGVydmFsID0gZmFsc2U7IH1cbiAgICAgICAgdGhpcy5ydW5uaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMubm93ID0gKHR5cGVvZiAod2luZG93KSAhPT0gXCJ1bmRlZmluZWRcIiAmJiB3aW5kb3cucGVyZm9ybWFuY2UgJiYgd2luZG93LnBlcmZvcm1hbmNlLm5vdyAmJiAod2luZG93LnBlcmZvcm1hbmNlLm5vdykuYmluZCh3aW5kb3cucGVyZm9ybWFuY2UpKSB8fCBEYXRlLm5vdztcbiAgICAgICAgdGhpcy5zdGFydCh1c2VJbnRlcnZhbCk7XG4gICAgfVxuICAgIENsb2NrLnByb3RvdHlwZS5zdGFydCA9IGZ1bmN0aW9uICh1c2VJbnRlcnZhbCkge1xuICAgICAgICBpZiAodXNlSW50ZXJ2YWwgPT09IHZvaWQgMCkgeyB1c2VJbnRlcnZhbCA9IGZhbHNlOyB9XG4gICAgICAgIHRoaXMuZGVsdGFUaW1lID0gMDtcbiAgICAgICAgdGhpcy5jdXJyZW50VGltZSA9IHRoaXMubm93KCk7XG4gICAgICAgIHRoaXMuZWxhcHNlZFRpbWUgPSAwO1xuICAgICAgICB0aGlzLnJ1bm5pbmcgPSB0cnVlO1xuICAgICAgICBpZiAodXNlSW50ZXJ2YWwpIHtcbiAgICAgICAgICAgIC8vIGF1dG8gc2V0IGludGVydmFsIHRvIDYwIHRpY2tzIHBlciBzZWNvbmRcbiAgICAgICAgICAgIHRoaXMuX2ludGVydmFsID0gc2V0SW50ZXJ2YWwodGhpcy50aWNrLmJpbmQodGhpcyksIDEwMDAgLyA2MCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIENsb2NrLnByb3RvdHlwZS5zdG9wID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnJ1bm5pbmcgPSBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMuX2ludGVydmFsKSB7XG4gICAgICAgICAgICBjbGVhckludGVydmFsKHRoaXMuX2ludGVydmFsKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgQ2xvY2sucHJvdG90eXBlLnRpY2sgPSBmdW5jdGlvbiAobmV3VGltZSkge1xuICAgICAgICBpZiAobmV3VGltZSA9PT0gdm9pZCAwKSB7IG5ld1RpbWUgPSB0aGlzLm5vdygpOyB9XG4gICAgICAgIHRoaXMuZGVsdGFUaW1lID0gbmV3VGltZSAtIHRoaXMuY3VycmVudFRpbWU7XG4gICAgICAgIHRoaXMuY3VycmVudFRpbWUgPSBuZXdUaW1lO1xuICAgICAgICB0aGlzLmVsYXBzZWRUaW1lICs9IHRoaXMuZGVsdGFUaW1lO1xuICAgIH07XG4gICAgcmV0dXJuIENsb2NrO1xufSgpKTtcbm1vZHVsZS5leHBvcnRzID0gQ2xvY2s7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9AZ2FtZXN0ZGlvL2Nsb2NrL2Rpc3QvaW5kZXguanNcbi8vIG1vZHVsZSBpZCA9IDI2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIERlbHRhQ29udGFpbmVyXzEgPSByZXF1aXJlKFwiLi9EZWx0YUNvbnRhaW5lclwiKTtcbmV4cG9ydHMuRGVsdGFDb250YWluZXIgPSBEZWx0YUNvbnRhaW5lcl8xLkRlbHRhQ29udGFpbmVyO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvZGVsdGEtbGlzdGVuZXIvbGliL2luZGV4LmpzXG4vLyBtb2R1bGUgaWQgPSAyN1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciBjb21wYXJlXzEgPSByZXF1aXJlKFwiLi9jb21wYXJlXCIpO1xudmFyIERlbHRhQ29udGFpbmVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIERlbHRhQ29udGFpbmVyKGRhdGEpIHtcbiAgICAgICAgdGhpcy5saXN0ZW5lcnMgPSBbXTtcbiAgICAgICAgdGhpcy5tYXRjaGVyUGxhY2Vob2xkZXJzID0ge1xuICAgICAgICAgICAgXCI6aWRcIjogL14oW2EtekEtWjAtOVxcLV9dKykkLyxcbiAgICAgICAgICAgIFwiOm51bWJlclwiOiAvXihbMC05XSspJC8sXG4gICAgICAgICAgICBcIjpzdHJpbmdcIjogL14oXFx3KykkLyxcbiAgICAgICAgICAgIFwiOmF4aXNcIjogL14oW3h5el0pJC8sXG4gICAgICAgICAgICBcIjoqXCI6IC8oLiopLyxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgIH1cbiAgICBEZWx0YUNvbnRhaW5lci5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKG5ld0RhdGEpIHtcbiAgICAgICAgdmFyIHBhdGNoZXMgPSBjb21wYXJlXzEuY29tcGFyZSh0aGlzLmRhdGEsIG5ld0RhdGEpO1xuICAgICAgICB0aGlzLmNoZWNrUGF0Y2hlcyhwYXRjaGVzKTtcbiAgICAgICAgdGhpcy5kYXRhID0gbmV3RGF0YTtcbiAgICAgICAgcmV0dXJuIHBhdGNoZXM7XG4gICAgfTtcbiAgICBEZWx0YUNvbnRhaW5lci5wcm90b3R5cGUucmVnaXN0ZXJQbGFjZWhvbGRlciA9IGZ1bmN0aW9uIChwbGFjZWhvbGRlciwgbWF0Y2hlcikge1xuICAgICAgICB0aGlzLm1hdGNoZXJQbGFjZWhvbGRlcnNbcGxhY2Vob2xkZXJdID0gbWF0Y2hlcjtcbiAgICB9O1xuICAgIERlbHRhQ29udGFpbmVyLnByb3RvdHlwZS5saXN0ZW4gPSBmdW5jdGlvbiAoc2VnbWVudHMsIGNhbGxiYWNrKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBydWxlcztcbiAgICAgICAgaWYgKHR5cGVvZiAoc2VnbWVudHMpID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHJ1bGVzID0gW107XG4gICAgICAgICAgICBjYWxsYmFjayA9IHNlZ21lbnRzO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcnVsZXMgPSBzZWdtZW50cy5zcGxpdChcIi9cIik7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGxpc3RlbmVyID0ge1xuICAgICAgICAgICAgY2FsbGJhY2s6IGNhbGxiYWNrLFxuICAgICAgICAgICAgcmF3UnVsZXM6IHJ1bGVzLFxuICAgICAgICAgICAgcnVsZXM6IHJ1bGVzLm1hcChmdW5jdGlvbiAoc2VnbWVudCkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgKHNlZ21lbnQpID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHJlcGxhY2UgcGxhY2Vob2xkZXIgbWF0Y2hlcnNcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChzZWdtZW50LmluZGV4T2YoXCI6XCIpID09PSAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBfdGhpcy5tYXRjaGVyUGxhY2Vob2xkZXJzW3NlZ21lbnRdIHx8IF90aGlzLm1hdGNoZXJQbGFjZWhvbGRlcnNbXCI6KlwiXVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBuZXcgUmVnRXhwKFwiXlwiICsgc2VnbWVudCArIFwiJFwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWdtZW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG4gICAgICAgIGlmIChydWxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuZGVmYXVsdExpc3RlbmVyID0gbGlzdGVuZXI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbGlzdGVuZXI7XG4gICAgfTtcbiAgICBEZWx0YUNvbnRhaW5lci5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXIgPSBmdW5jdGlvbiAobGlzdGVuZXIpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IHRoaXMubGlzdGVuZXJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5saXN0ZW5lcnNbaV0gPT09IGxpc3RlbmVyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBEZWx0YUNvbnRhaW5lci5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgfTtcbiAgICBEZWx0YUNvbnRhaW5lci5wcm90b3R5cGUuY2hlY2tQYXRjaGVzID0gZnVuY3Rpb24gKHBhdGNoZXMpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IHBhdGNoZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIHZhciBtYXRjaGVkID0gZmFsc2U7XG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMCwgbGVuID0gdGhpcy5saXN0ZW5lcnMubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgbGlzdGVuZXIgPSB0aGlzLmxpc3RlbmVyc1tqXTtcbiAgICAgICAgICAgICAgICB2YXIgcGF0aFZhcmlhYmxlcyA9IHRoaXMuZ2V0UGF0aFZhcmlhYmxlcyhwYXRjaGVzW2ldLCBsaXN0ZW5lcik7XG4gICAgICAgICAgICAgICAgaWYgKHBhdGhWYXJpYWJsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIuY2FsbGJhY2soe1xuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogcGF0aFZhcmlhYmxlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJhd1BhdGg6IHBhdGNoZXNbaV0ucGF0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbjogcGF0Y2hlc1tpXS5vcGVyYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogcGF0Y2hlc1tpXS52YWx1ZVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gY2hlY2sgZm9yIGZhbGxiYWNrIGxpc3RlbmVyXG4gICAgICAgICAgICBpZiAoIW1hdGNoZWQgJiYgdGhpcy5kZWZhdWx0TGlzdGVuZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRlZmF1bHRMaXN0ZW5lci5jYWxsYmFjayhwYXRjaGVzW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgRGVsdGFDb250YWluZXIucHJvdG90eXBlLmdldFBhdGhWYXJpYWJsZXMgPSBmdW5jdGlvbiAocGF0Y2gsIGxpc3RlbmVyKSB7XG4gICAgICAgIC8vIHNraXAgaWYgcnVsZXMgY291bnQgZGlmZmVyIGZyb20gcGF0Y2hcbiAgICAgICAgaWYgKHBhdGNoLnBhdGgubGVuZ3RoICE9PSBsaXN0ZW5lci5ydWxlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcGF0aCA9IHt9O1xuICAgICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gbGlzdGVuZXIucnVsZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBtYXRjaGVzID0gcGF0Y2gucGF0aFtpXS5tYXRjaChsaXN0ZW5lci5ydWxlc1tpXSk7XG4gICAgICAgICAgICBpZiAoIW1hdGNoZXMgfHwgbWF0Y2hlcy5sZW5ndGggPT09IDAgfHwgbWF0Y2hlcy5sZW5ndGggPiAyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobGlzdGVuZXIucmF3UnVsZXNbaV0uc3Vic3RyKDAsIDEpID09PSBcIjpcIikge1xuICAgICAgICAgICAgICAgIHBhdGhbbGlzdGVuZXIucmF3UnVsZXNbaV0uc3Vic3RyKDEpXSA9IG1hdGNoZXNbMV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhdGg7XG4gICAgfTtcbiAgICBEZWx0YUNvbnRhaW5lci5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMubGlzdGVuZXJzID0gW107XG4gICAgfTtcbiAgICByZXR1cm4gRGVsdGFDb250YWluZXI7XG59KCkpO1xuZXhwb3J0cy5EZWx0YUNvbnRhaW5lciA9IERlbHRhQ29udGFpbmVyO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvZGVsdGEtbGlzdGVuZXIvbGliL0RlbHRhQ29udGFpbmVyLmpzXG4vLyBtb2R1bGUgaWQgPSAyOFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmZ1bmN0aW9uIGNvbXBhcmUodHJlZTEsIHRyZWUyKSB7XG4gICAgdmFyIHBhdGNoZXMgPSBbXTtcbiAgICBnZW5lcmF0ZSh0cmVlMSwgdHJlZTIsIHBhdGNoZXMsIFtdKTtcbiAgICByZXR1cm4gcGF0Y2hlcztcbn1cbmV4cG9ydHMuY29tcGFyZSA9IGNvbXBhcmU7XG5mdW5jdGlvbiBjb25jYXQoYXJyLCB2YWx1ZSkge1xuICAgIHZhciBuZXdBcnIgPSBhcnIuc2xpY2UoKTtcbiAgICBuZXdBcnIucHVzaCh2YWx1ZSk7XG4gICAgcmV0dXJuIG5ld0Fycjtcbn1cbmZ1bmN0aW9uIG9iamVjdEtleXMob2JqKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgICAgICB2YXIga2V5c18xID0gbmV3IEFycmF5KG9iai5sZW5ndGgpO1xuICAgICAgICBmb3IgKHZhciBrID0gMDsgayA8IGtleXNfMS5sZW5ndGg7IGsrKykge1xuICAgICAgICAgICAga2V5c18xW2tdID0gXCJcIiArIGs7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGtleXNfMTtcbiAgICB9XG4gICAgaWYgKE9iamVjdC5rZXlzKSB7XG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhvYmopO1xuICAgIH1cbiAgICB2YXIga2V5cyA9IFtdO1xuICAgIGZvciAodmFyIGkgaW4gb2JqKSB7XG4gICAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoaSkpIHtcbiAgICAgICAgICAgIGtleXMucHVzaChpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ga2V5cztcbn1cbjtcbi8vIERpcnR5IGNoZWNrIGlmIG9iaiBpcyBkaWZmZXJlbnQgZnJvbSBtaXJyb3IsIGdlbmVyYXRlIHBhdGNoZXMgYW5kIHVwZGF0ZSBtaXJyb3JcbmZ1bmN0aW9uIGdlbmVyYXRlKG1pcnJvciwgb2JqLCBwYXRjaGVzLCBwYXRoKSB7XG4gICAgdmFyIG5ld0tleXMgPSBvYmplY3RLZXlzKG9iaik7XG4gICAgdmFyIG9sZEtleXMgPSBvYmplY3RLZXlzKG1pcnJvcik7XG4gICAgdmFyIGNoYW5nZWQgPSBmYWxzZTtcbiAgICB2YXIgZGVsZXRlZCA9IGZhbHNlO1xuICAgIGZvciAodmFyIHQgPSBvbGRLZXlzLmxlbmd0aCAtIDE7IHQgPj0gMDsgdC0tKSB7XG4gICAgICAgIHZhciBrZXkgPSBvbGRLZXlzW3RdO1xuICAgICAgICB2YXIgb2xkVmFsID0gbWlycm9yW2tleV07XG4gICAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSAmJiAhKG9ialtrZXldID09PSB1bmRlZmluZWQgJiYgb2xkVmFsICE9PSB1bmRlZmluZWQgJiYgQXJyYXkuaXNBcnJheShvYmopID09PSBmYWxzZSkpIHtcbiAgICAgICAgICAgIHZhciBuZXdWYWwgPSBvYmpba2V5XTtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb2xkVmFsID09IFwib2JqZWN0XCIgJiYgb2xkVmFsICE9IG51bGwgJiYgdHlwZW9mIG5ld1ZhbCA9PSBcIm9iamVjdFwiICYmIG5ld1ZhbCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgZ2VuZXJhdGUob2xkVmFsLCBuZXdWYWwsIHBhdGNoZXMsIGNvbmNhdChwYXRoLCBrZXkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChvbGRWYWwgIT09IG5ld1ZhbCkge1xuICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcGF0Y2hlcy5wdXNoKHsgb3BlcmF0aW9uOiBcInJlcGxhY2VcIiwgcGF0aDogY29uY2F0KHBhdGgsIGtleSksIHZhbHVlOiBuZXdWYWwgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcGF0Y2hlcy5wdXNoKHsgb3BlcmF0aW9uOiBcInJlbW92ZVwiLCBwYXRoOiBjb25jYXQocGF0aCwga2V5KSB9KTtcbiAgICAgICAgICAgIGRlbGV0ZWQgPSB0cnVlOyAvLyBwcm9wZXJ0eSBoYXMgYmVlbiBkZWxldGVkXG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFkZWxldGVkICYmIG5ld0tleXMubGVuZ3RoID09IG9sZEtleXMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yICh2YXIgdCA9IDA7IHQgPCBuZXdLZXlzLmxlbmd0aDsgdCsrKSB7XG4gICAgICAgIHZhciBrZXkgPSBuZXdLZXlzW3RdO1xuICAgICAgICBpZiAoIW1pcnJvci5oYXNPd25Qcm9wZXJ0eShrZXkpICYmIG9ialtrZXldICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHZhciBuZXdWYWwgPSBvYmpba2V5XTtcbiAgICAgICAgICAgIHZhciBhZGRQYXRoID0gY29uY2F0KHBhdGgsIGtleSk7XG4gICAgICAgICAgICAvLyBjb21wYXJlIGRlZXBlciBhZGRpdGlvbnNcbiAgICAgICAgICAgIGlmICh0eXBlb2YgbmV3VmFsID09IFwib2JqZWN0XCIgJiYgbmV3VmFsICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBnZW5lcmF0ZSh7fSwgbmV3VmFsLCBwYXRjaGVzLCBhZGRQYXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBhdGNoZXMucHVzaCh7IG9wZXJhdGlvbjogXCJhZGRcIiwgcGF0aDogYWRkUGF0aCwgdmFsdWU6IG5ld1ZhbCB9KTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2RlbHRhLWxpc3RlbmVyL2xpYi9jb21wYXJlLmpzXG4vLyBtb2R1bGUgaWQgPSAyOVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyBGb3NzaWwgU0NNIGRlbHRhIGNvbXByZXNzaW9uIGFsZ29yaXRobVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vXG4vLyBGb3JtYXQ6XG4vLyBodHRwOi8vd3d3LmZvc3NpbC1zY20ub3JnL2luZGV4Lmh0bWwvZG9jL3RpcC93d3cvZGVsdGFfZm9ybWF0Lndpa2lcbi8vXG4vLyBBbGdvcml0aG06XG4vLyBodHRwOi8vd3d3LmZvc3NpbC1zY20ub3JnL2luZGV4Lmh0bWwvZG9jL3RpcC93d3cvZGVsdGFfZW5jb2Rlcl9hbGdvcml0aG0ud2lraVxuLy9cbi8vIE9yaWdpbmFsIGltcGxlbWVudGF0aW9uOlxuLy8gaHR0cDovL3d3dy5mb3NzaWwtc2NtLm9yZy9pbmRleC5odG1sL2FydGlmYWN0L2QxYjA1OThhZGNkNjUwYjM1NTFmNjNiMTdkZmM4NjRlNzM3NzVjM2Rcbi8vXG4vLyBMSUNFTlNFXG4vLyAtLS0tLS0tXG4vL1xuLy8gQ29weXJpZ2h0IDIwMTQgRG1pdHJ5IENoZXN0bnlraCAoSmF2YVNjcmlwdCBwb3J0KVxuLy8gQ29weXJpZ2h0IDIwMDcgRC4gUmljaGFyZCBIaXBwICAob3JpZ2luYWwgQyB2ZXJzaW9uKVxuLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vXG4vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yXG4vLyB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbi8vXG4vLyAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmVcbi8vICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZVxuLy8gICAgICBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbi8vXG4vLyAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmVcbi8vICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZVxuLy8gICAgICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXJcbi8vICAgICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cbi8vXG4vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1JTIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEXG4vLyBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0Vcbi8vIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT05UUklCVVRPUlMgQkVcbi8vIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1Jcbi8vIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4vLyBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1Jcbi8vIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLFxuLy8gV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0Vcbi8vIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsXG4vLyBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuLy9cbi8vIFRoZSB2aWV3cyBhbmQgY29uY2x1c2lvbnMgY29udGFpbmVkIGluIHRoZSBzb2Z0d2FyZSBhbmQgZG9jdW1lbnRhdGlvblxuLy8gYXJlIHRob3NlIG9mIHRoZSBhdXRob3JzIGFuZCBjb250cmlidXRvcnMgYW5kIHNob3VsZCBub3QgYmUgaW50ZXJwcmV0ZWRcbi8vIGFzIHJlcHJlc2VudGluZyBvZmZpY2lhbCBwb2xpY2llcywgZWl0aGVyIGV4cHJlc3NlZCBvciBpbXBsaWVkLCBvZiBhbnlib2R5XG4vLyBlbHNlLlxuLy9cbihmdW5jdGlvbihyb290LCBmYWN0b3J5KSB7XG4gIGlmICh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyAmJiBtb2R1bGUuZXhwb3J0cykgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG4gIGVsc2Ugcm9vdC5mb3NzaWxEZWx0YSA9IGZhY3RvcnkoKTtcbn0pKHRoaXMsIGZ1bmN0aW9uKCkge1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgZm9zc2lsRGVsdGEgPSB7fTtcblxuLy8gSGFzaCB3aW5kb3cgd2lkdGggaW4gYnl0ZXMuIE11c3QgYmUgYSBwb3dlciBvZiB0d28uXG52YXIgTkhBU0ggPSAxNjtcblxuZnVuY3Rpb24gUm9sbGluZ0hhc2goKSB7XG4gIHRoaXMuYSA9IDA7IC8vIGhhc2ggICAgICgxNi1iaXQgdW5zaWduZWQpXG4gIHRoaXMuYiA9IDA7IC8vIHZhbHVlcyAgICgxNi1iaXQgdW5zaWduZWQpXG4gIHRoaXMuaSA9IDA7IC8vIHN0YXJ0IG9mIHRoZSBoYXNoIHdpbmRvdyAoMTYtYml0IHVuc2lnbmVkKVxuICB0aGlzLnogPSBuZXcgQXJyYXkoTkhBU0gpOyAvLyB0aGUgdmFsdWVzIHRoYXQgaGF2ZSBiZWVuIGhhc2hlZC5cbn1cblxuLy8gSW5pdGlhbGl6ZSB0aGUgcm9sbGluZyBoYXNoIHVzaW5nIHRoZSBmaXJzdCBOSEFTSCBieXRlcyBvZlxuLy8geiBhdCB0aGUgZ2l2ZW4gcG9zaXRpb24uXG5Sb2xsaW5nSGFzaC5wcm90b3R5cGUuaW5pdCA9IGZ1bmN0aW9uKHosIHBvcykge1xuICB2YXIgYSA9IDAsIGIgPSAwLCBpLCB4O1xuICBmb3IoaSA9IDA7IGkgPCBOSEFTSDsgaSsrKXtcbiAgICB4ID0geltwb3MraV07XG4gICAgYSA9IChhICsgeCkgJiAweGZmZmY7XG4gICAgYiA9IChiICsgKE5IQVNILWkpKngpICYgMHhmZmZmO1xuICAgIHRoaXMueltpXSA9IHg7XG4gIH1cbiAgdGhpcy5hID0gYSAmIDB4ZmZmZjtcbiAgdGhpcy5iID0gYiAmIDB4ZmZmZjtcbiAgdGhpcy5pID0gMDtcbn07XG5cbi8vIEFkdmFuY2UgdGhlIHJvbGxpbmcgaGFzaCBieSBhIHNpbmdsZSBieXRlIFwiY1wiLlxuUm9sbGluZ0hhc2gucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbihjKSB7XG4gIHZhciBvbGQgPSB0aGlzLnpbdGhpcy5pXTtcbiAgdGhpcy56W3RoaXMuaV0gPSBjO1xuICB0aGlzLmkgPSAodGhpcy5pKzEpJihOSEFTSC0xKTtcbiAgdGhpcy5hID0gKHRoaXMuYSAtIG9sZCArIGMpICYgMHhmZmZmO1xuICB0aGlzLmIgPSAodGhpcy5iIC0gTkhBU0gqb2xkICsgdGhpcy5hKSAmIDB4ZmZmZjtcbn07XG5cbi8vIFJldHVybiBhIDMyLWJpdCBoYXNoIHZhbHVlLlxuUm9sbGluZ0hhc2gucHJvdG90eXBlLnZhbHVlID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiAoKHRoaXMuYSAmIDB4ZmZmZikgfCAodGhpcy5iICYgMHhmZmZmKTw8MTYpPj4+MDtcbn07XG5cbnZhciB6RGlnaXRzID0gXCIwMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp+XCIuXG4gICAgICAgICAgICAgICAgc3BsaXQoJycpLm1hcChmdW5jdGlvbiAoeCkgeyByZXR1cm4geC5jaGFyQ29kZUF0KDApOyB9KTtcblxudmFyIHpWYWx1ZSA9IFtcbiAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSxcbiAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSxcbiAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSxcbiAgIDAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3LCAgICA4LCAgOSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSxcbiAgLTEsIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LCAgIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCxcbiAgMjUsIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEsIDMyLCAgIDMzLCAzNCwgMzUsIC0xLCAtMSwgLTEsIC0xLCAzNixcbiAgLTEsIDM3LCAzOCwgMzksIDQwLCA0MSwgNDIsIDQzLCAgIDQ0LCA0NSwgNDYsIDQ3LCA0OCwgNDksIDUwLCA1MSxcbiAgNTIsIDUzLCA1NCwgNTUsIDU2LCA1NywgNTgsIDU5LCAgIDYwLCA2MSwgNjIsIC0xLCAtMSwgLTEsIDYzLCAtMVxuXTtcblxuLy8gUmVhZGVyIHJlYWRzIGJ5dGVzLCBjaGFycywgaW50cyBmcm9tIGFycmF5LlxuZnVuY3Rpb24gUmVhZGVyKGFycmF5KSB7XG4gIHRoaXMuYSA9IGFycmF5OyAvLyBzb3VyY2UgYXJyYXlcbiAgdGhpcy5wb3MgPSAwOyAgIC8vIGN1cnJlbnQgcG9zaXRpb24gaW4gYXJyYXlcbn1cblxuUmVhZGVyLnByb3RvdHlwZS5oYXZlQnl0ZXMgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMucG9zIDwgdGhpcy5hLmxlbmd0aDtcbn07XG5cblJlYWRlci5wcm90b3R5cGUuZ2V0Qnl0ZSA9IGZ1bmN0aW9uKCkge1xuICB2YXIgYiA9IHRoaXMuYVt0aGlzLnBvc107XG4gIHRoaXMucG9zKys7XG4gIGlmICh0aGlzLnBvcyA+IHRoaXMuYS5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdvdXQgb2YgYm91bmRzJyk7XG4gIHJldHVybiBiO1xufTtcblxuUmVhZGVyLnByb3RvdHlwZS5nZXRDaGFyID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKHRoaXMuZ2V0Qnl0ZSgpKTtcbn07XG5cbi8vIFJlYWQgYmFzZTY0LWVuY29kZWQgdW5zaWduZWQgaW50ZWdlci5cblJlYWRlci5wcm90b3R5cGUuZ2V0SW50ID0gZnVuY3Rpb24oKXtcbiAgdmFyIHYgPSAwLCBjO1xuICB3aGlsZSh0aGlzLmhhdmVCeXRlcygpICYmIChjID0gelZhbHVlWzB4N2YgJiB0aGlzLmdldEJ5dGUoKV0pID49IDApIHtcbiAgICAgdiA9ICh2PDw2KSArIGM7XG4gIH1cbiAgdGhpcy5wb3MtLTtcbiAgcmV0dXJuIHYgPj4+IDA7XG59O1xuXG5cbi8vIFdyaXRlIHdyaXRlcyBhbiBhcnJheS5cbmZ1bmN0aW9uIFdyaXRlcigpIHtcbiAgdGhpcy5hID0gW107XG59XG5cbldyaXRlci5wcm90b3R5cGUudG9BcnJheSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5hO1xufTtcblxuV3JpdGVyLnByb3RvdHlwZS5wdXRCeXRlID0gZnVuY3Rpb24oYikge1xuICB0aGlzLmEucHVzaChiICYgMHhmZik7XG59O1xuXG4vLyBXcml0ZSBhbiBBU0NJSSBjaGFyYWN0ZXIgKHMgaXMgYSBvbmUtY2hhciBzdHJpbmcpLlxuV3JpdGVyLnByb3RvdHlwZS5wdXRDaGFyID0gZnVuY3Rpb24ocykge1xuICB0aGlzLnB1dEJ5dGUocy5jaGFyQ29kZUF0KDApKTtcbn07XG5cbi8vIFdyaXRlIGEgYmFzZTY0IHVuc2lnbmVkIGludGVnZXIuXG5Xcml0ZXIucHJvdG90eXBlLnB1dEludCA9IGZ1bmN0aW9uKHYpe1xuICB2YXIgaSwgaiwgekJ1ZiA9IFtdO1xuICBpZiAodiA9PT0gMCkge1xuICAgIHRoaXMucHV0Q2hhcignMCcpO1xuICAgIHJldHVybjtcbiAgfVxuICBmb3IgKGkgPSAwOyB2ID4gMDsgaSsrLCB2ID4+Pj0gNilcbiAgICB6QnVmLnB1c2goekRpZ2l0c1t2JjB4M2ZdKTtcbiAgZm9yIChqID0gaS0xOyBqID49IDA7IGotLSlcbiAgICB0aGlzLnB1dEJ5dGUoekJ1ZltqXSk7XG59O1xuXG4vLyBDb3B5IGZyb20gYXJyYXkgYXQgc3RhcnQgdG8gZW5kLlxuV3JpdGVyLnByb3RvdHlwZS5wdXRBcnJheSA9IGZ1bmN0aW9uKGEsIHN0YXJ0LCBlbmQpIHtcbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHRoaXMuYS5wdXNoKGFbaV0pO1xufTtcblxuLy8gUmV0dXJuIHRoZSBudW1iZXIgZGlnaXRzIGluIHRoZSBiYXNlNjQgcmVwcmVzZW50YXRpb24gb2YgYSBwb3NpdGl2ZSBpbnRlZ2VyLlxuZnVuY3Rpb24gZGlnaXRDb3VudCh2KXtcbiAgdmFyIGksIHg7XG4gIGZvciAoaSA9IDEsIHggPSA2NDsgdiA+PSB4OyBpKyssIHggPDw9IDYpeyAvKiBub3RoaW5nICovIH1cbiAgcmV0dXJuIGk7XG59XG5cbi8vIFJldHVybiBhIDMyLWJpdCBjaGVja3N1bSBvZiB0aGUgYXJyYXkuXG5mdW5jdGlvbiBjaGVja3N1bShhcnIpIHtcbiAgdmFyIHN1bTAgPSAwLCBzdW0xID0gMCwgc3VtMiA9IDAsIHN1bTMgPSAwLFxuICAgICAgeiA9IDAsIE4gPSBhcnIubGVuZ3RoO1xuICAvL1RPRE8gbWVhc3VyZSBpZiB0aGlzIHVucm9sbGluZyBpcyBoZWxwZnVsLlxuICB3aGlsZSAoTiA+PSAxNikge1xuICAgIHN1bTAgPSBzdW0wICsgYXJyW3orMF0gfCAwO1xuICAgIHN1bTEgPSBzdW0xICsgYXJyW3orMV0gfCAwO1xuICAgIHN1bTIgPSBzdW0yICsgYXJyW3orMl0gfCAwO1xuICAgIHN1bTMgPSBzdW0zICsgYXJyW3orM10gfCAwO1xuXG4gICAgc3VtMCA9IHN1bTAgKyBhcnJbeis0XSB8IDA7XG4gICAgc3VtMSA9IHN1bTEgKyBhcnJbeis1XSB8IDA7XG4gICAgc3VtMiA9IHN1bTIgKyBhcnJbeis2XSB8IDA7XG4gICAgc3VtMyA9IHN1bTMgKyBhcnJbeis3XSB8IDA7XG5cbiAgICBzdW0wID0gc3VtMCArIGFyclt6KzhdIHwgMDtcbiAgICBzdW0xID0gc3VtMSArIGFyclt6KzldIHwgMDtcbiAgICBzdW0yID0gc3VtMiArIGFyclt6KzEwXSB8IDA7XG4gICAgc3VtMyA9IHN1bTMgKyBhcnJbeisxMV0gfCAwO1xuXG4gICAgc3VtMCA9IHN1bTAgKyBhcnJbeisxMl0gfCAwO1xuICAgIHN1bTEgPSBzdW0xICsgYXJyW3orMTNdIHwgMDtcbiAgICBzdW0yID0gc3VtMiArIGFyclt6KzE0XSB8IDA7XG4gICAgc3VtMyA9IHN1bTMgKyBhcnJbeisxNV0gfCAwO1xuXG4gICAgeiArPSAxNjtcbiAgICBOIC09IDE2O1xuICB9XG4gIHdoaWxlIChOID49IDQpIHtcbiAgICBzdW0wID0gc3VtMCArIGFyclt6KzBdIHwgMDtcbiAgICBzdW0xID0gc3VtMSArIGFyclt6KzFdIHwgMDtcbiAgICBzdW0yID0gc3VtMiArIGFyclt6KzJdIHwgMDtcbiAgICBzdW0zID0gc3VtMyArIGFyclt6KzNdIHwgMDtcbiAgICB6ICs9IDQ7XG4gICAgTiAtPSA0O1xuICB9XG4gIHN1bTMgPSAoKChzdW0zICsgKHN1bTIgPDwgOCkgfCAwKSArIChzdW0xIDw8IDE2KSB8IDApICsgKHN1bTAgPDwgMjQpIHwgMCk7XG4gIC8qIGpzaGludCAtVzA4NiAqL1xuICBzd2l0Y2ggKE4pIHtcbiAgICBjYXNlIDM6IHN1bTMgPSBzdW0zICsgKGFyclt6KzJdIDw8ICA4KSB8IDA7IC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIDI6IHN1bTMgPSBzdW0zICsgKGFyclt6KzFdIDw8IDE2KSB8IDA7IC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIDE6IHN1bTMgPSBzdW0zICsgKGFyclt6KzBdIDw8IDI0KSB8IDA7IC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgfVxuICByZXR1cm4gc3VtMyA+Pj4gMDtcbn1cblxuLy8gQ3JlYXRlIGEgbmV3IGRlbHRhIGZyb20gc3JjIHRvIG91dC5cbmZvc3NpbERlbHRhLmNyZWF0ZSA9IGZ1bmN0aW9uKHNyYywgb3V0KSB7XG4gIHZhciB6RGVsdGEgPSBuZXcgV3JpdGVyKCk7XG4gIHZhciBsZW5PdXQgPSBvdXQubGVuZ3RoO1xuICB2YXIgbGVuU3JjID0gc3JjLmxlbmd0aDtcbiAgdmFyIGksIGxhc3RSZWFkID0gLTE7XG5cbiAgekRlbHRhLnB1dEludChsZW5PdXQpO1xuICB6RGVsdGEucHV0Q2hhcignXFxuJyk7XG5cbiAgLy8gSWYgdGhlIHNvdXJjZSBpcyB2ZXJ5IHNtYWxsLCBpdCBtZWFucyB0aGF0IHdlIGhhdmUgbm9cbiAgLy8gY2hhbmNlIG9mIGV2ZXIgZG9pbmcgYSBjb3B5IGNvbW1hbmQuICBKdXN0IG91dHB1dCBhIHNpbmdsZVxuICAvLyBsaXRlcmFsIHNlZ21lbnQgZm9yIHRoZSBlbnRpcmUgdGFyZ2V0IGFuZCBleGl0LlxuICBpZiAobGVuU3JjIDw9IE5IQVNIKSB7XG4gICAgekRlbHRhLnB1dEludChsZW5PdXQpO1xuICAgIHpEZWx0YS5wdXRDaGFyKCc6Jyk7XG4gICAgekRlbHRhLnB1dEFycmF5KG91dCwgMCwgbGVuT3V0KTtcbiAgICB6RGVsdGEucHV0SW50KGNoZWNrc3VtKG91dCkpO1xuICAgIHpEZWx0YS5wdXRDaGFyKCc7Jyk7XG4gICAgcmV0dXJuIHpEZWx0YS50b0FycmF5KCk7XG4gIH1cblxuICAvLyBDb21wdXRlIHRoZSBoYXNoIHRhYmxlIHVzZWQgdG8gbG9jYXRlIG1hdGNoaW5nIHNlY3Rpb25zIGluIHRoZSBzb3VyY2UuXG4gIHZhciBuSGFzaCA9IE1hdGguY2VpbChsZW5TcmMgLyBOSEFTSCk7XG4gIHZhciBjb2xsaWRlID0gIG5ldyBBcnJheShuSGFzaCk7XG4gIHZhciBsYW5kbWFyayA9IG5ldyBBcnJheShuSGFzaCk7XG4gIGZvciAoaSA9IDA7IGkgPCBjb2xsaWRlLmxlbmd0aDsgaSsrKSBjb2xsaWRlW2ldID0gLTE7XG4gIGZvciAoaSA9IDA7IGkgPCBsYW5kbWFyay5sZW5ndGg7IGkrKykgbGFuZG1hcmtbaV0gPSAtMTtcbiAgdmFyIGh2LCBoID0gbmV3IFJvbGxpbmdIYXNoKCk7XG4gIGZvciAoaSA9IDA7IGkgPCBsZW5TcmMtTkhBU0g7IGkgKz0gTkhBU0gpIHtcbiAgICBoLmluaXQoc3JjLCBpKTtcbiAgICBodiA9IGgudmFsdWUoKSAlIG5IYXNoO1xuICAgIGNvbGxpZGVbaS9OSEFTSF0gPSBsYW5kbWFya1todl07XG4gICAgbGFuZG1hcmtbaHZdID0gaS9OSEFTSDtcbiAgfVxuXG4gIHZhciBiYXNlID0gMDtcbiAgdmFyIGlTcmMsIGlCbG9jaywgYmVzdENudCwgYmVzdE9mc3QsIGJlc3RMaXRzejtcbiAgd2hpbGUgKGJhc2UrTkhBU0g8bGVuT3V0KSB7XG4gICAgYmVzdE9mc3Q9MDtcbiAgICBiZXN0TGl0c3o9MDtcbiAgICBoLmluaXQob3V0LCBiYXNlKTtcbiAgICBpID0gMDsgLy8gVHJ5aW5nIHRvIG1hdGNoIGEgbGFuZG1hcmsgYWdhaW5zdCB6T3V0W2Jhc2UraV1cbiAgICBiZXN0Q250ID0gMDtcbiAgICB3aGlsZSgxKSB7XG4gICAgICB2YXIgbGltaXQgPSAyNTA7XG4gICAgICBodiA9IGgudmFsdWUoKSAlIG5IYXNoO1xuICAgICAgaUJsb2NrID0gbGFuZG1hcmtbaHZdO1xuICAgICAgd2hpbGUgKGlCbG9jayA+PSAwICYmIChsaW1pdC0tKT4wICkge1xuICAgICAgICAvL1xuICAgICAgICAvLyBUaGUgaGFzaCB3aW5kb3cgaGFzIGlkZW50aWZpZWQgYSBwb3RlbnRpYWwgbWF0Y2ggYWdhaW5zdFxuICAgICAgICAvLyBsYW5kbWFyayBibG9jayBpQmxvY2suICBCdXQgd2UgbmVlZCB0byBpbnZlc3RpZ2F0ZSBmdXJ0aGVyLlxuICAgICAgICAvL1xuICAgICAgICAvLyBMb29rIGZvciBhIHJlZ2lvbiBpbiB6T3V0IHRoYXQgbWF0Y2hlcyB6U3JjLiBBbmNob3IgdGhlIHNlYXJjaFxuICAgICAgICAvLyBhdCB6U3JjW2lTcmNdIGFuZCB6T3V0W2Jhc2UraV0uICBEbyBub3QgaW5jbHVkZSBhbnl0aGluZyBwcmlvciB0b1xuICAgICAgICAvLyB6T3V0W2Jhc2VdIG9yIGFmdGVyIHpPdXRbb3V0TGVuXSBub3IgYW55dGhpbmcgYWZ0ZXIgelNyY1tzcmNMZW5dLlxuICAgICAgICAvL1xuICAgICAgICAvLyBTZXQgY250IGVxdWFsIHRvIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoIGFuZCBzZXQgb2ZzdCBzbyB0aGF0XG4gICAgICAgIC8vIHpTcmNbb2ZzdF0gaXMgdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIG1hdGNoLiAgbGl0c3ogaXMgdGhlIG51bWJlclxuICAgICAgICAvLyBvZiBjaGFyYWN0ZXJzIGJldHdlZW4gek91dFtiYXNlXSBhbmQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbWF0Y2guXG4gICAgICAgIC8vIHN6IHdpbGwgYmUgdGhlIG92ZXJoZWFkIChpbiBieXRlcykgbmVlZGVkIHRvIGVuY29kZSB0aGUgY29weVxuICAgICAgICAvLyBjb21tYW5kLiAgT25seSBnZW5lcmF0ZSBjb3B5IGNvbW1hbmQgaWYgdGhlIG92ZXJoZWFkIG9mIHRoZVxuICAgICAgICAvLyBjb3B5IGNvbW1hbmQgaXMgbGVzcyB0aGFuIHRoZSBhbW91bnQgb2YgbGl0ZXJhbCB0ZXh0IHRvIGJlIGNvcGllZC5cbiAgICAgICAgLy9cbiAgICAgICAgdmFyIGNudCwgb2ZzdCwgbGl0c3o7XG4gICAgICAgIHZhciBqLCBrLCB4LCB5O1xuICAgICAgICB2YXIgc3o7XG5cbiAgICAgICAgLy8gQmVnaW5uaW5nIGF0IGlTcmMsIG1hdGNoIGZvcndhcmRzIGFzIGZhciBhcyB3ZSBjYW4uXG4gICAgICAgIC8vIGogY291bnRzIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0aGF0IG1hdGNoLlxuICAgICAgICBpU3JjID0gaUJsb2NrKk5IQVNIO1xuICAgICAgICBmb3IgKGogPSAwLCB4ID0gaVNyYywgeSA9IGJhc2UraTsgeCA8IGxlblNyYyAmJiB5IDwgbGVuT3V0OyBqKyssIHgrKywgeSsrKSB7XG4gICAgICAgICAgaWYgKHNyY1t4XSAhPT0gb3V0W3ldKSBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBqLS07XG5cbiAgICAgICAgLy8gQmVnaW5uaW5nIGF0IGlTcmMtMSwgbWF0Y2ggYmFja3dhcmRzIGFzIGZhciBhcyB3ZSBjYW4uXG4gICAgICAgIC8vIGsgY291bnRzIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0aGF0IG1hdGNoLlxuICAgICAgICBmb3IgKGsgPSAxOyBrIDwgaVNyYyAmJiBrIDw9IGk7IGsrKykge1xuICAgICAgICAgIGlmIChzcmNbaVNyYy1rXSAhPT0gb3V0W2Jhc2UraS1rXSkgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgay0tO1xuXG4gICAgICAgIC8vIENvbXB1dGUgdGhlIG9mZnNldCBhbmQgc2l6ZSBvZiB0aGUgbWF0Y2hpbmcgcmVnaW9uLlxuICAgICAgICBvZnN0ID0gaVNyYy1rO1xuICAgICAgICBjbnQgPSBqK2srMTtcbiAgICAgICAgbGl0c3ogPSBpLWs7ICAvLyBOdW1iZXIgb2YgYnl0ZXMgb2YgbGl0ZXJhbCB0ZXh0IGJlZm9yZSB0aGUgY29weVxuICAgICAgICAvLyBzeiB3aWxsIGhvbGQgdGhlIG51bWJlciBvZiBieXRlcyBuZWVkZWQgdG8gZW5jb2RlIHRoZSBcImluc2VydFwiXG4gICAgICAgIC8vIGNvbW1hbmQgYW5kIHRoZSBjb3B5IGNvbW1hbmQsIG5vdCBjb3VudGluZyB0aGUgXCJpbnNlcnRcIiB0ZXh0LlxuICAgICAgICBzeiA9IGRpZ2l0Q291bnQoaS1rKStkaWdpdENvdW50KGNudCkrZGlnaXRDb3VudChvZnN0KSszO1xuICAgICAgICBpZiAoY250ID49IHN6ICYmIGNudCA+IGJlc3RDbnQpIHtcbiAgICAgICAgICAvLyBSZW1lbWJlciB0aGlzIG1hdGNoIG9ubHkgaWYgaXQgaXMgdGhlIGJlc3Qgc28gZmFyIGFuZCBpdFxuICAgICAgICAgIC8vIGRvZXMgbm90IGluY3JlYXNlIHRoZSBmaWxlIHNpemUuXG4gICAgICAgICAgYmVzdENudCA9IGNudDtcbiAgICAgICAgICBiZXN0T2ZzdCA9IGlTcmMtaztcbiAgICAgICAgICBiZXN0TGl0c3ogPSBsaXRzejtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIHRoZSBuZXh0IG1hdGNoaW5nIGJsb2NrXG4gICAgICAgIGlCbG9jayA9IGNvbGxpZGVbaUJsb2NrXTtcbiAgICAgIH1cblxuICAgICAgLy8gV2UgaGF2ZSBhIGNvcHkgY29tbWFuZCB0aGF0IGRvZXMgbm90IGNhdXNlIHRoZSBkZWx0YSB0byBiZSBsYXJnZXJcbiAgICAgIC8vIHRoYW4gYSBsaXRlcmFsIGluc2VydC4gIFNvIGFkZCB0aGUgY29weSBjb21tYW5kIHRvIHRoZSBkZWx0YS5cbiAgICAgIGlmIChiZXN0Q250ID4gMCkge1xuICAgICAgICBpZiAoYmVzdExpdHN6ID4gMCkge1xuICAgICAgICAgIC8vIEFkZCBhbiBpbnNlcnQgY29tbWFuZCBiZWZvcmUgdGhlIGNvcHkuXG4gICAgICAgICAgekRlbHRhLnB1dEludChiZXN0TGl0c3opO1xuICAgICAgICAgIHpEZWx0YS5wdXRDaGFyKCc6Jyk7XG4gICAgICAgICAgekRlbHRhLnB1dEFycmF5KG91dCwgYmFzZSwgYmFzZStiZXN0TGl0c3opO1xuICAgICAgICAgIGJhc2UgKz0gYmVzdExpdHN6O1xuICAgICAgICB9XG4gICAgICAgIGJhc2UgKz0gYmVzdENudDtcbiAgICAgICAgekRlbHRhLnB1dEludChiZXN0Q250KTtcbiAgICAgICAgekRlbHRhLnB1dENoYXIoJ0AnKTtcbiAgICAgICAgekRlbHRhLnB1dEludChiZXN0T2ZzdCk7XG4gICAgICAgIHpEZWx0YS5wdXRDaGFyKCcsJyk7XG4gICAgICAgIGlmIChiZXN0T2ZzdCArIGJlc3RDbnQgLTEgPiBsYXN0UmVhZCkge1xuICAgICAgICAgIGxhc3RSZWFkID0gYmVzdE9mc3QgKyBiZXN0Q250IC0gMTtcbiAgICAgICAgfVxuICAgICAgICBiZXN0Q250ID0gMDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHdlIHJlYWNoIHRoaXMgcG9pbnQsIGl0IG1lYW5zIG5vIG1hdGNoIGlzIGZvdW5kIHNvIGZhclxuICAgICAgaWYgKGJhc2UraStOSEFTSCA+PSBsZW5PdXQpe1xuICAgICAgICAvLyBXZSBoYXZlIHJlYWNoZWQgdGhlIGVuZCBhbmQgaGF2ZSBub3QgZm91bmQgYW55XG4gICAgICAgIC8vIG1hdGNoZXMuICBEbyBhbiBcImluc2VydFwiIGZvciBldmVyeXRoaW5nIHRoYXQgZG9lcyBub3QgbWF0Y2hcbiAgICAgICAgekRlbHRhLnB1dEludChsZW5PdXQtYmFzZSk7XG4gICAgICAgIHpEZWx0YS5wdXRDaGFyKCc6Jyk7XG4gICAgICAgIHpEZWx0YS5wdXRBcnJheShvdXQsIGJhc2UsIGJhc2UrbGVuT3V0LWJhc2UpO1xuICAgICAgICBiYXNlID0gbGVuT3V0O1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgLy8gQWR2YW5jZSB0aGUgaGFzaCBieSBvbmUgY2hhcmFjdGVyLiBLZWVwIGxvb2tpbmcgZm9yIGEgbWF0Y2guXG4gICAgICBoLm5leHQob3V0W2Jhc2UraStOSEFTSF0pO1xuICAgICAgaSsrO1xuICAgIH1cbiAgfVxuICAvLyBPdXRwdXQgYSBmaW5hbCBcImluc2VydFwiIHJlY29yZCB0byBnZXQgYWxsIHRoZSB0ZXh0IGF0IHRoZSBlbmQgb2ZcbiAgLy8gdGhlIGZpbGUgdGhhdCBkb2VzIG5vdCBtYXRjaCBhbnl0aGluZyBpbiB0aGUgc291cmNlLlxuICBpZihiYXNlIDwgbGVuT3V0KSB7XG4gICAgekRlbHRhLnB1dEludChsZW5PdXQtYmFzZSk7XG4gICAgekRlbHRhLnB1dENoYXIoJzonKTtcbiAgICB6RGVsdGEucHV0QXJyYXkob3V0LCBiYXNlLCBiYXNlK2xlbk91dC1iYXNlKTtcbiAgfVxuICAvLyBPdXRwdXQgdGhlIGZpbmFsIGNoZWNrc3VtIHJlY29yZC5cbiAgekRlbHRhLnB1dEludChjaGVja3N1bShvdXQpKTtcbiAgekRlbHRhLnB1dENoYXIoJzsnKTtcbiAgcmV0dXJuIHpEZWx0YS50b0FycmF5KCk7XG59O1xuXG4vLyBSZXR1cm4gdGhlIHNpemUgKGluIGJ5dGVzKSBvZiB0aGUgb3V0cHV0IGZyb20gYXBwbHlpbmcgYSBkZWx0YS5cbmZvc3NpbERlbHRhLm91dHB1dFNpemUgPSBmdW5jdGlvbihkZWx0YSl7XG4gIHZhciB6RGVsdGEgPSBuZXcgUmVhZGVyKGRlbHRhKTtcbiAgdmFyIHNpemUgPSB6RGVsdGEuZ2V0SW50KCk7XG4gIGlmICh6RGVsdGEuZ2V0Q2hhcigpICE9PSAnXFxuJylcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NpemUgaW50ZWdlciBub3QgdGVybWluYXRlZCBieSBcXCdcXFxcblxcJycpO1xuICByZXR1cm4gc2l6ZTtcbn07XG5cbi8vIEFwcGx5IGEgZGVsdGEuXG5mb3NzaWxEZWx0YS5hcHBseSA9IGZ1bmN0aW9uKHNyYywgZGVsdGEsIG9wdHMpIHtcbiAgdmFyIGxpbWl0LCB0b3RhbCA9IDA7XG4gIHZhciB6RGVsdGEgPSBuZXcgUmVhZGVyKGRlbHRhKTtcbiAgdmFyIGxlblNyYyA9IHNyYy5sZW5ndGg7XG4gIHZhciBsZW5EZWx0YSA9IGRlbHRhLmxlbmd0aDtcblxuICBsaW1pdCA9IHpEZWx0YS5nZXRJbnQoKTtcbiAgaWYgKHpEZWx0YS5nZXRDaGFyKCkgIT09ICdcXG4nKVxuICAgIHRocm93IG5ldyBFcnJvcignc2l6ZSBpbnRlZ2VyIG5vdCB0ZXJtaW5hdGVkIGJ5IFxcJ1xcXFxuXFwnJyk7XG4gIHZhciB6T3V0ID0gbmV3IFdyaXRlcigpO1xuICB3aGlsZSh6RGVsdGEuaGF2ZUJ5dGVzKCkpIHtcbiAgICB2YXIgY250LCBvZnN0O1xuICAgIGNudCA9IHpEZWx0YS5nZXRJbnQoKTtcblxuICAgIHN3aXRjaCAoekRlbHRhLmdldENoYXIoKSkge1xuICAgICAgY2FzZSAnQCc6XG4gICAgICAgIG9mc3QgPSB6RGVsdGEuZ2V0SW50KCk7XG4gICAgICAgIGlmICh6RGVsdGEuaGF2ZUJ5dGVzKCkgJiYgekRlbHRhLmdldENoYXIoKSAhPT0gJywnKVxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignY29weSBjb21tYW5kIG5vdCB0ZXJtaW5hdGVkIGJ5IFxcJyxcXCcnKTtcbiAgICAgICAgdG90YWwgKz0gY250O1xuICAgICAgICBpZiAodG90YWwgPiBsaW1pdClcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvcHkgZXhjZWVkcyBvdXRwdXQgZmlsZSBzaXplJyk7XG4gICAgICAgIGlmIChvZnN0K2NudCA+IGxlblNyYylcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvcHkgZXh0ZW5kcyBwYXN0IGVuZCBvZiBpbnB1dCcpO1xuICAgICAgICB6T3V0LnB1dEFycmF5KHNyYywgb2ZzdCwgb2ZzdCtjbnQpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnOic6XG4gICAgICAgIHRvdGFsICs9IGNudDtcbiAgICAgICAgaWYgKHRvdGFsID4gbGltaXQpXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnNlcnQgY29tbWFuZCBnaXZlcyBhbiBvdXRwdXQgbGFyZ2VyIHRoYW4gcHJlZGljdGVkJyk7XG4gICAgICAgIGlmIChjbnQgPiBsZW5EZWx0YSlcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2luc2VydCBjb3VudCBleGNlZWRzIHNpemUgb2YgZGVsdGEnKTtcbiAgICAgICAgek91dC5wdXRBcnJheSh6RGVsdGEuYSwgekRlbHRhLnBvcywgekRlbHRhLnBvcytjbnQpO1xuICAgICAgICB6RGVsdGEucG9zICs9IGNudDtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJzsnOlxuICAgICAgICB2YXIgb3V0ID0gek91dC50b0FycmF5KCk7XG4gICAgICAgIGlmICgoIW9wdHMgfHwgb3B0cy52ZXJpZnlDaGVja3N1bSAhPT0gZmFsc2UpICYmIGNudCAhPT0gY2hlY2tzdW0ob3V0KSlcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2JhZCBjaGVja3N1bScpO1xuICAgICAgICBpZiAodG90YWwgIT09IGxpbWl0KVxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignZ2VuZXJhdGVkIHNpemUgZG9lcyBub3QgbWF0Y2ggcHJlZGljdGVkIHNpemUnKTtcbiAgICAgICAgcmV0dXJuIG91dDtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bmtub3duIGRlbHRhIG9wZXJhdG9yJyk7XG4gICAgfVxuICB9XG4gIHRocm93IG5ldyBFcnJvcigndW50ZXJtaW5hdGVkIGRlbHRhJyk7XG59O1xuXG5yZXR1cm4gZm9zc2lsRGVsdGE7XG5cbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvZm9zc2lsLWRlbHRhL2Zvc3NpbC1kZWx0YS5qc1xuLy8gbW9kdWxlIGlkID0gMzBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcbiAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxuICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTsgfTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbiAgICB9O1xufSkoKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciB3ZWJzb2NrZXRfMSA9IHJlcXVpcmUoXCJAZ2FtZXN0ZGlvL3dlYnNvY2tldFwiKTtcbnZhciBtc2dwYWNrID0gcmVxdWlyZShcIm5vdGVwYWNrLmlvXCIpO1xudmFyIENvbm5lY3Rpb24gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKENvbm5lY3Rpb24sIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gQ29ubmVjdGlvbih1cmwsIHF1ZXJ5KSB7XG4gICAgICAgIGlmIChxdWVyeSA9PT0gdm9pZCAwKSB7IHF1ZXJ5ID0ge307IH1cbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgdXJsKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5fZW5xdWV1ZWRDYWxscyA9IFtdO1xuICAgICAgICBfdGhpcy5iaW5hcnlUeXBlID0gXCJhcnJheWJ1ZmZlclwiO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIENvbm5lY3Rpb24ucHJvdG90eXBlLm9uT3BlbkNhbGxiYWNrID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIF9zdXBlci5wcm90b3R5cGUub25PcGVuQ2FsbGJhY2suY2FsbCh0aGlzKTtcbiAgICAgICAgaWYgKHRoaXMuX2VucXVldWVkQ2FsbHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9lbnF1ZXVlZENhbGxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIF9hID0gdGhpcy5fZW5xdWV1ZWRDYWxsc1tpXSwgbWV0aG9kID0gX2FbMF0sIGFyZ3MgPSBfYVsxXTtcbiAgICAgICAgICAgICAgICB0aGlzW21ldGhvZF0uYXBwbHkodGhpcywgYXJncyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIENvbm5lY3Rpb24ucHJvdG90eXBlLnNlbmQgPSBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICBpZiAodGhpcy53cy5yZWFkeVN0YXRlID09IFdlYlNvY2tldC5PUEVOKSB7XG4gICAgICAgICAgICByZXR1cm4gX3N1cGVyLnByb3RvdHlwZS5zZW5kLmNhbGwodGhpcywgbXNncGFjay5lbmNvZGUoZGF0YSkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKFwiY29seXNldXMuanM6IHRyeWluZyB0byBzZW5kIGRhdGEgd2hpbGUgaW4gXCIgKyB0aGlzLndzLnJlYWR5U3RhdGUgKyBcIiBzdGF0ZVwiKTtcbiAgICAgICAgICAgIC8vIFdlYlNvY2tldCBub3QgY29ubmVjdGVkLlxuICAgICAgICAgICAgLy8gRW5xdWV1ZSBkYXRhIHRvIGJlIHNlbnQgd2hlbiByZWFkeVN0YXRlID09IE9QRU5cbiAgICAgICAgICAgIHRoaXMuX2VucXVldWVkQ2FsbHMucHVzaChbJ3NlbmQnLCBbZGF0YV1dKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIENvbm5lY3Rpb247XG59KHdlYnNvY2tldF8xLmRlZmF1bHQpKTtcbmV4cG9ydHMuQ29ubmVjdGlvbiA9IENvbm5lY3Rpb247XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL3NyYy9Db25uZWN0aW9uLnRzXG4vLyBtb2R1bGUgaWQgPSAzMVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOnRydWV9KTt2YXIgX2NyZWF0ZUNsYXNzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQscHJvcHMpe2Zvcih2YXIgaT0wO2k8cHJvcHMubGVuZ3RoO2krKyl7dmFyIGRlc2NyaXB0b3I9cHJvcHNbaV07ZGVzY3JpcHRvci5lbnVtZXJhYmxlPWRlc2NyaXB0b3IuZW51bWVyYWJsZXx8ZmFsc2U7ZGVzY3JpcHRvci5jb25maWd1cmFibGU9dHJ1ZTtpZihcInZhbHVlXCJpbiBkZXNjcmlwdG9yKWRlc2NyaXB0b3Iud3JpdGFibGU9dHJ1ZTtPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LGRlc2NyaXB0b3Iua2V5LGRlc2NyaXB0b3IpO319cmV0dXJuIGZ1bmN0aW9uKENvbnN0cnVjdG9yLHByb3RvUHJvcHMsc3RhdGljUHJvcHMpe2lmKHByb3RvUHJvcHMpZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUscHJvdG9Qcm9wcyk7aWYoc3RhdGljUHJvcHMpZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3RvcixzdGF0aWNQcm9wcyk7cmV0dXJuIENvbnN0cnVjdG9yO307fSgpO2Z1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSxDb25zdHJ1Y3Rvcil7aWYoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSl7dGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTt9fXZhciBjcmVhdGVCYWNrb2ZmPXJlcXVpcmUoJy4vYmFja29mZicpLmNyZWF0ZUJhY2tvZmY7dmFyIFdlYlNvY2tldENsaWVudD1mdW5jdGlvbigpey8qKlxuICAgKiBAcGFyYW0gdXJsIERPTVN0cmluZyBUaGUgVVJMIHRvIHdoaWNoIHRvIGNvbm5lY3Q7IHRoaXMgc2hvdWxkIGJlIHRoZSBVUkwgdG8gd2hpY2ggdGhlIFdlYlNvY2tldCBzZXJ2ZXIgd2lsbCByZXNwb25kLlxuICAgKiBAcGFyYW0gcHJvdG9jb2xzIERPTVN0cmluZ3xET01TdHJpbmdbXSBFaXRoZXIgYSBzaW5nbGUgcHJvdG9jb2wgc3RyaW5nIG9yIGFuIGFycmF5IG9mIHByb3RvY29sIHN0cmluZ3MuIFRoZXNlIHN0cmluZ3MgYXJlIHVzZWQgdG8gaW5kaWNhdGUgc3ViLXByb3RvY29scywgc28gdGhhdCBhIHNpbmdsZSBzZXJ2ZXIgY2FuIGltcGxlbWVudCBtdWx0aXBsZSBXZWJTb2NrZXQgc3ViLXByb3RvY29scyAoZm9yIGV4YW1wbGUsIHlvdSBtaWdodCB3YW50IG9uZSBzZXJ2ZXIgdG8gYmUgYWJsZSB0byBoYW5kbGUgZGlmZmVyZW50IHR5cGVzIG9mIGludGVyYWN0aW9ucyBkZXBlbmRpbmcgb24gdGhlIHNwZWNpZmllZCBwcm90b2NvbCkuIElmIHlvdSBkb24ndCBzcGVjaWZ5IGEgcHJvdG9jb2wgc3RyaW5nLCBhbiBlbXB0eSBzdHJpbmcgaXMgYXNzdW1lZC5cbiAgICovZnVuY3Rpb24gV2ViU29ja2V0Q2xpZW50KHVybCxwcm90b2NvbHMpe3ZhciBvcHRpb25zPWFyZ3VtZW50cy5sZW5ndGg+MiYmYXJndW1lbnRzWzJdIT09dW5kZWZpbmVkP2FyZ3VtZW50c1syXTp7fTtfY2xhc3NDYWxsQ2hlY2sodGhpcyxXZWJTb2NrZXRDbGllbnQpO3RoaXMudXJsPXVybDt0aGlzLnByb3RvY29scz1wcm90b2NvbHM7dGhpcy5yZWNvbm5lY3RFbmFibGVkPXRydWU7dGhpcy5saXN0ZW5lcnM9e307dGhpcy5iYWNrb2ZmPWNyZWF0ZUJhY2tvZmYob3B0aW9ucy5iYWNrb2ZmfHwnZXhwb25lbnRpYWwnLG9wdGlvbnMpO3RoaXMuYmFja29mZi5vblJlYWR5PXRoaXMub25CYWNrb2ZmUmVhZHkuYmluZCh0aGlzKTt0aGlzLm9wZW4oKTt9X2NyZWF0ZUNsYXNzKFdlYlNvY2tldENsaWVudCxbe2tleTonb3BlbicsdmFsdWU6ZnVuY3Rpb24gb3Blbigpe3ZhciByZWNvbm5lY3Q9YXJndW1lbnRzLmxlbmd0aD4wJiZhcmd1bWVudHNbMF0hPT11bmRlZmluZWQ/YXJndW1lbnRzWzBdOmZhbHNlO3RoaXMuaXNSZWNvbm5lY3Q9cmVjb25uZWN0Oy8vIGtlZXAgYmluYXJ5VHlwZSB1c2VkIG9uIHByZXZpb3VzIFdlYlNvY2tldCBjb25uZWN0aW9uXG52YXIgYmluYXJ5VHlwZT10aGlzLndzJiZ0aGlzLndzLmJpbmFyeVR5cGU7dGhpcy53cz1uZXcgV2ViU29ja2V0KHRoaXMudXJsLHRoaXMucHJvdG9jb2xzKTt0aGlzLndzLm9uY2xvc2U9dGhpcy5vbkNsb3NlQ2FsbGJhY2suYmluZCh0aGlzKTt0aGlzLndzLm9uZXJyb3I9dGhpcy5vbkVycm9yQ2FsbGJhY2suYmluZCh0aGlzKTt0aGlzLndzLm9ubWVzc2FnZT10aGlzLm9uTWVzc2FnZUNhbGxiYWNrLmJpbmQodGhpcyk7dGhpcy53cy5vbm9wZW49dGhpcy5vbk9wZW5DYWxsYmFjay5iaW5kKHRoaXMpO2lmKGJpbmFyeVR5cGUpe3RoaXMud3MuYmluYXJ5VHlwZT1iaW5hcnlUeXBlO319LyoqXG4gICAqIEBpZ25vcmVcbiAgICovfSx7a2V5OidvbkJhY2tvZmZSZWFkeScsdmFsdWU6ZnVuY3Rpb24gb25CYWNrb2ZmUmVhZHkobnVtYmVyLGRlbGF5KXsvLyBjb25zb2xlLmxvZyhcIm9uQmFja29mZlJlYWR5XCIsIG51bWJlciArICcgJyArIGRlbGF5ICsgJ21zJyk7XG50aGlzLm9wZW4odHJ1ZSk7fS8qKlxuICAgKiBAaWdub3JlXG4gICAqL30se2tleTonb25DbG9zZUNhbGxiYWNrJyx2YWx1ZTpmdW5jdGlvbiBvbkNsb3NlQ2FsbGJhY2soZSl7aWYoIXRoaXMuaXNSZWNvbm5lY3QmJnRoaXMubGlzdGVuZXJzWydvbmNsb3NlJ10pe3RoaXMubGlzdGVuZXJzWydvbmNsb3NlJ10uYXBwbHkobnVsbCxhcmd1bWVudHMpO31pZih0aGlzLnJlY29ubmVjdEVuYWJsZWQmJmUuY29kZTwzMDAwKXt0aGlzLmJhY2tvZmYuYmFja29mZigpO319LyoqXG4gICAqIEBpZ25vcmVcbiAgICovfSx7a2V5OidvbkVycm9yQ2FsbGJhY2snLHZhbHVlOmZ1bmN0aW9uIG9uRXJyb3JDYWxsYmFjaygpe2lmKHRoaXMubGlzdGVuZXJzWydvbmVycm9yJ10pe3RoaXMubGlzdGVuZXJzWydvbmVycm9yJ10uYXBwbHkobnVsbCxhcmd1bWVudHMpO319LyoqXG4gICAqIEBpZ25vcmVcbiAgICovfSx7a2V5Oidvbk1lc3NhZ2VDYWxsYmFjaycsdmFsdWU6ZnVuY3Rpb24gb25NZXNzYWdlQ2FsbGJhY2soKXtpZih0aGlzLmxpc3RlbmVyc1snb25tZXNzYWdlJ10pe3RoaXMubGlzdGVuZXJzWydvbm1lc3NhZ2UnXS5hcHBseShudWxsLGFyZ3VtZW50cyk7fX0vKipcbiAgICogQGlnbm9yZVxuICAgKi99LHtrZXk6J29uT3BlbkNhbGxiYWNrJyx2YWx1ZTpmdW5jdGlvbiBvbk9wZW5DYWxsYmFjaygpe2lmKHRoaXMubGlzdGVuZXJzWydvbm9wZW4nXSl7dGhpcy5saXN0ZW5lcnNbJ29ub3BlbiddLmFwcGx5KG51bGwsYXJndW1lbnRzKTt9aWYodGhpcy5pc1JlY29ubmVjdCYmdGhpcy5saXN0ZW5lcnNbJ29ucmVjb25uZWN0J10pe3RoaXMubGlzdGVuZXJzWydvbnJlY29ubmVjdCddLmFwcGx5KG51bGwsYXJndW1lbnRzKTt9dGhpcy5pc1JlY29ubmVjdD1mYWxzZTt9LyoqXG4gICAqIFRoZSBudW1iZXIgb2YgYnl0ZXMgb2YgZGF0YSB0aGF0IGhhdmUgYmVlbiBxdWV1ZWQgdXNpbmcgY2FsbHMgdG8gc2VuZCgpXG4gICAqIGJ1dCBub3QgeWV0IHRyYW5zbWl0dGVkIHRvIHRoZSBuZXR3b3JrLiBUaGlzIHZhbHVlIGRvZXMgbm90IHJlc2V0IHRvIHplcm9cbiAgICogd2hlbiB0aGUgY29ubmVjdGlvbiBpcyBjbG9zZWQ7IGlmIHlvdSBrZWVwIGNhbGxpbmcgc2VuZCgpLCB0aGlzIHdpbGxcbiAgICogY29udGludWUgdG8gY2xpbWIuXG4gICAqXG4gICAqIEB0eXBlIHVuc2lnbmVkIGxvbmdcbiAgICogQHJlYWRvbmx5XG4gICAqL30se2tleTonY2xvc2UnLC8qKlxuICAgKiBDbG9zZXMgdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uIG9yIGNvbm5lY3Rpb24gYXR0ZW1wdCwgaWYgYW55LiBJZiB0aGVcbiAgICogY29ubmVjdGlvbiBpcyBhbHJlYWR5IENMT1NFRCwgdGhpcyBtZXRob2QgZG9lcyBub3RoaW5nLlxuICAgKlxuICAgKiBAcGFyYW0gY29kZSBBIG51bWVyaWMgdmFsdWUgaW5kaWNhdGluZyB0aGUgc3RhdHVzIGNvZGUgZXhwbGFpbmluZyB3aHkgdGhlIGNvbm5lY3Rpb24gaXMgYmVpbmcgY2xvc2VkLiBJZiB0aGlzIHBhcmFtZXRlciBpcyBub3Qgc3BlY2lmaWVkLCBhIGRlZmF1bHQgdmFsdWUgb2YgMTAwMCAoaW5kaWNhdGluZyBhIG5vcm1hbCBcInRyYW5zYWN0aW9uIGNvbXBsZXRlXCIgY2xvc3VyZSkgaXMgYXNzdW1lZC4gU2VlIHRoZSBsaXN0IG9mIHN0YXR1cyBjb2RlcyBvbiB0aGUgQ2xvc2VFdmVudCBwYWdlIGZvciBwZXJtaXR0ZWQgdmFsdWVzLlxuICAgKiBAcGFyYW0gcmVhc29uIEEgaHVtYW4tcmVhZGFibGUgc3RyaW5nIGV4cGxhaW5pbmcgd2h5IHRoZSBjb25uZWN0aW9uIGlzIGNsb3NpbmcuIFRoaXMgc3RyaW5nIG11c3QgYmUgbm8gbG9uZ2VyIHRoYW4gMTIzIGJ5dGVzIG9mIFVURi04IHRleHQgKG5vdCBjaGFyYWN0ZXJzKS5cbiAgICpcbiAgICogQHJldHVybiB2b2lkXG4gICAqL3ZhbHVlOmZ1bmN0aW9uIGNsb3NlKGNvZGUscmVhc29uKXtpZih0eXBlb2YgY29kZT09J3VuZGVmaW5lZCcpe2NvZGU9MTAwMDt9dGhpcy5yZWNvbm5lY3RFbmFibGVkPWZhbHNlO3RoaXMud3MuY2xvc2UoY29kZSxyZWFzb24pO30vKipcbiAgICogVHJhbnNtaXRzIGRhdGEgdG8gdGhlIHNlcnZlciBvdmVyIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvbi5cbiAgICogQHBhcmFtIGRhdGEgRE9NU3RyaW5nfEFycmF5QnVmZmVyfEJsb2JcbiAgICogQHJldHVybiB2b2lkXG4gICAqL30se2tleTonc2VuZCcsdmFsdWU6ZnVuY3Rpb24gc2VuZChkYXRhKXt0aGlzLndzLnNlbmQoZGF0YSk7fS8qKlxuICAgKiBBbiBldmVudCBsaXN0ZW5lciB0byBiZSBjYWxsZWQgd2hlbiB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb24ncyByZWFkeVN0YXRlIGNoYW5nZXMgdG8gQ0xPU0VELiBUaGUgbGlzdGVuZXIgcmVjZWl2ZXMgYSBDbG9zZUV2ZW50IG5hbWVkIFwiY2xvc2VcIi5cbiAgICogQHBhcmFtIGxpc3RlbmVyIEV2ZW50TGlzdGVuZXJcbiAgICovfSx7a2V5OididWZmZXJlZEFtb3VudCcsZ2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLndzLmJ1ZmZlcmVkQW1vdW50O30vKipcbiAgICogVGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGNvbm5lY3Rpb247IHRoaXMgaXMgb25lIG9mIHRoZSBSZWFkeSBzdGF0ZSBjb25zdGFudHMuXG4gICAqIEB0eXBlIHVuc2lnbmVkIHNob3J0XG4gICAqIEByZWFkb25seVxuICAgKi99LHtrZXk6J3JlYWR5U3RhdGUnLGdldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy53cy5yZWFkeVN0YXRlO30vKipcbiAgICogQSBzdHJpbmcgaW5kaWNhdGluZyB0aGUgdHlwZSBvZiBiaW5hcnkgZGF0YSBiZWluZyB0cmFuc21pdHRlZCBieSB0aGVcbiAgICogY29ubmVjdGlvbi4gVGhpcyBzaG91bGQgYmUgZWl0aGVyIFwiYmxvYlwiIGlmIERPTSBCbG9iIG9iamVjdHMgYXJlIGJlaW5nXG4gICAqIHVzZWQgb3IgXCJhcnJheWJ1ZmZlclwiIGlmIEFycmF5QnVmZmVyIG9iamVjdHMgYXJlIGJlaW5nIHVzZWQuXG4gICAqIEB0eXBlIERPTVN0cmluZ1xuICAgKi99LHtrZXk6J2JpbmFyeVR5cGUnLGdldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy53cy5iaW5hcnlUeXBlO30sc2V0OmZ1bmN0aW9uIHNldChiaW5hcnlUeXBlKXt0aGlzLndzLmJpbmFyeVR5cGU9YmluYXJ5VHlwZTt9LyoqXG4gICAqIFRoZSBleHRlbnNpb25zIHNlbGVjdGVkIGJ5IHRoZSBzZXJ2ZXIuIFRoaXMgaXMgY3VycmVudGx5IG9ubHkgdGhlIGVtcHR5XG4gICAqIHN0cmluZyBvciBhIGxpc3Qgb2YgZXh0ZW5zaW9ucyBhcyBuZWdvdGlhdGVkIGJ5IHRoZSBjb25uZWN0aW9uLlxuICAgKiBAdHlwZSBET01TdHJpbmdcbiAgICovfSx7a2V5OidleHRlbnNpb25zJyxnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMud3MuZXh0ZW5zaW9uczt9LHNldDpmdW5jdGlvbiBzZXQoZXh0ZW5zaW9ucyl7dGhpcy53cy5leHRlbnNpb25zPWV4dGVuc2lvbnM7fS8qKlxuICAgKiBBIHN0cmluZyBpbmRpY2F0aW5nIHRoZSBuYW1lIG9mIHRoZSBzdWItcHJvdG9jb2wgdGhlIHNlcnZlciBzZWxlY3RlZDtcbiAgICogdGhpcyB3aWxsIGJlIG9uZSBvZiB0aGUgc3RyaW5ncyBzcGVjaWZpZWQgaW4gdGhlIHByb3RvY29scyBwYXJhbWV0ZXIgd2hlblxuICAgKiBjcmVhdGluZyB0aGUgV2ViU29ja2V0IG9iamVjdC5cbiAgICogQHR5cGUgRE9NU3RyaW5nXG4gICAqL30se2tleToncHJvdG9jb2wnLGdldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy53cy5wcm90b2NvbDt9LHNldDpmdW5jdGlvbiBzZXQocHJvdG9jb2wpe3RoaXMud3MucHJvdG9jb2w9cHJvdG9jb2w7fX0se2tleTonb25jbG9zZScsc2V0OmZ1bmN0aW9uIHNldChsaXN0ZW5lcil7dGhpcy5saXN0ZW5lcnNbJ29uY2xvc2UnXT1saXN0ZW5lcjt9LGdldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5saXN0ZW5lcnNbJ29uY2xvc2UnXTt9LyoqXG4gICAqIEFuIGV2ZW50IGxpc3RlbmVyIHRvIGJlIGNhbGxlZCB3aGVuIGFuIGVycm9yIG9jY3Vycy4gVGhpcyBpcyBhIHNpbXBsZSBldmVudCBuYW1lZCBcImVycm9yXCIuXG4gICAqIEBwYXJhbSBsaXN0ZW5lciBFdmVudExpc3RlbmVyXG4gICAqL30se2tleTonb25lcnJvcicsc2V0OmZ1bmN0aW9uIHNldChsaXN0ZW5lcil7dGhpcy5saXN0ZW5lcnNbJ29uZXJyb3InXT1saXN0ZW5lcjt9LGdldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5saXN0ZW5lcnNbJ29uZXJyb3InXTt9LyoqXG4gICAqIEFuIGV2ZW50IGxpc3RlbmVyIHRvIGJlIGNhbGxlZCB3aGVuIGEgbWVzc2FnZSBpcyByZWNlaXZlZCBmcm9tIHRoZSBzZXJ2ZXIuIFRoZSBsaXN0ZW5lciByZWNlaXZlcyBhIE1lc3NhZ2VFdmVudCBuYW1lZCBcIm1lc3NhZ2VcIi5cbiAgICogQHBhcmFtIGxpc3RlbmVyIEV2ZW50TGlzdGVuZXJcbiAgICovfSx7a2V5Oidvbm1lc3NhZ2UnLHNldDpmdW5jdGlvbiBzZXQobGlzdGVuZXIpe3RoaXMubGlzdGVuZXJzWydvbm1lc3NhZ2UnXT1saXN0ZW5lcjt9LGdldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5saXN0ZW5lcnNbJ29ubWVzc2FnZSddO30vKipcbiAgICogQW4gZXZlbnQgbGlzdGVuZXIgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uJ3MgcmVhZHlTdGF0ZSBjaGFuZ2VzIHRvIE9QRU47IHRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlIGNvbm5lY3Rpb24gaXMgcmVhZHkgdG8gc2VuZCBhbmQgcmVjZWl2ZSBkYXRhLiBUaGUgZXZlbnQgaXMgYSBzaW1wbGUgb25lIHdpdGggdGhlIG5hbWUgXCJvcGVuXCIuXG4gICAqIEBwYXJhbSBsaXN0ZW5lciBFdmVudExpc3RlbmVyXG4gICAqL30se2tleTonb25vcGVuJyxzZXQ6ZnVuY3Rpb24gc2V0KGxpc3RlbmVyKXt0aGlzLmxpc3RlbmVyc1snb25vcGVuJ109bGlzdGVuZXI7fSxnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMubGlzdGVuZXJzWydvbm9wZW4nXTt9LyoqXG4gICAqIEBwYXJhbSBsaXN0ZW5lciBFdmVudExpc3RlbmVyXG4gICAqL30se2tleTonb25yZWNvbm5lY3QnLHNldDpmdW5jdGlvbiBzZXQobGlzdGVuZXIpe3RoaXMubGlzdGVuZXJzWydvbnJlY29ubmVjdCddPWxpc3RlbmVyO30sZ2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLmxpc3RlbmVyc1snb25yZWNvbm5lY3QnXTt9fV0pO3JldHVybiBXZWJTb2NrZXRDbGllbnQ7fSgpOy8qKlxuICogVGhlIGNvbm5lY3Rpb24gaXMgbm90IHlldCBvcGVuLlxuICovV2ViU29ja2V0Q2xpZW50LkNPTk5FQ1RJTkc9V2ViU29ja2V0LkNPTk5FQ1RJTkc7LyoqXG4gKiBUaGUgY29ubmVjdGlvbiBpcyBvcGVuIGFuZCByZWFkeSB0byBjb21tdW5pY2F0ZS5cbiAqL1dlYlNvY2tldENsaWVudC5PUEVOPVdlYlNvY2tldC5PUEVOOy8qKlxuICogVGhlIGNvbm5lY3Rpb24gaXMgaW4gdGhlIHByb2Nlc3Mgb2YgY2xvc2luZy5cbiAqL1dlYlNvY2tldENsaWVudC5DTE9TSU5HPVdlYlNvY2tldC5DTE9TSU5HOy8qKlxuICogVGhlIGNvbm5lY3Rpb24gaXMgY2xvc2VkIG9yIGNvdWxkbid0IGJlIG9wZW5lZC5cbiAqL1dlYlNvY2tldENsaWVudC5DTE9TRUQ9V2ViU29ja2V0LkNMT1NFRDtleHBvcnRzLmRlZmF1bHQ9V2ViU29ja2V0Q2xpZW50O1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0BnYW1lc3RkaW8vd2Vic29ja2V0L2xpYi9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gMzJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiXCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOnRydWV9KTtleHBvcnRzLmNyZWF0ZUJhY2tvZmY9Y3JlYXRlQmFja29mZjt2YXIgYmFja29mZj17ZXhwb25lbnRpYWw6ZnVuY3Rpb24gZXhwb25lbnRpYWwoYXR0ZW1wdCxkZWxheSl7cmV0dXJuIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpNYXRoLnBvdygyLGF0dGVtcHQpKmRlbGF5KTt9LGZpYm9uYWNjaTpmdW5jdGlvbiBmaWJvbmFjY2koYXR0ZW1wdCxkZWxheSl7dmFyIGN1cnJlbnQ9MTtpZihhdHRlbXB0PmN1cnJlbnQpe3ZhciBwcmV2PTEsY3VycmVudD0yO2Zvcih2YXIgaW5kZXg9MjtpbmRleDxhdHRlbXB0O2luZGV4Kyspe3ZhciBuZXh0PXByZXYrY3VycmVudDtwcmV2PWN1cnJlbnQ7Y3VycmVudD1uZXh0O319cmV0dXJuIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpjdXJyZW50KmRlbGF5KTt9fTtmdW5jdGlvbiBjcmVhdGVCYWNrb2ZmKHR5cGUsb3B0aW9ucyl7cmV0dXJuIG5ldyBCYWNrb2ZmKGJhY2tvZmZbdHlwZV0sb3B0aW9ucyk7fWZ1bmN0aW9uIEJhY2tvZmYoZnVuYyxvcHRpb25zKXt0aGlzLmZ1bmM9ZnVuYzt0aGlzLmF0dGVtcHRzPTA7dGhpcy5kZWxheT10eXBlb2Ygb3B0aW9ucy5pbml0aWFsRGVsYXkhPT1cInVuZGVmaW5lZFwiP29wdGlvbnMuaW5pdGlhbERlbGF5OjEwMDt9QmFja29mZi5wcm90b3R5cGUuYmFja29mZj1mdW5jdGlvbigpe3NldFRpbWVvdXQodGhpcy5vblJlYWR5LHRoaXMuZnVuYygrK3RoaXMuYXR0ZW1wdHMsdGhpcy5kZWxheSkpO307XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvQGdhbWVzdGRpby93ZWJzb2NrZXQvbGliL2JhY2tvZmYuanNcbi8vIG1vZHVsZSBpZCA9IDMzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file diff --git a/package.json b/package.json index 9ff6e93..3774314 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "colyseus.js", - "version": "0.7.7-alpha.1", + "version": "0.8.0", "description": "Multiplayer Game Client for the Browser", "keywords": [ "multiplayer", diff --git a/src/Room.ts b/src/Room.ts index 95c2996..4bef1f6 100644 --- a/src/Room.ts +++ b/src/Room.ts @@ -74,9 +74,11 @@ export class Room extends DeltaContainer { } } - setState ( state: T, remoteCurrentTime?: number, remoteElapsedTime?: number ): void { + setState ( encodedState: Buffer, remoteCurrentTime?: number, remoteElapsedTime?: number ): void { + let state = msgpack.decode(encodedState); this.set(state); - this._previousState = new Uint8Array( msgpack.encode(state) ); + + this._previousState = new Uint8Array( encodedState ); // set remote clock properties if (remoteCurrentTime && remoteElapsedTime) { @@ -104,7 +106,7 @@ export class Room extends DeltaContainer { this.clock.tick(); // apply patch - this._previousState = new Uint8Array( fossilDelta.apply( this._previousState, binaryPatch, { verifyChecksum: false } ) ); + this._previousState = Buffer.from(fossilDelta.apply( this._previousState, binaryPatch)); // trigger state callbacks this.set( msgpack.decode( this._previousState ) ); diff --git a/test/room_test.ts b/test/room_test.ts index 748055e..9d5e7fc 100644 --- a/test/room_test.ts +++ b/test/room_test.ts @@ -22,7 +22,7 @@ describe("Room", function() { done(); }); - room.setState({ messages: [] }, 0, 0); + room.setState(msgpack.encode({ messages: [] }), 0, 0); }) it("should patch room state", function(done) { @@ -32,10 +32,10 @@ describe("Room", function() { 'two': { hp: 95, lvl: 2, position: {x: 0, y: 0} }, } }; - room.setState(state, 0, 0); + room.setState(msgpack.encode(state), 0, 0); // get previous state encoded - let previousState = new Uint8Array(msgpack.encode(state)); + let previousState = msgpack.encode(state); // change state and encode it let nextState = msgpack.encode({